From 0581b0d237fc5d051ea10fc9b80be46a2b19898e Mon Sep 17 00:00:00 2001 From: Boyquotes Date: Mon, 27 Jul 2020 18:17:38 +0200 Subject: [PATCH] Add initial set of files --- .editorconfig | 10 + .env | 33 + .env.test | 6 + .gitignore | 29 + .php_cs.dist | 46 + .travis.yml | 84 + CONTRIBUTING.md | 7 + LICENSE | 19 + README.md | 60 + appveyor.yml | 54 + assets/js/admin.js | 64 + assets/js/app.js | 15 + assets/js/doclinks.js | 58 + assets/js/highlight.js | 8 + assets/js/jquery.instantSearch.js | 106 + assets/js/login.js | 11 + assets/js/search.js | 7 + assets/scss/admin.scss | 26 + assets/scss/app.scss | 360 + assets/scss/bootstrap-tagsinput.scss | 194 + bin/console | 43 + bin/phpunit | 13 + composer.json | 93 + composer.lock | 8090 +++++++++++++++++ config/bundles.php | 19 + config/packages/assets.yaml | 3 + config/packages/cache.yaml | 19 + config/packages/dev/debug.yaml | 4 + config/packages/dev/mailer.yaml | 4 + config/packages/dev/monolog.yaml | 19 + config/packages/dev/web_profiler.yaml | 6 + config/packages/doctrine.yaml | 18 + config/packages/doctrine_migrations.yaml | 5 + config/packages/framework.yaml | 27 + config/packages/html_sanitizer.yaml | 17 + config/packages/mailer.yaml | 3 + config/packages/prod/doctrine.yaml | 20 + config/packages/prod/monolog.yaml | 26 + config/packages/prod/routing.yaml | 3 + config/packages/prod/webpack_encore.yaml | 4 + config/packages/routing.yaml | 7 + config/packages/security.yaml | 60 + config/packages/sensio_framework_extra.yaml | 3 + .../test/dama_doctrine_test_bundle.yaml | 4 + config/packages/test/framework.yaml | 4 + config/packages/test/mailer.yaml | 4 + config/packages/test/monolog.yaml | 12 + config/packages/test/security.yaml | 6 + config/packages/test/twig.yaml | 2 + config/packages/test/validator.yaml | 3 + config/packages/test/web_profiler.yaml | 6 + config/packages/test/webpack_encore.yaml | 2 + config/packages/translation.yaml | 6 + config/packages/twig.yaml | 5 + config/packages/validator.yaml | 9 + config/packages/webpack_encore.yaml | 25 + config/routes.yaml | 12 + config/routes/annotations.yaml | 8 + config/routes/dev/framework.yaml | 3 + config/routes/dev/web_profiler.yaml | 7 + config/services.yaml | 37 + data/database.sqlite | Bin 0 -> 274432 bytes data/database_test.sqlite | Bin 0 -> 241664 bytes migrations/.gitignore | 0 package.json | 27 + phpunit.xml.dist | 39 + public/.htaccess | 66 + public/apple-touch-icon.png | Bin 0 -> 10784 bytes public/favicon.ico | Bin 0 -> 1150 bytes public/index.php | 30 + public/robots.txt | 4 + src/Command/AddUserCommand.php | 263 + src/Command/DeleteUserCommand.php | 132 + src/Command/ListUsersCommand.php | 146 + src/Controller/Admin/BlogController.php | 177 + src/Controller/BlogController.php | 168 + src/Controller/SecurityController.php | 69 + src/Controller/UserController.php | 79 + src/DataFixtures/AppFixtures.php | 241 + src/Entity/Comment.php | 138 + src/Entity/Post.php | 234 + src/Entity/Tag.php | 75 + src/Entity/User.php | 188 + .../CheckRequirementsSubscriber.php | 101 + .../CommentNotificationSubscriber.php | 79 + src/EventSubscriber/ControllerSubscriber.php | 51 + .../RedirectToPreferredLocaleSubscriber.php | 86 + src/Events/CommentCreatedEvent.php | 30 + src/Form/CommentType.php | 59 + .../TagArrayToStringTransformer.php | 79 + src/Form/PostType.php | 100 + src/Form/Type/ChangePasswordType.php | 62 + src/Form/Type/DateTimePickerType.php | 68 + src/Form/Type/TagsInputType.php | 70 + src/Form/UserType.php | 65 + src/Kernel.php | 37 + src/Pagination/Paginator.php | 110 + src/Repository/PostRepository.php | 97 + src/Repository/TagRepository.php | 33 + src/Repository/UserRepository.php | 34 + src/Security/PostVoter.php | 61 + src/Twig/AppExtension.php | 65 + src/Twig/SourceCodeExtension.php | 137 + src/Utils/MomentFormatConverter.php | 48 + src/Utils/Validator.php | 72 + symfony.lock | 579 ++ templates/admin/blog/_delete_form.html.twig | 8 + templates/admin/blog/_form.html.twig | 26 + templates/admin/blog/edit.html.twig | 29 + templates/admin/blog/index.html.twig | 55 + templates/admin/blog/new.html.twig | 29 + templates/admin/blog/show.html.twig | 36 + templates/admin/layout.html.twig | 31 + templates/base.html.twig | 162 + templates/blog/_comment_form.html.twig | 40 + .../blog/_delete_post_confirmation.html.twig | 19 + templates/blog/_post_tags.html.twig | 12 + templates/blog/_rss.html.twig | 5 + templates/blog/about.html.twig | 15 + templates/blog/comment_form_error.html.twig | 11 + templates/blog/index.html.twig | 59 + templates/blog/index.xml.twig | 25 + templates/blog/post_show.html.twig | 77 + templates/blog/search.html.twig | 31 + .../TwigBundle/Exception/error.html.twig | 30 + .../TwigBundle/Exception/error403.html.twig | 30 + .../TwigBundle/Exception/error404.html.twig | 30 + .../TwigBundle/Exception/error500.html.twig | 35 + templates/debug/source_code.html.twig | 35 + templates/default/_flash_messages.html.twig | 32 + templates/default/homepage.html.twig | 44 + templates/form/fields.html.twig | 26 + templates/form/layout.html.twig | 16 + templates/security/login.html.twig | 94 + templates/user/change_password.html.twig | 29 + templates/user/edit.html.twig | 27 + tests/Command/AddUserCommandTest.php | 124 + tests/Controller/Admin/BlogControllerTest.php | 194 + tests/Controller/BlogControllerTest.php | 97 + tests/Controller/DefaultControllerTest.php | 95 + tests/Controller/UserControllerTest.php | 99 + .../TagArrayToStringTransformerTest.php | 128 + tests/Utils/ValidatorTest.php | 102 + tests/bootstrap.php | 20 + translations/messages+intl-icu.bg.xlf | 364 + translations/messages+intl-icu.ca.xlf | 261 + translations/messages+intl-icu.cs.xlf | 258 + translations/messages+intl-icu.de.xlf | 366 + translations/messages+intl-icu.en.xlf | 443 + translations/messages+intl-icu.es.xlf | 371 + translations/messages+intl-icu.fr.xlf | 439 + translations/messages+intl-icu.hr.xlf | 344 + translations/messages+intl-icu.id.xlf | 250 + translations/messages+intl-icu.it.xlf | 373 + translations/messages+intl-icu.ja.xlf | 291 + translations/messages+intl-icu.lt.xlf | 439 + translations/messages+intl-icu.nl.xlf | 373 + translations/messages+intl-icu.pl.xlf | 289 + translations/messages+intl-icu.pt_BR.xlf | 444 + translations/messages+intl-icu.ro.xlf | 286 + translations/messages+intl-icu.ru.xlf | 443 + translations/messages+intl-icu.sl.xlf | 364 + translations/messages+intl-icu.tr.xlf | 364 + translations/messages+intl-icu.uk.xlf | 443 + translations/messages+intl-icu.zh_CN.xlf | 439 + translations/validators+intl-icu.bg.xlf | 39 + translations/validators+intl-icu.ca.xlf | 35 + translations/validators+intl-icu.cs.xlf | 31 + translations/validators+intl-icu.de.xlf | 39 + translations/validators+intl-icu.en.xlf | 43 + translations/validators+intl-icu.es.xlf | 39 + translations/validators+intl-icu.fr.xlf | 35 + translations/validators+intl-icu.hr.xlf | 39 + translations/validators+intl-icu.id.xlf | 35 + translations/validators+intl-icu.it.xlf | 35 + translations/validators+intl-icu.ja.xlf | 35 + translations/validators+intl-icu.lt.xlf | 39 + translations/validators+intl-icu.nl.xlf | 35 + translations/validators+intl-icu.pl.xlf | 35 + translations/validators+intl-icu.pt_BR.xlf | 39 + translations/validators+intl-icu.ro.xlf | 35 + translations/validators+intl-icu.ru.xlf | 43 + translations/validators+intl-icu.sl.xlf | 39 + translations/validators+intl-icu.tr.xlf | 39 + translations/validators+intl-icu.uk.xlf | 43 + translations/validators+intl-icu.zh_CN.xlf | 39 + webpack.config.js | 36 + yarn.lock | 7199 +++++++++++++++ 188 files changed, 31684 insertions(+) create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.test create mode 100644 .gitignore create mode 100644 .php_cs.dist create mode 100644 .travis.yml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 appveyor.yml create mode 100644 assets/js/admin.js create mode 100644 assets/js/app.js create mode 100644 assets/js/doclinks.js create mode 100644 assets/js/highlight.js create mode 100644 assets/js/jquery.instantSearch.js create mode 100644 assets/js/login.js create mode 100644 assets/js/search.js create mode 100644 assets/scss/admin.scss create mode 100644 assets/scss/app.scss create mode 100644 assets/scss/bootstrap-tagsinput.scss create mode 100755 bin/console create mode 100755 bin/phpunit create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/bundles.php create mode 100644 config/packages/assets.yaml create mode 100644 config/packages/cache.yaml create mode 100644 config/packages/dev/debug.yaml create mode 100644 config/packages/dev/mailer.yaml create mode 100644 config/packages/dev/monolog.yaml create mode 100644 config/packages/dev/web_profiler.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/doctrine_migrations.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/html_sanitizer.yaml create mode 100644 config/packages/mailer.yaml create mode 100644 config/packages/prod/doctrine.yaml create mode 100644 config/packages/prod/monolog.yaml create mode 100644 config/packages/prod/routing.yaml create mode 100644 config/packages/prod/webpack_encore.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/security.yaml create mode 100644 config/packages/sensio_framework_extra.yaml create mode 100644 config/packages/test/dama_doctrine_test_bundle.yaml create mode 100644 config/packages/test/framework.yaml create mode 100644 config/packages/test/mailer.yaml create mode 100644 config/packages/test/monolog.yaml create mode 100644 config/packages/test/security.yaml create mode 100644 config/packages/test/twig.yaml create mode 100644 config/packages/test/validator.yaml create mode 100644 config/packages/test/web_profiler.yaml create mode 100644 config/packages/test/webpack_encore.yaml create mode 100644 config/packages/translation.yaml create mode 100644 config/packages/twig.yaml create mode 100644 config/packages/validator.yaml create mode 100644 config/packages/webpack_encore.yaml create mode 100644 config/routes.yaml create mode 100644 config/routes/annotations.yaml create mode 100644 config/routes/dev/framework.yaml create mode 100644 config/routes/dev/web_profiler.yaml create mode 100644 config/services.yaml create mode 100644 data/database.sqlite create mode 100644 data/database_test.sqlite create mode 100644 migrations/.gitignore create mode 100644 package.json create mode 100644 phpunit.xml.dist create mode 100644 public/.htaccess create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 src/Command/AddUserCommand.php create mode 100644 src/Command/DeleteUserCommand.php create mode 100644 src/Command/ListUsersCommand.php create mode 100644 src/Controller/Admin/BlogController.php create mode 100644 src/Controller/BlogController.php create mode 100644 src/Controller/SecurityController.php create mode 100644 src/Controller/UserController.php create mode 100644 src/DataFixtures/AppFixtures.php create mode 100644 src/Entity/Comment.php create mode 100644 src/Entity/Post.php create mode 100644 src/Entity/Tag.php create mode 100644 src/Entity/User.php create mode 100644 src/EventSubscriber/CheckRequirementsSubscriber.php create mode 100644 src/EventSubscriber/CommentNotificationSubscriber.php create mode 100644 src/EventSubscriber/ControllerSubscriber.php create mode 100644 src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php create mode 100644 src/Events/CommentCreatedEvent.php create mode 100644 src/Form/CommentType.php create mode 100644 src/Form/DataTransformer/TagArrayToStringTransformer.php create mode 100644 src/Form/PostType.php create mode 100644 src/Form/Type/ChangePasswordType.php create mode 100644 src/Form/Type/DateTimePickerType.php create mode 100644 src/Form/Type/TagsInputType.php create mode 100644 src/Form/UserType.php create mode 100644 src/Kernel.php create mode 100644 src/Pagination/Paginator.php create mode 100644 src/Repository/PostRepository.php create mode 100644 src/Repository/TagRepository.php create mode 100644 src/Repository/UserRepository.php create mode 100644 src/Security/PostVoter.php create mode 100644 src/Twig/AppExtension.php create mode 100644 src/Twig/SourceCodeExtension.php create mode 100644 src/Utils/MomentFormatConverter.php create mode 100644 src/Utils/Validator.php create mode 100644 symfony.lock create mode 100644 templates/admin/blog/_delete_form.html.twig create mode 100644 templates/admin/blog/_form.html.twig create mode 100644 templates/admin/blog/edit.html.twig create mode 100644 templates/admin/blog/index.html.twig create mode 100644 templates/admin/blog/new.html.twig create mode 100644 templates/admin/blog/show.html.twig create mode 100644 templates/admin/layout.html.twig create mode 100644 templates/base.html.twig create mode 100644 templates/blog/_comment_form.html.twig create mode 100644 templates/blog/_delete_post_confirmation.html.twig create mode 100644 templates/blog/_post_tags.html.twig create mode 100644 templates/blog/_rss.html.twig create mode 100644 templates/blog/about.html.twig create mode 100644 templates/blog/comment_form_error.html.twig create mode 100644 templates/blog/index.html.twig create mode 100644 templates/blog/index.xml.twig create mode 100644 templates/blog/post_show.html.twig create mode 100644 templates/blog/search.html.twig create mode 100644 templates/bundles/TwigBundle/Exception/error.html.twig create mode 100644 templates/bundles/TwigBundle/Exception/error403.html.twig create mode 100644 templates/bundles/TwigBundle/Exception/error404.html.twig create mode 100644 templates/bundles/TwigBundle/Exception/error500.html.twig create mode 100644 templates/debug/source_code.html.twig create mode 100644 templates/default/_flash_messages.html.twig create mode 100644 templates/default/homepage.html.twig create mode 100644 templates/form/fields.html.twig create mode 100644 templates/form/layout.html.twig create mode 100644 templates/security/login.html.twig create mode 100644 templates/user/change_password.html.twig create mode 100644 templates/user/edit.html.twig create mode 100644 tests/Command/AddUserCommandTest.php create mode 100644 tests/Controller/Admin/BlogControllerTest.php create mode 100644 tests/Controller/BlogControllerTest.php create mode 100644 tests/Controller/DefaultControllerTest.php create mode 100644 tests/Controller/UserControllerTest.php create mode 100644 tests/Form/DataTransformer/TagArrayToStringTransformerTest.php create mode 100644 tests/Utils/ValidatorTest.php create mode 100644 tests/bootstrap.php create mode 100644 translations/messages+intl-icu.bg.xlf create mode 100644 translations/messages+intl-icu.ca.xlf create mode 100644 translations/messages+intl-icu.cs.xlf create mode 100644 translations/messages+intl-icu.de.xlf create mode 100644 translations/messages+intl-icu.en.xlf create mode 100644 translations/messages+intl-icu.es.xlf create mode 100644 translations/messages+intl-icu.fr.xlf create mode 100644 translations/messages+intl-icu.hr.xlf create mode 100644 translations/messages+intl-icu.id.xlf create mode 100644 translations/messages+intl-icu.it.xlf create mode 100644 translations/messages+intl-icu.ja.xlf create mode 100644 translations/messages+intl-icu.lt.xlf create mode 100644 translations/messages+intl-icu.nl.xlf create mode 100644 translations/messages+intl-icu.pl.xlf create mode 100644 translations/messages+intl-icu.pt_BR.xlf create mode 100644 translations/messages+intl-icu.ro.xlf create mode 100644 translations/messages+intl-icu.ru.xlf create mode 100644 translations/messages+intl-icu.sl.xlf create mode 100644 translations/messages+intl-icu.tr.xlf create mode 100644 translations/messages+intl-icu.uk.xlf create mode 100644 translations/messages+intl-icu.zh_CN.xlf create mode 100644 translations/validators+intl-icu.bg.xlf create mode 100644 translations/validators+intl-icu.ca.xlf create mode 100644 translations/validators+intl-icu.cs.xlf create mode 100644 translations/validators+intl-icu.de.xlf create mode 100644 translations/validators+intl-icu.en.xlf create mode 100644 translations/validators+intl-icu.es.xlf create mode 100644 translations/validators+intl-icu.fr.xlf create mode 100644 translations/validators+intl-icu.hr.xlf create mode 100644 translations/validators+intl-icu.id.xlf create mode 100644 translations/validators+intl-icu.it.xlf create mode 100644 translations/validators+intl-icu.ja.xlf create mode 100644 translations/validators+intl-icu.lt.xlf create mode 100644 translations/validators+intl-icu.nl.xlf create mode 100644 translations/validators+intl-icu.pl.xlf create mode 100644 translations/validators+intl-icu.pt_BR.xlf create mode 100644 translations/validators+intl-icu.ro.xlf create mode 100644 translations/validators+intl-icu.ru.xlf create mode 100644 translations/validators+intl-icu.sl.xlf create mode 100644 translations/validators+intl-icu.tr.xlf create mode 100644 translations/validators+intl-icu.uk.xlf create mode 100644 translations/validators+intl-icu.zh_CN.xlf create mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..153cf3ef --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +; top-most EditorConfig file +root = true + +; Unix-style newlines +[*] +end_of_line = LF + +[*.php] +indent_style = space +indent_size = 4 diff --git a/.env b/.env new file mode 100644 index 00000000..3146c73a --- /dev/null +++ b/.env @@ -0,0 +1,33 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=2ca64f8d83b9e89f5f19d672841d6bb8 +#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 +#TRUSTED_HOSTS='^(localhost|example\.com)$' +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For a MySQL database, use: "mysql://db_user:db_password@127.0.0.1:3306/db_name" +# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +DATABASE_URL=sqlite:///%kernel.project_dir%/data/database.sqlite +###< doctrine/doctrine-bundle ### + +###> symfony/mailer ### +# MAILER_DSN=smtp://localhost +###< symfony/mailer ### diff --git a/.env.test b/.env.test new file mode 100644 index 00000000..dbbb2796 --- /dev/null +++ b/.env.test @@ -0,0 +1,6 @@ +# define your env variables for the test env here +KERNEL_CLASS='App\Kernel' +APP_SECRET='$ecretf0rt3st' +SYMFONY_DEPRECATIONS_HELPER=999999 +PANTHER_APP_ENV=panther +DATABASE_URL=sqlite:///%kernel.project_dir%/data/database_test.sqlite diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2ff73f72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +/public/build/fonts/glyphicons-* +/public/build/images/glyphicons-* + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> symfony/phpunit-bridge ### +.phpunit +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### +###> friendsofphp/php-cs-fixer ### +/.php_cs +/.php_cs.cache +###< friendsofphp/php-cs-fixer ### + +###> symfony/webpack-encore-bundle ### +/node_modules/ +/public/build/ +npm-debug.log +yarn-error.log +###< symfony/webpack-encore-bundle ### diff --git a/.php_cs.dist b/.php_cs.dist new file mode 100644 index 00000000..edafec3a --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,46 @@ + + +For the full copyright and license information, please view the LICENSE +file that was distributed with this source code. +COMMENT; + +$finder = PhpCsFixer\Finder::create() + ->in(__DIR__) + ->exclude('config') + ->exclude('var') + ->exclude('public/bundles') + ->exclude('public/build') + // exclude files generated by Symfony Flex recipes + ->notPath('bin/console') + ->notPath('public/index.php') +; + +return PhpCsFixer\Config::create() + ->setRiskyAllowed(true) + ->setRules([ + '@Symfony' => true, + '@Symfony:risky' => true, + 'array_syntax' => ['syntax' => 'short'], + 'header_comment' => ['header' => $fileHeaderComment, 'separate' => 'both'], + 'linebreak_after_opening_tag' => true, + 'mb_str_functions' => true, + 'no_php4_constructor' => true, + 'no_superfluous_phpdoc_tags' => true, + 'no_unreachable_default_argument_value' => true, + 'no_useless_else' => true, + 'no_useless_return' => true, + 'ordered_imports' => true, + 'php_unit_strict' => true, + 'phpdoc_order' => true, + 'semicolon_after_instruction' => true, + 'strict_comparison' => true, + 'strict_param' => true, + ]) + ->setFinder($finder) + ->setCacheFile(__DIR__.'/var/.php_cs.cache') +; diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..f1843884 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,84 @@ +# Ensure that PHP is installed in Travis' build environment. Travis provides several versions of +# PHP like 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, etc., each of them including XDebug and PHPUnit. +language: php + +# Travis can cache content between builds. This speeds up the build process and saves resources. +cache: + yarn: true + directories: + # Cache composer packages so "composer install" is faster. + - $HOME/.composer/cache/files + # Cache the directory where Symfony stores its slightly modified version of PHPUnit. + - ./bin/.phpunit + # Cache the Symfony binary's directory so that it does not have to be reinstalled. + - $HOME/.symfony + +env: + global: + # Symfony's PHPUnit bridge provides a modified version of PHPUnit. The modified PHPUnit is + # written to a directory that can be configured by the SYMFONY_PHPUNIT_DIR env var, or in + # the same directory as the simple-phpunit if it is not provided. It's also possible to set + # this env var in the phpunit.xml.dist file. + - SYMFONY_PHPUNIT_DIR=./bin/.phpunit + - SYMFONY_DEPRECATIONS_HELPER=9 + - ACTION="install" + # Add the Symfony binary's path to PATH. + - PATH="$HOME/.symfony/bin:$PATH" + +# Defines all jobs which Travis will run in parallel. For each PHP version we support we will run one job. +jobs: + # With fast finishing enabled, Travis CI will mark your build as finished as soon as one of two + # conditions are met: The only remaining jobs are allowed to fail, or a job has already failed. In + # these cases, the status of the build can already be determined, so there’s no need to wait around + # until the other jobs finish. + fast_finish: true + include: + # Run tests with the dependencies from composer.lock + - php: 7.2 + - php: 7.3 + - php: 7.4 + + # Run tests against dev (currently 5.1.x-dev) + - php: 7.3 + env: STABILITY=dev ACTION=update + + # Run tests against dev-master (currently 5.2.x-dev) + - php: 7.3 + env: STABILITY=dev SYMFONY=5.* ACTION=update + +before_install: + - phpenv config-rm xdebug.ini || true + # Change minimum-stability to allow upcoming versions (dev | alpha | beta | RC) + - '[[ -z $STABILITY ]] || composer config minimum-stability "$STABILITY"' + # Change extra.symfony.require used by symfony flex + - '[[ -z $SYMFONY ]] || composer config extra.symfony.require "$SYMFONY"' + # If it is available update the Symfony binary, if not install it. + - if symfony self:version; then symfony self:update --yes ; else wget https://get.symfony.com/cli/installer -O - | bash ; fi + +install: + - php -r "echo ini_get('memory_limit').PHP_EOL;" + # Install or update Composer packages including dev dependencies listed in require-dev. + - COMPOSER_MEMORY_LIMIT=-1 composer $ACTION + - ./bin/phpunit install + +script: + # There's no need to load data fixtures before running tests because the project + # repository already includes a test database with all the fixtures needed to run the tests. + - ./bin/phpunit + # This checks that the source code follows the Symfony Code Syntax rules. + - '[[ $TRAVIS_PHP_VERSION != "7.4" ]] || ./vendor/bin/php-cs-fixer fix --diff --dry-run -v' + # This checks that the YAML config files contain no syntax errors. + - ./bin/console lint:yaml config --parse-tags + # This checks that the Twig template files contain no syntax errors. + - ./bin/console lint:twig templates --env=prod + # This checks that the XLIFF translations contain no syntax errors. + - ./bin/console lint:xliff translations + # This checks that arguments injected into services match type declarations. + - ./bin/console lint:container + # This checks that the application doesn't use dependencies with known security vulnerabilities. + - symfony check:security + # This checks that Doctrine's mapping configurations are valid. + - ./bin/console doctrine:schema:validate --skip-sync -vvv --no-interaction + # Fail CI if the repo is in a dirty state after building assets (only for current release ie install). + #- if [[ "$ACTION" == "install" ]]; then yarn install && yarn encore production && git add --all && git diff --staged --exit-code; fi + - composer validate --strict diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..906c46f5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,7 @@ +Contributing +============ + +The Symfony Demo application is an open source project. Contributions made by +the community are welcome. Send us your ideas, code reviews, pull requests and +feature requests to help us improve this project. All contributions must follow +the [usual Symfony contribution requirements](https://symfony.com/doc/current/contributing/index.html). diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..5612f967 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..18557433 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +Symfony Demo Application +======================== + +The "Symfony Demo Application" is a reference application created to show how +to develop applications following the [Symfony Best Practices][1]. + +Requirements +------------ + + * PHP 7.2.9 or higher; + * PDO-SQLite PHP extension enabled; + * and the [usual Symfony application requirements][2]. + +Installation +------------ + +[Download Symfony][4] to install the `symfony` binary on your computer and run +this command: + +```bash +$ symfony new --demo my_project +``` + +Alternatively, you can use Composer: + +```bash +$ composer create-project symfony/symfony-demo my_project +``` + +Usage +----- + +There's no need to configure anything to run the application. If you have +[installed Symfony][4] binary, run this command: + +```bash +$ cd my_project/ +$ symfony serve +``` + +Then access the application in your browser at the given URL ( by default). + +If you don't have the Symfony binary installed, run `php -S localhost:8000 -t public/` +to use the built-in PHP web server or [configure a web server][3] like Nginx or +Apache to run the application. + +Tests +----- + +Execute this command to run tests: + +```bash +$ cd my_project/ +$ ./bin/phpunit +``` + +[1]: https://symfony.com/doc/current/best_practices.html +[2]: https://symfony.com/doc/current/reference/requirements.html +[3]: https://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html +[4]: https://symfony.com/download diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..ff416821 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,54 @@ +build: false +clone_depth: 1 +clone_folder: c:\projects\symfony-demo + +cache: + - '%LOCALAPPDATA%\Composer\files' + - '%LOCALAPPDATA%\SymfonyBridge\phpunit' + - c:\projects\symfony-demo\composer.phar + +init: + - SET PATH=c:\php;%PATH% + - SET COMPOSER_NO_INTERACTION=1 + - SET SYMFONY_DEPRECATIONS_HELPER=strict + - SET SYMFONY_PHPUNIT_DIR=%LOCALAPPDATA%\SymfonyBridge\phpunit + - SET ANSICON=121x90 (121x90) + - REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v DelayedExpansion /t REG_DWORD /d 1 /f + +install: + - mkdir c:\php && cd c:\php + - appveyor DownloadFile https://raw.githubusercontent.com/symfony/binary-utils/master/cacert.pem + - appveyor DownloadFile https://github.com/symfony/binary-utils/releases/download/v0.1/php-7.1.3-Win32-VC14-x86.zip + - 7z x php-7.1.3-Win32-VC14-x86.zip -y >nul + - del /Q *.zip + - cd ext + - appveyor DownloadFile https://github.com/symfony/binary-utils/releases/download/v0.1/php_apcu-5.1.8-7.1-ts-vc14-x86.zip + - 7z x php_apcu-5.1.8-7.1-ts-vc14-x86.zip -y >nul + - del /Q *.zip + - cd .. + - copy /Y php.ini-development php.ini + - echo max_execution_time=1200 >> php.ini + - echo date.timezone="America/Los_Angeles" >> php.ini + - echo extension_dir=ext >> php.ini + - echo zend_extension=php_opcache.dll >> php.ini + - echo opcache.enable_cli=1 >> php.ini + - echo extension=php_openssl.dll >> php.ini + - echo extension=php_apcu.dll >> php.ini + - echo apc.enable_cli=1 >> php.ini + - echo extension=php_intl.dll >> php.ini + - echo extension=php_mbstring.dll >> php.ini + - echo extension=php_fileinfo.dll >> php.ini + - echo extension=php_pdo_sqlite.dll >> php.ini + - echo extension=php_curl.dll >> php.ini + - echo curl.cainfo=c:\php\cacert.pem >> php.ini + - cd c:\projects\symfony-demo + - IF NOT EXIST composer.phar (appveyor DownloadFile https://getcomposer.org/download/1.3.0/composer.phar) + - php composer.phar self-update + - IF %APPVEYOR_REPO_BRANCH%==master (SET COMPOSER_ROOT_VERSION=dev-master) ELSE (SET COMPOSER_ROOT_VERSION=%APPVEYOR_REPO_BRANCH%.x-dev) + - php composer.phar update --no-progress --ansi + - SET COMPOSER_ROOT_VERSION= + - vendor\bin\simple-phpunit install + +test_script: + - cd c:\projects\symfony-demo + - vendor/bin/simple-phpunit diff --git a/assets/js/admin.js b/assets/js/admin.js new file mode 100644 index 00000000..f0a74a89 --- /dev/null +++ b/assets/js/admin.js @@ -0,0 +1,64 @@ +import '../scss/admin.scss'; +import 'eonasdan-bootstrap-datetimepicker'; +import 'typeahead.js'; +import Bloodhound from "bloodhound-js"; +import 'bootstrap-tagsinput'; + +$(function() { + // Datetime picker initialization. + // See https://eonasdan.github.io/bootstrap-datetimepicker/ + $('[data-toggle="datetimepicker"]').datetimepicker({ + icons: { + time: 'fa fa-clock-o', + date: 'fa fa-calendar', + up: 'fa fa-chevron-up', + down: 'fa fa-chevron-down', + previous: 'fa fa-chevron-left', + next: 'fa fa-chevron-right', + today: 'fa fa-check-circle-o', + clear: 'fa fa-trash', + close: 'fa fa-remove' + } + }); + + // Bootstrap-tagsinput initialization + // https://bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples/ + var $input = $('input[data-toggle="tagsinput"]'); + if ($input.length) { + var source = new Bloodhound({ + local: $input.data('tags'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + datumTokenizer: Bloodhound.tokenizers.whitespace + }); + source.initialize(); + + $input.tagsinput({ + trimValue: true, + focusClass: 'focus', + typeaheadjs: { + name: 'tags', + source: source.ttAdapter() + } + }); + } +}); + +// Handling the modal confirmation message. +$(document).on('submit', 'form[data-confirmation]', function (event) { + var $form = $(this), + $confirm = $('#confirmationModal'); + + if ($confirm.data('result') !== 'yes') { + //cancel submit event + event.preventDefault(); + + $confirm + .off('click', '#btnYes') + .on('click', '#btnYes', function () { + $confirm.data('result', 'yes'); + $form.find('input[type="submit"]').attr('disabled', 'disabled'); + $form.submit(); + }) + .modal('show'); + } +}); diff --git a/assets/js/app.js b/assets/js/app.js new file mode 100644 index 00000000..f116c3b9 --- /dev/null +++ b/assets/js/app.js @@ -0,0 +1,15 @@ +import '../scss/app.scss'; + +// loads the Bootstrap jQuery plugins +import 'bootstrap-sass/assets/javascripts/bootstrap/transition.js'; +import 'bootstrap-sass/assets/javascripts/bootstrap/alert.js'; +import 'bootstrap-sass/assets/javascripts/bootstrap/collapse.js'; +import 'bootstrap-sass/assets/javascripts/bootstrap/dropdown.js'; +import 'bootstrap-sass/assets/javascripts/bootstrap/modal.js'; +import 'jquery' + +// loads the code syntax highlighting library +import './highlight.js'; + +// Creates links to the Symfony documentation +import './doclinks.js'; diff --git a/assets/js/doclinks.js b/assets/js/doclinks.js new file mode 100644 index 00000000..2d5073f1 --- /dev/null +++ b/assets/js/doclinks.js @@ -0,0 +1,58 @@ +'use strict'; + +// Wraps some elements in anchor tags referencing to the Symfony documentation +$(function() { + var $modal = $('#sourceCodeModal'); + var $controllerCode = $modal.find('code.php'); + var $templateCode = $modal.find('code.twig'); + + function anchor(url, content) { + return '' + content + ''; + }; + + // Wraps links to the Symfony documentation + $modal.find('.hljs-comment').each(function() { + $(this).html($(this).html().replace(/https:\/\/symfony.com\/doc\/[\w/.#-]+/g, function(url) { + return anchor(url, url); + })); + }); + + // Wraps Symfony's annotations + var annotations = { + '@Cache': 'https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/cache.html', + '@IsGranted': 'https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/security.html#isgranted', + '@ParamConverter': 'https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html', + '@Route': 'https://symfony.com/doc/current/routing.html#creating-routes-as-annotations', + '@Security': 'https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/security.html#security' + }; + + $controllerCode.find('.hljs-doctag').each(function() { + var annotation = $(this).text(); + + if (annotations[annotation]) { + $(this).html(anchor(annotations[annotation], annotation)); + } + }); + + // Wraps Twig's tags + $templateCode.find('.hljs-template-tag > .hljs-name').each(function() { + var tag = $(this).text(); + + if ('else' === tag || tag.match(/^end/)) { + return; + } + + var url = 'https://twig.symfony.com/doc/3.x/tags/' + tag + '.html#' + tag; + + $(this).html(anchor(url, tag)); + }); + + // Wraps Twig's functions + $templateCode.find('.hljs-template-variable > .hljs-name').each(function() { + var func = $(this).text(); + + var url = 'https://twig.symfony.com/doc/3.x/functions/' + func + '.html#' + func; + + $(this).html(anchor(url, func)); + }); +}); diff --git a/assets/js/highlight.js b/assets/js/highlight.js new file mode 100644 index 00000000..b20bb11a --- /dev/null +++ b/assets/js/highlight.js @@ -0,0 +1,8 @@ +import hljs from 'highlight.js/lib/highlight'; +import php from 'highlight.js/lib/languages/php'; +import twig from 'highlight.js/lib/languages/twig'; + +hljs.registerLanguage('php', php); +hljs.registerLanguage('twig', twig); + +hljs.initHighlightingOnLoad(); diff --git a/assets/js/jquery.instantSearch.js b/assets/js/jquery.instantSearch.js new file mode 100644 index 00000000..531bca99 --- /dev/null +++ b/assets/js/jquery.instantSearch.js @@ -0,0 +1,106 @@ +/** + * jQuery plugin for an instant searching. + * + * @author Oleg Voronkovich + * @author Yonel Ceruto + */ +(function ($) { + 'use strict'; + + String.prototype.render = function (parameters) { + return this.replace(/({{ (\w+) }})/g, function (match, pattern, name) { + return parameters[name]; + }) + }; + + // INSTANTS SEARCH PUBLIC CLASS DEFINITION + // ======================================= + + var InstantSearch = function (element, options) { + this.$input = $(element); + this.$form = this.$input.closest('form'); + this.$preview = $('
    ').appendTo(this.$form); + this.options = $.extend({}, InstantSearch.DEFAULTS, this.$input.data(), options); + + this.$input.keyup(this.debounce()); + }; + + InstantSearch.DEFAULTS = { + minQueryLength: 2, + limit: 10, + delay: 500, + noResultsMessage: 'No results found', + itemTemplate: '\ +
    \ +

    {{ title }}

    \ + \ +

    {{ summary }}

    \ +
    ' + }; + + InstantSearch.prototype.debounce = function () { + var delay = this.options.delay; + var search = this.search; + var timer = null; + var self = this; + + return function () { + clearTimeout(timer); + timer = setTimeout(function () { + search.apply(self); + }, delay); + }; + }; + + InstantSearch.prototype.search = function () { + var query = $.trim(this.$input.val()).replace(/\s{2,}/g, ' '); + if (query.length < this.options.minQueryLength) { + this.$preview.empty(); + return; + } + + var self = this; + var data = this.$form.serializeArray(); + data['l'] = this.limit; + + $.getJSON(this.$form.attr('action'), data, function (items) { + self.show(items); + }); + }; + + InstantSearch.prototype.show = function (items) { + var $preview = this.$preview; + var itemTemplate = this.options.itemTemplate; + + if (0 === items.length) { + $preview.html(this.options.noResultsMessage); + } else { + $preview.empty(); + $.each(items, function (index, item) { + $preview.append(itemTemplate.render(item)); + }); + } + }; + + // INSTANTS SEARCH PLUGIN DEFINITION + // ================================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this); + var instance = $this.data('instantSearch'); + var options = typeof option === 'object' && option; + + if (!instance) $this.data('instantSearch', (instance = new InstantSearch(this, options))); + + if (option === 'search') instance.search(); + }) + } + + $.fn.instantSearch = Plugin; + $.fn.instantSearch.Constructor = InstantSearch; + +})(window.jQuery); diff --git a/assets/js/login.js b/assets/js/login.js new file mode 100644 index 00000000..931a0c1b --- /dev/null +++ b/assets/js/login.js @@ -0,0 +1,11 @@ +$(function() { + var usernameEl = $('#username'); + var passwordEl = $('#password'); + + // in a real application, the user/password should never be hardcoded + // but for the demo application it's very convenient to do so + if (!usernameEl.val() || 'jane_admin' === usernameEl.val()) { + usernameEl.val('jane_admin'); + passwordEl.val('kitten'); + } +}); diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 00000000..53c600f6 --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,7 @@ +import './jquery.instantSearch.js'; + +$(function() { + $('.search-field').instantSearch({ + delay: 100, + }); +}); diff --git a/assets/scss/admin.scss b/assets/scss/admin.scss new file mode 100644 index 00000000..c145f454 --- /dev/null +++ b/assets/scss/admin.scss @@ -0,0 +1,26 @@ +@import "~bootswatch/flatly/variables"; +@import "~eonasdan-bootstrap-datetimepicker/src/sass/bootstrap-datetimepicker-build.scss"; +@import "bootstrap-tagsinput.scss"; + +/* Page: 'Backend post index' + ------------------------------------------------------------------------- */ +body#admin_post_index .item-actions { + white-space: nowrap +} + +body#admin_post_index .item-actions a.btn + a.btn { + margin-left: 4px +} + +/* Page: 'Backend post show' + ------------------------------------------------------------------------- */ +body#admin_post_show .post-tags .label-default { + background-color: #e9ecec; + color: #6D8283; + font-size: 16px; + margin-right: 10px; + padding: .4em 1em .5em; +} +body#admin_post_show .post-tags .label-default i { + color: #95A6A7; +} diff --git a/assets/scss/app.scss b/assets/scss/app.scss new file mode 100644 index 00000000..a30457c4 --- /dev/null +++ b/assets/scss/app.scss @@ -0,0 +1,360 @@ +// setting the value of this variable to an empty data URL is the only working solution +// to load the Bootswatch web fonts locally and avoid loading them from Google servers +// see https://github.com/thomaspark/bootswatch/issues/55#issuecomment-298093182 +$web-font-path: 'data:text/css;base64,'; + +// Make sure the bootstrap-sass and lato fonts are resolved correctly +$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/"; +$lato-font-path: '~lato-font/fonts'; + +@import "~bootswatch/flatly/variables"; +@import "~bootstrap-sass/assets/stylesheets/bootstrap"; +@import "~bootswatch/flatly/bootswatch"; +@import "~@fortawesome/fontawesome-free/css/all.css"; +@import "~@fortawesome/fontawesome-free/css/v4-shims.css"; +@import "~highlight.js/styles/solarized-light.css"; + +// pick the Lato fonts individually to avoid importing the entire font family +@import '~lato-font/scss/public-api'; +@include lato-include-font('normal'); +@include lato-include-font('bold'); + +/* Basic styles + ------------------------------------------------------------------------- */ +p, ul, ol { + font-size: 19px; + margin-bottom: 1.5em +} + +li { + margin-bottom: 0.5em +} + +code { + background: #ecf0f1; + color: #2c3e50 +} + +.text-danger, .text-danger:hover { + color: #e74c3c +} + +i { + margin-right: 0.25em +} + +.table.table-middle-aligned th, +.table.table-middle-aligned td { + vertical-align: middle; +} + +.doclink { + color: inherit +} + +/* Utilities + ------------------------------------------------------------------------- */ +.m-b-0 { margin-bottom: 0 } + +/* Page elements + ------------------------------------------------------------------------- */ +body { + display: flex; + flex-direction: column; + min-height: 100vh +} + +header { + margin-bottom: 2em +} + +header ul.nav li { + margin-bottom: 0 +} + +header .locales { + min-width: 190px; +} +header .locales a { + color: #212529; + padding: 3px 15px; +} +header .locales a small { + border-radius: 4px; + border: 2px solid #dee2e6; + color: #7b8a8b; + float: left; + font-size: 12px; + line-height: 1.1; + margin: 2px 10px 0 0; + min-width: 26px; + padding: 0px 3px; + text-align: center; + text-transform: uppercase; +} +header .locales .active small, +header .locales a:hover small { + color: inherit; +} + +.body-container { + flex: 1; + /* needed to prevent pages with a very small height and browsers not supporting flex */ + min-height: 600px +} + +.body-container #main h1, .body-container #main h2 { + margin-top: 0 +} + +#sidebar .section { + margin-bottom: 2em +} + +#sidebar p { + font-size: 15px +} + +#sidebar p + p { + margin: 1.5em 0 0 +} + +footer { + background: #ecf0f1; + margin-top: 2em; + padding-top: 2em; + padding-bottom: 2em +} + +footer p { + color: #7b8a8b; + font-size: 13px; + margin-bottom: 0.25em +} + +footer #footer-resources { + text-align: right +} + +footer #footer-resources i { + color: #7b8a8b; + font-size: 28.5px; + margin-left: 0.5em +} + +#sourceCodeModal h3 { + font-size: 19px; + margin-top: 0 +} + +#sourceCodeModal h3 small { + color: #7b8a8b; + font-size: 80% +} + +#sourceCodeModal pre { + margin-bottom: 2em; + padding: 0 +} + +#confirmationModal .modal-dialog { + width: 500px +} + +#confirmationModal .modal-footer button { + min-width: 75px +} + +/* Misc. elements + ------------------------------------------------------------------------- */ +.section.rss a { + color: #f39c12; + font-size: 21px; +} + +/* Forms + ------------------------------------------------------------------------- */ +.form-group.has-error .form-control { + border-color: #e74c3c +} + +.form-group.has-error .control-label { + color: #e74c3c +} + +.form-group.has-error .help-block { + background-color: #e74c3c; + color: #fff; + font-size: 15px; + padding: 1em +} + +.form-group.has-error .help-block ul, +.form-group.has-error .help-block li { + margin-bottom: 0 +} +.form-group.has-error .help-block li + li { + margin-top: 0.5em; +} + +textarea { + max-width: 100% +} + +/* Page: 'Technical Requirements Checker' + ------------------------------------------------------------------------- */ +body#requirements_checker header h1 { + margin-bottom: 0; + margin-top: 0 +} + +body#requirements_checker header h1 span { + font-size: 120%; + opacity: 0.7; + padding: 0 5px +} + +body#requirements_checker .panel li { + margin-bottom: 1em +} + +/* Page: 'Homepage' + ------------------------------------------------------------------------- */ +body#homepage { + text-align: center +} + +/* Page: 'Login' + ------------------------------------------------------------------------- */ +body#login #login-users-help p { + font-size: 15px; + line-height: 1.42857 +} + +body#login #login-users-help p:last-child { + margin-bottom: 0 +} + +body#login #login-users-help p .label { + margin-right: 5px +} + +body#login #login-users-help p .console { + display: block; + margin: 5px 0; + padding: 10px +} + +/* Common Blog page elements + ------------------------------------------------------------------------- */ +.post-metadata { + color: #b4bcc2; + font-size: 19px; + margin-bottom: 16px; +} +.post-metadata .metadata { + margin-right: 1.5em; +} + +.post-tags .label { + margin-right: 5px; +} + +/* Page: 'Blog index' + ------------------------------------------------------------------------- */ +body#blog_index #main h1, +body#blog_index #main p { + margin-bottom: 0.5em +} + +body#blog_index article.post { + margin-bottom: 3em; +} + +body#blog_index .post-metadata { + font-size: 16px; + margin-bottom: 8px; +} + +body#blog_index .post-tags .label-default { + background-color: #e9ecec; + color: #6d8283; +} +body#blog_index .post-tags .label-default i { + color: #a3b2b2; +} + +/* Page: 'Blog post show' + ------------------------------------------------------------------------- */ +body#blog_post_show #main h3 { + margin-bottom: 0.75em +} + +body#blog_post_show .post-tags .label-default { + background-color: #e9ecec; + color: #6D8283; + font-size: 16px; + margin-right: 10px; + padding: .4em 1em .5em; +} +body#blog_post_show .post-tags .label-default i { + color: #95A6A7; +} + +body#blog_post_show #post-add-comment { + margin: 2em 0 +} + +body#blog_post_show #post-add-comment p { + margin-bottom: 0 +} + +body#blog_post_show #post-add-comment p a.btn { + margin-right: 0.5em +} + +body#blog_post_show .post-comment { + margin-bottom: 2em +} + +body#blog_post_show .post-comment h4 { + font-size: 13px; + line-height: 1.42857; + margin-top: 0 +} + +body#blog_post_show .post-comment h4 strong { + display: block +} + +/* Page: 'Comment form error' + ------------------------------------------------------------------------- */ +body#comment_form_error h1.text-danger { + margin-bottom: 1em +} + +@media (min-width: 768px) and (max-width: 1200px) { + .container { + width: 98%; + } +} + +/* Page: 'Blog search' + ------------------------------------------------------------------------- */ +body#blog_search #main h1, +body#blog_search #main p { + margin-bottom: 0.5em +} + +body#blog_search article.post:first-child { + margin-top: 2em; +} + +body#blog_search article.post { + margin-bottom: 2em; +} + +body#blog_search .post-metadata { + font-size: 16px; + margin-bottom: 8px; +} diff --git a/assets/scss/bootstrap-tagsinput.scss b/assets/scss/bootstrap-tagsinput.scss new file mode 100644 index 00000000..1af0e95a --- /dev/null +++ b/assets/scss/bootstrap-tagsinput.scss @@ -0,0 +1,194 @@ +/* ------------------------------------------------------------------------------ + * + * # Twiter Typeahead + * + * Styles for tagsinput.js - input suggestion engine + * + * ---------------------------------------------------------------------------- */ +.twitter-typeahead { + width: 100%; +} +.typeahead, +.tt-query, +.tt-hint { + outline: 0; +} +.tt-hint { + color: #999; +} +.tt-menu{ + width: 100%; + margin-top: 1px; + min-width: 180px; + padding: 7px 0; + background-color: #fff; + border: 1px solid rgba(0,0,0,0.15); + border-radius: 4px; + max-height: 300px; + overflow-y: auto; + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,0.175); + box-shadow: 0 6px 12px rgba(0,0,0,0.175); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.typeahead-scrollable .tt-menu{ + max-height: 250px; +} +.typeahead-rtl .tt-menu{ + text-align: right; +} +.tt-suggestion { + padding: 8px 15px; + cursor: pointer; +} +.tt-suggestion.tt-cursor { + background-color: #f5f5f5; +} +.tt-suggestion p { + margin: 0; +} +.tt-suggestion.tt-selectable:before { + content: '\f02b'; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + display: inline-block; + font-size: 15px; + margin-right: 0.5em; + color: inherit; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.tt-dataset-group .tt-suggestion { + padding-left: 24px; + padding-right: 24px; +} +.tt-heading { + font-size: 11px; + line-height: 1.82; + padding: 8px 15px; + text-transform: uppercase; + display: block; + font-weight: 700; + margin-top: 2px; + margin-bottom: 2px; +} +.tt-suggestion:hover, +.tt-suggestion:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #18bc9c; +} +/* ------------------------------------------------------------------------------ +* +* # Bootstrap tags input +* +* Styles for tagsinput.js - tags input for Bootstrap +* +* ---------------------------------------------------------------------------- */ +.bootstrap-tagsinput { + display: table-cell; + vertical-align: middle; + width: 100%; + height: 45px; + padding: 0; + font-size: 15px; + line-height: 1.42857143; + color: #2c3e50; + background-color: #ffffff; + background-image: none; + border: 2px solid #dce4ec; + border-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; + -webkit-transition: border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; +} +.has-error .bootstrap-tagsinput { + border-color: #e74c3c !important; +} +.bootstrap-tagsinput.focus { + border-color: #2c3e50; + outline: 0; + box-shadow: none; +} +.bootstrap-tagsinput input { + border: 0; + outline: 0; + background-color: transparent; + padding: 5px 11px; + margin-top: 2px; + margin-left: 2px; + width: auto !important; + min-width: 100px; + font-size: 15px; + line-height: 1.6666667; + -webkit-box-shadow: none; + box-shadow: none; +} +.bootstrap-tagsinput input:focus { + border: none; + box-shadow: none; +} +.bootstrap-tagsinput .twitter-typeahead { + width: auto; +} +.bootstrap-tagsinput .tt-menu { + margin-top: 5px; + min-width: 200px; +} +.bootstrap-tagsinput .tag { + margin: 1px 0 0 3px; + border: 0; + border-radius: .25em; + padding: 5px 11px; + padding-right: 30px; + float: left; + font-size: 15px; + line-height: 1.6666667; + font-weight: 400; + text-transform: none; + position: relative; + background-color: #18bc9c; + color: #fff; +} +.has-error .bootstrap-tagsinput .tag { + background-color: #e74c3c !important; +} +.bootstrap-tagsinput .tag [data-role="remove"] { + cursor: pointer; + color: inherit; + position: absolute; + top: 50%; + right: 11px; + line-height: 1; + margin-top: -5.5px; + opacity: 0.7; + filter: alpha(opacity=70); +} +.bootstrap-tagsinput .tag [data-role="remove"]:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.bootstrap-tagsinput .tag:before { + content: '\f02b'; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + display: inline-block; + font-size: 15px; + margin-right: 0.5em; + color: #fff; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.bootstrap-tagsinput .tag [data-role="remove"]:after { + content: '\f00d'; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + display: block; + font-size: 13px; + color: #fff; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/bin/console b/bin/console new file mode 100755 index 00000000..8fe9d494 --- /dev/null +++ b/bin/console @@ -0,0 +1,43 @@ +#!/usr/bin/env php +getParameterOption(['--env', '-e'], null, true)) { + putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); +} + +if ($input->hasParameterOption('--no-debug', true)) { + putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); +} + +(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$application = new Application($kernel); +$application->run($input); diff --git a/bin/phpunit b/bin/phpunit new file mode 100755 index 00000000..4d1ed05d --- /dev/null +++ b/bin/phpunit @@ -0,0 +1,13 @@ +#!/usr/bin/env php +2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-05-27T16:24:54+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.6.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "fc0206348e17e530d09463fef07ba8968406cd6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/fc0206348e17e530d09463fef07ba8968406cd6d", + "reference": "fc0206348e17e530d09463fef07ba8968406cd6d", + "shasum": "" + }, + "require": { + "php": "^7.1.3 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan-shim": "^0.9.2", + "phpunit/phpunit": "^7.0", + "vimeo/psalm": "^3.8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections", + "type": "tidelift" + } + ], + "time": "2020-05-25T19:24:35+00:00" + }, + { + "name": "doctrine/common", + "version": "2.13.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f", + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/inflector": "^1.0", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.3.3", + "doctrine/reflection": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2020-06-05T16:46:05+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.10.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/aab745e7b6b2de3b47019da81e7225e14dcfdac8", + "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "jetbrains/phpstorm-stubs": "^2019.1", + "nikic/php-parser": "^4.4", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.4.1", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "^3.11" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10.x-dev", + "dev-develop": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "time": "2020-04-20T17:19:26+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "0fb513842c78b43770597ef3c487cdf79d944db3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0fb513842c78b43770597ef3c487cdf79d944db3", + "reference": "0fb513842c78b43770597ef3c487cdf79d944db3", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9.0", + "doctrine/persistence": "^1.3.3", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", + "symfony/cache": "^4.3.3|^5.0", + "symfony/config": "^4.3.3|^5.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0", + "symfony/dependency-injection": "^4.3.3|^5.0", + "symfony/doctrine-bridge": "^4.3.7|^5.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/service-contracts": "^1.1.1|^2.0" + }, + "conflict": { + "doctrine/orm": "<2.6", + "twig/twig": "<1.34|>=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "doctrine/orm": "^2.6", + "ocramius/proxy-manager": "^2.1", + "phpunit/phpunit": "^7.5", + "symfony/phpunit-bridge": "^4.2", + "symfony/property-info": "^4.3.3|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0", + "twig/twig": "^1.34|^2.12" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2020-05-25T19:56:00+00:00" + }, + { + "name": "doctrine/doctrine-migrations-bundle", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", + "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/856437e8de96a70233e1f0cc2352fc8dd15a899d", + "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "~1.0|~2.0", + "doctrine/migrations": "^2.2", + "php": "^7.1", + "symfony/framework-bundle": "~3.4|~4.0|~5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-strict-rules": "^0.9", + "phpunit/phpunit": "^6.4|^7.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\MigrationsBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineMigrationsBundle", + "homepage": "https://www.doctrine-project.org", + "keywords": [ + "dbal", + "migrations", + "schema" + ], + "time": "2019-11-13T12:57:41+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "629572819973f13486371cb611386eb17851e85c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", + "reference": "629572819973f13486371cb611386eb17851e85c", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "time": "2019-11-10T09:48:07+00:00" + }, + { + "name": "doctrine/inflector", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2020-05-29T07:19:59+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "doctrine/migrations", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/migrations.git", + "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", + "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9", + "ocramius/package-versions": "^1.3", + "ocramius/proxy-manager": "^2.0.2", + "php": "^7.1", + "symfony/console": "^3.4||^4.0||^5.0", + "symfony/stopwatch": "^3.4||^4.0||^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "doctrine/orm": "^2.6", + "ext-pdo_sqlite": "*", + "jdorn/sql-formatter": "^1.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.10", + "phpstan/phpstan-deprecation-rules": "^0.10", + "phpstan/phpstan-phpunit": "^0.10", + "phpstan/phpstan-strict-rules": "^0.10", + "phpunit/phpunit": "^7.0", + "symfony/process": "^3.4||^4.0||^5.0", + "symfony/yaml": "^3.4||^4.0||^5.0" + }, + "suggest": { + "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.", + "symfony/yaml": "Allows the use of yaml for migration configuration files." + }, + "bin": [ + "bin/doctrine-migrations" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Michael Simonson", + "email": "contact@mikesimonson.com" + } + ], + "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", + "homepage": "https://www.doctrine-project.org/projects/migrations.html", + "keywords": [ + "database", + "dbal", + "migrations", + "php" + ], + "time": "2019-12-04T06:09:14+00:00" + }, + { + "name": "doctrine/orm", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "d95e03ba660d50d785a9925f41927fef0ee553cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/d95e03ba660d50d785a9925f41927fef0ee553cf", + "reference": "d95e03ba660d50d785a9925f41927fef0ee553cf", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.8", + "doctrine/cache": "^1.9.1", + "doctrine/collections": "^1.5", + "doctrine/common": "^2.11 || ^3.0", + "doctrine/dbal": "^2.9.3", + "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.0", + "doctrine/instantiator": "^1.3", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.3.3 || ^2.0", + "ext-pdo": "*", + "ocramius/package-versions": "^1.2", + "php": "^7.1", + "symfony/console": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5", + "symfony/yaml": "^3.4|^4.0|^5.0", + "vimeo/psalm": "^3.11" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine/orm", + "type": "tidelift" + } + ], + "time": "2020-05-26T16:03:49+00:00" + }, + { + "name": "doctrine/persistence", + "version": "1.3.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", + "reference": "0af483f91bada1c9ded6c2cfd26ab7d5ab2094e0", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/reflection": "^1.2", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common", + "Doctrine\\Persistence\\": "lib/Doctrine/Persistence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "time": "2020-03-21T15:13:52+00:00" + }, + { + "name": "doctrine/reflection", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/reflection.git", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "ext-tokenizer": "*", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "doctrine/common": "^2.10", + "phpstan/phpstan": "^0.11.0", + "phpstan/phpstan-phpunit": "^0.11.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", + "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "keywords": [ + "reflection", + "static" + ], + "time": "2020-03-27T11:06:43+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "5458bdcf176f6a53292e3f0cc73f292d6302fb0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/5458bdcf176f6a53292e3f0cc73f292d6302fb0f", + "reference": "5458bdcf176f6a53292e3f0cc73f292d6302fb0f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2020-05-29T18:32:49+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.17", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2020-02-13T22:36:52+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2019-12-30T22:54:17+00:00" + }, + { + "name": "league/uri-parser", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-parser.git", + "reference": "671548427e4c932352d9b9279fdfa345bf63fa00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-parser/zipball/671548427e4c932352d9b9279fdfa345bf63fa00", + "reference": "671548427e4c932352d9b9279fdfa345bf63fa00", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-intl": "Allow parsing RFC3987 compliant hosts", + "league/uri-schemes": "Allow validating and normalizing URI parsing results" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "src" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "userland URI parser RFC 3986 compliant", + "homepage": "https://github.com/thephpleague/uri-parser", + "keywords": [ + "parse_url", + "parser", + "rfc3986", + "rfc3987", + "uri", + "url" + ], + "time": "2018-11-22T07:55:51+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "104443ad663d15981225f99532ba73c2f1d6b6f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/104443ad663d15981225f99532ba73c2f1d6b6f2", + "reference": "104443ad663d15981225f99532ba73c2f1d6b6f2", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35", + "sami/sami": "~2.0", + "satooshi/php-coveralls": "1.0.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "time": "2019-07-25T07:03:26+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/38914429aac460e8e4616c8cb486ecb40ec90bb1", + "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^6.0", + "graylog2/gelf-php": "^1.4.2", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpspec/prophecy": "^1.6.1", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-05-22T08:12:19+00:00" + }, + { + "name": "ocramius/package-versions", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/PackageVersions.git", + "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", + "reference": "44af6f3a2e2e04f2af46bcb302ad9600cba41c7d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0", + "php": "^7.1.0" + }, + "require-dev": { + "composer/composer": "^1.6.3", + "doctrine/coding-standard": "^5.0.1", + "ext-zip": "*", + "infection/infection": "^0.7.1", + "phpunit/phpunit": "^7.5.17" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "time": "2019-11-15T16:17:10+00:00" + }, + { + "name": "ocramius/proxy-manager", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/ProxyManager.git", + "reference": "4d154742e31c35137d5374c998e8f86b54db2e2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/4d154742e31c35137d5374c998e8f86b54db2e2f", + "reference": "4d154742e31c35137d5374c998e8f86b54db2e2f", + "shasum": "" + }, + "require": { + "ocramius/package-versions": "^1.1.3", + "php": "^7.2.0", + "zendframework/zend-code": "^3.3.0" + }, + "require-dev": { + "couscous/couscous": "^1.6.1", + "ext-phar": "*", + "humbug/humbug": "1.0.0-RC.0@RC", + "nikic/php-parser": "^3.1.1", + "padraic/phpunit-accelerator": "dev-master@DEV", + "phpbench/phpbench": "^0.12.2", + "phpstan/phpstan": "dev-master#856eb10a81c1d27c701a83f167dc870fd8f4236a as 0.9.999", + "phpstan/phpstan-phpunit": "dev-master#5629c0a1f4a9c417cb1077cf6693ad9753895761", + "phpunit/phpunit": "^6.4.3", + "squizlabs/php_codesniffer": "^2.9.1" + }, + "suggest": { + "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", + "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", + "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", + "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "ProxyManager\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + } + ], + "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", + "homepage": "https://github.com/Ocramius/ProxyManager", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "time": "2019-08-10T08:37:15+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "sensio/framework-extra-bundle", + "version": "v5.5.5", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", + "reference": "c76bb1c5c67840ecb6d9be8e9d8d7036e375e317" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/c76bb1c5c67840ecb6d9be8e9d8d7036e375e317", + "reference": "c76bb1c5c67840ecb6d9be8e9d8d7036e375e317", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "php": ">=7.1.3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "conflict": { + "doctrine/doctrine-cache-bundle": "<1.3.1" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.5", + "nyholm/psr7": "^1.1", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/monolog-bridge": "^4.0|^5.0", + "symfony/monolog-bundle": "^3.2", + "symfony/phpunit-bridge": "^4.3.5|^5.0", + "symfony/psr-http-message-bridge": "^1.1", + "symfony/security-bundle": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sensio\\Bundle\\FrameworkExtraBundle\\": "src/" + }, + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ], + "time": "2020-05-06T12:12:33+00:00" + }, + { + "name": "symfony/apache-pack", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/apache-pack.git", + "reference": "3aa5818d73ad2551281fc58a75afd9ca82622e6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/apache-pack/zipball/3aa5818d73ad2551281fc58a75afd9ca82622e6c", + "reference": "3aa5818d73ad2551281fc58a75afd9ca82622e6c", + "shasum": "" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for Apache support in Symfony", + "time": "2017-12-12T01:46:35+00:00" + }, + { + "name": "symfony/asset", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/asset.git", + "reference": "2f07b5993f1607c1c489bac3e15a000c33668b4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/asset/zipball/2f07b5993f1607c1c489bac3e15a000c33668b4b", + "reference": "2f07b5993f1607c1c489bac3e15a000c33668b4b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0" + }, + "suggest": { + "symfony/http-foundation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Asset\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Asset Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "653b1d1cefffedb67ed1932db59c0bb344adf088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/653b1d1cefffedb67ed1932db59c0bb344adf088", + "reference": "653b1d1cefffedb67ed1932db59c0bb344adf088", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "conflict": { + "doctrine/dbal": "<2.5", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6", + "doctrine/dbal": "^2.5|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-28T09:10:22+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "87c92f62c494626598e9148208aaa6d1716b8e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/87c92f62c494626598e9148208aaa6d1716b8e3c", + "reference": "87c92f62c494626598e9148208aaa6d1716b8e3c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/config", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "b8623ef3d99fe62a34baf7a111b576216965f880" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/b8623ef3d99fe62a34baf7a111b576216965f880", + "reference": "b8623ef3d99fe62a34baf7a111b576216965f880", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/filesystem": "^4.4|^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/finder": "<4.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-23T13:08:13+00:00" + }, + { + "name": "symfony/console", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "00bed125812716d09b163f0727ef33bb49bf3448" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/00bed125812716d09b163f0727ef33bb49bf3448", + "reference": "00bed125812716d09b163f0727ef33bb49bf3448", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "6a6791e9584273b32eeb01790da4c7446d87a621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6a6791e9584273b32eeb01790da4c7446d87a621", + "reference": "6a6791e9584273b32eeb01790da4c7446d87a621", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/config": "<5.1", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", + "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-27T08:34:37+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "e88cfe6333eca0afe08965b14598be60f9fc3d53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/e88cfe6333eca0afe08965b14598be60f9fc3d53", + "reference": "e88cfe6333eca0afe08965b14598be60f9fc3d53", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "^1.3", + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/dependency-injection": "<4.4", + "symfony/form": "<5.1", + "symfony/http-kernel": "<5", + "symfony/messenger": "<4.4", + "symfony/property-info": "<5", + "symfony/security-bundle": "<5", + "symfony/security-core": "<5", + "symfony/validator": "<5.0.2" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.6", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.6.3", + "doctrine/reflection": "~1.0", + "symfony/cache": "^5.1", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^5.1", + "symfony/http-kernel": "^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^5.0", + "symfony/proxy-manager-bridge": "^4.4|^5.0", + "symfony/security-core": "^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.0.2", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-28T09:10:22+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "42d2a18597f4c7cafc0e25b1ad6a1cbb4f2caf05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/42d2a18597f4c7cafc0e25b1ad6a1cbb4f2caf05", + "reference": "42d2a18597f4c7cafc0e25b1ad6a1cbb4f2caf05", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" + }, + "require-dev": { + "symfony/process": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-28T08:20:44+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896", + "reference": "7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ErrorHandler Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cc0d059e2e997e79ca34125a52f3e33de4424ac7", + "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "405952c4e90941a17e52ef7489a2bd94870bb290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/405952c4e90941a17e52ef7489a2bd94870bb290", + "reference": "405952c4e90941a17e52ef7489a2bd94870bb290", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "f8344b92f6a19138df4dae4edbabe8e5fda11c7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/f8344b92f6a19138df4dae4edbabe8e5fda11c7e", + "reference": "f8344b92f6a19138df4dae4edbabe8e5fda11c7e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ExpressionLanguage Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "6e4320f06d5f2cce0d96530162491f4465179157" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6e4320f06d5f2cce0d96530162491f4465179157", + "reference": "6e4320f06d5f2cce0d96530162491f4465179157", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187", + "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/flex", + "version": "v1.7.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "a53056880aae0ce034ac6c38906e162ee5cfd2df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/a53056880aae0ce034ac6c38906e162ee5cfd2df", + "reference": "a53056880aae0ce034ac6c38906e162ee5cfd2df", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^1.0.2", + "symfony/dotenv": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + }, + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-28T07:16:35+00:00" + }, + { + "name": "symfony/form", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "4d492698887bcf88569ae978362b6ca2c9a7df4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/4d492698887bcf88569ae978362b6ca2c9a7df4a", + "reference": "4d492698887bcf88569ae978362b6ca2c9a7df4a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/options-resolver": "^5.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/property-access": "^5.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<4.4", + "symfony/error-handler": "<4.4.5", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/translation": "<4.4", + "symfony/translation-contracts": "<1.1.7", + "symfony/twig-bridge": "<4.4" + }, + "require-dev": { + "doctrine/collections": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Form Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "db39e29cf3a99692390e6d18fdc57d42e9e5a3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/db39e29cf3a99692390e6d18fdc57d42e9e5a3c9", + "reference": "db39e29cf3a99692390e6d18fdc57d42e9e5a3c9", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^5.1", + "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/event-dispatcher": "^5.1", + "symfony/filesystem": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/routing": "^5.1" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<5.4.3", + "symfony/asset": "<5.1", + "symfony/browser-kit": "<4.4", + "symfony/console": "<4.4", + "symfony/dom-crawler": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<4.4", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<4.4", + "symfony/messenger": "<4.4", + "symfony/mime": "<4.4", + "symfony/property-info": "<4.4", + "symfony/serializer": "<4.4", + "symfony/stopwatch": "<4.4", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<4.4", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<4.4", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "paragonie/sodium_compat": "^1.8", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "^5.1", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/dotenv": "^5.1", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^4.4|^5.0", + "symfony/property-info": "^4.4|^5.0", + "symfony/security-bundle": "^5.1", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/string": "^5.0", + "symfony/translation": "^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-25T12:33:44+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e0d853bddc2b2cfb0d67b0b4496c03fffe1d37fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e0d853bddc2b2cfb0d67b0b4496c03fffe1d37fa", + "reference": "e0d853bddc2b2cfb0d67b0b4496c03fffe1d37fa", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-24T12:18:07+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "75ff5327a7d6ede3ccc2fac3ebca9ed776b3e85c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/75ff5327a7d6ede3ccc2fac3ebca9ed776b3e85c", + "reference": "75ff5327a7d6ede3ccc2fac3ebca9ed776b3e85c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-31T06:14:18+00:00" + }, + { + "name": "symfony/inflector", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/inflector.git", + "reference": "fddb4262dd136b34db993a2a3488713df91e4856" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/inflector/zipball/fddb4262dd136b34db993a2a3488713df91e4856", + "reference": "fddb4262dd136b34db993a2a3488713df91e4856", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/string": "^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Inflector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Inflector Component", + "homepage": "https://symfony.com", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string", + "symfony", + "words" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/intl", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "b21d69ebb33adfcb7e6d8b0a0a8799db7090705b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/b21d69ebb33adfcb7e6d8b0a0a8799db7090705b", + "reference": "b21d69ebb33adfcb7e6d8b0a0a8799db7090705b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/filesystem": "^4.4|^5.0" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/mailer", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "7308b053e16a4f43e2aaf32dc11f72174f59247e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/7308b053e16a4f43e2aaf32dc11f72174f59247e", + "reference": "7308b053e16a4f43e2aaf32dc11f72174f59247e", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "php": ">=7.2.5", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/http-kernel": "<4.4" + }, + "require-dev": { + "symfony/amazon-mailer": "^4.4|^5.0", + "symfony/google-mailer": "^4.4|^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/mailchimp-mailer": "^4.4|^5.0", + "symfony/mailgun-mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/postmark-mailer": "^4.4|^5.0", + "symfony/sendgrid-mailer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailer Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "56261f89385f9d13cf843a5101ac72131190bc91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/56261f89385f9d13cf843a5101ac72131190bc91", + "reference": "56261f89385f9d13cf843a5101ac72131190bc91", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-25T12:33:44+00:00" + }, + { + "name": "symfony/monolog-bridge", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "b275d752c7e999a77e1bddca117e575030a23058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/b275d752c7e999a77e1bddca117e575030a23058", + "reference": "b275d752c7e999a77e1bddca117e575030a23058", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", + "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Monolog Bridge", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "dd80460fcfe1fa2050a7103ad818e9d0686ce6fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/dd80460fcfe1fa2050a7103ad818e9d0686ce6fd", + "reference": "dd80460fcfe1fa2050a7103ad818e9d0686ce6fd", + "shasum": "" + }, + "require": { + "monolog/monolog": "~1.22 || ~2.0", + "php": ">=5.6", + "symfony/config": "~3.4 || ~4.0 || ^5.0", + "symfony/dependency-injection": "~3.4.10 || ^4.0.10 || ^5.0", + "symfony/http-kernel": "~3.4 || ~4.0 || ^5.0", + "symfony/monolog-bridge": "~3.4 || ~4.0 || ^5.0" + }, + "require-dev": { + "symfony/console": "~3.4 || ~4.0 || ^5.0", + "symfony/phpunit-bridge": "^3.4.19 || ^4.0 || ^5.0", + "symfony/yaml": "~3.4 || ~4.0 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "http://symfony.com", + "keywords": [ + "log", + "logging" + ], + "time": "2019-11-13T13:11:14+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "663f5dd5e14057d1954fe721f9709d35837f2447" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/663f5dd5e14057d1954fe721f9709d35837f2447", + "reference": "663f5dd5e14057d1954fe721f9709d35837f2447", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-23T13:08:13+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", + "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2020-05-12T16:14:59+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "e094b0770f7833fdf257e6ba4775be4e258230b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e094b0770f7833fdf257e6ba4775be4e258230b2", + "reference": "e094b0770f7833fdf257e6ba4775be4e258230b2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:47:27+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "4ef3923e4a86e1b6ef72d42be59dbf7d33a685e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/4ef3923e4a86e1b6ef72d42be59dbf7d33a685e3", + "reference": "4ef3923e4a86e1b6ef72d42be59dbf7d33a685e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": "~2.3|~3.0|~4.0|~5.0" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:14:59+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a", + "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:47:27+00:00" + }, + { + "name": "symfony/polyfill-intl-messageformatter", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-messageformatter.git", + "reference": "318cc1255d90bd9a14f8293e3398d9e3f8c90261" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-messageformatter/zipball/318cc1255d90bd9a14f8293e3398d9e3f8c90261", + "reference": "318cc1255d90bd9a14f8293e3398d9e3f8c90261", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\MessageFormatter\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's MessageFormatter class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "messageformatter", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:14:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "1357b1d168eb7f68ad6a134838e46b0b159444a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/1357b1d168eb7f68ad6a134838e46b0b159444a9", + "reference": "1357b1d168eb7f68ad6a134838e46b0b159444a9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:14:59+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", + "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:47:27+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a760d8964ff79ab9bf057613a5808284ec852ccc", + "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:47:27+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "5e30b2799bc1ad68f7feb62b60a73743589438dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/5e30b2799bc1ad68f7feb62b60a73743589438dd", + "reference": "5e30b2799bc1ad68f7feb62b60a73743589438dd", + "shasum": "" + }, + "require": { + "php": ">=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-12T16:47:27+00:00" + }, + { + "name": "symfony/property-access", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "776bf85b9ed5a9ba99496d5e5457a50de63cd997" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/776bf85b9ed5a9ba99496d5e5457a50de63cd997", + "reference": "776bf85b9ed5a9ba99496d5e5457a50de63cd997", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/inflector": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.15", + "symfony/property-info": "^5.1" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T21:17:32+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "b644923132bdd92c2664f0c7955f77a9a2b8e919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/b644923132bdd92c2664f0c7955f77a9a2b8e919", + "reference": "b644923132bdd92c2664f0c7955f77a9a2b8e919", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/string": "^5.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<0.3.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/cache": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Property Info Component", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "95cf30145b26c758d6d832aa2d0de3128978d556" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/95cf30145b26c758d6d832aa2d0de3128978d556", + "reference": "95cf30145b26c758d6d832aa2d0de3128978d556", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "410ce6220f458a3ac1347a3bb98383629223b8ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/410ce6220f458a3ac1347a3bb98383629223b8ce", + "reference": "410ce6220f458a3ac1347a3bb98383629223b8ce", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^5.1", + "symfony/event-dispatcher": "^5.1", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-php80": "^1.15", + "symfony/security-core": "^5.1", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-guard": "^5.1", + "symfony/security-http": "^5.1" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/console": "<4.4", + "symfony/framework-bundle": "<4.4", + "symfony/ldap": "<4.4", + "symfony/twig-bundle": "<4.4" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^2.0", + "symfony/asset": "^4.4|^5.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/twig-bridge": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony SecurityBundle", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-27T19:00:01+00:00" + }, + { + "name": "symfony/security-core", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "7414e45f720dd81879bd9a74f152ec92e91d36b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/7414e45f720dd81879bd9a74f152ec92e91d36b6", + "reference": "7414e45f720dd81879bd9a74f152ec92e91d36b6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4" + }, + "require-dev": { + "psr/container": "^1.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T21:52:37+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "962323e4db4458d731d5006f14019a22a2f84b06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/962323e4db4458d731d5006f14019a22a2f84b06", + "reference": "962323e4db4458d731d5006f14019a22a2f84b06", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/security-core": "^4.4|^5.0" + }, + "conflict": { + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "symfony/http-foundation": "^4.4|^5.0" + }, + "suggest": { + "symfony/http-foundation": "For using the class SessionTokenStorage." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - CSRF Library", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/security-guard", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-guard.git", + "reference": "85c368be963e9f0df9e93d830f966fc0af531703" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/85c368be963e9f0df9e93d830f966fc0af531703", + "reference": "85c368be963e9f0df9e93d830f966fc0af531703", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/security-core": "^5.0", + "symfony/security-http": "^4.4.1|^5.0.1" + }, + "require-dev": { + "psr/log": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Guard\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Guard", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/security-http", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "6a785d9a0deeb401d7ae540fd0492aca4e6b894e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/6a785d9a0deeb401d7ae540fd0492aca4e6b894e", + "reference": "6a785d9a0deeb401d7ae540fd0492aca4e6b894e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-foundation": "^4.4.7|^5.0.7", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.15", + "symfony/property-access": "^4.4|^5.0", + "symfony/security-core": "^5.1" + }, + "conflict": { + "symfony/event-dispatcher": "<4.3", + "symfony/security-csrf": "<4.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/routing": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0" + }, + "suggest": { + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/string", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "90c2a5103f07feb19069379f3abdcdbacc7753a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/90c2a5103f07feb19069379f3abdcdbacc7753a9", + "reference": "90c2a5103f07feb19069379f3abdcdbacc7753a9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony String component", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", + "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^2" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e5ca07c8f817f865f618aa072c2fe8e0e637340e", + "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "04f57638e591b23d06f72dca2f123605dbbe3a75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/04f57638e591b23d06f72dca2f123605dbbe3a75", + "reference": "04f57638e591b23d06f72dca2f123605dbbe3a75", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/form": "<5.1", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.0", + "symfony/workflow": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.1", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/cssinliner-extra": "^2.12", + "twig/inky-extra": "^2.12", + "twig/markdown-extra": "^2.12" + }, + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Twig Bridge", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8898ef8aea8fa48638e15ce00c7c6318ce570ce1", + "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony TwigBundle", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/twig-pack", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-pack.git", + "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-pack/zipball/8b278ea4b61fba7c051f172aacae6d87ef4be0e0", + "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/twig-bundle": "*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A Twig pack for Symfony projects", + "time": "2019-10-17T05:44:22+00:00" + }, + { + "name": "symfony/validator", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "7a012b935dffe51d37ce001f62fbc6cb307d96df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/7a012b935dffe51d37ce001f62fbc6cb307d96df", + "reference": "7a012b935dffe51d37ce001f62fbc6cb307d96df", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^1.1|^2" + }, + "conflict": { + "doctrine/lexer": "<1.0.2", + "phpunit/phpunit": "<5.4.3", + "symfony/dependency-injection": "<4.4", + "symfony/expression-language": "<5.1", + "symfony/http-kernel": "<4.4", + "symfony/intl": "<4.4", + "symfony/translation": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "egulias/email-validator": "^2.1.10", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^5.1", + "symfony/http-client": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the mapping cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T21:58:16+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "46a942903059b0b05e601f00eb64179e05578c0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46a942903059b0b05e601f00eb64179e05578c0f", + "reference": "46a942903059b0b05e601f00eb64179e05578c0f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "76cf21551652b14d80abf13243159fbdf4bbef22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/76cf21551652b14d80abf13243159fbdf4bbef22", + "reference": "76cf21551652b14d80abf13243159fbdf4bbef22", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/webpack-encore-bundle", + "version": "v1.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/webpack-encore-bundle.git", + "reference": "5c0f659eceae87271cce54bbdfb05ed8ec9007bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/5c0f659eceae87271cce54bbdfb05ed8ec9007bd", + "reference": "5c0f659eceae87271cce54bbdfb05ed8ec9007bd", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/asset": "^3.4 || ^4.0 || ^5.0", + "symfony/config": "^3.4 || ^4.0 || ^5.0", + "symfony/dependency-injection": "^3.4 || ^4.0 || ^5.0", + "symfony/http-kernel": "^3.4 || ^4.0 || ^5.0", + "symfony/service-contracts": "^1.0 || ^2.0" + }, + "require-dev": { + "symfony/framework-bundle": "^3.4 || ^4.0 || ^5.0", + "symfony/phpunit-bridge": "^4.3.5 || ^5.0", + "symfony/twig-bundle": "^3.4 || ^4.0 || ^5.0", + "symfony/web-link": "^3.4 || ^4.0 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "thanks": { + "name": "symfony/webpack-encore", + "url": "https://github.com/symfony/webpack-encore" + } + }, + "autoload": { + "psr-4": { + "Symfony\\WebpackEncoreBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Integration with your Symfony app & Webpack Encore!", + "time": "2020-01-31T15:31:59+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "ea342353a3ef4f453809acc4ebc55382231d4d23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ea342353a3ef4f453809acc4ebc55382231d4d23", + "reference": "ea342353a3ef4f453809acc4ebc55382231d4d23", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "tgalopin/html-sanitizer", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/tgalopin/html-sanitizer.git", + "reference": "56cca6b48de4e50d16a4f549e3e677ae0d561e91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tgalopin/html-sanitizer/zipball/56cca6b48de4e50d16a4f549e3e677ae0d561e91", + "reference": "56cca6b48de4e50d16a4f549e3e677ae0d561e91", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "league/uri-parser": "^1.4.1", + "masterminds/html5": "^2.4", + "php": ">=7.1", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.4", + "symfony/var-dumper": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "HtmlSanitizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + } + ], + "description": "Sanitize untrustworthy HTML user input", + "time": "2020-02-03T16:51:08+00:00" + }, + { + "name": "tgalopin/html-sanitizer-bundle", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/tgalopin/html-sanitizer-bundle.git", + "reference": "df42087a1b1660eea37032f9ce3dc0997452d3e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tgalopin/html-sanitizer-bundle/zipball/df42087a1b1660eea37032f9ce3dc0997452d3e2", + "reference": "df42087a1b1660eea37032f9ce3dc0997452d3e2", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/framework-bundle": "^3.4|^4.0|^5.0", + "tgalopin/html-sanitizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.4", + "symfony/form": "^4.1|^5.0", + "symfony/twig-bundle": "^4.1|^5.0", + "symfony/var-dumper": "^4.1|^5.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "HtmlSanitizer\\Bundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Titouan Galopin", + "email": "galopintitouan@gmail.com" + } + ], + "description": "Symfony Bundle for https://github.com/tgalopin/html-sanitizer", + "time": "2019-11-23T09:46:29+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "6eaf1637abe6b68518e7e0949ebb84e55770d5c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6eaf1637abe6b68518e7e0949ebb84e55770d5c6", + "reference": "6eaf1637abe6b68518e7e0949ebb84e55770d5c6", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/framework-bundle": "^4.3|^5.0", + "symfony/twig-bundle": "^4.3|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "time": "2020-01-01T17:11:09+00:00" + }, + { + "name": "twig/intl-extra", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/twigphp/intl-extra.git", + "reference": "55d68a5836f40d62695488b4bdbc71fa71f52574" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/55d68a5836f40d62695488b4bdbc71fa71f52574", + "reference": "55d68a5836f40d62695488b4bdbc71fa71f52574", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/intl": "^4.3|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\Intl\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Intl", + "homepage": "https://twig.symfony.com", + "keywords": [ + "intl", + "twig" + ], + "time": "2020-02-11T05:45:44+00:00" + }, + { + "name": "twig/markdown-extra", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/twigphp/markdown-extra.git", + "reference": "c9d09a12024febcb6976886794d095a31f1ce6fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/c9d09a12024febcb6976886794d095a31f1ce6fa", + "reference": "c9d09a12024febcb6976886794d095a31f1ce6fa", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "erusev/parsedown": "^1.7", + "league/commonmark": "^1.0", + "league/html-to-markdown": "^4.8", + "michelf/php-markdown": "^1.8", + "symfony/phpunit-bridge": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\Markdown\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Twig extension for Markdown", + "homepage": "https://twig.symfony.com", + "keywords": [ + "html", + "markdown", + "twig" + ], + "time": "2020-01-01T17:11:09+00:00" + }, + { + "name": "twig/twig", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "3b88ccd180a6b61ebb517aea3b1a8906762a1dc2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/3b88ccd180a6b61ebb517aea3b1a8906762a1dc2", + "reference": "3b88ccd180a6b61ebb517aea3b1a8906762a1dc2", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "time": "2020-02-11T15:33:47+00:00" + }, + { + "name": "zendframework/zend-code", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-code.git", + "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", + "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", + "shasum": "" + }, + "require": { + "php": "^7.1", + "zendframework/zend-eventmanager": "^2.6 || ^3.0" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "require-dev": { + "doctrine/annotations": "^1.7", + "ext-phar": "*", + "phpunit/phpunit": "^7.5.16 || ^8.4", + "zendframework/zend-coding-standard": "^1.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "zendframework/zend-stdlib": "Zend\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev", + "dev-develop": "3.5.x-dev", + "dev-dev-4.0": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "keywords": [ + "ZendFramework", + "code", + "zf" + ], + "abandoned": "laminas/laminas-code", + "time": "2019-12-10T19:21:15+00:00" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", + "reference": "a5e2583a211f73604691586b8406ff7296a946dd", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://github.com/zendframework/zend-eventmanager", + "keywords": [ + "event", + "eventmanager", + "events", + "zf2" + ], + "abandoned": "laminas/laminas-eventmanager", + "time": "2018-04-25T15:33:34+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/semver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", + "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2020-01-13T12:06:48+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51", + "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-06-04T11:16:35+00:00" + }, + { + "name": "dama/doctrine-test-bundle", + "version": "v6.3.2", + "source": { + "type": "git", + "url": "https://github.com/dmaicher/doctrine-test-bundle.git", + "reference": "06932e828b4e8ed8655b9b64ae30428e048b616e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/06932e828b4e8ed8655b9b64ae30428e048b616e", + "reference": "06932e828b4e8ed8655b9b64ae30428e048b616e", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9,>=2.9.3", + "doctrine/doctrine-bundle": "^1.11 || ^2.0", + "php": "^7.1", + "symfony/framework-bundle": "^3.4 || ^4.3 || ^5.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "symfony/phpunit-bridge": "^4.3 || ^5.0", + "symfony/yaml": "^3.4 || ^4.3 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "7.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Maicher", + "email": "mail@dmaicher.de" + } + ], + "description": "Symfony bundle to isolate doctrine database tests and improve test performance", + "keywords": [ + "doctrine", + "isolation", + "performance", + "symfony", + "tests" + ], + "time": "2020-03-02T20:42:23+00:00" + }, + { + "name": "doctrine/data-fixtures", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "7ebac50901eb4516816ac39100dba1759d843943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/7ebac50901eb4516816ac39100dba1759d843943", + "reference": "7ebac50901eb4516816ac39100dba1759d843943", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.11", + "doctrine/persistence": "^1.3.3", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "doctrine/dbal": "^2.5.4", + "doctrine/mongodb-odm": "^1.3.0", + "doctrine/orm": "^2.7.0", + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database" + ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2020-05-25T19:45:03+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "39defca57ee0949e1475c46177b30b6d1b732e8f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/39defca57ee0949e1475c46177b30b6d1b732e8f", + "reference": "39defca57ee0949e1475c46177b30b6d1b732e8f", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.6.0", + "doctrine/persistence": "^1.3", + "php": "^7.1", + "symfony/config": "^3.4|^4.3|^5.0", + "symfony/console": "^3.4|^4.3|^5.0", + "symfony/dependency-injection": "^3.4|^4.3|^5.0", + "symfony/doctrine-bridge": "^3.4|^4.1|^5.0", + "symfony/http-kernel": "^3.4|^4.3|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.4", + "symfony/phpunit-bridge": "^4.1|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "time": "2020-04-02T16:40:37+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "3.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "fc2f4e87f57230a33d52e42973b898175199d065" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/fc2f4e87f57230a33d52e42973b898175199d065", + "reference": "fc2f4e87f57230a33d52e42973b898175199d065", + "shasum": "" + }, + "require": { + "composer/semver": "^1.4", + "composer/xdebug-handler": "^1.2", + "doctrine/annotations": "^1.2", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^5.6 || ^7.0", + "php-cs-fixer/diff": "^2.0", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", + "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^3.0 || ^4.0 || ^5.0", + "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", + "symfony/polyfill-php70": "^1.0", + "symfony/polyfill-php72": "^1.4", + "symfony/process": "^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", + "justinrainbow/json-schema": "^5.0", + "keradus/cli-executor": "^1.2", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.1", + "php-cs-fixer/accessible-object": "^1.0", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", + "phpunitgoodpractices/traits": "^1.8", + "symfony/phpunit-bridge": "^5.1", + "symfony/yaml": "^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters in cache signature.", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "classmap": [ + "tests/Test/AbstractFixerTestCase.php", + "tests/Test/AbstractIntegrationCaseFactory.php", + "tests/Test/AbstractIntegrationTestCase.php", + "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/IntegrationCase.php", + "tests/Test/IntegrationCaseFactory.php", + "tests/Test/IntegrationCaseFactoryInterface.php", + "tests/Test/InternalIntegrationCaseFactory.php", + "tests/Test/IsIdenticalConstraint.php", + "tests/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2020-06-04T06:31:49+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/53c2753d756f5adb586dca79c2ec0e2654dd9463", + "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "0.0.5", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2020-06-03T07:24:19+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "834b52c245240db327d9ab06ade429bfa3f08d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/834b52c245240db327d9ab06ade429bfa3f08d5b", + "reference": "834b52c245240db327d9ab06ade429bfa3f08d5b", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "sebastian/diff v3 backport support for PHP 5.6+", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "time": "2019-09-04T11:05:18+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "b9adef763c4f98660d1f8b924f6d61718f8ae0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b9adef763c4f98660d1f8b924f6d61718f8ae0bc", + "reference": "b9adef763c4f98660d1f8b924f6d61718f8ae0bc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0" + }, + "require-dev": { + "symfony/css-selector": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony BrowserKit Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-23T13:13:03+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e544e24472d4c97b2d11ade7caacd446727c6bf9", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/debug-bundle", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug-bundle.git", + "reference": "3f4bcea52678eedf19260973217f5ae7b835edf5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/3f4bcea52678eedf19260973217f5ae7b835edf5", + "reference": "3f4bcea52678eedf19260973217f5ae7b835edf5", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": ">=7.2.5", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/twig-bridge": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/web-profiler-bundle": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "For service container configuration", + "symfony/dependency-injection": "For using as a service from the container" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\DebugBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DebugBundle", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "907187782c465a564f9030a0c6ace59e8821106f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/907187782c465a564f9030a0c6ace59e8821106f", + "reference": "907187782c465a564f9030a0c6ace59e8821106f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-23T13:08:13+00:00" + }, + { + "name": "symfony/maker-bundle", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "bea8c3c959e48a2c952cc7c4f4f32964be8b8874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/bea8c3c959e48a2c952cc7c4f4f32964be8b8874", + "reference": "bea8c3c959e48a2c952cc7c4f4f32964be8b8874", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.2", + "nikic/php-parser": "^4.0", + "php": "^7.1.3", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/framework-bundle": "^3.4|^4.0|^5.0", + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "require-dev": { + "doctrine/doctrine-bundle": "^1.8|^2.0", + "doctrine/orm": "^2.3", + "friendsofphp/php-cs-fixer": "^2.8", + "friendsoftwig/twigcs": "^3.1.2", + "symfony/http-client": "^4.3|^5.0", + "symfony/phpunit-bridge": "^4.3|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/security-core": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "generator", + "scaffold", + "scaffolding" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-29T14:47:30+00:00" + }, + { + "name": "symfony/phpunit-bridge", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "7a05a59154053d62674def66a5c99896113632f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7a05a59154053d62674def66a5c99896113632f2", + "reference": "7a05a59154053d62674def66a5c99896113632f2", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" + }, + "suggest": { + "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + }, + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony PHPUnit Bridge", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-23T13:08:13+00:00" + }, + { + "name": "symfony/process", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", + "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v5.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "4d7bdd83fc92d10f005d99d04f80cc0c79c29ef9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4d7bdd83fc92d10f005d99d04f80cc0c79c29ef9", + "reference": "4d7bdd83fc92d10f005d99d04f80cc0c79c29ef9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/framework-bundle": "^5.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/form": "<4.4", + "symfony/messenger": "<4.4" + }, + "require-dev": { + "symfony/browser-kit": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony WebProfilerBundle", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-28T08:20:44+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "friendsofphp/php-cs-fixer": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^7.2.9", + "ext-pdo_sqlite": "*" + }, + "platform-dev": [], + "platform-overrides": { + "php": "7.2.9" + }, + "plugin-api-version": "1.1.0" +} diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 00000000..9c5a0d57 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,19 @@ + ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], + Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], + HtmlSanitizer\Bundle\HtmlSanitizerBundle::class => ['all' => true], +]; diff --git a/config/packages/assets.yaml b/config/packages/assets.yaml new file mode 100644 index 00000000..051d36dc --- /dev/null +++ b/config/packages/assets.yaml @@ -0,0 +1,3 @@ +framework: + assets: + json_manifest_path: '%kernel.project_dir%/public/build/manifest.json' diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml new file mode 100644 index 00000000..6899b720 --- /dev/null +++ b/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Unique name of your app: used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The "app" cache stores to the filesystem by default. + # The data in this cache should persist between deploys. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: null diff --git a/config/packages/dev/debug.yaml b/config/packages/dev/debug.yaml new file mode 100644 index 00000000..26d4e53d --- /dev/null +++ b/config/packages/dev/debug.yaml @@ -0,0 +1,4 @@ +debug: + # Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. + # See the "server:dump" command to start a new server. + dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" diff --git a/config/packages/dev/mailer.yaml b/config/packages/dev/mailer.yaml new file mode 100644 index 00000000..8f1eb0ff --- /dev/null +++ b/config/packages/dev/mailer.yaml @@ -0,0 +1,4 @@ +framework: + mailer: + # this disables delivery of messages entirely + dsn: 'null://null' diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml new file mode 100644 index 00000000..b1998da1 --- /dev/null +++ b/config/packages/dev/monolog.yaml @@ -0,0 +1,19 @@ +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + channels: ["!event"] + # uncomment to get logging in your browser + # you may have to allow bigger header sizes in your Web server configuration + #firephp: + # type: firephp + # level: info + #chromephp: + # type: chromephp + # level: info + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml new file mode 100644 index 00000000..e92166a7 --- /dev/null +++ b/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml new file mode 100644 index 00000000..5e80e77b --- /dev/null +++ b/config/packages/doctrine.yaml @@ -0,0 +1,18 @@ +doctrine: + dbal: + url: '%env(resolve:DATABASE_URL)%' + + # IMPORTANT: You MUST configure your server version, + # either here or in the DATABASE_URL env var (see .env file) + #server_version: '5.7' + orm: + auto_generate_proxy_classes: true + naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware + auto_mapping: true + mappings: + App: + is_bundle: false + type: annotation + dir: '%kernel.project_dir%/src/Entity' + prefix: 'App\Entity' + alias: App diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml new file mode 100644 index 00000000..08e7f078 --- /dev/null +++ b/config/packages/doctrine_migrations.yaml @@ -0,0 +1,5 @@ +doctrine_migrations: + dir_name: '%kernel.project_dir%/migrations' + # namespace is arbitrary but should be different from App\Migrations + # as migrations classes should NOT be autoloaded + namespace: DoctrineMigrations diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 index 00000000..78121542 --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,27 @@ +framework: + secret: '%env(APP_SECRET)%' + csrf_protection: true + http_method_override: true + trusted_hosts: null + + # Enables session support. Note that the session will ONLY be started if you read or write from it. + # Remove or comment this section to explicitly disable session support. + session: + handler_id: null + cookie_secure: auto + cookie_samesite: lax + + # When using the HTTP Cache, ESI allows to render page fragments separately + # and with different cache configurations for each fragment + # https://symfony.com/doc/current/http_cache/esi.html + esi: true + fragments: true + + php_errors: + log: true + + # The 'ide' option turns all of the file paths in an exception page + # into clickable links that open the given file using your favorite IDE. + # When 'ide' is set to null the file is opened in your web browser. + # See https://symfony.com/doc/current/reference/configuration/framework.html#ide + ide: null diff --git a/config/packages/html_sanitizer.yaml b/config/packages/html_sanitizer.yaml new file mode 100644 index 00000000..550bc323 --- /dev/null +++ b/config/packages/html_sanitizer.yaml @@ -0,0 +1,17 @@ +html_sanitizer: + default_sanitizer: 'default' + sanitizers: + default: + # Read https://github.com/tgalopin/html-sanitizer/blob/master/docs/1-getting-started.md#extensions + # to learn more about which extensions you would like to enable. + extensions: + - 'basic' + - 'list' + - 'table' + - 'image' + - 'code' + # - 'iframe' + # - 'extra' + + # Read https://github.com/tgalopin/html-sanitizer/blob/master/docs/3-configuration-reference.md + # to discover all the available options for each extension. diff --git a/config/packages/mailer.yaml b/config/packages/mailer.yaml new file mode 100644 index 00000000..56a650d8 --- /dev/null +++ b/config/packages/mailer.yaml @@ -0,0 +1,3 @@ +framework: + mailer: + dsn: '%env(MAILER_DSN)%' diff --git a/config/packages/prod/doctrine.yaml b/config/packages/prod/doctrine.yaml new file mode 100644 index 00000000..084f59a0 --- /dev/null +++ b/config/packages/prod/doctrine.yaml @@ -0,0 +1,20 @@ +doctrine: + orm: + auto_generate_proxy_classes: false + metadata_cache_driver: + type: pool + pool: doctrine.system_cache_pool + query_cache_driver: + type: pool + pool: doctrine.system_cache_pool + result_cache_driver: + type: pool + pool: doctrine.result_cache_pool + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml new file mode 100644 index 00000000..c8a16ec2 --- /dev/null +++ b/config/packages/prod/monolog.yaml @@ -0,0 +1,26 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + buffer_size: 50 # How many messages should be saved? Prevent memory leaks + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] + + # Uncomment to log deprecations + #deprecation: + # type: stream + # path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" + #deprecation_filter: + # type: filter + # handler: deprecation + # max_level: info + # channels: ["php"] diff --git a/config/packages/prod/routing.yaml b/config/packages/prod/routing.yaml new file mode 100644 index 00000000..b3e6a0af --- /dev/null +++ b/config/packages/prod/routing.yaml @@ -0,0 +1,3 @@ +framework: + router: + strict_requirements: null diff --git a/config/packages/prod/webpack_encore.yaml b/config/packages/prod/webpack_encore.yaml new file mode 100644 index 00000000..d0b3ba81 --- /dev/null +++ b/config/packages/prod/webpack_encore.yaml @@ -0,0 +1,4 @@ +#webpack_encore: + # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) + # Available in version 1.2 + #cache: true diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 00000000..b45c1cec --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,7 @@ +framework: + router: + utf8: true + + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + #default_uri: http://localhost diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 index 00000000..a4105cb2 --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,60 @@ +security: + encoders: + # Our user class and the algorithm we'll use to encode passwords + # 'auto' means to let Symfony choose the best possible password hasher (Argon2 or Bcrypt) + # https://symfony.com/doc/current/security.html#c-encoding-passwords + App\Entity\User: 'auto' + + providers: + # https://symfony.com/doc/current/security/user_provider.html + # In this example, users are stored via Doctrine in the database + # To see the users at src/App/DataFixtures/ORM/LoadFixtures.php + # To load users from somewhere else: https://symfony.com/doc/current/security/user_provider.html#creating-a-custom-user-provider + database_users: + entity: { class: App\Entity\User, property: username } + + # https://symfony.com/doc/current/security.html#a-authentication-firewalls + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + main: + # this firewall applies to all URLs + pattern: ^/ + + # but the firewall does not require login on every page + # denying access is done in access_control or in your controllers + anonymous: true + lazy: true + + # This allows the user to login by submitting a username and password + # Reference: https://symfony.com/doc/current/security/form_login_setup.html + form_login: + # The route name that the login form submits to + check_path: security_login + # The name of the route where the login form lives + # When the user tries to access a protected page, they are redirected here + login_path: security_login + # Secure the login form against CSRF + # Reference: https://symfony.com/doc/current/security/csrf.html#csrf-protection-in-login-forms + csrf_token_generator: security.csrf.token_manager + # The page users are redirect to when there is no previous page stored in the + # session (for example when the users access directly to the login page). + default_target_path: blog_index + + logout: + # The route name the user can go to in order to logout + path: security_logout + # The name of the route to redirect to after logging out + target: homepage + + # Used to restrict access for large sections of your site + # Note: Only the *first* access control that matches will be used + access_control: + # this is a catch-all for the admin area + # additional security lives in the controllers + - { path: '^/(%app_locales%)/admin', roles: ROLE_ADMIN } + + role_hierarchy: + ROLE_ADMIN: ROLE_USER diff --git a/config/packages/sensio_framework_extra.yaml b/config/packages/sensio_framework_extra.yaml new file mode 100644 index 00000000..1821ccc0 --- /dev/null +++ b/config/packages/sensio_framework_extra.yaml @@ -0,0 +1,3 @@ +sensio_framework_extra: + router: + annotations: false diff --git a/config/packages/test/dama_doctrine_test_bundle.yaml b/config/packages/test/dama_doctrine_test_bundle.yaml new file mode 100644 index 00000000..80b00911 --- /dev/null +++ b/config/packages/test/dama_doctrine_test_bundle.yaml @@ -0,0 +1,4 @@ +dama_doctrine_test: + enable_static_connection: true + enable_static_meta_data_cache: true + enable_static_query_cache: true diff --git a/config/packages/test/framework.yaml b/config/packages/test/framework.yaml new file mode 100644 index 00000000..d051c840 --- /dev/null +++ b/config/packages/test/framework.yaml @@ -0,0 +1,4 @@ +framework: + test: true + session: + storage_id: session.storage.mock_file diff --git a/config/packages/test/mailer.yaml b/config/packages/test/mailer.yaml new file mode 100644 index 00000000..8f1eb0ff --- /dev/null +++ b/config/packages/test/mailer.yaml @@ -0,0 +1,4 @@ +framework: + mailer: + # this disables delivery of messages entirely + dsn: 'null://null' diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml new file mode 100644 index 00000000..fc40641d --- /dev/null +++ b/config/packages/test/monolog.yaml @@ -0,0 +1,12 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/config/packages/test/security.yaml b/config/packages/test/security.yaml new file mode 100644 index 00000000..04af7cea --- /dev/null +++ b/config/packages/test/security.yaml @@ -0,0 +1,6 @@ +# this configuration simplifies testing URLs protected by the security mechanism +# See https://symfony.com/doc/current/testing/http_authentication.html +security: + firewalls: + main: + http_basic: ~ diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml new file mode 100644 index 00000000..8c6e0b40 --- /dev/null +++ b/config/packages/test/twig.yaml @@ -0,0 +1,2 @@ +twig: + strict_variables: true diff --git a/config/packages/test/validator.yaml b/config/packages/test/validator.yaml new file mode 100644 index 00000000..1e5ab788 --- /dev/null +++ b/config/packages/test/validator.yaml @@ -0,0 +1,3 @@ +framework: + validation: + not_compromised_password: false diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml new file mode 100644 index 00000000..03752de2 --- /dev/null +++ b/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/config/packages/test/webpack_encore.yaml b/config/packages/test/webpack_encore.yaml new file mode 100644 index 00000000..02a76515 --- /dev/null +++ b/config/packages/test/webpack_encore.yaml @@ -0,0 +1,2 @@ +#webpack_encore: +# strict_mode: false diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml new file mode 100644 index 00000000..e6b1cd66 --- /dev/null +++ b/config/packages/translation.yaml @@ -0,0 +1,6 @@ +framework: + default_locale: '%locale%' + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - '%locale%' diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 00000000..946bb04e --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,5 @@ +twig: + default_path: '%kernel.project_dir%/templates' + form_themes: + - 'form/layout.html.twig' + - 'form/fields.html.twig' diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml new file mode 100644 index 00000000..55ee10f6 --- /dev/null +++ b/config/packages/validator.yaml @@ -0,0 +1,9 @@ +framework: + validation: + enable_annotations: true + email_validation_mode: html5 + + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + auto_mapping: + App\Entity\: [] diff --git a/config/packages/webpack_encore.yaml b/config/packages/webpack_encore.yaml new file mode 100644 index 00000000..9191f4f4 --- /dev/null +++ b/config/packages/webpack_encore.yaml @@ -0,0 +1,25 @@ +webpack_encore: + # The path where Encore is building the assets - i.e. Encore.setOutputPath() + output_path: '%kernel.project_dir%/public/build' + # If multiple builds are defined (as shown below), you can disable the default build: + # output_path: false + + # if using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials') + # crossorigin: 'anonymous' + + # preload all rendered script and link tags automatically via the http2 Link header + # preload: true + + # Throw an exception if the entrypoints.json file is missing or an entry is missing from the data + # strict_mode: false + + # if you have multiple builds: + # builds: + # pass "frontend" as the 3rg arg to the Twig functions + # {{ encore_entry_script_tags('entry1', null, 'frontend') }} + + # frontend: '%kernel.project_dir%/public/frontend/build' + + # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes) + # Put in config/packages/prod/webpack_encore.yaml + # cache: true diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 index 00000000..21586e16 --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,12 @@ +# These lines define a route using YAML configuration. The controller used by +# the route (FrameworkBundle:Template:template) is a convenient shortcut when +# the template can be rendered without executing any logic in your own controller. +# See https://symfony.com/doc/current/templates.html#rendering-a-template-directly-from-a-route +homepage: + path: /{_locale} + controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController::templateAction + requirements: + _locale: '%app_locales%' + defaults: + template: default/homepage.html.twig + _locale: '%locale%' diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml new file mode 100644 index 00000000..3c41b75b --- /dev/null +++ b/config/routes/annotations.yaml @@ -0,0 +1,8 @@ +controllers: + resource: '../../src/Controller/' + type: annotation + prefix: /{_locale} + requirements: + _locale: '%app_locales%' + defaults: + _locale: '%locale%' diff --git a/config/routes/dev/framework.yaml b/config/routes/dev/framework.yaml new file mode 100644 index 00000000..bcbbf13d --- /dev/null +++ b/config/routes/dev/framework.yaml @@ -0,0 +1,3 @@ +_errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + prefix: /_error diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml new file mode 100644 index 00000000..c82beff2 --- /dev/null +++ b/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + +web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 index 00000000..8673a4d0 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,37 @@ +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + locale: 'en' + # This parameter defines the codes of the locales (languages) enabled in the application + app_locales: en|fr|de|es|cs|nl|ru|uk|ro|pt_BR|pl|it|ja|id|ca|sl|hr|zh_CN|bg|tr|lt + app.notifications.email_sender: anonymous@example.com + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + bind: # defines the scalar arguments once and apply them to any service defined/created in this file + $locales: '%app_locales%' + $defaultLocale: '%locale%' + $emailSender: '%app.notifications.email_sender%' + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Tests,Kernel.php}' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # when the service definition only contains arguments, you can omit the + # 'arguments' key and define the arguments just below the service class + App\EventSubscriber\CommentNotificationSubscriber: + $sender: '%app.notifications.email_sender%' diff --git a/data/database.sqlite b/data/database.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..1ff16420e4b8966b06a94318ee9f21c8182be98c GIT binary patch literal 274432 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%0DjCi&lx^^qweN|9>|9 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 literal 0 HcmV?d00001 diff --git a/data/database_test.sqlite b/data/database_test.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..1bdf92e07118e797346c2618611a201bb2586e7c GIT binary patch literal 241664 zcmeIb3w#{cc^|sKV6nhrcSj^8QWQyP^s+<<3jtUHAZ6(sr8 zlbfXN|9rE%!0s$|&lwVqV}1CMXMlaoob&&_^PTfQ=li~M?#wf`Zy5`YTQPm3khmq$ z)023@FcOJG4*%bY|Mj0Ne(9_KfospE-?#cTml*ANF*`Jn$o2h6BDXL5?b-W>-W+@ww?E6VtQPhrFwm1*dxTV#%sF7X#07_1Uv?Gw0_F@#zb5#)(tM=3bybB40I5 zpE4p}Hy*Sqrd>YxHQDgdcSRq4{P5)5*wplNtoH~8pICbHfXGV;Lpj^Hv9%wu_ zb9VNrnX?a0Oimu$^nrSXwtAni+Um_E)AL?++|pL>yAE1r%szAa=%yz=d-lZ1nX@k% zPtU#hpj|q6aCr!F$oH(=wjqZ@$0iR?P97SYoSP_2LlRA3_~v3}OEI*5Ga?3j+jx*9 zu#!!u_T=&4lTiuaQ?1V&+8TelXIuC?A>WF_)xp%B$?2YzU4+AlV=r8snmIZ7F<5kBXsQ(Y8-dZ7q=c_lyT?PifOL!lt)*W3yap zUmr1QK#dr)r%#)2&UGH)kGuew~;5+p9#kTUh*j}FpFzkr`2|o#? z#L%##(H|xc&m5VUo0>d6H9dK}Fn%<0+y00`wtl6pLK+XEs+SyBbcMD3ePoy4SZuG3 zk!L15tD(TOjgmDU*ycUo_RCw^Yp)zEZe?!0pi(j2t6RNYbgI5p^;_-nQZQe(y-QZ< zB521k=+*fXCqwlMhmg(v0RXjXT?FAKt!uP%>rNm>piuL~u+>@R55A^BDJFYX_G~Cc zVdmK3;|zG>mLitYQ3aXBzcu4z2uxK_om zmtdrgl2dkE!?S$@GjrcS$HBLK%MV<`EZIx8SG22(hJ{hon3=CS^QLEb0W9|=yX@fB zo_O9;*(}=PdCRtM8Z%`Z%mQ!>Sz+bP+Ofxc~(EqlSLmJHvuJs+R3jPsU@5BMgG zzTuhHl7;uoqHnsQ%0>}2a!uF9jTg%1GAip?RgdcatW_?atRZ8d z9k`HUe5lU}X`96&;0E-ejL|sHEH7^eX32B~j&o>wO+QdIt3ul01;Bk?eAaP&)I<&{ zLt2}Ug87NNL(_$ji)H+6qZ-S$>j!wr$CwVas(K5S8!A>!o956J=3Q$UUvf>~cB)V% zNd8n%E#k||__P@+zF9QNCK@jktuEx}(5)^76|-s^ixw0NHzA||(&d1Z%0{1q#u&?1 z*|}m=Y}cH(MFlHX2{NmSzSB*s=3EC5+7Kj^&GXUs%J#hFI))W&C{?JAQPrASJ3TBk6)o=h86fUlQ zMkPAAdNd^@y8fcD_M%@ZX&X9T!vh8LIay{6GMO{bRLG# zy3$>8lGY&ZND&3`(0ls@hAY`ky<*;U=S`u1Rr^ZVjpYnp^zMb#)5%m~uxC9eY}Mza z^)a>~Qjp!rP!CENKZS`7l|dM=4NKP;z2c7{GtyInD56vALwy3#Yn6i5Nz>XGWckM$ z3XoC96H~0RFyWg;Az9us9J5W>3XDZQhIq`+ zFljTZG~1|R4GDv75x8`iN;L_w^V}_}4U?<=n$U)|VnORVDkx1|+D`^L4J--`X-q4d zERDQ=Mu9lAa;8@Rv3j+j#hlM8NnL7cr!<|2wyCg|>=A8x!z_fuo17Ikl#E!D)LKR> zrTYK%&i9Nq_Ab-|kkLn0#5Vnr6|otA*hMj2LNWCcipkR`4$Yw`ybHxd0mb-16k~Ux zcz73z(R3Q+$20Fs=zpnyQU8MeIsNy+{r|oG>-w+g|F`}#`oGkFME{ijN&O${e_#K* z`rp<+qQ9lD>R+QT>r478dP)B({RRE3{)~QHe?osmKctW959;^m`}N)WEqYq-%l*&X zpXI)g`=i`vbHAPYce#I)`=#8^<^HeSzsUV??w{tqC-t+`xoAlIAy%j}_Yadv+v2C z&z{OYl|7n$S9U5pmL1OCm%TH4dv<3wlTBv+XXcBUKhFF?=09hCGxKjUznJ-S<|i^g zlKKA3_hh~!^KF@L%6ueqE%U+5)r7y(9r5nu$mA<(b&^xm2H zczF4y@bb6A%QuFXkBQ5H#P#s<(eU!O!pld(%ZJ5ff8ra$%h!jOuM0093NLSo%f7_5 z@bYGOc_X~6hnF>Rxg&uU260&lFCR>5Jw11PfXc5G<=)q+{2D6XPvvV=UKQo-SEziI z%4I48Dt%Gz@u+mEyiDa1m5wNPSE;N}S*G%RRK6n0+iWT?QMpLv0+p61Z!J+-q;j50 zlgh6a<*tiVeifB3Q~6#hUlQfc_fYvFl`l~FJeALha>oTK&r^Ah%Cl6S5#=q_M48-6j8sw~4avRw{Q< zxs%ErRNf*=O{X$PWtPeel|!QJO;b5YzplTkU)JBJ zTlz))Mg5$9Qh!pP(ch_0>JRG&^?UUL`W}6UKBOme|10%) zH@hpF&8D)6%%5kzkom*R?`D20^Xr*k&iq{Fr!qg9`GL$QGvAf@dzo*}d^Gc+%xdQS z89!6WEOaw;{5~VV2rvSS03*N%FanGKBk=Y{KoD##r2blhsK1sV>aQh;`fCZI{#r== zwFFUrEkV>@OAz(f5=8yAkos#0qW)TfsK1sV>aQh;`fDNe*AhhiwFFUrEkV>@OAz(f zLh7%D)L%;w_1B2{YefAuqW&6De~qZWM$}&;>aP*?*NFOSMEy0Q{u)t#ji|py)L$d& zuMzdvi27?p{WYTg8c~0ZsJ}+kUnAaP*?*NFOSMEy0Q{u)t#ji|py)L$d&uMzdvi27?p{WYTg z8c~0ZsJ}+kUnAaP*?*NFOSMEy0Q{u)t#ji|py)L$d&uMzdvi27?p{WYTg8c~0ZsJ}+kUnAaP*?*NFOS zMEy0Q{u)t#ji|py)L$d&uSrmUji|py)L$d&uMzdv`o#i(mZY+eN{!0iKCNd^6aN1P zbVrz{{1*QIKZA9EAJu5R^S^t>+VR!

    0hf~)&216Z*L37t!D%n z0Y-ok_=-W``g~71F?jXrTJVYI3-KH;5pZQy@)UlRr|_#h!msio{3^dG{3^c@ew7#A z^c_4=M-|+cM?<$oHUH(&Hr|G#Mw~dL+T-OMJ4co96+ty&q}mALNJJopVIg)*#AJxT z5XVj1RfMS_Pz`|-fsc@$c?d#;KnxF)7%W7LEF!cDF+*@?9v*(gI3^t75oc-{wi}4p zAqtkWt7+F-a;-}UW<%hQZy@+;*(nE0BE+j6`XHiIigvkN53$380;IrLg!8mfMJ5c> zK+F{W2;9;1+?ArWRQ8 zG7;!y8_vQ4ns25{79yC%yA=@`hPbUNqG?3z9b#mty+H-uorWY{nvOQZMO2FAmBJKmhIrT6c z(rEzdr_;~6a1BQjM3oTWBjTZf5A_GA6P(aRHAU}0wh$N61bz?)g`XkJ$E+Gvt2hE6 z!$=$4v5Hu&QDX)HSa`D*@6!|%7rr)%pe|AIjR3)AJPHvHLOk;bsY0|QfSDDcV}=P) zpo%_X8hslfc17Dkn4tg)h&pf+r=T105yZ8LNW)+r0fGdVIYO^N&md37OJB0lMALG- zQR6rQ$E>>K12^zSj78U6hI|oR2Vuf-9(4eUBgTB$td>Ohj0iBau8h{yFkKeW1c(O{ zN(d>Qz;_l=0~0SJgtLOWn<%f?6%oinDuzeGMc<|%nF|m`HOt zEuPfm9F4n%H%6xz*%WWq6nrKs4Ant1MXZ&GltcJv;Eis`nz|bLCP4D6%4pqN+pK*u zY~}(?975xS)*_V8qJA=J2t`DMXWAn5Mqe3$vI;_{*vhf$l*2`Gd!HW5uHI` zZ9`|s7o341Ao9L6BRl3S(p2C_ava`6OIpdLH9N&8wgt09kK zfRJ1vamal%E#e_z*U&r)c0_cEkWC%^y0kZXOHIb2b~VG~3bhajG=%_L0Y*l;Bci_|loVYn zRAvg)4ZG5auw}I`h-Za$yc}S1G;#pNL;Fz-??Z9$4ipdWMe)GxDBiIL#r?Zc+;+cAc{RAp~>zPire~8 z+$yO4E|I`*r-oujFN#|*!x8s-DfIvUtp1-vKJ5^@6kAtC~P zUjH$y0c?%~2>k%Q8n@sdMt~7u1Q-EEfDvE>7y(9r5nu!u0Y>2Mih%I3Cue}(1L9Zm z1?VMTfL`(i=-n$`CRc!7as}umSAbq}1?VMLfL?M1=-nwkxI+}=2+*sGUnvBjH!FV4 zh@ut%Abuq$fZhS|Yf2QM_rKWn?3z;QKEa|2OL2pud6L{#OzAZ|n0|6S$zCBESDf^n#w(-=Q1&UVSIL{`+!& zmHX4&=X1XgpZ|ZC`?cIJ;O6|p2rvSS03*N%FanGKBftnS0*nA7zzEz71d^kmwg*zl zytwowM{wDnN4K+mZ(UxV69UF8pz8@=pA*E15hXE?VDyytXU34}a_&Ox__by?uM} z+Ro(d_(ShY?!hIOO76xbJCM9hT$0IKamfrMcZo}Xa;LcTC3oO5G?2VST#|h{ZZee2 z;g5mAWEPiHDwz=%Ejffs|3EU0OR_&XC@#t5fVlJ}Q@HdEBoT7c)0ZN*|Gs`i{)77? z9za}@eZ69hpsxpIQtbba=DtPn|Nntq{@>Am6IuU%9_;_e5c&VT`gb7iUvU3*7y(9L3j|VqJ%ZAYhS$D4UH7L(=(;cYPkot)iQML9~h!*vOgVOlY`;4Z-B12gx6Gmc- ze?7baK7g2iPp{~Ux=DTjr}Y#1EY<_2^>O_n{eJx}cmnLwvse@8$^Av{Pja8%Ld5(s zBftnS0*nA7zz8q`i~u9R2rvSS03)zn2nZke1C#;q0A&E&PZOVl9|Ea9_J(Uq< zKl%PADFa}Vod1)Q0TBEDco*CMq9j*L1nTaO&S5;M9O0(68XUzc1kQ zfS*8)z^_BJz;2u=@Q-zKyM)R2Wds-jMt~7u1Q-EEfDvE>7y(9r5nu$iMu2EDEdlh= z5F!<^uM3ze;?8R0iyrOTf|q1{SR(p{~EFX0b>9C zo7g|x|H1eNi2bLC{r405Pf_%LlJfr#QvUy>i2ondKb+A2RR1I7{`*D!UxLSf7b5;Y zyfuRS4kN$_FanGKBftnS0*nA7zz8q`i~u9R2;2YyLxWo4K>e_o!2vC?H$1H-lhP7* zHO`$G?8h77kv8xFNZh?~)(w&YChp!iOem*miF@fxmZFa{A>09+!MTUdgc#_-Z*=^M z*#95YKa$XY2|M`Tik4?w$?)j|_tM_H5$+ z+Mu?lhxmW*fVO9l_`lfy*K(goz@vW%7ye-c7y(9r5nu!u0Y-okU<4QeMt~7u1ithL zl(m7xfxD(xk~`k*T&fz!9P1TaF9x3FHhy`+yINUrs#iygPUXIdtM`o;?t69V`OBvc zFO*JR7(4AvK6B{U`B!G=gW}Xl`^nSKxbCIVv9rtLXUr4~?Fhn)6PaKXtZfA1PlwHa~MZc(w3w z)h-`<`lNfl^5oHz=U#brwrCx_`ux+U{c}g3eEOw(&Ypf|?&8d`lP6By^YUvwXy)BV z@ZfiwRg0R5Yxw9_8o#x9_R-+A>G>n?3udR^y?pBV(zB%(i>DW@*QUl_@t!_*>dI5c z%!$h4x$))apSDMjjlN*o=4F4h`PpLsU(+?P7#NgGdYr!X;FFfP8R>h#;IfH`o4A1rrvts$i zrU*M@Blym+%C=7-c6s_%p1zgGxANj!`Ay%-Z+t5+zID=Z=WWBcDocTfyH_es$uTOX z@7vy}F&nt%yp3!=hFP{R2WG{v0^7q!YSpSbRl{+srfZEF=Ypzlcvdkeo0ezzu37aK zEZ4ORAK%5TQ4!a4Z9HY692EV)w(x-GOv|_wRLrVvELv5|6%W0D8yZ#HD;u6uF55*s zzhqYpyJRef-*?=iZBT9S8Y;IWzD18Wi$x0#lrAc;Z2PE|;hE)SdZf7=R1AbWdU&i7 zzNkQTkpLb+^F+%H3#||!2-F-my%7^>1ildlOB#^X@NgJW2{;$gq!7a4;YW;P0MRf5 z-!g1BKqW&N+tsvdExFbut6BmQzJW$J;xLV6AuPl4Jj*EBA5RKYst4DJr8cBhEpt>RuP{o21|Cy^u;$Iza`hPOF#{+6B5KjA;KjS z0NaMMuz=>9>5>I6Sn+N}NCc`_wV|ISRHxS7pfZ|H8^*A40d*8_nk56itoUUaf0`9~ z?~G`6)$x2cz*nzW5F;vKqYlHO=9Quof@gcf^!Zb^XA49LIC}|SF)Xv8qomW&0zaL8 z)`iNU38G5Sxe9&-KGYweP69PlQ}n43W5IpbXHxK zz#B0ZU2_@oMe86;-*Qn0pg3a8m(6NP=+Gi`)4DQRQ^Pd%MlVz+Nbv-|vxpj)=%kK| z)_b0b@`_zSKMGY0k1UJ6it08n95se#YBmB7u9#)Z3(S%^oEA@d)+(3LGK;=}yM{ML zrx-Dop=<%vzyki8{ty+0>Y$l0M4~BW3pT?W-HALTga?#Gfap`t7yZHv z7ID829btLU8qWuqP`)L{3oLYU(&Eiuf`ZkJstaWlUENP!Mq`GD(>J0s#wML1 zlb<%-VgTb^v^O+{8b$RaOD`;fSG1Re&WJwm!^(%l#fH!@xkA^y|{z=q)uFi`vx;lPlChAkZ`bTLDI}Mr+b# zbZw!I&{nd6;`>W@k)CJN`&Hv{;iv%9W0YWO8$D)3Sfe!hKQt;F21_suS%X$ZlH<)h!#^_gBnP0`(I_}1*E0If0Y z2&J$g78p|42a+yT#IB+eLYpC{nj9y_#;5aR)A@;MV`A))i6f7UjfedI@kHuzp7JpQ zi~u9R2rvSSfFuIfAM3>$!Amc#*;peW=7Gs22J_8Rs726kF&(QmZ!5L)TR$fBL%bZQbEB+}?)+x!2&_ zo1F+$q6(T89t4MnPpJi`^}53~d4Y!~4$ChSC@n*<|3CZx3-{!vU=;TMXa9fp|A#v~ z`~S25KLQat`Trkk;r}luQZL`|M2By{2rvSS03*N%FaiRB>qZjM0kgAfFT*LIi8eRy z*Dq~~#m&=OA`k$X0<0_24)l`y>NoTm@x zYah;Ud|2AMK30mqIph-%egMdlg)LO8BC3f$Q7@4jYJqY;g<0C_f&P^+lNWaTLq~$3 zjQEBk+E+_fFlub&v@kPYb>MmG9ia4 z{PVR;d-+-l|JoS=NCBS@Q}}O1s$;Q!kv+JUuD^Y{zow1+ZjSx+e1ENe1WJzl8~Fs3 zz6PHK&i~K(|Jnba^Z$#}6FC1ra<4Wr!m|HA=l>T65p?qZA8+CR_asvHG|g=I4@Q6y zU<4QeM&NCZ!1b2~5WoNW>*U1WdmdZ-Nb5(N{+?+qA+w)r7U^6&?4dWEs7J@!;S4lS z9CL=Gf0l>ren`=ur|;$K-@~py()`s=;>(B0`SbPf$!*muIU*n{zu5W5K}8}R09s=s z6F)rEMam)P3Xa_ps}poamxW`FaE6*V6;LjV-cGJ|n;gFanGKBcP1H z_31%40?f^=r$nH?BaXil1U@`;9mk)8R-5Dpza-uxa&K4iW+_ka<-_;nL;YiI|4TaJ zi?g0Py9vl1Oo-3nO!Dxcz^?HF%>SAHGyiA)&-|bHKlA@>=KteITKGSo|EE0V<1a7* zi~u9R2rvRb;QC}5UIH(^xb`Ae0D9#pa^UCd=ilWKksrWCApc6>`A**S^9_H_Ca?VF zyn&-e)0^E~_P2^AP$KHaNymk|sc%)5u*y+%Dix>Xzy;SwLiQWTBFOxo`9Jf2=Ksw9 zng28Y-){bYxP|{emPkFu(>O+e5nu!u0Y-okkVD}5<3rf@x2(12MK-`NN1oJ)d*Oa~ zzV_KXCDqFdcl?bNfyM$rtlfV3Yy`D%0JB&`j&_79gbDeO$j~#(%OV|MnF1M>Oc${N zqlRLrfovi}=Ksw9ng28YXa3LppZWiG^Z)4<{(mNsIwLpZ;ZHFFi~u9R2rvSSKpOEFPB}QQ$RzD3qq@Z zf^SAHGyiA)&-{P8`TtZ4|38&TooX|e;g=WzMt~7u1Q-EEKmvj54`&et zaN)w*1rY@x!>%oH6ko{v!=v~F@2?-lmk*EPyWmz$1IG!Ln-iYfjW~TVWi&1aI5-Kf z`GLD6T=BQf13)cYKrR%5^Z)Vre|-KQpZ~|_|MB^MeE#2dpZ_;L*~0(X|6gKq#~)z? z7y(9r5nu#r2wZ>vA5DK^wrN$ub4q3zfdx*)7|l zI)HHc?^Q_3w`7&e2)nmDaNxX!e1PVXZB_G2L3tSm@45M+Q}wK(Z(&paIny#O1r@Vu z8;e%e0&{L5?GfL5ampXQ9h7l`pE#zl>fyKn1onrg7jB$6h!Fpv=m)k4?^me%s1eUG z;R4bJVtvGzH{E$t9F)~%O0*nA7 zzz8q`Z({_mKXOax1aJoAUm^US!u>ZQ^(n|7Cjf+L_wr%dy?mHI7v2>~t7_f?NWXjoI3FGB4!^M{}BR!*TR_n ztl_3NXl;-lBUJAAW@B*MjZMpk!V#%!=?tu+359C_(@bdcR=Sk^z+Qx9xej znd=9rjv(@zQU;W)+KpRSeQVBv*x3r1|1U>2Uqq69 z8!`R$`?vD{*hIZKLtrcakG-s*)IO1ZAZ*|W5*(I{63$paOhv`P>4#Qj$#K(mwP=^@ zlE{D<_(s{BhkJ#Ab(rDdl2aDHSIk8msu-@j3=cn2BVK`T8MYhXefpSTSJSSwN9qKT7y&O?B9}tZE|;Zw0R5*{GXSgtJ5upDP9&|IhLN9RJVp{~Z6%@&962!Qe82)p&9fG{levhdQyl z;Nd;9f}zYu>fpdj`!v*Hpc}zreo(aMDWNXT3bv~w;rNEnhNlaSPK=FD=g08xa0~xG zkw~4`z8MeSnGs+F7y(9r5%`Kl;QFE4KbN18X;yc+)K55C`$gGX69x z^xhd9^E2U$Kys5(_!DQ#FQ#=R&3Egg3LjVfy?j+p~p71vyUGOZbX`BP5DW z1-=&!t~jj{3s!zQ{j7^D5IEUVR0*d}R`4tQBWn9tqDG>cVpj{>RxZ3b;6K6p|GfXt z`~STE&-?$|zW+bf!vD*OR5{+%h`+@MFanGKBftnS0-X`KzGDxT5l)_5J1CYBx@FME zX#qH|5C3cD_2t9!`ttSj`r@2QFlwlrB@jPGKz;3j`9JUf^Zq~Y|MUJo@Bj1u|90>H zPqy&?U5V7L&T|)jml0qD7y(9r5%>y6;QA}KrxSy(zrOZ5XnNd$_Ib*$m#^j5%NJ|; z^^o|#kza4K9{?f%!o+=XpEqhq=K7CM>f1RPbUbcQ#f5?SKl6X)|IGiH|1FpLw7&o!Z>0W5 zq5;nqN$bQ(eDy4V^^AfBG763woyoi7BWnR%xV_MI98TO04iK2HI`cR_ApR=CoNF5M zuC84=ur+evy!i6+slh=dwIK*uV>psd_XPR-Z{zB1hCPM z%xd*yeHAmn4aBK;xL_|oDC34jcm`ODSWz%N>5zdrWc-IK0Hr;|0zgIh7T`~K9*Dz+ z797{NakFmu3_AN8F#l)%&-|bHKl6X)|IGiloBxlu@c-8nsn_4$lQ?cYBftnS0*nA7 z@FhdwdSX8^4Zt5@94iNPAAK_@nQ*kPAS%GO&0yXZ`~P`*HD7;uqx2$mQUuE|_@HaO4!=3uP<>zUqK40Id&)0V9I|k}2rUFnR+HKD5 zYfd51ebax2G6vM#2QJxV2a6TtK!D>6igpQW4Pxbi1jAA#%l--)gL+1a&4Z0&d8?-j?z4!>_zmI5zd zJ4ZcVF@3nyOEPCeKH@-OBmZO=JWw*1Y~kb|Mi5*Ur^O?bplC0N8A?!I3UFGyHEJ~Z zBOu_w!`G~;u@sb-k=hXX0mQ-ZMc?uRcZ+0%O3M-=Vd5eJ9c+ID8461Vj-I#dz{45z zhCtGB({>eW3s_yi0rWVnzHGu}0eJ>}V|cjal*R8AbFqp8=gT(I7z__TQX^i0ZyB~5 z;C=d-VOP_xwd7ittg1+*h|}z=#m;F<|}=arg#2Qi6(SR*kAv95E~?oRF&N zr>jA=IBLvTRSR#19mMdQa#^^^1SQBNe66P9n<&IG+-IP}LOk>KJOqh^nCV$@9*1E< z6p(_Cg(%;~-HNv3T@DPh1m6~T#hA!<;a(2JM-b~Glo;MPCgr?v%@KMHdIotqUiy+< zv5>^mfwRnUbP%g9`M?dl5o6Icm$ANs)*jlb=!akSIn{{ zGKHGMY4N0{E{nT{H%6xz+3487f72hL!pp$FinN`mWYH+2O9$R)`dJrCdIBZtYUrB) z$+M7lv}Q!$Gen;Zo4J5q;~5npI`|n`)K5l@GiW&Ko@V~f{C`vDZS)q>d7*!0#Icpl zO3`sepES`kHjggQ*iqxTMvqU6HD;lX&{nI8M7HAlV&NHCYo zus3?lh_FU!^#4WlE@am&8{r|m=&z3Wa7~%%ov91(v3&HqhBXkw3Tlex+RK&;J0ylI^rv$e>pZ+?R$wlC3qy{V_GzfYKsRD6z&_Au zO%<`LsDv2b@Yym9pX-cHjEzs{$ENZVhnx6+y61ZmxhvW4%zSJ5!-MY}_^s5pBtNaa z4=?i1mk|PMkEK(Io}M?)6nZt;fKWqeTGg0U8FEukg_&pUgwf686jZsx)Y4Ge3Tq_A zZg#k(PPU8*8-`Z1Ht(h3Ih-q2M2Kx;3XH(mKxE#2CGdPlbos`dIP7ZE`HAUzSDRjc zVNeM0LrDlw65u#ze8-1c!6jJA$ygF9Lt2~TW*0N&+9n;BJ2K6Po_l5xQn2)b5Mej7 zmfKy}Y~)C9St7{$;ATlG0?5npqwfzI zDQHbSv_;d}800$7t>w}%L@o^jmZ^~pqmfHPMct|6Vc`m4F0k^xYgRoRgMsnh$7H}m z*2{{>hACzW3&hxMeCj64e2bAQuBA~*5Ms#Y{oHCQ)g;8uW;Ut~ldJuj(1x{QLF?vb zq|%eOnhbPUq;0l)og31?qRG<8>t_^*Ln~)`1rV!O3tG(iywZ3e6F;Ulort!nu$Jr* zZF<8jgu|Ph6|S!+Ni9n^ORdF*s8I#=5m-?5PAo!UzSqv~$J2wT944}0xPyuBPh|fj z^L6P919vBXqwk;h?eF>bcor(5G#;5ZeqiN~36;@uQ;|>M(PT%J%U3 zqdNsuZ=D8Iv6y6?N;H`=70s0%Komv_g(=3(GZ#t*R5Dt2tAS`6jEzJBuc-b^uiUXi z=+Ek)a#yP>PRr7YBteXJyJ+R6R`=gRb|4#9xuZ|%IABPPiX=M8q3kA(5K(w0*N^Me z_c6X|@{^DF^L`bp(A3#m#^rbeTX*uQK$K!@snKy|BhFx;WOlabbSfiORFMv^kLO5{ zrlCkm)loNN(sonAoVA-YHR)ZKS-kYfC8;fOq~B>O(3KI@wITM{ElXshIy1dKktLlu z0-aG;1K9_6>26&n;9UW1Gd^rV#^cCV#a_zx3k4e&)6A+(xSRT0vz?DB&D83pj8K|4 z?uXLIt%o(;ze|6X8@{{fj9T+!O}R;zBxewErY8#Z+(~}9TY-cq>2&+`R%(Lc%6$w? zYO!_Qls$_3*lYU*>?$=?@%Ye&w#wgf_S1NZ1u-6_2*zz}$?_X-2MiNHZVJO;Oc)RQs?S;2XQgNL& zZVowltm=x}#En#h(q*0~XGyl0d3|ZN_PUv>cvBonwYs4tiSe=ZeYXqMdTR)(wFQXX z7T07IJFWv=Ec>Fu3EQf0C!^Yi&c^O&oeZ?nqMKbiZv%=Zob z(ctG(pG(W)@Pa5Mm`nI2RMYL;tZ0*Gd z1q#sj~3NYSGyQ{eTp`uZ77iq>P)(74}UC08=lG9O@iqU5k8?Mmnwor_2Q?oYH#U^Xm zGWd4VrLGDhz2_h`ukL8&RC;r?$BnN)alcT7w=M{4is(Ot+*%ay+huT&ZeeV@w}qG$ z`mqW$l5smt5VdHGlq}Vj)H+IDvj0m`3CT#Cs0xj(y>=g2lM_%OwdTpr*JB64bZ5~D zc1K0?u*-*lVWWxV#GH?)tl)GqT1wQkPSd)P<0C6i+$)5?dI8&YF#u}5f7d1Urta6p zLbbOaQT?4*-+d36z#hdW$gShFM>6gjplqLSGuSD~KepA5O&U~0D>*4uGDcCw7+*2( z7K*X92Z|B9U9pjrZKOg{ooE}!&Kmt_;``CUPPU^-IL*UeZYS<6j4&@ z?&Du<^^_ktBN{S3v9dftJ!__rju%CsGAPRFN5`pFyrDbV@X1wsTr~WR2hecI4j%8> z-6gLyJB~rFB#C7Q)6&fKI}i6!tPicvj0vpYdLCG}pA0C4eROc$ibHrM;gKEiyHe67 zoI7JFmxv*TK~)&4;!lvO#YT!7%B3cfN}0%YBidX~Ggr5)&C}1Q4i(n!dsyhun+Kpn zF*~BtysM)X+CqstjZ?Df6Mu}_gzDCrOC-sq90`w#X=3H|Q5sK9i}9q!y_#hk&-b7c zw6RA{wGliz;fc0?d|k_n_Foe_1JWxq@*}vML8t@YG+l|aFf6-bq13aKhP!%GT69Q( z;KmseloTVX1&3Dd9uZowx(8a&WbT`1?1&MR&I@y6{!h_57S`VL5NYZl>R3m)Nnzpu zN8gckaHsT~6=Y^CiR6WyvO1`baB@@4PF6)p2RcWqNX{?gn*OM8C)WFhNw_aVxbe-S z$}C}vAyL7!Nt;V010p-_#xjr5Awh27Y@ScI7=@ds2ICa}-}9Y`++Ze1pBa39;GzCU z`m)-O;3fX~GC^Q{$GfPjzFNq1u)|90CDJ`f#av5ms>B&HI?l9XPW6>cgqo#Sn0m)xC# z#haerveYGOisY=!&FeUa*LNSIc}@=`r+~FwJyiz9juMfk zB(gXw>7eu~Q`=!uVYKgLQ)4Qn+~^y%sMBk=%+lm0fMT?vI&s*5;wP!BD}B@Q(T#DL!|TVMpmE@3h+3rs#-8x1Szw_`N_4PekCYxI z?5gFOB1b+B=@N&|i9>RnN)>y!3pkHUoS9OxJX@Tph?DT@V!2tiNLnrH500%5F+HE6 z7GrvK{&5;L_Ck$r`gB4?#XIj)*AZ(GRXj`GE=Q-rpx?#MF$(h3YUVKk@>&HTZ^M+K zW7knzn^NlJQieSW$K-m?qcloAUmv9;#~c+iC*K$4Ry$+|W$d!!n85I4Jsh8h^It{Y zzOucDvpnb&!1^&uF;!PZPvb1GZQ&T#E>=n2Ttsz%^8ck1-n%$su@ot$ zIh0xn?lk1aCZ0_Qbm1$iMq6d#92NE9)yvNaQNJ-Q43_dlTxwKTJI|?;06I=yq%CB- z@kx@^#aI}LVm`fc@o9ni+OC4Gl*d#>jXJ>?+w8YrAc?eaVr=cMcZ(LjDO%W6>(=hC zvf0tzxO8$KQJDmG-4!L-OU^#k%zaFICT}Ss5`u}}af15&tB_D^yB5oO%h?PS(Y0B@ zY_F*uGo;1t74gIumC51t2cHr$dFy`2L`{Rb(9D}3tg;2ZQbTOLAGh%HPIe-O-IXR+ zH?`wSQ$LkyRa8}`SD$!NsLJ{Us7gHji>DK9y4p5R)g_l@yYzr4gi~t|9H%krUaYvs z(Jv`o?=%dnm^dX`C#{6?BZx|5Ya1PD>f4AVX-Le`nMNcPZm(jYm3sO3%Gu|Imf&dLo$;wc zSIwy_ZPPkdciBoUphs1IY<2WG(Wv!tG)f(7=@GW0=1SV+Ix;Qu<@(D_fW=~D(E&RG z*!Ypv{tE)IHM6io@?4lsbDvoC?5aZwomg@>hyXD$vGR`d)E({y5HU2T%dre`$G2!j z$JcK?Cn|dFbyPGqxmB5@5*m^#BwNe@B-i1(YC>EXW9=ryQf6rrazj=ksupAG)>)wz zAG!-_aU+A1;v84KtEi}6hY?M2cHMNR&QztHZ-Ar%cN^HGwL@+K8cRb}=5i4|!+R|gLFJIURBcl3_pr5pWOd$uGb^JY-ERmn51 zoxs}1jBb0^lg)+Hu~*2M5h?bm(AQOLZN1+#&w``cGP!0Kg-EYG0FkO`yW~hKZJQ;> zf{ub|-)yxl)mSQ6e{d7Mh+z)9Ck~W#zlzHG(8|?$8e^V>th?BiW*gPKw57tG+v8%F zmrb~f8e*uZmT(yBqFFY5)52>N+xH#gG8{}{AmYwTqirv&K4*%yztMxX%R;E+S<+E2 zrA)yVT$j*OdAGb{>jW^AsT86eZ8deu$)6lM}c1mm0U2Ths zACOcBj0(1}y8JQ?m@^QpI&o4lrPAsU(<;WA&~@#lolNA7*x`xwN8d|!__VOYD(<9` z6LQ#E`H=ZoHWR50JR~|moRa61t%`^Y!k>s6n#WXcA@tjiDN8ABmK|l=_UtC>(1o0L z(t+4kTxoobc3k5Bxx@z&xgW|tJ@iESBLg2DIG*}&YJc)G$y3@w@9*?n$D7;tv#Ps7 zeb>Cg9;G#cSiN+M;aPSdlALy^^q8nXrdLm27Kp41L{zk^s|ivVgybeHk^wt0qF^F&)Kk(kp=+n<#M7g4K6JH8n)YO2H>{ay%)8byqRw2?x1Fj*r%Xu>yIsT* zef0F|vlX%%0iG>6?!`I!Gv-LF)XAjRFuIFR{*=5Zq*G3rq*;(gRH+k0A2_)(^*-^$ z)fqfd>0V0lUu`Ec3hN}%iXVFF6_Jf}QMKC9I~CU6Zwm;nJzcm>_Lw1Qb%{O6x|w>` zCB8aNpHvvxyV#XjTl8@k5~9+dT6y>qb$|k-FD=$i^J=wT)J@LO8c(hdERw!jLSN$u zPibWDCcZ5Oou>IzmkB}aP9jfZJBEs=tOdx-#tentabresb#Xzc!W;KO71YMN7*pi9 zovxi!Q=C=u5ZC$DG_Kbzxby8D}j;-F{7o{C|34 zCZT^U`@zg#WnLco?BJ&d_NIP2>Gyq3`>)!^dVVJH8s6UeXKJNKjQz8PJDTZgGi{3q zu`srJd?i6rH1X9~rn4QHQ%XFeqB{!at?dM>6O&M3Y!M_Uj;uZX0RiNj?*ouZhDW92 zE3{wAEXR^~Y^&F;=aVKVExRiWD@`zW=@%1+pZi)N%#|JpQ`S~QJ3>@TrdJcMiyN<9 zDD0Kr(^hDuf`ZgLNXvGoBsZ2sB?3WVY^CpO2-}wdf&BDRWmR295=YkU_ls(L=mAti zlB%n$!f%@i=%B}nj-avovBC_kyK_v;;XcmD9Lw4%8>NWKPaK|pO^nWS(6mkiQ1pw_ zYr|KClD>HmUyW6JsZpSlO38JN*s7$|O(bp3R;lbHEnD0P@znZ(D?(Ur>4n?F39*`6 zZ97uXZ7wN&Mu4mjrOISX+IY*#O~tM>>1-D^y~Ri;)i>fY@n~m061+;|-s4b@xOeSp zPNR=KymDY!Ja<*7rNZ<;dW&CabthWC>6Ju4xLiQ}RHPc$=0vM7wXXZ33fDYTLCGR@ z?Vn2EsBEol-)ImQSCus$IUC!|$eQQu61k40*Fd5gF{^tIyoLR|{0eZD?Aile4ocW$o zS8kGEv#v!XRv2I3wUQ;1@qRR_KE5=$n{9iA6RsK@=8Xi#oA0^zuHKmBBIz9`erF=wB?1>-jyM0`HN_I9NmvKps8t#ylAC@ z)1oL$tiH687AU+i1Qfa|r;>eA=_PZ66Z7}5@2Dx-unJy$YA(GDi* z<<)KAS20XcVT~`WBuNqOhOD|hN`4%OK4@&kU+EK1T6+{virq6+Iu!|ho8~ZEtd&LD zJ#l3H^ol0h{g#Jz%Oluz#X{By$_+az9Yn!c#g=mnE7uUoX7i*L4=Zik>z1%(6pcN> z>@f3)s?_1t zFYpf|zz8q`i~u9>m5IR0>6P7L4zTJK?o>%cECTSv`NTdwVfQM3)?E9X{rP#eUyjI11`R&P2m z8~HT9QXDqgtV3%TS8fr_y0#0=Ql~Lnu)J=jNkN^Y*2|SPh+{=@v^)5wn-)p0y~XYl z(IvB}hzo01S9B8blMr#Ibz52M+cCaFO6BWn)3gquuxQfR6sS0K#!z{=QD3S + + + + + + + + + + + + + + tests + + + + + + src + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 00000000..2776637c --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,66 @@ +# Use the front controller as index file. It serves as a fallback solution when +# every other rewrite/redirect fails (e.g. in an aliased environment without +# mod_rewrite). Additionally, this reduces the matching process for the +# start page (path "/") because otherwise Apache will apply the rewriting rules +# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). +DirectoryIndex index.php + +# By default, Apache does not evaluate symbolic links if you did not enable this +# feature in your server configuration. Uncomment the following line if you +# install assets as symlinks or if you experience problems related to symlinks +# when compiling LESS/Sass/CoffeScript assets. +# Options +FollowSymlinks + +# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve +# to the front controller "/index.php" but be rewritten to "/index.php/index". + + Options -MultiViews + + + + RewriteEngine On + + # Determine the RewriteBase automatically and set it as environment variable. + # If you are using Apache aliases to do mass virtual hosting or installed the + # project in a subdirectory, the base path will be prepended to allow proper + # resolution of the index.php file and to redirect to the correct URI. It will + # work in environments without path prefix as well, providing a safe, one-size + # fits all solution. But as you do not need it in this case, you can comment + # the following 2 lines to eliminate the overhead. + RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$ + RewriteRule .* - [E=BASE:%1] + + # Sets the HTTP_AUTHORIZATION header removed by Apache + RewriteCond %{HTTP:Authorization} .+ + RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] + + # Redirect to URI without front controller to prevent duplicate content + # (with and without `/index.php`). Only do this redirect on the initial + # rewrite by Apache and not on subsequent cycles. Otherwise we would get an + # endless redirect loop (request -> rewrite to front controller -> + # redirect -> request -> ...). + # So in case you get a "too many redirects" error or you always get redirected + # to the start page because your Apache does not expose the REDIRECT_STATUS + # environment variable, you have 2 choices: + # - disable this feature by commenting the following 2 lines or + # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the + # following RewriteCond (best solution) + RewriteCond %{ENV:REDIRECT_STATUS} ="" + RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] + + # If the requested filename exists, simply serve it. + # We only want to let Apache serve files and not directories. + # Rewrite all other queries to the front controller. + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ %{ENV:BASE}/index.php [L] + + + + + # When mod_rewrite is not available, we instruct a temporary redirect of + # the start page to the front controller explicitly so that the website + # and the generated links can still be used. + RedirectMatch 307 ^/$ /index.php/ + # RedirectTemp cannot be used instead + + diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..11f17e6d89ee3b416218ede42b66ec1dd81507f2 GIT binary patch literal 10784 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 literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php new file mode 100644 index 00000000..3f8b90e5 --- /dev/null +++ b/public/index.php @@ -0,0 +1,30 @@ +bootEnv(dirname(__DIR__).'/.env'); + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + Debug::enable(); +} + +if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { + Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); +} + +if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) { + Request::setTrustedHosts([$trustedHosts]); +} + +$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); +$request = Request::createFromGlobals(); +$response = $kernel->handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 00000000..214e4119 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +# www.robotstxt.org/ +# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 + +User-agent: * diff --git a/src/Command/AddUserCommand.php b/src/Command/AddUserCommand.php new file mode 100644 index 00000000..4e13b7cd --- /dev/null +++ b/src/Command/AddUserCommand.php @@ -0,0 +1,263 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Command; + +use App\Entity\User; +use App\Repository\UserRepository; +use App\Utils\Validator; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; +use Symfony\Component\Stopwatch\Stopwatch; +use function Symfony\Component\String\u; + +/** + * A console command that creates users and stores them in the database. + * + * To use this command, open a terminal window, enter into your project + * directory and execute the following: + * + * $ php bin/console app:add-user + * + * To output detailed information, increase the command verbosity: + * + * $ php bin/console app:add-user -vv + * + * See https://symfony.com/doc/current/console.html + * + * We use the default services.yaml configuration, so command classes are registered as services. + * See https://symfony.com/doc/current/console/commands_as_services.html + * + * @author Javier Eguiluz + * @author Yonel Ceruto + */ +class AddUserCommand extends Command +{ + // to make your command lazily loaded, configure the $defaultName static property, + // so it will be instantiated only when the command is actually called. + protected static $defaultName = 'app:add-user'; + + /** + * @var SymfonyStyle + */ + private $io; + + private $entityManager; + private $passwordEncoder; + private $validator; + private $users; + + public function __construct(EntityManagerInterface $em, UserPasswordEncoderInterface $encoder, Validator $validator, UserRepository $users) + { + parent::__construct(); + + $this->entityManager = $em; + $this->passwordEncoder = $encoder; + $this->validator = $validator; + $this->users = $users; + } + + /** + * {@inheritdoc} + */ + protected function configure(): void + { + $this + ->setDescription('Creates users and stores them in the database') + ->setHelp($this->getCommandHelp()) + // commands can optionally define arguments and/or options (mandatory and optional) + // see https://symfony.com/doc/current/components/console/console_arguments.html + ->addArgument('username', InputArgument::OPTIONAL, 'The username of the new user') + ->addArgument('password', InputArgument::OPTIONAL, 'The plain password of the new user') + ->addArgument('email', InputArgument::OPTIONAL, 'The email of the new user') + ->addArgument('full-name', InputArgument::OPTIONAL, 'The full name of the new user') + ->addOption('admin', null, InputOption::VALUE_NONE, 'If set, the user is created as an administrator') + ; + } + + /** + * This optional method is the first one executed for a command after configure() + * and is useful to initialize properties based on the input arguments and options. + */ + protected function initialize(InputInterface $input, OutputInterface $output): void + { + // SymfonyStyle is an optional feature that Symfony provides so you can + // apply a consistent look to the commands of your application. + // See https://symfony.com/doc/current/console/style.html + $this->io = new SymfonyStyle($input, $output); + } + + /** + * This method is executed after initialize() and before execute(). Its purpose + * is to check if some of the options/arguments are missing and interactively + * ask the user for those values. + * + * This method is completely optional. If you are developing an internal console + * command, you probably should not implement this method because it requires + * quite a lot of work. However, if the command is meant to be used by external + * users, this method is a nice way to fall back and prevent errors. + */ + protected function interact(InputInterface $input, OutputInterface $output) + { + if (null !== $input->getArgument('username') && null !== $input->getArgument('password') && null !== $input->getArgument('email') && null !== $input->getArgument('full-name')) { + return; + } + + $this->io->title('Add User Command Interactive Wizard'); + $this->io->text([ + 'If you prefer to not use this interactive wizard, provide the', + 'arguments required by this command as follows:', + '', + ' $ php bin/console app:add-user username password email@example.com', + '', + 'Now we\'ll ask you for the value of all the missing command arguments.', + ]); + + // Ask for the username if it's not defined + $username = $input->getArgument('username'); + if (null !== $username) { + $this->io->text(' > Username: '.$username); + } else { + $username = $this->io->ask('Username', null, [$this->validator, 'validateUsername']); + $input->setArgument('username', $username); + } + + // Ask for the password if it's not defined + $password = $input->getArgument('password'); + if (null !== $password) { + $this->io->text(' > Password: '.u('*')->repeat(u($password)->length())); + } else { + $password = $this->io->askHidden('Password (your type will be hidden)', [$this->validator, 'validatePassword']); + $input->setArgument('password', $password); + } + + // Ask for the email if it's not defined + $email = $input->getArgument('email'); + if (null !== $email) { + $this->io->text(' > Email: '.$email); + } else { + $email = $this->io->ask('Email', null, [$this->validator, 'validateEmail']); + $input->setArgument('email', $email); + } + + // Ask for the full name if it's not defined + $fullName = $input->getArgument('full-name'); + if (null !== $fullName) { + $this->io->text(' > Full Name: '.$fullName); + } else { + $fullName = $this->io->ask('Full Name', null, [$this->validator, 'validateFullName']); + $input->setArgument('full-name', $fullName); + } + } + + /** + * This method is executed after interact() and initialize(). It usually + * contains the logic to execute to complete this command task. + */ + protected function execute(InputInterface $input, OutputInterface $output): int + { + $stopwatch = new Stopwatch(); + $stopwatch->start('add-user-command'); + + $username = $input->getArgument('username'); + $plainPassword = $input->getArgument('password'); + $email = $input->getArgument('email'); + $fullName = $input->getArgument('full-name'); + $isAdmin = $input->getOption('admin'); + + // make sure to validate the user data is correct + $this->validateUserData($username, $plainPassword, $email, $fullName); + + // create the user and encode its password + $user = new User(); + $user->setFullName($fullName); + $user->setUsername($username); + $user->setEmail($email); + $user->setRoles([$isAdmin ? 'ROLE_ADMIN' : 'ROLE_USER']); + + // See https://symfony.com/doc/current/security.html#c-encoding-passwords + $encodedPassword = $this->passwordEncoder->encodePassword($user, $plainPassword); + $user->setPassword($encodedPassword); + + $this->entityManager->persist($user); + $this->entityManager->flush(); + + $this->io->success(sprintf('%s was successfully created: %s (%s)', $isAdmin ? 'Administrator user' : 'User', $user->getUsername(), $user->getEmail())); + + $event = $stopwatch->stop('add-user-command'); + if ($output->isVerbose()) { + $this->io->comment(sprintf('New user database id: %d / Elapsed time: %.2f ms / Consumed memory: %.2f MB', $user->getId(), $event->getDuration(), $event->getMemory() / (1024 ** 2))); + } + + return 0; + } + + private function validateUserData($username, $plainPassword, $email, $fullName): void + { + // first check if a user with the same username already exists. + $existingUser = $this->users->findOneBy(['username' => $username]); + + if (null !== $existingUser) { + throw new RuntimeException(sprintf('There is already a user registered with the "%s" username.', $username)); + } + + // validate password and email if is not this input means interactive. + $this->validator->validatePassword($plainPassword); + $this->validator->validateEmail($email); + $this->validator->validateFullName($fullName); + + // check if a user with the same email already exists. + $existingEmail = $this->users->findOneBy(['email' => $email]); + + if (null !== $existingEmail) { + throw new RuntimeException(sprintf('There is already a user registered with the "%s" email.', $email)); + } + } + + /** + * The command help is usually included in the configure() method, but when + * it's too long, it's better to define a separate method to maintain the + * code readability. + */ + private function getCommandHelp(): string + { + return <<<'HELP' +The %command.name% command creates new users and saves them in the database: + + php %command.full_name% username password email + +By default the command creates regular users. To create administrator users, +add the --admin option: + + php %command.full_name% username password email --admin + +If you omit any of the three required arguments, the command will ask you to +provide the missing values: + + # command will ask you for the email + php %command.full_name% username password + + # command will ask you for the email and password + php %command.full_name% username + + # command will ask you for all arguments + php %command.full_name% + +HELP; + } +} diff --git a/src/Command/DeleteUserCommand.php b/src/Command/DeleteUserCommand.php new file mode 100644 index 00000000..20dd2e10 --- /dev/null +++ b/src/Command/DeleteUserCommand.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Command; + +use App\Entity\User; +use App\Repository\UserRepository; +use App\Utils\Validator; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; + +/** + * A console command that deletes users from the database. + * + * To use this command, open a terminal window, enter into your project + * directory and execute the following: + * + * $ php bin/console app:delete-user + * + * Check out the code of the src/Command/AddUserCommand.php file for + * the full explanation about Symfony commands. + * + * See https://symfony.com/doc/current/console.html + * + * @author Oleg Voronkovich + */ +class DeleteUserCommand extends Command +{ + protected static $defaultName = 'app:delete-user'; + + /** @var SymfonyStyle */ + private $io; + private $entityManager; + private $validator; + private $users; + + public function __construct(EntityManagerInterface $em, Validator $validator, UserRepository $users) + { + parent::__construct(); + + $this->entityManager = $em; + $this->validator = $validator; + $this->users = $users; + } + + /** + * {@inheritdoc} + */ + protected function configure(): void + { + $this + ->setDescription('Deletes users from the database') + ->addArgument('username', InputArgument::REQUIRED, 'The username of an existing user') + ->setHelp(<<<'HELP' +The %command.name% command deletes users from the database: + + php %command.full_name% username + +If you omit the argument, the command will ask you to +provide the missing value: + + php %command.full_name% +HELP + ); + } + + protected function initialize(InputInterface $input, OutputInterface $output): void + { + // SymfonyStyle is an optional feature that Symfony provides so you can + // apply a consistent look to the commands of your application. + // See https://symfony.com/doc/current/console/style.html + $this->io = new SymfonyStyle($input, $output); + } + + protected function interact(InputInterface $input, OutputInterface $output) + { + if (null !== $input->getArgument('username')) { + return; + } + + $this->io->title('Delete User Command Interactive Wizard'); + $this->io->text([ + 'If you prefer to not use this interactive wizard, provide the', + 'arguments required by this command as follows:', + '', + ' $ php bin/console app:delete-user username', + '', + 'Now we\'ll ask you for the value of all the missing command arguments.', + '', + ]); + + $username = $this->io->ask('Username', null, [$this->validator, 'validateUsername']); + $input->setArgument('username', $username); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $username = $this->validator->validateUsername($input->getArgument('username')); + + /** @var User $user */ + $user = $this->users->findOneByUsername($username); + + if (null === $user) { + throw new RuntimeException(sprintf('User with username "%s" not found.', $username)); + } + + // After an entity has been removed its in-memory state is the same + // as before the removal, except for generated identifiers. + // See https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#removing-entities + $userId = $user->getId(); + + $this->entityManager->remove($user); + $this->entityManager->flush(); + + $this->io->success(sprintf('User "%s" (ID: %d, email: %s) was successfully deleted.', $user->getUsername(), $userId, $user->getEmail())); + + return 0; + } +} diff --git a/src/Command/ListUsersCommand.php b/src/Command/ListUsersCommand.php new file mode 100644 index 00000000..31703baf --- /dev/null +++ b/src/Command/ListUsersCommand.php @@ -0,0 +1,146 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Command; + +use App\Entity\User; +use App\Repository\UserRepository; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\BufferedOutput; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\Email; + +/** + * A console command that lists all the existing users. + * + * To use this command, open a terminal window, enter into your project directory + * and execute the following: + * + * $ php bin/console app:list-users + * + * Check out the code of the src/Command/AddUserCommand.php file for + * the full explanation about Symfony commands. + * + * See https://symfony.com/doc/current/console.html + * + * @author Javier Eguiluz + */ +class ListUsersCommand extends Command +{ + // a good practice is to use the 'app:' prefix to group all your custom application commands + protected static $defaultName = 'app:list-users'; + + private $mailer; + private $emailSender; + private $users; + + public function __construct(MailerInterface $mailer, $emailSender, UserRepository $users) + { + parent::__construct(); + + $this->mailer = $mailer; + $this->emailSender = $emailSender; + $this->users = $users; + } + + /** + * {@inheritdoc} + */ + protected function configure(): void + { + $this + ->setDescription('Lists all the existing users') + ->setHelp(<<<'HELP' +The %command.name% command lists all the users registered in the application: + + php %command.full_name% + +By default the command only displays the 50 most recent users. Set the number of +results to display with the --max-results option: + + php %command.full_name% --max-results=2000 + +In addition to displaying the user list, you can also send this information to +the email address specified in the --send-to option: + + php %command.full_name% --send-to=fabien@symfony.com + +HELP + ) + // commands can optionally define arguments and/or options (mandatory and optional) + // see https://symfony.com/doc/current/components/console/console_arguments.html + ->addOption('max-results', null, InputOption::VALUE_OPTIONAL, 'Limits the number of users listed', 50) + ->addOption('send-to', null, InputOption::VALUE_OPTIONAL, 'If set, the result is sent to the given email address') + ; + } + + /** + * This method is executed after initialize(). It usually contains the logic + * to execute to complete this command task. + */ + protected function execute(InputInterface $input, OutputInterface $output): int + { + $maxResults = $input->getOption('max-results'); + // Use ->findBy() instead of ->findAll() to allow result sorting and limiting + $allUsers = $this->users->findBy([], ['id' => 'DESC'], $maxResults); + + // Doctrine query returns an array of objects and we need an array of plain arrays + $usersAsPlainArrays = array_map(function (User $user) { + return [ + $user->getId(), + $user->getFullName(), + $user->getUsername(), + $user->getEmail(), + implode(', ', $user->getRoles()), + ]; + }, $allUsers); + + // In your console commands you should always use the regular output type, + // which outputs contents directly in the console window. However, this + // command uses the BufferedOutput type instead, to be able to get the output + // contents before displaying them. This is needed because the command allows + // to send the list of users via email with the '--send-to' option + $bufferedOutput = new BufferedOutput(); + $io = new SymfonyStyle($input, $bufferedOutput); + $io->table( + ['ID', 'Full Name', 'Username', 'Email', 'Roles'], + $usersAsPlainArrays + ); + + // instead of just displaying the table of users, store its contents in a variable + $usersAsATable = $bufferedOutput->fetch(); + $output->write($usersAsATable); + + if (null !== $email = $input->getOption('send-to')) { + $this->sendReport($usersAsATable, $email); + } + + return 0; + } + + /** + * Sends the given $contents to the $recipient email address. + */ + private function sendReport(string $contents, string $recipient): void + { + $email = (new Email()) + ->from($this->emailSender) + ->to($recipient) + ->subject(sprintf('app:list-users report (%s)', date('Y-m-d H:i:s'))) + ->text($contents); + + $this->mailer->send($email); + } +} diff --git a/src/Controller/Admin/BlogController.php b/src/Controller/Admin/BlogController.php new file mode 100644 index 00000000..8454154e --- /dev/null +++ b/src/Controller/Admin/BlogController.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller\Admin; + +use App\Entity\Post; +use App\Form\PostType; +use App\Repository\PostRepository; +use App\Security\PostVoter; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\Extension\Core\Type\SubmitType; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Annotation\Route; + +/** + * Controller used to manage blog contents in the backend. + * + * Please note that the application backend is developed manually for learning + * purposes. However, in your real Symfony application you should use any of the + * existing bundles that let you generate ready-to-use backends without effort. + * + * See http://knpbundles.com/keyword/admin + * + * @Route("/admin/post") + * @IsGranted("ROLE_ADMIN") + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class BlogController extends AbstractController +{ + /** + * Lists all Post entities. + * + * This controller responds to two different routes with the same URL: + * * 'admin_post_index' is the route with a name that follows the same + * structure as the rest of the controllers of this class. + * * 'admin_index' is a nice shortcut to the backend homepage. This allows + * to create simpler links in the templates. Moreover, in the future we + * could move this annotation to any other controller while maintaining + * the route name and therefore, without breaking any existing link. + * + * @Route("/", methods="GET", name="admin_index") + * @Route("/", methods="GET", name="admin_post_index") + */ + public function index(PostRepository $posts): Response + { + $authorPosts = $posts->findBy(['author' => $this->getUser()], ['publishedAt' => 'DESC']); + + return $this->render('admin/blog/index.html.twig', ['posts' => $authorPosts]); + } + + /** + * Creates a new Post entity. + * + * @Route("/new", methods="GET|POST", name="admin_post_new") + * + * NOTE: the Method annotation is optional, but it's a recommended practice + * to constraint the HTTP methods each controller responds to (by default + * it responds to all methods). + */ + public function new(Request $request): Response + { + $post = new Post(); + $post->setAuthor($this->getUser()); + + // See https://symfony.com/doc/current/form/multiple_buttons.html + $form = $this->createForm(PostType::class, $post) + ->add('saveAndCreateNew', SubmitType::class); + + $form->handleRequest($request); + + // the isSubmitted() method is completely optional because the other + // isValid() method already checks whether the form is submitted. + // However, we explicitly add it to improve code readability. + // See https://symfony.com/doc/current/forms.html#processing-forms + if ($form->isSubmitted() && $form->isValid()) { + $em = $this->getDoctrine()->getManager(); + $em->persist($post); + $em->flush(); + + // Flash messages are used to notify the user about the result of the + // actions. They are deleted automatically from the session as soon + // as they are accessed. + // See https://symfony.com/doc/current/controller.html#flash-messages + $this->addFlash('success', 'post.created_successfully'); + + if ($form->get('saveAndCreateNew')->isClicked()) { + return $this->redirectToRoute('admin_post_new'); + } + + return $this->redirectToRoute('admin_post_index'); + } + + return $this->render('admin/blog/new.html.twig', [ + 'post' => $post, + 'form' => $form->createView(), + ]); + } + + /** + * Finds and displays a Post entity. + * + * @Route("/{id<\d+>}", methods="GET", name="admin_post_show") + */ + public function show(Post $post): Response + { + // This security check can also be performed + // using an annotation: @IsGranted("show", subject="post", message="Posts can only be shown to their authors.") + $this->denyAccessUnlessGranted(PostVoter::SHOW, $post, 'Posts can only be shown to their authors.'); + + return $this->render('admin/blog/show.html.twig', [ + 'post' => $post, + ]); + } + + /** + * Displays a form to edit an existing Post entity. + * + * @Route("/{id<\d+>}/edit", methods="GET|POST", name="admin_post_edit") + * @IsGranted("edit", subject="post", message="Posts can only be edited by their authors.") + */ + public function edit(Request $request, Post $post): Response + { + $form = $this->createForm(PostType::class, $post); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $this->getDoctrine()->getManager()->flush(); + + $this->addFlash('success', 'post.updated_successfully'); + + return $this->redirectToRoute('admin_post_edit', ['id' => $post->getId()]); + } + + return $this->render('admin/blog/edit.html.twig', [ + 'post' => $post, + 'form' => $form->createView(), + ]); + } + + /** + * Deletes a Post entity. + * + * @Route("/{id}/delete", methods="POST", name="admin_post_delete") + * @IsGranted("delete", subject="post") + */ + public function delete(Request $request, Post $post): Response + { + if (!$this->isCsrfTokenValid('delete', $request->request->get('token'))) { + return $this->redirectToRoute('admin_post_index'); + } + + // Delete the tags associated with this blog post. This is done automatically + // by Doctrine, except for SQLite (the database used in this application) + // because foreign key support is not enabled by default in SQLite + $post->getTags()->clear(); + + $em = $this->getDoctrine()->getManager(); + $em->remove($post); + $em->flush(); + + $this->addFlash('success', 'post.deleted_successfully'); + + return $this->redirectToRoute('admin_post_index'); + } +} diff --git a/src/Controller/BlogController.php b/src/Controller/BlogController.php new file mode 100644 index 00000000..3247b1b0 --- /dev/null +++ b/src/Controller/BlogController.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller; + +use App\Entity\Comment; +use App\Entity\Post; +use App\Events\CommentCreatedEvent; +use App\Form\CommentType; +use App\Repository\PostRepository; +use App\Repository\TagRepository; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Annotation\Route; + +/** + * Controller used to manage blog contents in the public part of the site. + * + * @Route("/blog") + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class BlogController extends AbstractController +{ + /** + * @Route("/", defaults={"page": "1", "_format"="html"}, methods="GET", name="blog_index") + * @Route("/rss.xml", defaults={"page": "1", "_format"="xml"}, methods="GET", name="blog_rss") + * @Route("/page/{page<[1-9]\d*>}", defaults={"_format"="html"}, methods="GET", name="blog_index_paginated") + * @Cache(smaxage="10") + * + * NOTE: For standard formats, Symfony will also automatically choose the best + * Content-Type header for the response. + * See https://symfony.com/doc/current/routing.html#special-parameters + */ + public function index(Request $request, int $page, string $_format, PostRepository $posts, TagRepository $tags): Response + { + $tag = null; + if ($request->query->has('tag')) { + $tag = $tags->findOneBy(['name' => $request->query->get('tag')]); + } + $latestPosts = $posts->findLatest($page, $tag); + + // Every template name also has two extensions that specify the format and + // engine for that template. + // See https://symfony.com/doc/current/templates.html#template-naming + return $this->render('blog/index.'.$_format.'.twig', [ + 'paginator' => $latestPosts, + ]); + } + + /** + * @Route("/posts/{slug}", methods="GET", name="blog_post") + * + * NOTE: The $post controller argument is automatically injected by Symfony + * after performing a database query looking for a Post with the 'slug' + * value given in the route. + * See https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html + */ + public function postShow(Post $post): Response + { + // Symfony's 'dump()' function is an improved version of PHP's 'var_dump()' but + // it's not available in the 'prod' environment to prevent leaking sensitive information. + // It can be used both in PHP files and Twig templates, but it requires to + // have enabled the DebugBundle. Uncomment the following line to see it in action: + // + // dump($post, $this->getUser(), new \DateTime()); + + return $this->render('blog/post_show.html.twig', ['post' => $post]); + } + + /** + * @Route("/comment/{postSlug}/new", methods="POST", name="comment_new") + * @IsGranted("IS_AUTHENTICATED_FULLY") + * @ParamConverter("post", options={"mapping": {"postSlug": "slug"}}) + * + * NOTE: The ParamConverter mapping is required because the route parameter + * (postSlug) doesn't match any of the Doctrine entity properties (slug). + * See https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html#doctrine-converter + */ + public function commentNew(Request $request, Post $post, EventDispatcherInterface $eventDispatcher): Response + { + $comment = new Comment(); + $comment->setAuthor($this->getUser()); + $post->addComment($comment); + + $form = $this->createForm(CommentType::class, $comment); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $em = $this->getDoctrine()->getManager(); + $em->persist($comment); + $em->flush(); + + // When an event is dispatched, Symfony notifies it to all the listeners + // and subscribers registered to it. Listeners can modify the information + // passed in the event and they can even modify the execution flow, so + // there's no guarantee that the rest of this controller will be executed. + // See https://symfony.com/doc/current/components/event_dispatcher.html + $eventDispatcher->dispatch(new CommentCreatedEvent($comment)); + + return $this->redirectToRoute('blog_post', ['slug' => $post->getSlug()]); + } + + return $this->render('blog/comment_form_error.html.twig', [ + 'post' => $post, + 'form' => $form->createView(), + ]); + } + + /** + * This controller is called directly via the render() function in the + * blog/post_show.html.twig template. That's why it's not needed to define + * a route name for it. + * + * The "id" of the Post is passed in and then turned into a Post object + * automatically by the ParamConverter. + */ + public function commentForm(Post $post): Response + { + $form = $this->createForm(CommentType::class); + + return $this->render('blog/_comment_form.html.twig', [ + 'post' => $post, + 'form' => $form->createView(), + ]); + } + + /** + * @Route("/search", methods="GET", name="blog_search") + */ + public function search(Request $request, PostRepository $posts): Response + { + if (!$request->isXmlHttpRequest()) { + return $this->render('blog/search.html.twig'); + } + + $query = $request->query->get('q', ''); + $limit = $request->query->get('l', 10); + $foundPosts = $posts->findBySearchQuery($query, $limit); + + $results = []; + foreach ($foundPosts as $post) { + $results[] = [ + 'title' => htmlspecialchars($post->getTitle(), ENT_COMPAT | ENT_HTML5), + 'date' => $post->getPublishedAt()->format('M d, Y'), + 'author' => htmlspecialchars($post->getAuthor()->getFullName(), ENT_COMPAT | ENT_HTML5), + 'summary' => htmlspecialchars($post->getSummary(), ENT_COMPAT | ENT_HTML5), + 'url' => $this->generateUrl('blog_post', ['slug' => $post->getSlug()]), + ]; + } + + return $this->json($results); + } +} diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php new file mode 100644 index 00000000..128e92a1 --- /dev/null +++ b/src/Controller/SecurityController.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller; + +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Security\Core\Security; +use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; +use Symfony\Component\Security\Http\Util\TargetPathTrait; + +/** + * Controller used to manage the application security. + * See https://symfony.com/doc/current/security/form_login_setup.html. + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class SecurityController extends AbstractController +{ + use TargetPathTrait; + + /** + * @Route("/login", name="security_login") + */ + public function login(Request $request, Security $security, AuthenticationUtils $helper): Response + { + // if user is already logged in, don't display the login page again + if ($security->isGranted('ROLE_USER')) { + return $this->redirectToRoute('blog_index'); + } + + // this statement solves an edge-case: if you change the locale in the login + // page, after a successful login you are redirected to a page in the previous + // locale. This code regenerates the referrer URL whenever the login page is + // browsed, to ensure that its locale is always the current one. + $this->saveTargetPath($request->getSession(), 'main', $this->generateUrl('admin_index')); + + return $this->render('security/login.html.twig', [ + // last username entered by the user (if any) + 'last_username' => $helper->getLastUsername(), + // last authentication error (if any) + 'error' => $helper->getLastAuthenticationError(), + ]); + } + + /** + * This is the route the user can use to logout. + * + * But, this will never be executed. Symfony will intercept this first + * and handle the logout automatically. See logout in config/packages/security.yaml + * + * @Route("/logout", name="security_logout") + */ + public function logout(): void + { + throw new \Exception('This should never be reached!'); + } +} diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php new file mode 100644 index 00000000..0de4cd18 --- /dev/null +++ b/src/Controller/UserController.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller; + +use App\Form\Type\ChangePasswordType; +use App\Form\UserType; +use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; + +/** + * Controller used to manage current user. + * + * @Route("/profile") + * @IsGranted("ROLE_USER") + * + * @author Romain Monteil + */ +class UserController extends AbstractController +{ + /** + * @Route("/edit", methods="GET|POST", name="user_edit") + */ + public function edit(Request $request): Response + { + $user = $this->getUser(); + + $form = $this->createForm(UserType::class, $user); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $this->getDoctrine()->getManager()->flush(); + + $this->addFlash('success', 'user.updated_successfully'); + + return $this->redirectToRoute('user_edit'); + } + + return $this->render('user/edit.html.twig', [ + 'user' => $user, + 'form' => $form->createView(), + ]); + } + + /** + * @Route("/change-password", methods="GET|POST", name="user_change_password") + */ + public function changePassword(Request $request, UserPasswordEncoderInterface $encoder): Response + { + $user = $this->getUser(); + + $form = $this->createForm(ChangePasswordType::class); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $user->setPassword($encoder->encodePassword($user, $form->get('newPassword')->getData())); + + $this->getDoctrine()->getManager()->flush(); + + return $this->redirectToRoute('security_logout'); + } + + return $this->render('user/change_password.html.twig', [ + 'form' => $form->createView(), + ]); + } +} diff --git a/src/DataFixtures/AppFixtures.php b/src/DataFixtures/AppFixtures.php new file mode 100644 index 00000000..786d9fe9 --- /dev/null +++ b/src/DataFixtures/AppFixtures.php @@ -0,0 +1,241 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\DataFixtures; + +use App\Entity\Comment; +use App\Entity\Post; +use App\Entity\Tag; +use App\Entity\User; +use Doctrine\Bundle\FixturesBundle\Fixture; +use Doctrine\Common\Persistence\ObjectManager; +use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; +use Symfony\Component\String\Slugger\SluggerInterface; +use function Symfony\Component\String\u; + +class AppFixtures extends Fixture +{ + private $passwordEncoder; + private $slugger; + + public function __construct(UserPasswordEncoderInterface $passwordEncoder, SluggerInterface $slugger) + { + $this->passwordEncoder = $passwordEncoder; + $this->slugger = $slugger; + } + + public function load(ObjectManager $manager): void + { + $this->loadUsers($manager); + $this->loadTags($manager); + $this->loadPosts($manager); + } + + private function loadUsers(ObjectManager $manager): void + { + foreach ($this->getUserData() as [$fullname, $username, $password, $email, $roles]) { + $user = new User(); + $user->setFullName($fullname); + $user->setUsername($username); + $user->setPassword($this->passwordEncoder->encodePassword($user, $password)); + $user->setEmail($email); + $user->setRoles($roles); + + $manager->persist($user); + $this->addReference($username, $user); + } + + $manager->flush(); + } + + private function loadTags(ObjectManager $manager): void + { + foreach ($this->getTagData() as $index => $name) { + $tag = new Tag(); + $tag->setName($name); + + $manager->persist($tag); + $this->addReference('tag-'.$name, $tag); + } + + $manager->flush(); + } + + private function loadPosts(ObjectManager $manager): void + { + foreach ($this->getPostData() as [$title, $slug, $summary, $content, $publishedAt, $author, $tags]) { + $post = new Post(); + $post->setTitle($title); + $post->setSlug($slug); + $post->setSummary($summary); + $post->setContent($content); + $post->setPublishedAt($publishedAt); + $post->setAuthor($author); + $post->addTag(...$tags); + + foreach (range(1, 5) as $i) { + $comment = new Comment(); + $comment->setAuthor($this->getReference('john_user')); + $comment->setContent($this->getRandomText(random_int(255, 512))); + $comment->setPublishedAt(new \DateTime('now + '.$i.'seconds')); + + $post->addComment($comment); + } + + $manager->persist($post); + } + + $manager->flush(); + } + + private function getUserData(): array + { + return [ + // $userData = [$fullname, $username, $password, $email, $roles]; + ['Jane Doe', 'jane_admin', 'kitten', 'jane_admin@symfony.com', ['ROLE_ADMIN']], + ['Tom Doe', 'tom_admin', 'kitten', 'tom_admin@symfony.com', ['ROLE_ADMIN']], + ['John Doe', 'john_user', 'kitten', 'john_user@symfony.com', ['ROLE_USER']], + ]; + } + + private function getTagData(): array + { + return [ + 'lorem', + 'ipsum', + 'consectetur', + 'adipiscing', + 'incididunt', + 'labore', + 'voluptate', + 'dolore', + 'pariatur', + ]; + } + + private function getPostData() + { + $posts = []; + foreach ($this->getPhrases() as $i => $title) { + // $postData = [$title, $slug, $summary, $content, $publishedAt, $author, $tags, $comments]; + $posts[] = [ + $title, + $this->slugger->slug($title)->lower(), + $this->getRandomText(), + $this->getPostContent(), + new \DateTime('now - '.$i.'days'), + // Ensure that the first post is written by Jane Doe to simplify tests + $this->getReference(['jane_admin', 'tom_admin'][0 === $i ? 0 : random_int(0, 1)]), + $this->getRandomTags(), + ]; + } + + return $posts; + } + + private function getPhrases(): array + { + return [ + 'Lorem ipsum dolor sit amet consectetur adipiscing elit', + 'Pellentesque vitae velit ex', + 'Mauris dapibus risus quis suscipit vulputate', + 'Eros diam egestas libero eu vulputate risus', + 'In hac habitasse platea dictumst', + 'Morbi tempus commodo mattis', + 'Ut suscipit posuere justo at vulputate', + 'Ut eleifend mauris et risus ultrices egestas', + 'Aliquam sodales odio id eleifend tristique', + 'Urna nisl sollicitudin id varius orci quam id turpis', + 'Nulla porta lobortis ligula vel egestas', + 'Curabitur aliquam euismod dolor non ornare', + 'Sed varius a risus eget aliquam', + 'Nunc viverra elit ac laoreet suscipit', + 'Pellentesque et sapien pulvinar consectetur', + 'Ubi est barbatus nix', + 'Abnobas sunt hilotaes de placidus vita', + 'Ubi est audax amicitia', + 'Eposs sunt solems de superbus fortis', + 'Vae humani generis', + 'Diatrias tolerare tanquam noster caesium', + 'Teres talis saepe tractare de camerarius flavum sensorem', + 'Silva de secundus galatae demitto quadra', + 'Sunt accentores vitare salvus flavum parses', + 'Potus sensim ad ferox abnoba', + 'Sunt seculaes transferre talis camerarius fluctuies', + 'Era brevis ratione est', + 'Sunt torquises imitari velox mirabilis medicinaes', + 'Mineralis persuadere omnes finises desiderium', + 'Bassus fatalis classiss virtualiter transferre de flavum', + ]; + } + + private function getRandomText(int $maxLength = 255): string + { + $phrases = $this->getPhrases(); + shuffle($phrases); + + do { + $text = u('. ')->join($phrases)->append('.'); + array_pop($phrases); + } while ($text->length() > $maxLength); + + return $text; + } + + private function getPostContent(): string + { + return <<<'MARKDOWN' +Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor +incididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in +reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. +Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia +deserunt mollit anim id est laborum. + + * Ut enim ad minim veniam + * Quis nostrud exercitation *ullamco laboris* + * Nisi ut aliquip ex ea commodo consequat + +Praesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at +nunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum. +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos +himenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a +luctus dolor. + +Integer auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada* +ex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus. +Praesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque +efficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue +nulla vitae est. + +Ut posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti** +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi +arcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel +ipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed +tincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis. +Sed in egestas erat. + +Aliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum +lacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec +congue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam +tempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus +tincidunt, faucibus nisl in, aliquet libero. +MARKDOWN; + } + + private function getRandomTags(): array + { + $tagNames = $this->getTagData(); + shuffle($tagNames); + $selectedTags = \array_slice($tagNames, 0, random_int(2, 4)); + + return array_map(function ($tagName) { return $this->getReference('tag-'.$tagName); }, $selectedTags); + } +} diff --git a/src/Entity/Comment.php b/src/Entity/Comment.php new file mode 100644 index 00000000..2584d0d5 --- /dev/null +++ b/src/Entity/Comment.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Entity; + +use Doctrine\ORM\Mapping as ORM; +use function Symfony\Component\String\u; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * @ORM\Entity + * @ORM\Table(name="symfony_demo_comment") + * + * Defines the properties of the Comment entity to represent the blog comments. + * See https://symfony.com/doc/current/doctrine.html#creating-an-entity-class + * + * Tip: if you have an existing database, you can generate these entity class automatically. + * See https://symfony.com/doc/current/doctrine/reverse_engineering.html + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class Comment +{ + /** + * @var int + * + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private $id; + + /** + * @var Post + * + * @ORM\ManyToOne(targetEntity="Post", inversedBy="comments") + * @ORM\JoinColumn(nullable=false) + */ + private $post; + + /** + * @var string + * + * @ORM\Column(type="text") + * @Assert\NotBlank(message="comment.blank") + * @Assert\Length( + * min=5, + * minMessage="comment.too_short", + * max=10000, + * maxMessage="comment.too_long" + * ) + */ + private $content; + + /** + * @var \DateTime + * + * @ORM\Column(type="datetime") + */ + private $publishedAt; + + /** + * @var User + * + * @ORM\ManyToOne(targetEntity="App\Entity\User") + * @ORM\JoinColumn(nullable=false) + */ + private $author; + + public function __construct() + { + $this->publishedAt = new \DateTime(); + } + + /** + * @Assert\IsTrue(message="comment.is_spam") + */ + public function isLegitComment(): bool + { + $containsInvalidCharacters = null !== u($this->content)->indexOf('@'); + + return !$containsInvalidCharacters; + } + + public function getId(): ?int + { + return $this->id; + } + + public function getContent(): ?string + { + return $this->content; + } + + public function setContent(string $content): void + { + $this->content = $content; + } + + public function getPublishedAt(): \DateTime + { + return $this->publishedAt; + } + + public function setPublishedAt(\DateTime $publishedAt): void + { + $this->publishedAt = $publishedAt; + } + + public function getAuthor(): ?User + { + return $this->author; + } + + public function setAuthor(User $author): void + { + $this->author = $author; + } + + public function getPost(): ?Post + { + return $this->post; + } + + public function setPost(Post $post): void + { + $this->post = $post; + } +} diff --git a/src/Entity/Post.php b/src/Entity/Post.php new file mode 100644 index 00000000..3115f612 --- /dev/null +++ b/src/Entity/Post.php @@ -0,0 +1,234 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Entity; + +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * @ORM\Entity(repositoryClass="App\Repository\PostRepository") + * @ORM\Table(name="symfony_demo_post") + * @UniqueEntity(fields={"slug"}, errorPath="title", message="post.slug_unique") + * + * Defines the properties of the Post entity to represent the blog posts. + * + * See https://symfony.com/doc/current/doctrine.html#creating-an-entity-class + * + * Tip: if you have an existing database, you can generate these entity class automatically. + * See https://symfony.com/doc/current/doctrine/reverse_engineering.html + * + * @author Ryan Weaver + * @author Javier Eguiluz + * @author Yonel Ceruto + */ +class Post +{ + /** + * Use constants to define configuration options that rarely change instead + * of specifying them under parameters section in config/services.yaml file. + * + * See https://symfony.com/doc/current/best_practices.html#use-constants-to-define-options-that-rarely-change + */ + public const NUM_ITEMS = 10; + + /** + * @var int + * + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private $id; + + /** + * @var string + * + * @ORM\Column(type="string") + * @Assert\NotBlank + */ + private $title; + + /** + * @var string + * + * @ORM\Column(type="string") + */ + private $slug; + + /** + * @var string + * + * @ORM\Column(type="string") + * @Assert\NotBlank(message="post.blank_summary") + * @Assert\Length(max=255) + */ + private $summary; + + /** + * @var string + * + * @ORM\Column(type="text") + * @Assert\NotBlank(message="post.blank_content") + * @Assert\Length(min=10, minMessage="post.too_short_content") + */ + private $content; + + /** + * @var \DateTime + * + * @ORM\Column(type="datetime") + */ + private $publishedAt; + + /** + * @var User + * + * @ORM\ManyToOne(targetEntity="App\Entity\User") + * @ORM\JoinColumn(nullable=false) + */ + private $author; + + /** + * @var Comment[]|ArrayCollection + * + * @ORM\OneToMany( + * targetEntity="Comment", + * mappedBy="post", + * orphanRemoval=true, + * cascade={"persist"} + * ) + * @ORM\OrderBy({"publishedAt": "DESC"}) + */ + private $comments; + + /** + * @var Tag[]|ArrayCollection + * + * @ORM\ManyToMany(targetEntity="App\Entity\Tag", cascade={"persist"}) + * @ORM\JoinTable(name="symfony_demo_post_tag") + * @ORM\OrderBy({"name": "ASC"}) + * @Assert\Count(max="4", maxMessage="post.too_many_tags") + */ + private $tags; + + public function __construct() + { + $this->publishedAt = new \DateTime(); + $this->comments = new ArrayCollection(); + $this->tags = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getTitle(): ?string + { + return $this->title; + } + + public function setTitle(string $title): void + { + $this->title = $title; + } + + public function getSlug(): ?string + { + return $this->slug; + } + + public function setSlug(string $slug): void + { + $this->slug = $slug; + } + + public function getContent(): ?string + { + return $this->content; + } + + public function setContent(string $content): void + { + $this->content = $content; + } + + public function getPublishedAt(): \DateTime + { + return $this->publishedAt; + } + + public function setPublishedAt(\DateTime $publishedAt): void + { + $this->publishedAt = $publishedAt; + } + + public function getAuthor(): ?User + { + return $this->author; + } + + public function setAuthor(User $author): void + { + $this->author = $author; + } + + public function getComments(): Collection + { + return $this->comments; + } + + public function addComment(Comment $comment): void + { + $comment->setPost($this); + if (!$this->comments->contains($comment)) { + $this->comments->add($comment); + } + } + + public function removeComment(Comment $comment): void + { + $this->comments->removeElement($comment); + } + + public function getSummary(): ?string + { + return $this->summary; + } + + public function setSummary(string $summary): void + { + $this->summary = $summary; + } + + public function addTag(Tag ...$tags): void + { + foreach ($tags as $tag) { + if (!$this->tags->contains($tag)) { + $this->tags->add($tag); + } + } + } + + public function removeTag(Tag $tag): void + { + $this->tags->removeElement($tag); + } + + public function getTags(): Collection + { + return $this->tags; + } +} diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php new file mode 100644 index 00000000..11e29df4 --- /dev/null +++ b/src/Entity/Tag.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Entity; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity() + * @ORM\Table(name="symfony_demo_tag") + * + * Defines the properties of the Tag entity to represent the post tags. + * + * See https://symfony.com/doc/current/doctrine.html#creating-an-entity-class + * + * @author Yonel Ceruto + */ +class Tag implements \JsonSerializable +{ + /** + * @var int + * + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private $id; + + /** + * @var string + * + * @ORM\Column(type="string", unique=true) + */ + private $name; + + public function getId(): ?int + { + return $this->id; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + public function getName(): ?string + { + return $this->name; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize(): string + { + // This entity implements JsonSerializable (http://php.net/manual/en/class.jsonserializable.php) + // so this method is used to customize its JSON representation when json_encode() + // is called, for example in tags|json_encode (templates/form/fields.html.twig) + + return $this->name; + } + + public function __toString(): string + { + return $this->name; + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php new file mode 100644 index 00000000..8e696ed8 --- /dev/null +++ b/src/Entity/User.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Entity; + +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Security\Core\User\UserInterface; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * @ORM\Entity(repositoryClass="App\Repository\UserRepository") + * @ORM\Table(name="symfony_demo_user") + * + * Defines the properties of the User entity to represent the application users. + * See https://symfony.com/doc/current/doctrine.html#creating-an-entity-class + * + * Tip: if you have an existing database, you can generate these entity class automatically. + * See https://symfony.com/doc/current/doctrine/reverse_engineering.html + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class User implements UserInterface, \Serializable +{ + /** + * @var int + * + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private $id; + + /** + * @var string + * + * @ORM\Column(type="string") + * @Assert\NotBlank() + */ + private $fullName; + + /** + * @var string + * + * @ORM\Column(type="string", unique=true) + * @Assert\NotBlank() + * @Assert\Length(min=2, max=50) + */ + private $username; + + /** + * @var string + * + * @ORM\Column(type="string", unique=true) + * @Assert\Email() + */ + private $email; + + /** + * @var string + * + * @ORM\Column(type="string") + */ + private $password; + + /** + * @var array + * + * @ORM\Column(type="json") + */ + private $roles = []; + + public function getId(): ?int + { + return $this->id; + } + + public function setFullName(string $fullName): void + { + $this->fullName = $fullName; + } + + public function getFullName(): ?string + { + return $this->fullName; + } + + public function getUsername(): ?string + { + return $this->username; + } + + public function setUsername(string $username): void + { + $this->username = $username; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setEmail(string $email): void + { + $this->email = $email; + } + + public function getPassword(): ?string + { + return $this->password; + } + + public function setPassword(string $password): void + { + $this->password = $password; + } + + /** + * Returns the roles or permissions granted to the user for security. + */ + public function getRoles(): array + { + $roles = $this->roles; + + // guarantees that a user always has at least one role for security + if (empty($roles)) { + $roles[] = 'ROLE_USER'; + } + + return array_unique($roles); + } + + public function setRoles(array $roles): void + { + $this->roles = $roles; + } + + /** + * Returns the salt that was originally used to encode the password. + * + * {@inheritdoc} + */ + public function getSalt(): ?string + { + // We're using bcrypt in security.yaml to encode the password, so + // the salt value is built-in and and you don't have to generate one + // See https://en.wikipedia.org/wiki/Bcrypt + + return null; + } + + /** + * Removes sensitive data from the user. + * + * {@inheritdoc} + */ + public function eraseCredentials(): void + { + // if you had a plainPassword property, you'd nullify it here + // $this->plainPassword = null; + } + + /** + * {@inheritdoc} + */ + public function serialize(): string + { + // add $this->salt too if you don't use Bcrypt or Argon2i + return serialize([$this->id, $this->username, $this->password]); + } + + /** + * {@inheritdoc} + */ + public function unserialize($serialized): void + { + // add $this->salt too if you don't use Bcrypt or Argon2i + [$this->id, $this->username, $this->password] = unserialize($serialized, ['allowed_classes' => false]); + } +} diff --git a/src/EventSubscriber/CheckRequirementsSubscriber.php b/src/EventSubscriber/CheckRequirementsSubscriber.php new file mode 100644 index 00000000..aada2bec --- /dev/null +++ b/src/EventSubscriber/CheckRequirementsSubscriber.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\EventSubscriber; + +use Doctrine\DBAL\Exception\DriverException; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Console\ConsoleEvents; +use Symfony\Component\Console\Event\ConsoleErrorEvent; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\ExceptionEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * This application uses by default an SQLite database to store its information. + * That's why the 'sqlite3' extension must be enabled in PHP. This event + * subscriber listens to console events and in case of an exception caused by + * a disabled 'sqlite3' extension, it displays a meaningful error message. + * + * @author Javier Eguiluz + */ +class CheckRequirementsSubscriber implements EventSubscriberInterface +{ + private $entityManager; + + public function __construct(EntityManagerInterface $entityManager) + { + $this->entityManager = $entityManager; + } + + // Event Subscribers must define this method to declare the events they + // listen to. You can listen to several events, execute more than one method + // for each event and set the priority of each event too. + // See https://symfony.com/doc/current/event_dispatcher.html#creating-an-event-subscriber + public static function getSubscribedEvents(): array + { + return [ + // Errors are one of the events defined by the Console. See the + // rest here: https://symfony.com/doc/current/components/console/events.html + ConsoleEvents::ERROR => 'handleConsoleError', + // See: https://symfony.com/doc/current/components/http_kernel.html#component-http-kernel-event-table + KernelEvents::EXCEPTION => 'handleKernelException', + ]; + } + + /** + * This method checks if there has been an error in a command related to + * the database and then, it checks if the 'sqlite3' PHP extension is enabled + * or not to display a better error message. + */ + public function handleConsoleError(ConsoleErrorEvent $event): void + { + $commandNames = ['doctrine:fixtures:load', 'doctrine:database:create', 'doctrine:schema:create', 'doctrine:database:drop']; + + if ($event->getCommand() && \in_array($event->getCommand()->getName(), $commandNames, true)) { + if ($this->isSQLitePlatform() && !\extension_loaded('sqlite3')) { + $io = new SymfonyStyle($event->getInput(), $event->getOutput()); + $io->error('This command requires to have the "sqlite3" PHP extension enabled because, by default, the Symfony Demo application uses SQLite to store its information.'); + } + } + } + + /** + * This method checks if the triggered exception is related to the database + * and then, it checks if the required 'sqlite3' PHP extension is enabled. + */ + public function handleKernelException(ExceptionEvent $event): void + { + $exception = $event->getThrowable(); + // Since any exception thrown during a Twig template rendering is wrapped + // in a Twig_Error_Runtime, we must get the original exception. + $previousException = $exception->getPrevious(); + + // Driver exception may happen in controller or in twig template rendering + $isDriverException = ($exception instanceof DriverException || $previousException instanceof DriverException); + + // Check if SQLite is enabled + if ($isDriverException && $this->isSQLitePlatform() && !\extension_loaded('sqlite3')) { + $event->setThrowable(new \Exception('PHP extension "sqlite3" must be enabled because, by default, the Symfony Demo application uses SQLite to store its information.')); + } + } + + /** + * Checks if the application is using SQLite as its database. + */ + private function isSQLitePlatform(): bool + { + $databasePlatform = $this->entityManager->getConnection()->getDatabasePlatform(); + + return $databasePlatform ? 'sqlite' === $databasePlatform->getName() : false; + } +} diff --git a/src/EventSubscriber/CommentNotificationSubscriber.php b/src/EventSubscriber/CommentNotificationSubscriber.php new file mode 100644 index 00000000..14c1d020 --- /dev/null +++ b/src/EventSubscriber/CommentNotificationSubscriber.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\EventSubscriber; + +use App\Entity\Comment; +use App\Events\CommentCreatedEvent; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\Email; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * Notifies post's author about new comments. + * + * @author Oleg Voronkovich + */ +class CommentNotificationSubscriber implements EventSubscriberInterface +{ + private $mailer; + private $translator; + private $urlGenerator; + private $sender; + + public function __construct(MailerInterface $mailer, UrlGeneratorInterface $urlGenerator, TranslatorInterface $translator, $sender) + { + $this->mailer = $mailer; + $this->urlGenerator = $urlGenerator; + $this->translator = $translator; + $this->sender = $sender; + } + + public static function getSubscribedEvents(): array + { + return [ + CommentCreatedEvent::class => 'onCommentCreated', + ]; + } + + public function onCommentCreated(CommentCreatedEvent $event): void + { + /** @var Comment $comment */ + $comment = $event->getComment(); + $post = $comment->getPost(); + + $linkToPost = $this->urlGenerator->generate('blog_post', [ + 'slug' => $post->getSlug(), + '_fragment' => 'comment_'.$comment->getId(), + ], UrlGeneratorInterface::ABSOLUTE_URL); + + $subject = $this->translator->trans('notification.comment_created'); + $body = $this->translator->trans('notification.comment_created.description', [ + '%title%' => $post->getTitle(), + '%link%' => $linkToPost, + ]); + + // See https://symfony.com/doc/current/mailer.html + $email = (new Email()) + ->from($this->sender) + ->to($post->getAuthor()->getEmail()) + ->subject($subject) + ->html($body) + ; + + // In config/packages/dev/mailer.yaml the delivery of messages is disabled. + // That's why in the development environment you won't actually receive any email. + // However, you can inspect the contents of those unsent emails using the debug toolbar. + $this->mailer->send($email); + } +} diff --git a/src/EventSubscriber/ControllerSubscriber.php b/src/EventSubscriber/ControllerSubscriber.php new file mode 100644 index 00000000..1e68a597 --- /dev/null +++ b/src/EventSubscriber/ControllerSubscriber.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\EventSubscriber; + +use App\Twig\SourceCodeExtension; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\ControllerEvent; +use Symfony\Component\HttpKernel\KernelEvents; + +/** + * Defines the method that 'listens' to the 'kernel.controller' event, which is + * triggered whenever a controller is executed in the application. + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class ControllerSubscriber implements EventSubscriberInterface +{ + private $twigExtension; + + public function __construct(SourceCodeExtension $twigExtension) + { + $this->twigExtension = $twigExtension; + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::CONTROLLER => 'registerCurrentController', + ]; + } + + public function registerCurrentController(ControllerEvent $event): void + { + // this check is needed because in Symfony a request can perform any + // number of sub-requests. See + // https://symfony.com/doc/current/components/http_kernel.html#sub-requests + if ($event->isMasterRequest()) { + $this->twigExtension->setController($event->getController()); + } + } +} diff --git a/src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php b/src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php new file mode 100644 index 00000000..d5434dd5 --- /dev/null +++ b/src/EventSubscriber/RedirectToPreferredLocaleSubscriber.php @@ -0,0 +1,86 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\EventSubscriber; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpKernel\Event\RequestEvent; +use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use function Symfony\Component\String\u; + +/** + * When visiting the homepage, this listener redirects the user to the most + * appropriate localized version according to the browser settings. + * + * See https://symfony.com/doc/current/components/http_kernel.html#the-kernel-request-event + * + * @author Oleg Voronkovich + */ +class RedirectToPreferredLocaleSubscriber implements EventSubscriberInterface +{ + private $urlGenerator; + private $locales; + private $defaultLocale; + + public function __construct(UrlGeneratorInterface $urlGenerator, string $locales, string $defaultLocale = null) + { + $this->urlGenerator = $urlGenerator; + + $this->locales = explode('|', trim($locales)); + if (empty($this->locales)) { + throw new \UnexpectedValueException('The list of supported locales must not be empty.'); + } + + $this->defaultLocale = $defaultLocale ?: $this->locales[0]; + + if (!\in_array($this->defaultLocale, $this->locales, true)) { + throw new \UnexpectedValueException(sprintf('The default locale ("%s") must be one of "%s".', $this->defaultLocale, $locales)); + } + + // Add the default locale at the first position of the array, + // because Symfony\HttpFoundation\Request::getPreferredLanguage + // returns the first element when no an appropriate language is found + array_unshift($this->locales, $this->defaultLocale); + $this->locales = array_unique($this->locales); + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => 'onKernelRequest', + ]; + } + + public function onKernelRequest(RequestEvent $event): void + { + $request = $event->getRequest(); + + // Ignore sub-requests and all URLs but the homepage + if (!$event->isMasterRequest() || '/' !== $request->getPathInfo()) { + return; + } + // Ignore requests from referrers with the same HTTP host in order to prevent + // changing language for users who possibly already selected it for this application. + $referrer = $request->headers->get('referer'); + if (null !== $referrer && u($referrer)->ignoreCase()->startsWith($request->getSchemeAndHttpHost())) { + return; + } + + $preferredLanguage = $request->getPreferredLanguage($this->locales); + + if ($preferredLanguage !== $this->defaultLocale) { + $response = new RedirectResponse($this->urlGenerator->generate('homepage', ['_locale' => $preferredLanguage])); + $event->setResponse($response); + } + } +} diff --git a/src/Events/CommentCreatedEvent.php b/src/Events/CommentCreatedEvent.php new file mode 100644 index 00000000..145544b6 --- /dev/null +++ b/src/Events/CommentCreatedEvent.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Events; + +use App\Entity\Comment; +use Symfony\Contracts\EventDispatcher\Event; + +class CommentCreatedEvent extends Event +{ + protected $comment; + + public function __construct(Comment $comment) + { + $this->comment = $comment; + } + + public function getComment(): Comment + { + return $this->comment; + } +} diff --git a/src/Form/CommentType.php b/src/Form/CommentType.php new file mode 100644 index 00000000..38ad43c7 --- /dev/null +++ b/src/Form/CommentType.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form; + +use App\Entity\Comment; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; + +/** + * Defines the form used to create and manipulate blog comments. Although in this + * case the form is trivial and we could build it inside the controller, a good + * practice is to always define your forms as classes. + * + * See https://symfony.com/doc/current/forms.html#creating-form-classes + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class CommentType extends AbstractType +{ + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + // By default, form fields include the 'required' attribute, which enables + // the client-side form validation. This means that you can't test the + // server-side validation errors from the browser. To temporarily disable + // this validation, set the 'required' attribute to 'false': + // $builder->add('content', null, ['required' => false]); + + $builder + ->add('content', TextareaType::class, [ + 'help' => 'help.comment_content', + ]) + ; + } + + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Comment::class, + ]); + } +} diff --git a/src/Form/DataTransformer/TagArrayToStringTransformer.php b/src/Form/DataTransformer/TagArrayToStringTransformer.php new file mode 100644 index 00000000..9538e12a --- /dev/null +++ b/src/Form/DataTransformer/TagArrayToStringTransformer.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form\DataTransformer; + +use App\Entity\Tag; +use App\Repository\TagRepository; +use Symfony\Component\Form\DataTransformerInterface; +use function Symfony\Component\String\u; + +/** + * This data transformer is used to translate the array of tags into a comma separated format + * that can be displayed and managed by Bootstrap-tagsinput js plugin (and back on submit). + * + * See https://symfony.com/doc/current/form/data_transformers.html + * + * @author Yonel Ceruto + * @author Jonathan Boyer + */ +class TagArrayToStringTransformer implements DataTransformerInterface +{ + private $tags; + + public function __construct(TagRepository $tags) + { + $this->tags = $tags; + } + + /** + * {@inheritdoc} + */ + public function transform($tags): string + { + // The value received is an array of Tag objects generated with + // Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer::transform() + // The value returned is a string that concatenates the string representation of those objects + + /* @var Tag[] $tags */ + return implode(',', $tags); + } + + /** + * {@inheritdoc} + */ + public function reverseTransform($string): array + { + if (null === $string || u($string)->isEmpty()) { + return []; + } + + $names = array_filter(array_unique(array_map('trim', u($string)->split(',')))); + + // Get the current tags and find the new ones that should be created. + $tags = $this->tags->findBy([ + 'name' => $names, + ]); + $newNames = array_diff($names, $tags); + foreach ($newNames as $name) { + $tag = new Tag(); + $tag->setName($name); + $tags[] = $tag; + + // There's no need to persist these new tags because Doctrine does that automatically + // thanks to the cascade={"persist"} option in the App\Entity\Post::$tags property. + } + + // Return an array of tags to transform them back into a Doctrine Collection. + // See Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer::reverseTransform() + return $tags; + } +} diff --git a/src/Form/PostType.php b/src/Form/PostType.php new file mode 100644 index 00000000..3f52e090 --- /dev/null +++ b/src/Form/PostType.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form; + +use App\Entity\Post; +use App\Form\Type\DateTimePickerType; +use App\Form\Type\TagsInputType; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; +use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\String\Slugger\SluggerInterface; + +/** + * Defines the form used to create and manipulate blog posts. + * + * @author Ryan Weaver + * @author Javier Eguiluz + * @author Yonel Ceruto + */ +class PostType extends AbstractType +{ + private $slugger; + + // Form types are services, so you can inject other services in them if needed + public function __construct(SluggerInterface $slugger) + { + $this->slugger = $slugger; + } + + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + // For the full reference of options defined by each form field type + // see https://symfony.com/doc/current/reference/forms/types.html + + // By default, form fields include the 'required' attribute, which enables + // the client-side form validation. This means that you can't test the + // server-side validation errors from the browser. To temporarily disable + // this validation, set the 'required' attribute to 'false': + // $builder->add('title', null, ['required' => false, ...]); + + $builder + ->add('title', null, [ + 'attr' => ['autofocus' => true], + 'label' => 'label.title', + ]) + ->add('summary', TextareaType::class, [ + 'help' => 'help.post_summary', + 'label' => 'label.summary', + ]) + ->add('content', null, [ + 'attr' => ['rows' => 20], + 'help' => 'help.post_content', + 'label' => 'label.content', + ]) + ->add('publishedAt', DateTimePickerType::class, [ + 'label' => 'label.published_at', + 'help' => 'help.post_publication', + ]) + ->add('tags', TagsInputType::class, [ + 'label' => 'label.tags', + 'required' => false, + ]) + // form events let you modify information or fields at different steps + // of the form handling process. + // See https://symfony.com/doc/current/form/events.html + ->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) { + /** @var Post */ + $post = $event->getData(); + if (null !== $postTitle = $post->getTitle()) { + $post->setSlug($this->slugger->slug($postTitle)->lower()); + } + }) + ; + } + + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Post::class, + ]); + } +} diff --git a/src/Form/Type/ChangePasswordType.php b/src/Form/Type/ChangePasswordType.php new file mode 100644 index 00000000..fbee1a7d --- /dev/null +++ b/src/Form/Type/ChangePasswordType.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form\Type; + +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\PasswordType; +use Symfony\Component\Form\Extension\Core\Type\RepeatedType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Security\Core\Validator\Constraints\UserPassword; +use Symfony\Component\Validator\Constraints\Length; +use Symfony\Component\Validator\Constraints\NotBlank; + +/** + * Defines the custom form field type used to change user's password. + * + * @author Romain Monteil + */ +class ChangePasswordType extends AbstractType +{ + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + $builder + ->add('currentPassword', PasswordType::class, [ + 'constraints' => [ + new UserPassword(), + ], + 'label' => 'label.current_password', + 'attr' => [ + 'autocomplete' => 'off', + ], + ]) + ->add('newPassword', RepeatedType::class, [ + 'type' => PasswordType::class, + 'constraints' => [ + new NotBlank(), + new Length([ + 'min' => 5, + 'max' => 128, + ]), + ], + 'first_options' => [ + 'label' => 'label.new_password', + ], + 'second_options' => [ + 'label' => 'label.new_password_confirm', + ], + ]) + ; + } +} diff --git a/src/Form/Type/DateTimePickerType.php b/src/Form/Type/DateTimePickerType.php new file mode 100644 index 00000000..83a18802 --- /dev/null +++ b/src/Form/Type/DateTimePickerType.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form\Type; + +use App\Utils\MomentFormatConverter; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\DateTimeType; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; +use Symfony\Component\OptionsResolver\OptionsResolver; +use function Symfony\Component\String\u; + +/** + * Defines the custom form field type used to manipulate datetime values across + * Bootstrap Date\Time Picker javascript plugin. + * + * See https://symfony.com/doc/current/form/create_custom_field_type.html + * + * @author Yonel Ceruto + */ +class DateTimePickerType extends AbstractType +{ + private $formatConverter; + + public function __construct(MomentFormatConverter $converter) + { + $this->formatConverter = $converter; + } + + /** + * {@inheritdoc} + */ + public function buildView(FormView $view, FormInterface $form, array $options): void + { + $view->vars['attr']['data-date-format'] = $this->formatConverter->convert($options['format']); + $view->vars['attr']['data-date-locale'] = u(\Locale::getDefault())->replace('_', '-')->lower(); + } + + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'widget' => 'single_text', + // if true, the browser will display the native date picker widget + // however, this app uses a custom JavaScript widget, so it must be set to false + 'html5' => false, + ]); + } + + /** + * {@inheritdoc} + */ + public function getParent() + { + return DateTimeType::class; + } +} diff --git a/src/Form/Type/TagsInputType.php b/src/Form/Type/TagsInputType.php new file mode 100644 index 00000000..8371a4cf --- /dev/null +++ b/src/Form/Type/TagsInputType.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form\Type; + +use App\Form\DataTransformer\TagArrayToStringTransformer; +use App\Repository\TagRepository; +use Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\FormView; + +/** + * Defines the custom form field type used to manipulate tags values across + * Bootstrap-tagsinput javascript plugin. + * + * See https://symfony.com/doc/current/form/create_custom_field_type.html + * + * @author Yonel Ceruto + */ +class TagsInputType extends AbstractType +{ + private $tags; + + public function __construct(TagRepository $tags) + { + $this->tags = $tags; + } + + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + $builder + // The Tag collection must be transformed into a comma separated string. + // We could create a custom transformer to do Collection <-> string in one step, + // but here we're doing the transformation in two steps (Collection <-> array <-> string) + // and reuse the existing CollectionToArrayTransformer. + ->addModelTransformer(new CollectionToArrayTransformer(), true) + ->addModelTransformer(new TagArrayToStringTransformer($this->tags), true) + ; + } + + /** + * {@inheritdoc} + */ + public function buildView(FormView $view, FormInterface $form, array $options): void + { + $view->vars['tags'] = $this->tags->findAll(); + } + + /** + * {@inheritdoc} + */ + public function getParent() + { + return TextType::class; + } +} diff --git a/src/Form/UserType.php b/src/Form/UserType.php new file mode 100644 index 00000000..835d6ad5 --- /dev/null +++ b/src/Form/UserType.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Form; + +use App\Entity\User; +use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\EmailType; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; + +/** + * Defines the form used to edit an user. + * + * @author Romain Monteil + */ +class UserType extends AbstractType +{ + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options): void + { + // For the full reference of options defined by each form field type + // see https://symfony.com/doc/current/reference/forms/types.html + + // By default, form fields include the 'required' attribute, which enables + // the client-side form validation. This means that you can't test the + // server-side validation errors from the browser. To temporarily disable + // this validation, set the 'required' attribute to 'false': + // $builder->add('title', null, ['required' => false, ...]); + + $builder + ->add('username', TextType::class, [ + 'label' => 'label.username', + 'disabled' => true, + ]) + ->add('fullName', TextType::class, [ + 'label' => 'label.fullname', + ]) + ->add('email', EmailType::class, [ + 'label' => 'label.email', + ]) + ; + } + + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} diff --git a/src/Kernel.php b/src/Kernel.php new file mode 100644 index 00000000..d426dfd6 --- /dev/null +++ b/src/Kernel.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App; + +use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; +use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; +use Symfony\Component\HttpKernel\Kernel as BaseKernel; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; + +class Kernel extends BaseKernel +{ + use MicroKernelTrait; + + protected function configureContainer(ContainerConfigurator $container): void + { + $container->import('../config/{packages}/*.yaml'); + $container->import('../config/{packages}/'.$this->environment.'/*.yaml'); + $container->import('../config/{services}.yaml'); + $container->import('../config/{services}_'.$this->environment.'.yaml'); + } + + protected function configureRoutes(RoutingConfigurator $routes): void + { + $routes->import('../config/{routes}/'.$this->environment.'/*.yaml'); + $routes->import('../config/{routes}/*.yaml'); + $routes->import('../config/{routes}.yaml'); + } +} diff --git a/src/Pagination/Paginator.php b/src/Pagination/Paginator.php new file mode 100644 index 00000000..00507e89 --- /dev/null +++ b/src/Pagination/Paginator.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Pagination; + +use Doctrine\ORM\QueryBuilder as DoctrineQueryBuilder; +use Doctrine\ORM\Tools\Pagination\CountWalker; +use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator; + +/** + * @author Javier Eguiluz + */ +class Paginator +{ + private const PAGE_SIZE = 10; + private $queryBuilder; + private $currentPage; + private $pageSize; + private $results; + private $numResults; + + public function __construct(DoctrineQueryBuilder $queryBuilder, int $pageSize = self::PAGE_SIZE) + { + $this->queryBuilder = $queryBuilder; + $this->pageSize = $pageSize; + } + + public function paginate(int $page = 1): self + { + $this->currentPage = max(1, $page); + $firstResult = ($this->currentPage - 1) * $this->pageSize; + + $query = $this->queryBuilder + ->setFirstResult($firstResult) + ->setMaxResults($this->pageSize) + ->getQuery(); + + if (0 === \count($this->queryBuilder->getDQLPart('join'))) { + $query->setHint(CountWalker::HINT_DISTINCT, false); + } + + $paginator = new DoctrinePaginator($query, true); + + $useOutputWalkers = \count($this->queryBuilder->getDQLPart('having') ?: []) > 0; + $paginator->setUseOutputWalkers($useOutputWalkers); + + $this->results = $paginator->getIterator(); + $this->numResults = $paginator->count(); + + return $this; + } + + public function getCurrentPage(): int + { + return $this->currentPage; + } + + public function getLastPage(): int + { + return (int) ceil($this->numResults / $this->pageSize); + } + + public function getPageSize(): int + { + return $this->pageSize; + } + + public function hasPreviousPage(): bool + { + return $this->currentPage > 1; + } + + public function getPreviousPage(): int + { + return max(1, $this->currentPage - 1); + } + + public function hasNextPage(): bool + { + return $this->currentPage < $this->getLastPage(); + } + + public function getNextPage(): int + { + return min($this->getLastPage(), $this->currentPage + 1); + } + + public function hasToPaginate(): bool + { + return $this->numResults > $this->pageSize; + } + + public function getNumResults(): int + { + return $this->numResults; + } + + public function getResults(): \Traversable + { + return $this->results; + } +} diff --git a/src/Repository/PostRepository.php b/src/Repository/PostRepository.php new file mode 100644 index 00000000..a540aaf3 --- /dev/null +++ b/src/Repository/PostRepository.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Repository; + +use App\Entity\Post; +use App\Entity\Tag; +use App\Pagination\Paginator; +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Common\Persistence\ManagerRegistry; +use function Symfony\Component\String\u; + +/** + * This custom Doctrine repository contains some methods which are useful when + * querying for blog post information. + * + * See https://symfony.com/doc/current/doctrine.html#querying-for-objects-the-repository + * + * @author Ryan Weaver + * @author Javier Eguiluz + * @author Yonel Ceruto + */ +class PostRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Post::class); + } + + public function findLatest(int $page = 1, Tag $tag = null): Paginator + { + $qb = $this->createQueryBuilder('p') + ->addSelect('a', 't') + ->innerJoin('p.author', 'a') + ->leftJoin('p.tags', 't') + ->where('p.publishedAt <= :now') + ->orderBy('p.publishedAt', 'DESC') + ->setParameter('now', new \DateTime()) + ; + + if (null !== $tag) { + $qb->andWhere(':tag MEMBER OF p.tags') + ->setParameter('tag', $tag); + } + + return (new Paginator($qb))->paginate($page); + } + + /** + * @return Post[] + */ + public function findBySearchQuery(string $query, int $limit = Post::NUM_ITEMS): array + { + $searchTerms = $this->extractSearchTerms($query); + + if (0 === \count($searchTerms)) { + return []; + } + + $queryBuilder = $this->createQueryBuilder('p'); + + foreach ($searchTerms as $key => $term) { + $queryBuilder + ->orWhere('p.title LIKE :t_'.$key) + ->setParameter('t_'.$key, '%'.$term.'%') + ; + } + + return $queryBuilder + ->orderBy('p.publishedAt', 'DESC') + ->setMaxResults($limit) + ->getQuery() + ->getResult(); + } + + /** + * Transforms the search string into an array of search terms. + */ + private function extractSearchTerms(string $searchQuery): array + { + $searchQuery = u($searchQuery)->replaceMatches('/[[:space:]]+/', ' ')->trim(); + $terms = array_unique(u($searchQuery)->split(' ')); + + // ignore the search terms that are too short + return array_filter($terms, function ($term) { + return 2 <= u($term)->length(); + }); + } +} diff --git a/src/Repository/TagRepository.php b/src/Repository/TagRepository.php new file mode 100644 index 00000000..6d05d9b5 --- /dev/null +++ b/src/Repository/TagRepository.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Repository; + +use App\Entity\Tag; +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * This custom Doctrine repository is empty because so far we don't need any custom + * method to query for application user information. But it's always a good practice + * to define a custom repository that will be used when the application grows. + * + * See https://symfony.com/doc/current/doctrine.html#querying-for-objects-the-repository + * + * @author Yonel Ceruto + */ +class TagRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Tag::class); + } +} diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php new file mode 100644 index 00000000..5c64d4d1 --- /dev/null +++ b/src/Repository/UserRepository.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Repository; + +use App\Entity\User; +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * This custom Doctrine repository is empty because so far we don't need any custom + * method to query for application user information. But it's always a good practice + * to define a custom repository that will be used when the application grows. + * + * See https://symfony.com/doc/current/doctrine.html#querying-for-objects-the-repository + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class UserRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, User::class); + } +} diff --git a/src/Security/PostVoter.php b/src/Security/PostVoter.php new file mode 100644 index 00000000..fbf7e637 --- /dev/null +++ b/src/Security/PostVoter.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Security; + +use App\Entity\Post; +use App\Entity\User; +use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Voter; + +/** + * It grants or denies permissions for actions related to blog posts (such as + * showing, editing and deleting posts). + * + * See https://symfony.com/doc/current/security/voters.html + * + * @author Yonel Ceruto + */ +class PostVoter extends Voter +{ + // Defining these constants is overkill for this simple application, but for real + // applications, it's a recommended practice to avoid relying on "magic strings" + public const DELETE = 'delete'; + public const EDIT = 'edit'; + public const SHOW = 'show'; + + /** + * {@inheritdoc} + */ + protected function supports($attribute, $subject): bool + { + // this voter is only executed for three specific permissions on Post objects + return $subject instanceof Post && \in_array($attribute, [self::SHOW, self::EDIT, self::DELETE], true); + } + + /** + * {@inheritdoc} + */ + protected function voteOnAttribute($attribute, $post, TokenInterface $token): bool + { + $user = $token->getUser(); + + // the user must be logged in; if not, deny permission + if (!$user instanceof User) { + return false; + } + + // the logic of this voter is pretty simple: if the logged user is the + // author of the given blog post, grant permission; otherwise, deny it. + // (the supports() method guarantees that $post is a Post object) + return $user === $post->getAuthor(); + } +} diff --git a/src/Twig/AppExtension.php b/src/Twig/AppExtension.php new file mode 100644 index 00000000..5180d5cc --- /dev/null +++ b/src/Twig/AppExtension.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Twig; + +use Symfony\Component\Intl\Locales; +use Twig\Extension\AbstractExtension; +use Twig\TwigFunction; + +/** + * See https://symfony.com/doc/current/templating/twig_extension.html. + * + * @author Ryan Weaver + * @author Javier Eguiluz + * @author Julien ITARD + */ +class AppExtension extends AbstractExtension +{ + private $localeCodes; + private $locales; + + public function __construct(string $locales) + { + $localeCodes = explode('|', $locales); + sort($localeCodes); + $this->localeCodes = $localeCodes; + } + + /** + * {@inheritdoc} + */ + public function getFunctions(): array + { + return [ + new TwigFunction('locales', [$this, 'getLocales']), + ]; + } + + /** + * Takes the list of codes of the locales (languages) enabled in the + * application and returns an array with the name of each locale written + * in its own language (e.g. English, Français, Español, etc.). + */ + public function getLocales(): array + { + if (null !== $this->locales) { + return $this->locales; + } + + $this->locales = []; + foreach ($this->localeCodes as $localeCode) { + $this->locales[] = ['code' => $localeCode, 'name' => Locales::getName($localeCode, $localeCode)]; + } + + return $this->locales; + } +} diff --git a/src/Twig/SourceCodeExtension.php b/src/Twig/SourceCodeExtension.php new file mode 100644 index 00000000..f37a0ffd --- /dev/null +++ b/src/Twig/SourceCodeExtension.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Twig; + +use function Symfony\Component\String\u; +use Twig\Environment; +use Twig\Extension\AbstractExtension; +use Twig\Template; +use Twig\TemplateWrapper; +use Twig\TwigFunction; + +/** + * CAUTION: this is an extremely advanced Twig extension. It's used to get the + * source code of the controller and the template used to render the current + * page. If you are starting with Symfony, don't look at this code and consider + * studying instead the code of the src/App/Twig/AppExtension.php extension. + * + * @author Ryan Weaver + * @author Javier Eguiluz + */ +class SourceCodeExtension extends AbstractExtension +{ + private $controller; + + public function setController(?callable $controller) + { + $this->controller = $controller; + } + + /** + * {@inheritdoc} + */ + public function getFunctions(): array + { + return [ + new TwigFunction('show_source_code', [$this, 'showSourceCode'], ['is_safe' => ['html'], 'needs_environment' => true]), + ]; + } + + public function showSourceCode(Environment $twig, $template): string + { + return $twig->render('debug/source_code.html.twig', [ + 'controller' => $this->getController(), + 'template' => $this->getTemplateSource($twig->resolveTemplate($template)), + ]); + } + + private function getController(): ?array + { + // this happens for example for exceptions (404 errors, etc.) + if (null === $this->controller) { + return null; + } + + $method = $this->getCallableReflector($this->controller); + + $classCode = file($method->getFileName()); + $methodCode = \array_slice($classCode, $method->getStartLine() - 1, $method->getEndLine() - $method->getStartLine() + 1); + $controllerCode = ' '.$method->getDocComment()."\n".implode('', $methodCode); + + return [ + 'file_path' => $method->getFileName(), + 'starting_line' => $method->getStartLine(), + 'source_code' => $this->unindentCode($controllerCode), + ]; + } + + /** + * Gets a reflector for a callable. + * + * This logic is copied from Symfony\Component\HttpKernel\Controller\ControllerResolver::getArguments + */ + private function getCallableReflector(callable $callable): \ReflectionFunctionAbstract + { + if (\is_array($callable)) { + return new \ReflectionMethod($callable[0], $callable[1]); + } + + if (\is_object($callable) && !$callable instanceof \Closure) { + $r = new \ReflectionObject($callable); + + return $r->getMethod('__invoke'); + } + + return new \ReflectionFunction($callable); + } + + /** + * @param TemplateWrapper|Template $template + */ + private function getTemplateSource($template): array + { + $templateSource = $template->getSourceContext(); + + return [ + // Twig templates are not always stored in files (they can be stored + // in a database for example). However, for the needs of the Symfony + // Demo app, we consider that all templates are stored in files and + // that their file paths can be obtained through the source context. + 'file_path' => $templateSource->getPath(), + 'starting_line' => 1, + 'source_code' => $templateSource->getCode(), + ]; + } + + /** + * Utility method that "unindents" the given $code when all its lines start + * with a tabulation of four white spaces. + */ + private function unindentCode(string $code): string + { + $codeLines = u($code)->split("\n"); + + $indentedOrBlankLines = array_filter($codeLines, function ($lineOfCode) { + return u($lineOfCode)->isEmpty() || u($lineOfCode)->startsWith(' '); + }); + + $codeIsIndented = \count($indentedOrBlankLines) === \count($codeLines); + if ($codeIsIndented) { + $unindentedLines = array_map(function ($lineOfCode) { + return u($lineOfCode)->after(' '); + }, $codeLines); + $code = u("\n")->join($unindentedLines); + } + + return $code; + } +} diff --git a/src/Utils/MomentFormatConverter.php b/src/Utils/MomentFormatConverter.php new file mode 100644 index 00000000..11d208f6 --- /dev/null +++ b/src/Utils/MomentFormatConverter.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Utils; + +/** + * This class is used to convert PHP date format to moment.js format. + * + * @author Yonel Ceruto + */ +class MomentFormatConverter +{ + /** + * This defines the mapping between PHP ICU date format (key) and moment.js date format (value) + * For ICU formats see http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax + * For Moment formats see https://momentjs.com/docs/#/displaying/format/. + * + * @var array + */ + private static $formatConvertRules = [ + // year + 'yyyy' => 'YYYY', 'yy' => 'YY', 'y' => 'YYYY', + // day + 'dd' => 'DD', 'd' => 'D', + // day of week + 'EE' => 'ddd', 'EEEEEE' => 'dd', + // timezone + 'ZZZZZ' => 'Z', 'ZZZ' => 'ZZ', + // letter 'T' + '\'T\'' => 'T', + ]; + + /** + * Returns associated moment.js format. + */ + public function convert(string $format): string + { + return strtr($format, self::$formatConvertRules); + } +} diff --git a/src/Utils/Validator.php b/src/Utils/Validator.php new file mode 100644 index 00000000..f1fc565c --- /dev/null +++ b/src/Utils/Validator.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Utils; + +use Symfony\Component\Console\Exception\InvalidArgumentException; +use function Symfony\Component\String\u; + +/** + * This class is used to provide an example of integrating simple classes as + * services into a Symfony application. + * + * @author Javier Eguiluz + */ +class Validator +{ + public function validateUsername(?string $username): string + { + if (empty($username)) { + throw new InvalidArgumentException('The username can not be empty.'); + } + + if (1 !== preg_match('/^[a-z_]+$/', $username)) { + throw new InvalidArgumentException('The username must contain only lowercase latin characters and underscores.'); + } + + return $username; + } + + public function validatePassword(?string $plainPassword): string + { + if (empty($plainPassword)) { + throw new InvalidArgumentException('The password can not be empty.'); + } + + if (u($plainPassword)->trim()->length() < 6) { + throw new InvalidArgumentException('The password must be at least 6 characters long.'); + } + + return $plainPassword; + } + + public function validateEmail(?string $email): string + { + if (empty($email)) { + throw new InvalidArgumentException('The email can not be empty.'); + } + + if (null === u($email)->indexOf('@')) { + throw new InvalidArgumentException('The email should look like a real email.'); + } + + return $email; + } + + public function validateFullName(?string $fullName): string + { + if (empty($fullName)) { + throw new InvalidArgumentException('The full name can not be empty.'); + } + + return $fullName; + } +} diff --git a/symfony.lock b/symfony.lock new file mode 100644 index 00000000..85d523d9 --- /dev/null +++ b/symfony.lock @@ -0,0 +1,579 @@ +{ + "composer/semver": { + "version": "1.5.1" + }, + "composer/xdebug-handler": { + "version": "1.4.1" + }, + "dama/doctrine-test-bundle": { + "version": "4.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "4.0", + "ref": "56eaa387b5e48ebcc7c95a893b47dfa1ad51449c" + }, + "files": [ + "config/packages/test/dama_doctrine_test_bundle.yaml" + ] + }, + "doctrine/annotations": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" + }, + "files": [ + "config/routes/annotations.yaml" + ] + }, + "doctrine/cache": { + "version": "1.10.0" + }, + "doctrine/collections": { + "version": "1.6.4" + }, + "doctrine/common": { + "version": "2.13.0" + }, + "doctrine/data-fixtures": { + "version": "1.4.2" + }, + "doctrine/dbal": { + "version": "2.10.2" + }, + "doctrine/doctrine-bundle": { + "version": "2.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.0", + "ref": "a9f2463b9f73efe74482f831f03a204a41328555" + }, + "files": [ + "config/packages/doctrine.yaml", + "config/packages/prod/doctrine.yaml", + "src/Entity/.gitignore", + "src/Repository/.gitignore" + ] + }, + "doctrine/doctrine-fixtures-bundle": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.0", + "ref": "fc52d86631a6dfd9fdf3381d0b7e3df2069e51b3" + }, + "files": [ + "src/DataFixtures/AppFixtures.php" + ] + }, + "doctrine/doctrine-migrations-bundle": { + "version": "1.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.2", + "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" + }, + "files": [ + "config/packages/doctrine_migrations.yaml", + "src/Migrations/.gitignore" + ] + }, + "doctrine/event-manager": { + "version": "1.1.0" + }, + "doctrine/inflector": { + "version": "1.4.1" + }, + "doctrine/instantiator": { + "version": "1.3.0" + }, + "doctrine/lexer": { + "version": "1.2.0" + }, + "doctrine/migrations": { + "version": "2.2.1" + }, + "doctrine/orm": { + "version": "v2.7.2" + }, + "doctrine/persistence": { + "version": "1.3.7" + }, + "doctrine/reflection": { + "version": "1.2.1" + }, + "doctrine/sql-formatter": { + "version": "1.0.1" + }, + "egulias/email-validator": { + "version": "2.1.17" + }, + "erusev/parsedown": { + "version": "1.7.4" + }, + "friendsofphp/php-cs-fixer": { + "version": "2.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.2", + "ref": "cc05ab6abf6894bddb9bbd6a252459010ebe040b" + }, + "files": [ + ".php_cs.dist" + ] + }, + "league/uri-parser": { + "version": "1.4.1" + }, + "masterminds/html5": { + "version": "2.7.0" + }, + "monolog/monolog": { + "version": "2.1.0" + }, + "nikic/php-parser": { + "version": "v4.4.0" + }, + "ocramius/package-versions": { + "version": "1.4.2" + }, + "ocramius/proxy-manager": { + "version": "2.2.3" + }, + "php": { + "version": "7.2.9" + }, + "php-cs-fixer/diff": { + "version": "v2.0.1" + }, + "psr/cache": { + "version": "1.0.1" + }, + "psr/container": { + "version": "1.0.0" + }, + "psr/event-dispatcher": { + "version": "1.0.0" + }, + "psr/log": { + "version": "1.1.3" + }, + "sensio/framework-extra-bundle": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" + }, + "files": [ + "config/packages/sensio_framework_extra.yaml" + ] + }, + "symfony/apache-pack": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "1.0", + "ref": "71599f5b0fdeeeec0fb90e9b17c85e6f5e1350c1" + }, + "files": [ + "public/.htaccess" + ] + }, + "symfony/asset": { + "version": "v5.1.0-rc1" + }, + "symfony/browser-kit": { + "version": "v5.1.0-rc1" + }, + "symfony/cache": { + "version": "v5.1.0-rc1" + }, + "symfony/cache-contracts": { + "version": "v2.0.1" + }, + "symfony/config": { + "version": "v5.1.0-rc1" + }, + "symfony/console": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "c6d02bdfba9da13c22157520e32a602dbee8a75c" + }, + "files": [ + "bin/console" + ] + }, + "symfony/css-selector": { + "version": "v5.1.0-rc1" + }, + "symfony/debug-bundle": { + "version": "4.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.1", + "ref": "f8863cbad2f2e58c4b65fa1eac892ab189971bea" + }, + "files": [ + "config/packages/dev/debug.yaml" + ] + }, + "symfony/dependency-injection": { + "version": "v5.1.0-rc1" + }, + "symfony/deprecation-contracts": { + "version": "v2.1.0" + }, + "symfony/doctrine-bridge": { + "version": "v5.1.0-rc1" + }, + "symfony/dom-crawler": { + "version": "v5.1.0-rc1" + }, + "symfony/dotenv": { + "version": "v5.1.0-rc1" + }, + "symfony/error-handler": { + "version": "v5.1.0-rc1" + }, + "symfony/event-dispatcher": { + "version": "v5.1.0-rc1" + }, + "symfony/event-dispatcher-contracts": { + "version": "v2.0.1" + }, + "symfony/expression-language": { + "version": "v5.1.0-rc1" + }, + "symfony/filesystem": { + "version": "v5.1.0-rc1" + }, + "symfony/finder": { + "version": "v5.1.0-rc1" + }, + "symfony/flex": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e" + }, + "files": [ + ".env" + ] + }, + "symfony/form": { + "version": "v5.1.0-rc1" + }, + "symfony/framework-bundle": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "37b4ec59eda3eb89705f21a0da7231862495ce0a" + }, + "files": [ + "config/packages/cache.yaml", + "config/packages/framework.yaml", + "config/packages/test/framework.yaml", + "config/routes/dev/framework.yaml", + "config/services.yaml", + "public/index.php", + "src/Controller/.gitignore", + "src/Kernel.php" + ] + }, + "symfony/http-foundation": { + "version": "v5.1.0-rc1" + }, + "symfony/http-kernel": { + "version": "v5.1.0-rc1" + }, + "symfony/inflector": { + "version": "v5.1.0-rc1" + }, + "symfony/intl": { + "version": "v5.1.0-rc1" + }, + "symfony/mailer": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "15658c2a0176cda2e7dba66276a2030b52bd81b2" + }, + "files": [ + "config/packages/mailer.yaml" + ] + }, + "symfony/maker-bundle": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" + } + }, + "symfony/mime": { + "version": "v5.1.0-rc1" + }, + "symfony/monolog-bridge": { + "version": "v5.1.0-rc1" + }, + "symfony/monolog-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "a89f4cd8a232563707418eea6c2da36acd36a917" + }, + "files": [ + "config/packages/dev/monolog.yaml", + "config/packages/prod/monolog.yaml", + "config/packages/test/monolog.yaml" + ] + }, + "symfony/options-resolver": { + "version": "v5.1.0-rc1" + }, + "symfony/phpunit-bridge": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "6d0e35f749d5f4bfe1f011762875275cd3f9874f" + }, + "files": [ + ".env.test", + "bin/phpunit", + "phpunit.xml.dist", + "tests/bootstrap.php" + ] + }, + "symfony/polyfill-ctype": { + "version": "v1.17.0" + }, + "symfony/polyfill-intl-grapheme": { + "version": "v1.17.0" + }, + "symfony/polyfill-intl-icu": { + "version": "v1.17.0" + }, + "symfony/polyfill-intl-idn": { + "version": "v1.17.0" + }, + "symfony/polyfill-intl-messageformatter": { + "version": "v1.17.0" + }, + "symfony/polyfill-intl-normalizer": { + "version": "v1.17.0" + }, + "symfony/polyfill-mbstring": { + "version": "v1.17.0" + }, + "symfony/polyfill-php73": { + "version": "v1.17.0" + }, + "symfony/polyfill-php80": { + "version": "v1.17.0" + }, + "symfony/process": { + "version": "v5.1.0-rc1" + }, + "symfony/property-access": { + "version": "v5.1.0-rc1" + }, + "symfony/property-info": { + "version": "v5.1.0-rc1" + }, + "symfony/routing": { + "version": "5.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.1", + "ref": "b4f3e7c95e38b606eef467e8a42a8408fc460c43" + }, + "files": [ + "config/packages/prod/routing.yaml", + "config/packages/routing.yaml", + "config/routes.yaml" + ] + }, + "symfony/security-bundle": { + "version": "4.4", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.4", + "ref": "7b4408dc203049666fe23fabed23cbadc6d8440f" + }, + "files": [ + "config/packages/security.yaml" + ] + }, + "symfony/security-core": { + "version": "v5.1.0-rc1" + }, + "symfony/security-csrf": { + "version": "v5.1.0-rc1" + }, + "symfony/security-guard": { + "version": "v5.1.0-rc1" + }, + "symfony/security-http": { + "version": "v5.1.0-rc1" + }, + "symfony/service-contracts": { + "version": "v2.0.1" + }, + "symfony/stopwatch": { + "version": "v5.1.0-rc1" + }, + "symfony/string": { + "version": "v5.1.0-rc1" + }, + "symfony/translation": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd" + }, + "files": [ + "config/packages/translation.yaml", + "translations/.gitignore" + ] + }, + "symfony/translation-contracts": { + "version": "v2.0.1" + }, + "symfony/twig-bridge": { + "version": "v5.1.0-rc1" + }, + "symfony/twig-bundle": { + "version": "5.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.0", + "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" + }, + "files": [ + "config/packages/test/twig.yaml", + "config/packages/twig.yaml", + "templates/base.html.twig" + ] + }, + "symfony/twig-pack": { + "version": "v1.0.0" + }, + "symfony/validator": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "d902da3e4952f18d3bf05aab29512eb61cabd869" + }, + "files": [ + "config/packages/test/validator.yaml", + "config/packages/validator.yaml" + ] + }, + "symfony/var-dumper": { + "version": "v5.1.0-rc1" + }, + "symfony/var-exporter": { + "version": "v5.1.0-rc1" + }, + "symfony/web-profiler-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" + }, + "files": [ + "config/packages/dev/web_profiler.yaml", + "config/packages/test/web_profiler.yaml", + "config/routes/dev/web_profiler.yaml" + ] + }, + "symfony/webpack-encore-bundle": { + "version": "1.6", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.6", + "ref": "69e1d805ad95964088bd510c05995e87dc391564" + }, + "files": [ + "assets/css/app.css", + "assets/js/app.js", + "config/packages/assets.yaml", + "config/packages/prod/webpack_encore.yaml", + "config/packages/test/webpack_encore.yaml", + "config/packages/webpack_encore.yaml", + "package.json", + "webpack.config.js" + ] + }, + "symfony/yaml": { + "version": "v5.1.0-rc1" + }, + "tgalopin/html-sanitizer": { + "version": "1.4.0" + }, + "tgalopin/html-sanitizer-bundle": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "1.0", + "ref": "26a72f38eede2c53b5d3ccbed5c150e10a93268d" + }, + "files": [ + "config/packages/html_sanitizer.yaml" + ] + }, + "twig/extra-bundle": { + "version": "v3.0.3" + }, + "twig/intl-extra": { + "version": "v3.0.3" + }, + "twig/markdown-extra": { + "version": "v3.0.3" + }, + "twig/twig": { + "version": "v3.0.3" + }, + "zendframework/zend-code": { + "version": "3.4.1" + }, + "zendframework/zend-eventmanager": { + "version": "3.2.1" + } +} diff --git a/templates/admin/blog/_delete_form.html.twig b/templates/admin/blog/_delete_form.html.twig new file mode 100644 index 00000000..257d4d8c --- /dev/null +++ b/templates/admin/blog/_delete_form.html.twig @@ -0,0 +1,8 @@ +{{ include('blog/_delete_post_confirmation.html.twig') }} +

    + + + diff --git a/templates/admin/blog/_form.html.twig b/templates/admin/blog/_form.html.twig new file mode 100644 index 00000000..13fe0346 --- /dev/null +++ b/templates/admin/blog/_form.html.twig @@ -0,0 +1,26 @@ +{# + By default, forms enable client-side validation. This means that you can't + test the server-side validation errors from the browser. To temporarily + disable this validation, add the 'novalidate' attribute: + + {{ form_start(form, {attr: {novalidate: 'novalidate'}}) }} +#} + +{% if show_confirmation|default(false) %} + {% set attr = {'data-confirmation': 'true'} %} + {{ include('blog/_delete_post_confirmation.html.twig') }} +{% endif %} + +{{ form_start(form, {attr: attr|default({})}) }} + {{ form_widget(form) }} + + + + {% if include_back_to_home_link|default(false) %} + + {{ 'action.back_to_list'|trans }} + + {% endif %} +{{ form_end(form) }} diff --git a/templates/admin/blog/edit.html.twig b/templates/admin/blog/edit.html.twig new file mode 100644 index 00000000..106c952f --- /dev/null +++ b/templates/admin/blog/edit.html.twig @@ -0,0 +1,29 @@ +{% extends 'admin/layout.html.twig' %} + +{% block body_id 'admin_post_edit' %} + +{% block main %} +

    {{ 'title.edit_post'|trans({'%id%': post.id}) }}

    + + {{ include('admin/blog/_form.html.twig', { + form: form, + button_label: 'action.save'|trans, + include_back_to_home_link: true, + }, with_context = false) }} +{% endblock %} + +{% block sidebar %} + + +
    + {{ include('admin/blog/_delete_form.html.twig', {post: post}, with_context = false) }} +
    + + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/admin/blog/index.html.twig b/templates/admin/blog/index.html.twig new file mode 100644 index 00000000..ddcefb9a --- /dev/null +++ b/templates/admin/blog/index.html.twig @@ -0,0 +1,55 @@ +{% extends 'admin/layout.html.twig' %} + +{% block body_id 'admin_post_index' %} + +{% block main %} +

    {{ 'title.post_list'|trans }}

    + + + + + + + + + + + {% for post in posts %} + + + {# it's not mandatory to set the timezone in localizeddate(). This is done to + avoid errors when the 'intl' PHP extension is not available and the application + is forced to use the limited "intl polyfill", which only supports UTC and GMT #} + + + + {% else %} + + + + {% endfor %} + +
    {{ 'label.title'|trans }} {{ 'label.published_at'|trans }} {{ 'label.actions'|trans }}
    {{ post.title }}{{ post.publishedAt|format_datetime('medium', 'short', '', 'UTC') }} + +
    {{ 'post.no_posts_found'|trans }}
    +{% endblock %} + +{% block sidebar %} + + + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/admin/blog/new.html.twig b/templates/admin/blog/new.html.twig new file mode 100644 index 00000000..de1dc470 --- /dev/null +++ b/templates/admin/blog/new.html.twig @@ -0,0 +1,29 @@ +{% extends 'admin/layout.html.twig' %} + +{% block body_id 'admin_post_new' %} + +{% block main %} +

    {{ 'title.post_new'|trans }}

    + + {{ form_start(form) }} + {{ form_row(form.title) }} + {{ form_row(form.summary) }} + {{ form_row(form.content) }} + {{ form_row(form.publishedAt) }} + {{ form_row(form.tags) }} + + + {{ form_widget(form.saveAndCreateNew, {label: 'label.save_and_create_new', attr: {class: 'btn btn-primary'}}) }} + + {{ 'action.back_to_list'|trans }} + + {{ form_end(form) }} +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/admin/blog/show.html.twig b/templates/admin/blog/show.html.twig new file mode 100644 index 00000000..c891e17c --- /dev/null +++ b/templates/admin/blog/show.html.twig @@ -0,0 +1,36 @@ +{% extends 'admin/layout.html.twig' %} + +{% block body_id 'admin_post_show' %} + +{% block main %} +

    {{ post.title }}

    + + + +
    +

    {{ 'label.summary'|trans }}: {{ post.summary }}

    +
    + + {{ post.content|markdown_to_html|sanitize_html }} + + {{ include('blog/_post_tags.html.twig') }} +{% endblock %} + +{% block sidebar %} + + +
    + {{ include('admin/blog/_delete_form.html.twig', {post: post}, with_context = false) }} +
    + + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/admin/layout.html.twig b/templates/admin/layout.html.twig new file mode 100644 index 00000000..92e55c10 --- /dev/null +++ b/templates/admin/layout.html.twig @@ -0,0 +1,31 @@ +{# + This is the base template of the all backend pages. Since this layout is similar + to the global layout, we inherit from it to just change the contents of some + blocks. In practice, backend templates are using a three-level inheritance, + showing how powerful, yet easy to use, is Twig's inheritance mechanism. + See https://symfony.com/doc/current/templates.html#template-inheritance-and-layouts +#} +{% extends 'base.html.twig' %} + +{% block stylesheets %} + {{ parent() }} + {{ encore_entry_link_tags('admin') }} +{% endblock %} + +{% block header_navigation_links %} +
  • + + {{ 'menu.post_list'|trans }} + +
  • +
  • + + {{ 'menu.back_to_blog'|trans }} + +
  • +{% endblock %} + +{% block javascripts %} + {{ parent() }} + {{ encore_entry_script_tags('admin') }} +{% endblock %} diff --git a/templates/base.html.twig b/templates/base.html.twig new file mode 100644 index 00000000..4a7a7093 --- /dev/null +++ b/templates/base.html.twig @@ -0,0 +1,162 @@ +{# + This is the base template used as the application layout which contains the + common elements and decorates all the other templates. + See https://symfony.com/doc/current/templates.html#template-inheritance-and-layouts +#} + + + + + + {% block title %}Symfony Demo application{% endblock %} + + {% block stylesheets %} + {{ encore_entry_link_tags('app') }} + {% endblock %} + + + + + + + {% block header %} +
    + +
    + {% endblock %} + +
    + {% block body %} +
    +
    + {{ include('default/_flash_messages.html.twig') }} + + {% block main %}{% endblock %} +
    + + +
    + {% endblock %} +
    + + {% block footer %} +
    +
    +
    + + +
    +
    +
    + {% endblock %} + + {% block javascripts %} + {{ encore_entry_script_tags('app') }} + {% endblock %} + + {# it's not mandatory to set the timezone in localizeddate(). This is done to + avoid errors when the 'intl' PHP extension is not available and the application + is forced to use the limited "intl polyfill", which only supports UTC and GMT #} + + + diff --git a/templates/blog/_comment_form.html.twig b/templates/blog/_comment_form.html.twig new file mode 100644 index 00000000..800a2fd5 --- /dev/null +++ b/templates/blog/_comment_form.html.twig @@ -0,0 +1,40 @@ +{# + By default, forms enable client-side validation. This means that you can't + test the server-side validation errors from the browser. To temporarily + disable this validation, add the 'novalidate' attribute: + + {{ form_start(form, {method: ..., action: ..., attr: {novalidate: 'novalidate'}}) }} +#} + +{{ form_start(form, {method: 'POST', action: path('comment_new', {'postSlug': post.slug})}) }} + {# instead of displaying form fields one by one, you can also display them + all with their default options and styles just by calling to this function: + + {{ form_widget(form) }} + #} + +
    + + {{ 'title.add_comment'|trans }} + + + {# Render any global form error (e.g. when a constraint on a public getter method failed) #} + {{ form_errors(form) }} + +
    + {{ form_label(form.content, 'label.content', {label_attr: {class: 'hidden'}}) }} + + {# Render any errors for the "content" field (e.g. when a class property constraint failed) #} + {{ form_errors(form.content) }} + + {{ form_widget(form.content, {attr: {rows: 10}}) }} + {{ form_help(form.content) }} +
    + +
    + +
    +
    +{{ form_end(form) }} diff --git a/templates/blog/_delete_post_confirmation.html.twig b/templates/blog/_delete_post_confirmation.html.twig new file mode 100644 index 00000000..3832c5e3 --- /dev/null +++ b/templates/blog/_delete_post_confirmation.html.twig @@ -0,0 +1,19 @@ +{# Bootstrap modal, see https://getbootstrap.com/docs/3.4/javascript/#modals #} + diff --git a/templates/blog/_post_tags.html.twig b/templates/blog/_post_tags.html.twig new file mode 100644 index 00000000..9a821515 --- /dev/null +++ b/templates/blog/_post_tags.html.twig @@ -0,0 +1,12 @@ +{% if not post.tags.empty %} + +{% endif %} + diff --git a/templates/blog/_rss.html.twig b/templates/blog/_rss.html.twig new file mode 100644 index 00000000..69d778b6 --- /dev/null +++ b/templates/blog/_rss.html.twig @@ -0,0 +1,5 @@ + diff --git a/templates/blog/about.html.twig b/templates/blog/about.html.twig new file mode 100644 index 00000000..2b0a629f --- /dev/null +++ b/templates/blog/about.html.twig @@ -0,0 +1,15 @@ +
    +
    +

    + {{ 'help.app_description'|trans|raw }} +

    +

    + {{ 'help.more_information'|trans|raw }} +

    +
    +
    + +{# it's not mandatory to set the timezone in localizeddate(). This is done to + avoid errors when the 'intl' PHP extension is not available and the application + is forced to use the limited "intl polyfill", which only supports UTC and GMT #} + diff --git a/templates/blog/comment_form_error.html.twig b/templates/blog/comment_form_error.html.twig new file mode 100644 index 00000000..67c2517b --- /dev/null +++ b/templates/blog/comment_form_error.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'comment_form_error' %} + +{% block main %} +

    {{ 'title.comment_error'|trans }}

    + +
    + {{ include('blog/_comment_form.html.twig') }} +
    +{% endblock %} diff --git a/templates/blog/index.html.twig b/templates/blog/index.html.twig new file mode 100644 index 00000000..21033ddd --- /dev/null +++ b/templates/blog/index.html.twig @@ -0,0 +1,59 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'blog_index' %} + +{% block main %} + {% for post in paginator.results %} +
    +

    + + {{ post.title }} + +

    + + + +

    {{ post.summary }}

    + + {{ include('blog/_post_tags.html.twig') }} +
    + {% else %} +
    {{ 'post.no_posts_found'|trans }}
    + {% endfor %} + + {% if paginator.hasToPaginate %} + + {% endif %} +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} + {{ include('blog/_rss.html.twig') }} +{% endblock %} diff --git a/templates/blog/index.xml.twig b/templates/blog/index.xml.twig new file mode 100644 index 00000000..9ed0331a --- /dev/null +++ b/templates/blog/index.xml.twig @@ -0,0 +1,25 @@ + + + + {{ 'rss.title'|trans }} + {{ 'rss.description'|trans }} + {{ 'now'|date('r', timezone='GMT') }} + {{ (paginator.results|last).publishedAt|default('now')|date('r', timezone='GMT') }} + {{ url('blog_index') }} + {{ app.request.locale }} + + {% for post in paginator.results %} + + {{ post.title }} + {{ post.summary }} + {{ url('blog_post', {'slug': post.slug}) }} + {{ url('blog_post', {'slug': post.slug}) }} + {{ post.publishedAt|date(format='r', timezone='GMT') }} + {{ post.author.email }} + {% for tag in post.tags %} + {{ tag.name }} + {% endfor %} + + {% endfor %} + + diff --git a/templates/blog/post_show.html.twig b/templates/blog/post_show.html.twig new file mode 100644 index 00000000..2bd86070 --- /dev/null +++ b/templates/blog/post_show.html.twig @@ -0,0 +1,77 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'blog_post_show' %} + +{% block main %} +

    {{ post.title }}

    + + + + {{ post.content|markdown_to_html|sanitize_html }} + + {{ include('blog/_post_tags.html.twig') }} + +
    + {# The 'IS_AUTHENTICATED_FULLY' role ensures that the user has entered + their credentials (login + password) during this session. If they + are automatically logged via the 'Remember Me' functionality, they won't + be able to add a comment. + See https://symfony.com/doc/current/security/remember_me.html#forcing-the-user-to-re-authenticate-before-accessing-certain-resources + #} + {% if is_granted('IS_AUTHENTICATED_FULLY') %} + {{ render(controller('App\\Controller\\BlogController::commentForm', {'id': post.id})) }} + {% else %} +

    + + {{ 'action.sign_in'|trans }} + + {{ 'post.to_publish_a_comment'|trans }} +

    + {% endif %} +
    + +

    + {{ 'post.num_comments'|trans({ 'count': post.comments|length }) }} +

    + + {% for comment in post.comments %} +
    + +

    + {{ comment.author.fullName }} {{ 'post.commented_on'|trans }} + {# it's not mandatory to set the timezone in localizeddate(). This is done to + avoid errors when the 'intl' PHP extension is not available and the application + is forced to use the limited "intl polyfill", which only supports UTC and GMT #} + {{ comment.publishedAt|format_datetime('medium', 'short', '', 'UTC') }} +

    +
    + {{ comment.content|markdown_to_html|sanitize_html }} +
    +
    + {% else %} +
    +

    {{ 'post.no_comments'|trans }}

    +
    + {% endfor %} +{% endblock %} + +{% block sidebar %} + {% if is_granted('edit', post) %} + + {% endif %} + + {# the parent() function includes the contents defined by the parent template + ('base.html.twig') for this block ('sidebar'). This is a very convenient way + to share common contents in different templates #} + {{ parent() }} + + {{ show_source_code(_self) }} + {{ include('blog/_rss.html.twig') }} +{% endblock %} diff --git a/templates/blog/search.html.twig b/templates/blog/search.html.twig new file mode 100644 index 00000000..f1ea3195 --- /dev/null +++ b/templates/blog/search.html.twig @@ -0,0 +1,31 @@ +{% extends 'base.html.twig' %} + +{% block javascripts %} + {{ parent() }} + {{ encore_entry_script_tags('search') }} +{% endblock %} + +{% block body_id 'blog_search' %} + +{% block main %} +
    +
    + +
    +
    + +
    +
    +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/bundles/TwigBundle/Exception/error.html.twig b/templates/bundles/TwigBundle/Exception/error.html.twig new file mode 100644 index 00000000..d76c3a7f --- /dev/null +++ b/templates/bundles/TwigBundle/Exception/error.html.twig @@ -0,0 +1,30 @@ +{# + This template is used to render any error different from 403, 404 and 500. + + This is the simplest way to customize error pages in Symfony applications. + In case you need it, you can also hook into the internal exception handling + made by Symfony. This allows you to perform advanced tasks and even recover + your application from some errors. + See https://symfony.com/doc/current/controller/error_pages.html +#} + +{% extends 'base.html.twig' %} + +{% block body_id 'error' %} + +{% block main %} +

    {{ 'http_error.name'|trans({ '%status_code%': status_code }) }}

    + +

    + {{ 'http_error.description'|trans({ '%status_code%': status_code }) }} +

    +

    + {{ 'http_error.suggestion'|trans({ '%url%': path('blog_index') })|raw }} +

    +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/bundles/TwigBundle/Exception/error403.html.twig b/templates/bundles/TwigBundle/Exception/error403.html.twig new file mode 100644 index 00000000..a7bf8f69 --- /dev/null +++ b/templates/bundles/TwigBundle/Exception/error403.html.twig @@ -0,0 +1,30 @@ +{# + This template is used to render errors of type HTTP 403 (Forbidden) + + This is the simplest way to customize error pages in Symfony applications. + In case you need it, you can also hook into the internal exception handling + made by Symfony. This allows you to perform advanced tasks and even recover + your application from some errors. + See https://symfony.com/doc/current/controller/error_pages.html +#} + +{% extends 'base.html.twig' %} + +{% block body_id 'error' %} + +{% block main %} +

    {{ 'http_error.name'|trans({ '%status_code%': 403 }) }}

    + +

    + {{ 'http_error_403.description'|trans }} +

    +

    + {{ 'http_error_403.suggestion'|trans }} +

    +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/bundles/TwigBundle/Exception/error404.html.twig b/templates/bundles/TwigBundle/Exception/error404.html.twig new file mode 100644 index 00000000..03e4316c --- /dev/null +++ b/templates/bundles/TwigBundle/Exception/error404.html.twig @@ -0,0 +1,30 @@ +{# + This template is used to render errors of type HTTP 404 (Not Found) + + This is the simplest way to customize error pages in Symfony applications. + In case you need it, you can also hook into the internal exception handling + made by Symfony. This allows you to perform advanced tasks and even recover + your application from some errors. + See https://symfony.com/doc/current/controller/error_pages.html +#} + +{% extends 'base.html.twig' %} + +{% block body_id 'error' %} + +{% block main %} +

    {{ 'http_error.name'|trans({ '%status_code%': 404 }) }}

    + +

    + {{ 'http_error_404.description'|trans }} +

    +

    + {{ 'http_error_404.suggestion'|trans({ '%url%': path('blog_index') })|raw }} +

    +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/bundles/TwigBundle/Exception/error500.html.twig b/templates/bundles/TwigBundle/Exception/error500.html.twig new file mode 100644 index 00000000..6f34bce6 --- /dev/null +++ b/templates/bundles/TwigBundle/Exception/error500.html.twig @@ -0,0 +1,35 @@ +{# + This template is used to render errors of type HTTP 500 (Internal Server Error) + + This is the simplest way to customize error pages in Symfony applications. + In case you need it, you can also hook into the internal exception handling + made by Symfony. This allows you to perform advanced tasks and even recover + your application from some errors. + See https://symfony.com/doc/current/controller/error_pages.html +#} + +{% extends 'base.html.twig' %} + +{% block stylesheets %} + {{ parent() }} + +{% endblock %} + +{% block body_id 'error' %} + +{% block main %} +

    {{ 'http_error.name'|trans({ '%status_code%': 500 }) }}

    + +

    + {{ 'http_error_500.description'|trans }} +

    +

    + {{ 'http_error_500.suggestion'|trans({ '%url%': path('blog_index') })|raw }} +

    +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/debug/source_code.html.twig b/templates/debug/source_code.html.twig new file mode 100644 index 00000000..b98f9898 --- /dev/null +++ b/templates/debug/source_code.html.twig @@ -0,0 +1,35 @@ +
    +

    + {{ 'help.show_code'|trans|raw }} +

    + + + + +
    diff --git a/templates/default/_flash_messages.html.twig b/templates/default/_flash_messages.html.twig new file mode 100644 index 00000000..2d889507 --- /dev/null +++ b/templates/default/_flash_messages.html.twig @@ -0,0 +1,32 @@ +{# + This is a template fragment designed to be included in other templates + See https://symfony.com/doc/current/templates.html#including-templates + + A common practice to better distinguish between templates and fragments is to + prefix fragments with an underscore. That's why this template is called + '_flash_messages.html.twig' instead of 'flash_messages.html.twig' +#} + +{# + The check is needed to prevent starting the session when looking for "flash messages": + https://symfony.com/doc/current/session.html#avoid-starting-sessions-for-anonymous-users + + TIP: With FOSHttpCache you can also adapt this to make it cache safe: + https://foshttpcachebundle.readthedocs.io/en/latest/features/helpers/flash-message.html +#} +{% if app.request.hasPreviousSession %} +
    + {% for type, messages in app.flashes %} + {% for message in messages %} + {# Bootstrap alert, see https://getbootstrap.com/docs/3.4/components/#alerts #} + + {% endfor %} + {% endfor %} +
    +{% endif %} diff --git a/templates/default/homepage.html.twig b/templates/default/homepage.html.twig new file mode 100644 index 00000000..354a70be --- /dev/null +++ b/templates/default/homepage.html.twig @@ -0,0 +1,44 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'homepage' %} + +{# + the homepage is a special page which displays neither a header nor a footer. + this is done with the 'trick' of defining empty Twig blocks without any content +#} +{% block header %}{% endblock %} +{% block footer %}{% endblock %} + +{% block body %} + + +
    +
    +
    +

    + {{ 'help.browse_app'|trans|raw }} +

    +

    + + {{ 'action.browse_app'|trans }} + +

    +
    +
    + +
    +
    +

    + {{ 'help.browse_admin'|trans|raw }} +

    +

    + + {{ 'action.browse_admin'|trans }} + +

    +
    +
    +
    +{% endblock %} diff --git a/templates/form/fields.html.twig b/templates/form/fields.html.twig new file mode 100644 index 00000000..f66070c1 --- /dev/null +++ b/templates/form/fields.html.twig @@ -0,0 +1,26 @@ +{# + Each field type is rendered by a template fragment, which is determined + by the name of your form type class (DateTimePickerType -> date_time_picker) + and the suffix "_widget". This can be controlled by overriding getBlockPrefix() + in DateTimePickerType. + + See https://symfony.com/doc/current/form/create_custom_field_type.html#creating-the-form-type-template +#} + +{% block date_time_picker_widget %} +
    + {{ block('datetime_widget') }} + + + +
    +{% endblock %} + +{% block tags_input_widget %} +
    + {{ form_widget(form, {'attr': {'data-toggle': 'tagsinput', 'data-tags': tags|json_encode}}) }} + + + +
    +{% endblock %} diff --git a/templates/form/layout.html.twig b/templates/form/layout.html.twig new file mode 100644 index 00000000..272bc28a --- /dev/null +++ b/templates/form/layout.html.twig @@ -0,0 +1,16 @@ +{% extends 'bootstrap_3_layout.html.twig' %} + +{# Errors #} + +{% block form_errors -%} + {% if errors|length > 0 -%} + {% if form is not rootform %}{% else %}
    {% endif %} +
      + {%- for error in errors -%} + {# use font-awesome icon library #} +
    • {{ error.message }}
    • + {%- endfor -%} +
    + {% if form is not rootform %}{% else %}
    {% endif %} + {%- endif %} +{%- endblock form_errors %} diff --git a/templates/security/login.html.twig b/templates/security/login.html.twig new file mode 100644 index 00000000..67465b21 --- /dev/null +++ b/templates/security/login.html.twig @@ -0,0 +1,94 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'login' %} + +{% block javascripts %} + {{ parent() }} + {{ encore_entry_script_tags('login') }} +{% endblock %} + +{% block main %} + {% if error %} +
    + {{ error.messageKey|trans(error.messageData, 'security') }} +
    + {% endif %} + +
    +
    +
    +
    +
    + {{ 'title.login'|trans }} +
    + + +
    +
    + + +
    + + + +
    +
    +
    +
    + +
    +

    + + {{ 'help.login_users'|trans }} +

    + + + + + + + + + + + + + + + + + + + + + +
    {{ 'label.username'|trans }}{{ 'label.password'|trans }}{{ 'label.role'|trans }}
    john_userkittenROLE_USER ({{ 'help.role_user'|trans }})
    jane_adminkittenROLE_ADMIN ({{ 'help.role_admin'|trans }})
    + +
    +
    +

    + {{ 'note'|trans }} + {{ 'help.reload_fixtures'|trans }}
    + + $ php bin/console doctrine:fixtures:load +

    + +

    + {{ 'tip'|trans }} + {{ 'help.add_user'|trans }}
    + + $ php bin/console app:add-user +

    +
    +
    +
    +
    +{% endblock %} + +{% block sidebar %} + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/user/change_password.html.twig b/templates/user/change_password.html.twig new file mode 100644 index 00000000..82421c75 --- /dev/null +++ b/templates/user/change_password.html.twig @@ -0,0 +1,29 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'user_password' %} + +{% block main %} +

    {{ 'title.change_password'|trans }}

    + + + + {{ form_start(form) }} + {{ form_widget(form) }} + + + {{ form_end(form) }} +{% endblock %} + +{% block sidebar %} + + + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/templates/user/edit.html.twig b/templates/user/edit.html.twig new file mode 100644 index 00000000..126635e3 --- /dev/null +++ b/templates/user/edit.html.twig @@ -0,0 +1,27 @@ +{% extends 'base.html.twig' %} + +{% block body_id 'user_edit' %} + +{% block main %} +

    {{ 'title.edit_user'|trans }}

    + + {{ form_start(form) }} + {{ form_widget(form) }} + + + {{ form_end(form) }} +{% endblock %} + +{% block sidebar %} + + + {{ parent() }} + + {{ show_source_code(_self) }} +{% endblock %} diff --git a/tests/Command/AddUserCommandTest.php b/tests/Command/AddUserCommandTest.php new file mode 100644 index 00000000..bbf3b93d --- /dev/null +++ b/tests/Command/AddUserCommandTest.php @@ -0,0 +1,124 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Command; + +use App\Command\AddUserCommand; +use App\Repository\UserRepository; +use Symfony\Bundle\FrameworkBundle\Console\Application; +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; +use Symfony\Component\Console\Tester\CommandTester; + +class AddUserCommandTest extends KernelTestCase +{ + private $userData = [ + 'username' => 'chuck_norris', + 'password' => 'foobar', + 'email' => 'chuck@norris.com', + 'full-name' => 'Chuck Norris', + ]; + + protected function setUp(): void + { + exec('stty 2>&1', $output, $exitcode); + $isSttySupported = 0 === $exitcode; + + if ('Windows' === PHP_OS_FAMILY || !$isSttySupported) { + $this->markTestSkipped('`stty` is required to test this command.'); + } + } + + /** + * @dataProvider isAdminDataProvider + * + * This test provides all the arguments required by the command, so the + * command runs non-interactively and it won't ask for any argument. + */ + public function testCreateUserNonInteractive(bool $isAdmin): void + { + $input = $this->userData; + if ($isAdmin) { + $input['--admin'] = 1; + } + $this->executeCommand($input); + + $this->assertUserCreated($isAdmin); + } + + /** + * @dataProvider isAdminDataProvider + * + * This test doesn't provide all the arguments required by the command, so + * the command runs interactively and it will ask for the value of the missing + * arguments. + * See https://symfony.com/doc/current/components/console/helpers/questionhelper.html#testing-a-command-that-expects-input + */ + public function testCreateUserInteractive(bool $isAdmin): void + { + $this->executeCommand( + // these are the arguments (only 1 is passed, the rest are missing) + $isAdmin ? ['--admin' => 1] : [], + // these are the responses given to the questions asked by the command + // to get the value of the missing required arguments + array_values($this->userData) + ); + + $this->assertUserCreated($isAdmin); + } + + /** + * This is used to execute the same test twice: first for normal users + * (isAdmin = false) and then for admin users (isAdmin = true). + */ + public function isAdminDataProvider(): ?\Generator + { + yield [false]; + yield [true]; + } + + /** + * This helper method checks that the user was correctly created and saved + * in the database. + */ + private function assertUserCreated(bool $isAdmin): void + { + $container = self::$container; + + /** @var \App\Entity\User $user */ + $user = $container->get(UserRepository::class)->findOneByEmail($this->userData['email']); + $this->assertNotNull($user); + + $this->assertSame($this->userData['full-name'], $user->getFullName()); + $this->assertSame($this->userData['username'], $user->getUsername()); + $this->assertTrue($container->get('security.password_encoder')->isPasswordValid($user, $this->userData['password'])); + $this->assertSame($isAdmin ? ['ROLE_ADMIN'] : ['ROLE_USER'], $user->getRoles()); + } + + /** + * This helper method abstracts the boilerplate code needed to test the + * execution of a command. + * + * @param array $arguments All the arguments passed when executing the command + * @param array $inputs The (optional) answers given to the command when it asks for the value of the missing arguments + */ + private function executeCommand(array $arguments, array $inputs = []): void + { + self::bootKernel(); + + // this uses a special testing container that allows you to fetch private services + $command = self::$container->get(AddUserCommand::class); + $command->setApplication(new Application(self::$kernel)); + + $commandTester = new CommandTester($command); + $commandTester->setInputs($inputs); + $commandTester->execute($arguments); + } +} diff --git a/tests/Controller/Admin/BlogControllerTest.php b/tests/Controller/Admin/BlogControllerTest.php new file mode 100644 index 00000000..722452f1 --- /dev/null +++ b/tests/Controller/Admin/BlogControllerTest.php @@ -0,0 +1,194 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Controller\Admin; + +use App\Repository\PostRepository; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; +use Symfony\Component\HttpFoundation\Response; + +/** + * Functional test for the controllers defined inside the BlogController used + * for managing the blog in the backend. + * + * See https://symfony.com/doc/current/testing.html#functional-tests + * + * Whenever you test resources protected by a firewall, consider using the + * technique explained in: + * https://symfony.com/doc/current/testing/http_authentication.html + * + * Execute the application tests using this command (requires PHPUnit to be installed): + * + * $ cd your-symfony-project/ + * $ ./vendor/bin/phpunit + */ +class BlogControllerTest extends WebTestCase +{ + /** + * @dataProvider getUrlsForRegularUsers + */ + public function testAccessDeniedForRegularUsers(string $httpMethod, string $url): void + { + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'john_user', + 'PHP_AUTH_PW' => 'kitten', + ]); + + $client->request($httpMethod, $url); + + $this->assertResponseStatusCodeSame(Response::HTTP_FORBIDDEN); + } + + public function getUrlsForRegularUsers(): ?\Generator + { + yield ['GET', '/en/admin/post/']; + yield ['GET', '/en/admin/post/1']; + yield ['GET', '/en/admin/post/1/edit']; + yield ['POST', '/en/admin/post/1/delete']; + } + + public function testAdminBackendHomePage(): void + { + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->request('GET', '/en/admin/post/'); + + $this->assertResponseIsSuccessful(); + $this->assertSelectorExists( + 'body#admin_post_index #main tbody tr', + 'The backend homepage displays all the available posts.' + ); + } + + /** + * This test changes the database contents by creating a new blog post. However, + * thanks to the DAMADoctrineTestBundle and its PHPUnit listener, all changes + * to the database are rolled back when this test completes. This means that + * all the application tests begin with the same database contents. + */ + public function testAdminNewPost(): void + { + $postTitle = 'Blog Post Title '.mt_rand(); + $postSummary = $this->generateRandomString(255); + $postContent = $this->generateRandomString(1024); + + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->request('GET', '/en/admin/post/new'); + $client->submitForm('Create post', [ + 'post[title]' => $postTitle, + 'post[summary]' => $postSummary, + 'post[content]' => $postContent, + ]); + + $this->assertResponseRedirects('/en/admin/post/', Response::HTTP_FOUND); + + /** @var \App\Entity\Post $post */ + $post = self::$container->get(PostRepository::class)->findOneByTitle($postTitle); + $this->assertNotNull($post); + $this->assertSame($postSummary, $post->getSummary()); + $this->assertSame($postContent, $post->getContent()); + } + + public function testAdminNewDuplicatedPost(): void + { + $postTitle = 'Blog Post Title '.mt_rand(); + $postSummary = $this->generateRandomString(255); + $postContent = $this->generateRandomString(1024); + + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $crawler = $client->request('GET', '/en/admin/post/new'); + $form = $crawler->selectButton('Create post')->form([ + 'post[title]' => $postTitle, + 'post[summary]' => $postSummary, + 'post[content]' => $postContent, + ]); + $client->submit($form); + + // post titles must be unique, so trying to create the same post twice should result in an error + $client->submit($form); + + $this->assertSelectorTextSame('form .form-group.has-error label', 'Title'); + $this->assertSelectorTextContains('form .form-group.has-error .help-block', 'This title was already used in another blog post, but they must be unique.'); + } + + public function testAdminShowPost(): void + { + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->request('GET', '/en/admin/post/1'); + + $this->assertResponseIsSuccessful(); + } + + /** + * This test changes the database contents by editing a blog post. However, + * thanks to the DAMADoctrineTestBundle and its PHPUnit listener, all changes + * to the database are rolled back when this test completes. This means that + * all the application tests begin with the same database contents. + */ + public function testAdminEditPost(): void + { + $newBlogPostTitle = 'Blog Post Title '.mt_rand(); + + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->request('GET', '/en/admin/post/1/edit'); + $client->submitForm('Save changes', [ + 'post[title]' => $newBlogPostTitle, + ]); + + $this->assertResponseRedirects('/en/admin/post/1/edit', Response::HTTP_FOUND); + + /** @var \App\Entity\Post $post */ + $post = self::$container->get(PostRepository::class)->find(1); + $this->assertSame($newBlogPostTitle, $post->getTitle()); + } + + /** + * This test changes the database contents by deleting a blog post. However, + * thanks to the DAMADoctrineTestBundle and its PHPUnit listener, all changes + * to the database are rolled back when this test completes. This means that + * all the application tests begin with the same database contents. + */ + public function testAdminDeletePost(): void + { + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $crawler = $client->request('GET', '/en/admin/post/1'); + $client->submit($crawler->filter('#delete-form')->form()); + + $this->assertResponseRedirects('/en/admin/post/', Response::HTTP_FOUND); + + $post = self::$container->get(PostRepository::class)->find(1); + $this->assertNull($post); + } + + private function generateRandomString(int $length): string + { + $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + + return mb_substr(str_shuffle(str_repeat($chars, ceil($length / mb_strlen($chars)))), 1, $length); + } +} diff --git a/tests/Controller/BlogControllerTest.php b/tests/Controller/BlogControllerTest.php new file mode 100644 index 00000000..b1500b2e --- /dev/null +++ b/tests/Controller/BlogControllerTest.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Controller; + +use App\Entity\Post; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; + +/** + * Functional test for the controllers defined inside BlogController. + * + * See https://symfony.com/doc/current/testing.html#functional-tests + * + * Execute the application tests using this command (requires PHPUnit to be installed): + * + * $ cd your-symfony-project/ + * $ ./vendor/bin/phpunit + */ +class BlogControllerTest extends WebTestCase +{ + public function testIndex(): void + { + $client = static::createClient(); + $crawler = $client->request('GET', '/en/blog/'); + + $this->assertResponseIsSuccessful(); + + $this->assertCount( + Post::NUM_ITEMS, + $crawler->filter('article.post'), + 'The homepage displays the right number of posts.' + ); + } + + public function testRss(): void + { + $client = static::createClient(); + $crawler = $client->request('GET', '/en/blog/rss.xml'); + + $this->assertResponseHeaderSame('Content-Type', 'text/xml; charset=UTF-8'); + + $this->assertCount( + Post::NUM_ITEMS, + $crawler->filter('item'), + 'The xml file displays the right number of posts.' + ); + } + + /** + * This test changes the database contents by creating a new comment. However, + * thanks to the DAMADoctrineTestBundle and its PHPUnit listener, all changes + * to the database are rolled back when this test completes. This means that + * all the application tests begin with the same database contents. + */ + public function testNewComment(): void + { + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'john_user', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->followRedirects(); + + // Find first blog post + $crawler = $client->request('GET', '/en/blog/'); + $postLink = $crawler->filter('article.post > h2 a')->link(); + + $client->click($postLink); + $crawler = $client->submitForm('Publish comment', [ + 'comment[content]' => 'Hi, Symfony!', + ]); + + $newComment = $crawler->filter('.post-comment')->first()->filter('div > p')->text(); + + $this->assertSame('Hi, Symfony!', $newComment); + } + + public function testAjaxSearch(): void + { + $client = static::createClient(); + $client->xmlHttpRequest('GET', '/en/blog/search', ['q' => 'lorem']); + + $results = json_decode($client->getResponse()->getContent(), true); + + $this->assertResponseHeaderSame('Content-Type', 'application/json'); + $this->assertCount(1, $results); + $this->assertSame('Lorem ipsum dolor sit amet consectetur adipiscing elit', $results[0]['title']); + $this->assertSame('Jane Doe', $results[0]['author']); + } +} diff --git a/tests/Controller/DefaultControllerTest.php b/tests/Controller/DefaultControllerTest.php new file mode 100644 index 00000000..0ffb8bbc --- /dev/null +++ b/tests/Controller/DefaultControllerTest.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Controller; + +use App\Entity\Post; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; +use Symfony\Component\HttpFoundation\Response; + +/** + * Functional test that implements a "smoke test" of all the public and secure + * URLs of the application. + * See https://symfony.com/doc/current/best_practices.html#smoke-test-your-urls. + * + * Execute the application tests using this command (requires PHPUnit to be installed): + * + * $ cd your-symfony-project/ + * $ ./vendor/bin/phpunit + */ +class DefaultControllerTest extends WebTestCase +{ + /** + * PHPUnit's data providers allow to execute the same tests repeated times + * using a different set of data each time. + * See https://symfony.com/doc/current/testing.html#testing-against-different-sets-of-data. + * + * @dataProvider getPublicUrls + */ + public function testPublicUrls(string $url): void + { + $client = static::createClient(); + $client->request('GET', $url); + + $this->assertResponseIsSuccessful(sprintf('The %s public URL loads correctly.', $url)); + } + + /** + * A good practice for tests is to not use the service container, to make + * them more robust. However, in this example we must access to the container + * to get the entity manager and make a database query. The reason is that + * blog post fixtures are randomly generated and there's no guarantee that + * a given blog post slug will be available. + */ + public function testPublicBlogPost(): void + { + $client = static::createClient(); + // the service container is always available via the test client + $blogPost = $client->getContainer()->get('doctrine')->getRepository(Post::class)->find(1); + $client->request('GET', sprintf('/en/blog/posts/%s', $blogPost->getSlug())); + + $this->assertResponseIsSuccessful(); + } + + /** + * The application contains a lot of secure URLs which shouldn't be + * publicly accessible. This tests ensures that whenever a user tries to + * access one of those pages, a redirection to the login form is performed. + * + * @dataProvider getSecureUrls + */ + public function testSecureUrls(string $url): void + { + $client = static::createClient(); + $client->request('GET', $url); + + $this->assertResponseRedirects( + 'http://localhost/en/login', + Response::HTTP_FOUND, + sprintf('The %s secure URL redirects to the login form.', $url) + ); + } + + public function getPublicUrls(): ?\Generator + { + yield ['/']; + yield ['/en/blog/']; + yield ['/en/login']; + } + + public function getSecureUrls(): ?\Generator + { + yield ['/en/admin/post/']; + yield ['/en/admin/post/new']; + yield ['/en/admin/post/1']; + yield ['/en/admin/post/1/edit']; + } +} diff --git a/tests/Controller/UserControllerTest.php b/tests/Controller/UserControllerTest.php new file mode 100644 index 00000000..47eb0de7 --- /dev/null +++ b/tests/Controller/UserControllerTest.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Controller; + +use App\Repository\UserRepository; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; +use Symfony\Component\HttpFoundation\Response; + +/** + * Functional test for the controllers defined inside the UserController used + * for managing the current logged user. + * + * See https://symfony.com/doc/current/testing.html#functional-tests + * + * Whenever you test resources protected by a firewall, consider using the + * technique explained in: + * https://symfony.com/doc/current/testing/http_authentication.html + * + * Execute the application tests using this command (requires PHPUnit to be installed): + * + * $ cd your-symfony-project/ + * $ ./vendor/bin/phpunit + */ +class UserControllerTest extends WebTestCase +{ + /** + * @dataProvider getUrlsForAnonymousUsers + */ + public function testAccessDeniedForAnonymousUsers(string $httpMethod, string $url): void + { + $client = static::createClient(); + $client->request($httpMethod, $url); + + $this->assertResponseRedirects( + 'http://localhost/en/login', + Response::HTTP_FOUND, + sprintf('The %s secure URL redirects to the login form.', $url) + ); + } + + public function getUrlsForAnonymousUsers(): ?\Generator + { + yield ['GET', '/en/profile/edit']; + yield ['GET', '/en/profile/change-password']; + } + + public function testEditUser(): void + { + $newUserEmail = 'admin_jane@symfony.com'; + + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->request('GET', '/en/profile/edit'); + $client->submitForm('Save changes', [ + 'user[email]' => $newUserEmail, + ]); + + $this->assertResponseRedirects('/en/profile/edit', Response::HTTP_FOUND); + + /** @var \App\Entity\User $user */ + $user = self::$container->get(UserRepository::class)->findOneByEmail($newUserEmail); + + $this->assertNotNull($user); + $this->assertSame($newUserEmail, $user->getEmail()); + } + + public function testChangePassword(): void + { + $newUserPassword = 'new-password'; + + $client = static::createClient([], [ + 'PHP_AUTH_USER' => 'jane_admin', + 'PHP_AUTH_PW' => 'kitten', + ]); + $client->request('GET', '/en/profile/change-password'); + $client->submitForm('Save changes', [ + 'change_password[currentPassword]' => 'kitten', + 'change_password[newPassword][first]' => $newUserPassword, + 'change_password[newPassword][second]' => $newUserPassword, + ]); + + $this->assertResponseRedirects( + '/en/logout', + Response::HTTP_FOUND, + 'Changing password logout the user.' + ); + } +} diff --git a/tests/Form/DataTransformer/TagArrayToStringTransformerTest.php b/tests/Form/DataTransformer/TagArrayToStringTransformerTest.php new file mode 100644 index 00000000..f826dd4f --- /dev/null +++ b/tests/Form/DataTransformer/TagArrayToStringTransformerTest.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Form\DataTransformer; + +use App\Entity\Tag; +use App\Form\DataTransformer\TagArrayToStringTransformer; +use App\Repository\TagRepository; +use PHPUnit\Framework\TestCase; + +/** + * Tests that tags are transformed correctly using the data transformer. + * + * See https://symfony.com/doc/current/testing/database.html + */ +class TagArrayToStringTransformerTest extends TestCase +{ + /** + * Ensures that tags are created correctly. + */ + public function testCreateTheRightAmountOfTags(): void + { + $tags = $this->getMockedTransformer()->reverseTransform('Hello, Demo, How'); + + $this->assertCount(3, $tags); + $this->assertSame('Hello', $tags[0]->getName()); + } + + /** + * Ensures that empty tags and errors in the number of commas are + * dealt correctly. + */ + public function testCreateTheRightAmountOfTagsWithTooManyCommas(): void + { + $transformer = $this->getMockedTransformer(); + + $this->assertCount(3, $transformer->reverseTransform('Hello, Demo,, How')); + $this->assertCount(3, $transformer->reverseTransform('Hello, Demo, How,')); + } + + /** + * Ensures that leading/trailing spaces are ignored for tag names. + */ + public function testTrimNames(): void + { + $tags = $this->getMockedTransformer()->reverseTransform(' Hello '); + + $this->assertSame('Hello', $tags[0]->getName()); + } + + /** + * Ensures that duplicated tag names are ignored. + */ + public function testDuplicateNames(): void + { + $tags = $this->getMockedTransformer()->reverseTransform('Hello, Hello, Hello'); + + $this->assertCount(1, $tags); + } + + /** + * Ensures that the transformer uses tags already persisted in the database. + */ + public function testUsesAlreadyDefinedTags(): void + { + $persistedTags = [ + $this->createTag('Hello'), + $this->createTag('World'), + ]; + $tags = $this->getMockedTransformer($persistedTags)->reverseTransform('Hello, World, How, Are, You'); + + $this->assertCount(5, $tags); + $this->assertSame($persistedTags[0], $tags[0]); + $this->assertSame($persistedTags[1], $tags[1]); + } + + /** + * Ensures that the transformation from Tag instances to a simple string + * works as expected. + */ + public function testTransform(): void + { + $persistedTags = [ + $this->createTag('Hello'), + $this->createTag('World'), + ]; + $transformed = $this->getMockedTransformer()->transform($persistedTags); + + $this->assertSame('Hello,World', $transformed); + } + + /** + * This helper method mocks the real TagArrayToStringTransformer class to + * simplify the tests. See https://phpunit.de/manual/current/en/test-doubles.html. + * + * @param array $findByReturnValues The values returned when calling to the findBy() method + */ + private function getMockedTransformer(array $findByReturnValues = []): TagArrayToStringTransformer + { + $tagRepository = $this->getMockBuilder(TagRepository::class) + ->disableOriginalConstructor() + ->getMock(); + $tagRepository->expects($this->any()) + ->method('findBy') + ->willReturn($findByReturnValues); + + return new TagArrayToStringTransformer($tagRepository); + } + + /** + * This helper method creates a Tag instance for the given tag name. + */ + private function createTag(string $name): Tag + { + $tag = new Tag(); + $tag->setName($name); + + return $tag; + } +} diff --git a/tests/Utils/ValidatorTest.php b/tests/Utils/ValidatorTest.php new file mode 100644 index 00000000..32efe9b7 --- /dev/null +++ b/tests/Utils/ValidatorTest.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Tests\Utils; + +use App\Utils\Validator; +use PHPUnit\Framework\TestCase; + +class ValidatorTest extends TestCase +{ + private $validator; + + protected function setUp(): void + { + $this->validator = new Validator(); + } + + public function testValidateUsername(): void + { + $test = 'username'; + + $this->assertSame($test, $this->validator->validateUsername($test)); + } + + public function testValidateUsernameEmpty(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The username can not be empty.'); + $this->validator->validateUsername(null); + } + + public function testValidateUsernameInvalid(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The username must contain only lowercase latin characters and underscores.'); + $this->validator->validateUsername('INVALID'); + } + + public function testValidatePassword(): void + { + $test = 'password'; + + $this->assertSame($test, $this->validator->validatePassword($test)); + } + + public function testValidatePasswordEmpty(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The password can not be empty.'); + $this->validator->validatePassword(null); + } + + public function testValidatePasswordInvalid(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The password must be at least 6 characters long.'); + $this->validator->validatePassword('12345'); + } + + public function testValidateEmail(): void + { + $test = '@'; + + $this->assertSame($test, $this->validator->validateEmail($test)); + } + + public function testValidateEmailEmpty(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The email can not be empty.'); + $this->validator->validateEmail(null); + } + + public function testValidateEmailInvalid(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The email should look like a real email.'); + $this->validator->validateEmail('invalid'); + } + + public function testValidateFullName(): void + { + $test = 'Full Name'; + + $this->assertSame($test, $this->validator->validateFullName($test)); + } + + public function testValidateFullNameEmpty() + { + $this->expectException('Exception'); + $this->expectExceptionMessage('The full name can not be empty.'); + $this->validator->validateFullName(null); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 00000000..d75b711f --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Component\Dotenv\Dotenv; + +require dirname(__DIR__).'/vendor/autoload.php'; + +if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) { + require dirname(__DIR__).'/config/bootstrap.php'; +} elseif (method_exists(Dotenv::class, 'bootEnv')) { + (new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); +} diff --git a/translations/messages+intl-icu.bg.xlf b/translations/messages+intl-icu.bg.xlf new file mode 100644 index 00000000..c5efa7ca --- /dev/null +++ b/translations/messages+intl-icu.bg.xlf @@ -0,0 +1,364 @@ + + + + + + note + БЕЛЕЖКА + + + tip + СЪВЕТ + + + not_available + Не е налично + + + mit_license + MIT лиценз + + + http_error.name + Грешка {status_code, number} + + + http_error.description + Има неизвестна грешка (HTTP {status_code, number}) , която спира изпълнението на заявката. + + + http_error.suggestion + се върни в началната страница.]]> + + + http_error_403.description + Нямате права за да достъпите този ресурс. + + + http_error_403.suggestion + Попитайте вашият мениджър или системен администратор да ви позволи достъп до този ресурс. + + + http_error_404.description + Страницата която търсите не е намерена. + + + http_error_404.suggestion + се върнете в началната страница.]]> + + + http_error_500.description + Възникна вътрешно сървърна грешка. + + + http_error_500.suggestion + се върнете в началната страница.]]> + + + title.homepage + Symfony Demo приложението]]> + + + title.source_code + Изходен код, използван за изобразяване на тази страница + + + title.controller_code + Код на контролера + + + title.twig_template_code + Twig темплейт код + + + title.login + Сигурен вход + + + title.post_list + Списък с публикации + + + title.edit_post + Редактиране на публикация #{id, number} + + + title.add_comment + Добавяне на коментар + + + title.comment_error + Възникна грешка докато се публикуваше вашият коментар + + + action.show + Покажи + + + action.show_post + Покажи публикацията + + + action.show_code + Покажи кода + + + action.edit + Редактирай + + + action.edit_post + Редактиране на публикация + + + action.save + Запази промените + + + action.delete_post + Изтрии публикацията + + + delete_post_modal.title + Сигурни ли сте, че искате да изтриете тази публикация? + + + delete_post_modal.body + Това действие не може да бъде отменено. + + + label.delete_post + Изтрии публикация + + + label.cancel + Отказ + + + action.create_post + Нова публикация + + + label.create_post + Създайте публикация + + + label.save_and_create_new + Запазване и създаване на нова + + + action.back_to_list + Върнете се в списъка с публикации + + + action.publish_comment + Публикуване на коментара + + + action.sign_in + Вход + + + action.browse_app + Прегледайте приложението + + + action.browse_admin + Прегледайте бекенда + + + label.title + Заглавие + + + label.author + Автор + + + label.author_email + Автор email + + + label.username + Потребителско има + + + label.password + Парола + + + label.role + Роля + + + label.content + Съдържание + + + label.summary + Обобщение + + + label.published_at + Публикувано на + + + label.tags + Тагове + + + label.actions + Деиствия + + + title.post_new + Създаване на публикация + + + action.edit_contents + Редактиране + + + menu.toggle_nav + Превключване на менюто + + + menu.choose_language + Изберете език + + + menu.post_list + Списък с публикации + + + menu.back_to_blog + Назад към блога + + + menu.homepage + Начална страница + + + menu.admin + Бекенд + + + menu.logout + Изход + + + menu.rss + Блог публикации RSS + + + menu.search + Търсене + + + post.to_publish_a_comment + за да публикувате коментар + + + post.num_comments + {count, plural, one {# коментар} other {# коментари}} + + + post.commented_on + коментирано на + + + post.no_comments + Бъдете първият, който ще напише коментар към публикациата. + + + post.no_posts_found + Не са намерени публикации. + + + post.created_successfully + Публикацията беше създадена успешно! + + + post.updated_successfully + Публикацията беше редактирана успешно! + + + post.deleted_successfully + Публикацията беше изтрита успешно! + + + post.search_for + Търсене за... + + + post.search_no_results + Няма намерени резултати + + + notification.comment_created + Публикацията ви получи коментар! + + + notification.comment_created.description + този линк]]> + + + help.app_description + примерно приложение създатено със Symfony Framework за да илюстрира препоръчителния начин за разработка със Symfony.]]> + + + help.show_code + Контролера и темплейта използвани за показването на тази страница.]]> + + + help.browse_app + публичната секция на примерното приложение.]]> + + + help.browse_admin + административният панел на примерното приложение.]]> + + + help.login_users + Опитайте някой от следните потребители + + + help.role_user + обикновен потребител + + + help.role_admin + администратор + + + help.reload_fixtures + Ако тези потребители не работят, презаредете приложението като използвате следната команда от терминала: + + + help.add_user + Ако искате да създадете нови потребители, изпълнете тази друга команда: + + + help.more_information + Symfony документацията.]]> + + + rss.title + Symfony Demo блог + + + rss.description + Най-новите публикации, публикувани на блога на Symfony Demo + + + + paginator.previous + Предишна + + + paginator.next + Следваща + + + + diff --git a/translations/messages+intl-icu.ca.xlf b/translations/messages+intl-icu.ca.xlf new file mode 100644 index 00000000..e533e2dd --- /dev/null +++ b/translations/messages+intl-icu.ca.xlf @@ -0,0 +1,261 @@ + + + + + + note + NOTA + + + tip + TRUC + + + not_available + No disponible + + + mit_license + Llicència MIT + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Codi font utilitzat per mostrar aquesta pàgina + + + title.controller_code + Codi del controlador + + + title.twig_template_code + Codi de la plantilla Twig + + + title.login + Accés segur + + + title.post_list + LListat d'articles + + + title.edit_post + Editar article #{id, number} + + + title.add_comment + Afegir un comentari + + + title.comment_error + S'ha produït un error al publicar el teu comentari + + + + action.show + Veure + + + action.show_code + Veure codi + + + action.edit + Editar + + + action.edit_post + Editar article + + + action.save + Guardar canvis + + + action.delete_post + Borrar article + + + delete_post_modal.title + Estas segur que vols eliminar aquest article? + + + delete_post_modal.body + Aquesta acció no es pot desfer. + + + label.delete_post + Borrar article + + + label.cancel + Cancel·lar + + + action.create_post + Crear un nou article + + + label.create_post + Crear article + + + action.back_to_list + Tornar al llistat d'articles + + + action.publish_comment + Publicar comentari + + + action.sign_in + Iniciar sessió + + + action.browse_app + Accedir a l'aplicació + + + action.browse_admin + Accedir al backend + + + + label.title + Títol + + + label.author + Autor + + + label.author_email + Email de l'autor + + + label.username + Nom d'usuari + + + label.password + Contrasenya + + + label.role + Rol + + + label.content + Contingut + + + label.summary + Resum + + + label.published_at + Publicat el + + + label.actions + Accions + + + title.post_new + Nou article + + + action.edit_contents + Editar contingut + + + + menu.post_list + Llistat d'articles + + + menu.back_to_blog + Tornar al blog + + + menu.homepage + Inici + + + menu.admin + Backend + + + menu.logout + Desconnectar-se + + + + post.to_publish_a_comment + per a publicar un comentari + + + post.num_comments + {count, plural, one {# comentari} other {# comentaris}} + + + post.commented_on + comentat el + + + post.no_comments + Sigues el primer en afegir un comentari a aquest article. + + + post.no_posts_found + No s'ha trobat cap article. + + + + help.app_description + aplicació demo ha estat programada amb el framework Symfony per mostrar la forma recomenada de programar aplicacions Symfony.]]> + + + help.show_code + controlador i de la plantilla utilitzats per crear aquesta pàgina.]]> + + + help.browse_app + part pública de l'aplicació de demostració.]]> + + + help.browse_admin + part d'administració de l'aplicació de demostració.]]> + + + help.login_users + Prova a accedir amb aquests usuaris + + + help.role_user + usuari normal + + + help.role_admin + administrador + + + help.reload_fixtures + Si cap d'aquests usuaris funciona, carrega de nou les dades de l'aplicació executant la següent ordre a la teva consola: + + + help.add_user + Si vols crear nous usuaris, executa aquesta altra ordre: + + + help.more_information + documentació de Symfony.]]> + + + + diff --git a/translations/messages+intl-icu.cs.xlf b/translations/messages+intl-icu.cs.xlf new file mode 100644 index 00000000..72ce8626 --- /dev/null +++ b/translations/messages+intl-icu.cs.xlf @@ -0,0 +1,258 @@ + + + + + + note + POZNÁMKA + + + tip + TIP + + + not_available + není dostupný + + + mit_license + MIT licence + + + + title.homepage + Symfony Demo aplikaci]]> + + + title.source_code + Zdrojové kódy použité při vykreslení této stránky + + + title.controller_code + Kód kontroleru + + + title.twig_template_code + Kód Twig šablony + + + title.login + Přihlášení + + + title.post_list + Seznam příspěvků + + + title.edit_post + Upravit příspěvek #{id, number} + + + title.add_comment + Přidat komentář + + + title.comment_error + Při vytváření komentáře došlo k chybě + + + + action.show + Zobrazit + + + action.show_code + Zobrazit zdrojáky + + + action.edit + Upravit + + + action.edit_post + Upravit příspěvek + + + action.save + Uložit změny + + + action.delete_post + Odstranit příspěvek + + + action.create_post + Nový příspěvek + + + label.create_post + Vytvořit příspěvek + + + action.back_to_list + Zpět na seznam příspěvků + + + action.publish_comment + Zveřejnit komentář + + + action.sign_in + Přihlásit + + + action.browse_app + Přejít do aplikace + + + action.browse_admin + Přejít do administrace + + + + label.title + Název + + + label.author + Autor + + + label.author_email + Email autora + + + label.username + Login + + + label.password + Heslo + + + label.role + Role + + + label.content + Obsah + + + label.summary + Shrnutí + + + label.published_at + Publikován + + + label.actions + Akce + + + title.post_new + Nový příspěvek + + + action.edit_contents + Upravit příspěvek + + + + menu.toggle_nav + Přepnout navigaci + + + menu.post_list + Seznam příspěvků + + + menu.back_to_blog + Zpět na blog + + + menu.homepage + Hlavní stránka + + + menu.admin + Administrace + + + menu.logout + Odhlásit + + + + post.to_publish_a_comment + se pro přidání komentáře + + + post.num_comments + {count, plural, one {# komentář} few {# komentáře} other {# komentářů}} + + + post.commented_on + přidal komentář v + + + post.no_comments + Buďte první, kdo napíše komentář k tomuto příspěvku. + + + post.no_posts_found + Nebyly nalezeny žádné příspěvky. + + + + help.app_description + demo aplikace vytvořena Symfony frameworkem s využitím doporučených způsobů vývoje Symfony aplikací.]]> + + + help.show_code + kontroleru a šablony použitých při vykreslení této stránky.]]> + + + help.browse_app + veřejnou část demo aplikace.]]> + + + help.browse_admin + administrační část demo aplikace.]]> + + + help.login_users + Zkuste následující uživatele + + + help.role_user + běžný uživatel + + + help.role_admin + administrátor + + + help.reload_fixtures + Pokud přihlášení s těmito uživateli nefunguje, spusťte z terminálu příkaz pro načtení výchozích dat: + + + help.add_user + Pokud chcete vytvořit nového uživatele, spusťte příkaz: + + + help.more_information + Symfony dokumentace.]]> + + + + paginator.previous + Předchozí + + + paginator.next + Další + + + + diff --git a/translations/messages+intl-icu.de.xlf b/translations/messages+intl-icu.de.xlf new file mode 100644 index 00000000..a7e3fd0f --- /dev/null +++ b/translations/messages+intl-icu.de.xlf @@ -0,0 +1,366 @@ + + + + + + note + HINWEIS + + + tip + TIPP + + + not_available + Nicht verfügbar + + + mit_license + MIT-Lizenz + + + + title.homepage + Symfony Demo Anwendung]]> + + + title.source_code + Benutzter Source Code um diese Seite zu rendern. + + + title.controller_code + Controller Code + + + title.twig_template_code + Twig Template Code + + + title.login + Sicherer Login + + + title.post_list + Beitragsliste + + + title.edit_post + Bearbeite Beitrag #{id, number} + + + title.add_comment + Kommentar hinzufügen + + + title.comment_error + Beim Veröffentlichen deines Kommentares ist ein Fehler aufgetreten + + + + action.show + Anzeigen + + + action.show_code + Code anzeigen + + + action.edit + Bearbeiten + + + action.edit_post + Beitrag bearbeiten + + + action.save + Änderungen speichern + + + action.delete_post + Beitrag löschen + + + delete_post_modal.title + Bist du sicher, dass du diesen Beitrag löschen möchtest? + + + delete_post_modal.body + Diese Aktion kann nicht rückgängig gemacht werden. + + + label.delete_post + Beitrag löschen + + + label.cancel + Abbrechen + + + action.create_post + Neuen Beitrag erstellen + + + label.create_post + Beitrag erstellen + + + label.save_and_create_new + Speichern und neuen Beitrag erstellen + + + action.back_to_list + Zurück zur Beitragsliste + + + action.publish_comment + Kommentar veröffentlichen + + + action.sign_in + Login + + + action.browse_app + Zum Frontend + + + action.browse_admin + Zum Backend + + + + label.title + Titel + + + label.author + Autor + + + label.author_email + Autor E-Mail + + + label.username + Benutzername + + + label.password + Passwort + + + label.role + Rolle + + + label.content + Inhalt + + + label.summary + Zusammenfassung + + + label.published_at + Veröffentlicht am + + + label.actions + Aktionen + + + title.post_new + Beitrag erstellen + + + action.edit_contents + Inhalt bearbeiten + + + + menu.toggle_nav + Navigation ein-/ausblenden + + + menu.post_list + Beitragsliste + + + menu.back_to_blog + Zurück zum Blog + + + menu.homepage + Homepage + + + menu.admin + Backend + + + menu.logout + Logout + + + + post.to_publish_a_comment + um einen Kommentar zu veröffentlichen + + + post.num_comments + {count, plural, one {# Kommentar} other {# Kommentare}} + + + post.commented_on + kommentierte + + + post.no_comments + Hinterlasse als Erste/r einen Kommentar zu diesem Beitrag. + + + post.no_posts_found + Keine Beiträge gefunden. + + + post.created_successfully + Der Beitrag wurde erfolgreich erstellt! + + + post.updated_successfully + Der Beitrag wurde erfolgreich bearbeitet! + + + post.deleted_successfully + Der Beitrag wurde erfolgreich gelöscht! + + + post.search_for + Suchen nach... + + + + help.app_description + Demo Applikation, die mit dem Symfony Framework gebaut wurde um eine Empfehlung für die Entwicklung auszusprechen.]]> + + + help.show_code + Controller und Template zu sehen der für das Rendern dieser Seite benutzt wird.]]> + + + help.browse_app + Frontend der Demo Applikation.]]> + + + help.browse_admin + Backend der Demo Applikation.]]> + + + help.login_users + Versuche einen der folgenden Benutzer + + + help.role_user + Normaler Benutzer + + + help.role_admin + Administrator + + + help.reload_fixtures + Wenn keiner der Benutzer funktioniert versuche bitte die Fixtures mit folgendem Befehl auf der Kommandozeile neu einzuspielen: + + + help.add_user + Wenn du einen neuen Benutzer erstellen willst benutzte diesen Befehl: + + + help.more_information + Symfony Dokumentation.]]> + + + action.show_post + Beitrag anzeigen + + + rss.title + Blog + + + menu.choose_language + Sprache wählen + + + rss.description + Die neuesten Posts, die auf dem Symfony Blog veröffentlicht wurden. + + + menu.rss + Blog Posts RSS + + + menu.search + Suchen + + + label.tags + Tags + + + http_error.name + Fehler {status_code, number} + + + http_error.description + Ein unbekannter Fehler (HTTP {status_code, number}) ist aufgetreten. Deine Anfrage konnte deswegen nicht ausgeführt werden. + + + http_error.suggestion + gehe zurück zur Homepage.]]> + + + http_error_403.description + Du hast keine Berechtigung, auf diese Ressource zuzugreifen. + + + http_error_403.suggestion + Frage deinen Manager oder Systemadministrator, um dir Zugriff auf diese Ressource zu gewähren. + + + http_error_404.description + Wir konnten die von dir angeforderte Seite nicht finden. + + + http_error_404.suggestion + gehe zurück zur Homepage.]]> + + + http_error_500.description + Es gab einen internen Serverfehler. + + + http_error_500.suggestion + gehe zurück zur Homepage.]]> + + + notification.comment_created + Dein Beitrag hat einen Kommentar erhalten! + + + notification.comment_created.description + diesem Link folgst.]]> + + + + paginator.previous + Vorherige + + + paginator.next + Nächste + + + + diff --git a/translations/messages+intl-icu.en.xlf b/translations/messages+intl-icu.en.xlf new file mode 100644 index 00000000..74b0f574 --- /dev/null +++ b/translations/messages+intl-icu.en.xlf @@ -0,0 +1,443 @@ + + + + + + note + NOTE + + + tip + TIP + + + not_available + Not available + + + mit_license + MIT License + + + + http_error.name + Error {status_code, number} + + + http_error.description + There was an unknown error (HTTP {status_code, number}) that prevented to complete your request. + + + http_error.suggestion + go back to the homepage.]]> + + + http_error_403.description + You don't have permission to access to this resource. + + + http_error_403.suggestion + Ask your manager or system administrator to grant you access to this resource. + + + http_error_404.description + We couldn't find the page you requested. + + + http_error_404.suggestion + go back to the homepage.]]> + + + http_error_500.description + There was an internal server error. + + + http_error_500.suggestion + go back to the homepage.]]> + + + + title.homepage + Symfony Demo application]]> + + + title.source_code + Source code used to render this page + + + title.controller_code + Controller code + + + title.twig_template_code + Twig template code + + + title.login + Secure Sign in + + + title.post_list + Post List + + + title.edit_post + Edit post #{id, number} + + + title.add_comment + Add a comment + + + title.comment_error + There was an error publishing your comment + + + title.edit_user + Edit user + + + title.change_password + Change password + + + + action.show + Show + + + action.show_post + Show post + + + action.show_code + Show code + + + action.edit + Edit + + + action.edit_post + Edit post + + + action.save + Save changes + + + action.delete_post + Delete post + + + delete_post_modal.title + Are you sure you want to delete this post? + + + delete_post_modal.body + This action cannot be undone. + + + label.delete_post + Delete post + + + label.cancel + Cancel + + + action.create_post + Create a new post + + + label.create_post + Create post + + + label.save_and_create_new + Save and create new + + + action.back_to_list + Back to the post list + + + action.publish_comment + Publish comment + + + action.sign_in + Sign in + + + action.browse_app + Browse application + + + action.browse_admin + Browse backend + + + action.edit_user + Edit user + + + action.change_password + Change password + + + + label.title + Title + + + label.author + Author + + + label.author_email + Author email + + + label.username + Username + + + label.fullname + Fullname + + + label.email + Email + + + label.password + Password + + + label.current_password + Current password + + + label.new_password + New password + + + label.new_password_confirm + Confirm password + + + label.role + Role + + + label.content + Content + + + label.summary + Summary + + + label.published_at + Published at + + + label.tags + Tags + + + label.actions + Actions + + + title.post_new + Post creation + + + action.edit_contents + Edit contents + + + + menu.toggle_nav + Toggle navigation + + + menu.choose_language + Choose language + + + menu.post_list + Post list + + + menu.back_to_blog + Back to blog + + + menu.homepage + Homepage + + + menu.admin + Backend + + + menu.user + Account + + + menu.logout + Logout + + + menu.rss + Blog Posts RSS + + + menu.search + Search + + + + post.to_publish_a_comment + to publish a comment + + + post.num_comments + {count, plural, one {# comment} other {# comments}} + + + post.commented_on + commented on + + + post.no_comments + Be the first to comment on this post. + + + post.no_posts_found + No posts found. + + + post.created_successfully + Post created successfully! + + + post.updated_successfully + Post updated successfully! + + + post.deleted_successfully + Post deleted successfully! + + + post.search_for + Search for... + + + post.search_no_results + No results found + + + + user.updated_successfully + User updated successfully! + + + + notification.comment_created + Your post received a comment! + + + notification.comment_created.description + this link]]> + + + + help.app_description + demo application built in the Symfony Framework to illustrate the recommended way of developing Symfony applications.]]> + + + help.show_code + Controller and template used to render this page.]]> + + + help.browse_app + public section of the demo application.]]> + + + help.browse_admin + admin backend of the demo application.]]> + + + help.login_users + Try either of the following users + + + help.role_user + regular user + + + help.role_admin + administrator + + + help.reload_fixtures + If these users don't work, reload application fixtures by running this command from the terminal: + + + help.add_user + If you want to create new users, run this other command: + + + help.more_information + Symfony doc.]]> + + + help.post_summary + Summaries can't contain Markdown or HTML contents; only plain text. + + + help.post_publication + Set the date in the future to schedule the blog post publication. + + + help.post_content + Use Markdown to format the blog post contents. HTML is allowed too. + + + help.comment_content + Comments not complying with our Code of Conduct will be moderated. + + + + info.change_password + After changing your password, you will be logged out of the application. + + + + rss.title + Symfony Demo blog + + + rss.description + Most recent posts published on the Symfony Demo blog + + + + paginator.previous + Previous + + + paginator.next + Next + + + paginator.current + (current) + + + + diff --git a/translations/messages+intl-icu.es.xlf b/translations/messages+intl-icu.es.xlf new file mode 100644 index 00000000..f4a77ff0 --- /dev/null +++ b/translations/messages+intl-icu.es.xlf @@ -0,0 +1,371 @@ + + + + + + note + NOTA + + + tip + TRUCO + + + not_available + No disponible + + + mit_license + Licencia MIT + + + + http_error.name + Error {status_code, number} + + + http_error.description + Se ha producido un error desconocido (HTTP {status_code, number}) que ha impedido completar tu petición. + + + http_error.suggestion + vuelve a la portada del sitio.]]> + + + http_error_403.description + No tienes permiso para acceder a este recurso. + + + http_error_403.suggestion + Solicita a los administradores de este sitio que te concedan permiso para acceder al recurso solicitado. + + + http_error_404.description + No hemos podido encontrar la página solicitada. + + + http_error_404.suggestion + vuelve a la portada del sitio.]]> + + + http_error_500.description + Se ha producido un error grave en el servidor. + + + http_error_500.suggestion + vuelve a la portada del sitio.]]> + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Código fuente utilizado para mostrar esta página + + + title.controller_code + Código del controlador + + + title.twig_template_code + Código de la plantilla Twig + + + title.login + Acceso seguro + + + title.post_list + Listado de artículos + + + title.edit_post + Editar artículo #{id, number} + + + title.add_comment + Añadir un comentario + + + title.comment_error + Se ha producido un error al publicar tu comentario + + + + action.show + Ver + + + action.show_code + Ver código + + + action.edit + Editar + + + action.edit_post + Editar artículo + + + action.save + Guardar cambios + + + action.delete_post + Borrar artículo + + + delete_post_modal.title + ¿Está seguro que quiere eliminar este artículo? + + + delete_post_modal.body + Esta acción no se puede deshacer. + + + label.delete_post + Borrar artículo + + + label.cancel + Cancelar + + + action.create_post + Crear un nuevo artículo + + + label.create_post + Crear artículo + + + label.save_and_create_new + Guardar artículo y crear otro + + + action.back_to_list + Volver al listado de artículos + + + action.publish_comment + Publicar comentario + + + action.sign_in + Iniciar sesión + + + action.browse_app + Acceder a la aplicación + + + action.browse_admin + Acceder al backend + + + + label.title + Título + + + label.author + Autor + + + label.author_email + Email del autor + + + label.username + Nombre de usuario + + + label.password + Contraseña + + + label.role + Rol + + + label.content + Contenido + + + label.summary + Resumen + + + label.published_at + Publicado el + + + label.tags + Etiquetas + + + label.actions + Acciones + + + title.post_new + Nuevo artículo + + + action.edit_contents + Editar contenidos + + + + menu.toggle_nav + Turnar navegación + + + menu.choose_language + Seleccionar idioma + + + menu.post_list + Listado de artículos + + + menu.back_to_blog + Volver al blog + + + menu.homepage + Inicio + + + menu.admin + Backend + + + menu.logout + Desconectarse + + + + post.to_publish_a_comment + para publicar un comentario + + + post.num_comments + {count, plural, one {# comentario} other {# comentarios}} + + + post.commented_on + comentado el + + + post.no_comments + Se el primero en añadir un comentario en este artículo. + + + post.no_posts_found + No se ha encontrado ningún artículo. + + + + help.app_description + aplicación demo ha sido programada con el framework Symfony para mostrar la forma recomendada de programar aplicaciones Symfony.]]> + + + help.show_code + controlador y de la plantilla utilizados para crear esta página.]]> + + + help.browse_app + parte pública de la aplicación de demostración.]]> + + + help.browse_admin + parte de administración de la aplicación.]]> + + + help.login_users + Prueba a acceder con estos usuarios + + + help.role_user + usuario normal + + + help.role_admin + administrador + + + help.reload_fixtures + Si ninguno de estos usuarios funciona, carga de nuevo los datos de la aplicación ejecutando el siguiente comando en tu consola: + + + help.add_user + Si quieres crear nuevos usuarios, ejecuta este otro comando: + + + help.more_information + documentación de Symfony.]]> + + + action.show_post + Mostrar artículo + + + menu.rss + RSS del blog + + + menu.search + Buscar + + + post.created_successfully + ¡Artículo creado con éxito! + + + post.updated_successfully + ¡Artículo actualizado con éxito! + + + post.deleted_successfully + ¡Artículo eliminado con éxito! + + + post.search_for + Buscar... + + + post.search_no_results + No se encontraron resultados + + + notification.comment_created + ¡Su artículo recibió un comentario! + + + notification.comment_created.description + este enlace]]> + + + rss.title + Blog de Symfony Demo + + + rss.description + Publicaciones más recientes publicadas en el blog de Symfony Demo + + + + paginator.previous + Anterior + + + paginator.next + Siguiente + + + + diff --git a/translations/messages+intl-icu.fr.xlf b/translations/messages+intl-icu.fr.xlf new file mode 100644 index 00000000..076c01e7 --- /dev/null +++ b/translations/messages+intl-icu.fr.xlf @@ -0,0 +1,439 @@ + + + + + + note + NOTE + + + tip + ASTUCE + + + not_available + Indisponible + + + mit_license + Licence MIT + + + + http_error.name + Erreur {status_code, number} + + + http_error.description + Il y a eu une erreur inconnue (HTTP {status_code, number}) qui a empêché l'aboutissement de votre requête. + + + http_error.suggestion + retournez sur la page principale.]]> + + + http_error_403.description + Vous n'avez pas les droits pour accéder à cette ressource. + + + http_error_403.suggestion + Demandez à votre manager ou à votre administrateur système de vous donner les droits pour accéder à cette ressource. + + + http_error_404.description + Nous n'avons pas pu trouver la page demandée. + + + http_error_404.suggestion + retournez sur la page principale.]]> + + + http_error_500.description + Il y a eu une erreur interne du serveur. + + + http_error_500.suggestion + retournez sur la page principale.]]> + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Le code source utilisé pour afficher cette page + + + title.controller_code + Code du contrôleur + + + title.twig_template_code + Code du template Twig + + + title.login + Connexion sécurisée + + + title.post_list + Liste des articles + + + title.edit_post + Modifier l'article #{id, number} + + + title.add_comment + Laisser un commentaire + + + title.comment_error + Il y a eu une erreur lors de la publication de votre commentaire. + + + title.edit_user + Modifier l'utilisateur + + + title.change_password + Modifier le mot de passe + + + + action.show + Voir + + + action.show_post + Voir l'article + + + action.show_code + Voir le code + + + action.edit + Editer + + + action.edit_post + Modifier l'article + + + action.save + Enregistrer + + + action.delete_post + Supprimer l'article + + + delete_post_modal.title + Êtes-vous sûr de vouloir supprimer ce post ? + + + delete_post_modal.body + Cette action ne peut pas être annulée. + + + label.delete_post + Supprimer l'article + + + label.cancel + Annuler + + + label.create_post + Créer un article + + + action.create_post + Créer un nouvel article + + + label.save_and_create_new + Enregistrer et créer un nouveau + + + action.back_to_list + Retour à la liste des articles + + + action.publish_comment + Publier + + + action.sign_in + Connectez-vous + + + action.browse_app + Naviguer sur l'application + + + action.browse_admin + Naviguer sur l'admin + + + action.edit_user + Modifier l'utilisateur + + + action.change_password + Modifier le mot de passe + + + + label.title + Titre + + + label.author + Auteur + + + label.author_email + Mail de l'auteur + + + label.username + Identifiant + + + label.fullname + Nom complet + + + label.email + Mail + + + label.password + Mot de passe + + + label.current_password + Mot de passe actuel + + + label.new_password + Nouveau mot de passe + + + label.new_password_confirm + Confirmer le mot de passe + + + label.role + Rôle + + + label.content + Contenu + + + label.summary + Résumé + + + label.published_at + Publié le + + + label.tags + Tags + + + label.actions + Actions + + + title.post_new + Ajouter un nouvel article + + + action.edit_contents + Modifier le contenu + + + + menu.toggle_nav + Activer ou désactiver la navigation + + + menu.choose_language + Choisir la langue + + + menu.post_list + Liste des articles + + + menu.back_to_blog + Retour au blog + + + menu.homepage + Accueil + + + menu.admin + Admin + + + menu.user + Compte + + + menu.logout + Déconnexion + + + menu.rss + Blog Posts RSS + + + menu.search + Recherche + + + + post.to_publish_a_comment + pour publier un commentaire + + + post.num_comments + {count, plural, one {# commentaire} other {# commentaires}} + + + post.commented_on + commenté le + + + post.no_comments + Soyez le premier à commenter cet article. + + + post.no_posts_found + Aucun article trouvé. + + + post.created_successfully + Article créé avec succès ! + + + post.updated_successfully + Article mis à jour avec succès ! + + + post.deleted_successfully + Article supprimé avec succès ! + + + post.search_for + Rechercher... + + + post.search_no_results + Aucun résultat + + + + user.updated_successfully + Informations mises à jour avec succès ! + + + + notification.comment_created + Votre article a reçu un commentaire ! + + + notification.comment_created.description + ce lien]]> + + + + help.app_description + application de démonstration construite avec le framework Symfony pour illustrer la façon recommandée de développer des applications Symfony.]]> + + + help.show_code + contrôleur et du template utilisé pour afficher cette page.]]> + + + help.browse_app + section publique de l'application de démonstration.]]> + + + help.browse_admin + interface d'administration de l'application de démonstration.]]> + + + help.login_users + Essayez l'un des utilisateurs suivants + + + help.role_user + utilisateur normal + + + help.role_admin + administrateur + + + help.reload_fixtures + Si ces utilisateurs ne fonctionnent pas, rechargez les fixtures de l'application en exécutant cette commande depuis le terminal : + + + help.add_user + Si vous voulez créer de nouveaux utilisateurs, exécutez cette autre commande : + + + help.more_information + documentation de Symfony.]]> + + + help.post_summary + Les résumés ne peuvent pas contenir de contenu Markdown ou HTML ; seulement du texte brut. + + + help.post_publication + Sélectionnez une date future pour programmer la publication de l'article. + + + help.post_content + Utilisez du Markdown pour formater le contenu de l'article. Le HTML est également autorisé. + + + help.comment_content + Les commentaires non conformes à notre code de conduite seront modérés. + + + + info.change_password + Après avoir modifié votre mot de passe, vous serez déconnecté de l'application. + + + + rss.title + Blog de démo Symfony + + + rss.description + Derniers articles publiés sur le blog de démo Symfony + + + + paginator.previous + Précédent + + + paginator.next + Suivant + + + + diff --git a/translations/messages+intl-icu.hr.xlf b/translations/messages+intl-icu.hr.xlf new file mode 100644 index 00000000..d0f7a61b --- /dev/null +++ b/translations/messages+intl-icu.hr.xlf @@ -0,0 +1,344 @@ + + + + + + note + BILJEŠKA + + + tip + SAVJET + + + not_available + Nedostupno + + + mit_license + Licenca MIT + + + + http_error.name + Greška {status_code, number} + + + http_error.description + Desila se nepoznata greška (HTTP {status_code, number}), koja je spriječila završetak zahtjeva. + + + http_error.suggestion + se vratite na početnu stranicu.]]> + + + http_error_403.description + Nemate pravo pristupa ovom izvoru. + + + http_error_403.suggestion + Zatražite dozvolu od vašeg menadžera ili administratora sustava kako bi pristupili ovom izvoru. + + + http_error_404.description + Nismo pronašli zatraženu stranicu. + + + http_error_404.suggestion + se vratite na početnu stranicu.]]> + + + http_error_500.description + Došlo je do unutarnje greške kod poslužitelja. + + + http_error_500.suggestion + se vratite na početnu stranicu.]]> + + + title.homepage + Symfony Demo web aplikaciju]]> + + + title.source_code + Izvorni kod korišten tokom izvršavanja ove stranice + + + title.controller_code + Izvorni kod kontrolora + + + title.twig_template_code + Izvorni kod Twig predloška + + + title.login + Prijava korisnika + + + title.post_list + Popis članaka + + + title.edit_post + Uredi članak #{id, number} + + + title.add_comment + Dodaj komentar + + + title.comment_error + Došlo je do greške kod objave vašeg komentara + + + action.show + Prikaži + + + action.show_code + Prikaži izvorni kod + + + action.edit + Uredi + + + action.edit_post + Uredi članak + + + action.save + Spremi promjene + + + action.delete_post + Izbriši članak + + + delete_post_modal.title + Jeste li sigurni da želite pobrisati odabrani članak? + + + delete_post_modal.body + Ova radnja nemože biti poništena. + + + label.delete_post + Izbriši članak + + + label.cancel + Otkaži + + + action.create_post + Stvori novi članak + + + label.create_post + Stvori članak + + + label.save_and_create_new + Ažuriraj i napravi novi + + + action.back_to_list + Nazad na izlist + + + action.publish_comment + Objavi komentar + + + action.sign_in + Prijavi se + + + action.browse_app + Posjeti aplikaciju + + + action.browse_admin + Posjeti pozadinu + + + label.title + Naslov + + + label.author + Autor + + + label.author_email + E-mail adresa autora + + + label.username + Korisničko ime + + + label.password + Lozinka + + + label.role + Uloga + + + label.content + Sadržaj + + + label.summary + Sažetak + + + label.published_at + Objavljeno + + + label.tags + Oznake + + + label.actions + Radnje + + + title.post_new + Novi članak + + + action.edit_contents + Uredi sadržaj + + + menu.toggle_nav + Sakrij/Pokaži navigaciju + + + menu.choose_language + Odaberi jezik + + + menu.post_list + Izlist članaka + + + menu.back_to_blog + Nazad na blog + + + menu.homepage + Početna stranica + + + menu.admin + Pozadina + + + menu.logout + Odjavi se + + + menu.rss + RSS Blog Članaka + + + + post.to_publish_a_comment + u svrhu objave komentara + + + post.num_comments + {count, plural, one {# komentar} few {# komentara} other {# komentara}} + + + post.commented_on + komentirao dana + + + post.no_comments + Budi prvi koji će kometirati ovaj članak. + + + post.no_posts_found + Niti jedan članak pronađen. + + + post.created_successfully + Članak uspješno napravljen! + + + post.updated_successfully + Članak uspješno ažuriran! + + + post.deleted_successfully + Članak uspješno pobrisan! + + + + notification.comment_created + Vaš članak je komentiran! + + + notification.comment_created.description + ovu poveznicu]]> + + + + help.app_description + demo web aplikacija napravljena unutar Symfony okvirne tehnologije, služi kako bi pokazala preporučeni način korištenja Symfony okvirne tehnologije.]]> + + + help.show_code + Kontrolora i Predloška korištenog prilikom stvaranja ove stranice.]]> + + + help.browse_app + javni odjeljak demo aplikacije.]]> + + + help.browse_admin + administrativni odjeljak demo aplikacije.]]> + + + help.login_users + Pokušaj sa jednim od sljedećih korisnika + + + help.role_user + uobičajen korisnik + + + help.role_admin + administrator + + + help.reload_fixtures + Ukoliko ovi korisnici ne funkcioniraju, ponovno učitajte fixture/instalaciju podataka aplikacije tako što ćete pokrenuti sljedeću naredbu unutar konzole: + + + help.add_user + Ukoliko želite stvoriti nove korisnike, pokrenite sljedeću naredbu: + + + help.more_information + Symfony dokumentaciju.]]> + + + + rss.title + Symfony Demo blog + + + rss.description + Najnoviji članci objavljeni na Symfony Demo Blog aplikaciji + + + + diff --git a/translations/messages+intl-icu.id.xlf b/translations/messages+intl-icu.id.xlf new file mode 100644 index 00000000..85482685 --- /dev/null +++ b/translations/messages+intl-icu.id.xlf @@ -0,0 +1,250 @@ + + + + + + note + CATATAN + + + tip + TIPS + + + not_available + Tidak tersedia + + + mit_license + MIT License + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Kode yang digunakan untuk membuat halaman ini + + + title.controller_code + Kode di Controller + + + title.twig_template_code + Kode Twig template + + + title.login + Secure Sign in + + + title.post_list + Daftar Posting + + + title.edit_post + Sunting posting #{id, number} + + + title.add_comment + Tambahkan komentar + + + title.comment_error + Ada kesalahan penerbitan komentar Anda + + + + action.show + Tampilkan + + + action.show_code + Tampilkan Kode + + + action.edit + Sunting + + + action.edit_post + Sunting Posting + + + action.save + Simpan perubahan + + + action.delete_post + Hapus posting + + + action.create_post + Buat posting baru + + + label.create_post + Buat posting + + + action.back_to_list + Kembali Ke daftar posting + + + action.publish_comment + Terbitkan komentar + + + action.sign_in + Masuk + + + action.browse_app + Jelajah aplikasi + + + action.browse_admin + Jelajah backend + + + + label.title + Judul + + + label.author + Penulis + + + label.author_email + Email penulis + + + label.username + Nama Pengguna + + + label.password + Kata Sandi + + + label.role + Peranan + + + label.content + Konten + + + label.summary + Ringkasan + + + label.published_at + Diterbitkan pada + + + label.actions + Tindakan + + + title.post_new + Pembuatan Posting + + + action.edit_contents + Sunting konten + + + + menu.post_list + Daftar posting + + + menu.back_to_blog + Kembali ke blog + + + menu.homepage + Beranda + + + menu.admin + Backend + + + menu.logout + Keluar + + + + post.to_publish_a_comment + untuk menerbitkan komentar + + + post.num_comments + {count} komentar + + + post.commented_on + Komentar pada + + + post.no_comments + Jadilah yang pertama yang mengomentari posting ini. + + + + help.app_description + aplikasi demo dibangun di dalam Symfony Framework sebagai ilustrasi cara-cara yang direkomendasikan untuk membangun aplikasi Symfony.]]> + + + help.show_code + Controller dan template yang digunakan untuk membuat halaman ini.]]> + + + help.browse_app + bagian publik dari aplikasi demo ini.]]> + + + help.browse_admin + admin backend dari aplikasi demo ini.]]> + + + help.login_users + Coba salah satu dari pengguna berikut + + + help.role_user + Pengguna umum + + + help.role_admin + administrator + + + help.reload_fixtures + Jika pengguna-pengguna tersebut tidak dapat digunakan, muat ulang fixtur aplikasi dengan menjalankan perintah berikut dari terminal: + + + help.add_user + Jika anda ingin membuat user baru, jalankan perintah berikut: + + + help.more_information + Symfony doc.]]> + + + + paginator.previous + Sebelumnya + + + paginator.next + Berikutnya + + + + diff --git a/translations/messages+intl-icu.it.xlf b/translations/messages+intl-icu.it.xlf new file mode 100644 index 00000000..1ea71f6a --- /dev/null +++ b/translations/messages+intl-icu.it.xlf @@ -0,0 +1,373 @@ + + + + + + note + NOTE + + + tip + SUGGERIMENTO + + + not_available + Non disponibile + + + mit_license + Licenza MIT + + + + http_error.name + Errore {status_code, number} + + + http_error.description + Un errore sconosciuto (HTTP {status_code, number}) ha impedito di completare la richiesta. + + + http_error.suggestion + tornare alla homepage.]]> + + + http_error_403.description + Non si dispone dei permessi per accedere a questa risorsa. + + + http_error_403.suggestion + Chiedere a un amministratore di fornire un accesso a questa risorsa. + + + http_error_404.description + La pagina richiesta non è stata trovata. + + + http_error_404.suggestion + tornare alla homepage.]]> + + + http_error_500.description + Si è verificato un errore interno del server. + + + http_error_500.suggestion + tornare alla homepage.]]> + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Codice sorgente usato per effettuare il render di questa pagina + + + title.controller_code + Codice del controllore + + + title.twig_template_code + Codice del template Twig + + + title.login + Accesso sicuro + + + title.post_list + Lista dei post + + + title.edit_post + Modifica post #{id, number} + + + title.add_comment + Aggiungi un commento + + + title.comment_error + C'è stato un errore nella pubblicazione del tuo commento + + + + action.show + Mostra + + + action.show_post + Mostra post + + + action.show_code + Mostra codice + + + action.edit + Modifica + + + action.edit_post + Modifica post + + + action.save + Salva cambiamenti + + + action.delete_post + Elimina post + + + delete_post_modal.title + Sicuro di voler eliminare questo post? + + + delete_post_modal.body + Non si può annullare questa azione. + + + label.delete_post + Elimina post + + + label.cancel + Annulla + + + action.create_post + Crea un nuovo post + + + label.create_post + Crea post + + + label.save_and_create_new + Salva e crea nuovo + + + action.back_to_list + Ritorna alla lista dei post + + + action.publish_comment + Pubblica commento + + + action.sign_in + Accedi + + + action.browse_app + Naviga nell'applicazione + + + action.browse_admin + Naviga nel pannello di controllo + + + + label.title + Titolo + + + label.author + Autore + + + label.author_email + Email dell'autore + + + label.username + Nome utente + + + label.password + Password + + + label.role + Ruolo + + + label.content + Contenuto + + + label.summary + Descrizione + + + label.published_at + Data pubblicazione + + + label.tags + Tag + + + label.actions + Azioni + + + title.post_new + Creazione post + + + action.edit_contents + Modifica contenuti + + + + menu.toggle_nav + Navigazione + + + menu.choose_language + Lingua + + + menu.post_list + Lista post + + + menu.back_to_blog + Ritorna al blog + + + menu.homepage + Homepage + + + menu.admin + Pannello di controllo + + + menu.logout + Esci + + + menu.rss + RSS del blog + + + menu.search + Ricercare + + + + post.to_publish_a_comment + per pubblicare un commento + + + post.num_comments + {count, plural, one {# commento} other {# commenti}} + + + post.commented_on + ha commentato il + + + post.no_comments + Commenta per primo. + + + post.no_posts_found + Nessun post trovato. + + + post.created_successfully + Post creato! + + + post.updated_successfully + Post aggiornato! + + + post.deleted_successfully + Post eliminato! + + + post.search_for + Ricercare... + + + post.search_no_results + Nessun risultato trovato + + + + notification.comment_created + Il post ha ricevuto un commento! + + + notification.comment_created.description + collegamento]]> + + + + help.app_description + applicazione demo creata con il Framework Symfony per illustrare il modo raccomandato per sviluppare applicazioni con Symfony.]]> + + + help.show_code + controllori e template usati per effettuare il render di questa pagina.]]> + + + help.browse_app + sezione pubblica dell'applicazione demo.]]> + + + help.browse_admin + pannello di controllo dell'applicazione demo.]]> + + + help.login_users + Prova uno dei seguenti utenti + + + help.role_user + utente normale + + + help.role_admin + amministratore + + + help.reload_fixtures + Se questi utenti non dovessero funzionare, ricarica i dati dell'applicazione eseguendo questo comando dal terminale: + + + help.add_user + Se vuoi aggiungere nuovi utenti, esegui quest'altro comando: + + + help.more_information + documentazione di Symfony.]]> + + + + rss.title + Symfony Demo blog + + + rss.description + Post più recenti pubblicati su Symfony Demo blog + + + + paginator.previous + Precedente + + + paginator.next + Successivo + + + + diff --git a/translations/messages+intl-icu.ja.xlf b/translations/messages+intl-icu.ja.xlf new file mode 100644 index 00000000..a7b5a22d --- /dev/null +++ b/translations/messages+intl-icu.ja.xlf @@ -0,0 +1,291 @@ + + + + + + note + ノート + + + tip + ヒント + + + not_available + 利用できません + + + mit_license + MIT ライセンス + + + + title.homepage + Symfony Demo アプリケーションへ]]> + + + title.source_code + このページを表示するのに使われたソースコード + + + title.controller_code + Controller コード + + + title.twig_template_code + Twig テンプレートコード + + + title.login + 安全なログイン + + + title.post_list + 記事一覧 + + + title.edit_post + #{id, number} この記事を編集 + + + title.add_comment + コメントを追加 + + + title.comment_error + コメント投稿時にエラーが起きました + + + + action.show + 確認 + + + action.show_code + コードを見る + + + action.edit + 編集 + + + action.edit_post + 記事を編集 + + + action.save + 変更を保存 + + + action.delete_post + 記事を削除 + + + action.create_post + 新たに記事を作成 + + + label.create_post + 記事を作成 + + + action.back_to_list + 記事一覧に戻る + + + action.publish_comment + コメントを投稿 + + + action.sign_in + ログイン + + + action.browse_app + アプリケーションへ + + + action.browse_admin + バックエンドへ + + + + label.title + タイトル + + + label.author + 投稿者 + + + label.author_email + 投稿者メールアドレス + + + label.username + ユーザー名 + + + label.password + パスワード + + + label.role + ロール + + + label.content + 本文 + + + label.summary + 要約 + + + label.published_at + 投稿日時 + + + label.actions + アクション + + + title.post_new + 記事を作成 + + + action.edit_contents + 内容を編集 + + + + menu.post_list + 記事一覧 + + + menu.back_to_blog + ブログへ戻る + + + menu.homepage + ホームページ + + + menu.admin + バックエンド + + + menu.logout + ログアウト + + + menu.rss + ブログ投稿RSS + + + menu.search + サーチ + + + + post.to_publish_a_comment + コメントを投稿する + + + post.num_comments + {count} コメント + + + post.commented_on + コメント投稿日時 + + + post.no_comments + この記事へのコメントはまだ投稿されていません。 + + + post.no_posts_found + 投稿は見つかりませんでした。 + + + post.created_successfully + 投稿は正常に作成されました! + + + post.updated_successfully + 投稿は正常に更新されました! + + + post.deleted_successfully + 投稿は正常に削除されました! + + + post.search_for + 検索する... + + + post.search_no_results + 結果が見つかりません + + + + notification.comment_created + あなたの投稿はコメントを受け取った! + + + notification.comment_created.description + このリンクに沿ってコメントを読むことができます]]> + + + + help.app_description + デモアプリケーションで、Symfonyアプリケーションを開発する際に推奨される方法を説明するためのものです。]]> + + + help.show_code + Controller と template のソースコードが表示されます。]]> + + + help.browse_app + 公開セクション を確認する。]]> + + + help.browse_admin + 管理セクション を確認する。]]> + + + help.login_users + 以下のユーザーのどれかを試す + + + help.role_user + 通常ユーザー + + + help.role_admin + 管理者 + + + help.reload_fixtures + もしこれらのユーザーが利用できない場合、このコマンドをターミナルで実行してアプリケーション設定を再読み込みしてください: + + + help.add_user + もし新しいユーザーを作成したければ、このコマンドを実行してください: + + + help.more_information + Symfony docを参照してください。]]> + + + + paginator.previous + 前へ + + + paginator.next + 次へ + + + + diff --git a/translations/messages+intl-icu.lt.xlf b/translations/messages+intl-icu.lt.xlf new file mode 100644 index 00000000..b869dfaf --- /dev/null +++ b/translations/messages+intl-icu.lt.xlf @@ -0,0 +1,439 @@ + + + + + + note + PASTABA + + + tip + PATARIMAS + + + not_available + Nepasiekiama + + + mit_license + MIT Licencija + + + + http_error.name + Klaida {status_code, number} + + + http_error.description + Įvyko nežinoma klaida (HTTP {status_code, number}), kuri neleido užbaigti užklausos. + + + http_error.suggestion + grįžti į pagrindinį puslapį.]]> + + + http_error_403.description + Neturite teisės peržiūrėti šito turinio. + + + http_error_403.suggestion + Parašykite sistemos administratoriaus, kad suteiktu prieigą prie šio turinio. + + + http_error_404.description + Puslapis nerastas. + + + http_error_404.suggestion + grįžti į pagrindinį puslapį.]]> + + + http_error_500.description + Įvyko vidinė serverio klaida. + + + http_error_500.suggestion + grįžti į pagrindinį puslapį.]]> + + + + title.homepage + Symfony Demo puslapį]]> + + + title.source_code + Pirminis kodas + + + title.controller_code + Controller kodas + + + title.twig_template_code + Twig šablono kodas + + + title.login + Prisijungimas + + + title.post_list + Įrašų sąrašas + + + title.edit_post + Redaguoti įrašą #{id, number} + + + title.add_comment + Pridėti komentarą + + + title.comment_error + Įvyko klaida skelbiant komentarą + + + title.edit_user + Redaguoti vartotoją + + + title.change_password + Pakeisti slaptažodį + + + + action.show + Rodyti + + + action.show_post + Rodyti įrašą + + + action.show_code + Rodyti kodą + + + action.edit + Redaguoti + + + action.edit_post + Redaguoti įrašą + + + action.save + Išsaugoti + + + action.delete_post + Ištrinti įrašą + + + delete_post_modal.title + Ar tirkai norite ištrinti įrašą? + + + delete_post_modal.body + Šio veiksmo negalima atšaukti. + + + label.delete_post + Ištrinti įrašą + + + label.cancel + Atšaukti + + + action.create_post + Sukurti naują įrašą + + + label.create_post + Sukurti įrašą + + + label.save_and_create_new + Išsaugoti ir sukurti naują + + + action.back_to_list + Grįžti atgal į įrašų sąrašą + + + action.publish_comment + Paskelbti komentarą + + + action.sign_in + Prisijungti + + + action.browse_app + Naršyti + + + action.browse_admin + Naršyti admin dalį + + + action.edit_user + Redaguoti vartotoją + + + action.change_password + Pakeisti slaptažodį + + + + label.title + Pavadinimas + + + label.author + Autorius + + + label.author_email + Autoriaus el. paštas + + + label.username + Vartotojas vardas + + + label.fullname + Pilnas vardas + + + label.email + El. paštas + + + label.password + Slaptažodis + + + label.current_password + Dabartinis slaptažodis + + + label.new_password + Naujas slaptažodis + + + label.new_password_confirm + Patvirtinti slaptažodį + + + label.role + Rolė + + + label.content + Turinys + + + label.summary + Santrauka + + + label.published_at + Publikuota + + + label.tags + Žymos + + + label.actions + Veiksmai + + + title.post_new + Įrašo sukūrimas + + + action.edit_contents + Redaguoti turinį + + + + menu.toggle_nav + Perjungti navigaciją + + + menu.choose_language + Pasirinkti kalbą + + + menu.post_list + Įrašų sąrašas + + + menu.back_to_blog + Atgal į blogą + + + menu.homepage + Pagrindinis puslapis + + + menu.admin + Backend + + + menu.user + Paskyra + + + menu.logout + Atsijungti + + + menu.rss + Blogo Įrašai RSS + + + menu.search + Paieška + + + + post.to_publish_a_comment + kad paskelbti komentarą + + + post.num_comments + {count, plural, one {# komentaras} other {# komentarai}} + + + post.commented_on + kada komentuota + + + post.no_comments + Būkite pirmas, pakomentavęs šį įrašą. + + + post.no_posts_found + Nerasta įrašų. + + + post.created_successfully + Įrašas sukurtas sėkmingai! + + + post.updated_successfully + Įrašas atnaujintas sėkmingai! + + + post.deleted_successfully + Įrašas ištrintas sėkmingai! + + + post.search_for + Ieškoti... + + + post.search_no_results + Nieko nerasta + + + + user.updated_successfully + Vartotojas atnaujintas sėkmingai! + + + + notification.comment_created + Jūsų įrašas gavo komentarą! + + + notification.comment_created.description + nuorodą]]> + + + + help.app_description + demo puslapis sukurtas su Symfony Framework parodydant tinkamą Symfony panaudojimą.]]> + + + help.show_code + Controller ir šabloną panaudoti atvaizduojant šį puslapį.]]> + + + help.browse_app + public dalį demo puslapio.]]> + + + help.browse_admin + admin dalį demo puslapio.]]> + + + help.login_users + išbandykite vieną iš šių vartotojų + + + help.role_user + nuolatinis vartotojas + + + help.role_admin + administratorius + + + help.reload_fixtures + Jei vartotojai neveikia, perleiskite šia komandą: + + + help.add_user + Jei norite sukurti naują vartotoją paleiskite šia komandą: + + + help.more_information + Symfony dokumentciją.]]> + + + help.post_summary + Santrauka negali būti su Markdown ar HTML žymom, tiktai paprastas tekstas + + + help.post_publication + Nustatykite datą ateityje, kad planuotumėte blogo įrašo paskelbimą. + + + help.post_content + Turinį galima formatuoti su Markdown ir HTML žymom. + + + help.comment_content + Komentarai, kurie neatitinka Elgesio kodekso, bus moderuojami. + + + + info.change_password + Pakeitus slaptažodį, būsite atjungti nuo puslapio. + + + + rss.title + Symfony Demo blogas + + + rss.description + Naujausi įrašai paskelbti Symfony Demo bloge + + + + paginator.previous + Ankstesnis + + + paginator.next + Sekantis + + + + diff --git a/translations/messages+intl-icu.nl.xlf b/translations/messages+intl-icu.nl.xlf new file mode 100644 index 00000000..0083a7cd --- /dev/null +++ b/translations/messages+intl-icu.nl.xlf @@ -0,0 +1,373 @@ + + + + + + note + NOTITIE + + + tip + TIP + + + not_available + Niet beschikbaar + + + mit_license + MIT Licentie + + + + http_error.name + Fout {status_code, number} + + + http_error.description + Een onbekende fout (HTTP {status_code, number}) is opgetreden, waardoor de aanvraag niet gelukt is. + + + http_error.suggestion + ga terug naar de beginpagina.]]> + + + http_error_403.description + Je hebt geen toestemming om deze bron op te vragen. + + + http_error_403.suggestion + Vraag je manager of systeembeheerder om toegang tot deze bron te krijgen. + + + http_error_404.description + We konden de pagina die je opvroeg niet vinden. + + + http_error_404.suggestion + ga terug naar de beginpagina.]]> + + + http_error_500.description + Er is een interne serverfout opgetreden. + + + http_error_500.suggestion + ga terug naar de beginpagina.]]> + + + title.homepage + Symfony Demo applicatie]]> + + + title.source_code + Broncode van deze pagina + + + title.controller_code + Controller code + + + title.twig_template_code + Twig template code + + + title.login + Veilig inloggen + + + title.post_list + Berichtenlijst + + + title.edit_post + Bewerk bericht #{id, number} + + + title.add_comment + Voeg een reactie toe + + + title.comment_error + Er is een fout opgetreden bij het opslaan van je reactie + + + + action.show + Weergeven + + + action.show_post + Bericht weergeven + + + action.show_code + Code weergeven + + + action.edit + Bewerken + + + action.edit_post + Bericht bewerken + + + action.save + Opslaan + + + action.delete_post + Bericht verwijderen + + + delete_post_modal.title + Weet je zeker dat je dit bericht wilt verwijderen? + + + delete_post_modal.body + Deze actie kan niet ongedaan gemaakt worden. + + + label.delete_post + Bericht verwijderen + + + label.cancel + Annuleren + + + + action.create_post + Maak nieuw bericht + + + label.create_post + Bericht maken + + + label.save_and_create_new + Opslaan en nieuwe maken + + + action.back_to_list + Terug naar de berichtenlijst + + + action.publish_comment + Reactie opslaan + + + action.sign_in + Inloggen + + + action.browse_app + Applicatie bekijken + + + action.browse_admin + Beheerpaneel bekijken + + + + label.title + Titel + + + label.author + Auteur + + + label.author_email + Auteur e-mail + + + label.username + Gebruikersnaam + + + label.password + Wachtwoord + + + label.role + Rol + + + label.content + Inhoud + + + label.summary + Samenvatting + + + label.published_at + Geplaatst op + + + label.tags + Tags + + + label.actions + Acties + + + title.post_new + Bericht aanmaken + + + action.edit_contents + Inhoud bewerken + + + + menu.toggle_nav + Wissel navigatie + + + menu.choose_language + Taalkeuze + + + menu.post_list + Berichtenlijst + + + menu.back_to_blog + Terug naar de blog + + + menu.homepage + Beginpagina + + + menu.admin + Beheerpaneel + + + menu.logout + Uitloggen + + + menu.rss + Blogberichten RSS + + + menu.search + Zoek + + + + post.to_publish_a_comment + om een reactie toe te voegen + + + post.num_comments + {count, plural, one {# reactie} other {# reacties}} + + + post.commented_on + gereageerd op + + + post.no_comments + Reageer als eerste op dit bericht. + + + post.no_posts_found + Geen berichten gevonden. + + + post.created_successfully + Bericht met succes aangemaakt! + + + post.updated_successfully + Bericht met succes bijgewerkt! + + + post.deleted_successfully + Bericht met succes verwijderd! + + + post.search_for + Zoek naar... + + + post.search_no_results + No results found + + + + notification.comment_created + Er is een reactie bij je bericht geplaatst! + + + notification.comment_created.description + deze link]]> + + + + help.app_description + voorbeeld applicatie, gemaakt met het Symfony Framework, die je een indruk geeft van de aanbevolen manier om een Symfony applicatie te ontwikkelen.]]> + + + help.show_code + Controller en template, die gebruikt zijn bij het weergeven van deze pagina.]]> + + + help.browse_app + publieke gedeelte van de demo applicatie.]]> + + + help.browse_admin + Beheerpaneel van de demo applicatie.]]> + + + help.login_users + Probeer één van de volgende gebruikers + + + help.role_user + normale gebruiker + + + help.role_admin + beheerder + + + help.reload_fixtures + Als het niet lukt om in te loggen met deze gebruikers, herlaad dan de applicatie instellingen door dit commando in de terminal uit te voeren: + + + help.add_user + Als u een nieuwe gebruiker wilt toevoegen, voer dan dit commando uit: + + + help.more_information + Symfony documentatie.]]> + + + + rss.title + Symfony Demo blog + + + rss.description + De meest recente berichten, gepubliceerd op De Symfony Demo blog + + + + paginator.previous + Vorige + + + paginator.next + Volgende + + + + diff --git a/translations/messages+intl-icu.pl.xlf b/translations/messages+intl-icu.pl.xlf new file mode 100644 index 00000000..75d5af15 --- /dev/null +++ b/translations/messages+intl-icu.pl.xlf @@ -0,0 +1,289 @@ + + + + + + note + UWAGA + + + tip + PORADA + + + not_available + Niedostępne + + + mit_license + Licencja MIT + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Kod źródłowy użyty do wygenerowania tej podstrony + + + title.controller_code + Kod kontrolera + + + title.twig_template_code + Kod szablonu Twig + + + title.login + Bezpieczne logowanie + + + title.post_list + Lista artykułów + + + title.edit_post + Edytuj artykuł #{id, number} + + + title.add_comment + Dodaj komentarz + + + title.comment_error + Podczas publikacji Twojego komentarza wystąpił błąd + + + + action.show + Pokaż + + + action.show_code + Pokaż kod + + + action.edit + Edytuj + + + action.edit_post + Edytuj artykuł + + + action.save + Zapisz + + + action.delete_post + Usuń artykuł + + + delete_post_modal.title + Czy na pewno chcesz usunąć ten artykuł? + + + delete_post_modal.body + Ta akcja nie może zostać cofnięta. + + + label.delete_post + Usuń artykuł + + + label.cancel + Anuluj + + + action.create_post + Dodaj nowy artykuł + + + label.create_post + Dodaj artykuł + + + label.save_and_create_new + Zapisz i dodaj kolejny + + + action.back_to_list + Powrót do listy artykułów + + + action.publish_comment + Publikuj komentarz + + + action.sign_in + Zaloguj się + + + action.browse_app + Przeglądaj aplikację + + + action.browse_admin + Przeglądaj panel administracyjny + + + + label.title + Tytuł + + + label.author + Autor + + + label.author_email + Adres e-mail autora + + + label.username + Użytkownik + + + label.password + Hasło + + + label.role + Rola + + + label.content + Treść + + + label.summary + Podsumowanie + + + label.published_at + Opublikowano + + + label.actions + Akcje + + + title.post_new + Tworzenie nowego artykułu + + + action.edit_contents + Edycja treści + + + + menu.toggle_nav + Przełącz nawigację + + + menu.post_list + Lista artykułów + + + menu.back_to_blog + Powrót do bloga + + + menu.homepage + Strona główna + + + menu.admin + Panel administracyjny + + + menu.logout + Wyloguj się + + + + post.to_publish_a_comment + aby dodać komentarz + + + post.num_comments + {count, plural, one {# komentarz} many {# komentarze} other {# komentarzy}} + + + post.commented_on + skomentował + + + post.no_comments + Bądź pierwszym, który skomentuje. + + + post.no_posts_found + Brak artykułów + + + post.created_successfully + Artykuł został utworzony! + + + post.updated_successfully + Artykuł został zaktualizowany! + + + post.deleted_successfully + Artykuł został usunięty! + + + help.app_description + przykładowa aplikacja zbudowana przy pomocy frameworka Symfony, dla zademonstrowania polecanego sposobu tworzenia aplikacji przy jego użyciu.]]> + + + help.show_code + kontrolera oraz szablonu użytych podczas generowania tej podstrony.]]> + + + help.browse_app + publiczną część aplikacji demonstracyjnej.]]> + + + help.browse_admin + panel administracyjny aplikacji demonstracyjnej.]]> + + + help.login_users + Użyj dowolnego z poniższych użytkowników + + + help.role_user + zwykły użytkownik + + + help.role_admin + administrator + + + help.reload_fixtures + Jeśli powyższe dane logowania nie działają, załaduj ponownie przykładowe dane dla tej aplikacji. Uruchom następującą komendę: + + + help.add_user + Jeśli chcesz dodać nowego użytkownika, uruchom następującą komendę: + + + help.more_information + dokumentację Symfony, aby uzyskać więcej informacji.]]> + + + + paginator.previous + Poprzednia + + + paginator.next + Następna + + + + diff --git a/translations/messages+intl-icu.pt_BR.xlf b/translations/messages+intl-icu.pt_BR.xlf new file mode 100644 index 00000000..aa11fb2c --- /dev/null +++ b/translations/messages+intl-icu.pt_BR.xlf @@ -0,0 +1,444 @@ + + + + + + note + NOTA + + + tip + DICA + + + not_available + Não disponível + + + mit_license + Licença MIT + + + + http_error.name + Erro {status_code, number} + + + http_error.description + Ocorreu um erro desconhecido (HTTP {status_code, number}) que impediu a sua requisição de ser completada. + + + http_error.suggestion + volte para a página inicial.]]> + + + http_error_403.description + Você não tem permissão para acessar esse recurso. + + + http_error_403.suggestion + Peça ao seu gerente ou administrador de sistemas para lhe dar acesso a esse recurso. + + + http_error_404.description + Não podemos encontrar a página que você requisitou. + + + http_error_404.suggestion + volte para a página inicial.]]> + + + http_error_500.description + Houve um erro interno no servidor. + + + http_error_500.suggestion + volte para a página inicial.]]> + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Código fonte utilizado para renderizar esta página + + + title.controller_code + Código do Controller + + + title.twig_template_code + Código do template Twig + + + title.login + Login seguro + + + title.post_list + Lista de Posts + + + title.edit_post + Editar o post #{id, number} + + + title.add_comment + Adicionar um comentário + + + title.comment_error + Houve um erro ao publicar o seu comentário + + + title.edit_user + Editar usuário + + + title.change_password + Alterar senha + + + + action.show + Exibir + + + action.show_post + Exibir o post + + + action.show_code + Mostrar o código + + + action.edit + Editar + + + action.edit_post + Editar o post + + + action.save + Salvar alterações + + + action.delete_post + Excluir o post + + + delete_post_modal.title + Tem certeza que deseja excluir esse post? + + + delete_post_modal.body + Essa ação não pode ser desfeita. + + + label.delete_post + Excluir o post + + + label.cancel + Cancelar + + + action.create_post + Criar um novo post + + + label.create_post + Criar um post + + + label.save_and_create_new + Salvar e criar novo + + + action.back_to_list + Voltar para a lista de posts + + + action.publish_comment + Publicar comentário + + + action.sign_in + Entrar + + + action.browse_app + Navegar na aplicação + + + action.browse_admin + Navegar na área administrativa + + + action.edit_user + Editar usuário + + + action.change_password + Alterar senha + + + + label.title + Título + + + label.author + Autor + + + label.author_email + Email do autor + + + label.username + Usuário + + + label.fullname + Nome completo + + + label.email + Email + + + label.password + Senha + + + label.current_password + Senha atual + + + label.new_password + Nova senha + + + label.new_password_confirm + Confirmar senha + + + label.role + Perfil + + + label.content + Conteúdo + + + label.summary + Sumário + + + label.published_at + Publicado em + + + label.tags + Tags + + + label.actions + Ações + + + title.post_new + Criação do post + + + action.edit_contents + Editar conteúdo + + + + menu.toggle_nav + Alternar navegação + + + menu.choose_language + Escolha o idioma + + + menu.post_list + Lista de posts + + + menu.back_to_blog + Voltar para o blog + + + menu.homepage + Página inicial + + + menu.admin + Área Administrativa + + + menu.user + Conta + + + menu.logout + Sair + + + menu.rss + RSS do Blog + + + menu.search + Pesquisar + + + + post.to_publish_a_comment + para publicar um comentário + + + post.num_comments + {count, plural, one {# comentário} other {# comentários}} + + + post.commented_on + comentou em + + + post.no_comments + Seja o primeiro a comentar nesse post. + + + post.no_posts_found + Nenhum post encontrado. + + + post.created_successfully + Post criado com sucesso! + + + post.updated_successfully + Post atualizado com sucesso! + + + post.deleted_successfully + Post excluído com sucesso! + + + post.search_for + Pesquisar por... + + + post.search_no_results + Nenhum resultado encontrado + + + + user.updated_successfully + Usuário atualizado com sucesso! + + + + notification.comment_created + Seu post recebeu um comentário! + + + notification.comment_created.description + deste link]]> + + + + help.app_description + aplicação de demonstração construída com o Symfony Framework para ilustrar a maneira recomendada de se desenvolver aplicações Symfony.]]> + + + help.show_code + Controller e do template utilizados para renderizar esta página.]]> + + + help.browse_app + área pública da aplicação de demonstração.]]> + + + help.browse_admin + área administrativa da aplicação de demonstração.]]> + + + help.login_users + Experimente um dos usuários abaixo + + + help.role_user + usuário comum + + + help.role_admin + administrador + + + help.reload_fixtures + Se esses usuários não funcionarem, recarregue as fixtures da aplicação executando esse comando no terminal: + + + help.add_user + Se quiser criar novos usuários, execute esse outro comando: + + + help.more_information + documentação do Symfony.]]> + + + + help.post_summary + Sumários não podem conter Markdown ou HTML; apenas texto simples. + + + help.post_publication + Para agendar a publicação do post, informe uma data no futuro. + + + help.post_content + Utilize Markdown para formatar o conteúdo do post. HTML também é permitido. + + + help.comment_content + Comentários que não estiverem de acordo com o nosso Código de Conduta serão moderados. + + + + info.change_password + Após alterar a sua senha, você será deslogado da aplicação. + + + + rss.title + Symfony Demo blog + + + rss.description + Posts mais recentes publicados no blog Symfony Demo + + + + paginator.previous + Anterior + + + paginator.next + Próxima + + + paginator.current + (atual) + + + + diff --git a/translations/messages+intl-icu.ro.xlf b/translations/messages+intl-icu.ro.xlf new file mode 100644 index 00000000..dd0058d4 --- /dev/null +++ b/translations/messages+intl-icu.ro.xlf @@ -0,0 +1,286 @@ + + + + + + note + NOTĂ + + + tip + SFAT + + + not_available + Indisponibil + + + mit_license + Licenţă MIT + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Codul sursă folosit în această pagină + + + title.controller_code + Codul din controler + + + title.twig_template_code + Codul din şablonul Twig + + + title.login + Autentificare securizată + + + title.post_list + Lista de articole + + + title.edit_post + Modifică articolul #{id, number} + + + title.add_comment + Adaugă un comentariu + + + title.comment_error + A intervenit o eroare la publicarea comentariului tău + + + + action.show + Vezi + + + action.show_code + Vezi codul sursă + + + action.edit + Modifică + + + action.edit_post + Modifică articolul + + + action.save + Salvează modificările + + + action.delete_post + Şterge articolul + + + delete_post_modal.title + Sunteți sigur că doriți ștergerea acestui articol? + + + delete_post_modal.body + Această acțiune nu poate fi anulată. + + + label.delete_post + Șterge articolul + + + label.cancel + Anulează + + + action.create_post + Creează un articol nou + + + label.create_post + Creează un articol nou + + + label.save_and_create_new + Salvează și creează unul nou + + + action.back_to_list + Înapoi la lista de articole + + + action.publish_comment + Publică comentariu + + + action.sign_in + Autentifică-te + + + action.browse_app + Mergi la aplicaţie + + + action.browse_admin + Mergi la administrare + + + + label.title + Titlu + + + label.author + Autor + + + label.author_email + Email autor + + + label.username + Utilizator + + + label.password + Parolă + + + label.role + Rol + + + label.content + Conţinut + + + label.summary + Rezumat + + + label.published_at + Publicat la + + + label.actions + Acţiuni + + + title.post_new + Crearea unui articol nou + + + action.edit_contents + Modifică articolul + + + + menu.post_list + Lista de articole + + + menu.back_to_blog + Înapoi la blog + + + menu.homepage + Prima pagină + + + menu.admin + Administrare + + + menu.logout + Ieşire + + + + post.to_publish_a_comment + pentru a publica un comentariu + + + post.num_comments + {count, plural, one {# comentariu} other {# comentarii}} + + + post.commented_on + comentat la + + + post.no_comments + Fii primul care comentează acest articol. + + + post.no_posts_found + Nu s-au găsit articole. + + + post.created_successfully + Articol creat cu succes! + + + post.updated_successfully + Articol modificat cu succes! + + + post.deleted_successfully + Articol șters cu succes! + + + + help.app_description + aplicaţie demonstrativă construită pe Platforma Symfony pentru a ilustra modul recomandat de a dezvolta aplicaţii Symfony.]]> + + + help.show_code + controlerul şi şablonul folosite în acestă pagină.]]> + + + help.browse_app + secţiunea publică a aplicaţiei demonstrative.]]> + + + help.browse_admin + secţiunea administrativă a aplicaţiei demonstrative.]]> + + + help.login_users + Încearcă oricare dintre următorii utilizatori + + + help.role_user + utilizator simplu + + + help.role_admin + administrator + + + help.reload_fixtures + Dacă aceşti utilizatori nu funcţionează, reîncarcă datele fixe ale aplicaţiei (fixtures) prin executarea acestei comenzi în terminal: + + + help.add_user + Dacă doreşti să creezi utilizatori noi, execută această comandă în terminal: + + + help.more_information + documentaţia Symfony.]]> + + + + paginator.previous + Pagina anterioara + + + paginator.next + Pagina urmatoare + + + + diff --git a/translations/messages+intl-icu.ru.xlf b/translations/messages+intl-icu.ru.xlf new file mode 100644 index 00000000..35593b36 --- /dev/null +++ b/translations/messages+intl-icu.ru.xlf @@ -0,0 +1,443 @@ + + + + + + note + ПРИМЕЧАНИЕ + + + tip + СОВЕТ + + + not_available + Недоступно + + + mit_license + MIT Лицензия + + + + http_error.name + Ошибка {status_code, number} + + + http_error.description + Произошла неизвестная ошибка (HTTP {status_code, number}), которая помешала выполнить ваш запрос. + + + http_error.suggestion + вернитесь на главную страницу.]]> + + + http_error_403.description + У вас нет разрешения на доступ к этому ресурсу. + + + http_error_403.suggestion + Запросите доступ к этому ресурсу у вашего менеджера или системного администратора. + + + http_error_404.description + Мы не смогли найти запрашиваемую вами страницу. + + + http_error_404.suggestion + вернитесь на главную страницу.]]> + + + http_error_500.description + Произошла внутренняя ошибка сервера. + + + http_error_500.suggestion + вернитесь на главную страницу.]]> + + + + title.homepage + Symfony Demo приложение]]> + + + title.source_code + Исходный код, который использовался для отображения этой страницы + + + title.controller_code + Код контроллера + + + title.twig_template_code + Код шаблона Twig + + + title.login + Авторизация + + + title.post_list + Список записей + + + title.edit_post + Изменение записи #{id, number} + + + title.add_comment + Добавить комментарий + + + title.comment_error + Произошла ошибка во время публикации вашего комментария + + + title.edit_user + Изменить пользователя + + + title.change_password + Изменить пароль + + + + action.show + Показать + + + action.show_post + Показать запись + + + action.show_code + Показать код + + + action.edit + Изменить + + + action.edit_post + Изменить запись + + + action.save + Сохранить изменения + + + action.delete_post + Удалить запись + + + delete_post_modal.title + Вы уверены, что хотите удалить эту запись? + + + delete_post_modal.body + Это действие не может быть отменено. + + + label.delete_post + Удалить запись + + + label.cancel + Отменить + + + action.create_post + Создать новую запись + + + label.create_post + Создать запись + + + label.save_and_create_new + Сохранить и создать новую + + + action.back_to_list + Назад к списку записей + + + action.publish_comment + Опубликовать комментарий + + + action.sign_in + Войти + + + action.browse_app + Перейти в публичный раздел + + + action.browse_admin + Перейти в панель управления + + + action.edit_user + Изменить пользователя + + + action.change_password + Изменить пароль + + + + label.title + Название + + + label.author + Автор + + + label.author_email + Email автора + + + label.username + Логин + + + label.fullname + Полное имя + + + label.email + Email + + + label.password + Пароль + + + label.current_password + Текущий пароль + + + label.new_password + Новый пароль + + + label.new_password_confirm + Подтвердите пароль + + + label.role + Роль + + + label.content + Содержание + + + label.summary + Краткое содержание + + + label.published_at + Опубликовано + + + label.tags + Теги + + + label.actions + Действия + + + title.post_new + Создание записи + + + action.edit_contents + Изменить содержание + + + + menu.toggle_nav + Переключить навигацию + + + menu.choose_language + Выбрать язык + + + menu.post_list + Список записей + + + menu.back_to_blog + Назад к блогу + + + menu.homepage + Главная страница + + + menu.admin + Панель управления + + + menu.user + Аккаунт + + + menu.logout + Выйти + + + menu.rss + RSS Записей Блога + + + menu.search + Поиск + + + + post.to_publish_a_comment + опубликовать комментарий + + + post.num_comments + {count, plural, one {# комментарий} few {# комментария} other {# комментариев}} + + + post.commented_on + прокомментировано + + + post.no_comments + Будьте первыми кто прокомментирует эту запись. + + + post.no_posts_found + Ни одной записи не найдено. + + + post.created_successfully + Запись успешно создана! + + + post.updated_successfully + Запись успешно обновлена! + + + post.deleted_successfully + Запись успешно удалена! + + + post.search_for + Искать запись... + + + post.search_no_results + Ничего не найдено + + + + user.updated_successfully + Информация о пользователе успешно обновлена! + + + + notification.comment_created + Ваша запись получила комментарий! + + + notification.comment_created.description + этой ссылке]]> + + + + help.app_description + демо приложение создано на основе Symfony фреймворка для того, чтобы показать рекомендованный способ разработки Symfony приложений.]]> + + + help.show_code + Контроллера и шаблона, которые использовались для отображения этой страницы.]]> + + + help.browse_app + публичный раздел демо приложения.]]> + + + help.browse_admin + панель управления демо приложения.]]> + + + help.login_users + Используйте любого из следующих пользователей + + + help.role_user + обычный пользователь + + + help.role_admin + администратор + + + help.reload_fixtures + Если эти пользователи не работают, перезагрузите фикстуры приложения, выполнив в консоли следующую команду: + + + help.add_user + Если вы хотите создать новых пользователей, воспользуйтесь следующей командой: + + + help.more_information + Symfony документации.]]> + + + help.post_summary + В кратком содержании не допускается использование Markdown разметки и HTML-тегов, только простой текст. + + + help.post_publication + Установите дату в будущем, чтобы запланировать публикацию поста в блоге. + + + help.post_content + Используйте Markdown разметку для оформления записи. HTML тоже разрешён. + + + help.comment_content + Комментарии, не соответствующие нашему Кодексу поведения, будут модерироваться. + + + + info.change_password + После изменения пароля Вам потребуется заново авторизоваться в приложении. + + + + rss.title + Symfony Demo блог + + + rss.description + Самые последние записи, опубликованные в Symfony Demo блоге + + + + paginator.previous + Назад + + + paginator.next + Вперед + + + paginator.current + (текущая) + + + + diff --git a/translations/messages+intl-icu.sl.xlf b/translations/messages+intl-icu.sl.xlf new file mode 100644 index 00000000..2d0ee232 --- /dev/null +++ b/translations/messages+intl-icu.sl.xlf @@ -0,0 +1,364 @@ + + + + + + note + OPOMBA + + + tip + NASVET + + + not_available + Ni na voljo + + + mit_license + Licenca MIT + + + + http_error.name + Napaka {status_code, number} + + + http_error.description + Prišlo je do neznane napake (HTTP {status_code, number}), ki preprečuje zaključiti vaš zahtevek. + + + http_error.suggestion + se vrnite na domačo stran.]]> + + + http_error_403.description + Nimate pravic za dostop do tega vira. + + + http_error_403.suggestion + Vprašajte vašega upravitelja ali sistemskega administratorja, da vam omogoči dostop do tega vira. + + + http_error_404.description + Strani, ki ste jo zahtevali, ni mogoče najti. + + + http_error_404.suggestion + se vrnite na domačo stran.]]> + + + http_error_500.description + Prišlo je do interne napake na strežniku. + + + http_error_500.suggestion + se vrnite na domačo stran.]]> + + + + title.homepage + Symfony Demo]]> + + + title.source_code + Izvorna koda uporabljena za izpis te strani + + + title.controller_code + Koda krmilnika + + + title.twig_template_code + Koda predloge Twig + + + title.login + Varna prijava + + + title.post_list + Seznam objav + + + title.edit_post + Uredi objavo #{id, number} + + + title.add_comment + Dodaj komentar + + + title.comment_error + Pri objavi vašega komentarja je prišlo do napake + + + + action.show + Prikaži + + + action.show_post + Prikaži objavo + + + action.show_code + Prikaži kodo + + + action.edit + Uredi + + + action.edit_post + Uredi objavo + + + action.save + Shrani spremembe + + + action.delete_post + Izbriši objavo + + + delete_post_modal.title + Ali ste prepričani, da želite izbrisati to objavo? + + + delete_post_modal.body + Tega dejanja ni mogoče razveljaviti. + + + label.delete_post + Izbriši objavo + + + label.cancel + Prekliči + + + action.create_post + Ustvari novo objavo + + + label.create_post + Ustvari objavo + + + label.save_and_create_new + Shrani in ustvari novo + + + action.back_to_list + Nazaj na seznam objav + + + action.publish_comment + Objavi komentar + + + action.sign_in + Prijava + + + action.browse_app + Ogled aplikacije + + + action.browse_admin + Ogled ozadja + + + + label.title + Naslov + + + label.author + Avtor + + + label.author_email + E-pošta avtorja + + + label.username + uporabniško ime + + + label.password + Geslo + + + label.role + Vloga + + + label.content + Vsebina + + + label.summary + Povzetek + + + label.published_at + Objavljeno + + + label.tags + Značke + + + label.actions + Dejanja + + + title.post_new + Nova objava + + + action.edit_contents + Uredi vsebine + + + + menu.toggle_nav + Preklop navigacije + + + menu.choose_language + Izbira jezika + + + menu.post_list + Seznam objav + + + menu.back_to_blog + Nazaj na blog + + + menu.homepage + Domača stran + + + menu.admin + Ozadje + + + menu.logout + Odjava + + + menu.rss + RSS objav bloga + + + menu.search + Iskanje + + + + post.to_publish_a_comment + za objavo komentarja + + + post.num_comments + {count, plural, one {# komentar} two {# komentarja} few {# komentarji} other {# komentarjev}} + + + post.commented_on + komentirano dne + + + post.no_comments + Bodite prvi, da komentirate to objavo. + + + post.no_posts_found + Na voljo ni nobene objave. + + + post.created_successfully + Objava uspešno ustvarjena! + + + post.updated_successfully + Objava uspešno posodobljena! + + + post.deleted_successfully + Objava uspešno izbrisana! + + + post.search_for + Iskanje za ... + + + post.search_no_results + Ni najdenih rezultatov + + + + notification.comment_created + Vaša objava je prejela komentar! + + + notification.comment_created.description + tej povezavi]]> + + + + help.app_description + demo aplikacija zgrajena z ogrodjem Symfony za prikaz priporočenega načina razvoja aplikacij Symfony.]]> + + + help.show_code + krmilnika in predloge uporabljene za izpis te strani.]]> + + + help.browse_app + javne sekcije demo aplikacije.]]> + + + help.browse_admin + administracije demo aplikacije.]]> + + + help.login_users + Poskusite enega izmed sledečih uporabnikov + + + help.role_user + splošni uporabnik + + + help.role_admin + administrator + + + help.reload_fixtures + Če uporabniki ne delujejo, ponovno naložite podatke aplikacije s pogonom tega ukaza v ukazni vrstici: + + + help.add_user + Če želite dodati nove uporabnike, poženite sledeči ukaz: + + + help.more_information + dokumentacijo Symfony.]]> + + + + rss.title + Symfony Demo blog + + + rss.description + Najnovejše objave objavljene na Symfony Demo blogu + + + + diff --git a/translations/messages+intl-icu.tr.xlf b/translations/messages+intl-icu.tr.xlf new file mode 100644 index 00000000..50c9f359 --- /dev/null +++ b/translations/messages+intl-icu.tr.xlf @@ -0,0 +1,364 @@ + + + + + + note + NOT + + + tip + TÜYO + + + not_available + Uygun değil + + + mit_license + MİT Lisansı + + + + http_error.name + Hata {status_code, number} + + + http_error.description + İsteğinizi tamamlamayı engelleyen bilinmeyen bir hata oluştu (HTTP {status_code}). + + + http_error.suggestion + ana sayfaya geri dönmeyi deneyin.]]> + + + http_error_403.description + Bu kaynağa erişim izniniz yok. + + + http_error_403.suggestion + Yöneticinize veya sistem yöneticinize bu kaynağa erişim izni vermesini isteyin. + + + http_error_404.description + İstediğiniz sayfayı bulamadık. + + + http_error_404.suggestion + ana sayfaya geri dönün.]]> + + + http_error_500.description + Bir iç sunucu hatası vardı. + + + http_error_500.suggestion + ana sayfaya geri dönmeyi deneyin.]]> + + + + title.homepage + Symfony Demo uygulamasına hoş geldiniz]]> + + + title.source_code + Bu sayfayı oluşturmak için kullanılan kaynak kodu + + + title.controller_code + Denetleyici kodu + + + title.twig_template_code + Twig şablon kodu + + + title.login + Güvenli Giriş + + + title.post_list + Gönderi Listesi + + + title.edit_post + Gönderiyi düzenle #{id, number} + + + title.add_comment + Yorum ekle + + + title.comment_error + Yorumunuz yayınlanırken bir hata oluştu + + + + action.show + Göster + + + action.show_post + Gönderiyi göster + + + action.show_code + Kodu göster + + + action.edit + Düzenle + + + action.edit_post + Gönderiyi düzenle + + + action.save + Değişiklikleri kaydet + + + action.delete_post + Gönderiyi sil + + + delete_post_modal.title + Bu gönderiyi silmek istediğinizden emin misiniz? + + + delete_post_modal.body + Bu işlem geri alınamaz. + + + label.delete_post + Gönderiyi sil + + + label.cancel + İptal + + + action.create_post + Yeni bir gönderi oluştur + + + label.create_post + Gönderi oluştur + + + label.save_and_create_new + Kaydet ve yeni oluştur + + + action.back_to_list + Gönderi listesine geri dön + + + action.publish_comment + Yorumu yayınla + + + action.sign_in + Giriş yap + + + action.browse_app + Uygulamaya göz at + + + action.browse_admin + Yönetim paneline göz at + + + + label.title + Başlık + + + label.author + Yazar + + + label.author_email + Yazar e-postası + + + label.username + Kullanıcı adı + + + label.password + Şifre + + + label.role + Rol + + + label.content + İçerik + + + label.summary + Özet + + + label.published_at + Yayınlandı + + + label.tags + Etiketler + + + label.actions + İşlemler + + + title.post_new + Gönderi oluluşturma + + + action.edit_contents + İçeriği düzenle + + + + menu.toggle_nav + Navigasyonu değiştir + + + menu.choose_language + Dil seç + + + menu.post_list + Gönderi listesi + + + menu.back_to_blog + Blog'a dön + + + menu.homepage + Anasayfa + + + menu.admin + Yönetim paneli + + + menu.logout + Çıkış + + + menu.rss + Blog Yazıları RSS + + + menu.search + Arama + + + + post.to_publish_a_comment + yorum ekle + + + post.num_comments + {count} yorum + + + post.commented_on + yorum yaptı + + + post.no_comments + Bu yazıya ilk yorum yapan siz olun. + + + post.no_posts_found + Gönderi bulunamadı. + + + post.created_successfully + Gönderi başarıyla oluşturuldu! + + + post.updated_successfully + Gönderi başarıyla güncellendi! + + + post.deleted_successfully + Gönderi başarıyla silindi! + + + post.search_for + Arama... + + + post.search_no_results + Sonuç bulunamadı + + + + notification.comment_created + Gönderiniz bir yorum aldı! + + + notification.comment_created.description + bu bağlantıyı takip ederek okuyabilirsiniz.]]> + + + + help.app_description + demo uygulamasıdır.]]> + + + help.show_code + Denetleyici ve şablon kaynak kodunu göstermek için bu butona tıklayın.]]> + + + help.browse_app + genel bölümüne göz atın.]]> + + + help.browse_admin + yönetim paneline göz atın.]]> + + + help.login_users + Aşağıdaki kullanıcılardan birini deneyin + + + help.role_user + normal kullanıcı + + + help.role_admin + yönetici + + + help.reload_fixtures + Bu kullanıcılar işe yaramazsa, bu komutu terminalden çalıştırarak uygulama datasını yeniden yükleyin: + + + help.add_user + Yeni kullanıcılar oluşturmak isterseniz, bu komutu çalıştırın: + + + help.more_information + Symfony doc sayfasına bakın..]]> + + + + rss.title + Symfony Demo blogu + + + rss.description + Symfony Demo blogunda yayınlanan son yazılar + + + + diff --git a/translations/messages+intl-icu.uk.xlf b/translations/messages+intl-icu.uk.xlf new file mode 100644 index 00000000..9b6ad8d1 --- /dev/null +++ b/translations/messages+intl-icu.uk.xlf @@ -0,0 +1,443 @@ + + + + + + note + ПРИМІТКА + + + tip + ПОРАДА + + + not_available + Недоступно + + + mit_license + MIT Ліцензія + + + + http_error.name + Помилка {status_code, number} + + + http_error.description + Виникла невідма помилка (HTTP {status_code, number}), котра завадила виконати ваш запит. + + + http_error.suggestion + поверніться на головну сторінку.]]> + + + http_error_403.description + У вас немає дозволу на доступ до цього ресурсу. + + + http_error_403.suggestion + Зробіть запит на доступ до цього ресурсу у вашого менеджера або системного адміністратора. + + + http_error_404.description + Ми не змогли знайти сторінку що ви запросили. + + + http_error_404.suggestion + поверніться на головну сторінку.]]> + + + http_error_500.description + Виникла внутрішня помилка сервера. + + + http_error_500.suggestion + поверніться на головну сторінку.]]> + + + + title.homepage + Symfony Demo додатку]]> + + + title.source_code + Вихідний код, який використовувався для побудови цієї сторінки + + + title.controller_code + Код контролеру + + + title.twig_template_code + Код шаблону Twig + + + title.login + Авторизація + + + title.post_list + Список записів + + + title.edit_post + Редагування запису #{id, number} + + + title.add_comment + Додати коментар + + + title.comment_error + Виникла помилка під час публікації вашого коментаря + + + title.edit_user + Редагувати користувача + + + title.change_password + Змінити пароль + + + + action.show + Показати + + + action.show_post + Показати запис + + + action.show_code + Показати код + + + action.edit + Редагувати + + + action.edit_post + Редагувати запис + + + action.save + Зберегти зміни + + + action.delete_post + Видалити запис + + + delete_post_modal.title + Ви впевнені, що хочете видалити цей запис? + + + delete_post_modal.body + Ця дія не може бути скасована. + + + label.delete_post + Видалити запис + + + label.cancel + Скасувати + + + action.create_post + Створити новий запис + + + label.create_post + Створити запис + + + label.save_and_create_new + Зберегти та створити новий + + + action.back_to_list + Назад до списку записів + + + action.publish_comment + Опублікувати коментар + + + action.sign_in + Ввійти + + + action.browse_app + Перейти до публічного розділу + + + action.browse_admin + Перейти до панелі керування + + + action.edit_user + Редагувати користувача + + + action.change_password + Змінити пароль + + + + label.title + Назва + + + label.author + Автор + + + label.author_email + Email автора + + + label.username + Логін + + + label.fullname + Повне ім'я + + + label.email + Email + + + label.password + Пароль + + + label.current_password + Поточний пароль + + + label.new_password + Новий пароль + + + label.new_password_confirm + Підтвердіть пароль + + + label.role + Роль + + + label.content + Зміст + + + label.summary + Короткий зміст + + + label.published_at + Опубліковано + + + label.tags + Теги + + + label.actions + Дії + + + title.post_new + Створення запису + + + action.edit_contents + Редагувати зміст + + + + menu.toggle_nav + Переключити навігацію + + + menu.choose_language + Вибрати мову + + + menu.post_list + Список записів + + + menu.back_to_blog + Назад до блогу + + + menu.homepage + Головна сторінка + + + menu.admin + Панель керування + + + menu.user + Обліковий запис + + + menu.logout + Вийти + + + menu.rss + RSS Записів Блогу + + + menu.search + Пошук + + + + post.to_publish_a_comment + опублікувати коментар + + + post.num_comments + {count, plural, one {# коментар} many {# коментаря} other {# коментарів}} + + + post.commented_on + прокоментовано + + + post.no_comments + Будьте першими, хто прокоментує цей запис. + + + post.no_posts_found + Жодного запису не знайдено. + + + post.created_successfully + Запис успішно створений! + + + post.updated_successfully + Запис успішно оновлений! + + + post.deleted_successfully + Запис успішно видалений! + + + post.search_for + Шукати... + + + post.search_no_results + Нічого не знайдено + + + + user.updated_successfully + Користувача оновлено успішно! + + + + notification.comment_created + Ваш запис отримав коментар! + + + notification.comment_created.description + цим посиланням]]> + + + + help.app_description + демо додаток створено на основі Symfony фреймворку для того, щоб показати рекомендований спосіб розробки Symfony додатків.]]> + + + help.show_code + контролеру та шаблону, які використовувалися для побудови цієї сторінки.]]> + + + help.browse_app + публічного розділу демо додатку.]]> + + + help.browse_admin + панелі керування демо додатку.]]> + + + help.login_users + Використовуйте будь-якого з наступних користувачів + + + help.role_user + звичайний користувач + + + help.role_admin + адміністратор + + + help.reload_fixtures + Якщо ці користувачі не працюють, перезавантажте фікстури додатку, виконавши в консолі наступну команду: + + + help.add_user + Якщо ви хочете створити нових користувачів, скористайтеся наступною командою: + + + help.more_information + Symfony документації.]]> + + + help.post_summary + Короткий зміст не може містити Markdown розмітку або HTML контент; лише звичайний текст. + + + help.post_publication + Встановіть дату в майбутньому, щоб запланувати публікацію запису. + + + help.post_content + Використовуйте Markdown розмітку для форматування змісту запису. HTML також дозволений. + + + help.comment_content + Коментарі, які не відповідають нашому Кодексу поведінки, будуть модеровані. + + + + info.change_password + Після зміни пароля, ви вийдете із програми. + + + + rss.title + Symfony Demo блог + + + rss.description + Найновіші записи, опубліковані в Symfony Demo блозі + + + + paginator.previous + Назад + + + paginator.next + Далі + + + paginator.current + (поточна) + + + + diff --git a/translations/messages+intl-icu.zh_CN.xlf b/translations/messages+intl-icu.zh_CN.xlf new file mode 100644 index 00000000..2fe36872 --- /dev/null +++ b/translations/messages+intl-icu.zh_CN.xlf @@ -0,0 +1,439 @@ + + + + + + note + 注意 + + + tip + 提示 + + + not_available + 不可用 + + + mit_license + MIT License + + + + http_error.name + 错误 {status_code, number} + + + http_error.description + 有未知错误 (HTTP {status_code, number}) 阻止你的请求. + + + http_error.suggestion + 返回首页.]]> + + + http_error_403.description + 你没有权限访问这个资源. + + + http_error_403.suggestion + 请联系系统管理员给你访问这个资源的权限. + + + http_error_404.description + 无法找到请求的页面. + + + http_error_404.suggestion + 返回首页.]]> + + + http_error_500.description + 服务器错误. + + + http_error_500.suggestion + 返回首页.]]> + + + + title.homepage + Symfony 示例 应用]]> + + + title.source_code + 渲染此页面的源代码 + + + title.controller_code + Controller 控制器代码 + + + title.twig_template_code + Twig 模板代码 + + + title.login + 登录 + + + title.post_list + 文章列表 + + + title.edit_post + 编辑文章 #{id, number} + + + title.add_comment + 发表评论 + + + title.comment_error + 发表评论出错 + + + title.edit_user + 编辑用户 + + + + action.show + 展示 + + + action.show_post + 展示文章 + + + action.show_code + 展示代码 + + + action.edit + 编辑 + + + action.edit_post + 编辑文章 + + + action.save + 保存修改 + + + action.delete_post + 删除文章 + + + delete_post_modal.title + 确定要删除此文章吗? + + + delete_post_modal.body + 这个操作无法撤销. + + + label.delete_post + 删除文章 + + + label.cancel + 取消 + + + action.create_post + 添加一篇新文章 + + + label.create_post + 保存文章 + + + label.save_and_create_new + 保存并添加新文章 + + + label.fullname + 全名 + + + label.email + 邮箱 + + + label.current_password + 当前密码 + + + label.new_password + 新密码 + + + label.new_password_confirm + 确认密码 + + + + action.back_to_list + 返回文章列表 + + + action.publish_comment + 发表评论 + + + action.sign_in + 登录 + + + action.browse_app + 浏览博客前台 + + + action.browse_admin + 浏览管理后台 + + + action.change_password + 修改密码 + + + + label.title + 标题 + + + label.author + 作者 + + + label.author_email + 作者邮箱 + + + label.username + 用户名 + + + label.password + 密码 + + + label.role + 角色 + + + label.content + 内容 + + + label.summary + 摘要 + + + label.published_at + 发布于 + + + label.tags + 标签 + + + label.actions + 操作 + + + title.post_new + 文章创建者 + + + title.change_password + 修改密码 + + + action.edit_contents + 编辑内容 + + + action.edit_user + 编辑用户 + + + + menu.toggle_nav + 切换导航 + + + menu.choose_language + 选择语言 + + + menu.post_list + 文章列表 + + + menu.back_to_blog + 返回博客 + + + menu.homepage + 主页 + + + menu.admin + 后台 + + + menu.logout + 登出 + + + menu.rss + 博客文章 RSS + + + menu.search + 搜索 + + + menu.user + 帐户 + + + + post.to_publish_a_comment + 发表评论 + + + post.num_comments + {count} 评论 + + + post.commented_on + 评论于 + + + post.no_comments + 成为文章的第一个评论者. + + + post.no_posts_found + 没有评论. + + + post.created_successfully + 评论发表成功! + + + post.updated_successfully + 评论更新成功! + + + post.deleted_successfully + 评论删除成功! + + + post.search_for + 输入关键字... + + + post.search_no_results + 没有匹配到结果! + + + + notification.comment_created + 收到一条新评论! + + + notification.comment_created.description + 查看评论]]> + + + + help.app_description + 示例应用 , 用以介绍开发Symfony应用的推荐方式.]]> + + + help.show_code + Controller 控制器 和 Twig 模板 的源代码.]]> + + + help.browse_app + 公共部分 .]]> + + + help.browse_admin + 管理后台 .]]> + + + help.login_users + 使用以下用户登录 + + + help.role_user + 普通用户 + + + help.role_admin + 管理员 + + + help.reload_fixtures + 如果这些用户无法使用, 在终端中使用以下命令来重新加载应用数据: + + + help.add_user + 如果你想要创建用户, 使用命令: + + + help.more_information + Symfony 文档 .]]> + + + help.comment_content + 不符合我们行为准则的评论将被审核。 + + + help.post_summary + 摘要不能包含 Markdown 或 HTML 内容,仅纯文本。 + + + help.post_content + 使用 Markdown 格式化博客文章内容,也允许 HTML。 + + + help.post_publication + 设置博客文章的发布日期。 + + + + rss.title + Symfony Demo blog + + + rss.description + Symfony 示例博客上发布的最新文章 + + + + paginator.previous + 上一页 + + + paginator.current + 当前页 + + + paginator.next + 下一页 + + + + info.change_password + 更改密码后,您将退出应用程序。 + + + + diff --git a/translations/validators+intl-icu.bg.xlf b/translations/validators+intl-icu.bg.xlf new file mode 100644 index 00000000..72aa1ce1 --- /dev/null +++ b/translations/validators+intl-icu.bg.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Напишете обобщение на публикацията си! + + + post.blank_content + Публикацията трябва да има съдържание! + + + post.too_short_content + Съдержанието на публикацията е прекалено малко ({ limit } минимум символа) + + + post.too_many_tags + Прекалено много тагове (добави { limit } тага или по-малко) + + + comment.blank + Моля не оставяйте коментара празен! + + + comment.too_short + Коментара е пркалено кратък ({ limit } симвала минимум) + + + comment.too_long + Коментара е прекалено дълъг ({ limit } симвала максимум) + + + comment.is_spam + Съдържанието на коментара се разглежда като спам. + + + + diff --git a/translations/validators+intl-icu.ca.xlf b/translations/validators+intl-icu.ca.xlf new file mode 100644 index 00000000..b1e0f808 --- /dev/null +++ b/translations/validators+intl-icu.ca.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + No és possible deixar buit el resum de l'article. + + + post.blank_content + No és possible deixar buit el contingut de l'article. + + + post.too_short_content + El contingut de l'article és massa curt ({ limit } caràcters com a mínim) + + + comment.blank + No és possible deixar buit el contingut del comentari. + + + comment.too_short + El comentari és massa curt ({ limit } caràcters com a mínim) + + + comment.too_long + El comentari és massa llarg ({ limit } caràcters com a màxim) + + + comment.is_spam + El contingut del comentari es considera spam. + + + + diff --git a/translations/validators+intl-icu.cs.xlf b/translations/validators+intl-icu.cs.xlf new file mode 100644 index 00000000..10d404bf --- /dev/null +++ b/translations/validators+intl-icu.cs.xlf @@ -0,0 +1,31 @@ + + + + + + post.blank_summary + Napište shrnutí příspěvku! + + + post.too_short_content + Příspěvek je příliš krátký (musí mít minimálně { limit } znak)|Příspěvek je příliš krátký (musí mít minimálně { limit } znaky)|Příspěvek je příliš krátký (musí mít minimálně { limit } znaků) + + + comment.blank + Prosím, napište text komentáře! + + + comment.too_short + Komentář je příliš krátký (musí mít minimálně { limit } znak)|Komentář je příliš krátký (musí mít minimálně { limit } znaky)|Komentář je příliš krátký (musí mít minimálně { limit } znaků) + + + comment.too_long + Komentář je příliš dlouhý (musí mít maximálně { limit } znak)|Komentář je příliš dlouhý (musí mít maximálně { limit } znaky)|Komentář je příliš dlouhý (musí mít maximálně { limit } znaků) + + + comment.is_spam + Obsah tohoto komentáře je považován za spam. + + + + diff --git a/translations/validators+intl-icu.de.xlf b/translations/validators+intl-icu.de.xlf new file mode 100644 index 00000000..0da643f3 --- /dev/null +++ b/translations/validators+intl-icu.de.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Gib deinem Beitrag eine Zusammenfassung! + + + post.blank_content + Dein Beitrag sollte einen Inhalt haben! + + + post.too_short_content + Der Beitragsinhalt ist zu kurz (mindestens { limit } Zeichen) + + + comment.blank + Bitte gib einen Kommentar ein! + + + comment.too_short + Der Kommentar ist zu kurz (mindestens { limit } Zeichen) + + + comment.too_long + Der Kommentar ist zu lang (maximal { limit } Zeichen) + + + comment.is_spam + Der Inhalt des Kommentars wird als Spam eingestuft. + + + post.too_many_tags + Zu viele Tags (höchstens { limit } Tags sind erlaubt) + + + + diff --git a/translations/validators+intl-icu.en.xlf b/translations/validators+intl-icu.en.xlf new file mode 100644 index 00000000..d27c627d --- /dev/null +++ b/translations/validators+intl-icu.en.xlf @@ -0,0 +1,43 @@ + + + + + + post.slug_unique + This title was already used in another blog post, but they must be unique. + + + post.blank_summary + Give your post a summary! + + + post.blank_content + Your post should have some content! + + + post.too_short_content + Post content is too short ({ limit } characters minimum) + + + post.too_many_tags + Too many tags (add { limit } tags or less) + + + comment.blank + Please don't leave your comment blank! + + + comment.too_short + Comment is too short ({ limit } characters minimum) + + + comment.too_long + Comment is too long ({ limit } characters maximum) + + + comment.is_spam + The content of this comment is considered spam. + + + + diff --git a/translations/validators+intl-icu.es.xlf b/translations/validators+intl-icu.es.xlf new file mode 100644 index 00000000..1628a6fd --- /dev/null +++ b/translations/validators+intl-icu.es.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + No es posible dejar el resumen del artículo vacío. + + + post.blank_content + No es posible dejar el contenido del artículo vacío. + + + post.too_short_content + El contenido del artículo es demasiado corto ({ limit } caracteres como mínimo) + + + post.too_many_tags + Demasiadas etiquetas (añade { limit } como máximo) + + + comment.blank + No es posible dejar el contenido del comentario vacío. + + + comment.too_short + El comentario es demasiado corto ({ limit } caracteres como mínimo) + + + comment.too_long + El comentario es demasiado largo ({ limit } caracteres como máximo) + + + comment.is_spam + El contenido del comentario se considera spam. + + + + diff --git a/translations/validators+intl-icu.fr.xlf b/translations/validators+intl-icu.fr.xlf new file mode 100644 index 00000000..09b37ec6 --- /dev/null +++ b/translations/validators+intl-icu.fr.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + Veuillez donner un résumé à votre post. + + + post.blank_content + Veuillez donner un contenu à votre post. + + + post.too_short_content + Le contenu de votre post est trop court ({ limit } caractères minimum) + + + comment.blank + Veuillez ne pas laisser votre commentaire vide. + + + comment.too_short + Votre commentaire est trop court ({ limit } caractères minimum) + + + comment.too_long + Votre commentaire est trop long ({ limit } caractères maximum) + + + comment.is_spam + Le contenu de votre commentaire est considéré comme du spam. + + + + diff --git a/translations/validators+intl-icu.hr.xlf b/translations/validators+intl-icu.hr.xlf new file mode 100644 index 00000000..76b02c7e --- /dev/null +++ b/translations/validators+intl-icu.hr.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Dodajte sažetak svojem članku! + + + post.blank_content + Vaš članak treba imati sadržaj! + + + post.too_short_content + Sadržaj članka je prekratak (koristiti minimalno { limit } slova ili simbola) + + + post.too_many_tags + Previše oznaka (dodaj najviše { limit } oznaka ili manje) + + + comment.blank + Molim ne ostavljajte svoj komentar praznim! + + + comment.too_short + Komentar je prekratak (potrebno je minimalno { limit } slova ili simbola) + + + comment.too_long + Komentar je predugačak (koristiti maksimalno { limit } slova ili simbola) + + + comment.is_spam + Sadržaj ovog komentara smatra se spam sadržajem. + + + + diff --git a/translations/validators+intl-icu.id.xlf b/translations/validators+intl-icu.id.xlf new file mode 100644 index 00000000..50df8cc5 --- /dev/null +++ b/translations/validators+intl-icu.id.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + Beri posting anda ringkasan! + + + post.blank_content + Posting anda harus mempunyai konten! + + + post.too_short_content + Konten terlalu singkat (Minimal { limit } karakter) + + + comment.blank + Mohon jangan tinggalkan komentar kosong! + + + comment.too_short + Komentar terlalu singkat (Minimal { limit } karakter) + + + comment.too_long + Komentar terlalu panjang (Maksimal { limit } karakter) + + + comment.is_spam + Konten komentar ini dianggap sebagai spam. + + + + diff --git a/translations/validators+intl-icu.it.xlf b/translations/validators+intl-icu.it.xlf new file mode 100644 index 00000000..401ca522 --- /dev/null +++ b/translations/validators+intl-icu.it.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + Da' una descrizione al tuo post! + + + post.blank_content + Da' un contenuto al tuo post! + + + post.too_short_content + Il contenuto del post è troppo breve (minimo { limit } caratteri) + + + comment.blank + Per favore non lasciare in bianco il tuo commento! + + + comment.too_short + Il commento è troppo breve (minimo { limit } caratteri) + + + comment.too_long + Il commento è troppo lungo (massimo { limit } caratteri) + + + comment.is_spam + Il contenuto di questo commento è considerato come spam. + + + + diff --git a/translations/validators+intl-icu.ja.xlf b/translations/validators+intl-icu.ja.xlf new file mode 100644 index 00000000..4eea7d94 --- /dev/null +++ b/translations/validators+intl-icu.ja.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + 要約を入力してください。 + + + post.blank_content + 本文を入力してください。 + + + post.too_short_content + 本文が短すぎます ({ limit } 文字以上必要です) + + + comment.blank + コメントを入力してください。 + + + comment.too_short + コメントが短すぎます ({ limit } 文字以上必要です) + + + comment.too_long + コメントが長すぎます ({ limit } 文字以下にしてください) + + + comment.is_spam + コメントの内容がスパムと判定されました。 + + + + diff --git a/translations/validators+intl-icu.lt.xlf b/translations/validators+intl-icu.lt.xlf new file mode 100644 index 00000000..9f6a45bd --- /dev/null +++ b/translations/validators+intl-icu.lt.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Įrašo santrauka negali būti tuščia + + + post.blank_content + Įrašo turinys negali būti tuščias + + + post.too_short_content + Per trumpas įrašo turinys (nesiekia { limit } simbolių) + + + post.too_many_tags + Per daug žymų (viršyja { limit }) + + + comment.blank + Komentaras negali būti tuščias + + + comment.too_short + Per trumpas komentaras (nesiekia { limit } simbolių) + + + comment.too_long + Per ilgas komentaras (viršyja { limit } simbolių) + + + comment.is_spam + Komentaras traktuojamas kaip brukalas. + + + + diff --git a/translations/validators+intl-icu.nl.xlf b/translations/validators+intl-icu.nl.xlf new file mode 100644 index 00000000..19a7c640 --- /dev/null +++ b/translations/validators+intl-icu.nl.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + Geef uw bericht een samenvatting. + + + post.blank_content + Uw bericht heeft nog geen inhoud. + + + post.too_short_content + Bericht inhoud is te kort (minimaal { limit } karakters) + + + comment.blank + Vul alstublieft een reactie in. + + + comment.too_short + Reactie is te kort (minimaal { limit } karakters) + + + comment.too_long + Reactie is te lang (maximaal { limit } karakters) + + + comment.is_spam + De inhoud van deze reactie wordt als spam gemarkeerd. + + + + diff --git a/translations/validators+intl-icu.pl.xlf b/translations/validators+intl-icu.pl.xlf new file mode 100644 index 00000000..68bb9ee4 --- /dev/null +++ b/translations/validators+intl-icu.pl.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + Dodaj podsumowanie Twojego artykułu! + + + post.blank_content + Treść artykułu nie może być pusta! + + + post.too_short_content + Treść artykułu jest za krótka (minimum: { limit } znak)|Treść artykułu jest za krótka (minimum: { limit } znaki)|Treść artykułu jest za krótka (minimum: { limit } znaków) + + + comment.blank + Pole komentarza nie może być puste! + + + comment.too_short + Twój komentarz jest za krótki (minimum: { limit } znak)|Twój komentarz jest za krótki (minimum: { limit } znaki)|Twój komentarz jest za krótki (minimum: { limit } znaków) + + + comment.too_long + Twój komentarz jest za długi (maksimum: { limit } znak)|Twój komentarz jest za długi (maksimum: { limit } znaki)|Twój komentarz jest za długi (maksimum: { limit } znaków) + + + comment.is_spam + Twój komentarz został uznany za spam. + + + + diff --git a/translations/validators+intl-icu.pt_BR.xlf b/translations/validators+intl-icu.pt_BR.xlf new file mode 100644 index 00000000..f6e2ac6c --- /dev/null +++ b/translations/validators+intl-icu.pt_BR.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Informe um sumário para o seu post! + + + post.blank_content + Informe um conteúdo para o seu post! + + + post.too_short_content + O conteúdo do post está muito curto (mínimo de { limit } caracteres) + + + post.too_many_tags + Tags demais (adicione { limit } tags ou menos) + + + comment.blank + Por favor, não deixe seu comentário vazio! + + + comment.too_short + O comentário está muito curto (mínimo de { limit } caracteres) + + + comment.too_long + O comentário está muito grande (máximo de { limit } caracteres) + + + comment.is_spam + O conteúdo desse comentário é considerado spam. + + + + diff --git a/translations/validators+intl-icu.ro.xlf b/translations/validators+intl-icu.ro.xlf new file mode 100644 index 00000000..087ef1e5 --- /dev/null +++ b/translations/validators+intl-icu.ro.xlf @@ -0,0 +1,35 @@ + + + + + + post.blank_summary + Dă articolului tău un rezumat! + + + post.blank_content + Articolul ar trebui să aibe conținut! + + + post.too_short_content + Conţinutul articolului este prea scurt (minimum { limit } caractere) + + + comment.blank + Te rugăm nu lăsa comentariul tău necompletat! + + + comment.too_short + Comentariul este prea scurt (minimum { limit } caractere) + + + comment.too_long + Comentariul este prea lung (maximum { limit } caractere) + + + comment.is_spam + Conţinutul acestui comentariu este considerat spam. + + + + diff --git a/translations/validators+intl-icu.ru.xlf b/translations/validators+intl-icu.ru.xlf new file mode 100644 index 00000000..3cca24d3 --- /dev/null +++ b/translations/validators+intl-icu.ru.xlf @@ -0,0 +1,43 @@ + + + + + + post.slug_unique + Такой заголовок уже используется в другой записи в блоге. Пожалуйста, используйте уникальный заголовок. + + + post.blank_summary + Введите краткое содержание вашей записи! + + + post.blank_content + Ваша запись должна содержать хоть какое-то содержание! + + + post.too_short_content + Содержание записи слишком короткое (минимум { limit } символов). + + + post.too_many_tags + Слишком много тегов (добавьте { limit } тегов или меньше) + + + comment.blank + Пожалуйста, не оставляйте текст комментария пустым! + + + comment.too_short + Комментарий слишком короткий, (минимум { limit } символов). + + + comment.too_long + Комментарий слишком длинный, (максимум { limit } символов). + + + comment.is_spam + Содержание этого комментария было расценено как спам. + + + + diff --git a/translations/validators+intl-icu.sl.xlf b/translations/validators+intl-icu.sl.xlf new file mode 100644 index 00000000..c9aaec04 --- /dev/null +++ b/translations/validators+intl-icu.sl.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Dodajte vaši objavi povzetek! + + + post.blank_content + Vaša objava mora imeti nekaj vsebine! + + + post.too_short_content + Vsebina objave je prekratka (vsaj { limit } znakov) + + + post.too_many_tags + Preveč značk (dodajte { limit } ali manj značk) + + + comment.blank + Ne pustite vašega komentarja praznega! + + + comment.too_short + Komentar je prekratek (vsaj { limit } znakov) + + + comment.too_long + Komentar je predolg (največ { limit } znakov) + + + comment.is_spam + Vsebina tega komentarja se smatra za spam. + + + + diff --git a/translations/validators+intl-icu.tr.xlf b/translations/validators+intl-icu.tr.xlf new file mode 100644 index 00000000..04dfff72 --- /dev/null +++ b/translations/validators+intl-icu.tr.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + Gönderiniz için bir özet giriniz! + + + post.blank_content + Gönderiniz bir içeriğe sahip olmalı! + + + post.too_short_content + Yayın içeriği çok kısa ({ limit } minimum karakter) + + + post.too_many_tags + Çok fazla etiket var ({ limit } etiketini veya daha azını ekleyin) + + + comment.blank + Lütfen yorumunuzu boş bırakmayın! + + + comment.too_short + Yorum çok kısa ({ limit } minimum karakter) + + + comment.too_long + Yorum çok uzun ({ limit } maksimum karakter) + + + comment.is_spam + Bu yorumun içeriği spam olarak kabul edilir. + + + + diff --git a/translations/validators+intl-icu.uk.xlf b/translations/validators+intl-icu.uk.xlf new file mode 100644 index 00000000..d1c22d34 --- /dev/null +++ b/translations/validators+intl-icu.uk.xlf @@ -0,0 +1,43 @@ + + + + + + post.slug_unique + Цей заголовок вже використовується в іншому записі, але повинен бути унікальним. + + + post.blank_summary + Введіть короткий зміст вашого запису! + + + post.blank_content + Ваш запис повинен містити хоч якийсь зміст! + + + post.too_short_content + Зміст запису занадто короткий (мінімум { limit } символів). + + + post.too_many_tags + Занадто багато тегів (додайте { limit } тегів або менше) + + + comment.blank + Будь ласка, не залишайте текст коментаря порожнім! + + + comment.too_short + Коментар занадто короткий, (мінімум { limit } символів). + + + comment.too_long + Коментар занадто довгий, (максимум { limit } символів). + + + comment.is_spam + Зміст цього коментаря було розцінено як спам. + + + + diff --git a/translations/validators+intl-icu.zh_CN.xlf b/translations/validators+intl-icu.zh_CN.xlf new file mode 100644 index 00000000..b7676c93 --- /dev/null +++ b/translations/validators+intl-icu.zh_CN.xlf @@ -0,0 +1,39 @@ + + + + + + post.blank_summary + 请填写文章摘要! + + + post.blank_content + 请填写文章内容! + + + post.too_short_content + 文章内容太少 最少 ({ limit } 个字 ) + + + post.too_many_tags + 标签太多 (最多 { limit } 个标签) + + + comment.blank + 评论内容不能为空! + + + comment.too_short + 评论内容太少 (最少 { limit } 个字) + + + comment.too_long + 评论内容太多 (最多 { limit } 个字) + + + comment.is_spam + 非法评论. + + + + diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..bd776145 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,36 @@ +// This project uses "Yarn" package manager for managing JavaScript dependencies along +// with "Webpack Encore" library that helps working with the CSS and JavaScript files +// that are stored in the "assets/" directory. +// +// Read https://symfony.com/doc/current/frontend.html to learn more about how +// to manage CSS and JavaScript files in Symfony applications. +var Encore = require('@symfony/webpack-encore'); + +Encore + .setOutputPath('public/build/') + .setPublicPath('/build') + .cleanupOutputBeforeBuild() + .autoProvidejQuery() + .autoProvideVariables({ + "window.Bloodhound": require.resolve('bloodhound-js'), + "jQuery.tagsinput": "bootstrap-tagsinput" + }) + .enableSassLoader() + // when versioning is enabled, each filename will include a hash that changes + // whenever the contents of that file change. This allows you to use aggressive + // caching strategies. Use Encore.isProduction() to enable it only for production. + .enableVersioning(false) + .addEntry('app', './assets/js/app.js') + .addEntry('login', './assets/js/login.js') + .addEntry('admin', './assets/js/admin.js') + .addEntry('search', './assets/js/search.js') + .splitEntryChunks() + .enableSingleRuntimeChunk() + .enableIntegrityHashes(Encore.isProduction()) + .configureBabel(null, { + useBuiltIns: 'usage', + corejs: 3, + }) +; + +module.exports = Encore.getWebpackConfig(); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..d3635569 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7199 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== + dependencies: + browserslist "^4.9.1" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.4.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.9.0", "@babel/generator@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" + integrity sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ== + dependencies: + "@babel/types" "^7.9.5" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-compilation-targets@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" + integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== + dependencies: + "@babel/compat-data" "^7.8.6" + browserslist "^4.9.1" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== + dependencies: + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" + integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" + +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== + +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116" + integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" + +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.8" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== + dependencies: + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-regenerator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" + integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/preset-env@^7.4.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.5.tgz#8ddc76039bc45b774b19e2fc548f6807d8a8919f" + integrity sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ== + dependencies: + "@babel/compat-data" "^7.9.0" + "@babel/helper-compilation-targets" "^7.8.7" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.9.5" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.9.0" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.7" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.5" + browserslist "^4.9.1" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.8.4": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + +"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" + integrity sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.5" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@fortawesome/fontawesome-free@^5.8.1": + version "5.13.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.0.tgz#fcb113d1aca4b471b709e8c9c168674fbd6e06d9" + integrity sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg== + +"@symfony/webpack-encore@^0.28.0": + version "0.28.3" + resolved "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-0.28.3.tgz#45b590f7b86beb7bb6918a95df89f42f72b796d0" + integrity sha512-ZXnwU6uobDCRMbZhT99c42/6j9yIM9aGWgT/we6fdaEGgJJmO1dXl4heq+flL61K3wztQqW6G54N8Q6aPcz1Xw== + dependencies: + "@babel/core" "^7.4.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/preset-env" "^7.4.0" + assets-webpack-plugin "^3.9.7" + babel-loader "^8.0.0" + chalk "^2.4.1" + clean-webpack-plugin "^0.1.19" + css-loader "^2.1.1" + fast-levenshtein "^2.0.6" + file-loader "^1.1.10" + friendly-errors-webpack-plugin "^2.0.0-beta.1" + loader-utils "^1.1.0" + mini-css-extract-plugin ">=0.4.0 <0.4.3" + optimize-css-assets-webpack-plugin "^5.0.1" + pkg-up "^1.0.0" + pretty-error "^2.1.1" + resolve-url-loader "^3.0.1" + semver "^5.5.0" + style-loader "^0.21.0" + terser-webpack-plugin "^1.1.0" + tmp "^0.0.33" + webpack "^4.20.0" + webpack-cli "^3.0.0" + webpack-dev-server "^3.1.14" + webpack-manifest-plugin "^2.0.2" + webpack-sources "^1.3.0" + yargs-parser "^12.0.0" + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn@^6.2.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +adjust-sourcemap-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz#6471143af75ec02334b219f54bc7970c52fb29a4" + integrity sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA== + dependencies: + assert "1.4.1" + camelcase "5.0.0" + loader-utils "1.2.3" + object-path "0.11.4" + regex-parser "2.2.10" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assets-webpack-plugin@^3.9.7: + version "3.9.12" + resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-3.9.12.tgz#9f3c165b37bedfadc9e47d2f7073768c0df883a8" + integrity sha512-iqXT/CtP013CO+IZJG7f4/KmUnde+nn6FSksAhrGRbT1GODsFU3xocP6A5NkTFoey3XOI9n1ZY0QmX/mY74gNA== + dependencies: + camelcase "5.3.1" + escape-string-regexp "2.0.0" + lodash "4.17.15" + mkdirp "0.5.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-loader@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bloodhound-js@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bloodhound-js/-/bloodhound-js-1.2.3.tgz#702c175f7488a14cdfedb6c0fba2dba577964d49" + integrity sha512-gpcHaO8SqK/bLwWgobLGQvIVpSdTX4fKZFjfh6ltori5aULXJxC/ndrNRf3PYGOdyD4mFIqjySXLWX4pE88VmA== + dependencies: + es6-promise "^3.0.2" + object-assign "^4.0.1" + storage2 "^0.1.0" + superagent "^3.8.3" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bootstrap-sass@^3.3.7: + version "3.4.1" + resolved "https://registry.yarnpkg.com/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz#6843c73b1c258a0ac5cb2cc6f6f5285b664a8e9a" + integrity sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA== + +bootstrap-tagsinput@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/bootstrap-tagsinput/-/bootstrap-tagsinput-0.7.1.tgz#ffe3b06bbe2a106945ef2814568005a94f211937" + integrity sha1-/+Owa74qEGlF7ygUVoAFqU8hGTc= + +bootstrap@^3.3: + version "3.4.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" + integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== + +bootswatch@^3.3.7: + version "3.4.1" + resolved "https://registry.yarnpkg.com/bootswatch/-/bootswatch-3.4.1.tgz#50aed16fb04ec791c3dd8831515c29d4a757fdb9" + integrity sha512-0hL4A8OUiqABgPipGrojf/hyhr5RS257xCNARlbK34HaMfhV5fXvwEooN4/ri9+jgX47J4Wg24ZPmfZ2xD2cKw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.8.3, browserslist@^4.9.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" + integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== + dependencies: + caniuse-lite "^1.0.30001038" + electron-to-chromium "^1.3.390" + node-releases "^1.1.53" + pkg-up "^2.0.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001038: + version "1.0.30001039" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" + integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-webpack-plugin@^0.1.19: + version "0.1.19" + resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz#ceda8bb96b00fe168e9b080272960d20fdcadd6d" + integrity sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA== + dependencies: + rimraf "^2.6.1" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.0, component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookiejar@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + dependencies: + browserslist "^4.8.3" + semver "7.0.0" + +core-js@^3.0.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" + integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== + dependencies: + camelcase "^5.2.0" + icss-utils "^4.1.0" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.14" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.6" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" + integrity sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw== + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== + dependencies: + is-obj "^2.0.0" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.390: + version "1.3.398" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.398.tgz#4c01e29091bf39e578ac3f66c1f157d92fa5725d" + integrity sha512-BJjxuWLKFbM5axH3vES7HKMQgAknq9PZHBkMK/rEXUQG9i1Iw5R+6hGkm6GtsQSANjSUrh/a6m32nzCNDNo/+w== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +eonasdan-bootstrap-datetimepicker@^4.17.47: + version "4.17.47" + resolved "https://registry.yarnpkg.com/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz#7a49970044065276e7965efd16f822735219e735" + integrity sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU= + dependencies: + bootstrap "^3.3" + jquery "^1.8.3 || ^2.0 || ^3.0" + moment "^2.10" + moment-timezone "^0.4.0" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.2: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^3.0.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-loader@^1.1.10: + version "1.1.11" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" + integrity sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg== + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.4.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== + dependencies: + debug "^3.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@^2.3.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +formidable@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +friendly-errors-webpack-plugin@^2.0.0-beta.1: + version "2.0.0-beta.2" + resolved "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.0.0-beta.2.tgz#69987c67c2ed3e93847248f8ba1920f75f6ff45c" + integrity sha512-0x14cdjGx5q0yZc3Cy9sgAF/szWUFx1WxH/IX88UuKbM5Z+7FCk/Z/6hFbXMcz3qqK0mp7WrHKX3cxhUAL2aqQ== + dependencies: + chalk "^2.4.2" + error-stack-parser "^2.0.2" + string-width "^2.0.0" + strip-ansi "^5" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.12" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" + integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9" + integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g== + dependencies: + glob "~7.1.1" + lodash "~4.17.12" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +highlight.js@^9.12.0: + version "9.18.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" + integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-local@2.0.0, import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imports-loader@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" + integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ== + dependencies: + loader-utils "^1.0.2" + source-map "^0.6.1" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" + integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jquery@>=1.7, "jquery@^1.8.3 || ^2.0 || ^3.0", jquery@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +js-base64@^2.1.8: + version "2.5.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209" + integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lato-font@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lato-font/-/lato-font-3.0.0.tgz#91b837e2374b668fb7331d44c894d37a2d9f8e11" + integrity sha1-kbg34jdLZo+3Mx1EyJTTei2fjhE= + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.12: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loglevel@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" + integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@^1.1.1, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +"mini-css-extract-plugin@>=0.4.0 <0.4.3": + version "0.4.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz#b3ecc0d6b1bbe5ff14add42b946a7b200cf78651" + integrity sha512-ots7URQH4wccfJq9Ssrzu2+qupbncAce4TmTzunI9CIwlQMp2XI+WNUw6xWF6MMAGAm1cbUVINrSjATaVMyKXg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" + integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== + dependencies: + minimist "^1.2.5" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +moment-timezone@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.4.1.tgz#81f598c3ad5e22cdad796b67ecd8d88d0f5baa06" + integrity sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY= + dependencies: + moment ">= 2.6.0" + +"moment@>= 2.6.0", moment@^2.10: + version "2.25.3" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.25.3.tgz#252ff41319cf41e47761a1a88cab30edfe9808c0" + integrity sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1, nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + +node-sass@^4.9.3: + version "4.13.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" + integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" + integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" + integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + integrity sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY= + dependencies: + find-up "^1.0.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" + integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + postcss-value-parser "^3.3.1" + +postcss-modules-scope@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +pretty-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@^6.5.1: + version "6.9.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@2.2.10: + version "2.2.10" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.10.tgz#9e66a8f73d89a107616e63b39d4deddfee912b37" + integrity sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA== + +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.87.0, request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url-loader@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz#28931895fa1eab9be0647d3b2958c100ae3c0bf0" + integrity sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ== + dependencies: + adjust-sourcemap-loader "2.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.3.2: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^7.1.0: + version "7.3.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.3.1.tgz#a5bf68a04bcea1c13ff842d747150f7ab7d0d23f" + integrity sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.0.1" + neo-async "^2.5.0" + pify "^4.0.1" + semver "^6.3.0" + +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" + integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stackframe@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.1.1.tgz#ffef0a3318b1b60c3b58564989aca5660729ec71" + integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +storage2@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/storage2/-/storage2-0.1.1.tgz#c6bcc8c66254860a7dda70156dbb3508885eb997" + integrity sha512-WvgkYqQnpy0ElxtJfekp/I8evoafc8iZ57efcV+m74JjTJTksWHwF5RXnK2WMOUN61oeuV9buxP6PkldpbWb2g== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimend@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" + integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" + +string.prototype.trimright@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" + integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +style-loader@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" + integrity sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +superagent@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" + integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.1.0" + debug "^3.1.0" + extend "^3.0.0" + form-data "^2.3.1" + formidable "^1.2.0" + methods "^1.1.1" + mime "^1.4.1" + qs "^6.5.1" + readable-stream "^2.3.5" + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.10" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" + integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typeahead.js@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/typeahead.js/-/typeahead.js-0.11.1.tgz#4e64e671b22310a8606f4aec805924ba84b015b8" + integrity sha1-TmTmcbIjEKhgb0rsgFkkuoSwFbg= + dependencies: + jquery ">=1.7" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== + dependencies: + chokidar "^2.1.8" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^3.0.0: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.1.14: + version "3.10.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.2.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.6" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.25" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-manifest-plugin@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" + integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== + dependencies: + fs-extra "^7.0.0" + lodash ">=3.5 <5" + object.entries "^1.1.0" + tapable "^1.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.20.0: + version "4.42.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" + integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-12.0.0.tgz#18aa348854747dfe1002d01bd87d65df10d40a84" + integrity sha512-WQM8GrbF5TKiACr7iE3I2ZBNC7qC9taKPMfjJaMD2LkOJQhIctASxKXdFAOPim/m47kgAQBVIaPlFjnRdkol7w== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.0: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs@12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0"