diff --git a/UPGRADE-4.3.md b/UPGRADE-4.3.md
index 2a470c36ce..cb66993901 100644
--- a/UPGRADE-4.3.md
+++ b/UPGRADE-4.3.md
@@ -96,7 +96,7 @@ Form
----
* Using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled is deprecated.
- * Using names for buttons that do not start with a letter, a digit, or an underscore is deprecated and will lead to an
+ * Using names for buttons that do not start with a lowercase letter, a digit, or an underscore is deprecated and will lead to an
exception in 5.0.
* Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons is deprecated and
will lead to an exception in 5.0.
diff --git a/UPGRADE-5.0.md b/UPGRADE-5.0.md
index c870791cb9..12a34a85d3 100644
--- a/UPGRADE-5.0.md
+++ b/UPGRADE-5.0.md
@@ -160,7 +160,7 @@ Form
without configuring a reference date.
* Removed support for using `int` or `float` as data for the `NumberType` when the `input` option is set to `string`.
* Removed support for using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled.
- * Using names for buttons that do not start with a letter, a digit, or an underscore leads to an exception.
+ * Using names for buttons that do not start with a lowercase letter, a digit, or an underscore leads to an exception.
* Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons leads to an
exception.
* Using the `date_format`, `date_widget`, and `time_widget` options of the `DateTimeType` when the `widget` option is
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
index 5797cdec7e..651cdb9c3b 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php
@@ -1074,7 +1074,11 @@ class Configuration implements ConfigurationInterface
->ifString()->then(function ($v) { return ['enabled' => true, 'resources' => $v]; })
->end()
->beforeNormalization()
- ->ifTrue(function ($v) { return \is_array($v) && !isset($v['resources']); })
+ ->ifTrue(function ($v) { return \is_array($v) && !isset($v['enabled']); })
+ ->then(function ($v) { return $v + ['enabled' => true]; })
+ ->end()
+ ->beforeNormalization()
+ ->ifTrue(function ($v) { return \is_array($v) && !isset($v['resources']) && !isset($v['resource']); })
->then(function ($v) {
$e = $v['enabled'];
unset($v['enabled']);
@@ -1093,7 +1097,19 @@ class Configuration implements ConfigurationInterface
->end()
->beforeNormalization()
->ifTrue(function ($v) { return \is_array($v) && array_keys($v) === range(0, \count($v) - 1); })
- ->then(function ($v) { return ['default' => $v]; })
+ ->then(function ($v) {
+ $resources = [];
+ foreach ($v as $resource) {
+ $resources = array_merge_recursive(
+ $resources,
+ \is_array($resource) && isset($resource['name'])
+ ? [$resource['name'] => $resource['value']]
+ : ['default' => $resource]
+ );
+ }
+
+ return $resources;
+ })
->end()
->prototype('array')
->beforeNormalization()->ifString()->then(function ($v) { return [$v]; })->end()
diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
index f2faf79d69..05ffb61b70 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php
@@ -187,6 +187,69 @@ class ConfigurationTest extends TestCase
yield [$createPackageConfig($config), 'You cannot use both "version" and "json_manifest_path" at the same time under "assets" packages.'];
}
+ /**
+ * @dataProvider provideValidLockConfigurationTests
+ */
+ public function testValidLockConfiguration($lockConfig, $processedConfig)
+ {
+ $processor = new Processor();
+ $configuration = new Configuration(true);
+ $config = $processor->processConfiguration($configuration, [
+ [
+ 'lock' => $lockConfig,
+ ],
+ ]);
+
+ $this->assertArrayHasKey('lock', $config);
+
+ $this->assertEquals($processedConfig, $config['lock']);
+ }
+
+ public function provideValidLockConfigurationTests()
+ {
+ yield [null, ['enabled' => true, 'resources' => ['default' => [class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphore' : 'flock']]]];
+
+ yield ['flock', ['enabled' => true, 'resources' => ['default' => ['flock']]]];
+ yield [['flock', 'semaphore'], ['enabled' => true, 'resources' => ['default' => ['flock', 'semaphore']]]];
+ yield [['foo' => 'flock', 'bar' => 'semaphore'], ['enabled' => true, 'resources' => ['foo' => ['flock'], 'bar' => ['semaphore']]]];
+ yield [['foo' => ['flock', 'semaphore'], 'bar' => 'semaphore'], ['enabled' => true, 'resources' => ['foo' => ['flock', 'semaphore'], 'bar' => ['semaphore']]]];
+ yield [['default' => 'flock'], ['enabled' => true, 'resources' => ['default' => ['flock']]]];
+
+ yield [['enabled' => false, 'flock'], ['enabled' => false, 'resources' => ['default' => ['flock']]]];
+ yield [['enabled' => false, ['flock', 'semaphore']], ['enabled' => false, 'resources' => ['default' => ['flock', 'semaphore']]]];
+ yield [['enabled' => false, 'foo' => 'flock', 'bar' => 'semaphore'], ['enabled' => false, 'resources' => ['foo' => ['flock'], 'bar' => ['semaphore']]]];
+ yield [['enabled' => false, 'foo' => ['flock', 'semaphore']], ['enabled' => false, 'resources' => ['foo' => ['flock', 'semaphore']]]];
+ yield [['enabled' => false, 'default' => 'flock'], ['enabled' => false, 'resources' => ['default' => ['flock']]]];
+
+ yield [['resources' => 'flock'], ['enabled' => true, 'resources' => ['default' => ['flock']]]];
+ yield [['resources' => ['flock', 'semaphore']], ['enabled' => true, 'resources' => ['default' => ['flock', 'semaphore']]]];
+ yield [['resources' => ['foo' => 'flock', 'bar' => 'semaphore']], ['enabled' => true, 'resources' => ['foo' => ['flock'], 'bar' => ['semaphore']]]];
+ yield [['resources' => ['foo' => ['flock', 'semaphore'], 'bar' => 'semaphore']], ['enabled' => true, 'resources' => ['foo' => ['flock', 'semaphore'], 'bar' => ['semaphore']]]];
+ yield [['resources' => ['default' => 'flock']], ['enabled' => true, 'resources' => ['default' => ['flock']]]];
+
+ yield [['enabled' => false, 'resources' => 'flock'], ['enabled' => false, 'resources' => ['default' => ['flock']]]];
+ yield [['enabled' => false, 'resources' => ['flock', 'semaphore']], ['enabled' => false, 'resources' => ['default' => ['flock', 'semaphore']]]];
+ yield [['enabled' => false, 'resources' => ['foo' => 'flock', 'bar' => 'semaphore']], ['enabled' => false, 'resources' => ['foo' => ['flock'], 'bar' => ['semaphore']]]];
+ yield [['enabled' => false, 'resources' => ['foo' => ['flock', 'semaphore'], 'bar' => 'semaphore']], ['enabled' => false, 'resources' => ['foo' => ['flock', 'semaphore'], 'bar' => ['semaphore']]]];
+ yield [['enabled' => false, 'resources' => ['default' => 'flock']], ['enabled' => false, 'resources' => ['default' => ['flock']]]];
+
+ // xml
+
+ yield [['resource' => ['flock']], ['enabled' => true, 'resources' => ['default' => ['flock']]]];
+ yield [['resource' => ['flock', ['name' => 'foo', 'value' => 'semaphore']]], ['enabled' => true, 'resources' => ['default' => ['flock'], 'foo' => ['semaphore']]]];
+ yield [['resource' => [['name' => 'foo', 'value' => 'flock']]], ['enabled' => true, 'resources' => ['foo' => ['flock']]]];
+ yield [['resource' => [['name' => 'foo', 'value' => 'flock'], ['name' => 'foo', 'value' => 'semaphore']]], ['enabled' => true, 'resources' => ['foo' => ['flock', 'semaphore']]]];
+ yield [['resource' => [['name' => 'foo', 'value' => 'flock'], ['name' => 'bar', 'value' => 'semaphore']]], ['enabled' => true, 'resources' => ['foo' => ['flock'], 'bar' => ['semaphore']]]];
+ yield [['resource' => [['name' => 'foo', 'value' => 'flock'], ['name' => 'foo', 'value' => 'semaphore'], ['name' => 'bar', 'value' => 'semaphore']]], ['enabled' => true, 'resources' => ['foo' => ['flock', 'semaphore'], 'bar' => ['semaphore']]]];
+
+ yield [['enabled' => false, 'resource' => ['flock']], ['enabled' => false, 'resources' => ['default' => ['flock']]]];
+ yield [['enabled' => false, 'resource' => ['flock', ['name' => 'foo', 'value' => 'semaphore']]], ['enabled' => false, 'resources' => ['default' => ['flock'], 'foo' => ['semaphore']]]];
+ yield [['enabled' => false, 'resource' => [['name' => 'foo', 'value' => 'flock']]], ['enabled' => false, 'resources' => ['foo' => ['flock']]]];
+ yield [['enabled' => false, 'resource' => [['name' => 'foo', 'value' => 'flock'], ['name' => 'foo', 'value' => 'semaphore']]], ['enabled' => false, 'resources' => ['foo' => ['flock', 'semaphore']]]];
+ yield [['enabled' => false, 'resource' => [['name' => 'foo', 'value' => 'flock'], ['name' => 'bar', 'value' => 'semaphore']]], ['enabled' => false, 'resources' => ['foo' => ['flock'], 'bar' => ['semaphore']]]];
+ yield [['enabled' => false, 'resource' => [['name' => 'foo', 'value' => 'flock'], ['name' => 'foo', 'value' => 'semaphore'], ['name' => 'bar', 'value' => 'semaphore']]], ['enabled' => false, 'resources' => ['foo' => ['flock', 'semaphore'], 'bar' => ['semaphore']]]];
+ }
+
public function testItShowANiceMessageIfTwoMessengerBusesAreConfiguredButNoDefaultBus()
{
$expectedMessage = 'You must specify the "default_bus" if you define more than one bus.';
diff --git a/src/Symfony/Component/Cache/LockRegistry.php b/src/Symfony/Component/Cache/LockRegistry.php
index 11d9f95756..80601be70e 100644
--- a/src/Symfony/Component/Cache/LockRegistry.php
+++ b/src/Symfony/Component/Cache/LockRegistry.php
@@ -90,8 +90,10 @@ final class LockRegistry
while (true) {
try {
// race to get the lock in non-blocking mode
- if (flock($lock, LOCK_EX | LOCK_NB)) {
- $logger && $logger->info('Lock acquired, now computing item "{key}"', ['key' => $item->getKey()]);
+ $locked = flock($lock, LOCK_EX | LOCK_NB, $wouldBlock);
+
+ if ($locked || !$wouldBlock) {
+ $logger && $logger->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]);
self::$lockedFiles[$key] = true;
$value = $callback($item, $save);
diff --git a/src/Symfony/Component/Cache/Traits/MemcachedTrait.php b/src/Symfony/Component/Cache/Traits/MemcachedTrait.php
index df0915e925..8d6e4880c2 100644
--- a/src/Symfony/Component/Cache/Traits/MemcachedTrait.php
+++ b/src/Symfony/Component/Cache/Traits/MemcachedTrait.php
@@ -28,7 +28,7 @@ trait MemcachedTrait
'persistent_id' => null,
'username' => null,
'password' => null,
- 'serializer' => 'php',
+ \Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP,
];
private $marshaller;
diff --git a/src/Symfony/Component/Form/ButtonBuilder.php b/src/Symfony/Component/Form/ButtonBuilder.php
index 64687bbb4b..3ed40f5ec1 100644
--- a/src/Symfony/Component/Form/ButtonBuilder.php
+++ b/src/Symfony/Component/Form/ButtonBuilder.php
@@ -63,7 +63,7 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface
if (preg_match('/^([^a-z0-9_].*)?(.*[^a-zA-Z0-9_\-:].*)?$/D', $name, $matches)) {
if (isset($matches[1])) {
- @trigger_error(sprintf('Using names for buttons that do not start with a letter, a digit, or an underscore is deprecated since Symfony 4.3 and will throw an exception in 5.0 ("%s" given).', $name), E_USER_DEPRECATED);
+ @trigger_error(sprintf('Using names for buttons that do not start with a lowercase letter, a digit, or an underscore is deprecated since Symfony 4.3 and will throw an exception in 5.0 ("%s" given).', $name), E_USER_DEPRECATED);
}
if (isset($matches[2])) {
@trigger_error(sprintf('Using names for buttons that do not contain only letters, digits, underscores ("_"), hyphens ("-") and colons (":") ("%s" given) is deprecated since Symfony 4.3 and will throw an exception in 5.0.', $name), E_USER_DEPRECATED);
diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md
index e91444bcff..f7cb764882 100644
--- a/src/Symfony/Component/Form/CHANGELOG.md
+++ b/src/Symfony/Component/Form/CHANGELOG.md
@@ -18,7 +18,7 @@ CHANGELOG
* added a `symbol` option to the `PercentType` that allows to disable or customize the output of the percent character
* Using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled is deprecated.
- * Using names for buttons that do not start with a letter, a digit, or an underscore is deprecated and will lead to an
+ * Using names for buttons that do not start with a lowercase letter, a digit, or an underscore is deprecated and will lead to an
exception in 5.0.
* Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons is deprecated and
will lead to an exception in 5.0.
diff --git a/src/Symfony/Component/Form/Tests/ButtonBuilderTest.php b/src/Symfony/Component/Form/Tests/ButtonBuilderTest.php
index 7bd78896d1..966b2927e9 100644
--- a/src/Symfony/Component/Form/Tests/ButtonBuilderTest.php
+++ b/src/Symfony/Component/Form/Tests/ButtonBuilderTest.php
@@ -47,6 +47,14 @@ class ButtonBuilderTest extends TestCase
$this->assertInstanceOf('\Symfony\Component\Form\ButtonBuilder', new ButtonBuilder('button[]'));
}
+ /**
+ * @group legacy
+ */
+ public function testNameStartingWithIllegalCharacters()
+ {
+ $this->assertInstanceOf('\Symfony\Component\Form\ButtonBuilder', new ButtonBuilder('Button'));
+ }
+
public function getInvalidNames()
{
return [
diff --git a/src/Symfony/Component/HttpClient/CurlHttpClient.php b/src/Symfony/Component/HttpClient/CurlHttpClient.php
index b75497b41a..525ac2fd3a 100644
--- a/src/Symfony/Component/HttpClient/CurlHttpClient.php
+++ b/src/Symfony/Component/HttpClient/CurlHttpClient.php
@@ -269,7 +269,7 @@ final class CurlHttpClient implements HttpClientInterface, LoggerAwareInterface
if ('POST' !== $method) {
$curlopts[CURLOPT_UPLOAD] = true;
}
- } elseif ('' !== $body) {
+ } elseif ('' !== $body || 'POST' === $method) {
$curlopts[CURLOPT_POSTFIELDS] = $body;
}
@@ -383,7 +383,7 @@ final class CurlHttpClient implements HttpClientInterface, LoggerAwareInterface
*/
private static function acceptPushForRequest(string $method, array $options, PushedResponse $pushedResponse): bool
{
- if ($options['body'] || $method !== $pushedResponse->requestHeaders[':method'][0]) {
+ if ('' !== $options['body'] || $method !== $pushedResponse->requestHeaders[':method'][0]) {
return false;
}
diff --git a/src/Symfony/Component/HttpClient/Response/CurlResponse.php b/src/Symfony/Component/HttpClient/Response/CurlResponse.php
index 8e69b8cdc7..a927ec8678 100644
--- a/src/Symfony/Component/HttpClient/Response/CurlResponse.php
+++ b/src/Symfony/Component/HttpClient/Response/CurlResponse.php
@@ -133,15 +133,17 @@ final class CurlResponse implements ResponseInterface
if (\in_array($waitFor, ['headers', 'destruct'], true)) {
try {
- self::stream([$response])->current();
+ foreach (self::stream([$response]) as $chunk) {
+ if ($chunk->isFirst()) {
+ break;
+ }
+ }
} catch (\Throwable $e) {
// Persist timeouts thrown during initialization
$response->info['error'] = $e->getMessage();
$response->close();
throw $e;
}
- } elseif ('content' === $waitFor && ($response->multi->handlesActivity[$response->id][0] ?? null) instanceof FirstChunk) {
- self::stream([$response])->current();
}
curl_setopt($ch, CURLOPT_HEADERFUNCTION, null);
diff --git a/src/Symfony/Component/HttpClient/Response/NativeResponse.php b/src/Symfony/Component/HttpClient/Response/NativeResponse.php
index e0fb09327b..4e175d081a 100644
--- a/src/Symfony/Component/HttpClient/Response/NativeResponse.php
+++ b/src/Symfony/Component/HttpClient/Response/NativeResponse.php
@@ -67,7 +67,11 @@ final class NativeResponse implements ResponseInterface
}
if (null === $response->remaining) {
- self::stream([$response])->current();
+ foreach (self::stream([$response]) as $chunk) {
+ if ($chunk->isFirst()) {
+ break;
+ }
+ }
}
};
}
diff --git a/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php b/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php
index d0abb7cd4f..50172c38bd 100644
--- a/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php
+++ b/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php
@@ -29,7 +29,7 @@ class HandlerFailedException extends RuntimeException
1 === \count($exceptions)
? $firstFailure->getMessage()
: sprintf('%d handlers failed. First failure is: "%s"', \count($exceptions), $firstFailure->getMessage()),
- $firstFailure->getCode(),
+ (int) $firstFailure->getCode(),
$firstFailure
);
diff --git a/src/Symfony/Component/Messenger/Tests/Exception/HandlerFailedExceptionTest.php b/src/Symfony/Component/Messenger/Tests/Exception/HandlerFailedExceptionTest.php
new file mode 100644
index 0000000000..e007c517ee
--- /dev/null
+++ b/src/Symfony/Component/Messenger/Tests/Exception/HandlerFailedExceptionTest.php
@@ -0,0 +1,31 @@
+code = 'HY000';
+ $this->message = 'test';
+ // no to call parent constructor, it will fail with string error code
+ }
+ };
+
+ $handlerException = new HandlerFailedException($envelope, [$exception]);
+ $originalException = $handlerException->getNestedExceptions()[0];
+
+ $this->assertIsInt($handlerException->getCode(), 'Exception codes must converts to int');
+ $this->assertSame(0, $handlerException->getCode(), 'String code (HY000) converted to int must be 0');
+ $this->assertIsString($originalException->getCode(), 'Original exception code still with original type (string)');
+ $this->assertSame($exception->getCode(), $originalException->getCode(), 'Original exception code is not modified');
+ }
+}
diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php
index 27574eb8dd..bc92dcfeab 100644
--- a/src/Symfony/Component/Process/Process.php
+++ b/src/Symfony/Component/Process/Process.php
@@ -361,7 +361,7 @@ class Process implements \IteratorAggregate
* @param callable|null $callback A PHP callback to run whenever there is some
* output available on STDOUT or STDERR
*
- * @return $this
+ * @return static
*
* @throws RuntimeException When process can't be launched
* @throws RuntimeException When process is already running
diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf
index add868cd42..c3420f3db2 100644
--- a/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf
+++ b/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf
@@ -222,6 +222,150 @@
Dəstəklənməyən kart tipi və ya yanlış kart nömrəsi.
+
+
+ Bu dəyər doğru bir Beynəlxalq Bank Hesap Nömrəsi (IBAN) deyil.
+
+
+
+ Bu dəyər doğru bir ISBN-10 deyil.
+
+
+
+ Bu dəyər doğru bir ISBN-13 deyil.
+
+
+
+ Bu dəyər doğru bir ISBN-10 və ya ISBN-13 deyil.
+
+
+
+ Bu dəyər doğru bir ISSN deyil.
+
+
+
+ Bu dəyər doğru bir valyuta deyil.
+
+
+
+ Bu dəyər {{ compared_value }} ilə bərabər olmalıdır.
+
+
+
+ Bu dəyər {{ compared_value }} dəyərindən büyük olmalıdır.
+
+
+
+ Bu dəyər {{ compared_value }} ilə bərabər və ya daha böyük olmaldır.
+
+
+
+ Bu dəyər {{ compared_value_type }} {{ compared_value }} ilə eyni olmalıdır.
+
+
+
+ Bu dəyər {{ compared_value }} dəyərindən kiçik olmalıdır.
+
+
+
+ Bu dəyər {{ compared_value }} dəyərindən kiçik və ya bərabər olmalıdır.
+
+
+
+ Bu değer {{ compared_value }} ile eşit olmamalıdır.
+
+
+
+ Bu dəyər {{ compared_value_type }} {{ compared_value }} ilə eyni olmamalıdır.
+
+
+
+ Şəkil nisbəti çox büyükdür ({{ ratio }}). İcazə verilən maksimum nisbət: {{ max_ratio }}.
+
+
+
+ Şəkil nisbəti çox balacadır ({{ ratio }}). İcazə verilən minimum nisbət: {{ min_ratio }}.
+
+
+
+ Şəkil kvadratdır ({{ width }}x{{ height }}px). Kvadrat şəkillərə icazə verilmir.
+
+
+
+ Şəkil albom rejimindədir ({{ width }}x{{ height }}px). Albom rejimli şəkillərə icazə verilmir.
+
+
+
+ Şəkil portret rejimindədir ({{ width }}x{{ height }}px). Portret rejimli şəkillərə icazə verilmir.
+
+
+
+ Boş fayla icazə verilmir.
+
+
+
+ Ünvan tapılmadı.
+
+
+
+ Bu dəyər gözlənilən {{ charset }} simvol cədvəli ilə uyğun gəlmir.
+
+
+
+ Bu dəyər doğru bir Biznes Təyinedici Kodu (BIC) deyil.
+
+
+
+ Xəta
+
+
+
+ Bu dəyər doğru bir UUID deyil.
+
+
+
+ Bu dəyər {{ compare_value }} dəyərinin bölənlərindən biri olmalıdır.
+
+
+
+ Bu Biznes Təyinedici Kodu (BIC) {{ iban }} IBAN kodu ilə əlaqəli deyil.
+
+
+
+ Bu dəyər doğru bir JSON olmalıdır.
+
+
+
+ Bu kolleksiyada sadəcə unikal elementlər olmalıdır.
+
+
+
+ Bu dəyər müsbət olmalıdır.
+
+
+
+ Bu dəyər müsbət və ya sıfır olmalıdır.
+
+
+
+ Bu dəyər mənfi olmaldır.
+
+
+
+ Bu dəyər mənfi və ya sıfır olmaldır.
+
+
+
+ Bu dəyər doğru bir zaman zolağı deyil.
+
+
+
+ Bu parol data oğurluğunda tapıldığı üçün işlədilməməlidir. Zəhmət olmasa, başqa parol seçin.
+
+
+
+ Bu dəyər {{ min }} və {{ max }} arasında olmaldır.
+