aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_external
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_external')
-rw-r--r--apps/files_external/appinfo/info.xml1
-rw-r--r--apps/files_external/composer/composer/autoload_classmap.php1
-rw-r--r--apps/files_external/composer/composer/autoload_static.php1
-rw-r--r--apps/files_external/l10n/et_EE.js41
-rw-r--r--apps/files_external/l10n/et_EE.json41
-rw-r--r--apps/files_external/lib/Command/Dependencies.php56
-rw-r--r--apps/files_external/lib/Lib/Backend/SMB.php23
-rw-r--r--apps/files_external/lib/Lib/MissingDependency.php13
-rw-r--r--apps/files_external/lib/Service/BackendService.php4
9 files changed, 169 insertions, 12 deletions
diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml
index eda96446ac0..e746f052619 100644
--- a/apps/files_external/appinfo/info.xml
+++ b/apps/files_external/appinfo/info.xml
@@ -53,6 +53,7 @@ External storage can be configured using the GUI or at the command line. This se
<command>OCA\Files_External\Command\Verify</command>
<command>OCA\Files_External\Command\Notify</command>
<command>OCA\Files_External\Command\Scan</command>
+ <command>OCA\Files_External\Command\Dependencies</command>
</commands>
<settings>
diff --git a/apps/files_external/composer/composer/autoload_classmap.php b/apps/files_external/composer/composer/autoload_classmap.php
index 3e246225484..90f41f0e920 100644
--- a/apps/files_external/composer/composer/autoload_classmap.php
+++ b/apps/files_external/composer/composer/autoload_classmap.php
@@ -14,6 +14,7 @@ return array(
'OCA\\Files_External\\Command\\Config' => $baseDir . '/../lib/Command/Config.php',
'OCA\\Files_External\\Command\\Create' => $baseDir . '/../lib/Command/Create.php',
'OCA\\Files_External\\Command\\Delete' => $baseDir . '/../lib/Command/Delete.php',
+ 'OCA\\Files_External\\Command\\Dependencies' => $baseDir . '/../lib/Command/Dependencies.php',
'OCA\\Files_External\\Command\\Export' => $baseDir . '/../lib/Command/Export.php',
'OCA\\Files_External\\Command\\Import' => $baseDir . '/../lib/Command/Import.php',
'OCA\\Files_External\\Command\\ListCommand' => $baseDir . '/../lib/Command/ListCommand.php',
diff --git a/apps/files_external/composer/composer/autoload_static.php b/apps/files_external/composer/composer/autoload_static.php
index 86ad9eb3f78..7b5eb5feabe 100644
--- a/apps/files_external/composer/composer/autoload_static.php
+++ b/apps/files_external/composer/composer/autoload_static.php
@@ -29,6 +29,7 @@ class ComposerStaticInitFiles_External
'OCA\\Files_External\\Command\\Config' => __DIR__ . '/..' . '/../lib/Command/Config.php',
'OCA\\Files_External\\Command\\Create' => __DIR__ . '/..' . '/../lib/Command/Create.php',
'OCA\\Files_External\\Command\\Delete' => __DIR__ . '/..' . '/../lib/Command/Delete.php',
+ 'OCA\\Files_External\\Command\\Dependencies' => __DIR__ . '/..' . '/../lib/Command/Dependencies.php',
'OCA\\Files_External\\Command\\Export' => __DIR__ . '/..' . '/../lib/Command/Export.php',
'OCA\\Files_External\\Command\\Import' => __DIR__ . '/..' . '/../lib/Command/Import.php',
'OCA\\Files_External\\Command\\ListCommand' => __DIR__ . '/..' . '/../lib/Command/ListCommand.php',
diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js
index 7e339e40b96..c43471fe499 100644
--- a/apps/files_external/l10n/et_EE.js
+++ b/apps/files_external/l10n/et_EE.js
@@ -3,12 +3,19 @@ OC.L10N.register(
{
"Grant access" : "Anna ligipääs",
"Error configuring OAuth1" : "OAuth1 seadistamise tõrge",
+ "Please provide a valid app key and secret." : "Palun sisesta rakenduse ketiva võti ja saladus.",
"Error configuring OAuth2" : "OAuth2 seadistamise tõrge",
"Generate keys" : "Loo võtmed",
"Error generating key pair" : "Viga võtmepaari loomisel",
+ "You are not logged in" : "Sa pole sisse logitud.",
+ "Permission denied" : "Õigus on keelatud",
+ "Storage with ID \"%d\" not found" : "Andmeruumi tunnusega „%d“ ei leidu",
+ "Invalid backend or authentication mechanism class" : "Vigane taustateenus või autentimismeetodi klass",
"Invalid mount point" : "Vigane haakepunkt",
"Objectstore forbidden" : "Objectstore on keelatud",
"Invalid storage backend \"%s\"" : "Vigane salvestuskoha taustsüsteem \"%s\"",
+ "Not permitted to use backend \"%s\"" : "Pole luba kasutada „%s“ taustateenust",
+ "Not permitted to use authentication mechanism \"%s\"" : "Pole luba kasutada „%s“ autentimismeetodit",
"Unsatisfied backend parameters" : "Rahuldamata taustarakenduse parameetrid",
"Insufficient data: %s" : "Pole piisavalt andmeid: %s",
"%s" : "%s",
@@ -25,10 +32,17 @@ OC.L10N.register(
"OpenStack v2" : "OpenStack v2",
"Login" : "Logi sisse",
"Password" : "Salasõna",
+ "Tenant name" : "Kliendi nimi",
+ "Identity endpoint URL" : "Tuvastuse otspunkti võrguaadress",
"OpenStack v3" : "OpenStack v3",
"Domain" : "Domeen",
"Rackspace" : "Rackspace",
"API key" : "API võti",
+ "Global credentials" : "Üldinekasutajanimi/salasõna",
+ "Log-in credentials, save in database" : "Salvesta sisselogimise kasutajanimi/salasõna andmebaasi",
+ "Login and password" : "Kasutajanimi ja salasõna",
+ "Log-in credentials, save in session" : "Salvesta sisselogimise kasutajanimi/salasõna sessioonis",
+ "Global credentials, manually entered" : "Käsitsi sisestatud üldine kasutajanimi/salasõna",
"RSA public key" : "RSA avalik võti",
"Public key" : "Avalik võti",
"RSA private key" : "RSA privaatvõti",
@@ -40,9 +54,11 @@ OC.L10N.register(
"Region" : "Piirkond",
"Enable SSL" : "SSL-i kasutamine",
"Enable Path Style" : "Luba otsingtee stiilis",
+ "Legacy (v2) authentication" : "Pärandvormis autentimine (v2)",
+ "SSE-C encryption key" : "SSE-C krüptimisvõti",
"WebDAV" : "WebDAV",
"URL" : "URL",
- "Remote subfolder" : "Mujahl olev alamkaust",
+ "Remote subfolder" : "Mujal olev alamkaust",
"Secure https://" : "Turvaline https://",
"FTP" : "FTP",
"Host" : "Host",
@@ -56,14 +72,26 @@ OC.L10N.register(
"SMB/CIFS" : "SMB/CIFS",
"Share" : "Jaga",
"Show hidden files" : "Näita peidetud faile",
+ "Case sensitive file system" : "Tõstutundlik failisüsteem",
+ "Timeout" : "Aegumine",
+ "SMB/CIFS using OC login" : "SMB / CIFS kasutades OC sisselogimist",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Teenuse nimi",
+ "Request timeout (seconds)" : "Päringu aegumine (sekundites)",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL-i tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks cURL-i toe tagamiseks vajalikud muudatused.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks FTP toe tagamiseks vajalikud muudatused.",
"External storage" : "Väline andmehoidla",
"External storage support" : "Väliste andmehoidlate tugi",
"Adds basic external storage support" : "Lisab väliste andmehoidlate toe baasiteratsioonis",
"Confirm" : "Kinnita",
+ "Storage credentials" : "Andmeruumi kasutajanimi/salasõna",
+ "To access the storage, you need to provide the authentication credentials." : "Selle andmeruumi jaoks pead autentimiseks lisama kasutajanime ja salasõna.",
"Enter the storage login" : "Sisesta andmeruumi kasutajatunnus",
"Enter the storage password" : "Sisesta andmeruumi kasutaja salasõna",
+ "Enter missing credentials" : "Lisa puuduvad kasutajanimi/salasõna",
+ "Credentials successfully set" : "Kasutajanime/salasõna lisamine õnnestus",
+ "Error while setting credentials: {error}" : "Viga kasutajanime/salasõna lisamisel: {error}",
+ "Checking storage …" : "Kontrollin andmeruumi…",
"Open in Files" : "Ava failirakenduses",
"External mount error" : "Välise seostamise tõrge",
"Storage type" : "Andmehoidla tüüp",
@@ -71,7 +99,9 @@ OC.L10N.register(
"Scope" : "Skoop",
"Personal" : "Isiklik",
"System" : "Süsteem",
- "Enable encryption" : "Luba krüpteerimine",
+ "(Group)" : "(Grupp)",
+ "Compatibility with Mac NFD encoding (slow)" : "Ühilduvus Mac NFD kodeeringuga (aeglane)",
+ "Enable encryption" : "Luba krüptimine",
"Enable previews" : "Luba eelvaated",
"Enable sharing" : "Luba jagamine",
"Check for changes" : "Otsi uuendusi",
@@ -79,10 +109,15 @@ OC.L10N.register(
"Once every direct access" : "Kord iga otsese pöördumise korral",
"Read only" : "kirjutuskaitstud",
"Disconnect" : "Ühenda lahti",
+ "Unknown backend: {backendName}" : "Tundmatu taustateenus: {backendName}",
"Admin defined" : "Admini poolt määratud",
+ "Delete storage?" : "Kas kustutame andmeruumi?",
+ "Click to recheck the configuration" : "Klõpsi seadistuste uuesti kontrollimiseks",
"Saved" : "Salvestatud",
- "Saving …" : "Salvestamine …",
+ "Saving …" : "Salvestan…",
"Save" : "Salvesta",
+ "Failed to save global credentials" : "Üldise kasutajanime/salasõna salvestamine ei õnnestunud",
+ "Failed to save global credentials: {message}" : "Üldise kasutajanime/salasõna salvestamine ei õnnestunud: {message}",
"Open documentation" : "Ava dokumentatsioon",
"Folder name" : "Kausta nimi",
"Authentication" : "Autentimine",
diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json
index 4f5ae6f5243..108e1ad18aa 100644
--- a/apps/files_external/l10n/et_EE.json
+++ b/apps/files_external/l10n/et_EE.json
@@ -1,12 +1,19 @@
{ "translations": {
"Grant access" : "Anna ligipääs",
"Error configuring OAuth1" : "OAuth1 seadistamise tõrge",
+ "Please provide a valid app key and secret." : "Palun sisesta rakenduse ketiva võti ja saladus.",
"Error configuring OAuth2" : "OAuth2 seadistamise tõrge",
"Generate keys" : "Loo võtmed",
"Error generating key pair" : "Viga võtmepaari loomisel",
+ "You are not logged in" : "Sa pole sisse logitud.",
+ "Permission denied" : "Õigus on keelatud",
+ "Storage with ID \"%d\" not found" : "Andmeruumi tunnusega „%d“ ei leidu",
+ "Invalid backend or authentication mechanism class" : "Vigane taustateenus või autentimismeetodi klass",
"Invalid mount point" : "Vigane haakepunkt",
"Objectstore forbidden" : "Objectstore on keelatud",
"Invalid storage backend \"%s\"" : "Vigane salvestuskoha taustsüsteem \"%s\"",
+ "Not permitted to use backend \"%s\"" : "Pole luba kasutada „%s“ taustateenust",
+ "Not permitted to use authentication mechanism \"%s\"" : "Pole luba kasutada „%s“ autentimismeetodit",
"Unsatisfied backend parameters" : "Rahuldamata taustarakenduse parameetrid",
"Insufficient data: %s" : "Pole piisavalt andmeid: %s",
"%s" : "%s",
@@ -23,10 +30,17 @@
"OpenStack v2" : "OpenStack v2",
"Login" : "Logi sisse",
"Password" : "Salasõna",
+ "Tenant name" : "Kliendi nimi",
+ "Identity endpoint URL" : "Tuvastuse otspunkti võrguaadress",
"OpenStack v3" : "OpenStack v3",
"Domain" : "Domeen",
"Rackspace" : "Rackspace",
"API key" : "API võti",
+ "Global credentials" : "Üldinekasutajanimi/salasõna",
+ "Log-in credentials, save in database" : "Salvesta sisselogimise kasutajanimi/salasõna andmebaasi",
+ "Login and password" : "Kasutajanimi ja salasõna",
+ "Log-in credentials, save in session" : "Salvesta sisselogimise kasutajanimi/salasõna sessioonis",
+ "Global credentials, manually entered" : "Käsitsi sisestatud üldine kasutajanimi/salasõna",
"RSA public key" : "RSA avalik võti",
"Public key" : "Avalik võti",
"RSA private key" : "RSA privaatvõti",
@@ -38,9 +52,11 @@
"Region" : "Piirkond",
"Enable SSL" : "SSL-i kasutamine",
"Enable Path Style" : "Luba otsingtee stiilis",
+ "Legacy (v2) authentication" : "Pärandvormis autentimine (v2)",
+ "SSE-C encryption key" : "SSE-C krüptimisvõti",
"WebDAV" : "WebDAV",
"URL" : "URL",
- "Remote subfolder" : "Mujahl olev alamkaust",
+ "Remote subfolder" : "Mujal olev alamkaust",
"Secure https://" : "Turvaline https://",
"FTP" : "FTP",
"Host" : "Host",
@@ -54,14 +70,26 @@
"SMB/CIFS" : "SMB/CIFS",
"Share" : "Jaga",
"Show hidden files" : "Näita peidetud faile",
+ "Case sensitive file system" : "Tõstutundlik failisüsteem",
+ "Timeout" : "Aegumine",
+ "SMB/CIFS using OC login" : "SMB / CIFS kasutades OC sisselogimist",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Teenuse nimi",
+ "Request timeout (seconds)" : "Päringu aegumine (sekundites)",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL-i tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks cURL-i toe tagamiseks vajalikud muudatused.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks FTP toe tagamiseks vajalikud muudatused.",
"External storage" : "Väline andmehoidla",
"External storage support" : "Väliste andmehoidlate tugi",
"Adds basic external storage support" : "Lisab väliste andmehoidlate toe baasiteratsioonis",
"Confirm" : "Kinnita",
+ "Storage credentials" : "Andmeruumi kasutajanimi/salasõna",
+ "To access the storage, you need to provide the authentication credentials." : "Selle andmeruumi jaoks pead autentimiseks lisama kasutajanime ja salasõna.",
"Enter the storage login" : "Sisesta andmeruumi kasutajatunnus",
"Enter the storage password" : "Sisesta andmeruumi kasutaja salasõna",
+ "Enter missing credentials" : "Lisa puuduvad kasutajanimi/salasõna",
+ "Credentials successfully set" : "Kasutajanime/salasõna lisamine õnnestus",
+ "Error while setting credentials: {error}" : "Viga kasutajanime/salasõna lisamisel: {error}",
+ "Checking storage …" : "Kontrollin andmeruumi…",
"Open in Files" : "Ava failirakenduses",
"External mount error" : "Välise seostamise tõrge",
"Storage type" : "Andmehoidla tüüp",
@@ -69,7 +97,9 @@
"Scope" : "Skoop",
"Personal" : "Isiklik",
"System" : "Süsteem",
- "Enable encryption" : "Luba krüpteerimine",
+ "(Group)" : "(Grupp)",
+ "Compatibility with Mac NFD encoding (slow)" : "Ühilduvus Mac NFD kodeeringuga (aeglane)",
+ "Enable encryption" : "Luba krüptimine",
"Enable previews" : "Luba eelvaated",
"Enable sharing" : "Luba jagamine",
"Check for changes" : "Otsi uuendusi",
@@ -77,10 +107,15 @@
"Once every direct access" : "Kord iga otsese pöördumise korral",
"Read only" : "kirjutuskaitstud",
"Disconnect" : "Ühenda lahti",
+ "Unknown backend: {backendName}" : "Tundmatu taustateenus: {backendName}",
"Admin defined" : "Admini poolt määratud",
+ "Delete storage?" : "Kas kustutame andmeruumi?",
+ "Click to recheck the configuration" : "Klõpsi seadistuste uuesti kontrollimiseks",
"Saved" : "Salvestatud",
- "Saving …" : "Salvestamine …",
+ "Saving …" : "Salvestan…",
"Save" : "Salvesta",
+ "Failed to save global credentials" : "Üldise kasutajanime/salasõna salvestamine ei õnnestunud",
+ "Failed to save global credentials: {message}" : "Üldise kasutajanime/salasõna salvestamine ei õnnestunud: {message}",
"Open documentation" : "Ava dokumentatsioon",
"Folder name" : "Kausta nimi",
"Authentication" : "Autentimine",
diff --git a/apps/files_external/lib/Command/Dependencies.php b/apps/files_external/lib/Command/Dependencies.php
new file mode 100644
index 00000000000..1bb57778129
--- /dev/null
+++ b/apps/files_external/lib/Command/Dependencies.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+namespace OCA\Files_External\Command;
+
+use OC\Core\Command\Base;
+use OCA\Files_External\Service\BackendService;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Dependencies extends Base {
+ public function __construct(
+ private readonly BackendService $backendService,
+ ) {
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files_external:dependencies')
+ ->setDescription('Show information about the backend dependencies');
+ parent::configure();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int {
+ $storageBackends = $this->backendService->getBackends();
+
+ $anyMissing = false;
+
+ foreach ($storageBackends as $backend) {
+ if ($backend->getDeprecateTo() !== null) {
+ continue;
+ }
+ $missingDependencies = $backend->checkDependencies();
+ if ($missingDependencies) {
+ $anyMissing = true;
+ $output->writeln($backend->getText() . ':');
+ foreach ($missingDependencies as $missingDependency) {
+ if ($missingDependency->getMessage()) {
+ $output->writeln(" - <comment>{$missingDependency->getDependency()}</comment>: {$missingDependency->getMessage()}");
+ } else {
+ $output->writeln(" - <comment>{$missingDependency->getDependency()}</comment>");
+ }
+ }
+ }
+ }
+
+ if (!$anyMissing) {
+ $output->writeln('<info>All dependencies are met</info>');
+ }
+
+ return self::SUCCESS;
+ }
+}
diff --git a/apps/files_external/lib/Lib/Backend/SMB.php b/apps/files_external/lib/Lib/Backend/SMB.php
index b246b0638f0..3549f69cbe3 100644
--- a/apps/files_external/lib/Lib/Backend/SMB.php
+++ b/apps/files_external/lib/Lib/Backend/SMB.php
@@ -10,19 +10,20 @@ namespace OCA\Files_External\Lib\Backend;
use Icewind\SMB\BasicAuth;
use Icewind\SMB\KerberosApacheAuth;
use Icewind\SMB\KerberosAuth;
+use Icewind\SMB\Native\NativeServer;
+use Icewind\SMB\Wrapped\Server;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\Auth\Password\Password;
use OCA\Files_External\Lib\Auth\SMB\KerberosApacheAuth as KerberosApacheAuthMechanism;
use OCA\Files_External\Lib\DefinitionParameter;
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
-use OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
+use OCA\Files_External\Lib\MissingDependency;
+use OCA\Files_External\Lib\Storage\SystemBridge;
use OCA\Files_External\Lib\StorageConfig;
use OCP\IL10N;
use OCP\IUser;
class SMB extends Backend {
- use LegacyDependencyCheckPolyfill;
-
public function __construct(IL10N $l, Password $legacyAuth) {
$this
->setIdentifier('smb')
@@ -122,4 +123,20 @@ class SMB extends Backend {
$storage->setBackendOption('auth', $smbAuth);
}
+
+ public function checkDependencies() {
+ $system = \OCP\Server::get(SystemBridge::class);
+ if (NativeServer::available($system)) {
+ return [];
+ } elseif (Server::available($system)) {
+ $missing = new MissingDependency('php-smbclient');
+ $missing->setOptional(true);
+ $missing->setMessage('The php-smbclient library provides improved compatibility and performance for SMB storages.');
+ return [$missing];
+ } else {
+ $missing = new MissingDependency('php-smbclient');
+ $missing->setMessage('Either the php-smbclient library (preferred) or the smbclient binary is required for SMB storages.');
+ return [$missing, new MissingDependency('smbclient')];
+ }
+ }
}
diff --git a/apps/files_external/lib/Lib/MissingDependency.php b/apps/files_external/lib/Lib/MissingDependency.php
index 5c2c6880f23..da4cbb1de46 100644
--- a/apps/files_external/lib/Lib/MissingDependency.php
+++ b/apps/files_external/lib/Lib/MissingDependency.php
@@ -12,13 +12,14 @@ namespace OCA\Files_External\Lib;
class MissingDependency {
/** @var string|null Custom message */
- private $message = null;
+ private ?string $message = null;
+ private bool $optional = false;
/**
* @param string $dependency
*/
public function __construct(
- private $dependency,
+ private readonly string $dependency,
) {
}
@@ -38,4 +39,12 @@ class MissingDependency {
$this->message = $message;
return $this;
}
+
+ public function isOptional(): bool {
+ return $this->optional;
+ }
+
+ public function setOptional(bool $optional): void {
+ $this->optional = $optional;
+ }
}
diff --git a/apps/files_external/lib/Service/BackendService.php b/apps/files_external/lib/Service/BackendService.php
index 4726dbd4cad..586ce5330ad 100644
--- a/apps/files_external/lib/Service/BackendService.php
+++ b/apps/files_external/lib/Service/BackendService.php
@@ -12,6 +12,7 @@ use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\Backend\Backend;
use OCA\Files_External\Lib\Config\IAuthMechanismProvider;
use OCA\Files_External\Lib\Config\IBackendProvider;
+use OCA\Files_External\Lib\MissingDependency;
use OCP\EventDispatcher\GenericEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IAppConfig;
@@ -187,7 +188,8 @@ class BackendService {
*/
public function getAvailableBackends() {
return array_filter($this->getBackends(), function ($backend) {
- return !$backend->checkDependencies();
+ $missing = array_filter($backend->checkDependencies(), fn (MissingDependency $dependency) => !$dependency->isOptional());
+ return count($missing) === 0;
});
}