Repository: LycheeOrg/Lychee (language: php)

Issue:
Import from Dropbox does nothing, how to debug?
### Detailed description of the problem [REQUIRED]
I had an install of Lychee v4 working with dropbox, but due to some issues with my webhost I ended up making a new Lychee v5.1.0 instance using the official docker image and was just going to re-import all of my photos from Dropbox.

I generated a new API key for my dropbox app that had worked previously and entered it into the config.

Now when I click "+" and then "Import from Dropbox" nothing happens.

Using the web console I see no network activity, no script errors, etc, just nothing.

I used Dropbox's API tester to make sure my auth key worked and it does. 

Something I noticed is all of the Lychee docs refer to a 'Drop ins" key but it doesn't appear that dropbox offers the ability to create a drop ins key anymore just a general API key?

Is there a way to debug where this is breaking down?

### Steps to reproduce the issue
**Steps to reproduce the behavior:**
1. Go to "+"
2. Click on "Import from dropbox"
(No action happens from here)


### Output of the diagnostics  [REQUIRED] 

NOTE: Instance is behind a load balancer, so the instance listens on port 80/http but the app_url refers to the load balancer listing at 443/https which is why the two APP_URL errors appear.  It does not seem to affect the serving of images.

   Diagnostics
    -----------
        Warning: zend.assertions is disabled although Lychee is in debug mode. For easier debugging code generation for assertions should be enabled.
        Error: APP_URL (https://lychee.***************aphy.com) does not match the current url (http://lychee.***************aphy.com).
               This will break WebAuthn authentication.
        Error: APP_URL (https://lychee.***************aphy.com) does not match the current url (http://lychee.***************aphy.com).
               This will prevent images from being properly displayed.
        Info: Latest version of PHP is 8.3
        Warning: git (software) is not available.

### Browser and system
MacOS Firefox 121 and Chrome 120 for client, oracle linux + docker for server.


Discussion / hints:
You can temporarily disable the Livewire front-end for this import (set `LIVEWIRE_ENABLED=false` in your `.env`), I haven't had time to dig into the Dropbox stuff to be honest.
> NOTE: Instance is behind a load balancer, so the instance listens on port 80/http but the app_url refers to the load balancer listing at 443/https which is why the two APP_URL errors appear. It does not seem to affect the serving of images.

You should still set your `APP_URL` to use https. Your load balancer should also make sure to forward the https proto or you might encounter some troubles during uploads. Similarly be sure to have set your `TRUSTED_PROXY` in your `.env`
Thank you

I'll try the TRUSTED_PROXY setting.  Right now the load balancer is https only  (as is my APP_URL) and uploading images through it seems to be working just fine. 

Could this be the cause of the dropbox issue or is that going to be something else?  
I've added the TRUSTED_PROXY and things still aren't working with Dropbox but the error messages about APP_URL are gone.

> You can temporarily disable the Livewire front-end for this import (set `LIVEWIRE_ENABLED=false` in your `.env`), I haven't had time to dig into the Dropbox stuff to be honest.

This worked.  

Thanks!


Fix patch:
diff --git a/README.md b/README.md
index 55a17ac89b1..b08b4246e6f 100644
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@ These shortcuts will help you to use Lychee even faster. [Keyboard Shortcuts &#1
 
 ### Dropbox import
 
-In order to use the Dropbox import from your server, you need a valid drop-ins app key from [their website](https://www.dropbox.com/developers/apps/create). Lychee will ask you for this key, the first time you try to use the import. Want to change your code? Take a look at [the settings][1] of Lychee.
+In order to use the Dropbox import from your server, you need a valid drop-ins app key from [their website](https://www.dropbox.com/developers/saver). Lychee will ask you for this key, the first time you try to use the import. Want to change your code? Take a look at [the settings][1] of Lychee.
 
 ### Twitter Cards
 
diff --git a/app/Livewire/Components/Forms/Add/ImportFromDropbox.php b/app/Livewire/Components/Forms/Add/ImportFromDropbox.php
new file mode 100644
index 00000000000..fb6422423bf
--- /dev/null
+++ b/app/Livewire/Components/Forms/Add/ImportFromDropbox.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Add;
+
+use App\Contracts\Models\AbstractAlbum;
+use App\Exceptions\ConfigurationKeyMissingException;
+use App\Models\Configs;
+use App\Policies\AlbumPolicy;
+use Illuminate\Support\Facades\Gate;
+use Illuminate\View\View;
+
+/**
+ * This defines the Import From Dropbox modals.
+ * This is the same behaviour as ImportFromUrl but we use a different view to support the dropbox choose.
+ */
+final class ImportFromDropbox extends ImportFromUrl
+{
+	/**
+	 * Call the parametrized rendering.
+	 *
+	 * @return View
+	 */
+	final public function render(): View
+	{
+		// We reuse the import from server policy.
+		// This action reveals the API key of the admin.
+		// We do not want to leak that.
+		Gate::authorize(AlbumPolicy::CAN_IMPORT_FROM_SERVER, AbstractAlbum::class);
+
+		return view('livewire.forms.add.import-from-dropbox');
+	}
+
+	/**
+	 * We use a computed property to avoid having this info in the serialized component.
+	 *
+	 * @return string
+	 *
+	 * @throws ConfigurationKeyMissingException
+	 */
+	final public function getApiKeyProperty(): string
+	{
+		return Configs::getValueAsString('dropbox_key');
+	}
+}
diff --git a/app/Livewire/Components/Forms/Settings/Base/PasswordSetting.php b/app/Livewire/Components/Forms/Settings/Base/PasswordSetting.php
new file mode 100644
index 00000000000..bf07966dc57
--- /dev/null
+++ b/app/Livewire/Components/Forms/Settings/Base/PasswordSetting.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Livewire\Components\Forms\Settings\Base;
+
+use Illuminate\Contracts\View\View;
+
+/**
+ * String setting input.
+ * To persist the data a call to save() is required.
+ */
+final class PasswordSetting extends StringSetting
+{
+	/**
+	 * Renders the input form.
+	 *
+	 * @return View
+	 */
+	final public function render(): View
+	{
+		$this->value = $this->config->value;
+
+		return view('livewire.forms.settings.password');
+	}
+}
\ No newline at end of file
diff --git a/app/Livewire/Components/Menus/AlbumAdd.php b/app/Livewire/Components/Menus/AlbumAdd.php
index c8a2a410b84..08569b49be8 100644
--- a/app/Livewire/Components/Menus/AlbumAdd.php
+++ b/app/Livewire/Components/Menus/AlbumAdd.php
@@ -66,4 +66,10 @@ public function openUploadModal(): void
 		$this->closeContextMenu();
 		$this->openModal('forms.add.upload', $this->params);
 	}
+
+	public function openImportFromDropboxModal(): void
+	{
+		$this->closeContextMenu();
+		$this->openModal('forms.add.import-from-dropbox', $this->params);
+	}
 }
diff --git a/app/Livewire/Forms/ImportFromUrlForm.php b/app/Livewire/Forms/ImportFromUrlForm.php
index c9427a3d595..407c72c8f75 100644
--- a/app/Livewire/Forms/ImportFromUrlForm.php
+++ b/app/Livewire/Forms/ImportFromUrlForm.php
@@ -16,7 +16,7 @@ class ImportFromUrlForm extends Form
 	/** @var array<int,string> */
 	public array $urls = [];
 
-	public string $url = '';
+	public string $urlArea = '';
 
 	/**
 	 * This allows Livewire to know which values of the $configs we
@@ -40,7 +40,7 @@ protected function rules(): array
 	 */
 	public function prepare()
 	{
-		$this->urls = [$this->url];
+		$this->urls = array_values(array_filter(explode("\n", $this->urlArea)));
 
 		// The replacement below looks suspicious.
 		// If it was really necessary, then there would be much more special
diff --git a/lang/cz/lychee.php b/lang/cz/lychee.php
index b927845c205..c2801e084a4 100644
--- a/lang/cz/lychee.php
+++ b/lang/cz/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Změnit řazení',
 
 	'DROPBOX_TITLE' => 'Dropbox - nastavení',
-	'DROPBOX_TEXT' => "Pro uspěšný import fotografií z Dropboxu je řeba platný API klíč, který lze získat na stránkách <a href='https://www.dropbox.com/developers/apps/create'>Dropboxu</a>. Vygenerovaný osobní klíč zadejte níže:",
+	'DROPBOX_TEXT' => "Pro uspěšný import fotografií z Dropboxu je řeba platný API klíč, který lze získat na stránkách <a href='https://www.dropbox.com/developers/saver'>Dropboxu</a>. Vygenerovaný osobní klíč zadejte níže:",
 
 	'LANG_TEXT' => 'Změnit jazyk Lychee na:',
 	'LANG_TITLE' => 'Změnit jazyk',
diff --git a/lang/de/lychee.php b/lang/de/lychee.php
index 8d6536643ec..6c7c4a798bb 100644
--- a/lang/de/lychee.php
+++ b/lang/de/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Sortierung ändern',
 
 	'DROPBOX_TITLE' => 'Dropbox-Schlüssel festlegen',
-	'DROPBOX_TEXT' => "Um Ihre Fotos von Dropbox zu importieren, brauchen Sie einen gültigen API-Key von <a href='https://www.dropbox.com/developers/apps/create'>der Dropbox-Webseite</a>. Erstellen Sie einen persönlichen Schlüssel und geben Sie ihn hier ein:",
+	'DROPBOX_TEXT' => "Um Ihre Fotos von Dropbox zu importieren, brauchen Sie einen gültigen API-Key von <a href='https://www.dropbox.com/developers/saver'>der Dropbox-Webseite</a>. Erstellen Sie einen persönlichen Schlüssel und geben Sie ihn hier ein:",
 
 	'LANG_TEXT' => 'Sprache für Lychee ändern:',
 	'LANG_TITLE' => 'Sprache festlegen',
diff --git a/lang/el/lychee.php b/lang/el/lychee.php
index 3df76bee30f..d0adfa0e13d 100644
--- a/lang/el/lychee.php
+++ b/lang/el/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Αλλαγή Ταξινόμησης',
 
 	'DROPBOX_TITLE' => 'Ορισμός Κλειδιού Dropbox',
-	'DROPBOX_TEXT' => "Για να μπορέσουμε να εισάγουμε φωτογραφίες από το δικό σας Dropbox, θα χρειαστείτε ένα έγκυρο κλειδί drop-ins app από <a href='https://www.dropbox.com/developers/apps/create'>την ιστοσελίδα του Dropbox</a>. Παράγετε ένα προσωπικό κλειδί και εισάγετέ το παρακάτω:",
+	'DROPBOX_TEXT' => "Για να μπορέσουμε να εισάγουμε φωτογραφίες από το δικό σας Dropbox, θα χρειαστείτε ένα έγκυρο κλειδί drop-ins app από <a href='https://www.dropbox.com/developers/saver'>την ιστοσελίδα του Dropbox</a>. Παράγετε ένα προσωπικό κλειδί και εισάγετέ το παρακάτω:",
 
 	'LANG_TEXT' => 'Αλλαγή γλώσσας του Lychee για:',
 	'LANG_TITLE' => 'Αλλαγή Γλώσσας',
diff --git a/lang/en/lychee.php b/lang/en/lychee.php
index b9bbbb09050..beed9765719 100644
--- a/lang/en/lychee.php
+++ b/lang/en/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Change Sorting',
 
 	'DROPBOX_TITLE' => 'Set Dropbox Key',
-	'DROPBOX_TEXT' => "In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/apps/create' class='text-text-main-200 border-b border-dashed border-neutral-400'>their website</a>. Generate yourself a personal key and enter it below:",
+	'DROPBOX_TEXT' => "In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/saver' class='text-text-main-200 border-b border-dashed border-neutral-400'>their website</a>. Generate yourself a personal key and enter it below:",
 
 	'LANG_TEXT' => 'Change Lychee language for:',
 	'LANG_TITLE' => 'Change Language',
diff --git a/lang/es/lychee.php b/lang/es/lychee.php
index 4f5fca236a1..d623fda6d1a 100644
--- a/lang/es/lychee.php
+++ b/lang/es/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Cambiar clasificación',
 
 	'DROPBOX_TITLE' => 'Establecer clave de Dropbox',
-	'DROPBOX_TEXT' => 'Para importar fotos desde su Dropbox, necesita una clave de aplicación válida desde <a href=\'https://www.dropbox.com/developers/apps/create\'> su sitio web </a>. Generar usted mismo una clave personal e ingrésela a continuación:',
+	'DROPBOX_TEXT' => 'Para importar fotos desde su Dropbox, necesita una clave de aplicación válida desde <a href=\'https://www.dropbox.com/developers/saver\'> su sitio web </a>. Generar usted mismo una clave personal e ingrésela a continuación:',
 
 	'LANG_TEXT' => 'Cambiar el idioma Lychee para:',
 	'LANG_TITLE' => 'Cambiar idioma',
diff --git a/lang/fr/lychee.php b/lang/fr/lychee.php
index 1c571543af6..38f229ef131 100644
--- a/lang/fr/lychee.php
+++ b/lang/fr/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Modifier le tri',
 
 	'DROPBOX_TITLE' => 'Définir une clé Dropbox',
-	'DROPBOX_TEXT' => 'Pour pouvoir importer des photos à partir de votre Dropbox, vous aurez besoin d’une clé d’application «drop-ins» valide à créer sur <a href="https://www.dropbox.com/developers/apps/create\">leur site</a>. Générez votre clé personnelle et puis entrez-la ci-dessous :',
+	'DROPBOX_TEXT' => 'Pour pouvoir importer des photos à partir de votre Dropbox, vous aurez besoin d’une clé d’application «drop-ins» valide à créer sur <a href="https://www.dropbox.com/developers/saver\">leur site</a>. Générez votre clé personnelle et puis entrez-la ci-dessous :',
 
 	'LANG_TEXT' => 'Remplacer la langue de Lychee par :',
 	'LANG_TITLE' => 'Changer la langue',
diff --git a/lang/hu/lychee.php b/lang/hu/lychee.php
index ca9ef0c2b33..676d6f22462 100644
--- a/lang/hu/lychee.php
+++ b/lang/hu/lychee.php
@@ -357,7 +357,7 @@
 	'SORT_CHANGE' => 'Rendezés megváltoztatása',
 
 	'DROPBOX_TITLE' => 'Dropbox Kulcs Beállítása',
-	'DROPBOX_TEXT' => "Annak érdekében, hogy képeket importáljon a Dropbox-ról, érvényes 'drop-ins app' kulcsra van szüksége a <a href='https://www.dropbox.com/developers/apps/create'>weboldalukon</a>. Generáljon magának egy személyes kulcsot és írja be az alábbiakban:",
+	'DROPBOX_TEXT' => "Annak érdekében, hogy képeket importáljon a Dropbox-ról, érvényes 'drop-ins app' kulcsra van szüksége a <a href='https://www.dropbox.com/developers/saver'>weboldalukon</a>. Generáljon magának egy személyes kulcsot és írja be az alábbiakban:",
 
 	'LANG_TEXT' => 'Változtassa meg a Lychee nyelvét:',
 	'LANG_TITLE' => 'Nyelv megváltoztatása',
diff --git a/lang/it/lychee.php b/lang/it/lychee.php
index 5e5cd67b3b2..1b4dd9692c4 100644
--- a/lang/it/lychee.php
+++ b/lang/it/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Cambia Ordinamento',
 
 	'DROPBOX_TITLE' => 'Imposta Chiave Dropbox',
-	'DROPBOX_TEXT' => "Per importare foto dal tuo Dropbox, ha bisogno di una chiave valida ottenibile da <a href='https://www.dropbox.com/developers/apps/create'>their website</a>. Genera la tua chiave personale e inseriscila qui di seguito:",
+	'DROPBOX_TEXT' => "Per importare foto dal tuo Dropbox, ha bisogno di una chiave valida ottenibile da <a href='https://www.dropbox.com/developers/saver'>their website</a>. Genera la tua chiave personale e inseriscila qui di seguito:",
 
 	'LANG_TEXT' => 'Cambia Lingua Lychee per:',
 	'LANG_TITLE' => 'Cambia Lingua',
diff --git a/lang/nl/lychee.php b/lang/nl/lychee.php
index b423244e5e7..f55ebba4dac 100644
--- a/lang/nl/lychee.php
+++ b/lang/nl/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Change Sorting',
 
 	'DROPBOX_TITLE' => 'Stel Dropbox sleutel in',
-	'DROPBOX_TEXT' => "Om foto’s vanuit Dropbox te kunnen importeren moet je een geldige drop-ins app sleutel hebben van <a href='https://www.dropbox.com/developers/apps/create'>hun website</a>. Genereer een sleutel en voer die in:",
+	'DROPBOX_TEXT' => "Om foto’s vanuit Dropbox te kunnen importeren moet je een geldige drop-ins app sleutel hebben van <a href='https://www.dropbox.com/developers/saver'>hun website</a>. Genereer een sleutel en voer die in:",
 
 	'LANG_TEXT' => 'Change Lychee language for:',
 	'LANG_TITLE' => 'Change Language',
diff --git a/lang/no/lychee.php b/lang/no/lychee.php
index 3d8c51abfe9..6bb7b891f24 100644
--- a/lang/no/lychee.php
+++ b/lang/no/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Lagre Rekkefølge',
 
 	'DROPBOX_TITLE' => 'Lagre nøkkel for Dropbox',
-	'DROPBOX_TEXT' => "For å importere bilder fra Dropbox trengs en gyldig applikasjonsnøkkel fra <a href='https://www.dropbox.com/developers/apps/create'>deres nettside</a>. Lag en personlig nøkkel og fyll inn denne under:",
+	'DROPBOX_TEXT' => "For å importere bilder fra Dropbox trengs en gyldig applikasjonsnøkkel fra <a href='https://www.dropbox.com/developers/saver'>deres nettside</a>. Lag en personlig nøkkel og fyll inn denne under:",
 
 	'LANG_TEXT' => 'Endre språk for Lychee til:',
 	'LANG_TITLE' => 'Lagre innstilling for språk',
diff --git a/lang/pl/lychee.php b/lang/pl/lychee.php
index 8c9e35a008b..16b258d3c2f 100644
--- a/lang/pl/lychee.php
+++ b/lang/pl/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Zmień sortowanie',
 
 	'DROPBOX_TITLE' => 'Ustaw klucz Dropbox',
-	'DROPBOX_TEXT' => "In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/apps/create'>their website</a>. Generate yourself a personal key and enter it below:",
+	'DROPBOX_TEXT' => "In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/saver'>their website</a>. Generate yourself a personal key and enter it below:",
 
 	'LANG_TEXT' => 'Zmień język na:',
 	'LANG_TITLE' => 'Zmień język',
diff --git a/lang/pt/lychee.php b/lang/pt/lychee.php
index f4e3d05a2d5..9c7c378fe36 100644
--- a/lang/pt/lychee.php
+++ b/lang/pt/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Alterar Ordenação',
 
 	'DROPBOX_TITLE' => 'Escolher a Dropbox Key',
-	'DROPBOX_TEXT' => "Para importar fotografias do seu Dropbox, precisa de uma key válida de drop-in do <a href='https://www.dropbox.com/developers/apps/create'>website deles</a>. Crie uma key pessoal e insira-a abaixo:",
+	'DROPBOX_TEXT' => "Para importar fotografias do seu Dropbox, precisa de uma key válida de drop-in do <a href='https://www.dropbox.com/developers/saver'>website deles</a>. Crie uma key pessoal e insira-a abaixo:",
 
 	'LANG_TEXT' => 'Alterar língua do Lychee para:',
 	'LANG_TITLE' => 'Alterar Linguagem',
diff --git a/lang/ru/lychee.php b/lang/ru/lychee.php
index 17aaee3ddaa..460ffca37d4 100644
--- a/lang/ru/lychee.php
+++ b/lang/ru/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Сменить сортировку',
 
 	'DROPBOX_TITLE' => 'Задать ключ Dropbox',
-	'DROPBOX_TEXT' => "Для загрузки фото из Dropbox Вам нужен ключ, который можно получить на <a href='https://www.dropbox.com/developers/apps/create'>специальной странице</a>. Создайте личный ключ и вставьте здесь:",
+	'DROPBOX_TEXT' => "Для загрузки фото из Dropbox Вам нужен ключ, который можно получить на <a href='https://www.dropbox.com/developers/saver'>специальной странице</a>. Создайте личный ключ и вставьте здесь:",
 
 	'LANG_TEXT' => 'Change Lychee language to:',
 	'LANG_TITLE' => 'Change Language',
diff --git a/lang/sk/lychee.php b/lang/sk/lychee.php
index 5390e8fe6b1..b2dfc03f0eb 100644
--- a/lang/sk/lychee.php
+++ b/lang/sk/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Zmeniť triedenie',
 
 	'DROPBOX_TITLE' => 'Nastaviť kľúč Dropbox',
-	'DROPBOX_TEXT' => "Aby ste mohli importovať obrázky z Dropbox, potrebujete platný API-Key zo <a href='https://www.dropbox.com/developers/apps/create'>stránky Dropbox</a>. Vytvorte personal key a zadajte ho:",
+	'DROPBOX_TEXT' => "Aby ste mohli importovať obrázky z Dropbox, potrebujete platný API-Key zo <a href='https://www.dropbox.com/developers/saver'>stránky Dropbox</a>. Vytvorte personal key a zadajte ho:",
 
 	'LANG_TEXT' => 'Zmeniť jazyk Lychee na:',
 	'LANG_TITLE' => 'Zmena jazyka',
diff --git a/lang/sv/lychee.php b/lang/sv/lychee.php
index 1e6146c2421..6fa9a1b39ec 100644
--- a/lang/sv/lychee.php
+++ b/lang/sv/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Spara ändringar av sorteringsföljden',
 
 	'DROPBOX_TITLE' => 'Spara nyckeln för Dropbox',
-	'DROPBOX_TEXT' => "För att kunna importera fotografier från ditt Dropboxkonto behöver du en godkänd applikationsnyckel från <a href='https://www.dropbox.com/developers/apps/create'>Dropbox</a>.\n Skapa en personlig nyckel och ange den sedan här nedan:",
+	'DROPBOX_TEXT' => "För att kunna importera fotografier från ditt Dropboxkonto behöver du en godkänd applikationsnyckel från <a href='https://www.dropbox.com/developers/saver'>Dropbox</a>.\n Skapa en personlig nyckel och ange den sedan här nedan:",
 
 	'LANG_TEXT' => 'Ändra språket i Lychee till:',
 	'LANG_TITLE' => 'Spara ändringen av språket',
diff --git a/lang/vi/lychee.php b/lang/vi/lychee.php
index 7bdd57971f2..de2a7711db8 100644
--- a/lang/vi/lychee.php
+++ b/lang/vi/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => 'Thay đổi cách sắp xếp',
 
 	'DROPBOX_TITLE' => 'Đặt mã Dropbox',
-	'DROPBOX_TEXT' => "Để nhập hình ảnh của bạn vào từ Dropbox, bạn cần một mã nhập vào hợp lệ từ <a href='https://www.dropbox.com/developers/apps/create'>trang web của họ</a>. Hãy tạo một mã cá nhân cho mình và nhập mã vào bên dưới nhé:",
+	'DROPBOX_TEXT' => "Để nhập hình ảnh của bạn vào từ Dropbox, bạn cần một mã nhập vào hợp lệ từ <a href='https://www.dropbox.com/developers/saver'>trang web của họ</a>. Hãy tạo một mã cá nhân cho mình và nhập mã vào bên dưới nhé:",
 
 	'LANG_TEXT' => 'Thay đổi ngôn ngữ trên Lychee cho:',
 	'LANG_TITLE' => 'Thay đổi ngôn ngữ',
diff --git a/lang/zh_CN/lychee.php b/lang/zh_CN/lychee.php
index 71f266a91f0..f901b154967 100644
--- a/lang/zh_CN/lychee.php
+++ b/lang/zh_CN/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => '修改排序',
 
 	'DROPBOX_TITLE' => '设置 Dropbox 密钥',
-	'DROPBOX_TEXT' => "要从 Dropbox 导入照片，您需要一个有效的插件应用密钥，请转到 <a href='https://www.dropbox.com/developers/apps/create'>他们的网站</a>。为你自己生成个人密钥并输入到下面：",
+	'DROPBOX_TEXT' => "要从 Dropbox 导入照片，您需要一个有效的插件应用密钥，请转到 <a href='https://www.dropbox.com/developers/saver'>他们的网站</a>。为你自己生成个人密钥并输入到下面：",
 
 	'LANG_TEXT' => '将 Lychee 的语言修改为：',
 	'LANG_TITLE' => '修改语言',
diff --git a/lang/zh_TW/lychee.php b/lang/zh_TW/lychee.php
index c41a86c47d4..3011a519e4d 100644
--- a/lang/zh_TW/lychee.php
+++ b/lang/zh_TW/lychee.php
@@ -359,7 +359,7 @@
 	'SORT_CHANGE' => '修改排序',
 
 	'DROPBOX_TITLE' => '設置Dropbox私鑰',
-	'DROPBOX_TEXT' => "要從Dropbox導入照片，需要一個有效的應用私鑰，請到<a href='https://www.dropbox.com/developers/apps/create'>官網獲取</a>。輸入你自己生成的私鑰：",
+	'DROPBOX_TEXT' => "要從Dropbox導入照片，需要一個有效的應用私鑰，請到<a href='https://www.dropbox.com/developers/saver'>官網獲取</a>。輸入你自己生成的私鑰：",
 
 	'LANG_TEXT' => '將Lychee語言更改為：',
 	'LANG_TITLE' => '改變語言',
diff --git a/public/dist/frontend.js b/public/dist/frontend.js
index f3240ec4bee..e69eae6a6ee 100644
--- a/public/dist/frontend.js
+++ b/public/dist/frontend.js
@@ -49,63 +49,63 @@ var Row=module.exports=function(params){this.top=params.top;this.left=params.lef
  */
 !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).leaflet={})}(this,function(t){"use strict";function l(t){for(var e,i,n=1,o=arguments.length;n<o;n++)for(e in i=arguments[n])t[e]=i[e];return t}var R=Object.create||function(t){return N.prototype=t,new N};function N(){}function a(t,e){var i,n=Array.prototype.slice;return t.bind?t.bind.apply(t,n.call(arguments,1)):(i=n.call(arguments,2),function(){return t.apply(e,i.length?i.concat(n.call(arguments)):arguments)})}var D=0;function h(t){return"_leaflet_id"in t||(t._leaflet_id=++D),t._leaflet_id}function j(t,e,i){var n,o,s=function(){n=!1,o&&(r.apply(i,o),o=!1)},r=function(){n?o=arguments:(t.apply(i,arguments),setTimeout(s,e),n=!0)};return r}function H(t,e,i){var n=e[1],e=e[0],o=n-e;return t===n&&i?t:((t-e)%o+o)%o+e}function u(){return!1}function i(t,e){return!1===e?t:(e=Math.pow(10,void 0===e?6:e),Math.round(t*e)/e)}function W(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}function F(t){return W(t).split(/\s+/)}function c(t,e){for(var i in Object.prototype.hasOwnProperty.call(t,"options")||(t.options=t.options?R(t.options):{}),e)t.options[i]=e[i];return t.options}function U(t,e,i){var n,o=[];for(n in t)o.push(encodeURIComponent(i?n.toUpperCase():n)+"="+encodeURIComponent(t[n]));return(e&&-1!==e.indexOf("?")?"&":"?")+o.join("&")}var V=/\{ *([\w_ -]+) *\}/g;function q(t,i){return t.replace(V,function(t,e){e=i[e];if(void 0===e)throw new Error("No value provided for variable "+t);return e="function"==typeof e?e(i):e})}var d=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};function G(t,e){for(var i=0;i<t.length;i++)if(t[i]===e)return i;return-1}var K="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=";function Y(t){return window["webkit"+t]||window["moz"+t]||window["ms"+t]}var X=0;function J(t){var e=+new Date,i=Math.max(0,16-(e-X));return X=e+i,window.setTimeout(t,i)}var $=window.requestAnimationFrame||Y("RequestAnimationFrame")||J,Q=window.cancelAnimationFrame||Y("CancelAnimationFrame")||Y("CancelRequestAnimationFrame")||function(t){window.clearTimeout(t)};function x(t,e,i){if(!i||$!==J)return $.call(window,a(t,e));t.call(e)}function r(t){t&&Q.call(window,t)}var tt={__proto__:null,extend:l,create:R,bind:a,get lastId(){return D},stamp:h,throttle:j,wrapNum:H,falseFn:u,formatNum:i,trim:W,splitWords:F,setOptions:c,getParamString:U,template:q,isArray:d,indexOf:G,emptyImageUrl:K,requestFn:$,cancelFn:Q,requestAnimFrame:x,cancelAnimFrame:r};function et(){}et.extend=function(t){function e(){c(this),this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()}var i,n=e.__super__=this.prototype,o=R(n);for(i in(o.constructor=e).prototype=o,this)Object.prototype.hasOwnProperty.call(this,i)&&"prototype"!==i&&"__super__"!==i&&(e[i]=this[i]);if(t.statics&&l(e,t.statics),t.includes){var s=t.includes;if("undefined"!=typeof L&&L&&L.Mixin){s=d(s)?s:[s];for(var r=0;r<s.length;r++)s[r]===L.Mixin.Events&&console.warn("Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.",(new Error).stack)}l.apply(null,[o].concat(t.includes))}return l(o,t),delete o.statics,delete o.includes,o.options&&(o.options=n.options?R(n.options):{},l(o.options,t.options)),o._initHooks=[],o.callInitHooks=function(){if(!this._initHooksCalled){n.callInitHooks&&n.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;t<e;t++)o._initHooks[t].call(this)}},e},et.include=function(t){var e=this.prototype.options;return l(this.prototype,t),t.options&&(this.prototype.options=e,this.mergeOptions(t.options)),this},et.mergeOptions=function(t){return l(this.prototype.options,t),this},et.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i),this};var e={on:function(t,e,i){if("object"==typeof t)for(var n in t)this._on(n,t[n],e);else for(var o=0,s=(t=F(t)).length;o<s;o++)this._on(t[o],e,i);return this},off:function(t,e,i){if(arguments.length)if("object"==typeof t)for(var n in t)this._off(n,t[n],e);else{t=F(t);for(var o=1===arguments.length,s=0,r=t.length;s<r;s++)o?this._off(t[s]):this._off(t[s],e,i)}else delete this._events;return this},_on:function(t,e,i,n){"function"!=typeof e?console.warn("wrong listener type: "+typeof e):!1===this._listens(t,e,i)&&(e={fn:e,ctx:i=i===this?void 0:i},n&&(e.once=!0),this._events=this._events||{},this._events[t]=this._events[t]||[],this._events[t].push(e))},_off:function(t,e,i){var n,o,s;if(this._events&&(n=this._events[t]))if(1===arguments.length){if(this._firingCount)for(o=0,s=n.length;o<s;o++)n[o].fn=u;delete this._events[t]}else"function"!=typeof e?console.warn("wrong listener type: "+typeof e):!1!==(e=this._listens(t,e,i))&&(i=n[e],this._firingCount&&(i.fn=u,this._events[t]=n=n.slice()),n.splice(e,1))},fire:function(t,e,i){if(this.listens(t,i)){var n=l({},e,{type:t,target:this,sourceTarget:e&&e.sourceTarget||this});if(this._events){var o=this._events[t];if(o){this._firingCount=this._firingCount+1||1;for(var s=0,r=o.length;s<r;s++){var a=o[s],h=a.fn;a.once&&this.off(t,h,a.ctx),h.call(a.ctx||this,n)}this._firingCount--}}i&&this._propagateEvent(n)}return this},listens:function(t,e,i,n){"string"!=typeof t&&console.warn('"string" type argument expected');var o=e,s=("function"!=typeof e&&(n=!!e,i=o=void 0),this._events&&this._events[t]);if(s&&s.length&&!1!==this._listens(t,o,i))return!0;if(n)for(var r in this._eventParents)if(this._eventParents[r].listens(t,e,i,n))return!0;return!1},_listens:function(t,e,i){if(this._events){var n=this._events[t]||[];if(!e)return!!n.length;i===this&&(i=void 0);for(var o=0,s=n.length;o<s;o++)if(n[o].fn===e&&n[o].ctx===i)return o}return!1},once:function(t,e,i){if("object"==typeof t)for(var n in t)this._on(n,t[n],e,!0);else for(var o=0,s=(t=F(t)).length;o<s;o++)this._on(t[o],e,i,!0);return this},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[h(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[h(t)],this},_propagateEvent:function(t){for(var e in this._eventParents)this._eventParents[e].fire(t.type,l({layer:t.target,propagatedFrom:t.target},t),!0)}},it=(e.addEventListener=e.on,e.removeEventListener=e.clearAllEventListeners=e.off,e.addOneTimeEventListener=e.once,e.fireEvent=e.fire,e.hasEventListeners=e.listens,et.extend(e));function p(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e}var nt=Math.trunc||function(t){return 0<t?Math.floor(t):Math.ceil(t)};function m(t,e,i){return t instanceof p?t:d(t)?new p(t[0],t[1]):null==t?t:"object"==typeof t&&"x"in t&&"y"in t?new p(t.x,t.y):new p(t,e,i)}function f(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;n<o;n++)this.extend(i[n])}function _(t,e){return!t||t instanceof f?t:new f(t,e)}function s(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;n<o;n++)this.extend(i[n])}function g(t,e){return t instanceof s?t:new s(t,e)}function v(t,e,i){if(isNaN(t)||isNaN(e))throw new Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=+t,this.lng=+e,void 0!==i&&(this.alt=+i)}function w(t,e,i){return t instanceof v?t:d(t)&&"object"!=typeof t[0]?3===t.length?new v(t[0],t[1],t[2]):2===t.length?new v(t[0],t[1]):null:null==t?t:"object"==typeof t&&"lat"in t?new v(t.lat,"lng"in t?t.lng:t.lon,t.alt):void 0===e?null:new v(t,e,i)}p.prototype={clone:function(){return new p(this.x,this.y)},add:function(t){return this.clone()._add(m(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(m(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new p(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new p(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=nt(this.x),this.y=nt(this.y),this},distanceTo:function(t){var e=(t=m(t)).x-this.x,t=t.y-this.y;return Math.sqrt(e*e+t*t)},equals:function(t){return(t=m(t)).x===this.x&&t.y===this.y},contains:function(t){return t=m(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return"Point("+i(this.x)+", "+i(this.y)+")"}},f.prototype={extend:function(t){var e,i;if(t){if(t instanceof p||"number"==typeof t[0]||"x"in t)e=i=m(t);else if(e=(t=_(t)).min,i=t.max,!e||!i)return this;this.min||this.max?(this.min.x=Math.min(e.x,this.min.x),this.max.x=Math.max(i.x,this.max.x),this.min.y=Math.min(e.y,this.min.y),this.max.y=Math.max(i.y,this.max.y)):(this.min=e.clone(),this.max=i.clone())}return this},getCenter:function(t){return m((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return m(this.min.x,this.max.y)},getTopRight:function(){return m(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return(t=("number"==typeof t[0]||t instanceof p?m:_)(t))instanceof f?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>=e.x&&n.x<=i.x,t=t.y>=e.y&&n.y<=i.y;return o&&t},overlaps:function(t){t=_(t);var e=this.min,i=this.max,n=t.min,t=t.max,o=t.x>e.x&&n.x<i.x,t=t.y>e.y&&n.y<i.y;return o&&t},isValid:function(){return!(!this.min||!this.max)},pad:function(t){var e=this.min,i=this.max,n=Math.abs(e.x-i.x)*t,t=Math.abs(e.y-i.y)*t;return _(m(e.x-n,e.y-t),m(i.x+n,i.y+t))},equals:function(t){return!!t&&(t=_(t),this.min.equals(t.getTopLeft())&&this.max.equals(t.getBottomRight()))}},s.prototype={extend:function(t){var e,i,n=this._southWest,o=this._northEast;if(t instanceof v)i=e=t;else{if(!(t instanceof s))return t?this.extend(w(t)||g(t)):this;if(e=t._southWest,i=t._northEast,!e||!i)return this}return n||o?(n.lat=Math.min(e.lat,n.lat),n.lng=Math.min(e.lng,n.lng),o.lat=Math.max(i.lat,o.lat),o.lng=Math.max(i.lng,o.lng)):(this._southWest=new v(e.lat,e.lng),this._northEast=new v(i.lat,i.lng)),this},pad:function(t){var e=this._southWest,i=this._northEast,n=Math.abs(e.lat-i.lat)*t,t=Math.abs(e.lng-i.lng)*t;return new s(new v(e.lat-n,e.lng-t),new v(i.lat+n,i.lng+t))},getCenter:function(){return new v((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new v(this.getNorth(),this.getWest())},getSouthEast:function(){return new v(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t=("number"==typeof t[0]||t instanceof v||"lat"in t?w:g)(t);var e,i,n=this._southWest,o=this._northEast;return t instanceof s?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=n.lat&&i.lat<=o.lat&&e.lng>=n.lng&&i.lng<=o.lng},intersects:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>=e.lat&&n.lat<=i.lat,t=t.lng>=e.lng&&n.lng<=i.lng;return o&&t},overlaps:function(t){t=g(t);var e=this._southWest,i=this._northEast,n=t.getSouthWest(),t=t.getNorthEast(),o=t.lat>e.lat&&n.lat<i.lat,t=t.lng>e.lng&&n.lng<i.lng;return o&&t},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(",")},equals:function(t,e){return!!t&&(t=g(t),this._southWest.equals(t.getSouthWest(),e)&&this._northEast.equals(t.getNorthEast(),e))},isValid:function(){return!(!this._southWest||!this._northEast)}};var ot={latLngToPoint:function(t,e){t=this.projection.project(t),e=this.scale(e);return this.transformation._transform(t,e)},pointToLatLng:function(t,e){e=this.scale(e),t=this.transformation.untransform(t,e);return this.projection.unproject(t)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){var e;return this.infinite?null:(e=this.projection.bounds,t=this.scale(t),new f(this.transformation.transform(e.min,t),this.transformation.transform(e.max,t)))},infinite:!(v.prototype={equals:function(t,e){return!!t&&(t=w(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=(void 0===e?1e-9:e))},toString:function(t){return"LatLng("+i(this.lat,t)+", "+i(this.lng,t)+")"},distanceTo:function(t){return st.distance(this,w(t))},wrap:function(){return st.wrapLatLng(this)},toBounds:function(t){var t=180*t/40075017,e=t/Math.cos(Math.PI/180*this.lat);return g([this.lat-t,this.lng-e],[this.lat+t,this.lng+e])},clone:function(){return new v(this.lat,this.lng,this.alt)}}),wrapLatLng:function(t){var e=this.wrapLng?H(t.lng,this.wrapLng,!0):t.lng;return new v(this.wrapLat?H(t.lat,this.wrapLat,!0):t.lat,e,t.alt)},wrapLatLngBounds:function(t){var e=t.getCenter(),i=this.wrapLatLng(e),n=e.lat-i.lat,e=e.lng-i.lng;return 0==n&&0==e?t:(i=t.getSouthWest(),t=t.getNorthEast(),new s(new v(i.lat-n,i.lng-e),new v(t.lat-n,t.lng-e)))}},st=l({},ot,{wrapLng:[-180,180],R:6371e3,distance:function(t,e){var i=Math.PI/180,n=t.lat*i,o=e.lat*i,s=Math.sin((e.lat-t.lat)*i/2),e=Math.sin((e.lng-t.lng)*i/2),t=s*s+Math.cos(n)*Math.cos(o)*e*e,i=2*Math.atan2(Math.sqrt(t),Math.sqrt(1-t));return this.R*i}}),rt=6378137,rt={R:rt,MAX_LATITUDE:85.0511287798,project:function(t){var e=Math.PI/180,i=this.MAX_LATITUDE,i=Math.max(Math.min(i,t.lat),-i),i=Math.sin(i*e);return new p(this.R*t.lng*e,this.R*Math.log((1+i)/(1-i))/2)},unproject:function(t){var e=180/Math.PI;return new v((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*e,t.x*e/this.R)},bounds:new f([-(rt=rt*Math.PI),-rt],[rt,rt])};function at(t,e,i,n){d(t)?(this._a=t[0],this._b=t[1],this._c=t[2],this._d=t[3]):(this._a=t,this._b=e,this._c=i,this._d=n)}function ht(t,e,i,n){return new at(t,e,i,n)}at.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return t.x=(e=e||1)*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return new p((t.x/(e=e||1)-this._b)/this._a,(t.y/e-this._d)/this._c)}};var lt=l({},st,{code:"EPSG:3857",projection:rt,transformation:ht(lt=.5/(Math.PI*rt.R),.5,-lt,.5)}),ut=l({},lt,{code:"EPSG:900913"});function ct(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function dt(t,e){for(var i,n,o,s,r="",a=0,h=t.length;a<h;a++){for(i=0,n=(o=t[a]).length;i<n;i++)r+=(i?"L":"M")+(s=o[i]).x+" "+s.y;r+=e?b.svg?"z":"x":""}return r||"M0 0"}var _t=document.documentElement.style,pt="ActiveXObject"in window,mt=pt&&!document.addEventListener,n="msLaunchUri"in navigator&&!("documentMode"in document),ft=y("webkit"),gt=y("android"),vt=y("android 2")||y("android 3"),yt=parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),yt=gt&&y("Google")&&yt<537&&!("AudioNode"in window),xt=!!window.opera,wt=!n&&y("chrome"),bt=y("gecko")&&!ft&&!xt&&!pt,Pt=!wt&&y("safari"),Lt=y("phantom"),o="OTransition"in _t,Tt=0===navigator.platform.indexOf("Win"),Mt=pt&&"transition"in _t,zt="WebKitCSSMatrix"in window&&"m11"in new window.WebKitCSSMatrix&&!vt,_t="MozPerspective"in _t,Ct=!window.L_DISABLE_3D&&(Mt||zt||_t)&&!o&&!Lt,Zt="undefined"!=typeof orientation||y("mobile"),St=Zt&&ft,Et=Zt&&zt,kt=!window.PointerEvent&&window.MSPointerEvent,Ot=!(!window.PointerEvent&&!kt),At="ontouchstart"in window||!!window.TouchEvent,Bt=!window.L_NO_TOUCH&&(At||Ot),It=Zt&&xt,Rt=Zt&&bt,Nt=1<(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI),Dt=function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("testPassiveEventSupport",u,e),window.removeEventListener("testPassiveEventSupport",u,e)}catch(t){}return t}(),jt=!!document.createElement("canvas").getContext,Ht=!(!document.createElementNS||!ct("svg").createSVGRect),Wt=!!Ht&&((Wt=document.createElement("div")).innerHTML="<svg/>","http://www.w3.org/2000/svg"===(Wt.firstChild&&Wt.firstChild.namespaceURI));function y(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var b={ie:pt,ielt9:mt,edge:n,webkit:ft,android:gt,android23:vt,androidStock:yt,opera:xt,chrome:wt,gecko:bt,safari:Pt,phantom:Lt,opera12:o,win:Tt,ie3d:Mt,webkit3d:zt,gecko3d:_t,any3d:Ct,mobile:Zt,mobileWebkit:St,mobileWebkit3d:Et,msPointer:kt,pointer:Ot,touch:Bt,touchNative:At,mobileOpera:It,mobileGecko:Rt,retina:Nt,passiveEvents:Dt,canvas:jt,svg:Ht,vml:!Ht&&function(){try{var t=document.createElement("div"),e=(t.innerHTML='<v:shape adj="1"/>',t.firstChild);return e.style.behavior="url(#default#VML)",e&&"object"==typeof e.adj}catch(t){return!1}}(),inlineSvg:Wt,mac:0===navigator.platform.indexOf("Mac"),linux:0===navigator.platform.indexOf("Linux")},Ft=b.msPointer?"MSPointerDown":"pointerdown",Ut=b.msPointer?"MSPointerMove":"pointermove",Vt=b.msPointer?"MSPointerUp":"pointerup",qt=b.msPointer?"MSPointerCancel":"pointercancel",Gt={touchstart:Ft,touchmove:Ut,touchend:Vt,touchcancel:qt},Kt={touchstart:function(t,e){e.MSPOINTER_TYPE_TOUCH&&e.pointerType===e.MSPOINTER_TYPE_TOUCH&&O(e);ee(t,e)},touchmove:ee,touchend:ee,touchcancel:ee},Yt={},Xt=!1;function Jt(t,e,i){return"touchstart"!==e||Xt||(document.addEventListener(Ft,$t,!0),document.addEventListener(Ut,Qt,!0),document.addEventListener(Vt,te,!0),document.addEventListener(qt,te,!0),Xt=!0),Kt[e]?(i=Kt[e].bind(this,i),t.addEventListener(Gt[e],i,!1),i):(console.warn("wrong event specified:",e),u)}function $t(t){Yt[t.pointerId]=t}function Qt(t){Yt[t.pointerId]&&(Yt[t.pointerId]=t)}function te(t){delete Yt[t.pointerId]}function ee(t,e){if(e.pointerType!==(e.MSPOINTER_TYPE_MOUSE||"mouse")){for(var i in e.touches=[],Yt)e.touches.push(Yt[i]);e.changedTouches=[e],t(e)}}var ie=200;function ne(t,i){t.addEventListener("dblclick",i);var n,o=0;function e(t){var e;1!==t.detail?n=t.detail:"mouse"===t.pointerType||t.sourceCapabilities&&!t.sourceCapabilities.firesTouchEvents||((e=Ne(t)).some(function(t){return t instanceof HTMLLabelElement&&t.attributes.for})&&!e.some(function(t){return t instanceof HTMLInputElement||t instanceof HTMLSelectElement})||((e=Date.now())-o<=ie?2===++n&&i(function(t){var e,i,n={};for(i in t)e=t[i],n[i]=e&&e.bind?e.bind(t):e;return(t=n).type="dblclick",n.detail=2,n.isTrusted=!1,n._simulated=!0,n}(t)):n=1,o=e))}return t.addEventListener("click",e),{dblclick:i,simDblclick:e}}var oe,se,re,ae,he,le,ue=we(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ce=we(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),de="webkitTransition"===ce||"OTransition"===ce?ce+"End":"transitionend";function _e(t){return"string"==typeof t?document.getElementById(t):t}function pe(t,e){var i=t.style[e]||t.currentStyle&&t.currentStyle[e];return"auto"===(i=i&&"auto"!==i||!document.defaultView?i:(t=document.defaultView.getComputedStyle(t,null))?t[e]:null)?null:i}function P(t,e,i){t=document.createElement(t);return t.className=e||"",i&&i.appendChild(t),t}function T(t){var e=t.parentNode;e&&e.removeChild(t)}function me(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function fe(t){var e=t.parentNode;e&&e.lastChild!==t&&e.appendChild(t)}function ge(t){var e=t.parentNode;e&&e.firstChild!==t&&e.insertBefore(t,e.firstChild)}function ve(t,e){return void 0!==t.classList?t.classList.contains(e):0<(t=xe(t)).length&&new RegExp("(^|\\s)"+e+"(\\s|$)").test(t)}function M(t,e){var i;if(void 0!==t.classList)for(var n=F(e),o=0,s=n.length;o<s;o++)t.classList.add(n[o]);else ve(t,e)||ye(t,((i=xe(t))?i+" ":"")+e)}function z(t,e){void 0!==t.classList?t.classList.remove(e):ye(t,W((" "+xe(t)+" ").replace(" "+e+" "," ")))}function ye(t,e){void 0===t.className.baseVal?t.className=e:t.className.baseVal=e}function xe(t){return void 0===(t=t.correspondingElement?t.correspondingElement:t).className.baseVal?t.className:t.className.baseVal}function C(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(t){if(1===e)return}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}}function we(t){for(var e=document.documentElement.style,i=0;i<t.length;i++)if(t[i]in e)return t[i];return!1}function be(t,e,i){e=e||new p(0,0);t.style[ue]=(b.ie3d?"translate("+e.x+"px,"+e.y+"px)":"translate3d("+e.x+"px,"+e.y+"px,0)")+(i?" scale("+i+")":"")}function Z(t,e){t._leaflet_pos=e,b.any3d?be(t,e):(t.style.left=e.x+"px",t.style.top=e.y+"px")}function Pe(t){return t._leaflet_pos||new p(0,0)}function Le(){S(window,"dragstart",O)}function Te(){k(window,"dragstart",O)}function Me(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(ze(),le=(he=t).style.outlineStyle,t.style.outlineStyle="none",S(window,"keydown",ze))}function ze(){he&&(he.style.outlineStyle=le,le=he=void 0,k(window,"keydown",ze))}function Ce(t){for(;!((t=t.parentNode).offsetWidth&&t.offsetHeight||t===document.body););return t}function Ze(t){var e=t.getBoundingClientRect();return{x:e.width/t.offsetWidth||1,y:e.height/t.offsetHeight||1,boundingClientRect:e}}ae="onselectstart"in document?(re=function(){S(window,"selectstart",O)},function(){k(window,"selectstart",O)}):(se=we(["userSelect","WebkitUserSelect","OUserSelect","MozUserSelect","msUserSelect"]),re=function(){var t;se&&(t=document.documentElement.style,oe=t[se],t[se]="none")},function(){se&&(document.documentElement.style[se]=oe,oe=void 0)});pt={__proto__:null,TRANSFORM:ue,TRANSITION:ce,TRANSITION_END:de,get:_e,getStyle:pe,create:P,remove:T,empty:me,toFront:fe,toBack:ge,hasClass:ve,addClass:M,removeClass:z,setClass:ye,getClass:xe,setOpacity:C,testProp:we,setTransform:be,setPosition:Z,getPosition:Pe,get disableTextSelection(){return re},get enableTextSelection(){return ae},disableImageDrag:Le,enableImageDrag:Te,preventOutline:Me,restoreOutline:ze,getSizedParentNode:Ce,getScale:Ze};function S(t,e,i,n){if(e&&"object"==typeof e)for(var o in e)ke(t,o,e[o],i);else for(var s=0,r=(e=F(e)).length;s<r;s++)ke(t,e[s],i,n);return this}var E="_leaflet_events";function k(t,e,i,n){if(1===arguments.length)Se(t),delete t[E];else if(e&&"object"==typeof e)for(var o in e)Oe(t,o,e[o],i);else if(e=F(e),2===arguments.length)Se(t,function(t){return-1!==G(e,t)});else for(var s=0,r=e.length;s<r;s++)Oe(t,e[s],i,n);return this}function Se(t,e){for(var i in t[E]){var n=i.split(/\d/)[0];e&&!e(n)||Oe(t,n,null,null,i)}}var Ee={mouseenter:"mouseover",mouseleave:"mouseout",wheel:!("onwheel"in window)&&"mousewheel"};function ke(e,t,i,n){var o,s,r=t+h(i)+(n?"_"+h(n):"");e[E]&&e[E][r]||(s=o=function(t){return i.call(n||e,t||window.event)},!b.touchNative&&b.pointer&&0===t.indexOf("touch")?o=Jt(e,t,o):b.touch&&"dblclick"===t?o=ne(e,o):"addEventListener"in e?"touchstart"===t||"touchmove"===t||"wheel"===t||"mousewheel"===t?e.addEventListener(Ee[t]||t,o,!!b.passiveEvents&&{passive:!1}):"mouseenter"===t||"mouseleave"===t?e.addEventListener(Ee[t],o=function(t){t=t||window.event,We(e,t)&&s(t)},!1):e.addEventListener(t,s,!1):e.attachEvent("on"+t,o),e[E]=e[E]||{},e[E][r]=o)}function Oe(t,e,i,n,o){o=o||e+h(i)+(n?"_"+h(n):"");var s,r,i=t[E]&&t[E][o];i&&(!b.touchNative&&b.pointer&&0===e.indexOf("touch")?(n=t,r=i,Gt[s=e]?n.removeEventListener(Gt[s],r,!1):console.warn("wrong event specified:",s)):b.touch&&"dblclick"===e?(n=i,(r=t).removeEventListener("dblclick",n.dblclick),r.removeEventListener("click",n.simDblclick)):"removeEventListener"in t?t.removeEventListener(Ee[e]||e,i,!1):t.detachEvent("on"+e,i),t[E][o]=null)}function Ae(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,this}function Be(t){return ke(t,"wheel",Ae),this}function Ie(t){return S(t,"mousedown touchstart dblclick contextmenu",Ae),t._leaflet_disable_click=!0,this}function O(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Re(t){return O(t),Ae(t),this}function Ne(t){if(t.composedPath)return t.composedPath();for(var e=[],i=t.target;i;)e.push(i),i=i.parentNode;return e}function De(t,e){var i,n;return e?(n=(i=Ze(e)).boundingClientRect,new p((t.clientX-n.left)/i.x-e.clientLeft,(t.clientY-n.top)/i.y-e.clientTop)):new p(t.clientX,t.clientY)}var je=b.linux&&b.chrome?window.devicePixelRatio:b.mac?3*window.devicePixelRatio:0<window.devicePixelRatio?2*window.devicePixelRatio:1;function He(t){return b.edge?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/je:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)<32765?20*-t.detail:t.detail?t.detail/-32765*60:0}function We(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(t){return!1}return i!==t}var mt={__proto__:null,on:S,off:k,stopPropagation:Ae,disableScrollPropagation:Be,disableClickPropagation:Ie,preventDefault:O,stop:Re,getPropagationPath:Ne,getMousePosition:De,getWheelDelta:He,isExternalTarget:We,addListener:S,removeListener:k},Fe=it.extend({run:function(t,e,i,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=Pe(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=x(this._animate,this),this._step()},_step:function(t){var e=+new Date-this._startTime,i=1e3*this._duration;e<i?this._runFrame(this._easeOut(e/i),t):(this._runFrame(1),this._complete())},_runFrame:function(t,e){t=this._startPos.add(this._offset.multiplyBy(t));e&&t._round(),Z(this._el,t),this.fire("step")},_complete:function(){r(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),A=it.extend({options:{crs:lt,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,e){e=c(this,e),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this._initContainer(t),this._initLayout(),this._onResize=a(this._onResize,this),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),void 0!==e.zoom&&(this._zoom=this._limitZoom(e.zoom)),e.center&&void 0!==e.zoom&&this.setView(w(e.center),e.zoom,{reset:!0}),this.callInitHooks(),this._zoomAnimated=ce&&b.any3d&&!b.mobileOpera&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),S(this._proxy,de,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,e,i){if((e=void 0===e?this._zoom:this._limitZoom(e),t=this._limitCenter(w(t),e,this.options.maxBounds),i=i||{},this._stop(),this._loaded&&!i.reset&&!0!==i)&&(void 0!==i.animate&&(i.zoom=l({animate:i.animate},i.zoom),i.pan=l({animate:i.animate,duration:i.duration},i.pan)),this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,i.zoom):this._tryAnimatedPan(t,i.pan)))return clearTimeout(this._sizeTimer),this;return this._resetView(t,e,i.pan&&i.pan.noMoveStart),this},setZoom:function(t,e){return this._loaded?this.setView(this.getCenter(),t,{zoom:e}):(this._zoom=t,this)},zoomIn:function(t,e){return t=t||(b.any3d?this.options.zoomDelta:1),this.setZoom(this._zoom+t,e)},zoomOut:function(t,e){return t=t||(b.any3d?this.options.zoomDelta:1),this.setZoom(this._zoom-t,e)},setZoomAround:function(t,e,i){var n=this.getZoomScale(e),o=this.getSize().divideBy(2),t=(t instanceof p?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/n),n=this.containerPointToLatLng(o.add(t));return this.setView(n,e,{zoom:i})},_getBoundsCenterZoom:function(t,e){e=e||{},t=t.getBounds?t.getBounds():g(t);var i=m(e.paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.getBoundsZoom(t,!1,i.add(n));return(o="number"==typeof e.maxZoom?Math.min(e.maxZoom,o):o)===1/0?{center:t.getCenter(),zoom:o}:(e=n.subtract(i).divideBy(2),n=this.project(t.getSouthWest(),o),i=this.project(t.getNorthEast(),o),{center:this.unproject(n.add(i).divideBy(2).add(e),o),zoom:o})},fitBounds:function(t,e){if((t=g(t)).isValid())return t=this._getBoundsCenterZoom(t,e),this.setView(t.center,t.zoom,e);throw new Error("Bounds are not valid.")},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,e){return this.setView(t,this._zoom,{pan:e})},panBy:function(t,e){var i;return e=e||{},(t=m(t).round()).x||t.y?(!0===e.animate||this.getSize().contains(t)?(this._panAnim||(this._panAnim=new Fe,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),e.noMoveStart||this.fire("movestart"),!1!==e.animate?(M(this._mapPane,"leaflet-pan-anim"),i=this._getMapPanePos().subtract(t).round(),this._panAnim.run(this._mapPane,i,e.duration||.25,e.easeLinearity)):(this._rawPanBy(t),this.fire("move").fire("moveend"))):this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this):this.fire("moveend")},flyTo:function(n,o,t){if(!1===(t=t||{}).animate||!b.any3d)return this.setView(n,o,t);this._stop();var s=this.project(this.getCenter()),r=this.project(n),e=this.getSize(),a=this._zoom,h=(n=w(n),o=void 0===o?a:o,Math.max(e.x,e.y)),i=h*this.getZoomScale(a,o),l=r.distanceTo(s)||1,u=1.42,c=u*u;function d(t){t=(i*i-h*h+(t?-1:1)*c*c*l*l)/(2*(t?i:h)*c*l),t=Math.sqrt(t*t+1)-t;return t<1e-9?-18:Math.log(t)}function _(t){return(Math.exp(t)-Math.exp(-t))/2}function p(t){return(Math.exp(t)+Math.exp(-t))/2}var m=d(0);function f(t){return h*(p(m)*(_(t=m+u*t)/p(t))-_(m))/c}var g=Date.now(),v=(d(1)-m)/u,y=t.duration?1e3*t.duration:1e3*v*.8;return this._moveStart(!0,t.noMoveStart),function t(){var e=(Date.now()-g)/y,i=(1-Math.pow(1-e,1.5))*v;e<=1?(this._flyToFrame=x(t,this),this._move(this.unproject(s.add(r.subtract(s).multiplyBy(f(i)/l)),a),this.getScaleZoom(h/(e=i,h*(p(m)/p(m+u*e))),a),{flyTo:!0})):this._move(n,o)._moveEnd(!0)}.call(this),this},flyToBounds:function(t,e){t=this._getBoundsCenterZoom(t,e);return this.flyTo(t.center,t.zoom,e)},setMaxBounds:function(t){return t=g(t),this.listens("moveend",this._panInsideMaxBounds)&&this.off("moveend",this._panInsideMaxBounds),t.isValid()?(this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on("moveend",this._panInsideMaxBounds)):(this.options.maxBounds=null,this)},setMinZoom:function(t){var e=this.options.minZoom;return this.options.minZoom=t,this._loaded&&e!==t&&(this.fire("zoomlevelschange"),this.getZoom()<this.options.minZoom)?this.setZoom(t):this},setMaxZoom:function(t){var e=this.options.maxZoom;return this.options.maxZoom=t,this._loaded&&e!==t&&(this.fire("zoomlevelschange"),this.getZoom()>this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,e){this._enforcingBounds=!0;var i=this.getCenter(),t=this._limitCenter(i,this._zoom,g(t));return i.equals(t)||this.panTo(t,e),this._enforcingBounds=!1,this},panInside:function(t,e){var i=m((e=e||{}).paddingTopLeft||e.padding||[0,0]),n=m(e.paddingBottomRight||e.padding||[0,0]),o=this.project(this.getCenter()),t=this.project(t),s=this.getPixelBounds(),i=_([s.min.add(i),s.max.subtract(n)]),s=i.getSize();return i.contains(t)||(this._enforcingBounds=!0,n=t.subtract(i.getCenter()),i=i.extend(t).getSize().subtract(s),o.x+=n.x<0?-i.x:i.x,o.y+=n.y<0?-i.y:i.y,this.panTo(this.unproject(o),e),this._enforcingBounds=!1),this},invalidateSize:function(t){if(!this._loaded)return this;t=l({animate:!1,pan:!0},!0===t?{animate:!0}:t);var e=this.getSize(),i=(this._sizeChanged=!0,this._lastCenter=null,this.getSize()),n=e.divideBy(2).round(),o=i.divideBy(2).round(),n=n.subtract(o);return n.x||n.y?(t.animate&&t.pan?this.panBy(n):(t.pan&&this._rawPanBy(n),this.fire("move"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(a(this.fire,this,"moveend"),200)):this.fire("moveend")),this.fire("resize",{oldSize:e,newSize:i})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire("viewreset"),this._stop()},locate:function(t){var e,i;return t=this._locateOptions=l({timeout:1e4,watch:!1},t),"geolocation"in navigator?(e=a(this._handleGeolocationResponse,this),i=a(this._handleGeolocationError,this),t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t)):this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var e;this._container._leaflet_id&&(e=t.code,t=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout"),this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+t+"."}))},_handleGeolocationResponse:function(t){if(this._container._leaflet_id){var e,i,n=new v(t.coords.latitude,t.coords.longitude),o=n.toBounds(2*t.coords.accuracy),s=this._locateOptions,r=(s.setView&&(e=this.getBoundsZoom(o),this.setView(n,s.maxZoom?Math.min(e,s.maxZoom):e)),{latlng:n,bounds:o,timestamp:t.timestamp});for(i in t.coords)"number"==typeof t.coords[i]&&(r[i]=t.coords[i]);this.fire("locationfound",r)}},addHandler:function(t,e){return e&&(e=this[t]=new e(this),this._handlers.push(e),this.options[t]&&e.enable()),this},remove:function(){if(this._initEvents(!0),this.options.maxBounds&&this.off("moveend",this._panInsideMaxBounds),this._containerId!==this._container._leaflet_id)throw new Error("Map container is being reused by another instance");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}for(var t in void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),T(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._resizeRequest&&(r(this._resizeRequest),this._resizeRequest=null),this._clearHandlers(),this._loaded&&this.fire("unload"),this._layers)this._layers[t].remove();for(t in this._panes)T(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,e){e=P("div","leaflet-pane"+(t?" leaflet-"+t.replace("Pane","")+"-pane":""),e||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter.clone():this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new s(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,e,i){t=g(t),i=m(i||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),t=t.getSouthEast(),i=this.getSize().subtract(i),t=_(this.project(t,n),this.project(r,n)).getSize(),r=b.any3d?this.options.zoomSnap:1,a=i.x/t.x,i=i.y/t.y,t=e?Math.max(a,i):Math.min(a,i),n=this.getScaleZoom(t,n);return r&&(n=Math.round(n/(r/100))*(r/100),n=e?Math.ceil(n/r)*r:Math.floor(n/r)*r),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new p(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,e){t=this._getTopLeftPoint(t,e);return new f(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return"string"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,e){var i=this.options.crs;return e=void 0===e?this._zoom:e,i.scale(t)/i.scale(e)},getScaleZoom:function(t,e){var i=this.options.crs,t=(e=void 0===e?this._zoom:e,i.zoom(t*i.scale(e)));return isNaN(t)?1/0:t},project:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.latLngToPoint(w(t),e)},unproject:function(t,e){return e=void 0===e?this._zoom:e,this.options.crs.pointToLatLng(m(t),e)},layerPointToLatLng:function(t){t=m(t).add(this.getPixelOrigin());return this.unproject(t)},latLngToLayerPoint:function(t){return this.project(w(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(w(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(g(t))},distance:function(t,e){return this.options.crs.distance(w(t),w(e))},containerPointToLayerPoint:function(t){return m(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return m(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){t=this.containerPointToLayerPoint(m(t));return this.layerPointToLatLng(t)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(w(t)))},mouseEventToContainerPoint:function(t){return De(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){t=this._container=_e(t);if(!t)throw new Error("Map container not found.");if(t._leaflet_id)throw new Error("Map container is already initialized.");S(t,"scroll",this._onScroll,this),this._containerId=h(t)},_initLayout:function(){var t=this._container,e=(this._fadeAnimated=this.options.fadeAnimation&&b.any3d,M(t,"leaflet-container"+(b.touch?" leaflet-touch":"")+(b.retina?" leaflet-retina":"")+(b.ielt9?" leaflet-oldie":"")+(b.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":"")),pe(t,"position"));"absolute"!==e&&"relative"!==e&&"fixed"!==e&&"sticky"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),Z(this._mapPane,new p(0,0)),this.createPane("tilePane"),this.createPane("overlayPane"),this.createPane("shadowPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(M(t.markerPane,"leaflet-zoom-hide"),M(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e,i){Z(this._mapPane,new p(0,0));var n=!this._loaded,o=(this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset"),this._zoom!==e);this._moveStart(o,i)._move(t,e)._moveEnd(o),this.fire("viewreset"),n&&this.fire("load")},_moveStart:function(t,e){return t&&this.fire("zoomstart"),e||this.fire("movestart"),this},_move:function(t,e,i,n){void 0===e&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),n?i&&i.pinch&&this.fire("zoom",i):((o||i&&i.pinch)&&this.fire("zoom",i),this.fire("move",i)),this},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return r(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Z(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(t){this._targets={};var e=t?k:S;e((this._targets[h(this._container)]=this)._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress keydown keyup",this._handleDOMEvent,this),this.options.trackResize&&e(window,"resize",this._onResize,this),b.any3d&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,"moveend",this._onMoveEnd)},_onResize:function(){r(this._resizeRequest),this._resizeRequest=x(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,n=[],o="mouseout"===e||"mouseover"===e,s=t.target||t.srcElement,r=!1;s;){if((i=this._targets[h(s)])&&("click"===e||"preclick"===e)&&this._draggableMoved(i)){r=!0;break}if(i&&i.listens(e,!0)){if(o&&!We(s,t))break;if(n.push(i),o)break}if(s===this._container)break;s=s.parentNode}return n=n.length||r||o||!this.listens(e,!0)?n:[this]},_isClickDisabled:function(t){for(;t&&t!==this._container;){if(t._leaflet_disable_click)return!0;t=t.parentNode}},_handleDOMEvent:function(t){var e,i=t.target||t.srcElement;!this._loaded||i._leaflet_disable_events||"click"===t.type&&this._isClickDisabled(i)||("mousedown"===(e=t.type)&&Me(i),this._fireDOMEvent(t,e))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,e,i){"click"===t.type&&((a=l({},t)).type="preclick",this._fireDOMEvent(a,a.type,i));var n=this._findEventTargets(t,e);if(i){for(var o=[],s=0;s<i.length;s++)i[s].listens(e,!0)&&o.push(i[s]);n=o.concat(n)}if(n.length){"contextmenu"===e&&O(t);var r,a=n[0],h={originalEvent:t};for("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type&&(r=a.getLatLng&&(!a._radius||a._radius<=10),h.containerPoint=r?this.latLngToContainerPoint(a.getLatLng()):this.mouseEventToContainerPoint(t),h.layerPoint=this.containerPointToLayerPoint(h.containerPoint),h.latlng=r?a.getLatLng():this.layerPointToLatLng(h.layerPoint)),s=0;s<n.length;s++)if(n[s].fire(e,h,!0),h.originalEvent._stopped||!1===n[s].options.bubblingMouseEvents&&-1!==G(this._mouseEvents,e))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,e=this._handlers.length;t<e;t++)this._handlers[t].disable()},whenReady:function(t,e){return this._loaded?t.call(e||this,{target:this}):this.on("load",t,e),this},_getMapPanePos:function(){return Pe(this._mapPane)||new p(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,e){return(t&&void 0!==e?this._getNewPixelOrigin(t,e):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,e,i){i=this._getNewPixelOrigin(i,e);return this.project(t,e)._subtract(i)},_latLngBoundsToNewLayerBounds:function(t,e,i){i=this._getNewPixelOrigin(i,e);return _([this.project(t.getSouthWest(),e)._subtract(i),this.project(t.getNorthWest(),e)._subtract(i),this.project(t.getSouthEast(),e)._subtract(i),this.project(t.getNorthEast(),e)._subtract(i)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,e,i){var n,o;return!i||(n=this.project(t,e),o=this.getSize().divideBy(2),o=new f(n.subtract(o),n.add(o)),o=this._getBoundsOffset(o,i,e),Math.abs(o.x)<=1&&Math.abs(o.y)<=1)?t:this.unproject(n.add(o),e)},_limitOffset:function(t,e){var i;return e?(i=new f((i=this.getPixelBounds()).min.add(t),i.max.add(t)),t.add(this._getBoundsOffset(i,e))):t},_getBoundsOffset:function(t,e,i){e=_(this.project(e.getNorthEast(),i),this.project(e.getSouthWest(),i)),i=e.min.subtract(t.min),e=e.max.subtract(t.max);return new p(this._rebound(i.x,-e.x),this._rebound(i.y,-e.y))},_rebound:function(t,e){return 0<t+e?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom(),n=b.any3d?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(e,Math.min(i,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){z(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){t=this._getCenterOffset(t)._trunc();return!(!0!==(e&&e.animate)&&!this.getSize().contains(t))&&(this.panBy(t,e),!0)},_createAnimProxy:function(){var t=this._proxy=P("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",function(t){var e=ue,i=this._proxy.style[e];be(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),i===this._proxy.style[e]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",this._animMoveEnd,this),this._on("unload",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){T(this._proxy),this.off("load moveend",this._animMoveEnd,this),delete this._proxy},_animMoveEnd:function(){var t=this.getCenter(),e=this.getZoom();be(this._proxy,this.project(t,e),this.getZoomScale(e,1))},_catchTransitionEnd:function(t){this._animatingZoom&&0<=t.propertyName.indexOf("transform")&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(!this._animatingZoom){if(i=i||{},!this._zoomAnimated||!1===i.animate||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(e),n=this._getCenterOffset(t)._divideBy(1-1/n);if(!0!==i.animate&&!this.getSize().contains(n))return!1;x(function(){this._moveStart(!0,i.noMoveStart||!1)._animateZoom(t,e,!0)},this)}return!0},_animateZoom:function(t,e,i,n){this._mapPane&&(i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,M(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:n}),this._tempFireZoomEvent||(this._tempFireZoomEvent=this._zoom!==this._animateToZoom),this._move(this._animateToCenter,this._animateToZoom,void 0,!0),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&z(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom,void 0,!0),this._tempFireZoomEvent&&this.fire("zoom"),delete this._tempFireZoomEvent,this.fire("move"),this._moveEnd(!0))}});function Ue(t){return new B(t)}var B=et.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),t=t._controlCorners[i];return M(e,"leaflet-control"),-1!==i.indexOf("bottom")?t.insertBefore(e,t.firstChild):t.appendChild(e),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(T(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0<t.screenX&&0<t.screenY&&this._map.getContainer().focus()}}),Ve=(A.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){var i=this._controlCorners={},n="leaflet-",o=this._controlContainer=P("div",n+"control-container",this._container);function t(t,e){i[t+e]=P("div",n+t+" "+n+e,o)}t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){for(var t in this._controlCorners)T(this._controlCorners[t]);T(this._controlContainer),delete this._controlCorners,delete this._controlContainer}}),B.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,e,i,n){return i<n?-1:n<i?1:0}},initialize:function(t,e,i){for(var n in c(this,i),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1,this._preventClick=!1,t)this._addLayer(t[n],n);for(n in e)this._addLayer(e[n],n,!0)},onAdd:function(t){this._initLayout(),this._update(),(this._map=t).on("zoomend",this._checkDisabledLayers,this);for(var e=0;e<this._layers.length;e++)this._layers[e].layer.on("add remove",this._onLayerChange,this);return this._container},addTo:function(t){return B.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off("zoomend",this._checkDisabledLayers,this);for(var t=0;t<this._layers.length;t++)this._layers[t].layer.off("add remove",this._onLayerChange,this)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._map?this._update():this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._map?this._update():this},removeLayer:function(t){t.off("add remove",this._onLayerChange,this);t=this._getLayer(h(t));return t&&this._layers.splice(this._layers.indexOf(t),1),this._map?this._update():this},expand:function(){M(this._container,"leaflet-control-layers-expanded"),this._section.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t<this._section.clientHeight?(M(this._section,"leaflet-control-layers-scrollbar"),this._section.style.height=t+"px"):z(this._section,"leaflet-control-layers-scrollbar"),this._checkDisabledLayers(),this},collapse:function(){return z(this._container,"leaflet-control-layers-expanded"),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=P("div",t),i=this.options.collapsed,n=(e.setAttribute("aria-haspopup",!0),Ie(e),Be(e),this._section=P("section",t+"-list")),o=(i&&(this._map.on("click",this.collapse,this),S(e,{mouseenter:this._expandSafely,mouseleave:this.collapse},this)),this._layersLink=P("a",t+"-toggle",e));o.href="#",o.title="Layers",o.setAttribute("role","button"),S(o,{keydown:function(t){13===t.keyCode&&this._expandSafely()},click:function(t){O(t),this._expandSafely()}},this),i||this.expand(),this._baseLayersList=P("div",t+"-base",n),this._separator=P("div",t+"-separator",n),this._overlaysList=P("div",t+"-overlays",n),e.appendChild(n)},_getLayer:function(t){for(var e=0;e<this._layers.length;e++)if(this._layers[e]&&h(this._layers[e].layer)===t)return this._layers[e]},_addLayer:function(t,e,i){this._map&&t.on("add remove",this._onLayerChange,this),this._layers.push({layer:t,name:e,overlay:i}),this.options.sortLayers&&this._layers.sort(a(function(t,e){return this.options.sortFunction(t.layer,e.layer,t.name,e.name)},this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(this._container){me(this._baseLayersList),me(this._overlaysList),this._layerControlInputs=[];for(var t,e,i,n=0,o=0;o<this._layers.length;o++)i=this._layers[o],this._addItem(i),e=e||i.overlay,t=t||!i.overlay,n+=i.overlay?0:1;this.options.hideSingleBase&&(this._baseLayersList.style.display=(t=t&&1<n)?"":"none"),this._separator.style.display=e&&t?"":"none"}return this},_onLayerChange:function(t){this._handlingClick||this._update();var e=this._getLayer(h(t.target)),t=e.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;t&&this._map.fire(t,e)},_createRadioElement:function(t,e){t='<input type="radio" class="leaflet-control-layers-selector" name="'+t+'"'+(e?' checked="checked"':"")+"/>",e=document.createElement("div");return e.innerHTML=t,e.firstChild},_addItem:function(t){var e,i=document.createElement("label"),n=this._map.hasLayer(t.layer),n=(t.overlay?((e=document.createElement("input")).type="checkbox",e.className="leaflet-control-layers-selector",e.defaultChecked=n):e=this._createRadioElement("leaflet-base-layers_"+h(this),n),this._layerControlInputs.push(e),e.layerId=h(t.layer),S(e,"click",this._onInputClick,this),document.createElement("span")),o=(n.innerHTML=" "+t.name,document.createElement("span"));return i.appendChild(o),o.appendChild(e),o.appendChild(n),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(i),this._checkDisabledLayers(),i},_onInputClick:function(){if(!this._preventClick){var t,e,i=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=i.length-1;0<=s;s--)t=i[s],e=this._getLayer(t.layerId).layer,t.checked?n.push(e):t.checked||o.push(e);for(s=0;s<o.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s<n.length;s++)this._map.hasLayer(n[s])||this._map.addLayer(n[s]);this._handlingClick=!1,this._refocusOnMap()}},_checkDisabledLayers:function(){for(var t,e,i=this._layerControlInputs,n=this._map.getZoom(),o=i.length-1;0<=o;o--)t=i[o],e=this._getLayer(t.layerId).layer,t.disabled=void 0!==e.options.minZoom&&n<e.options.minZoom||void 0!==e.options.maxZoom&&n>e.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expandSafely:function(){var t=this._section,e=(this._preventClick=!0,S(t,"click",O),this.expand(),this);setTimeout(function(){k(t,"click",O),e._preventClick=!1})}})),qe=B.extend({options:{position:"topleft",zoomInText:'<span aria-hidden="true">+</span>',zoomInTitle:"Zoom in",zoomOutText:'<span aria-hidden="true">&#x2212;</span>',zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=P("div",e+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoom<this._map.getMaxZoom()&&this._map.zoomIn(this._map.options.zoomDelta*(t.shiftKey?3:1))},_zoomOut:function(t){!this._disabled&&this._map._zoom>this._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,n,o){i=P("a",i,n);return i.innerHTML=t,i.href="#",i.title=e,i.setAttribute("role","button"),i.setAttribute("aria-label",e),Ie(i),S(i,"click",Re),S(i,"click",o,this),S(i,"click",this._refocusOnMap,this),i},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";z(this._zoomInButton,e),z(this._zoomOutButton,e),this._zoomInButton.setAttribute("aria-disabled","false"),this._zoomOutButton.setAttribute("aria-disabled","false"),!this._disabled&&t._zoom!==t.getMinZoom()||(M(this._zoomOutButton,e),this._zoomOutButton.setAttribute("aria-disabled","true")),!this._disabled&&t._zoom!==t.getMaxZoom()||(M(this._zoomInButton,e),this._zoomInButton.setAttribute("aria-disabled","true"))}}),Ge=(A.mergeOptions({zoomControl:!0}),A.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new qe,this.addControl(this.zoomControl))}),B.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=P("div",e),n=this.options;return this._addScales(n,e+"-line",i),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=P("div",e,i)),t.imperial&&(this._iScale=P("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,t=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(t)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t);this._updateScale(this._mScale,e<1e3?e+" m":e/1e3+" km",e/t)},_updateImperial:function(t){var e,i,t=3.2808399*t;5280<t?(i=this._getRoundNum(e=t/5280),this._updateScale(this._iScale,i+" mi",i/e)):(i=this._getRoundNum(t),this._updateScale(this._iScale,i+" ft",i/t))},_updateScale:function(t,e,i){t.style.width=Math.round(this.options.maxWidth*i)+"px",t.innerHTML=e},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),t=t/e;return e*(t=10<=t?10:5<=t?5:3<=t?3:2<=t?2:1)}})),Ke=B.extend({options:{position:"bottomright",prefix:'<a href="https://leafletjs.com" title="A JavaScript library for interactive maps">'+(b.inlineSvg?'<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="12" height="8" viewBox="0 0 12 8" class="leaflet-attribution-flag"><path fill="#4C7BE1" d="M0 0h12v4H0z"/><path fill="#FFD500" d="M0 4h12v3H0z"/><path fill="#E0BC00" d="M0 7h12v1H0z"/></svg> ':"")+"Leaflet</a>"},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var e in(t.attributionControl=this)._container=P("div","leaflet-control-attribution"),Ie(this._container),t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),t.on("layeradd",this._addAttribution,this),this._container},onRemove:function(t){t.off("layeradd",this._addAttribution,this)},_addAttribution:function(t){t.layer.getAttribution&&(this.addAttribution(t.layer.getAttribution()),t.layer.once("remove",function(){this.removeAttribution(t.layer.getAttribution())},this))},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t,e=[];for(t in this._attributions)this._attributions[t]&&e.push(t);var i=[];this.options.prefix&&i.push(this.options.prefix),e.length&&i.push(e.join(", ")),this._container.innerHTML=i.join(' <span aria-hidden="true">|</span> ')}}}),n=(A.mergeOptions({attributionControl:!0}),A.addInitHook(function(){this.options.attributionControl&&(new Ke).addTo(this)}),B.Layers=Ve,B.Zoom=qe,B.Scale=Ge,B.Attribution=Ke,Ue.layers=function(t,e,i){return new Ve(t,e,i)},Ue.zoom=function(t){return new qe(t)},Ue.scale=function(t){return new Ge(t)},Ue.attribution=function(t){return new Ke(t)},et.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}})),ft=(n.addTo=function(t,e){return t.addHandler(e,this),this},{Events:e}),Ye=b.touch?"touchstart mousedown":"mousedown",Xe=it.extend({options:{clickTolerance:3},initialize:function(t,e,i,n){c(this,n),this._element=t,this._dragStartTarget=e||t,this._preventOutline=i},enable:function(){this._enabled||(S(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Xe._dragging===this&&this.finishDrag(!0),k(this._dragStartTarget,Ye,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var e,i;this._enabled&&(this._moved=!1,ve(this._element,"leaflet-zoom-anim")||(t.touches&&1!==t.touches.length?Xe._dragging===this&&this.finishDrag():Xe._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((Xe._dragging=this)._preventOutline&&Me(this._element),Le(),re(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=Ce(this._element),this._startPoint=new p(i.clientX,i.clientY),this._startPos=Pe(this._element),this._parentScale=Ze(e),i="mousedown"===t.type,S(document,i?"mousemove":"touchmove",this._onMove,this),S(document,i?"mouseup":"touchend touchcancel",this._onUp,this)))))},_onMove:function(t){var e;this._enabled&&(t.touches&&1<t.touches.length?this._moved=!0:!(e=new p((e=t.touches&&1===t.touches.length?t.touches[0]:t).clientX,e.clientY)._subtract(this._startPoint)).x&&!e.y||Math.abs(e.x)+Math.abs(e.y)<this.options.clickTolerance||(e.x/=this._parentScale.x,e.y/=this._parentScale.y,O(t),this._moved||(this.fire("dragstart"),this._moved=!0,M(document.body,"leaflet-dragging"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof window.SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),M(this._lastTarget,"leaflet-drag-target")),this._newPos=this._startPos.add(e),this._moving=!0,this._lastEvent=t,this._updatePosition()))},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire("predrag",t),Z(this._element,this._newPos),this.fire("drag",t)},_onUp:function(){this._enabled&&this.finishDrag()},finishDrag:function(t){z(document.body,"leaflet-dragging"),this._lastTarget&&(z(this._lastTarget,"leaflet-drag-target"),this._lastTarget=null),k(document,"mousemove touchmove",this._onMove,this),k(document,"mouseup touchend touchcancel",this._onUp,this),Te(),ae();var e=this._moved&&this._moving;this._moving=!1,Xe._dragging=!1,e&&this.fire("dragend",{noInertia:t,distance:this._newPos.distanceTo(this._startPos)})}});function Je(t,e,i){for(var n,o,s,r,a,h,l,u=[1,4,2,8],c=0,d=t.length;c<d;c++)t[c]._code=si(t[c],e);for(s=0;s<4;s++){for(h=u[s],n=[],c=0,o=(d=t.length)-1;c<d;o=c++)r=t[c],a=t[o],r._code&h?a._code&h||((l=oi(a,r,h,e,i))._code=si(l,e),n.push(l)):(a._code&h&&((l=oi(a,r,h,e,i))._code=si(l,e),n.push(l)),n.push(r));t=n}return t}function $e(t,e){var i,n,o,s,r,a,h;if(!t||0===t.length)throw new Error("latlngs not passed");I(t)||(console.warn("latlngs are not flat! Only the first ring will be used"),t=t[0]);for(var l=w([0,0]),u=g(t),c=(u.getNorthWest().distanceTo(u.getSouthWest())*u.getNorthEast().distanceTo(u.getNorthWest())<1700&&(l=Qe(t)),t.length),d=[],_=0;_<c;_++){var p=w(t[_]);d.push(e.project(w([p.lat-l.lat,p.lng-l.lng])))}for(_=r=a=h=0,i=c-1;_<c;i=_++)n=d[_],o=d[i],s=n.y*o.x-o.y*n.x,a+=(n.x+o.x)*s,h+=(n.y+o.y)*s,r+=3*s;u=0===r?d[0]:[a/r,h/r],u=e.unproject(m(u));return w([u.lat+l.lat,u.lng+l.lng])}function Qe(t){for(var e=0,i=0,n=0,o=0;o<t.length;o++){var s=w(t[o]);e+=s.lat,i+=s.lng,n++}return w([e/n,i/n])}var ti,gt={__proto__:null,clipPolygon:Je,polygonCenter:$e,centroid:Qe};function ei(t,e){if(e&&t.length){var i=t=function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;n<s;n++)(function(t,e){var i=e.x-t.x,e=e.y-t.y;return i*i+e*e})(t[n],t[o])>e&&(i.push(t[n]),o=n);o<s-1&&i.push(t[s-1]);return i}(t,e=e*e),n=i.length,o=new(typeof Uint8Array!=void 0+""?Uint8Array:Array)(n);o[0]=o[n-1]=1,function t(e,i,n,o,s){var r,a,h,l=0;for(a=o+1;a<=s-1;a++)h=ri(e[a],e[o],e[s],!0),l<h&&(r=a,l=h);n<l&&(i[r]=1,t(e,i,n,o,r),t(e,i,n,r,s))}(i,o,e,0,n-1);var s,r=[];for(s=0;s<n;s++)o[s]&&r.push(i[s]);return r}return t.slice()}function ii(t,e,i){return Math.sqrt(ri(t,e,i,!0))}function ni(t,e,i,n,o){var s,r,a,h=n?ti:si(t,i),l=si(e,i);for(ti=l;;){if(!(h|l))return[t,e];if(h&l)return!1;a=si(r=oi(t,e,s=h||l,i,o),i),s===h?(t=r,h=a):(e=r,l=a)}}function oi(t,e,i,n,o){var s,r,a=e.x-t.x,e=e.y-t.y,h=n.min,n=n.max;return 8&i?(s=t.x+a*(n.y-t.y)/e,r=n.y):4&i?(s=t.x+a*(h.y-t.y)/e,r=h.y):2&i?(s=n.x,r=t.y+e*(n.x-t.x)/a):1&i&&(s=h.x,r=t.y+e*(h.x-t.x)/a),new p(s,r,o)}function si(t,e){var i=0;return t.x<e.min.x?i|=1:t.x>e.max.x&&(i|=2),t.y<e.min.y?i|=4:t.y>e.max.y&&(i|=8),i}function ri(t,e,i,n){var o=e.x,e=e.y,s=i.x-o,r=i.y-e,a=s*s+r*r;return 0<a&&(1<(a=((t.x-o)*s+(t.y-e)*r)/a)?(o=i.x,e=i.y):0<a&&(o+=s*a,e+=r*a)),s=t.x-o,r=t.y-e,n?s*s+r*r:new p(o,e)}function I(t){return!d(t[0])||"object"!=typeof t[0][0]&&void 0!==t[0][0]}function ai(t){return console.warn("Deprecated use of _flat, please use L.LineUtil.isFlat instead."),I(t)}function hi(t,e){var i,n,o,s,r,a;if(!t||0===t.length)throw new Error("latlngs not passed");I(t)||(console.warn("latlngs are not flat! Only the first ring will be used"),t=t[0]);for(var h=w([0,0]),l=g(t),u=(l.getNorthWest().distanceTo(l.getSouthWest())*l.getNorthEast().distanceTo(l.getNorthWest())<1700&&(h=Qe(t)),t.length),c=[],d=0;d<u;d++){var _=w(t[d]);c.push(e.project(w([_.lat-h.lat,_.lng-h.lng])))}for(i=d=0;d<u-1;d++)i+=c[d].distanceTo(c[d+1])/2;if(0===i)a=c[0];else for(n=d=0;d<u-1;d++)if(o=c[d],s=c[d+1],i<(n+=r=o.distanceTo(s))){a=[s.x-(r=(n-i)/r)*(s.x-o.x),s.y-r*(s.y-o.y)];break}l=e.unproject(m(a));return w([l.lat+h.lat,l.lng+h.lng])}var vt={__proto__:null,simplify:ei,pointToSegmentDistance:ii,closestPointOnSegment:function(t,e,i){return ri(t,e,i)},clipSegment:ni,_getEdgeIntersection:oi,_getBitCode:si,_sqClosestPointOnSegment:ri,isFlat:I,_flat:ai,polylineCenter:hi},yt={project:function(t){return new p(t.lng,t.lat)},unproject:function(t){return new v(t.y,t.x)},bounds:new f([-180,-90],[180,90])},xt={R:6378137,R_MINOR:6356752.314245179,bounds:new f([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var e=Math.PI/180,i=this.R,n=t.lat*e,o=this.R_MINOR/i,o=Math.sqrt(1-o*o),s=o*Math.sin(n),s=Math.tan(Math.PI/4-n/2)/Math.pow((1-s)/(1+s),o/2),n=-i*Math.log(Math.max(s,1e-10));return new p(t.lng*e*i,n)},unproject:function(t){for(var e,i=180/Math.PI,n=this.R,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/n),a=Math.PI/2-2*Math.atan(r),h=0,l=.1;h<15&&1e-7<Math.abs(l);h++)e=s*Math.sin(a),e=Math.pow((1-e)/(1+e),s/2),a+=l=Math.PI/2-2*Math.atan(r*e)-a;return new v(a*i,t.x*i/n)}},wt={__proto__:null,LonLat:yt,Mercator:xt,SphericalMercator:rt},Pt=l({},st,{code:"EPSG:3395",projection:xt,transformation:ht(bt=.5/(Math.PI*xt.R),.5,-bt,.5)}),li=l({},st,{code:"EPSG:4326",projection:yt,transformation:ht(1/180,1,-1/180,.5)}),Lt=l({},ot,{projection:yt,transformation:ht(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,e){var i=e.lng-t.lng,e=e.lat-t.lat;return Math.sqrt(i*i+e*e)},infinite:!0}),o=(ot.Earth=st,ot.EPSG3395=Pt,ot.EPSG3857=lt,ot.EPSG900913=ut,ot.EPSG4326=li,ot.Simple=Lt,it.extend({options:{pane:"overlayPane",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[h(t)]=this},removeInteractiveTarget:function(t){return delete this._map._targets[h(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var e,i=t.target;i.hasLayer(this)&&(this._map=i,this._zoomAnimated=i._zoomAnimated,this.getEvents&&(e=this.getEvents(),i.on(e,this),this.once("remove",function(){i.off(e,this)},this)),this.onAdd(i),this.fire("add"),i.fire("layeradd",{layer:this}))}})),ui=(A.include({addLayer:function(t){var e;if(t._layerAdd)return e=h(t),this._layers[e]||((this._layers[e]=t)._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t)),this;throw new Error("The provided object is not a Layer.")},removeLayer:function(t){var e=h(t);return this._layers[e]&&(this._loaded&&t.onRemove(this),delete this._layers[e],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null),this},hasLayer:function(t){return h(t)in this._layers},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},_addLayers:function(t){for(var e=0,i=(t=t?d(t)?t:[t]:[]).length;e<i;e++)this.addLayer(t[e])},_addZoomLimit:function(t){isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[h(t)]=t,this._updateZoomLevels())},_removeZoomLimit:function(t){t=h(t);this._zoomBoundLayers[t]&&(delete this._zoomBoundLayers[t],this._updateZoomLevels())},_updateZoomLevels:function(){var t,e=1/0,i=-1/0,n=this._getZoomSpan();for(t in this._zoomBoundLayers)var o=this._zoomBoundLayers[t].options,e=void 0===o.minZoom?e:Math.min(e,o.minZoom),i=void 0===o.maxZoom?i:Math.max(i,o.maxZoom);this._layersMaxZoom=i===-1/0?void 0:i,this._layersMinZoom=e===1/0?void 0:e,n!==this._getZoomSpan()&&this.fire("zoomlevelschange"),void 0===this.options.maxZoom&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom&&this.setZoom(this._layersMinZoom)}}),o.extend({initialize:function(t,e){var i,n;if(c(this,e),this._layers={},t)for(i=0,n=t.length;i<n;i++)this.addLayer(t[i])},addLayer:function(t){var e=this.getLayerId(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){t=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[t]&&this._map.removeLayer(this._layers[t]),delete this._layers[t],this},hasLayer:function(t){return("number"==typeof t?t:this.getLayerId(t))in this._layers},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)(i=this._layers[e])[t]&&i[t].apply(i,n);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke("setZIndex",t)},getLayerId:h})),ci=ui.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),ui.prototype.addLayer.call(this,t),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?((t=t in this._layers?this._layers[t]:t).removeEventParent(this),ui.prototype.removeLayer.call(this,t),this.fire("layerremove",{layer:t})):this},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t,e=new s;for(t in this._layers){var i=this._layers[t];e.extend(i.getBounds?i.getBounds():i.getLatLng())}return e}}),di=et.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0],crossOrigin:!1},initialize:function(t){c(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(i)return i=this._createImg(i,e&&"IMG"===e.tagName?e:null),this._setIconStyles(i,t),!this.options.crossOrigin&&""!==this.options.crossOrigin||(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),i;if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null},_setIconStyles:function(t,e){var i=this.options,n=i[e+"Size"],n=m(n="number"==typeof n?[n,n]:n),o=m("shadow"===e&&i.shadowAnchor||i.iconAnchor||n&&n.divideBy(2,!0));t.className="leaflet-marker-"+e+" "+(i.className||""),o&&(t.style.marginLeft=-o.x+"px",t.style.marginTop=-o.y+"px"),n&&(t.style.width=n.x+"px",t.style.height=n.y+"px")},_createImg:function(t,e){return(e=e||document.createElement("img")).src=t,e},_getIconUrl:function(t){return b.retina&&this.options[t+"RetinaUrl"]||this.options[t+"Url"]}});var _i=di.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return"string"!=typeof _i.imagePath&&(_i.imagePath=this._detectIconPath()),(this.options.imagePath||_i.imagePath)+di.prototype._getIconUrl.call(this,t)},_stripUrl:function(t){function e(t,e,i){return(e=e.exec(t))&&e[i]}return(t=e(t,/^url\((['"])?(.+)\1\)$/,2))&&e(t,/^(.*)marker-icon\.png$/,1)},_detectIconPath:function(){var t=P("div","leaflet-default-icon-path",document.body),e=pe(t,"background-image")||pe(t,"backgroundImage");return document.body.removeChild(t),(e=this._stripUrl(e))?e:(t=document.querySelector('link[href$="leaflet.css"]'))?t.href.substring(0,t.href.length-"leaflet.css".length-1):""}}),pi=n.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new Xe(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),M(t,"leaflet-marker-draggable")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&z(this._marker._icon,"leaflet-marker-draggable")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var e=this._marker,i=e._map,n=this._marker.options.autoPanSpeed,o=this._marker.options.autoPanPadding,s=Pe(e._icon),r=i.getPixelBounds(),a=i.getPixelOrigin(),a=_(r.min._subtract(a).add(o),r.max._subtract(a).subtract(o));a.contains(s)||(o=m((Math.max(a.max.x,s.x)-a.max.x)/(r.max.x-a.max.x)-(Math.min(a.min.x,s.x)-a.min.x)/(r.min.x-a.min.x),(Math.max(a.max.y,s.y)-a.max.y)/(r.max.y-a.max.y)-(Math.min(a.min.y,s.y)-a.min.y)/(r.min.y-a.min.y)).multiplyBy(n),i.panBy(o,{animate:!1}),this._draggable._newPos._add(o),this._draggable._startPos._add(o),Z(e._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=x(this._adjustPan.bind(this,t)))},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup&&this._marker.closePopup(),this._marker.fire("movestart").fire("dragstart")},_onPreDrag:function(t){this._marker.options.autoPan&&(r(this._panRequest),this._panRequest=x(this._adjustPan.bind(this,t)))},_onDrag:function(t){var e=this._marker,i=e._shadow,n=Pe(e._icon),o=e._map.layerPointToLatLng(n);i&&Z(i,n),e._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,e.fire("move",t).fire("drag",t)},_onDragEnd:function(t){r(this._panRequest),delete this._oldLatLng,this._marker.fire("moveend").fire("dragend",t)}}),mi=o.extend({options:{icon:new _i,interactive:!0,keyboard:!0,title:"",alt:"Marker",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:"markerPane",shadowPane:"shadowPane",bubblingMouseEvents:!1,autoPanOnFocus:!0,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10},initialize:function(t,e){c(this,e),this._latlng=w(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on("zoomanim",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off("zoomanim",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var e=this._latlng;return this._latlng=w(t),this.update(),this.fire("move",{oldLatLng:e,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},getIcon:function(){return this.options.icon},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){var t;return this._icon&&this._map&&(t=this._map.latLngToLayerPoint(this._latlng).round(),this._setPos(t)),this},_initIcon:function(){var t=this.options,e="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"),i=t.icon.createIcon(this._icon),n=!1,i=(i!==this._icon&&(this._icon&&this._removeIcon(),n=!0,t.title&&(i.title=t.title),"IMG"===i.tagName&&(i.alt=t.alt||"")),M(i,e),t.keyboard&&(i.tabIndex="0",i.setAttribute("role","button")),this._icon=i,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex}),this.options.autoPanOnFocus&&S(i,"focus",this._panOnFocus,this),t.icon.createShadow(this._shadow)),o=!1;i!==this._shadow&&(this._removeShadow(),o=!0),i&&(M(i,e),i.alt=""),this._shadow=i,t.opacity<1&&this._updateOpacity(),n&&this.getPane().appendChild(this._icon),this._initInteraction(),i&&o&&this.getPane(t.shadowPane).appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),this.options.autoPanOnFocus&&k(this._icon,"focus",this._panOnFocus,this),T(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&T(this._shadow),this._shadow=null},_setPos:function(t){this._icon&&Z(this._icon,t),this._shadow&&Z(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon&&(this._icon.style.zIndex=this._zIndex+t)},_animateZoom:function(t){t=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(t)},_initInteraction:function(){var t;this.options.interactive&&(M(this._icon,"leaflet-interactive"),this.addInteractiveTarget(this._icon),pi&&(t=this.options.draggable,this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new pi(this),t&&this.dragging.enable()))},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;this._icon&&C(this._icon,t),this._shadow&&C(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_panOnFocus:function(){var t,e,i=this._map;i&&(t=(e=this.options.icon.options).iconSize?m(e.iconSize):m(0,0),e=e.iconAnchor?m(e.iconAnchor):m(0,0),i.panInside(this._latlng,{paddingTopLeft:e,paddingBottomRight:t.subtract(e)}))},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}});var fi=o.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:"evenodd",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return c(this,t),this._renderer&&(this._renderer._updateStyle(this),this.options.stroke&&t&&Object.prototype.hasOwnProperty.call(t,"weight")&&this._updateBounds()),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+(this._renderer.options.tolerance||0)}}),gi=fi.extend({options:{fill:!0,radius:10},initialize:function(t,e){c(this,e),this._latlng=w(t),this._radius=this.options.radius},setLatLng:function(t){var e=this._latlng;return this._latlng=w(t),this.redraw(),this.fire("move",{oldLatLng:e,latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var e=t&&t.radius||this._radius;return fi.prototype.setStyle.call(this,t),this.setRadius(e),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,e=this._radiusY||t,i=this._clickTolerance(),t=[t+i,e+i];this._pxBounds=new f(this._point.subtract(t),this._point.add(t))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()}});var vi=gi.extend({initialize:function(t,e,i){if(c(this,e="number"==typeof e?l({},i,{radius:e}):e),this._latlng=w(t),isNaN(this.options.radius))throw new Error("Circle radius cannot be NaN");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new s(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:fi.prototype.setStyle,_project:function(){var t,e,i,n,o,s=this._latlng.lng,r=this._latlng.lat,a=this._map,h=a.options.crs;h.distance===st.distance?(n=Math.PI/180,o=this._mRadius/st.R/n,t=a.project([r+o,s]),e=a.project([r-o,s]),e=t.add(e).divideBy(2),i=a.unproject(e).lat,n=Math.acos((Math.cos(o*n)-Math.sin(r*n)*Math.sin(i*n))/(Math.cos(r*n)*Math.cos(i*n)))/n,!isNaN(n)&&0!==n||(n=o/Math.cos(Math.PI/180*r)),this._point=e.subtract(a.getPixelOrigin()),this._radius=isNaN(n)?0:e.x-a.project([i,s-n]).x,this._radiusY=e.y-t.y):(o=h.unproject(h.project(this._latlng).subtract([this._mRadius,0])),this._point=a.latLngToLayerPoint(this._latlng),this._radius=this._point.x-a.latLngToLayerPoint(o).x),this._updateBounds()}});var yi=fi.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,e){c(this,e),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var e=1/0,i=null,n=ri,o=0,s=this._parts.length;o<s;o++)for(var r=this._parts[o],a=1,h=r.length;a<h;a++){var l,u,c=n(t,l=r[a-1],u=r[a],!0);c<e&&(e=c,i=n(t,l,u))}return i&&(i.distance=Math.sqrt(e)),i},getCenter:function(){if(this._map)return hi(this._defaultShape(),this._map.options.crs);throw new Error("Must add layer to map before using getCenter()")},getBounds:function(){return this._bounds},addLatLng:function(t,e){return e=e||this._defaultShape(),t=w(t),e.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new s,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return I(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var e=[],i=I(t),n=0,o=t.length;n<o;n++)i?(e[n]=w(t[n]),this._bounds.extend(e[n])):e[n]=this._convertLatLngs(t[n]);return e},_project:function(){var t=new f;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t),this._bounds.isValid()&&t.isValid()&&(this._rawPxBounds=t,this._updateBounds())},_updateBounds:function(){var t=this._clickTolerance(),t=new p(t,t);this._rawPxBounds&&(this._pxBounds=new f([this._rawPxBounds.min.subtract(t),this._rawPxBounds.max.add(t)]))},_projectLatlngs:function(t,e,i){var n,o,s=t[0]instanceof v,r=t.length;if(s){for(o=[],n=0;n<r;n++)o[n]=this._map.latLngToLayerPoint(t[n]),i.extend(o[n]);e.push(o)}else for(n=0;n<r;n++)this._projectLatlngs(t[n],e,i)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var e,i,n,o,s=this._parts,r=0,a=0,h=this._rings.length;r<h;r++)for(e=0,i=(o=this._rings[r]).length;e<i-1;e++)(n=ni(o[e],o[e+1],t,e,!0))&&(s[a]=s[a]||[],s[a].push(n[0]),n[1]===o[e+1]&&e!==i-2||(s[a].push(n[1]),a++))},_simplifyPoints:function(){for(var t=this._parts,e=this.options.smoothFactor,i=0,n=t.length;i<n;i++)t[i]=ei(t[i],e)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,e){var i,n,o,s,r,a,h=this._clickTolerance();if(this._pxBounds&&this._pxBounds.contains(t))for(i=0,s=this._parts.length;i<s;i++)for(n=0,o=(r=(a=this._parts[i]).length)-1;n<r;o=n++)if((e||0!==n)&&ii(t,a[o],a[n])<=h)return!0;return!1}});yi._flat=ai;var xi=yi.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(this._map)return $e(this._defaultShape(),this._map.options.crs);throw new Error("Must add layer to map before using getCenter()")},_convertLatLngs:function(t){var t=yi.prototype._convertLatLngs.call(this,t),e=t.length;return 2<=e&&t[0]instanceof v&&t[0].equals(t[e-1])&&t.pop(),t},_setLatLngs:function(t){yi.prototype._setLatLngs.call(this,t),I(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return(I(this._latlngs[0])?this._latlngs:this._latlngs[0])[0]},_clipPoints:function(){var t=this._renderer._bounds,e=this.options.weight,e=new p(e,e),t=new f(t.min.subtract(e),t.max.add(e));if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var i,n=0,o=this._rings.length;n<o;n++)(i=Je(this._rings[n],t,!0)).length&&this._parts.push(i)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var e,i,n,o,s,r,a,h,l=!1;if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o<a;o++)for(s=0,r=(h=(e=this._parts[o]).length)-1;s<h;r=s++)i=e[s],n=e[r],i.y>t.y!=n.y>t.y&&t.x<(n.x-i.x)*(t.y-i.y)/(n.y-i.y)+i.x&&(l=!l);return l||yi.prototype._containsPoint.call(this,t,!0)}});var wi=ci.extend({initialize:function(t,e){c(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,n,o=d(t)?t:t.features;if(o){for(e=0,i=o.length;e<i;e++)((n=o[e]).geometries||n.geometry||n.features||n.coordinates)&&this.addData(n);return this}var s,r=this.options;return(!r.filter||r.filter(t))&&(s=bi(t,r))?(s.feature=Zi(t),s.defaultOptions=s.options,this.resetStyle(s),r.onEachFeature&&r.onEachFeature(t,s),this.addLayer(s)):this},resetStyle:function(t){return void 0===t?this.eachLayer(this.resetStyle,this):(t.options=l({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this)},setStyle:function(e){return this.eachLayer(function(t){this._setLayerStyle(t,e)},this)},_setLayerStyle:function(t,e){t.setStyle&&("function"==typeof e&&(e=e(t.feature)),t.setStyle(e))}});function bi(t,e){var i,n,o,s,r="Feature"===t.type?t.geometry:t,a=r?r.coordinates:null,h=[],l=e&&e.pointToLayer,u=e&&e.coordsToLatLng||Li;if(!a&&!r)return null;switch(r.type){case"Point":return Pi(l,t,i=u(a),e);case"MultiPoint":for(o=0,s=a.length;o<s;o++)i=u(a[o]),h.push(Pi(l,t,i,e));return new ci(h);case"LineString":case"MultiLineString":return n=Ti(a,"LineString"===r.type?0:1,u),new yi(n,e);case"Polygon":case"MultiPolygon":return n=Ti(a,"Polygon"===r.type?1:2,u),new xi(n,e);case"GeometryCollection":for(o=0,s=r.geometries.length;o<s;o++){var c=bi({geometry:r.geometries[o],type:"Feature",properties:t.properties},e);c&&h.push(c)}return new ci(h);case"FeatureCollection":for(o=0,s=r.features.length;o<s;o++){var d=bi(r.features[o],e);d&&h.push(d)}return new ci(h);default:throw new Error("Invalid GeoJSON object.")}}function Pi(t,e,i,n){return t?t(e,i):new mi(i,n&&n.markersInheritOptions&&n)}function Li(t){return new v(t[1],t[0],t[2])}function Ti(t,e,i){for(var n,o=[],s=0,r=t.length;s<r;s++)n=e?Ti(t[s],e-1,i):(i||Li)(t[s]),o.push(n);return o}function Mi(t,e){return void 0!==(t=w(t)).alt?[i(t.lng,e),i(t.lat,e),i(t.alt,e)]:[i(t.lng,e),i(t.lat,e)]}function zi(t,e,i,n){for(var o=[],s=0,r=t.length;s<r;s++)o.push(e?zi(t[s],I(t[s])?0:e-1,i,n):Mi(t[s],n));return!e&&i&&0<o.length&&o.push(o[0].slice()),o}function Ci(t,e){return t.feature?l({},t.feature,{geometry:e}):Zi(e)}function Zi(t){return"Feature"===t.type||"FeatureCollection"===t.type?t:{type:"Feature",properties:{},geometry:t}}Tt={toGeoJSON:function(t){return Ci(this,{type:"Point",coordinates:Mi(this.getLatLng(),t)})}};function Si(t,e){return new wi(t,e)}mi.include(Tt),vi.include(Tt),gi.include(Tt),yi.include({toGeoJSON:function(t){var e=!I(this._latlngs);return Ci(this,{type:(e?"Multi":"")+"LineString",coordinates:zi(this._latlngs,e?1:0,!1,t)})}}),xi.include({toGeoJSON:function(t){var e=!I(this._latlngs),i=e&&!I(this._latlngs[0]),t=zi(this._latlngs,i?2:e?1:0,!0,t);return Ci(this,{type:(i?"Multi":"")+"Polygon",coordinates:t=e?t:[t]})}}),ui.include({toMultiPoint:function(e){var i=[];return this.eachLayer(function(t){i.push(t.toGeoJSON(e).geometry.coordinates)}),Ci(this,{type:"MultiPoint",coordinates:i})},toGeoJSON:function(e){var i,n,t=this.feature&&this.feature.geometry&&this.feature.geometry.type;return"MultiPoint"===t?this.toMultiPoint(e):(i="GeometryCollection"===t,n=[],this.eachLayer(function(t){t.toGeoJSON&&(t=t.toGeoJSON(e),i?n.push(t.geometry):"FeatureCollection"===(t=Zi(t)).type?n.push.apply(n,t.features):n.push(t))}),i?Ci(this,{geometries:n,type:"GeometryCollection"}):{type:"FeatureCollection",features:n})}});var Mt=Si,Ei=o.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1,errorOverlayUrl:"",zIndex:1,className:""},initialize:function(t,e,i){this._url=t,this._bounds=g(e),c(this,i)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(M(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){T(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&fe(this._image),this},bringToBack:function(){return this._map&&ge(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=g(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t="IMG"===this._url.tagName,e=this._image=t?this._url:P("img");M(e,"leaflet-image-layer"),this._zoomAnimated&&M(e,"leaflet-zoom-animated"),this.options.className&&M(e,this.options.className),e.onselectstart=u,e.onmousemove=u,e.onload=a(this.fire,this,"load"),e.onerror=a(this._overlayOnError,this,"error"),!this.options.crossOrigin&&""!==this.options.crossOrigin||(e.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),this.options.zIndex&&this._updateZIndex(),t?this._url=e.src:(e.src=this._url,e.alt=this.options.alt)},_animateZoom:function(t){var e=this._map.getZoomScale(t.zoom),t=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;be(this._image,t,e)},_reset:function(){var t=this._image,e=new f(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),i=e.getSize();Z(t,e.min),t.style.width=i.x+"px",t.style.height=i.y+"px"},_updateOpacity:function(){C(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire("error");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)},getCenter:function(){return this._bounds.getCenter()}}),ki=Ei.extend({options:{autoplay:!0,loop:!0,keepAspectRatio:!0,muted:!1,playsInline:!0},_initImage:function(){var t="VIDEO"===this._url.tagName,e=this._image=t?this._url:P("video");if(M(e,"leaflet-image-layer"),this._zoomAnimated&&M(e,"leaflet-zoom-animated"),this.options.className&&M(e,this.options.className),e.onselectstart=u,e.onmousemove=u,e.onloadeddata=a(this.fire,this,"load"),t){for(var i=e.getElementsByTagName("source"),n=[],o=0;o<i.length;o++)n.push(i[o].src);this._url=0<i.length?n:[e.src]}else{d(this._url)||(this._url=[this._url]),!this.options.keepAspectRatio&&Object.prototype.hasOwnProperty.call(e.style,"objectFit")&&(e.style.objectFit="fill"),e.autoplay=!!this.options.autoplay,e.loop=!!this.options.loop,e.muted=!!this.options.muted,e.playsInline=!!this.options.playsInline;for(var s=0;s<this._url.length;s++){var r=P("source");r.src=this._url[s],e.appendChild(r)}}}});var Oi=Ei.extend({_initImage:function(){var t=this._image=this._url;M(t,"leaflet-image-layer"),this._zoomAnimated&&M(t,"leaflet-zoom-animated"),this.options.className&&M(t,this.options.className),t.onselectstart=u,t.onmousemove=u}});var Ai=o.extend({options:{interactive:!1,offset:[0,0],className:"",pane:void 0,content:""},initialize:function(t,e){t&&(t instanceof v||d(t))?(this._latlng=w(t),c(this,e)):(c(this,t),this._source=e),this.options.content&&(this._content=this.options.content)},openOn:function(t){return(t=arguments.length?t:this._source._map).hasLayer(this)||t.addLayer(this),this},close:function(){return this._map&&this._map.removeLayer(this),this},toggle:function(t){return this._map?this.close():(arguments.length?this._source=t:t=this._source,this._prepareOpen(),this.openOn(t._map)),this},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&C(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&C(this._container,1),this.bringToFront(),this.options.interactive&&(M(this._container,"leaflet-interactive"),this.addInteractiveTarget(this._container))},onRemove:function(t){t._fadeAnimated?(C(this._container,0),this._removeTimeout=setTimeout(a(T,void 0,this._container),200)):T(this._container),this.options.interactive&&(z(this._container,"leaflet-interactive"),this.removeInteractiveTarget(this._container))},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=w(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&fe(this._container),this},bringToBack:function(){return this._map&&ge(this._container),this},_prepareOpen:function(t){if(!(i=this._source)._map)return!1;if(i instanceof ci){var e,i=null,n=this._source._layers;for(e in n)if(n[e]._map){i=n[e];break}if(!i)return!1;this._source=i}if(!t)if(i.getCenter)t=i.getCenter();else if(i.getLatLng)t=i.getLatLng();else{if(!i.getBounds)throw new Error("Unable to get source layer LatLng.");t=i.getBounds().getCenter()}return this.setLatLng(t),this._map&&this.update(),!0},_updateContent:function(){if(this._content){var t=this._contentNode,e="function"==typeof this._content?this._content(this._source||this):this._content;if("string"==typeof e)t.innerHTML=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(e)}this.fire("contentupdate")}},_updatePosition:function(){var t,e,i;this._map&&(e=this._map.latLngToLayerPoint(this._latlng),t=m(this.options.offset),i=this._getAnchor(),this._zoomAnimated?Z(this._container,e.add(i)):t=t.add(e).add(i),e=this._containerBottom=-t.y,i=this._containerLeft=-Math.round(this._containerWidth/2)+t.x,this._container.style.bottom=e+"px",this._container.style.left=i+"px")},_getAnchor:function(){return[0,0]}}),Bi=(A.include({_initOverlay:function(t,e,i,n){var o=e;return o instanceof t||(o=new t(n).setContent(e)),i&&o.setLatLng(i),o}}),o.include({_initOverlay:function(t,e,i,n){var o=i;return o instanceof t?(c(o,n),o._source=this):(o=e&&!n?e:new t(n,this)).setContent(i),o}}),Ai.extend({options:{pane:"popupPane",offset:[0,7],maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:""},openOn:function(t){return!(t=arguments.length?t:this._source._map).hasLayer(this)&&t._popup&&t._popup.options.autoClose&&t.removeLayer(t._popup),t._popup=this,Ai.prototype.openOn.call(this,t)},onAdd:function(t){Ai.prototype.onAdd.call(this,t),t.fire("popupopen",{popup:this}),this._source&&(this._source.fire("popupopen",{popup:this},!0),this._source instanceof fi||this._source.on("preclick",Ae))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("popupclose",{popup:this}),this._source&&(this._source.fire("popupclose",{popup:this},!0),this._source instanceof fi||this._source.off("preclick",Ae))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this.close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_initLayout:function(){var t="leaflet-popup",e=this._container=P("div",t+" "+(this.options.className||"")+" leaflet-zoom-animated"),i=this._wrapper=P("div",t+"-content-wrapper",e);this._contentNode=P("div",t+"-content",i),Ie(e),Be(this._contentNode),S(e,"contextmenu",Ae),this._tipContainer=P("div",t+"-tip-container",e),this._tip=P("div",t+"-tip",this._tipContainer),this.options.closeButton&&((i=this._closeButton=P("a",t+"-close-button",e)).setAttribute("role","button"),i.setAttribute("aria-label","Close popup"),i.href="#close",i.innerHTML='<span aria-hidden="true">&#215;</span>',S(i,"click",function(t){O(t),this.close()},this))},_updateLayout:function(){var t=this._contentNode,e=t.style,i=(e.width="",e.whiteSpace="nowrap",t.offsetWidth),i=Math.min(i,this.options.maxWidth),i=(i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="",t.offsetHeight),n=this.options.maxHeight,o="leaflet-popup-scrolled";(n&&n<i?(e.height=n+"px",M):z)(t,o),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var t=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),e=this._getAnchor();Z(this._container,t.add(e))},_adjustPan:function(){var t,e,i,n,o,s,r,a;this.options.autoPan&&(this._map._panAnim&&this._map._panAnim.stop(),this._autopanning?this._autopanning=!1:(t=this._map,e=parseInt(pe(this._container,"marginBottom"),10)||0,e=this._container.offsetHeight+e,a=this._containerWidth,(i=new p(this._containerLeft,-e-this._containerBottom))._add(Pe(this._container)),i=t.layerPointToContainerPoint(i),o=m(this.options.autoPanPadding),n=m(this.options.autoPanPaddingTopLeft||o),o=m(this.options.autoPanPaddingBottomRight||o),s=t.getSize(),r=0,i.x+a+o.x>s.x&&(r=i.x+a-s.x+o.x),i.x-r-n.x<(a=0)&&(r=i.x-n.x),i.y+e+o.y>s.y&&(a=i.y+e-s.y+o.y),i.y-a-n.y<0&&(a=i.y-n.y),(r||a)&&(this.options.keepInView&&(this._autopanning=!0),t.fire("autopanstart").panBy([r,a]))))},_getAnchor:function(){return m(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}})),Ii=(A.mergeOptions({closePopupOnClick:!0}),A.include({openPopup:function(t,e,i){return this._initOverlay(Bi,t,e,i).openOn(this),this},closePopup:function(t){return(t=arguments.length?t:this._popup)&&t.close(),this}}),o.include({bindPopup:function(t,e){return this._popup=this._initOverlay(Bi,this._popup,t,e),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t){return this._popup&&(this instanceof ci||(this._popup._source=this),this._popup._prepareOpen(t||this._latlng)&&this._popup.openOn(this._map)),this},closePopup:function(){return this._popup&&this._popup.close(),this},togglePopup:function(){return this._popup&&this._popup.toggle(this),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e;this._popup&&this._map&&(Re(t),e=t.layer||t.target,this._popup._source!==e||e instanceof fi?(this._popup._source=e,this.openPopup(t.latlng)):this._map.hasLayer(this._popup)?this.closePopup():this.openPopup(t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}}),Ai.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,opacity:.9},onAdd:function(t){Ai.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&(this.addEventParent(this._source),this._source.fire("tooltipopen",{tooltip:this},!0))},onRemove:function(t){Ai.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&(this.removeEventParent(this._source),this._source.fire("tooltipclose",{tooltip:this},!0))},getEvents:function(){var t=Ai.prototype.getEvents.call(this);return this.options.permanent||(t.preclick=this.close),t},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=P("div",t),this._container.setAttribute("role","tooltip"),this._container.setAttribute("id","leaflet-tooltip-"+h(this))},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e,i=this._map,n=this._container,o=i.latLngToContainerPoint(i.getCenter()),i=i.layerPointToContainerPoint(t),s=this.options.direction,r=n.offsetWidth,a=n.offsetHeight,h=m(this.options.offset),l=this._getAnchor(),i="top"===s?(e=r/2,a):"bottom"===s?(e=r/2,0):(e="center"===s?r/2:"right"===s?0:"left"===s?r:i.x<o.x?(s="right",0):(s="left",r+2*(h.x+l.x)),a/2);t=t.subtract(m(e,i,!0)).add(h).add(l),z(n,"leaflet-tooltip-right"),z(n,"leaflet-tooltip-left"),z(n,"leaflet-tooltip-top"),z(n,"leaflet-tooltip-bottom"),M(n,"leaflet-tooltip-"+s),Z(n,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&C(this._container,t)},_animateZoom:function(t){t=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(t)},_getAnchor:function(){return m(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}})),Ri=(A.include({openTooltip:function(t,e,i){return this._initOverlay(Ii,t,e,i).openOn(this),this},closeTooltip:function(t){return t.close(),this}}),o.include({bindTooltip:function(t,e){return this._tooltip&&this.isTooltipOpen()&&this.unbindTooltip(),this._tooltip=this._initOverlay(Ii,this._tooltip,t,e),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){var e,i;!t&&this._tooltipHandlersAdded||(e=t?"off":"on",i={remove:this.closeTooltip,move:this._moveTooltip},this._tooltip.options.permanent?i.add=this._openTooltip:(i.mouseover=this._openTooltip,i.mouseout=this.closeTooltip,i.click=this._openTooltip,this._map?this._addFocusListeners():i.add=this._addFocusListeners),this._tooltip.options.sticky&&(i.mousemove=this._moveTooltip),this[e](i),this._tooltipHandlersAdded=!t)},openTooltip:function(t){return this._tooltip&&(this instanceof ci||(this._tooltip._source=this),this._tooltip._prepareOpen(t)&&(this._tooltip.openOn(this._map),this.getElement?this._setAriaDescribedByOnLayer(this):this.eachLayer&&this.eachLayer(this._setAriaDescribedByOnLayer,this))),this},closeTooltip:function(){if(this._tooltip)return this._tooltip.close()},toggleTooltip:function(){return this._tooltip&&this._tooltip.toggle(this),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_addFocusListeners:function(){this.getElement?this._addFocusListenersOnLayer(this):this.eachLayer&&this.eachLayer(this._addFocusListenersOnLayer,this)},_addFocusListenersOnLayer:function(t){var e="function"==typeof t.getElement&&t.getElement();e&&(S(e,"focus",function(){this._tooltip._source=t,this.openTooltip()},this),S(e,"blur",this.closeTooltip,this))},_setAriaDescribedByOnLayer:function(t){t="function"==typeof t.getElement&&t.getElement();t&&t.setAttribute("aria-describedby",this._tooltip._container.id)},_openTooltip:function(t){var e;this._tooltip&&this._map&&(this._map.dragging&&this._map.dragging.moving()&&!this._openOnceFlag?(this._openOnceFlag=!0,(e=this)._map.once("moveend",function(){e._openOnceFlag=!1,e._openTooltip(t)})):(this._tooltip._source=t.layer||t.target,this.openTooltip(this._tooltip.options.sticky?t.latlng:void 0)))},_moveTooltip:function(t){var e=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(t=this._map.mouseEventToContainerPoint(t.originalEvent),t=this._map.containerPointToLayerPoint(t),e=this._map.layerPointToLatLng(t)),this._tooltip.setLatLng(e)}}),di.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:"leaflet-div-icon"},createIcon:function(t){var t=t&&"DIV"===t.tagName?t:document.createElement("div"),e=this.options;return e.html instanceof Element?(me(t),t.appendChild(e.html)):t.innerHTML=!1!==e.html?e.html:"",e.bgPos&&(e=m(e.bgPos),t.style.backgroundPosition=-e.x+"px "+-e.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}));di.Default=_i;var Ni=o.extend({options:{tileSize:256,opacity:1,updateWhenIdle:b.mobile,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:"tilePane",className:"",keepBuffer:2},initialize:function(t){c(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),T(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(fe(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(ge(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){var t;return this._map&&(this._removeAllTiles(),(t=this._clampZoom(this._map.getZoom()))!==this._tileZoom&&(this._tileZoom=t,this._updateLevels()),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=j(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement("div")},getTileSize:function(){var t=this.options.tileSize;return t instanceof p?t:new p(t,t)},_updateZIndex:function(){this._container&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var e,i=this.getPane().children,n=-t(-1/0,1/0),o=0,s=i.length;o<s;o++)e=i[o].style.zIndex,i[o]!==this._container&&e&&(n=t(n,+e));isFinite(n)&&(this.options.zIndex=n+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!b.ielt9){C(this._container,this.options.opacity);var t,e=+new Date,i=!1,n=!1;for(t in this._tiles){var o,s=this._tiles[t];s.current&&s.loaded&&(o=Math.min(1,(e-s.loaded)/200),C(s.el,o),o<1?i=!0:(s.active?n=!0:this._onOpaqueTile(s),s.active=!0))}n&&!this._noPrune&&this._pruneTiles(),i&&(r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this))}},_onOpaqueTile:u,_initContainer:function(){this._container||(this._container=P("div","leaflet-layer "+(this.options.className||"")),this._updateZIndex(),this.options.opacity<1&&this._updateOpacity(),this.getPane().appendChild(this._container))},_updateLevels:function(){var t=this._tileZoom,e=this.options.maxZoom;if(void 0!==t){for(var i in this._levels)i=Number(i),this._levels[i].el.children.length||i===t?(this._levels[i].el.style.zIndex=e-Math.abs(t-i),this._onUpdateLevel(i)):(T(this._levels[i].el),this._removeTilesAtZoom(i),this._onRemoveLevel(i),delete this._levels[i]);var n=this._levels[t],o=this._map;return n||((n=this._levels[t]={}).el=P("div","leaflet-tile-container leaflet-zoom-animated",this._container),n.el.style.zIndex=e,n.origin=o.project(o.unproject(o.getPixelOrigin()),t).round(),n.zoom=t,this._setZoomTransform(n,o.getCenter(),o.getZoom()),u(n.el.offsetWidth),this._onCreateLevel(n)),this._level=n}},_onUpdateLevel:u,_onRemoveLevel:u,_onCreateLevel:u,_pruneTiles:function(){if(this._map){var t,e,i,n=this._map.getZoom();if(n>this.options.maxZoom||n<this.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(i=this._tiles[t]).retain=i.current;for(t in this._tiles)(i=this._tiles[t]).current&&!i.active&&(e=i.coords,this._retainParent(e.x,e.y,e.z,e.z-5)||this._retainChildren(e.x,e.y,e.z,e.z+2));for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var e in this._tiles)this._tiles[e].coords.z===t&&this._removeTile(e)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)T(this._levels[t].el),this._onRemoveLevel(Number(t)),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,e,i,n){var t=Math.floor(t/2),e=Math.floor(e/2),i=i-1,o=new p(+t,+e),o=(o.z=i,this._tileCoordsToKey(o)),o=this._tiles[o];return o&&o.active?o.retain=!0:(o&&o.loaded&&(o.retain=!0),n<i&&this._retainParent(t,e,i,n))},_retainChildren:function(t,e,i,n){for(var o=2*t;o<2*t+2;o++)for(var s=2*e;s<2*e+2;s++){var r=new p(o,s),r=(r.z=i+1,this._tileCoordsToKey(r)),r=this._tiles[r];r&&r.active?r.retain=!0:(r&&r.loaded&&(r.retain=!0),i+1<n&&this._retainChildren(o,s,i+1,n))}},_resetView:function(t){t=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),t,t)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var e=this.options;return void 0!==e.minNativeZoom&&t<e.minNativeZoom?e.minNativeZoom:void 0!==e.maxNativeZoom&&e.maxNativeZoom<t?e.maxNativeZoom:t},_setView:function(t,e,i,n){var o=Math.round(e),o=void 0!==this.options.maxZoom&&o>this.options.maxZoom||void 0!==this.options.minZoom&&o<this.options.minZoom?void 0:this._clampZoom(o),s=this.options.updateWhenZooming&&o!==this._tileZoom;n&&!s||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),i||this._pruneTiles(),this._noPrune=!!i),this._setZoomTransforms(t,e)},_setZoomTransforms:function(t,e){for(var i in this._levels)this._setZoomTransform(this._levels[i],t,e)},_setZoomTransform:function(t,e,i){var n=this._map.getZoomScale(i,t.zoom),e=t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(e,i)).round();b.any3d?be(t.el,e,n):Z(t.el,e)},_resetGrid:function(){var t=this._map,e=t.options.crs,i=this._tileSize=this.getTileSize(),n=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=e.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,e.wrapLng[0]],n).x/i.x),Math.ceil(t.project([0,e.wrapLng[1]],n).x/i.y)],this._wrapY=e.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([e.wrapLat[0],0],n).y/i.x),Math.ceil(t.project([e.wrapLat[1],0],n).y/i.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var e=this._map,i=e._animatingZoom?Math.max(e._animateToZoom,e.getZoom()):e.getZoom(),i=e.getZoomScale(i,this._tileZoom),t=e.project(t,this._tileZoom).floor(),e=e.getSize().divideBy(2*i);return new f(t.subtract(e),t.add(e))},_update:function(t){var e=this._map;if(e){var i=this._clampZoom(e.getZoom());if(void 0===t&&(t=e.getCenter()),void 0!==this._tileZoom){var n,e=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(e),s=o.getCenter(),r=[],e=this.options.keepBuffer,a=new f(o.getBottomLeft().subtract([e,-e]),o.getTopRight().add([e,-e]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error("Attempted to load an infinite number of tiles");for(n in this._tiles){var h=this._tiles[n].coords;h.z===this._tileZoom&&a.contains(new p(h.x,h.y))||(this._tiles[n].current=!1)}if(1<Math.abs(i-this._tileZoom))this._setView(t,i);else{for(var l=o.min.y;l<=o.max.y;l++)for(var u=o.min.x;u<=o.max.x;u++){var c,d=new p(u,l);d.z=this._tileZoom,this._isValidTile(d)&&((c=this._tiles[this._tileCoordsToKey(d)])?c.current=!0:r.push(d))}if(r.sort(function(t,e){return t.distanceTo(s)-e.distanceTo(s)}),0!==r.length){this._loading||(this._loading=!0,this.fire("loading"));for(var _=document.createDocumentFragment(),u=0;u<r.length;u++)this._addTile(r[u],_);this._level.el.appendChild(_)}}}}},_isValidTile:function(t){var e=this._map.options.crs;if(!e.infinite){var i=this._globalTileRange;if(!e.wrapLng&&(t.x<i.min.x||t.x>i.max.x)||!e.wrapLat&&(t.y<i.min.y||t.y>i.max.y))return!1}return!this.options.bounds||(e=this._tileCoordsToBounds(t),g(this.options.bounds).overlaps(e))},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var e=this._map,i=this.getTileSize(),n=t.scaleBy(i),i=n.add(i);return[e.unproject(n,t.z),e.unproject(i,t.z)]},_tileCoordsToBounds:function(t){t=this._tileCoordsToNwSe(t),t=new s(t[0],t[1]);return t=this.options.noWrap?t:this._map.wrapLatLngBounds(t)},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var t=t.split(":"),e=new p(+t[0],+t[1]);return e.z=+t[2],e},_removeTile:function(t){var e=this._tiles[t];e&&(T(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){M(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=u,t.onmousemove=u,b.ielt9&&this.options.opacity<1&&C(t,this.options.opacity)},_addTile:function(t,e){var i=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&x(a(this._tileReady,this,t,null,o)),Z(o,i),this._tiles[n]={el:o,coords:t,current:!0},e.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,e,i){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var n=this._tileCoordsToKey(t);(i=this._tiles[n])&&(i.loaded=+new Date,this._map._fadeAnimated?(C(i.el,0),r(this._fadeFrame),this._fadeFrame=x(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(M(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),b.ielt9||!this._map._fadeAnimated?x(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new p(this._wrapX?H(t.x,this._wrapX):t.x,this._wrapY?H(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new f(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var Di=Ni.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1,referrerPolicy:!1},initialize:function(t,e){this._url=t,(e=c(this,e)).detectRetina&&b.retina&&0<e.maxZoom?(e.tileSize=Math.floor(e.tileSize/2),e.zoomReverse?(e.zoomOffset--,e.minZoom=Math.min(e.maxZoom,e.minZoom+1)):(e.zoomOffset++,e.maxZoom=Math.max(e.minZoom,e.maxZoom-1)),e.minZoom=Math.max(0,e.minZoom)):e.zoomReverse?e.minZoom=Math.min(e.maxZoom,e.minZoom):e.maxZoom=Math.max(e.minZoom,e.maxZoom),"string"==typeof e.subdomains&&(e.subdomains=e.subdomains.split("")),this.on("tileunload",this._onTileRemove)},setUrl:function(t,e){return this._url===t&&void 0===e&&(e=!0),this._url=t,e||this.redraw(),this},createTile:function(t,e){var i=document.createElement("img");return S(i,"load",a(this._tileOnLoad,this,e,i)),S(i,"error",a(this._tileOnError,this,e,i)),!this.options.crossOrigin&&""!==this.options.crossOrigin||(i.crossOrigin=!0===this.options.crossOrigin?"":this.options.crossOrigin),"string"==typeof this.options.referrerPolicy&&(i.referrerPolicy=this.options.referrerPolicy),i.alt="",i.src=this.getTileUrl(t),i},getTileUrl:function(t){var e={r:b.retina?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};return this._map&&!this._map.options.crs.infinite&&(t=this._globalTileRange.max.y-t.y,this.options.tms&&(e.y=t),e["-y"]=t),q(this._url,l(e,this.options))},_tileOnLoad:function(t,e){b.ielt9?setTimeout(a(t,this,null,e),0):t(null,e)},_tileOnError:function(t,e,i){var n=this.options.errorTileUrl;n&&e.getAttribute("src")!==n&&(e.src=n),t(i,e)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,e=this.options.maxZoom;return(t=this.options.zoomReverse?e-t:t)+this.options.zoomOffset},_getSubdomain:function(t){t=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[t]},_abortLoading:function(){var t,e,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=u,i.onerror=u,i.complete||(i.src=K,e=this._tiles[t].coords,T(i),delete this._tiles[t],this.fire("tileabort",{tile:i,coords:e})))},_removeTile:function(t){var e=this._tiles[t];if(e)return e.el.setAttribute("src",K),Ni.prototype._removeTile.call(this,t)},_tileReady:function(t,e,i){if(this._map&&(!i||i.getAttribute("src")!==K))return Ni.prototype._tileReady.call(this,t,e,i)}});function ji(t,e){return new Di(t,e)}var Hi=Di.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var i,n=l({},this.defaultWmsParams);for(i in e)i in this.options||(n[i]=e[i]);var t=(e=c(this,e)).detectRetina&&b.retina?2:1,o=this.getTileSize();n.width=o.x*t,n.height=o.y*t,this.wmsParams=n},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=1.3<=this._wmsVersion?"crs":"srs";this.wmsParams[e]=this._crs.code,Di.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._tileCoordsToNwSe(t),i=this._crs,i=_(i.project(e[0]),i.project(e[1])),e=i.min,i=i.max,e=(1.3<=this._wmsVersion&&this._crs===li?[e.y,e.x,i.y,i.x]:[e.x,e.y,i.x,i.y]).join(","),i=Di.prototype.getTileUrl.call(this,t);return i+U(this.wmsParams,i,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+e},setParams:function(t,e){return l(this.wmsParams,t),e||this.redraw(),this}});Di.WMS=Hi,ji.wms=function(t,e){return new Hi(t,e)};var Wi=o.extend({options:{padding:.1},initialize:function(t){c(this,t),h(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),M(this._container,"leaflet-zoom-animated")),this.getPane().appendChild(this._container),this._update(),this.on("update",this._updatePaths,this)},onRemove:function(){this.off("update",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,e){var i=this._map.getZoomScale(e,this._zoom),n=this._map.getSize().multiplyBy(.5+this.options.padding),o=this._map.project(this._center,e),n=n.multiplyBy(-i).add(o).subtract(this._map._getNewPixelOrigin(t,e));b.any3d?be(this._container,n,i):Z(this._container,n)},_reset:function(){for(var t in this._update(),this._updateTransform(this._center,this._zoom),this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,e=this._map.getSize(),i=this._map.containerPointToLayerPoint(e.multiplyBy(-t)).round();this._bounds=new f(i,i.add(e.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),Fi=Wi.extend({options:{tolerance:0},getEvents:function(){var t=Wi.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){Wi.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement("canvas");S(t,"mousemove",this._onMouseMove,this),S(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this),S(t,"mouseout",this._handleMouseOut,this),t._leaflet_disable_events=!0,this._ctx=t.getContext("2d")},_destroyContainer:function(){r(this._redrawRequest),delete this._ctx,T(this._container),k(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){for(var t in this._redrawBounds=null,this._layers)this._layers[t]._update();this._redraw()}},_update:function(){var t,e,i,n;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),t=this._bounds,e=this._container,i=t.getSize(),n=b.retina?2:1,Z(e,t.min),e.width=n*i.x,e.height=n*i.y,e.style.width=i.x+"px",e.style.height=i.y+"px",b.retina&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update"))},_reset:function(){Wi.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t);t=(this._layers[h(t)]=t)._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=t),this._drawLast=t,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var e=t._order,i=e.next,e=e.prev;i?i.prev=e:this._drawLast=e,e?e.next=i:this._drawFirst=i,delete t._order,delete this._layers[h(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if("string"==typeof t.options.dashArray){for(var e,i=t.options.dashArray.split(/[, ]+/),n=[],o=0;o<i.length;o++){if(e=Number(i[o]),isNaN(e))return;n.push(e)}t.options._dashArray=n}else t.options._dashArray=t.options.dashArray},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||x(this._redraw,this))},_extendRedrawBounds:function(t){var e;t._pxBounds&&(e=(t.options.weight||0)+1,this._redrawBounds=this._redrawBounds||new f,this._redrawBounds.extend(t._pxBounds.min.subtract([e,e])),this._redrawBounds.extend(t._pxBounds.max.add([e,e])))},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t,e=this._redrawBounds;e?(t=e.getSize(),this._ctx.clearRect(e.min.x,e.min.y,t.x,t.y)):(this._ctx.save(),this._ctx.setTransform(1,0,0,1,0,0),this._ctx.clearRect(0,0,this._container.width,this._container.height),this._ctx.restore())},_draw:function(){var t,e,i=this._redrawBounds;this._ctx.save(),i&&(e=i.getSize(),this._ctx.beginPath(),this._ctx.rect(i.min.x,i.min.y,e.x,e.y),this._ctx.clip()),this._drawing=!0;for(var n=this._drawFirst;n;n=n.next)t=n.layer,(!i||t._pxBounds&&t._pxBounds.intersects(i))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,e){if(this._drawing){var i,n,o,s,r=t._parts,a=r.length,h=this._ctx;if(a){for(h.beginPath(),i=0;i<a;i++){for(n=0,o=r[i].length;n<o;n++)s=r[i][n],h[n?"lineTo":"moveTo"](s.x,s.y);e&&h.closePath()}this._fillStroke(h,t)}}},_updateCircle:function(t){var e,i,n,o;this._drawing&&!t._empty()&&(e=t._point,i=this._ctx,n=Math.max(Math.round(t._radius),1),1!=(o=(Math.max(Math.round(t._radiusY),1)||n)/n)&&(i.save(),i.scale(1,o)),i.beginPath(),i.arc(e.x,e.y/o,n,0,2*Math.PI,!1),1!=o&&i.restore(),this._fillStroke(i,t))},_fillStroke:function(t,e){var i=e.options;i.fill&&(t.globalAlpha=i.fillOpacity,t.fillStyle=i.fillColor||i.color,t.fill(i.fillRule||"evenodd")),i.stroke&&0!==i.weight&&(t.setLineDash&&t.setLineDash(e.options&&e.options._dashArray||[]),t.globalAlpha=i.opacity,t.lineWidth=i.weight,t.strokeStyle=i.color,t.lineCap=i.lineCap,t.lineJoin=i.lineJoin,t.stroke())},_onClick:function(t){for(var e,i,n=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(e=o.layer).options.interactive&&e._containsPoint(n)&&(("click"===t.type||"preclick"===t.type)&&this._map._draggableMoved(e)||(i=e));this._fireEvent(!!i&&[i],t)},_onMouseMove:function(t){var e;!this._map||this._map.dragging.moving()||this._map._animatingZoom||(e=this._map.mouseEventToLayerPoint(t),this._handleMouseHover(t,e))},_handleMouseOut:function(t){var e=this._hoveredLayer;e&&(z(this._container,"leaflet-interactive"),this._fireEvent([e],t,"mouseout"),this._hoveredLayer=null,this._mouseHoverThrottled=!1)},_handleMouseHover:function(t,e){if(!this._mouseHoverThrottled){for(var i,n,o=this._drawFirst;o;o=o.next)(i=o.layer).options.interactive&&i._containsPoint(e)&&(n=i);n!==this._hoveredLayer&&(this._handleMouseOut(t),n&&(M(this._container,"leaflet-interactive"),this._fireEvent([n],t,"mouseover"),this._hoveredLayer=n)),this._fireEvent(!!this._hoveredLayer&&[this._hoveredLayer],t),this._mouseHoverThrottled=!0,setTimeout(a(function(){this._mouseHoverThrottled=!1},this),32)}},_fireEvent:function(t,e,i){this._map._fireDOMEvent(e,i||e.type,t)},_bringToFront:function(t){var e,i,n=t._order;n&&(e=n.next,i=n.prev,e&&((e.prev=i)?i.next=e:e&&(this._drawFirst=e),n.prev=this._drawLast,(this._drawLast.next=n).next=null,this._drawLast=n,this._requestRedraw(t)))},_bringToBack:function(t){var e,i,n=t._order;n&&(e=n.next,(i=n.prev)&&((i.next=e)?e.prev=i:i&&(this._drawLast=i),n.prev=null,n.next=this._drawFirst,this._drawFirst.prev=n,this._drawFirst=n,this._requestRedraw(t)))}});function Ui(t){return b.canvas?new Fi(t):null}var Vi=function(){try{return document.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return document.createElement("<lvml:"+t+' class="lvml">')}}catch(t){}return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}(),zt={_initContainer:function(){this._container=P("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(Wi.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=Vi("shape");M(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=Vi("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;T(e),t.removeInteractiveTarget(e),delete this._layers[h(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(e=e||(t._stroke=Vi("stroke")),o.appendChild(e),e.weight=n.weight+"px",e.color=n.color,e.opacity=n.opacity,n.dashArray?e.dashStyle=d(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=n.lineCap.replace("butt","flat"),e.joinstyle=n.lineJoin):e&&(o.removeChild(e),t._stroke=null),n.fill?(i=i||(t._fill=Vi("fill")),o.appendChild(i),i.color=n.fillColor||n.color,i.opacity=n.fillOpacity):i&&(o.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){fe(t._container)},_bringToBack:function(t){ge(t._container)}},qi=b.vml?Vi:ct,Gi=Wi.extend({_initContainer:function(){this._container=qi("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=qi("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){T(this._container),k(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_update:function(){var t,e,i;this._map._animatingZoom&&this._bounds||(Wi.prototype._update.call(this),e=(t=this._bounds).getSize(),i=this._container,this._svgSize&&this._svgSize.equals(e)||(this._svgSize=e,i.setAttribute("width",e.x),i.setAttribute("height",e.y)),Z(i,t.min),i.setAttribute("viewBox",[t.min.x,t.min.y,e.x,e.y].join(" ")),this.fire("update"))},_initPath:function(t){var e=t._path=qi("path");t.options.className&&M(e,t.options.className),t.options.interactive&&M(e,"leaflet-interactive"),this._updateStyle(t),this._layers[h(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){T(t._path),t.removeInteractiveTarget(t._path),delete this._layers[h(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var e=t._path,t=t.options;e&&(t.stroke?(e.setAttribute("stroke",t.color),e.setAttribute("stroke-opacity",t.opacity),e.setAttribute("stroke-width",t.weight),e.setAttribute("stroke-linecap",t.lineCap),e.setAttribute("stroke-linejoin",t.lineJoin),t.dashArray?e.setAttribute("stroke-dasharray",t.dashArray):e.removeAttribute("stroke-dasharray"),t.dashOffset?e.setAttribute("stroke-dashoffset",t.dashOffset):e.removeAttribute("stroke-dashoffset")):e.setAttribute("stroke","none"),t.fill?(e.setAttribute("fill",t.fillColor||t.color),e.setAttribute("fill-opacity",t.fillOpacity),e.setAttribute("fill-rule",t.fillRule||"evenodd")):e.setAttribute("fill","none"))},_updatePoly:function(t,e){this._setPath(t,dt(t._parts,e))},_updateCircle:function(t){var e=t._point,i=Math.max(Math.round(t._radius),1),n="a"+i+","+(Math.max(Math.round(t._radiusY),1)||i)+" 0 1,0 ",e=t._empty()?"M0 0":"M"+(e.x-i)+","+e.y+n+2*i+",0 "+n+2*-i+",0 ";this._setPath(t,e)},_setPath:function(t,e){t._path.setAttribute("d",e)},_bringToFront:function(t){fe(t._path)},_bringToBack:function(t){ge(t._path)}});function Ki(t){return b.svg||b.vml?new Gi(t):null}b.vml&&Gi.include(zt),A.include({getRenderer:function(t){t=(t=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(t)||this.addLayer(t),t},_getPaneRenderer:function(t){var e;return"overlayPane"!==t&&void 0!==t&&(void 0===(e=this._paneRenderers[t])&&(e=this._createRenderer({pane:t}),this._paneRenderers[t]=e),e)},_createRenderer:function(t){return this.options.preferCanvas&&Ui(t)||Ki(t)}});var Yi=xi.extend({initialize:function(t,e){xi.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=g(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});Gi.create=qi,Gi.pointsToPath=dt,wi.geometryToLayer=bi,wi.coordsToLatLng=Li,wi.coordsToLatLngs=Ti,wi.latLngToCoords=Mi,wi.latLngsToCoords=zi,wi.getFeature=Ci,wi.asFeature=Zi,A.mergeOptions({boxZoom:!0});var _t=n.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){S(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){k(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){T(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),re(),Le(),this._startPoint=this._map.mouseEventToContainerPoint(t),S(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=P("div","leaflet-zoom-box",this._container),M(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var t=new f(this._point,this._startPoint),e=t.getSize();Z(this._box,t.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(T(this._box),z(this._container,"leaflet-crosshair")),ae(),Te(),k(document,{contextmenu:Re,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0),t=new s(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(t).fire("boxzoomend",{boxZoomBounds:t})))},_onKeyDown:function(t){27===t.keyCode&&(this._finish(),this._clearDeferredResetState(),this._resetState())}}),Ct=(A.addInitHook("addHandler","boxZoom",_t),A.mergeOptions({doubleClickZoom:!0}),n.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var e=this._map,i=e.getZoom(),n=e.options.zoomDelta,i=t.originalEvent.shiftKey?i-n:i+n;"center"===e.options.doubleClickZoom?e.setZoom(i):e.setZoomAround(t.containerPoint,i)}})),Zt=(A.addInitHook("addHandler","doubleClickZoom",Ct),A.mergeOptions({dragging:!0,inertia:!0,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0}),n.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new Xe(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),M(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){z(this._map._container,"leaflet-grab"),z(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,e=this._map;e._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=g(this._map.options.maxBounds),this._offsetLimit=_(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,e.fire("movestart").fire("dragstart"),e.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var e,i;this._map.options.inertia&&(e=this._lastTime=+new Date,i=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(i),this._times.push(e),this._prunePositions(e)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1<this._positions.length&&50<t-this._times[0];)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,e){return t-(t-e)*this._viscosity},_onPreDragLimit:function(){var t,e;this._viscosity&&this._offsetLimit&&(t=this._draggable._newPos.subtract(this._draggable._startPos),e=this._offsetLimit,t.x<e.min.x&&(t.x=this._viscousLimit(t.x,e.min.x)),t.y<e.min.y&&(t.y=this._viscousLimit(t.y,e.min.y)),t.x>e.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,n=(n+e+i)%t-e-i,t=Math.abs(o+i)<Math.abs(n+i)?o:n;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=t},_onDragEnd:function(t){var e,i,n,o,s=this._map,r=s.options,a=!r.inertia||t.noInertia||this._times.length<2;s.fire("dragend",t),!a&&(this._prunePositions(+new Date),t=this._lastPos.subtract(this._positions[0]),a=(this._lastTime-this._times[0])/1e3,e=r.easeLinearity,a=(t=t.multiplyBy(e/a)).distanceTo([0,0]),i=Math.min(r.inertiaMaxSpeed,a),t=t.multiplyBy(i/a),n=i/(r.inertiaDeceleration*e),(o=t.multiplyBy(-n/2).round()).x||o.y)?(o=s._limitOffset(o,s.options.maxBounds),x(function(){s.panBy(o,{duration:n,easeLinearity:e,noMoveStart:!0,animate:!0})})):s.fire("moveend")}})),St=(A.addInitHook("addHandler","dragging",Zt),A.mergeOptions({keyboard:!0,keyboardPanDelta:80}),n.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex="0"),S(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),k(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){var t,e,i;this._focused||(i=document.body,t=document.documentElement,e=i.scrollTop||t.scrollTop,i=i.scrollLeft||t.scrollLeft,this._map._container.focus(),window.scrollTo(i,e))},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanDelta:function(t){for(var e=this._panKeys={},i=this.keyCodes,n=0,o=i.left.length;n<o;n++)e[i.left[n]]=[-1*t,0];for(n=0,o=i.right.length;n<o;n++)e[i.right[n]]=[t,0];for(n=0,o=i.down.length;n<o;n++)e[i.down[n]]=[0,t];for(n=0,o=i.up.length;n<o;n++)e[i.up[n]]=[0,-1*t]},_setZoomDelta:function(t){for(var e=this._zoomKeys={},i=this.keyCodes,n=0,o=i.zoomIn.length;n<o;n++)e[i.zoomIn[n]]=t;for(n=0,o=i.zoomOut.length;n<o;n++)e[i.zoomOut[n]]=-t},_addHooks:function(){S(document,"keydown",this._onKeyDown,this)},_removeHooks:function(){k(document,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var e,i,n=t.keyCode,o=this._map;if(n in this._panKeys)o._panAnim&&o._panAnim._inProgress||(i=this._panKeys[n],t.shiftKey&&(i=m(i).multiplyBy(3)),o.options.maxBounds&&(i=o._limitOffset(m(i),o.options.maxBounds)),o.options.worldCopyJump?(e=o.wrapLatLng(o.unproject(o.project(o.getCenter()).add(i))),o.panTo(e)):o.panBy(i));else if(n in this._zoomKeys)o.setZoom(o.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[n]);else{if(27!==n||!o._popup||!o._popup.options.closeOnEscapeKey)return;o.closePopup()}Re(t)}}})),Et=(A.addInitHook("addHandler","keyboard",St),A.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60}),n.extend({addHooks:function(){S(this._map._container,"wheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){k(this._map._container,"wheel",this._onWheelScroll,this)},_onWheelScroll:function(t){var e=He(t),i=this._map.options.wheelDebounceTime,e=(this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date),Math.max(i-(+new Date-this._startTime),0));clearTimeout(this._timer),this._timer=setTimeout(a(this._performZoom,this),e),Re(t)},_performZoom:function(){var t=this._map,e=t.getZoom(),i=this._map.options.zoomSnap||0,n=(t._stop(),this._delta/(4*this._map.options.wheelPxPerZoomLevel)),n=4*Math.log(2/(1+Math.exp(-Math.abs(n))))/Math.LN2,i=i?Math.ceil(n/i)*i:n,n=t._limitZoom(e+(0<this._delta?i:-i))-e;this._delta=0,this._startTime=null,n&&("center"===t.options.scrollWheelZoom?t.setZoom(e+n):t.setZoomAround(this._lastMousePos,e+n))}})),kt=(A.addInitHook("addHandler","scrollWheelZoom",Et),A.mergeOptions({tapHold:b.touchNative&&b.safari&&b.mobile,tapTolerance:15}),n.extend({addHooks:function(){S(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){k(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){var e;clearTimeout(this._holdTimeout),1===t.touches.length&&(e=t.touches[0],this._startPos=this._newPos=new p(e.clientX,e.clientY),this._holdTimeout=setTimeout(a(function(){this._cancel(),this._isTapValid()&&(S(document,"touchend",O),S(document,"touchend touchcancel",this._cancelClickPrevent),this._simulateEvent("contextmenu",e))},this),600),S(document,"touchend touchcancel contextmenu",this._cancel,this),S(document,"touchmove",this._onMove,this))},_cancelClickPrevent:function t(){k(document,"touchend",O),k(document,"touchend touchcancel",t)},_cancel:function(){clearTimeout(this._holdTimeout),k(document,"touchend touchcancel contextmenu",this._cancel,this),k(document,"touchmove",this._onMove,this)},_onMove:function(t){t=t.touches[0];this._newPos=new p(t.clientX,t.clientY)},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_simulateEvent:function(t,e){t=new MouseEvent(t,{bubbles:!0,cancelable:!0,view:window,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY});t._simulated=!0,e.target.dispatchEvent(t)}})),Ot=(A.addInitHook("addHandler","tapHold",kt),A.mergeOptions({touchZoom:b.touch,bounceAtZoomLimits:!0}),n.extend({addHooks:function(){M(this._map._container,"leaflet-touch-zoom"),S(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){z(this._map._container,"leaflet-touch-zoom"),k(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var e,i,n=this._map;!t.touches||2!==t.touches.length||n._animatingZoom||this._zooming||(e=n.mouseEventToContainerPoint(t.touches[0]),i=n.mouseEventToContainerPoint(t.touches[1]),this._centerPoint=n.getSize()._divideBy(2),this._startLatLng=n.containerPointToLatLng(this._centerPoint),"center"!==n.options.touchZoom&&(this._pinchStartLatLng=n.containerPointToLatLng(e.add(i)._divideBy(2))),this._startDist=e.distanceTo(i),this._startZoom=n.getZoom(),this._moved=!1,this._zooming=!0,n._stop(),S(document,"touchmove",this._onTouchMove,this),S(document,"touchend touchcancel",this._onTouchEnd,this),O(t))},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var e=this._map,i=e.mouseEventToContainerPoint(t.touches[0]),n=e.mouseEventToContainerPoint(t.touches[1]),o=i.distanceTo(n)/this._startDist;if(this._zoom=e.getScaleZoom(o,this._startZoom),!e.options.bounceAtZoomLimits&&(this._zoom<e.getMinZoom()&&o<1||this._zoom>e.getMaxZoom()&&1<o)&&(this._zoom=e._limitZoom(this._zoom)),"center"===e.options.touchZoom){if(this._center=this._startLatLng,1==o)return}else{i=i._add(n)._divideBy(2)._subtract(this._centerPoint);if(1==o&&0===i.x&&0===i.y)return;this._center=e.unproject(e.project(this._pinchStartLatLng,this._zoom).subtract(i),this._zoom)}this._moved||(e._moveStart(!0,!1),this._moved=!0),r(this._animRequest);n=a(e._move,e,this._center,this._zoom,{pinch:!0,round:!1},void 0);this._animRequest=x(n,this,!0),O(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,r(this._animRequest),k(document,"touchmove",this._onTouchMove,this),k(document,"touchend touchcancel",this._onTouchEnd,this),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}})),Xi=(A.addInitHook("addHandler","touchZoom",Ot),A.BoxZoom=_t,A.DoubleClickZoom=Ct,A.Drag=Zt,A.Keyboard=St,A.ScrollWheelZoom=Et,A.TapHold=kt,A.TouchZoom=Ot,t.Bounds=f,t.Browser=b,t.CRS=ot,t.Canvas=Fi,t.Circle=vi,t.CircleMarker=gi,t.Class=et,t.Control=B,t.DivIcon=Ri,t.DivOverlay=Ai,t.DomEvent=mt,t.DomUtil=pt,t.Draggable=Xe,t.Evented=it,t.FeatureGroup=ci,t.GeoJSON=wi,t.GridLayer=Ni,t.Handler=n,t.Icon=di,t.ImageOverlay=Ei,t.LatLng=v,t.LatLngBounds=s,t.Layer=o,t.LayerGroup=ui,t.LineUtil=vt,t.Map=A,t.Marker=mi,t.Mixin=ft,t.Path=fi,t.Point=p,t.PolyUtil=gt,t.Polygon=xi,t.Polyline=yi,t.Popup=Bi,t.PosAnimation=Fe,t.Projection=wt,t.Rectangle=Yi,t.Renderer=Wi,t.SVG=Gi,t.SVGOverlay=Oi,t.TileLayer=Di,t.Tooltip=Ii,t.Transformation=at,t.Util=tt,t.VideoOverlay=ki,t.bind=a,t.bounds=_,t.canvas=Ui,t.circle=function(t,e,i){return new vi(t,e,i)},t.circleMarker=function(t,e){return new gi(t,e)},t.control=Ue,t.divIcon=function(t){return new Ri(t)},t.extend=l,t.featureGroup=function(t,e){return new ci(t,e)},t.geoJSON=Si,t.geoJson=Mt,t.gridLayer=function(t){return new Ni(t)},t.icon=function(t){return new di(t)},t.imageOverlay=function(t,e,i){return new Ei(t,e,i)},t.latLng=w,t.latLngBounds=g,t.layerGroup=function(t,e){return new ui(t,e)},t.map=function(t,e){return new A(t,e)},t.marker=function(t,e){return new mi(t,e)},t.point=m,t.polygon=function(t,e){return new xi(t,e)},t.polyline=function(t,e){return new yi(t,e)},t.popup=function(t,e){return new Bi(t,e)},t.rectangle=function(t,e){return new Yi(t,e)},t.setOptions=c,t.stamp=h,t.svg=Ki,t.svgOverlay=function(t,e,i){return new Oi(t,e,i)},t.tileLayer=ji,t.tooltip=function(t,e){return new Ii(t,e)},t.transformation=ht,t.version="1.9.4",t.videoOverlay=function(t,e,i){return new ki(t,e,i)},window.L);t.noConflict=function(){return window.L=Xi,this},window.L=t});
 //# sourceMappingURL=leaflet.js.map
-(function() {
-    // save these original methods before they are overwritten
-    var proto_initIcon = L.Marker.prototype._initIcon;
-    var proto_setPos = L.Marker.prototype._setPos;
-
-    var oldIE = (L.DomUtil.TRANSFORM === 'msTransform');
-
-    L.Marker.addInitHook(function () {
-        var iconOptions = this.options.icon && this.options.icon.options;
-        var iconAnchor = iconOptions && this.options.icon.options.iconAnchor;
-        if (iconAnchor) {
-            iconAnchor = (iconAnchor[0] + 'px ' + iconAnchor[1] + 'px');
-        }
-        this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom' ;
-        this.options.rotationAngle = this.options.rotationAngle || 0;
-
-        // Ensure marker keeps rotated during dragging
-        this.on('drag', function(e) { e.target._applyRotation(); });
-    });
-
-    L.Marker.include({
-        _initIcon: function() {
-            proto_initIcon.call(this);
-        },
-
-        _setPos: function (pos) {
-            proto_setPos.call(this, pos);
-            this._applyRotation();
-        },
-
-        _applyRotation: function () {
-            if(this.options.rotationAngle) {
-                this._icon.style[L.DomUtil.TRANSFORM+'Origin'] = this.options.rotationOrigin;
-
-                if(oldIE) {
-                    // for IE 9, use the 2D rotation
-                    this._icon.style[L.DomUtil.TRANSFORM] = 'rotate(' + this.options.rotationAngle + 'deg)';
-                } else {
-                    // for modern browsers, prefer the 3D accelerated version
-                    this._icon.style[L.DomUtil.TRANSFORM] += ' rotateZ(' + this.options.rotationAngle + 'deg)';
-                }
-            }
-        },
-
-        setRotationAngle: function(angle) {
-            this.options.rotationAngle = angle;
-            this.update();
-            return this;
-        },
-
-        setRotationOrigin: function(origin) {
-            this.options.rotationOrigin = origin;
-            this.update();
-            return this;
-        }
-    });
-})();
+(function() {
+    // save these original methods before they are overwritten
+    var proto_initIcon = L.Marker.prototype._initIcon;
+    var proto_setPos = L.Marker.prototype._setPos;
+
+    var oldIE = (L.DomUtil.TRANSFORM === 'msTransform');
+
+    L.Marker.addInitHook(function () {
+        var iconOptions = this.options.icon && this.options.icon.options;
+        var iconAnchor = iconOptions && this.options.icon.options.iconAnchor;
+        if (iconAnchor) {
+            iconAnchor = (iconAnchor[0] + 'px ' + iconAnchor[1] + 'px');
+        }
+        this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom' ;
+        this.options.rotationAngle = this.options.rotationAngle || 0;
+
+        // Ensure marker keeps rotated during dragging
+        this.on('drag', function(e) { e.target._applyRotation(); });
+    });
+
+    L.Marker.include({
+        _initIcon: function() {
+            proto_initIcon.call(this);
+        },
+
+        _setPos: function (pos) {
+            proto_setPos.call(this, pos);
+            this._applyRotation();
+        },
+
+        _applyRotation: function () {
+            if(this.options.rotationAngle) {
+                this._icon.style[L.DomUtil.TRANSFORM+'Origin'] = this.options.rotationOrigin;
+
+                if(oldIE) {
+                    // for IE 9, use the 2D rotation
+                    this._icon.style[L.DomUtil.TRANSFORM] = 'rotate(' + this.options.rotationAngle + 'deg)';
+                } else {
+                    // for modern browsers, prefer the 3D accelerated version
+                    this._icon.style[L.DomUtil.TRANSFORM] += ' rotateZ(' + this.options.rotationAngle + 'deg)';
+                }
+            }
+        },
+
+        setRotationAngle: function(angle) {
+            this.options.rotationAngle = angle;
+            this.update();
+            return this;
+        },
+
+        setRotationOrigin: function(origin) {
+            this.options.rotationOrigin = origin;
+            this.update();
+            return this;
+        }
+    });
+})();
 
 /**
  * Copyright (C) 2011-2012 Pavel Shramov
@@ -979,931 +979,931 @@ if (L.MarkerClusterGroup) {
     (global.ResizeObserver = factory());
 }(this, (function () { 'use strict';
 
-    /**
-     * A collection of shims that provide minimal functionality of the ES6 collections.
-     *
-     * These implementations are not meant to be used outside of the ResizeObserver
-     * modules as they cover only a limited range of use cases.
-     */
-    /* eslint-disable require-jsdoc, valid-jsdoc */
-    var MapShim = (function () {
-        if (typeof Map !== 'undefined') {
-            return Map;
-        }
-        /**
-         * Returns index in provided array that matches the specified key.
-         *
-         * @param {Array<Array>} arr
-         * @param {*} key
-         * @returns {number}
-         */
-        function getIndex(arr, key) {
-            var result = -1;
-            arr.some(function (entry, index) {
-                if (entry[0] === key) {
-                    result = index;
-                    return true;
-                }
-                return false;
-            });
-            return result;
-        }
-        return /** @class */ (function () {
-            function class_1() {
-                this.__entries__ = [];
-            }
-            Object.defineProperty(class_1.prototype, "size", {
-                /**
-                 * @returns {boolean}
-                 */
-                get: function () {
-                    return this.__entries__.length;
-                },
-                enumerable: true,
-                configurable: true
-            });
-            /**
-             * @param {*} key
-             * @returns {*}
-             */
-            class_1.prototype.get = function (key) {
-                var index = getIndex(this.__entries__, key);
-                var entry = this.__entries__[index];
-                return entry && entry[1];
-            };
-            /**
-             * @param {*} key
-             * @param {*} value
-             * @returns {void}
-             */
-            class_1.prototype.set = function (key, value) {
-                var index = getIndex(this.__entries__, key);
-                if (~index) {
-                    this.__entries__[index][1] = value;
-                }
-                else {
-                    this.__entries__.push([key, value]);
-                }
-            };
-            /**
-             * @param {*} key
-             * @returns {void}
-             */
-            class_1.prototype.delete = function (key) {
-                var entries = this.__entries__;
-                var index = getIndex(entries, key);
-                if (~index) {
-                    entries.splice(index, 1);
-                }
-            };
-            /**
-             * @param {*} key
-             * @returns {void}
-             */
-            class_1.prototype.has = function (key) {
-                return !!~getIndex(this.__entries__, key);
-            };
-            /**
-             * @returns {void}
-             */
-            class_1.prototype.clear = function () {
-                this.__entries__.splice(0);
-            };
-            /**
-             * @param {Function} callback
-             * @param {*} [ctx=null]
-             * @returns {void}
-             */
-            class_1.prototype.forEach = function (callback, ctx) {
-                if (ctx === void 0) { ctx = null; }
-                for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {
-                    var entry = _a[_i];
-                    callback.call(ctx, entry[1], entry[0]);
-                }
-            };
-            return class_1;
-        }());
+    /**
+     * A collection of shims that provide minimal functionality of the ES6 collections.
+     *
+     * These implementations are not meant to be used outside of the ResizeObserver
+     * modules as they cover only a limited range of use cases.
+     */
+    /* eslint-disable require-jsdoc, valid-jsdoc */
+    var MapShim = (function () {
+        if (typeof Map !== 'undefined') {
+            return Map;
+        }
+        /**
+         * Returns index in provided array that matches the specified key.
+         *
+         * @param {Array<Array>} arr
+         * @param {*} key
+         * @returns {number}
+         */
+        function getIndex(arr, key) {
+            var result = -1;
+            arr.some(function (entry, index) {
+                if (entry[0] === key) {
+                    result = index;
+                    return true;
+                }
+                return false;
+            });
+            return result;
+        }
+        return /** @class */ (function () {
+            function class_1() {
+                this.__entries__ = [];
+            }
+            Object.defineProperty(class_1.prototype, "size", {
+                /**
+                 * @returns {boolean}
+                 */
+                get: function () {
+                    return this.__entries__.length;
+                },
+                enumerable: true,
+                configurable: true
+            });
+            /**
+             * @param {*} key
+             * @returns {*}
+             */
+            class_1.prototype.get = function (key) {
+                var index = getIndex(this.__entries__, key);
+                var entry = this.__entries__[index];
+                return entry && entry[1];
+            };
+            /**
+             * @param {*} key
+             * @param {*} value
+             * @returns {void}
+             */
+            class_1.prototype.set = function (key, value) {
+                var index = getIndex(this.__entries__, key);
+                if (~index) {
+                    this.__entries__[index][1] = value;
+                }
+                else {
+                    this.__entries__.push([key, value]);
+                }
+            };
+            /**
+             * @param {*} key
+             * @returns {void}
+             */
+            class_1.prototype.delete = function (key) {
+                var entries = this.__entries__;
+                var index = getIndex(entries, key);
+                if (~index) {
+                    entries.splice(index, 1);
+                }
+            };
+            /**
+             * @param {*} key
+             * @returns {void}
+             */
+            class_1.prototype.has = function (key) {
+                return !!~getIndex(this.__entries__, key);
+            };
+            /**
+             * @returns {void}
+             */
+            class_1.prototype.clear = function () {
+                this.__entries__.splice(0);
+            };
+            /**
+             * @param {Function} callback
+             * @param {*} [ctx=null]
+             * @returns {void}
+             */
+            class_1.prototype.forEach = function (callback, ctx) {
+                if (ctx === void 0) { ctx = null; }
+                for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {
+                    var entry = _a[_i];
+                    callback.call(ctx, entry[1], entry[0]);
+                }
+            };
+            return class_1;
+        }());
     })();
 
-    /**
-     * Detects whether window and document objects are available in current environment.
-     */
+    /**
+     * Detects whether window and document objects are available in current environment.
+     */
     var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;
 
-    // Returns global object of a current environment.
-    var global$1 = (function () {
-        if (typeof global !== 'undefined' && global.Math === Math) {
-            return global;
-        }
-        if (typeof self !== 'undefined' && self.Math === Math) {
-            return self;
-        }
-        if (typeof window !== 'undefined' && window.Math === Math) {
-            return window;
-        }
-        // eslint-disable-next-line no-new-func
-        return Function('return this')();
+    // Returns global object of a current environment.
+    var global$1 = (function () {
+        if (typeof global !== 'undefined' && global.Math === Math) {
+            return global;
+        }
+        if (typeof self !== 'undefined' && self.Math === Math) {
+            return self;
+        }
+        if (typeof window !== 'undefined' && window.Math === Math) {
+            return window;
+        }
+        // eslint-disable-next-line no-new-func
+        return Function('return this')();
     })();
 
-    /**
-     * A shim for the requestAnimationFrame which falls back to the setTimeout if
-     * first one is not supported.
-     *
-     * @returns {number} Requests' identifier.
-     */
-    var requestAnimationFrame$1 = (function () {
-        if (typeof requestAnimationFrame === 'function') {
-            // It's required to use a bounded function because IE sometimes throws
-            // an "Invalid calling object" error if rAF is invoked without the global
-            // object on the left hand side.
-            return requestAnimationFrame.bind(global$1);
-        }
-        return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };
+    /**
+     * A shim for the requestAnimationFrame which falls back to the setTimeout if
+     * first one is not supported.
+     *
+     * @returns {number} Requests' identifier.
+     */
+    var requestAnimationFrame$1 = (function () {
+        if (typeof requestAnimationFrame === 'function') {
+            // It's required to use a bounded function because IE sometimes throws
+            // an "Invalid calling object" error if rAF is invoked without the global
+            // object on the left hand side.
+            return requestAnimationFrame.bind(global$1);
+        }
+        return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };
     })();
 
-    // Defines minimum timeout before adding a trailing call.
-    var trailingTimeout = 2;
-    /**
-     * Creates a wrapper function which ensures that provided callback will be
-     * invoked only once during the specified delay period.
-     *
-     * @param {Function} callback - Function to be invoked after the delay period.
-     * @param {number} delay - Delay after which to invoke callback.
-     * @returns {Function}
-     */
-    function throttle (callback, delay) {
-        var leadingCall = false, trailingCall = false, lastCallTime = 0;
-        /**
-         * Invokes the original callback function and schedules new invocation if
-         * the "proxy" was called during current request.
-         *
-         * @returns {void}
-         */
-        function resolvePending() {
-            if (leadingCall) {
-                leadingCall = false;
-                callback();
-            }
-            if (trailingCall) {
-                proxy();
-            }
-        }
-        /**
-         * Callback invoked after the specified delay. It will further postpone
-         * invocation of the original function delegating it to the
-         * requestAnimationFrame.
-         *
-         * @returns {void}
-         */
-        function timeoutCallback() {
-            requestAnimationFrame$1(resolvePending);
-        }
-        /**
-         * Schedules invocation of the original function.
-         *
-         * @returns {void}
-         */
-        function proxy() {
-            var timeStamp = Date.now();
-            if (leadingCall) {
-                // Reject immediately following calls.
-                if (timeStamp - lastCallTime < trailingTimeout) {
-                    return;
-                }
-                // Schedule new call to be in invoked when the pending one is resolved.
-                // This is important for "transitions" which never actually start
-                // immediately so there is a chance that we might miss one if change
-                // happens amids the pending invocation.
-                trailingCall = true;
-            }
-            else {
-                leadingCall = true;
-                trailingCall = false;
-                setTimeout(timeoutCallback, delay);
-            }
-            lastCallTime = timeStamp;
-        }
-        return proxy;
+    // Defines minimum timeout before adding a trailing call.
+    var trailingTimeout = 2;
+    /**
+     * Creates a wrapper function which ensures that provided callback will be
+     * invoked only once during the specified delay period.
+     *
+     * @param {Function} callback - Function to be invoked after the delay period.
+     * @param {number} delay - Delay after which to invoke callback.
+     * @returns {Function}
+     */
+    function throttle (callback, delay) {
+        var leadingCall = false, trailingCall = false, lastCallTime = 0;
+        /**
+         * Invokes the original callback function and schedules new invocation if
+         * the "proxy" was called during current request.
+         *
+         * @returns {void}
+         */
+        function resolvePending() {
+            if (leadingCall) {
+                leadingCall = false;
+                callback();
+            }
+            if (trailingCall) {
+                proxy();
+            }
+        }
+        /**
+         * Callback invoked after the specified delay. It will further postpone
+         * invocation of the original function delegating it to the
+         * requestAnimationFrame.
+         *
+         * @returns {void}
+         */
+        function timeoutCallback() {
+            requestAnimationFrame$1(resolvePending);
+        }
+        /**
+         * Schedules invocation of the original function.
+         *
+         * @returns {void}
+         */
+        function proxy() {
+            var timeStamp = Date.now();
+            if (leadingCall) {
+                // Reject immediately following calls.
+                if (timeStamp - lastCallTime < trailingTimeout) {
+                    return;
+                }
+                // Schedule new call to be in invoked when the pending one is resolved.
+                // This is important for "transitions" which never actually start
+                // immediately so there is a chance that we might miss one if change
+                // happens amids the pending invocation.
+                trailingCall = true;
+            }
+            else {
+                leadingCall = true;
+                trailingCall = false;
+                setTimeout(timeoutCallback, delay);
+            }
+            lastCallTime = timeStamp;
+        }
+        return proxy;
     }
 
-    // Minimum delay before invoking the update of observers.
-    var REFRESH_DELAY = 20;
-    // A list of substrings of CSS properties used to find transition events that
-    // might affect dimensions of observed elements.
-    var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];
-    // Check if MutationObserver is available.
-    var mutationObserverSupported = typeof MutationObserver !== 'undefined';
-    /**
-     * Singleton controller class which handles updates of ResizeObserver instances.
-     */
-    var ResizeObserverController = /** @class */ (function () {
-        /**
-         * Creates a new instance of ResizeObserverController.
-         *
-         * @private
-         */
-        function ResizeObserverController() {
-            /**
-             * Indicates whether DOM listeners have been added.
-             *
-             * @private {boolean}
-             */
-            this.connected_ = false;
-            /**
-             * Tells that controller has subscribed for Mutation Events.
-             *
-             * @private {boolean}
-             */
-            this.mutationEventsAdded_ = false;
-            /**
-             * Keeps reference to the instance of MutationObserver.
-             *
-             * @private {MutationObserver}
-             */
-            this.mutationsObserver_ = null;
-            /**
-             * A list of connected observers.
-             *
-             * @private {Array<ResizeObserverSPI>}
-             */
-            this.observers_ = [];
-            this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
-            this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
-        }
-        /**
-         * Adds observer to observers list.
-         *
-         * @param {ResizeObserverSPI} observer - Observer to be added.
-         * @returns {void}
-         */
-        ResizeObserverController.prototype.addObserver = function (observer) {
-            if (!~this.observers_.indexOf(observer)) {
-                this.observers_.push(observer);
-            }
-            // Add listeners if they haven't been added yet.
-            if (!this.connected_) {
-                this.connect_();
-            }
-        };
-        /**
-         * Removes observer from observers list.
-         *
-         * @param {ResizeObserverSPI} observer - Observer to be removed.
-         * @returns {void}
-         */
-        ResizeObserverController.prototype.removeObserver = function (observer) {
-            var observers = this.observers_;
-            var index = observers.indexOf(observer);
-            // Remove observer if it's present in registry.
-            if (~index) {
-                observers.splice(index, 1);
-            }
-            // Remove listeners if controller has no connected observers.
-            if (!observers.length && this.connected_) {
-                this.disconnect_();
-            }
-        };
-        /**
-         * Invokes the update of observers. It will continue running updates insofar
-         * it detects changes.
-         *
-         * @returns {void}
-         */
-        ResizeObserverController.prototype.refresh = function () {
-            var changesDetected = this.updateObservers_();
-            // Continue running updates if changes have been detected as there might
-            // be future ones caused by CSS transitions.
-            if (changesDetected) {
-                this.refresh();
-            }
-        };
-        /**
-         * Updates every observer from observers list and notifies them of queued
-         * entries.
-         *
-         * @private
-         * @returns {boolean} Returns "true" if any observer has detected changes in
-         *      dimensions of it's elements.
-         */
-        ResizeObserverController.prototype.updateObservers_ = function () {
-            // Collect observers that have active observations.
-            var activeObservers = this.observers_.filter(function (observer) {
-                return observer.gatherActive(), observer.hasActive();
-            });
-            // Deliver notifications in a separate cycle in order to avoid any
-            // collisions between observers, e.g. when multiple instances of
-            // ResizeObserver are tracking the same element and the callback of one
-            // of them changes content dimensions of the observed target. Sometimes
-            // this may result in notifications being blocked for the rest of observers.
-            activeObservers.forEach(function (observer) { return observer.broadcastActive(); });
-            return activeObservers.length > 0;
-        };
-        /**
-         * Initializes DOM listeners.
-         *
-         * @private
-         * @returns {void}
-         */
-        ResizeObserverController.prototype.connect_ = function () {
-            // Do nothing if running in a non-browser environment or if listeners
-            // have been already added.
-            if (!isBrowser || this.connected_) {
-                return;
-            }
-            // Subscription to the "Transitionend" event is used as a workaround for
-            // delayed transitions. This way it's possible to capture at least the
-            // final state of an element.
-            document.addEventListener('transitionend', this.onTransitionEnd_);
-            window.addEventListener('resize', this.refresh);
-            if (mutationObserverSupported) {
-                this.mutationsObserver_ = new MutationObserver(this.refresh);
-                this.mutationsObserver_.observe(document, {
-                    attributes: true,
-                    childList: true,
-                    characterData: true,
-                    subtree: true
-                });
-            }
-            else {
-                document.addEventListener('DOMSubtreeModified', this.refresh);
-                this.mutationEventsAdded_ = true;
-            }
-            this.connected_ = true;
-        };
-        /**
-         * Removes DOM listeners.
-         *
-         * @private
-         * @returns {void}
-         */
-        ResizeObserverController.prototype.disconnect_ = function () {
-            // Do nothing if running in a non-browser environment or if listeners
-            // have been already removed.
-            if (!isBrowser || !this.connected_) {
-                return;
-            }
-            document.removeEventListener('transitionend', this.onTransitionEnd_);
-            window.removeEventListener('resize', this.refresh);
-            if (this.mutationsObserver_) {
-                this.mutationsObserver_.disconnect();
-            }
-            if (this.mutationEventsAdded_) {
-                document.removeEventListener('DOMSubtreeModified', this.refresh);
-            }
-            this.mutationsObserver_ = null;
-            this.mutationEventsAdded_ = false;
-            this.connected_ = false;
-        };
-        /**
-         * "Transitionend" event handler.
-         *
-         * @private
-         * @param {TransitionEvent} event
-         * @returns {void}
-         */
-        ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {
-            var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;
-            // Detect whether transition may affect dimensions of an element.
-            var isReflowProperty = transitionKeys.some(function (key) {
-                return !!~propertyName.indexOf(key);
-            });
-            if (isReflowProperty) {
-                this.refresh();
-            }
-        };
-        /**
-         * Returns instance of the ResizeObserverController.
-         *
-         * @returns {ResizeObserverController}
-         */
-        ResizeObserverController.getInstance = function () {
-            if (!this.instance_) {
-                this.instance_ = new ResizeObserverController();
-            }
-            return this.instance_;
-        };
-        /**
-         * Holds reference to the controller's instance.
-         *
-         * @private {ResizeObserverController}
-         */
-        ResizeObserverController.instance_ = null;
-        return ResizeObserverController;
+    // Minimum delay before invoking the update of observers.
+    var REFRESH_DELAY = 20;
+    // A list of substrings of CSS properties used to find transition events that
+    // might affect dimensions of observed elements.
+    var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];
+    // Check if MutationObserver is available.
+    var mutationObserverSupported = typeof MutationObserver !== 'undefined';
+    /**
+     * Singleton controller class which handles updates of ResizeObserver instances.
+     */
+    var ResizeObserverController = /** @class */ (function () {
+        /**
+         * Creates a new instance of ResizeObserverController.
+         *
+         * @private
+         */
+        function ResizeObserverController() {
+            /**
+             * Indicates whether DOM listeners have been added.
+             *
+             * @private {boolean}
+             */
+            this.connected_ = false;
+            /**
+             * Tells that controller has subscribed for Mutation Events.
+             *
+             * @private {boolean}
+             */
+            this.mutationEventsAdded_ = false;
+            /**
+             * Keeps reference to the instance of MutationObserver.
+             *
+             * @private {MutationObserver}
+             */
+            this.mutationsObserver_ = null;
+            /**
+             * A list of connected observers.
+             *
+             * @private {Array<ResizeObserverSPI>}
+             */
+            this.observers_ = [];
+            this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);
+            this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);
+        }
+        /**
+         * Adds observer to observers list.
+         *
+         * @param {ResizeObserverSPI} observer - Observer to be added.
+         * @returns {void}
+         */
+        ResizeObserverController.prototype.addObserver = function (observer) {
+            if (!~this.observers_.indexOf(observer)) {
+                this.observers_.push(observer);
+            }
+            // Add listeners if they haven't been added yet.
+            if (!this.connected_) {
+                this.connect_();
+            }
+        };
+        /**
+         * Removes observer from observers list.
+         *
+         * @param {ResizeObserverSPI} observer - Observer to be removed.
+         * @returns {void}
+         */
+        ResizeObserverController.prototype.removeObserver = function (observer) {
+            var observers = this.observers_;
+            var index = observers.indexOf(observer);
+            // Remove observer if it's present in registry.
+            if (~index) {
+                observers.splice(index, 1);
+            }
+            // Remove listeners if controller has no connected observers.
+            if (!observers.length && this.connected_) {
+                this.disconnect_();
+            }
+        };
+        /**
+         * Invokes the update of observers. It will continue running updates insofar
+         * it detects changes.
+         *
+         * @returns {void}
+         */
+        ResizeObserverController.prototype.refresh = function () {
+            var changesDetected = this.updateObservers_();
+            // Continue running updates if changes have been detected as there might
+            // be future ones caused by CSS transitions.
+            if (changesDetected) {
+                this.refresh();
+            }
+        };
+        /**
+         * Updates every observer from observers list and notifies them of queued
+         * entries.
+         *
+         * @private
+         * @returns {boolean} Returns "true" if any observer has detected changes in
+         *      dimensions of it's elements.
+         */
+        ResizeObserverController.prototype.updateObservers_ = function () {
+            // Collect observers that have active observations.
+            var activeObservers = this.observers_.filter(function (observer) {
+                return observer.gatherActive(), observer.hasActive();
+            });
+            // Deliver notifications in a separate cycle in order to avoid any
+            // collisions between observers, e.g. when multiple instances of
+            // ResizeObserver are tracking the same element and the callback of one
+            // of them changes content dimensions of the observed target. Sometimes
+            // this may result in notifications being blocked for the rest of observers.
+            activeObservers.forEach(function (observer) { return observer.broadcastActive(); });
+            return activeObservers.length > 0;
+        };
+        /**
+         * Initializes DOM listeners.
+         *
+         * @private
+         * @returns {void}
+         */
+        ResizeObserverController.prototype.connect_ = function () {
+            // Do nothing if running in a non-browser environment or if listeners
+            // have been already added.
+            if (!isBrowser || this.connected_) {
+                return;
+            }
+            // Subscription to the "Transitionend" event is used as a workaround for
+            // delayed transitions. This way it's possible to capture at least the
+            // final state of an element.
+            document.addEventListener('transitionend', this.onTransitionEnd_);
+            window.addEventListener('resize', this.refresh);
+            if (mutationObserverSupported) {
+                this.mutationsObserver_ = new MutationObserver(this.refresh);
+                this.mutationsObserver_.observe(document, {
+                    attributes: true,
+                    childList: true,
+                    characterData: true,
+                    subtree: true
+                });
+            }
+            else {
+                document.addEventListener('DOMSubtreeModified', this.refresh);
+                this.mutationEventsAdded_ = true;
+            }
+            this.connected_ = true;
+        };
+        /**
+         * Removes DOM listeners.
+         *
+         * @private
+         * @returns {void}
+         */
+        ResizeObserverController.prototype.disconnect_ = function () {
+            // Do nothing if running in a non-browser environment or if listeners
+            // have been already removed.
+            if (!isBrowser || !this.connected_) {
+                return;
+            }
+            document.removeEventListener('transitionend', this.onTransitionEnd_);
+            window.removeEventListener('resize', this.refresh);
+            if (this.mutationsObserver_) {
+                this.mutationsObserver_.disconnect();
+            }
+            if (this.mutationEventsAdded_) {
+                document.removeEventListener('DOMSubtreeModified', this.refresh);
+            }
+            this.mutationsObserver_ = null;
+            this.mutationEventsAdded_ = false;
+            this.connected_ = false;
+        };
+        /**
+         * "Transitionend" event handler.
+         *
+         * @private
+         * @param {TransitionEvent} event
+         * @returns {void}
+         */
+        ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {
+            var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;
+            // Detect whether transition may affect dimensions of an element.
+            var isReflowProperty = transitionKeys.some(function (key) {
+                return !!~propertyName.indexOf(key);
+            });
+            if (isReflowProperty) {
+                this.refresh();
+            }
+        };
+        /**
+         * Returns instance of the ResizeObserverController.
+         *
+         * @returns {ResizeObserverController}
+         */
+        ResizeObserverController.getInstance = function () {
+            if (!this.instance_) {
+                this.instance_ = new ResizeObserverController();
+            }
+            return this.instance_;
+        };
+        /**
+         * Holds reference to the controller's instance.
+         *
+         * @private {ResizeObserverController}
+         */
+        ResizeObserverController.instance_ = null;
+        return ResizeObserverController;
     }());
 
-    /**
-     * Defines non-writable/enumerable properties of the provided target object.
-     *
-     * @param {Object} target - Object for which to define properties.
-     * @param {Object} props - Properties to be defined.
-     * @returns {Object} Target object.
-     */
-    var defineConfigurable = (function (target, props) {
-        for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {
-            var key = _a[_i];
-            Object.defineProperty(target, key, {
-                value: props[key],
-                enumerable: false,
-                writable: false,
-                configurable: true
-            });
-        }
-        return target;
+    /**
+     * Defines non-writable/enumerable properties of the provided target object.
+     *
+     * @param {Object} target - Object for which to define properties.
+     * @param {Object} props - Properties to be defined.
+     * @returns {Object} Target object.
+     */
+    var defineConfigurable = (function (target, props) {
+        for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {
+            var key = _a[_i];
+            Object.defineProperty(target, key, {
+                value: props[key],
+                enumerable: false,
+                writable: false,
+                configurable: true
+            });
+        }
+        return target;
     });
 
-    /**
-     * Returns the global object associated with provided element.
-     *
-     * @param {Object} target
-     * @returns {Object}
-     */
-    var getWindowOf = (function (target) {
-        // Assume that the element is an instance of Node, which means that it
-        // has the "ownerDocument" property from which we can retrieve a
-        // corresponding global object.
-        var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
-        // Return the local global object if it's not possible extract one from
-        // provided element.
-        return ownerGlobal || global$1;
+    /**
+     * Returns the global object associated with provided element.
+     *
+     * @param {Object} target
+     * @returns {Object}
+     */
+    var getWindowOf = (function (target) {
+        // Assume that the element is an instance of Node, which means that it
+        // has the "ownerDocument" property from which we can retrieve a
+        // corresponding global object.
+        var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;
+        // Return the local global object if it's not possible extract one from
+        // provided element.
+        return ownerGlobal || global$1;
     });
 
-    // Placeholder of an empty content rectangle.
-    var emptyRect = createRectInit(0, 0, 0, 0);
-    /**
-     * Converts provided string to a number.
-     *
-     * @param {number|string} value
-     * @returns {number}
-     */
-    function toFloat(value) {
-        return parseFloat(value) || 0;
-    }
-    /**
-     * Extracts borders size from provided styles.
-     *
-     * @param {CSSStyleDeclaration} styles
-     * @param {...string} positions - Borders positions (top, right, ...)
-     * @returns {number}
-     */
-    function getBordersSize(styles) {
-        var positions = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            positions[_i - 1] = arguments[_i];
-        }
-        return positions.reduce(function (size, position) {
-            var value = styles['border-' + position + '-width'];
-            return size + toFloat(value);
-        }, 0);
-    }
-    /**
-     * Extracts paddings sizes from provided styles.
-     *
-     * @param {CSSStyleDeclaration} styles
-     * @returns {Object} Paddings box.
-     */
-    function getPaddings(styles) {
-        var positions = ['top', 'right', 'bottom', 'left'];
-        var paddings = {};
-        for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {
-            var position = positions_1[_i];
-            var value = styles['padding-' + position];
-            paddings[position] = toFloat(value);
-        }
-        return paddings;
-    }
-    /**
-     * Calculates content rectangle of provided SVG element.
-     *
-     * @param {SVGGraphicsElement} target - Element content rectangle of which needs
-     *      to be calculated.
-     * @returns {DOMRectInit}
-     */
-    function getSVGContentRect(target) {
-        var bbox = target.getBBox();
-        return createRectInit(0, 0, bbox.width, bbox.height);
-    }
-    /**
-     * Calculates content rectangle of provided HTMLElement.
-     *
-     * @param {HTMLElement} target - Element for which to calculate the content rectangle.
-     * @returns {DOMRectInit}
-     */
-    function getHTMLElementContentRect(target) {
-        // Client width & height properties can't be
-        // used exclusively as they provide rounded values.
-        var clientWidth = target.clientWidth, clientHeight = target.clientHeight;
-        // By this condition we can catch all non-replaced inline, hidden and
-        // detached elements. Though elements with width & height properties less
-        // than 0.5 will be discarded as well.
-        //
-        // Without it we would need to implement separate methods for each of
-        // those cases and it's not possible to perform a precise and performance
-        // effective test for hidden elements. E.g. even jQuery's ':visible' filter
-        // gives wrong results for elements with width & height less than 0.5.
-        if (!clientWidth && !clientHeight) {
-            return emptyRect;
-        }
-        var styles = getWindowOf(target).getComputedStyle(target);
-        var paddings = getPaddings(styles);
-        var horizPad = paddings.left + paddings.right;
-        var vertPad = paddings.top + paddings.bottom;
-        // Computed styles of width & height are being used because they are the
-        // only dimensions available to JS that contain non-rounded values. It could
-        // be possible to utilize the getBoundingClientRect if only it's data wasn't
-        // affected by CSS transformations let alone paddings, borders and scroll bars.
-        var width = toFloat(styles.width), height = toFloat(styles.height);
-        // Width & height include paddings and borders when the 'border-box' box
-        // model is applied (except for IE).
-        if (styles.boxSizing === 'border-box') {
-            // Following conditions are required to handle Internet Explorer which
-            // doesn't include paddings and borders to computed CSS dimensions.
-            //
-            // We can say that if CSS dimensions + paddings are equal to the "client"
-            // properties then it's either IE, and thus we don't need to subtract
-            // anything, or an element merely doesn't have paddings/borders styles.
-            if (Math.round(width + horizPad) !== clientWidth) {
-                width -= getBordersSize(styles, 'left', 'right') + horizPad;
-            }
-            if (Math.round(height + vertPad) !== clientHeight) {
-                height -= getBordersSize(styles, 'top', 'bottom') + vertPad;
-            }
-        }
-        // Following steps can't be applied to the document's root element as its
-        // client[Width/Height] properties represent viewport area of the window.
-        // Besides, it's as well not necessary as the <html> itself neither has
-        // rendered scroll bars nor it can be clipped.
-        if (!isDocumentElement(target)) {
-            // In some browsers (only in Firefox, actually) CSS width & height
-            // include scroll bars size which can be removed at this step as scroll
-            // bars are the only difference between rounded dimensions + paddings
-            // and "client" properties, though that is not always true in Chrome.
-            var vertScrollbar = Math.round(width + horizPad) - clientWidth;
-            var horizScrollbar = Math.round(height + vertPad) - clientHeight;
-            // Chrome has a rather weird rounding of "client" properties.
-            // E.g. for an element with content width of 314.2px it sometimes gives
-            // the client width of 315px and for the width of 314.7px it may give
-            // 314px. And it doesn't happen all the time. So just ignore this delta
-            // as a non-relevant.
-            if (Math.abs(vertScrollbar) !== 1) {
-                width -= vertScrollbar;
-            }
-            if (Math.abs(horizScrollbar) !== 1) {
-                height -= horizScrollbar;
-            }
-        }
-        return createRectInit(paddings.left, paddings.top, width, height);
-    }
-    /**
-     * Checks whether provided element is an instance of the SVGGraphicsElement.
-     *
-     * @param {Element} target - Element to be checked.
-     * @returns {boolean}
-     */
-    var isSVGGraphicsElement = (function () {
-        // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement
-        // interface.
-        if (typeof SVGGraphicsElement !== 'undefined') {
-            return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };
-        }
-        // If it's so, then check that element is at least an instance of the
-        // SVGElement and that it has the "getBBox" method.
-        // eslint-disable-next-line no-extra-parens
-        return function (target) { return (target instanceof getWindowOf(target).SVGElement &&
-            typeof target.getBBox === 'function'); };
-    })();
-    /**
-     * Checks whether provided element is a document element (<html>).
-     *
-     * @param {Element} target - Element to be checked.
-     * @returns {boolean}
-     */
-    function isDocumentElement(target) {
-        return target === getWindowOf(target).document.documentElement;
-    }
-    /**
-     * Calculates an appropriate content rectangle for provided html or svg element.
-     *
-     * @param {Element} target - Element content rectangle of which needs to be calculated.
-     * @returns {DOMRectInit}
-     */
-    function getContentRect(target) {
-        if (!isBrowser) {
-            return emptyRect;
-        }
-        if (isSVGGraphicsElement(target)) {
-            return getSVGContentRect(target);
-        }
-        return getHTMLElementContentRect(target);
-    }
-    /**
-     * Creates rectangle with an interface of the DOMRectReadOnly.
-     * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly
-     *
-     * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.
-     * @returns {DOMRectReadOnly}
-     */
-    function createReadOnlyRect(_a) {
-        var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
-        // If DOMRectReadOnly is available use it as a prototype for the rectangle.
-        var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;
-        var rect = Object.create(Constr.prototype);
-        // Rectangle's properties are not writable and non-enumerable.
-        defineConfigurable(rect, {
-            x: x, y: y, width: width, height: height,
-            top: y,
-            right: x + width,
-            bottom: height + y,
-            left: x
-        });
-        return rect;
-    }
-    /**
-     * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.
-     * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit
-     *
-     * @param {number} x - X coordinate.
-     * @param {number} y - Y coordinate.
-     * @param {number} width - Rectangle's width.
-     * @param {number} height - Rectangle's height.
-     * @returns {DOMRectInit}
-     */
-    function createRectInit(x, y, width, height) {
-        return { x: x, y: y, width: width, height: height };
+    // Placeholder of an empty content rectangle.
+    var emptyRect = createRectInit(0, 0, 0, 0);
+    /**
+     * Converts provided string to a number.
+     *
+     * @param {number|string} value
+     * @returns {number}
+     */
+    function toFloat(value) {
+        return parseFloat(value) || 0;
+    }
+    /**
+     * Extracts borders size from provided styles.
+     *
+     * @param {CSSStyleDeclaration} styles
+     * @param {...string} positions - Borders positions (top, right, ...)
+     * @returns {number}
+     */
+    function getBordersSize(styles) {
+        var positions = [];
+        for (var _i = 1; _i < arguments.length; _i++) {
+            positions[_i - 1] = arguments[_i];
+        }
+        return positions.reduce(function (size, position) {
+            var value = styles['border-' + position + '-width'];
+            return size + toFloat(value);
+        }, 0);
+    }
+    /**
+     * Extracts paddings sizes from provided styles.
+     *
+     * @param {CSSStyleDeclaration} styles
+     * @returns {Object} Paddings box.
+     */
+    function getPaddings(styles) {
+        var positions = ['top', 'right', 'bottom', 'left'];
+        var paddings = {};
+        for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {
+            var position = positions_1[_i];
+            var value = styles['padding-' + position];
+            paddings[position] = toFloat(value);
+        }
+        return paddings;
+    }
+    /**
+     * Calculates content rectangle of provided SVG element.
+     *
+     * @param {SVGGraphicsElement} target - Element content rectangle of which needs
+     *      to be calculated.
+     * @returns {DOMRectInit}
+     */
+    function getSVGContentRect(target) {
+        var bbox = target.getBBox();
+        return createRectInit(0, 0, bbox.width, bbox.height);
+    }
+    /**
+     * Calculates content rectangle of provided HTMLElement.
+     *
+     * @param {HTMLElement} target - Element for which to calculate the content rectangle.
+     * @returns {DOMRectInit}
+     */
+    function getHTMLElementContentRect(target) {
+        // Client width & height properties can't be
+        // used exclusively as they provide rounded values.
+        var clientWidth = target.clientWidth, clientHeight = target.clientHeight;
+        // By this condition we can catch all non-replaced inline, hidden and
+        // detached elements. Though elements with width & height properties less
+        // than 0.5 will be discarded as well.
+        //
+        // Without it we would need to implement separate methods for each of
+        // those cases and it's not possible to perform a precise and performance
+        // effective test for hidden elements. E.g. even jQuery's ':visible' filter
+        // gives wrong results for elements with width & height less than 0.5.
+        if (!clientWidth && !clientHeight) {
+            return emptyRect;
+        }
+        var styles = getWindowOf(target).getComputedStyle(target);
+        var paddings = getPaddings(styles);
+        var horizPad = paddings.left + paddings.right;
+        var vertPad = paddings.top + paddings.bottom;
+        // Computed styles of width & height are being used because they are the
+        // only dimensions available to JS that contain non-rounded values. It could
+        // be possible to utilize the getBoundingClientRect if only it's data wasn't
+        // affected by CSS transformations let alone paddings, borders and scroll bars.
+        var width = toFloat(styles.width), height = toFloat(styles.height);
+        // Width & height include paddings and borders when the 'border-box' box
+        // model is applied (except for IE).
+        if (styles.boxSizing === 'border-box') {
+            // Following conditions are required to handle Internet Explorer which
+            // doesn't include paddings and borders to computed CSS dimensions.
+            //
+            // We can say that if CSS dimensions + paddings are equal to the "client"
+            // properties then it's either IE, and thus we don't need to subtract
+            // anything, or an element merely doesn't have paddings/borders styles.
+            if (Math.round(width + horizPad) !== clientWidth) {
+                width -= getBordersSize(styles, 'left', 'right') + horizPad;
+            }
+            if (Math.round(height + vertPad) !== clientHeight) {
+                height -= getBordersSize(styles, 'top', 'bottom') + vertPad;
+            }
+        }
+        // Following steps can't be applied to the document's root element as its
+        // client[Width/Height] properties represent viewport area of the window.
+        // Besides, it's as well not necessary as the <html> itself neither has
+        // rendered scroll bars nor it can be clipped.
+        if (!isDocumentElement(target)) {
+            // In some browsers (only in Firefox, actually) CSS width & height
+            // include scroll bars size which can be removed at this step as scroll
+            // bars are the only difference between rounded dimensions + paddings
+            // and "client" properties, though that is not always true in Chrome.
+            var vertScrollbar = Math.round(width + horizPad) - clientWidth;
+            var horizScrollbar = Math.round(height + vertPad) - clientHeight;
+            // Chrome has a rather weird rounding of "client" properties.
+            // E.g. for an element with content width of 314.2px it sometimes gives
+            // the client width of 315px and for the width of 314.7px it may give
+            // 314px. And it doesn't happen all the time. So just ignore this delta
+            // as a non-relevant.
+            if (Math.abs(vertScrollbar) !== 1) {
+                width -= vertScrollbar;
+            }
+            if (Math.abs(horizScrollbar) !== 1) {
+                height -= horizScrollbar;
+            }
+        }
+        return createRectInit(paddings.left, paddings.top, width, height);
+    }
+    /**
+     * Checks whether provided element is an instance of the SVGGraphicsElement.
+     *
+     * @param {Element} target - Element to be checked.
+     * @returns {boolean}
+     */
+    var isSVGGraphicsElement = (function () {
+        // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement
+        // interface.
+        if (typeof SVGGraphicsElement !== 'undefined') {
+            return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };
+        }
+        // If it's so, then check that element is at least an instance of the
+        // SVGElement and that it has the "getBBox" method.
+        // eslint-disable-next-line no-extra-parens
+        return function (target) { return (target instanceof getWindowOf(target).SVGElement &&
+            typeof target.getBBox === 'function'); };
+    })();
+    /**
+     * Checks whether provided element is a document element (<html>).
+     *
+     * @param {Element} target - Element to be checked.
+     * @returns {boolean}
+     */
+    function isDocumentElement(target) {
+        return target === getWindowOf(target).document.documentElement;
+    }
+    /**
+     * Calculates an appropriate content rectangle for provided html or svg element.
+     *
+     * @param {Element} target - Element content rectangle of which needs to be calculated.
+     * @returns {DOMRectInit}
+     */
+    function getContentRect(target) {
+        if (!isBrowser) {
+            return emptyRect;
+        }
+        if (isSVGGraphicsElement(target)) {
+            return getSVGContentRect(target);
+        }
+        return getHTMLElementContentRect(target);
+    }
+    /**
+     * Creates rectangle with an interface of the DOMRectReadOnly.
+     * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly
+     *
+     * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.
+     * @returns {DOMRectReadOnly}
+     */
+    function createReadOnlyRect(_a) {
+        var x = _a.x, y = _a.y, width = _a.width, height = _a.height;
+        // If DOMRectReadOnly is available use it as a prototype for the rectangle.
+        var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;
+        var rect = Object.create(Constr.prototype);
+        // Rectangle's properties are not writable and non-enumerable.
+        defineConfigurable(rect, {
+            x: x, y: y, width: width, height: height,
+            top: y,
+            right: x + width,
+            bottom: height + y,
+            left: x
+        });
+        return rect;
+    }
+    /**
+     * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.
+     * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit
+     *
+     * @param {number} x - X coordinate.
+     * @param {number} y - Y coordinate.
+     * @param {number} width - Rectangle's width.
+     * @param {number} height - Rectangle's height.
+     * @returns {DOMRectInit}
+     */
+    function createRectInit(x, y, width, height) {
+        return { x: x, y: y, width: width, height: height };
     }
 
-    /**
-     * Class that is responsible for computations of the content rectangle of
-     * provided DOM element and for keeping track of it's changes.
-     */
-    var ResizeObservation = /** @class */ (function () {
-        /**
-         * Creates an instance of ResizeObservation.
-         *
-         * @param {Element} target - Element to be observed.
-         */
-        function ResizeObservation(target) {
-            /**
-             * Broadcasted width of content rectangle.
-             *
-             * @type {number}
-             */
-            this.broadcastWidth = 0;
-            /**
-             * Broadcasted height of content rectangle.
-             *
-             * @type {number}
-             */
-            this.broadcastHeight = 0;
-            /**
-             * Reference to the last observed content rectangle.
-             *
-             * @private {DOMRectInit}
-             */
-            this.contentRect_ = createRectInit(0, 0, 0, 0);
-            this.target = target;
-        }
-        /**
-         * Updates content rectangle and tells whether it's width or height properties
-         * have changed since the last broadcast.
-         *
-         * @returns {boolean}
-         */
-        ResizeObservation.prototype.isActive = function () {
-            var rect = getContentRect(this.target);
-            this.contentRect_ = rect;
-            return (rect.width !== this.broadcastWidth ||
-                rect.height !== this.broadcastHeight);
-        };
-        /**
-         * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data
-         * from the corresponding properties of the last observed content rectangle.
-         *
-         * @returns {DOMRectInit} Last observed content rectangle.
-         */
-        ResizeObservation.prototype.broadcastRect = function () {
-            var rect = this.contentRect_;
-            this.broadcastWidth = rect.width;
-            this.broadcastHeight = rect.height;
-            return rect;
-        };
-        return ResizeObservation;
+    /**
+     * Class that is responsible for computations of the content rectangle of
+     * provided DOM element and for keeping track of it's changes.
+     */
+    var ResizeObservation = /** @class */ (function () {
+        /**
+         * Creates an instance of ResizeObservation.
+         *
+         * @param {Element} target - Element to be observed.
+         */
+        function ResizeObservation(target) {
+            /**
+             * Broadcasted width of content rectangle.
+             *
+             * @type {number}
+             */
+            this.broadcastWidth = 0;
+            /**
+             * Broadcasted height of content rectangle.
+             *
+             * @type {number}
+             */
+            this.broadcastHeight = 0;
+            /**
+             * Reference to the last observed content rectangle.
+             *
+             * @private {DOMRectInit}
+             */
+            this.contentRect_ = createRectInit(0, 0, 0, 0);
+            this.target = target;
+        }
+        /**
+         * Updates content rectangle and tells whether it's width or height properties
+         * have changed since the last broadcast.
+         *
+         * @returns {boolean}
+         */
+        ResizeObservation.prototype.isActive = function () {
+            var rect = getContentRect(this.target);
+            this.contentRect_ = rect;
+            return (rect.width !== this.broadcastWidth ||
+                rect.height !== this.broadcastHeight);
+        };
+        /**
+         * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data
+         * from the corresponding properties of the last observed content rectangle.
+         *
+         * @returns {DOMRectInit} Last observed content rectangle.
+         */
+        ResizeObservation.prototype.broadcastRect = function () {
+            var rect = this.contentRect_;
+            this.broadcastWidth = rect.width;
+            this.broadcastHeight = rect.height;
+            return rect;
+        };
+        return ResizeObservation;
     }());
 
-    var ResizeObserverEntry = /** @class */ (function () {
-        /**
-         * Creates an instance of ResizeObserverEntry.
-         *
-         * @param {Element} target - Element that is being observed.
-         * @param {DOMRectInit} rectInit - Data of the element's content rectangle.
-         */
-        function ResizeObserverEntry(target, rectInit) {
-            var contentRect = createReadOnlyRect(rectInit);
-            // According to the specification following properties are not writable
-            // and are also not enumerable in the native implementation.
-            //
-            // Property accessors are not being used as they'd require to define a
-            // private WeakMap storage which may cause memory leaks in browsers that
-            // don't support this type of collections.
-            defineConfigurable(this, { target: target, contentRect: contentRect });
-        }
-        return ResizeObserverEntry;
+    var ResizeObserverEntry = /** @class */ (function () {
+        /**
+         * Creates an instance of ResizeObserverEntry.
+         *
+         * @param {Element} target - Element that is being observed.
+         * @param {DOMRectInit} rectInit - Data of the element's content rectangle.
+         */
+        function ResizeObserverEntry(target, rectInit) {
+            var contentRect = createReadOnlyRect(rectInit);
+            // According to the specification following properties are not writable
+            // and are also not enumerable in the native implementation.
+            //
+            // Property accessors are not being used as they'd require to define a
+            // private WeakMap storage which may cause memory leaks in browsers that
+            // don't support this type of collections.
+            defineConfigurable(this, { target: target, contentRect: contentRect });
+        }
+        return ResizeObserverEntry;
     }());
 
-    var ResizeObserverSPI = /** @class */ (function () {
-        /**
-         * Creates a new instance of ResizeObserver.
-         *
-         * @param {ResizeObserverCallback} callback - Callback function that is invoked
-         *      when one of the observed elements changes it's content dimensions.
-         * @param {ResizeObserverController} controller - Controller instance which
-         *      is responsible for the updates of observer.
-         * @param {ResizeObserver} callbackCtx - Reference to the public
-         *      ResizeObserver instance which will be passed to callback function.
-         */
-        function ResizeObserverSPI(callback, controller, callbackCtx) {
-            /**
-             * Collection of resize observations that have detected changes in dimensions
-             * of elements.
-             *
-             * @private {Array<ResizeObservation>}
-             */
-            this.activeObservations_ = [];
-            /**
-             * Registry of the ResizeObservation instances.
-             *
-             * @private {Map<Element, ResizeObservation>}
-             */
-            this.observations_ = new MapShim();
-            if (typeof callback !== 'function') {
-                throw new TypeError('The callback provided as parameter 1 is not a function.');
-            }
-            this.callback_ = callback;
-            this.controller_ = controller;
-            this.callbackCtx_ = callbackCtx;
-        }
-        /**
-         * Starts observing provided element.
-         *
-         * @param {Element} target - Element to be observed.
-         * @returns {void}
-         */
-        ResizeObserverSPI.prototype.observe = function (target) {
-            if (!arguments.length) {
-                throw new TypeError('1 argument required, but only 0 present.');
-            }
-            // Do nothing if current environment doesn't have the Element interface.
-            if (typeof Element === 'undefined' || !(Element instanceof Object)) {
-                return;
-            }
-            if (!(target instanceof getWindowOf(target).Element)) {
-                throw new TypeError('parameter 1 is not of type "Element".');
-            }
-            var observations = this.observations_;
-            // Do nothing if element is already being observed.
-            if (observations.has(target)) {
-                return;
-            }
-            observations.set(target, new ResizeObservation(target));
-            this.controller_.addObserver(this);
-            // Force the update of observations.
-            this.controller_.refresh();
-        };
-        /**
-         * Stops observing provided element.
-         *
-         * @param {Element} target - Element to stop observing.
-         * @returns {void}
-         */
-        ResizeObserverSPI.prototype.unobserve = function (target) {
-            if (!arguments.length) {
-                throw new TypeError('1 argument required, but only 0 present.');
-            }
-            // Do nothing if current environment doesn't have the Element interface.
-            if (typeof Element === 'undefined' || !(Element instanceof Object)) {
-                return;
-            }
-            if (!(target instanceof getWindowOf(target).Element)) {
-                throw new TypeError('parameter 1 is not of type "Element".');
-            }
-            var observations = this.observations_;
-            // Do nothing if element is not being observed.
-            if (!observations.has(target)) {
-                return;
-            }
-            observations.delete(target);
-            if (!observations.size) {
-                this.controller_.removeObserver(this);
-            }
-        };
-        /**
-         * Stops observing all elements.
-         *
-         * @returns {void}
-         */
-        ResizeObserverSPI.prototype.disconnect = function () {
-            this.clearActive();
-            this.observations_.clear();
-            this.controller_.removeObserver(this);
-        };
-        /**
-         * Collects observation instances the associated element of which has changed
-         * it's content rectangle.
-         *
-         * @returns {void}
-         */
-        ResizeObserverSPI.prototype.gatherActive = function () {
-            var _this = this;
-            this.clearActive();
-            this.observations_.forEach(function (observation) {
-                if (observation.isActive()) {
-                    _this.activeObservations_.push(observation);
-                }
-            });
-        };
-        /**
-         * Invokes initial callback function with a list of ResizeObserverEntry
-         * instances collected from active resize observations.
-         *
-         * @returns {void}
-         */
-        ResizeObserverSPI.prototype.broadcastActive = function () {
-            // Do nothing if observer doesn't have active observations.
-            if (!this.hasActive()) {
-                return;
-            }
-            var ctx = this.callbackCtx_;
-            // Create ResizeObserverEntry instance for every active observation.
-            var entries = this.activeObservations_.map(function (observation) {
-                return new ResizeObserverEntry(observation.target, observation.broadcastRect());
-            });
-            this.callback_.call(ctx, entries, ctx);
-            this.clearActive();
-        };
-        /**
-         * Clears the collection of active observations.
-         *
-         * @returns {void}
-         */
-        ResizeObserverSPI.prototype.clearActive = function () {
-            this.activeObservations_.splice(0);
-        };
-        /**
-         * Tells whether observer has active observations.
-         *
-         * @returns {boolean}
-         */
-        ResizeObserverSPI.prototype.hasActive = function () {
-            return this.activeObservations_.length > 0;
-        };
-        return ResizeObserverSPI;
+    var ResizeObserverSPI = /** @class */ (function () {
+        /**
+         * Creates a new instance of ResizeObserver.
+         *
+         * @param {ResizeObserverCallback} callback - Callback function that is invoked
+         *      when one of the observed elements changes it's content dimensions.
+         * @param {ResizeObserverController} controller - Controller instance which
+         *      is responsible for the updates of observer.
+         * @param {ResizeObserver} callbackCtx - Reference to the public
+         *      ResizeObserver instance which will be passed to callback function.
+         */
+        function ResizeObserverSPI(callback, controller, callbackCtx) {
+            /**
+             * Collection of resize observations that have detected changes in dimensions
+             * of elements.
+             *
+             * @private {Array<ResizeObservation>}
+             */
+            this.activeObservations_ = [];
+            /**
+             * Registry of the ResizeObservation instances.
+             *
+             * @private {Map<Element, ResizeObservation>}
+             */
+            this.observations_ = new MapShim();
+            if (typeof callback !== 'function') {
+                throw new TypeError('The callback provided as parameter 1 is not a function.');
+            }
+            this.callback_ = callback;
+            this.controller_ = controller;
+            this.callbackCtx_ = callbackCtx;
+        }
+        /**
+         * Starts observing provided element.
+         *
+         * @param {Element} target - Element to be observed.
+         * @returns {void}
+         */
+        ResizeObserverSPI.prototype.observe = function (target) {
+            if (!arguments.length) {
+                throw new TypeError('1 argument required, but only 0 present.');
+            }
+            // Do nothing if current environment doesn't have the Element interface.
+            if (typeof Element === 'undefined' || !(Element instanceof Object)) {
+                return;
+            }
+            if (!(target instanceof getWindowOf(target).Element)) {
+                throw new TypeError('parameter 1 is not of type "Element".');
+            }
+            var observations = this.observations_;
+            // Do nothing if element is already being observed.
+            if (observations.has(target)) {
+                return;
+            }
+            observations.set(target, new ResizeObservation(target));
+            this.controller_.addObserver(this);
+            // Force the update of observations.
+            this.controller_.refresh();
+        };
+        /**
+         * Stops observing provided element.
+         *
+         * @param {Element} target - Element to stop observing.
+         * @returns {void}
+         */
+        ResizeObserverSPI.prototype.unobserve = function (target) {
+            if (!arguments.length) {
+                throw new TypeError('1 argument required, but only 0 present.');
+            }
+            // Do nothing if current environment doesn't have the Element interface.
+            if (typeof Element === 'undefined' || !(Element instanceof Object)) {
+                return;
+            }
+            if (!(target instanceof getWindowOf(target).Element)) {
+                throw new TypeError('parameter 1 is not of type "Element".');
+            }
+            var observations = this.observations_;
+            // Do nothing if element is not being observed.
+            if (!observations.has(target)) {
+                return;
+            }
+            observations.delete(target);
+            if (!observations.size) {
+                this.controller_.removeObserver(this);
+            }
+        };
+        /**
+         * Stops observing all elements.
+         *
+         * @returns {void}
+         */
+        ResizeObserverSPI.prototype.disconnect = function () {
+            this.clearActive();
+            this.observations_.clear();
+            this.controller_.removeObserver(this);
+        };
+        /**
+         * Collects observation instances the associated element of which has changed
+         * it's content rectangle.
+         *
+         * @returns {void}
+         */
+        ResizeObserverSPI.prototype.gatherActive = function () {
+            var _this = this;
+            this.clearActive();
+            this.observations_.forEach(function (observation) {
+                if (observation.isActive()) {
+                    _this.activeObservations_.push(observation);
+                }
+            });
+        };
+        /**
+         * Invokes initial callback function with a list of ResizeObserverEntry
+         * instances collected from active resize observations.
+         *
+         * @returns {void}
+         */
+        ResizeObserverSPI.prototype.broadcastActive = function () {
+            // Do nothing if observer doesn't have active observations.
+            if (!this.hasActive()) {
+                return;
+            }
+            var ctx = this.callbackCtx_;
+            // Create ResizeObserverEntry instance for every active observation.
+            var entries = this.activeObservations_.map(function (observation) {
+                return new ResizeObserverEntry(observation.target, observation.broadcastRect());
+            });
+            this.callback_.call(ctx, entries, ctx);
+            this.clearActive();
+        };
+        /**
+         * Clears the collection of active observations.
+         *
+         * @returns {void}
+         */
+        ResizeObserverSPI.prototype.clearActive = function () {
+            this.activeObservations_.splice(0);
+        };
+        /**
+         * Tells whether observer has active observations.
+         *
+         * @returns {boolean}
+         */
+        ResizeObserverSPI.prototype.hasActive = function () {
+            return this.activeObservations_.length > 0;
+        };
+        return ResizeObserverSPI;
     }());
 
-    // Registry of internal observers. If WeakMap is not available use current shim
-    // for the Map collection as it has all required methods and because WeakMap
-    // can't be fully polyfilled anyway.
-    var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();
-    /**
-     * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation
-     * exposing only those methods and properties that are defined in the spec.
-     */
-    var ResizeObserver = /** @class */ (function () {
-        /**
-         * Creates a new instance of ResizeObserver.
-         *
-         * @param {ResizeObserverCallback} callback - Callback that is invoked when
-         *      dimensions of the observed elements change.
-         */
-        function ResizeObserver(callback) {
-            if (!(this instanceof ResizeObserver)) {
-                throw new TypeError('Cannot call a class as a function.');
-            }
-            if (!arguments.length) {
-                throw new TypeError('1 argument required, but only 0 present.');
-            }
-            var controller = ResizeObserverController.getInstance();
-            var observer = new ResizeObserverSPI(callback, controller, this);
-            observers.set(this, observer);
-        }
-        return ResizeObserver;
-    }());
-    // Expose public methods of ResizeObserver.
-    [
-        'observe',
-        'unobserve',
-        'disconnect'
-    ].forEach(function (method) {
-        ResizeObserver.prototype[method] = function () {
-            var _a;
-            return (_a = observers.get(this))[method].apply(_a, arguments);
-        };
+    // Registry of internal observers. If WeakMap is not available use current shim
+    // for the Map collection as it has all required methods and because WeakMap
+    // can't be fully polyfilled anyway.
+    var observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();
+    /**
+     * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation
+     * exposing only those methods and properties that are defined in the spec.
+     */
+    var ResizeObserver = /** @class */ (function () {
+        /**
+         * Creates a new instance of ResizeObserver.
+         *
+         * @param {ResizeObserverCallback} callback - Callback that is invoked when
+         *      dimensions of the observed elements change.
+         */
+        function ResizeObserver(callback) {
+            if (!(this instanceof ResizeObserver)) {
+                throw new TypeError('Cannot call a class as a function.');
+            }
+            if (!arguments.length) {
+                throw new TypeError('1 argument required, but only 0 present.');
+            }
+            var controller = ResizeObserverController.getInstance();
+            var observer = new ResizeObserverSPI(callback, controller, this);
+            observers.set(this, observer);
+        }
+        return ResizeObserver;
+    }());
+    // Expose public methods of ResizeObserver.
+    [
+        'observe',
+        'unobserve',
+        'disconnect'
+    ].forEach(function (method) {
+        ResizeObserver.prototype[method] = function () {
+            var _a;
+            return (_a = observers.get(this))[method].apply(_a, arguments);
+        };
     });
 
-    var index = (function () {
-        // Export existing implementation if available.
-        if (typeof global$1.ResizeObserver !== 'undefined') {
-            return global$1.ResizeObserver;
-        }
-        return ResizeObserver;
+    var index = (function () {
+        // Export existing implementation if available.
+        if (typeof global$1.ResizeObserver !== 'undefined') {
+            return global$1.ResizeObserver;
+        }
+        return ResizeObserver;
     })();
 
     return index;
@@ -3437,7 +3437,7 @@ contextMenu.albumDrop(data.substring(6),targetId,ev);}};/**
  * @property {function} printFilesizeLocalized
  * @property {function} printDateTime
  * @property {function} printMonthYear
- */lychee.locale={USERNAME:"Username",PASSWORD:"Password",ENTER:"Enter",CANCEL:"Cancel",SIGN_IN:"Sign In",CLOSE:"Close",SETTINGS:"Settings",SEARCH:"Search …",MORE:"More",DEFAULT:"Default",GALLERY:"Gallery",USERS:"Users",CREATE:"Create",REMOVE:"Remove",SHARE:"Share",U2F:"U2F",NOTIFICATIONS:"Notifications",SHARING:"Sharing",CHANGE_LOGIN:"Change Login",CHANGE_SORTING:"Change Sorting",SET_DROPBOX:"Set Dropbox",ABOUT_LYCHEE:"About Lychee",DIAGNOSTICS:"Diagnostics",DIAGNOSTICS_GET_SIZE:"Request space usage",LOGS:"Show Logs",SIGN_OUT:"Sign Out",UPDATE_AVAILABLE:"Update available!",MIGRATION_AVAILABLE:"Migration available!",CHECK_FOR_UPDATE:"Check for updates",DEFAULT_LICENSE:"Default license for new uploads:",SET_LICENSE:"Set License",SET_OVERLAY_TYPE:"Set Overlay",SET_ALBUM_DECORATION:"Set album decorations",SET_MAP_PROVIDER:"Set OpenStreetMap tiles provider",FULL_SETTINGS:"Full Settings",UPDATE:"Update",RESET:"Reset",DISABLE_TOKEN_TOOLTIP:"Disable",ENABLE_TOKEN:"Enable API token",DISABLED_TOKEN_STATUS_MSG:"Disabled",TOKEN_BUTTON:"API Token ...",TOKEN_NOT_AVAILABLE:"You have already viewed this token.",TOKEN_WAIT:"Wait ...",SMART_ALBUMS:"Smart albums",SHARED_ALBUMS:"Shared albums",ALBUMS:"Albums",PHOTOS:"Pictures",SEARCH_RESULTS:"Search results",RENAME:"Rename",RENAME_ALL:"Rename Selected",MERGE:"Merge",MERGE_ALL:"Merge Selected",MAKE_PUBLIC:"Make Public",SHARE_ALBUM:"Share Album",SHARE_PHOTO:"Share Photo",VISIBILITY_ALBUM:"Album Visibility",VISIBILITY_PHOTO:"Photo Visibility",DOWNLOAD_ALBUM:"Download Album",ABOUT_ALBUM:"About Album",DELETE_ALBUM:"Delete Album",MOVE_ALBUM:"Move Album",FULLSCREEN_ENTER:"Enter Fullscreen",FULLSCREEN_EXIT:"Exit Fullscreen",SHARING_ALBUM_USERS:"Share this album with users",WAIT_FETCH_DATA:"Please wait while we get the data …",SHARING_ALBUM_USERS_NO_USERS:"There are no users to share the album with",SHARING_ALBUM_USERS_LONG_MESSAGE:"Select the users to share this album with",DELETE_ALBUM_QUESTION:"Delete Album and Photos",KEEP_ALBUM:"Keep Album",DELETE_ALBUM_CONFIRMATION:"Are you sure you want to delete the album “%s” and all of the photos it contains? This action can’t be undone!",DELETE_TAG_ALBUM_QUESTION:"Delete Album",DELETE_TAG_ALBUM_CONFIRMATION:"Are you sure you want to delete the album “%s” (any photos inside will not be deleted)? This action can’t be undone!",DELETE_ALBUMS_QUESTION:"Delete Albums and Photos",KEEP_ALBUMS:"Keep Albums",DELETE_ALBUMS_CONFIRMATION:"Are you sure you want to delete all %d selected albums and all of the photos they contain? This action can’t be undone!",DELETE_UNSORTED_CONFIRM:"Are you sure you want to delete all photos from “Unsorted”? This action can’t be undone!",CLEAR_UNSORTED:"Clear Unsorted",KEEP_UNSORTED:"Keep Unsorted",EDIT_SHARING:"Edit Sharing",MAKE_PRIVATE:"Make Private",CLOSE_ALBUM:"Close Album",CLOSE_PHOTO:"Close Photo",CLOSE_MAP:"Close Map",ADD:"Add",MOVE:"Move",MOVE_ALL:"Move Selected",DUPLICATE:"Duplicate",DUPLICATE_ALL:"Duplicate Selected",COPY_TO:"Copy to …",COPY_ALL_TO:"Copy Selected to …",DELETE:"Delete",SAVE:"Save",DELETE_ALL:"Delete Selected",DOWNLOAD:"Download",DOWNLOAD_ALL:"Download Selected",UPLOAD_PHOTO:"Upload Photo",IMPORT_LINK:"Import from Link",IMPORT_DROPBOX:"Import from Dropbox",IMPORT_SERVER:"Import from Server",NEW_ALBUM:"New Album",NEW_TAG_ALBUM:"New Tag Album",UPLOAD_TRACK:"Upload track",DELETE_TRACK:"Delete track",TITLE_NEW_ALBUM:"Enter a title for the new album:",UNTITLED:"Untitled",UNSORTED:"Unsorted",STARRED:"Starred",RECENT:"Recent",PUBLIC:"Public",ON_THIS_DAY:"On This Day",NUM_PHOTOS:"Photos",CREATE_ALBUM:"Create Album",CREATE_TAG_ALBUM:"Create Tag Album",STAR_PHOTO:"Star Photo",STAR:"Star",UNSTAR:"Unstar",STAR_ALL:"Star Selected",UNSTAR_ALL:"Unstar Selected",TAG:"Tag",TAG_ALL:"Tag Selected",UNSTAR_PHOTO:"Unstar Photo",SET_COVER:"Set Album Cover",REMOVE_COVER:"Remove Album Cover",FULL_PHOTO:"Open Original",ABOUT_PHOTO:"About Photo",DISPLAY_FULL_MAP:"Map",DIRECT_LINK:"Direct Link",DIRECT_LINKS:"Direct Links",QR_CODE:"QR Code",ALBUM_ABOUT:"About",ALBUM_BASICS:"Basics",ALBUM_TITLE:"Title",ALBUM_NEW_TITLE:"Enter a new title for this album:",ALBUMS_NEW_TITLE:"Enter a title for all %d selected albums:",ALBUM_SET_TITLE:"Set Title",ALBUM_DESCRIPTION:"Description",ALBUM_SHOW_TAGS:"Tags to show",ALBUM_NEW_DESCRIPTION:"Enter a new description for this album:",ALBUM_SET_DESCRIPTION:"Set Description",ALBUM_NEW_SHOWTAGS:"Enter tags of photos that will be visible in this album:",ALBUM_SET_SHOWTAGS:"Set tags to show",ALBUM_ALBUM:"Album",ALBUM_CREATED:"Created",ALBUM_IMAGES:"Images",ALBUM_VIDEOS:"Videos",ALBUM_SUBALBUMS:"Subalbums",ALBUM_SHARING:"Share",ALBUM_SHR_YES:"YES",ALBUM_SHR_NO:"No",ALBUM_PUBLIC:"Public",ALBUM_PUBLIC_EXPL:"Anonymous users can access this album, subject to the restrictions below.",ALBUM_FULL:"Original",ALBUM_FULL_EXPL:"Anonymous users can behold full-resolution photos.",ALBUM_HIDDEN:"Hidden",ALBUM_HIDDEN_EXPL:"Anonymous users need a direct link to access this album.",ALBUM_MARK_NSFW:"Mark album as sensitive",ALBUM_UNMARK_NSFW:"Unmark album as sensitive",ALBUM_NSFW:"Sensitive",ALBUM_NSFW_EXPL:"Album contains sensitive content.",ALBUM_DOWNLOADABLE:"Downloadable",ALBUM_DOWNLOADABLE_EXPL:"Anonymous users can download this album.",ALBUM_SHARE_BUTTON_VISIBLE:"Share button is visible",ALBUM_SHARE_BUTTON_VISIBLE_EXPL:"Anonymous users can see social media sharing links.",ALBUM_PASSWORD:"Password",ALBUM_PASSWORD_PROT:"Password protected",ALBUM_PASSWORD_PROT_EXPL:"Anonymous users need a shared password to access this album.",ALBUM_PASSWORD_REQUIRED:"This album is protected by a password. Enter the password below to view the photos of this album:",ALBUM_MERGE:"Are you sure you want to merge the album “%1$s” into the album “%2$s”?",ALBUMS_MERGE:"Are you sure you want to merge all selected albums into the album “%s”?",MERGE_ALBUM:"Merge Albums",DONT_MERGE:"Don’t Merge",ALBUM_MOVE:"Are you sure you want to move the album “%1$s” into the album “%2$s”?",ALBUMS_MOVE:"Are you sure you want to move all selected albums into the album “%s”?",MOVE_ALBUMS:"Move Albums",NOT_MOVE_ALBUMS:"Don’t Move",ROOT:"Albums",ALBUM_REUSE:"Reuse",ALBUM_LICENSE:"License",ALBUM_SET_LICENSE:"Set License",ALBUM_LICENSE_HELP:"Need help choosing?",ALBUM_LICENSE_NONE:"None",ALBUM_RESERVED:"All Rights Reserved",ALBUM_SET_ORDER:"Set Order",ALBUM_ORDERING:"Order by",ALBUM_OWNER:"Owner",PHOTO_ABOUT:"About",PHOTO_BASICS:"Basics",PHOTO_TITLE:"Title",PHOTO_NEW_TITLE:"Enter a new title for this photo:",PHOTO_SET_TITLE:"Set Title",PHOTO_UPLOADED:"Uploaded",PHOTO_DESCRIPTION:"Description",PHOTO_NEW_DESCRIPTION:"Enter a new description for this photo:",PHOTO_SET_DESCRIPTION:"Set Description",PHOTO_NEW_LICENSE:"Add a License",PHOTO_SET_LICENSE:"Set License",PHOTO_LICENSE:"License",PHOTO_LICENSE_HELP:"Need help choosing?",PHOTO_REUSE:"Reuse",PHOTO_LICENSE_NONE:"None",PHOTO_RESERVED:"All Rights Reserved",PHOTO_LATITUDE:"Latitude",PHOTO_LONGITUDE:"Longitude",PHOTO_ALTITUDE:"Altitude",PHOTO_IMGDIRECTION:"Direction",PHOTO_LOCATION:"Location",PHOTO_IMAGE:"Image",PHOTO_VIDEO:"Video",PHOTO_SIZE:"Size",PHOTO_FORMAT:"Format",PHOTO_RESOLUTION:"Resolution",PHOTO_DURATION:"Duration",PHOTO_FPS:"Frame rate",PHOTO_TAGS:"Tags",PHOTO_NOTAGS:"No Tags",PHOTO_NEW_TAGS:"Enter your tags for this photo. You can add multiple tags by separating them with a comma:",PHOTOS_NEW_TAGS:"Enter your tags for all %d selected photos. Existing tags will be overwritten. You can add multiple tags by separating them with a comma:",PHOTO_SET_TAGS:"Set Tags",TAGS_OVERRIDE_INFO:"If this is unchecked, the tags will be added to the existing tags of the photo.",PHOTO_CAMERA:"Camera",PHOTO_CAPTURED:"Captured",PHOTO_MAKE:"Make",PHOTO_TYPE:"Type/Model",PHOTO_LENS:"Lens",PHOTO_SHUTTER:"Shutter Speed",PHOTO_APERTURE:"Aperture",PHOTO_FOCAL:"Focal Length",PHOTO_ISO:"ISO %s",PHOTO_SHARING:"Sharing",PHOTO_SHR_PUBLIC:"Public",PHOTO_SHR_ALB:"Yes (Album)",PHOTO_SHR_PHT:"Yes (Photo)",PHOTO_SHR_NO:"No",PHOTO_DELETE:"Delete Photo",PHOTO_KEEP:"Keep Photo",PHOTO_DELETE_CONFIRMATION:"Are you sure you want to delete the photo “%s”? This action can’t be undone!",PHOTO_DELETE_ALL:"Are you sure you want to delete all %d selected photo? This action can’t be undone!",PHOTOS_NEW_TITLE:"Enter a title for all %d selected photos:",PHOTO_MAKE_PRIVATE_ALBUM:"This photo is located in a public album. To make this photo private or public, edit the visibility of the associated album.",PHOTO_SHOW_ALBUM:"Show Album",PHOTO_PUBLIC:"Public",PHOTO_PUBLIC_EXPL:"Anonymous users can view this photo, subject to the restrictions below.",PHOTO_FULL:"Original",PHOTO_FULL_EXPL:"Anonymous users can behold full-resolution photo.",PHOTO_HIDDEN:"Hidden",PHOTO_HIDDEN_EXPL:"Anonymous users need a direct link to view this photo.",PHOTO_DOWNLOADABLE:"Downloadable",PHOTO_DOWNLOADABLE_EXPL:"Anonymous users may download this photo.",PHOTO_SHARE_BUTTON_VISIBLE:"Share button is visible",PHOTO_SHARE_BUTTON_VISIBLE_EXPL:"Anonymous users can see social media sharing links.",PHOTO_PASSWORD_PROT:"Password protected",PHOTO_PASSWORD_PROT_EXPL:"Anonymous users need a shared password to view this photo.",PHOTO_EDIT_SHARING_TEXT:"The sharing properties of this photo will be changed to the following:",PHOTO_NO_EDIT_SHARING_TEXT:"Because this photo is located in a public album, it inherits that album’s visibility settings.  Its current visibility is shown below for informational purposes only.",PHOTO_EDIT_GLOBAL_SHARING_TEXT:"The visibility of this photo can be fine-tuned using global Lychee settings. Its current visibility is shown below for informational purposes only.",PHOTO_NEW_CREATED_AT:"Enter the upload date for this photo. mm/dd/yyyy, hh:mm [am/pm]",PHOTO_SET_CREATED_AT:"Set upload date",LOADING:"Loading",ERROR:"Error",ERROR_TEXT:"Whoops, it looks like something went wrong. Please reload the site and try again!",ERROR_UNKNOWN:"Something unexpected happened. Please try again and check your installation and server. Take a look at the readme for more information.",ERROR_MAP_DEACTIVATED:"Map functionality has been deactivated under settings.",ERROR_SEARCH_DEACTIVATED:"Search functionality has been deactivated under settings.",SUCCESS:"OK",RETRY:"Retry",OVERRIDE:"Override",SETTINGS_SUCCESS_LOGIN:"Login Info updated.",SETTINGS_SUCCESS_SORT:"Sorting order updated.",SETTINGS_SUCCESS_DROPBOX:"Dropbox Key updated.",SETTINGS_SUCCESS_LANG:"Language updated",SETTINGS_SUCCESS_LAYOUT:"Layout updated",SETTINGS_SUCCESS_IMAGE_OVERLAY:"Image overlay setting updated",SETTINGS_SUCCESS_ALBUM_DECORATION:"Album decorations updated",SETTINGS_SUCCESS_PUBLIC_SEARCH:"Public search updated",SETTINGS_SUCCESS_LICENSE:"Default license updated",SETTINGS_SUCCESS_MAP_DISPLAY:"Map display settings updated",SETTINGS_SUCCESS_MAP_DISPLAY_PUBLIC:"Map display settings for public albums updated",SETTINGS_SUCCESS_MAP_PROVIDER:"Map provider settings updated",SETTINGS_SUCCESS_CSS:"CSS updated",SETTINGS_SUCCESS_JS:"JS updated",SETTINGS_SUCCESS_UPDATE:"Settings updated successfully",SETTINGS_DROPBOX_KEY:"Dropbox API Key",SETTINGS_ADVANCED_WARNING_EXPL:"Changing these advanced settings can be harmful to the stability, security and performance of this application. You should only modify them if you are sure of what you are doing.",SETTINGS_ADVANCED_SAVE:"Save my modifications, I accept the risk!",U2F_NOT_SUPPORTED:"U2F not supported. Sorry.",U2F_NOT_SECURE:"Environment not secured. U2F not available.",U2F_REGISTER_KEY:"Register new device.",U2F_REGISTRATION_SUCCESS:"Registration successful!",U2F_AUTHENTIFICATION_SUCCESS:"Authentication successful!",U2F_CREDENTIALS:"Credentials",U2F_CREDENTIALS_DELETED:"Credentials deleted!",NEW_PHOTOS_NOTIFICATION:"Send new photos notification emails.",SETTINGS_SUCCESS_NEW_PHOTOS_NOTIFICATION:"New photos notification updated",USER_EMAIL_INSTRUCTION:"Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.",LOGIN_USERNAME:"New Username",LOGIN_PASSWORD:"New Password",LOGIN_PASSWORD_CONFIRM:"Confirm Password",PASSWORD_TITLE:"Enter your current password:",PASSWORD_CURRENT:"Current Password",PASSWORD_TEXT:"Your credentials will be changed to the following:",PASSWORD_CHANGE:"Change Login",EDIT_SHARING_TITLE:"Edit Sharing",EDIT_SHARING_TEXT:"The sharing properties of this album will be changed to the following:",SHARE_ALBUM_TEXT:"This album will be shared with the following properties:",SORT_DIALOG_ATTRIBUTE_LABEL:"Attribute",SORT_DIALOG_ORDER_LABEL:"Order",SORT_ALBUM_BY:"Sort albums by %1$s in an %2$s order.",SORT_ALBUM_SELECT_1:"Creation Time",SORT_ALBUM_SELECT_2:"Title",SORT_ALBUM_SELECT_3:"Description",SORT_ALBUM_SELECT_5:"Latest Take Date",SORT_ALBUM_SELECT_6:"Oldest Take Date",SORT_PHOTO_BY:"Sort photos by %1$s in an %2$s order.",SORT_PHOTO_SELECT_1:"Upload Time",SORT_PHOTO_SELECT_2:"Take Date",SORT_PHOTO_SELECT_3:"Title",SORT_PHOTO_SELECT_4:"Description",SORT_PHOTO_SELECT_5:"Public",SORT_PHOTO_SELECT_6:"Star",SORT_PHOTO_SELECT_7:"Photo Format",SORT_ASCENDING:"Ascending",SORT_DESCENDING:"Descending",SORT_CHANGE:"Change Sorting",DROPBOX_TITLE:"Set Dropbox Key",DROPBOX_TEXT:"In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/apps/create'>their website</a>. Generate yourself a personal key and enter it below:",LANG_TEXT:"Change Lychee language for:",LANG_TITLE:"Change Language",SETTING_RECENT_PUBLIC_TEXT:'Make "Recent" smart album accessible to anonymous users',SETTING_STARRED_PUBLIC_TEXT:'Make "Starred" smart album accessible to anonymous users',SETTING_ONTHISDAY_PUBLIC_TEXT:'Make "On This Day" smart album accessible to anonymous users',CSS_TEXT:"Personalize CSS:",CSS_TITLE:"Change CSS",JS_TEXT:"Custom JS:",JS_TITLE:"Change JS",PUBLIC_SEARCH_TEXT:"Public search allowed:",OVERLAY_TYPE:"Photo overlay:",OVERLAY_NONE:"None",OVERLAY_EXIF:"EXIF data",OVERLAY_DESCRIPTION:"Description",OVERLAY_DATE:"Date taken",ALBUM_DECORATION:"Album decorations:",ALBUM_DECORATION_NONE:"No badges",ALBUM_DECORATION_ORIGINAL:"Sub-album badge, no count",ALBUM_DECORATION_ALBUM:"Sub-album badge with count",ALBUM_DECORATION_PHOTO:"Photo badge with count",ALBUM_DECORATION_ALL:"Sub-album and photo badges with counts",ALBUM_DECORATION_ORIENTATION:"Orientation of album decorations:",ALBUM_DECORATION_ORIENTATION_ROW:"Horizontal decorations (photos, albums)",ALBUM_DECORATION_ORIENTATION_ROW_REVERSE:"Horizontal decorations (albums, photos)",ALBUM_DECORATION_ORIENTATION_COLUMN:"Vertical decorations (top photos, albums)",ALBUM_DECORATION_ORIENTATION_COLUMN_REVERSE:"Vertical decorations (top albums, photos)",MAP_DISPLAY_TEXT:"Enable maps (provided by OpenStreetMap):",MAP_DISPLAY_PUBLIC_TEXT:"Enable maps for public albums (provided by OpenStreetMap):",MAP_PROVIDER:"Provider of OpenStreetMap tiles:",MAP_PROVIDER_WIKIMEDIA:"Wikimedia",MAP_PROVIDER_OSM_ORG:"OpenStreetMap.org (no HiDPI)",MAP_PROVIDER_OSM_DE:"OpenStreetMap.de (no HiDPI)",MAP_PROVIDER_OSM_FR:"OpenStreetMap.fr (no HiDPI)",MAP_PROVIDER_RRZE:"University of Erlangen, Germany (only HiDPI)",MAP_INCLUDE_SUBALBUMS_TEXT:"Include photos of subalbums on map:",LOCATION_DECODING:"Decode GPS data into location name",LOCATION_SHOW:"Show location name",LOCATION_SHOW_PUBLIC:"Show location name for public mode",LAYOUT_TYPE:"Layout of photos:",LAYOUT_SQUARES:"Square thumbnails",LAYOUT_JUSTIFIED:"With aspect, justified",LAYOUT_UNJUSTIFIED:"With aspect, unjustified",SET_LAYOUT:"Change layout",NSFW_VISIBLE_TEXT_1:"Make Sensitive albums visible by default.",NSFW_VISIBLE_TEXT_2:"If the album is public, it is still accessible, just hidden from the view and <b>can be revealed by pressing <kbd>H</kbd></b>.",SETTINGS_SUCCESS_NSFW_VISIBLE:"Default sensitive album visibility updated with success.",NSFW_BANNER:"<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>",VIEW_NO_RESULT:"No results",VIEW_NO_PUBLIC_ALBUMS:"No public albums",VIEW_NO_CONFIGURATION:"No configuration",VIEW_PHOTO_NOT_FOUND:"Photo not found",NO_TAGS:"No Tags",UPLOAD_MANAGE_NEW_PHOTOS:"You can now manage your new photo(s).",UPLOAD_COMPLETE:"Upload complete",UPLOAD_COMPLETE_FAILED:"Failed to upload one or more photos.",UPLOAD_IMPORTING:"Importing",UPLOAD_IMPORTING_URL:"Importing URL",UPLOAD_UPLOADING:"Uploading",UPLOAD_FINISHED:"Finished",UPLOAD_PROCESSING:"Processing",UPLOAD_FAILED:"Failed",UPLOAD_FAILED_ERROR:"Upload failed. The server returned an error!",UPLOAD_FAILED_WARNING:"Upload failed. The server returned a warning!",UPLOAD_CANCELLED:"Cancelled",UPLOAD_SKIPPED:"Skipped",UPLOAD_UPDATED:"Updated",UPLOAD_GENERAL:"General",UPLOAD_IMPORT_SKIPPED_DUPLICATE:"This photo has been skipped because it’s already in your library.",UPLOAD_IMPORT_RESYNCED_DUPLICATE:"This photo has been skipped because it’s already in your library, but its metadata has been updated.",UPLOAD_ERROR_CONSOLE:"Please take a look at the console of your browser for further details.",UPLOAD_UNKNOWN:"Server returned an unknown response. Please take a look at the console of your browser for further details.",UPLOAD_ERROR_UNKNOWN:"Upload failed. The server returned an unknown error!",UPLOAD_ERROR_POSTSIZE:"Upload failed. The PHP post_max_size may be too small! Otherwise check the FAQ.",UPLOAD_ERROR_FILESIZE:"Upload failed. The PHP upload_max_filesize may be too small! Otherwise check the FAQ.",UPLOAD_IN_PROGRESS:"Lychee is currently uploading!",UPLOAD_IMPORT_WARN_ERR:"The import has been finished, but returned warnings or errors. Please take a look at the log (Settings -> Show Log) for further details.",UPLOAD_IMPORT_COMPLETE:"Import complete",UPLOAD_IMPORT_INSTR:"Please enter the direct link to a photo to import it:",UPLOAD_IMPORT:"Import",UPLOAD_IMPORT_SERVER:"Importing from server",UPLOAD_IMPORT_SERVER_FOLD:"Folder empty or no readable files to process. Please take a look at the log (Settings -> Show Log) for further details.",UPLOAD_IMPORT_SERVER_INSTR:"Import all photos, folders, and sub-folders located in the folders with the following absolute paths (on the server). Paths are space-separated, use \\ to escape a space in a path.",UPLOAD_ABSOLUTE_PATH:"Absolute path to directories, space separated",UPLOAD_IMPORT_SERVER_EMPT:"Could not start import because the folder was empty!",UPLOAD_IMPORT_DELETE_ORIGINALS:"Delete originals",UPLOAD_IMPORT_DELETE_ORIGINALS_EXPL:"Original files will be deleted after the import when possible.",UPLOAD_IMPORT_VIA_SYMLINK:"Symbolic links",UPLOAD_IMPORT_VIA_SYMLINK_EXPL:"Import files using symbolic links to originals.",UPLOAD_IMPORT_SKIP_DUPLICATES:"Skip duplicates",UPLOAD_IMPORT_SKIP_DUPLICATES_EXPL:"Existing media files are skipped.",UPLOAD_IMPORT_RESYNC_METADATA:"Re-sync metadata",UPLOAD_IMPORT_RESYNC_METADATA_EXPL:"Update metadata of existing media files.",UPLOAD_IMPORT_LOW_MEMORY_EXPL:"The import process on the server is approaching the memory limit and may end up being terminated prematurely.",UPLOAD_WARNING:"Warning",UPLOAD_IMPORT_NOT_A_DIRECTORY:"The given path is not a readable directory!",UPLOAD_IMPORT_PATH_RESERVED:"The given path is a reserved path of Lychee!",UPLOAD_IMPORT_FAILED:"Could not import the file!",UPLOAD_IMPORT_UNSUPPORTED:"Unsupported file type!",UPLOAD_IMPORT_CANCELLED:"Import cancelled",ABOUT_SUBTITLE:"Self-hosted photo-management done right",ABOUT_DESCRIPTION:"<a target='_blank' href='%s'>Lychee</a> is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.",FOOTER_COPYRIGHT:"All images on this website are subject to copyright by %1$s © %2$s",HOSTED_WITH_LYCHEE:"Hosted with Lychee",URL_COPY_TO_CLIPBOARD:"Copy to clipboard",URL_COPIED_TO_CLIPBOARD:"Copied URL to clipboard!",PHOTO_DIRECT_LINKS_TO_IMAGES:"Direct links to image files:",PHOTO_ORIGINAL:"Original",PHOTO_MEDIUM:"Medium",PHOTO_MEDIUM_HIDPI:"Medium HiDPI",PHOTO_SMALL:"Thumb",PHOTO_SMALL_HIDPI:"Thumb HiDPI",PHOTO_THUMB:"Square thumb",PHOTO_THUMB_HIDPI:"Square thumb HiDPI",PHOTO_THUMBNAIL:"Photo thumbnail",PHOTO_LIVE_VIDEO:"Video part of live-photo",PHOTO_VIEW:"Lychee Photo View:",PHOTO_EDIT_ROTATECWISE:"Rotate clockwise",PHOTO_EDIT_ROTATECCWISE:"Rotate counter-clockwise",ERROR_GPX:"Error loading GPX file: ",ERROR_EITHER_ALBUMS_OR_PHOTOS:"Please select either albums or photos!",ERROR_COULD_NOT_FIND:"Could not find what you want.",ERROR_INVALID_EMAIL:"Not a valid email address.",EMAIL_SUCCESS:"Email updated!",ERROR_PHOTO_NOT_FOUND:"Error: photo %s not found!",ERROR_EMPTY_USERNAME:"new username cannot be empty.",ERROR_PASSWORD_DOES_NOT_MATCH:"new password does not match.",ERROR_EMPTY_PASSWORD:"new password cannot be empty.",ERROR_SELECT_ALBUM:"Select an album to share!",ERROR_SELECT_USER:"Select a user to share with!",ERROR_SELECT_SHARING:"Select a sharing to remove!",SHARING_SUCCESS:"Sharing updated!",SHARING_REMOVED:"Sharing removed!",USER_CREATED:"User created!",USER_DELETED:"User deleted!",USER_UPDATED:"User updated!",ENTER_EMAIL:"Enter your email address:",ERROR_ALBUM_JSON_NOT_FOUND:"Error: Album JSON not found!",ERROR_ALBUM_NOT_FOUND:"Error: album %s not found",ERROR_DROPBOX_KEY:"Error: Dropbox key not set",ERROR_SESSION:"Session expired.",CAMERA_DATE:"Camera date",NEW_PASSWORD:"new password",ALLOW_UPLOADS:"Allow uploads",ALLOW_USER_SELF_EDIT:"Allow self-management of user account",OSM_CONTRIBUTORS:"OpenStreetMap contributors",dateTimeFormatter:new Intl.DateTimeFormat("default",{dateStyle:"medium",timeStyle:"medium"}),/**
+ */lychee.locale={USERNAME:"Username",PASSWORD:"Password",ENTER:"Enter",CANCEL:"Cancel",SIGN_IN:"Sign In",CLOSE:"Close",SETTINGS:"Settings",SEARCH:"Search …",MORE:"More",DEFAULT:"Default",GALLERY:"Gallery",USERS:"Users",CREATE:"Create",REMOVE:"Remove",SHARE:"Share",U2F:"U2F",NOTIFICATIONS:"Notifications",SHARING:"Sharing",CHANGE_LOGIN:"Change Login",CHANGE_SORTING:"Change Sorting",SET_DROPBOX:"Set Dropbox",ABOUT_LYCHEE:"About Lychee",DIAGNOSTICS:"Diagnostics",DIAGNOSTICS_GET_SIZE:"Request space usage",LOGS:"Show Logs",SIGN_OUT:"Sign Out",UPDATE_AVAILABLE:"Update available!",MIGRATION_AVAILABLE:"Migration available!",CHECK_FOR_UPDATE:"Check for updates",DEFAULT_LICENSE:"Default license for new uploads:",SET_LICENSE:"Set License",SET_OVERLAY_TYPE:"Set Overlay",SET_ALBUM_DECORATION:"Set album decorations",SET_MAP_PROVIDER:"Set OpenStreetMap tiles provider",FULL_SETTINGS:"Full Settings",UPDATE:"Update",RESET:"Reset",DISABLE_TOKEN_TOOLTIP:"Disable",ENABLE_TOKEN:"Enable API token",DISABLED_TOKEN_STATUS_MSG:"Disabled",TOKEN_BUTTON:"API Token ...",TOKEN_NOT_AVAILABLE:"You have already viewed this token.",TOKEN_WAIT:"Wait ...",SMART_ALBUMS:"Smart albums",SHARED_ALBUMS:"Shared albums",ALBUMS:"Albums",PHOTOS:"Pictures",SEARCH_RESULTS:"Search results",RENAME:"Rename",RENAME_ALL:"Rename Selected",MERGE:"Merge",MERGE_ALL:"Merge Selected",MAKE_PUBLIC:"Make Public",SHARE_ALBUM:"Share Album",SHARE_PHOTO:"Share Photo",VISIBILITY_ALBUM:"Album Visibility",VISIBILITY_PHOTO:"Photo Visibility",DOWNLOAD_ALBUM:"Download Album",ABOUT_ALBUM:"About Album",DELETE_ALBUM:"Delete Album",MOVE_ALBUM:"Move Album",FULLSCREEN_ENTER:"Enter Fullscreen",FULLSCREEN_EXIT:"Exit Fullscreen",SHARING_ALBUM_USERS:"Share this album with users",WAIT_FETCH_DATA:"Please wait while we get the data …",SHARING_ALBUM_USERS_NO_USERS:"There are no users to share the album with",SHARING_ALBUM_USERS_LONG_MESSAGE:"Select the users to share this album with",DELETE_ALBUM_QUESTION:"Delete Album and Photos",KEEP_ALBUM:"Keep Album",DELETE_ALBUM_CONFIRMATION:"Are you sure you want to delete the album “%s” and all of the photos it contains? This action can’t be undone!",DELETE_TAG_ALBUM_QUESTION:"Delete Album",DELETE_TAG_ALBUM_CONFIRMATION:"Are you sure you want to delete the album “%s” (any photos inside will not be deleted)? This action can’t be undone!",DELETE_ALBUMS_QUESTION:"Delete Albums and Photos",KEEP_ALBUMS:"Keep Albums",DELETE_ALBUMS_CONFIRMATION:"Are you sure you want to delete all %d selected albums and all of the photos they contain? This action can’t be undone!",DELETE_UNSORTED_CONFIRM:"Are you sure you want to delete all photos from “Unsorted”? This action can’t be undone!",CLEAR_UNSORTED:"Clear Unsorted",KEEP_UNSORTED:"Keep Unsorted",EDIT_SHARING:"Edit Sharing",MAKE_PRIVATE:"Make Private",CLOSE_ALBUM:"Close Album",CLOSE_PHOTO:"Close Photo",CLOSE_MAP:"Close Map",ADD:"Add",MOVE:"Move",MOVE_ALL:"Move Selected",DUPLICATE:"Duplicate",DUPLICATE_ALL:"Duplicate Selected",COPY_TO:"Copy to …",COPY_ALL_TO:"Copy Selected to …",DELETE:"Delete",SAVE:"Save",DELETE_ALL:"Delete Selected",DOWNLOAD:"Download",DOWNLOAD_ALL:"Download Selected",UPLOAD_PHOTO:"Upload Photo",IMPORT_LINK:"Import from Link",IMPORT_DROPBOX:"Import from Dropbox",IMPORT_SERVER:"Import from Server",NEW_ALBUM:"New Album",NEW_TAG_ALBUM:"New Tag Album",UPLOAD_TRACK:"Upload track",DELETE_TRACK:"Delete track",TITLE_NEW_ALBUM:"Enter a title for the new album:",UNTITLED:"Untitled",UNSORTED:"Unsorted",STARRED:"Starred",RECENT:"Recent",PUBLIC:"Public",ON_THIS_DAY:"On This Day",NUM_PHOTOS:"Photos",CREATE_ALBUM:"Create Album",CREATE_TAG_ALBUM:"Create Tag Album",STAR_PHOTO:"Star Photo",STAR:"Star",UNSTAR:"Unstar",STAR_ALL:"Star Selected",UNSTAR_ALL:"Unstar Selected",TAG:"Tag",TAG_ALL:"Tag Selected",UNSTAR_PHOTO:"Unstar Photo",SET_COVER:"Set Album Cover",REMOVE_COVER:"Remove Album Cover",FULL_PHOTO:"Open Original",ABOUT_PHOTO:"About Photo",DISPLAY_FULL_MAP:"Map",DIRECT_LINK:"Direct Link",DIRECT_LINKS:"Direct Links",QR_CODE:"QR Code",ALBUM_ABOUT:"About",ALBUM_BASICS:"Basics",ALBUM_TITLE:"Title",ALBUM_NEW_TITLE:"Enter a new title for this album:",ALBUMS_NEW_TITLE:"Enter a title for all %d selected albums:",ALBUM_SET_TITLE:"Set Title",ALBUM_DESCRIPTION:"Description",ALBUM_SHOW_TAGS:"Tags to show",ALBUM_NEW_DESCRIPTION:"Enter a new description for this album:",ALBUM_SET_DESCRIPTION:"Set Description",ALBUM_NEW_SHOWTAGS:"Enter tags of photos that will be visible in this album:",ALBUM_SET_SHOWTAGS:"Set tags to show",ALBUM_ALBUM:"Album",ALBUM_CREATED:"Created",ALBUM_IMAGES:"Images",ALBUM_VIDEOS:"Videos",ALBUM_SUBALBUMS:"Subalbums",ALBUM_SHARING:"Share",ALBUM_SHR_YES:"YES",ALBUM_SHR_NO:"No",ALBUM_PUBLIC:"Public",ALBUM_PUBLIC_EXPL:"Anonymous users can access this album, subject to the restrictions below.",ALBUM_FULL:"Original",ALBUM_FULL_EXPL:"Anonymous users can behold full-resolution photos.",ALBUM_HIDDEN:"Hidden",ALBUM_HIDDEN_EXPL:"Anonymous users need a direct link to access this album.",ALBUM_MARK_NSFW:"Mark album as sensitive",ALBUM_UNMARK_NSFW:"Unmark album as sensitive",ALBUM_NSFW:"Sensitive",ALBUM_NSFW_EXPL:"Album contains sensitive content.",ALBUM_DOWNLOADABLE:"Downloadable",ALBUM_DOWNLOADABLE_EXPL:"Anonymous users can download this album.",ALBUM_SHARE_BUTTON_VISIBLE:"Share button is visible",ALBUM_SHARE_BUTTON_VISIBLE_EXPL:"Anonymous users can see social media sharing links.",ALBUM_PASSWORD:"Password",ALBUM_PASSWORD_PROT:"Password protected",ALBUM_PASSWORD_PROT_EXPL:"Anonymous users need a shared password to access this album.",ALBUM_PASSWORD_REQUIRED:"This album is protected by a password. Enter the password below to view the photos of this album:",ALBUM_MERGE:"Are you sure you want to merge the album “%1$s” into the album “%2$s”?",ALBUMS_MERGE:"Are you sure you want to merge all selected albums into the album “%s”?",MERGE_ALBUM:"Merge Albums",DONT_MERGE:"Don’t Merge",ALBUM_MOVE:"Are you sure you want to move the album “%1$s” into the album “%2$s”?",ALBUMS_MOVE:"Are you sure you want to move all selected albums into the album “%s”?",MOVE_ALBUMS:"Move Albums",NOT_MOVE_ALBUMS:"Don’t Move",ROOT:"Albums",ALBUM_REUSE:"Reuse",ALBUM_LICENSE:"License",ALBUM_SET_LICENSE:"Set License",ALBUM_LICENSE_HELP:"Need help choosing?",ALBUM_LICENSE_NONE:"None",ALBUM_RESERVED:"All Rights Reserved",ALBUM_SET_ORDER:"Set Order",ALBUM_ORDERING:"Order by",ALBUM_OWNER:"Owner",PHOTO_ABOUT:"About",PHOTO_BASICS:"Basics",PHOTO_TITLE:"Title",PHOTO_NEW_TITLE:"Enter a new title for this photo:",PHOTO_SET_TITLE:"Set Title",PHOTO_UPLOADED:"Uploaded",PHOTO_DESCRIPTION:"Description",PHOTO_NEW_DESCRIPTION:"Enter a new description for this photo:",PHOTO_SET_DESCRIPTION:"Set Description",PHOTO_NEW_LICENSE:"Add a License",PHOTO_SET_LICENSE:"Set License",PHOTO_LICENSE:"License",PHOTO_LICENSE_HELP:"Need help choosing?",PHOTO_REUSE:"Reuse",PHOTO_LICENSE_NONE:"None",PHOTO_RESERVED:"All Rights Reserved",PHOTO_LATITUDE:"Latitude",PHOTO_LONGITUDE:"Longitude",PHOTO_ALTITUDE:"Altitude",PHOTO_IMGDIRECTION:"Direction",PHOTO_LOCATION:"Location",PHOTO_IMAGE:"Image",PHOTO_VIDEO:"Video",PHOTO_SIZE:"Size",PHOTO_FORMAT:"Format",PHOTO_RESOLUTION:"Resolution",PHOTO_DURATION:"Duration",PHOTO_FPS:"Frame rate",PHOTO_TAGS:"Tags",PHOTO_NOTAGS:"No Tags",PHOTO_NEW_TAGS:"Enter your tags for this photo. You can add multiple tags by separating them with a comma:",PHOTOS_NEW_TAGS:"Enter your tags for all %d selected photos. Existing tags will be overwritten. You can add multiple tags by separating them with a comma:",PHOTO_SET_TAGS:"Set Tags",TAGS_OVERRIDE_INFO:"If this is unchecked, the tags will be added to the existing tags of the photo.",PHOTO_CAMERA:"Camera",PHOTO_CAPTURED:"Captured",PHOTO_MAKE:"Make",PHOTO_TYPE:"Type/Model",PHOTO_LENS:"Lens",PHOTO_SHUTTER:"Shutter Speed",PHOTO_APERTURE:"Aperture",PHOTO_FOCAL:"Focal Length",PHOTO_ISO:"ISO %s",PHOTO_SHARING:"Sharing",PHOTO_SHR_PUBLIC:"Public",PHOTO_SHR_ALB:"Yes (Album)",PHOTO_SHR_PHT:"Yes (Photo)",PHOTO_SHR_NO:"No",PHOTO_DELETE:"Delete Photo",PHOTO_KEEP:"Keep Photo",PHOTO_DELETE_CONFIRMATION:"Are you sure you want to delete the photo “%s”? This action can’t be undone!",PHOTO_DELETE_ALL:"Are you sure you want to delete all %d selected photo? This action can’t be undone!",PHOTOS_NEW_TITLE:"Enter a title for all %d selected photos:",PHOTO_MAKE_PRIVATE_ALBUM:"This photo is located in a public album. To make this photo private or public, edit the visibility of the associated album.",PHOTO_SHOW_ALBUM:"Show Album",PHOTO_PUBLIC:"Public",PHOTO_PUBLIC_EXPL:"Anonymous users can view this photo, subject to the restrictions below.",PHOTO_FULL:"Original",PHOTO_FULL_EXPL:"Anonymous users can behold full-resolution photo.",PHOTO_HIDDEN:"Hidden",PHOTO_HIDDEN_EXPL:"Anonymous users need a direct link to view this photo.",PHOTO_DOWNLOADABLE:"Downloadable",PHOTO_DOWNLOADABLE_EXPL:"Anonymous users may download this photo.",PHOTO_SHARE_BUTTON_VISIBLE:"Share button is visible",PHOTO_SHARE_BUTTON_VISIBLE_EXPL:"Anonymous users can see social media sharing links.",PHOTO_PASSWORD_PROT:"Password protected",PHOTO_PASSWORD_PROT_EXPL:"Anonymous users need a shared password to view this photo.",PHOTO_EDIT_SHARING_TEXT:"The sharing properties of this photo will be changed to the following:",PHOTO_NO_EDIT_SHARING_TEXT:"Because this photo is located in a public album, it inherits that album’s visibility settings.  Its current visibility is shown below for informational purposes only.",PHOTO_EDIT_GLOBAL_SHARING_TEXT:"The visibility of this photo can be fine-tuned using global Lychee settings. Its current visibility is shown below for informational purposes only.",PHOTO_NEW_CREATED_AT:"Enter the upload date for this photo. mm/dd/yyyy, hh:mm [am/pm]",PHOTO_SET_CREATED_AT:"Set upload date",LOADING:"Loading",ERROR:"Error",ERROR_TEXT:"Whoops, it looks like something went wrong. Please reload the site and try again!",ERROR_UNKNOWN:"Something unexpected happened. Please try again and check your installation and server. Take a look at the readme for more information.",ERROR_MAP_DEACTIVATED:"Map functionality has been deactivated under settings.",ERROR_SEARCH_DEACTIVATED:"Search functionality has been deactivated under settings.",SUCCESS:"OK",RETRY:"Retry",OVERRIDE:"Override",SETTINGS_SUCCESS_LOGIN:"Login Info updated.",SETTINGS_SUCCESS_SORT:"Sorting order updated.",SETTINGS_SUCCESS_DROPBOX:"Dropbox Key updated.",SETTINGS_SUCCESS_LANG:"Language updated",SETTINGS_SUCCESS_LAYOUT:"Layout updated",SETTINGS_SUCCESS_IMAGE_OVERLAY:"Image overlay setting updated",SETTINGS_SUCCESS_ALBUM_DECORATION:"Album decorations updated",SETTINGS_SUCCESS_PUBLIC_SEARCH:"Public search updated",SETTINGS_SUCCESS_LICENSE:"Default license updated",SETTINGS_SUCCESS_MAP_DISPLAY:"Map display settings updated",SETTINGS_SUCCESS_MAP_DISPLAY_PUBLIC:"Map display settings for public albums updated",SETTINGS_SUCCESS_MAP_PROVIDER:"Map provider settings updated",SETTINGS_SUCCESS_CSS:"CSS updated",SETTINGS_SUCCESS_JS:"JS updated",SETTINGS_SUCCESS_UPDATE:"Settings updated successfully",SETTINGS_DROPBOX_KEY:"Dropbox API Key",SETTINGS_ADVANCED_WARNING_EXPL:"Changing these advanced settings can be harmful to the stability, security and performance of this application. You should only modify them if you are sure of what you are doing.",SETTINGS_ADVANCED_SAVE:"Save my modifications, I accept the risk!",U2F_NOT_SUPPORTED:"U2F not supported. Sorry.",U2F_NOT_SECURE:"Environment not secured. U2F not available.",U2F_REGISTER_KEY:"Register new device.",U2F_REGISTRATION_SUCCESS:"Registration successful!",U2F_AUTHENTIFICATION_SUCCESS:"Authentication successful!",U2F_CREDENTIALS:"Credentials",U2F_CREDENTIALS_DELETED:"Credentials deleted!",NEW_PHOTOS_NOTIFICATION:"Send new photos notification emails.",SETTINGS_SUCCESS_NEW_PHOTOS_NOTIFICATION:"New photos notification updated",USER_EMAIL_INSTRUCTION:"Add your email below to enable receiving email notifications. To stop receiving emails, simply remove your email below.",LOGIN_USERNAME:"New Username",LOGIN_PASSWORD:"New Password",LOGIN_PASSWORD_CONFIRM:"Confirm Password",PASSWORD_TITLE:"Enter your current password:",PASSWORD_CURRENT:"Current Password",PASSWORD_TEXT:"Your credentials will be changed to the following:",PASSWORD_CHANGE:"Change Login",EDIT_SHARING_TITLE:"Edit Sharing",EDIT_SHARING_TEXT:"The sharing properties of this album will be changed to the following:",SHARE_ALBUM_TEXT:"This album will be shared with the following properties:",SORT_DIALOG_ATTRIBUTE_LABEL:"Attribute",SORT_DIALOG_ORDER_LABEL:"Order",SORT_ALBUM_BY:"Sort albums by %1$s in an %2$s order.",SORT_ALBUM_SELECT_1:"Creation Time",SORT_ALBUM_SELECT_2:"Title",SORT_ALBUM_SELECT_3:"Description",SORT_ALBUM_SELECT_5:"Latest Take Date",SORT_ALBUM_SELECT_6:"Oldest Take Date",SORT_PHOTO_BY:"Sort photos by %1$s in an %2$s order.",SORT_PHOTO_SELECT_1:"Upload Time",SORT_PHOTO_SELECT_2:"Take Date",SORT_PHOTO_SELECT_3:"Title",SORT_PHOTO_SELECT_4:"Description",SORT_PHOTO_SELECT_5:"Public",SORT_PHOTO_SELECT_6:"Star",SORT_PHOTO_SELECT_7:"Photo Format",SORT_ASCENDING:"Ascending",SORT_DESCENDING:"Descending",SORT_CHANGE:"Change Sorting",DROPBOX_TITLE:"Set Dropbox Key",DROPBOX_TEXT:"In order to import photos from your Dropbox, you need a valid drop-ins app key from <a href='https://www.dropbox.com/developers/saver'>their website</a>. Generate yourself a personal key and enter it below:",LANG_TEXT:"Change Lychee language for:",LANG_TITLE:"Change Language",SETTING_RECENT_PUBLIC_TEXT:'Make "Recent" smart album accessible to anonymous users',SETTING_STARRED_PUBLIC_TEXT:'Make "Starred" smart album accessible to anonymous users',SETTING_ONTHISDAY_PUBLIC_TEXT:'Make "On This Day" smart album accessible to anonymous users',CSS_TEXT:"Personalize CSS:",CSS_TITLE:"Change CSS",JS_TEXT:"Custom JS:",JS_TITLE:"Change JS",PUBLIC_SEARCH_TEXT:"Public search allowed:",OVERLAY_TYPE:"Photo overlay:",OVERLAY_NONE:"None",OVERLAY_EXIF:"EXIF data",OVERLAY_DESCRIPTION:"Description",OVERLAY_DATE:"Date taken",ALBUM_DECORATION:"Album decorations:",ALBUM_DECORATION_NONE:"No badges",ALBUM_DECORATION_ORIGINAL:"Sub-album badge, no count",ALBUM_DECORATION_ALBUM:"Sub-album badge with count",ALBUM_DECORATION_PHOTO:"Photo badge with count",ALBUM_DECORATION_ALL:"Sub-album and photo badges with counts",ALBUM_DECORATION_ORIENTATION:"Orientation of album decorations:",ALBUM_DECORATION_ORIENTATION_ROW:"Horizontal decorations (photos, albums)",ALBUM_DECORATION_ORIENTATION_ROW_REVERSE:"Horizontal decorations (albums, photos)",ALBUM_DECORATION_ORIENTATION_COLUMN:"Vertical decorations (top photos, albums)",ALBUM_DECORATION_ORIENTATION_COLUMN_REVERSE:"Vertical decorations (top albums, photos)",MAP_DISPLAY_TEXT:"Enable maps (provided by OpenStreetMap):",MAP_DISPLAY_PUBLIC_TEXT:"Enable maps for public albums (provided by OpenStreetMap):",MAP_PROVIDER:"Provider of OpenStreetMap tiles:",MAP_PROVIDER_WIKIMEDIA:"Wikimedia",MAP_PROVIDER_OSM_ORG:"OpenStreetMap.org (no HiDPI)",MAP_PROVIDER_OSM_DE:"OpenStreetMap.de (no HiDPI)",MAP_PROVIDER_OSM_FR:"OpenStreetMap.fr (no HiDPI)",MAP_PROVIDER_RRZE:"University of Erlangen, Germany (only HiDPI)",MAP_INCLUDE_SUBALBUMS_TEXT:"Include photos of subalbums on map:",LOCATION_DECODING:"Decode GPS data into location name",LOCATION_SHOW:"Show location name",LOCATION_SHOW_PUBLIC:"Show location name for public mode",LAYOUT_TYPE:"Layout of photos:",LAYOUT_SQUARES:"Square thumbnails",LAYOUT_JUSTIFIED:"With aspect, justified",LAYOUT_UNJUSTIFIED:"With aspect, unjustified",SET_LAYOUT:"Change layout",NSFW_VISIBLE_TEXT_1:"Make Sensitive albums visible by default.",NSFW_VISIBLE_TEXT_2:"If the album is public, it is still accessible, just hidden from the view and <b>can be revealed by pressing <kbd>H</kbd></b>.",SETTINGS_SUCCESS_NSFW_VISIBLE:"Default sensitive album visibility updated with success.",NSFW_BANNER:"<h1>Sensitive content</h1><p>This album contains sensitive content which some people may find offensive or disturbing.</p><p>Tap to consent.</p>",VIEW_NO_RESULT:"No results",VIEW_NO_PUBLIC_ALBUMS:"No public albums",VIEW_NO_CONFIGURATION:"No configuration",VIEW_PHOTO_NOT_FOUND:"Photo not found",NO_TAGS:"No Tags",UPLOAD_MANAGE_NEW_PHOTOS:"You can now manage your new photo(s).",UPLOAD_COMPLETE:"Upload complete",UPLOAD_COMPLETE_FAILED:"Failed to upload one or more photos.",UPLOAD_IMPORTING:"Importing",UPLOAD_IMPORTING_URL:"Importing URL",UPLOAD_UPLOADING:"Uploading",UPLOAD_FINISHED:"Finished",UPLOAD_PROCESSING:"Processing",UPLOAD_FAILED:"Failed",UPLOAD_FAILED_ERROR:"Upload failed. The server returned an error!",UPLOAD_FAILED_WARNING:"Upload failed. The server returned a warning!",UPLOAD_CANCELLED:"Cancelled",UPLOAD_SKIPPED:"Skipped",UPLOAD_UPDATED:"Updated",UPLOAD_GENERAL:"General",UPLOAD_IMPORT_SKIPPED_DUPLICATE:"This photo has been skipped because it’s already in your library.",UPLOAD_IMPORT_RESYNCED_DUPLICATE:"This photo has been skipped because it’s already in your library, but its metadata has been updated.",UPLOAD_ERROR_CONSOLE:"Please take a look at the console of your browser for further details.",UPLOAD_UNKNOWN:"Server returned an unknown response. Please take a look at the console of your browser for further details.",UPLOAD_ERROR_UNKNOWN:"Upload failed. The server returned an unknown error!",UPLOAD_ERROR_POSTSIZE:"Upload failed. The PHP post_max_size may be too small! Otherwise check the FAQ.",UPLOAD_ERROR_FILESIZE:"Upload failed. The PHP upload_max_filesize may be too small! Otherwise check the FAQ.",UPLOAD_IN_PROGRESS:"Lychee is currently uploading!",UPLOAD_IMPORT_WARN_ERR:"The import has been finished, but returned warnings or errors. Please take a look at the log (Settings -> Show Log) for further details.",UPLOAD_IMPORT_COMPLETE:"Import complete",UPLOAD_IMPORT_INSTR:"Please enter the direct link to a photo to import it:",UPLOAD_IMPORT:"Import",UPLOAD_IMPORT_SERVER:"Importing from server",UPLOAD_IMPORT_SERVER_FOLD:"Folder empty or no readable files to process. Please take a look at the log (Settings -> Show Log) for further details.",UPLOAD_IMPORT_SERVER_INSTR:"Import all photos, folders, and sub-folders located in the folders with the following absolute paths (on the server). Paths are space-separated, use \\ to escape a space in a path.",UPLOAD_ABSOLUTE_PATH:"Absolute path to directories, space separated",UPLOAD_IMPORT_SERVER_EMPT:"Could not start import because the folder was empty!",UPLOAD_IMPORT_DELETE_ORIGINALS:"Delete originals",UPLOAD_IMPORT_DELETE_ORIGINALS_EXPL:"Original files will be deleted after the import when possible.",UPLOAD_IMPORT_VIA_SYMLINK:"Symbolic links",UPLOAD_IMPORT_VIA_SYMLINK_EXPL:"Import files using symbolic links to originals.",UPLOAD_IMPORT_SKIP_DUPLICATES:"Skip duplicates",UPLOAD_IMPORT_SKIP_DUPLICATES_EXPL:"Existing media files are skipped.",UPLOAD_IMPORT_RESYNC_METADATA:"Re-sync metadata",UPLOAD_IMPORT_RESYNC_METADATA_EXPL:"Update metadata of existing media files.",UPLOAD_IMPORT_LOW_MEMORY_EXPL:"The import process on the server is approaching the memory limit and may end up being terminated prematurely.",UPLOAD_WARNING:"Warning",UPLOAD_IMPORT_NOT_A_DIRECTORY:"The given path is not a readable directory!",UPLOAD_IMPORT_PATH_RESERVED:"The given path is a reserved path of Lychee!",UPLOAD_IMPORT_FAILED:"Could not import the file!",UPLOAD_IMPORT_UNSUPPORTED:"Unsupported file type!",UPLOAD_IMPORT_CANCELLED:"Import cancelled",ABOUT_SUBTITLE:"Self-hosted photo-management done right",ABOUT_DESCRIPTION:"<a target='_blank' href='%s'>Lychee</a> is a free photo-management tool, which runs on your server or web-space. Installing is a matter of seconds. Upload, manage and share photos like from a native application. Lychee comes with everything you need and all your photos are stored securely.",FOOTER_COPYRIGHT:"All images on this website are subject to copyright by %1$s © %2$s",HOSTED_WITH_LYCHEE:"Hosted with Lychee",URL_COPY_TO_CLIPBOARD:"Copy to clipboard",URL_COPIED_TO_CLIPBOARD:"Copied URL to clipboard!",PHOTO_DIRECT_LINKS_TO_IMAGES:"Direct links to image files:",PHOTO_ORIGINAL:"Original",PHOTO_MEDIUM:"Medium",PHOTO_MEDIUM_HIDPI:"Medium HiDPI",PHOTO_SMALL:"Thumb",PHOTO_SMALL_HIDPI:"Thumb HiDPI",PHOTO_THUMB:"Square thumb",PHOTO_THUMB_HIDPI:"Square thumb HiDPI",PHOTO_THUMBNAIL:"Photo thumbnail",PHOTO_LIVE_VIDEO:"Video part of live-photo",PHOTO_VIEW:"Lychee Photo View:",PHOTO_EDIT_ROTATECWISE:"Rotate clockwise",PHOTO_EDIT_ROTATECCWISE:"Rotate counter-clockwise",ERROR_GPX:"Error loading GPX file: ",ERROR_EITHER_ALBUMS_OR_PHOTOS:"Please select either albums or photos!",ERROR_COULD_NOT_FIND:"Could not find what you want.",ERROR_INVALID_EMAIL:"Not a valid email address.",EMAIL_SUCCESS:"Email updated!",ERROR_PHOTO_NOT_FOUND:"Error: photo %s not found!",ERROR_EMPTY_USERNAME:"new username cannot be empty.",ERROR_PASSWORD_DOES_NOT_MATCH:"new password does not match.",ERROR_EMPTY_PASSWORD:"new password cannot be empty.",ERROR_SELECT_ALBUM:"Select an album to share!",ERROR_SELECT_USER:"Select a user to share with!",ERROR_SELECT_SHARING:"Select a sharing to remove!",SHARING_SUCCESS:"Sharing updated!",SHARING_REMOVED:"Sharing removed!",USER_CREATED:"User created!",USER_DELETED:"User deleted!",USER_UPDATED:"User updated!",ENTER_EMAIL:"Enter your email address:",ERROR_ALBUM_JSON_NOT_FOUND:"Error: Album JSON not found!",ERROR_ALBUM_NOT_FOUND:"Error: album %s not found",ERROR_DROPBOX_KEY:"Error: Dropbox key not set",ERROR_SESSION:"Session expired.",CAMERA_DATE:"Camera date",NEW_PASSWORD:"new password",ALLOW_UPLOADS:"Allow uploads",ALLOW_USER_SELF_EDIT:"Allow self-management of user account",OSM_CONTRIBUTORS:"OpenStreetMap contributors",dateTimeFormatter:new Intl.DateTimeFormat("default",{dateStyle:"medium",timeStyle:"medium"}),/**
 	 * Formats a number representing a filesize in bytes as a localized string
 	 * @param {!number} filesize
 	 * @returns {string} A formatted and localized string
diff --git a/resources/js/data/views/dropboxView.ts b/resources/js/data/views/dropboxView.ts
new file mode 100644
index 00000000000..100cf68dee3
--- /dev/null
+++ b/resources/js/data/views/dropboxView.ts
@@ -0,0 +1,40 @@
+import { Alpine } from "alpinejs";
+import { DropboxView } from "./types";
+
+type DropboxFile = {
+	bytes: number;
+	icon: string;
+	id: string;
+	isDir: boolean;
+	link: string;
+	linkType: string;
+	name: string;
+	thumbnailLink: string;
+};
+
+export const dropboxView = (Alpine: Alpine) =>
+	Alpine.data(
+		"dropboxView",
+		// @ts-expect-error
+		(urlArea_: string, progress_: string): DropboxView => ({
+			urlArea: urlArea_,
+			progress: progress_,
+
+			chooseFromDropbox(): void {
+				// @ts-expect-error
+				Dropbox.choose({
+					linkType: "direct",
+					multiselect: true,
+					success: (files: DropboxFile[]) => {
+						this.urlArea = files.map((file) => file.link).join("\n");
+					},
+				});
+			},
+
+			send(): void {
+				Livewire.dispatch("notify", [{ type: "info", msg: this.progress }]);
+				// @ts-expect-error
+				this.$wire.submit();
+			},
+		}),
+	);
diff --git a/resources/js/data/views/index.ts b/resources/js/data/views/index.ts
index 92acce414a2..f5dc08bcd62 100644
--- a/resources/js/data/views/index.ts
+++ b/resources/js/data/views/index.ts
@@ -2,12 +2,14 @@ import { albumView } from "./albumView";
 import { mapView } from "./mapView";
 import { uploadView } from "./uploadView";
 import { photoView } from "./photoView";
+import { dropboxView } from "./dropboxView";
 
 export const views = {
 	albumView,
 	photoView,
 	mapView,
 	uploadView,
+	dropboxView,
 	[Symbol.iterator]: function* () {
 		yield* Object.values(this);
 	},
diff --git a/resources/js/data/views/types.d.ts b/resources/js/data/views/types.d.ts
index a1a42d32924..c14c4195dd8 100644
--- a/resources/js/data/views/types.d.ts
+++ b/resources/js/data/views/types.d.ts
@@ -160,3 +160,11 @@ export type UploadView = AlpineComponent<{
 	livewireUploadChunk: (fileIdx: number, wire: Livewire, alpine: UploadView) => void;
 	start: (wire: Livewire, alpine: UploadView) => void;
 }>;
+
+export type DropboxView = AlpineComponent<{
+	urlArea: string;
+	progress: string;
+
+	chooseFromDropbox: () => void;
+	send: () => void;
+}>;
diff --git a/resources/views/livewire/components/modal.blade.php b/resources/views/livewire/components/modal.blade.php
index b24489f6bda..e53dfce53cb 100644
--- a/resources/views/livewire/components/modal.blade.php
+++ b/resources/views/livewire/components/modal.blade.php
@@ -1,7 +1,7 @@
 <div>
     @if ($isOpen)
         <div class="basicModalContainer transition-opacity duration-1000 ease-in animate-fadeIn
-					bg-black/80 z-50 fixed flex items-center justify-center w-full
+					bg-black/80 z-30 fixed flex items-center justify-center w-full
 					h-full top-0 left-0 box-border opacity-100 menu-shadow"
             data-closable="true">
             <div class="basicModal transition-opacity ease-in duration-1000
diff --git a/resources/views/livewire/context-menus/album-add.blade.php b/resources/views/livewire/context-menus/album-add.blade.php
index 69d730baedf..e49a87d589c 100644
--- a/resources/views/livewire/context-menus/album-add.blade.php
+++ b/resources/views/livewire/context-menus/album-add.blade.php
@@ -4,7 +4,7 @@
 	<x-context-menu.item wire:click='openImportFromUrlModal' icon='link-intact'>{{ __('lychee.IMPORT_LINK') }}</x-context-menu.item>
 	@can(AlbumPolicy::CAN_IMPORT_FROM_SERVER, [App\Contracts\Models\AbstractAlbum::class])
 		@if(Configs::getValueAsString('dropbox_key') !== '')
-		<x-context-menu.item icon='dropbox' icon_class="ionicons">{{ __('lychee.IMPORT_DROPBOX') }}</x-context-menu.item>
+		<x-context-menu.item wire:click='openImportFromDropboxModal' icon='dropbox' icon_class="ionicons">{{ __('lychee.IMPORT_DROPBOX') }}</x-context-menu.item>
 		@endif
 	<x-context-menu.item wire:click='openImportFromServerModal' icon='terminal'>{{ __('lychee.IMPORT_SERVER') }}</x-context-menu.item>
 	@endcan
diff --git a/resources/views/livewire/forms/add/import-from-dropbox.blade.php b/resources/views/livewire/forms/add/import-from-dropbox.blade.php
new file mode 100644
index 00000000000..af8b1dae790
--- /dev/null
+++ b/resources/views/livewire/forms/add/import-from-dropbox.blade.php
@@ -0,0 +1,30 @@
+<div x-data="dropboxView(@entangle('form.urlArea'), '{{ __('lychee.UPLOAD_IN_PROGRESS')}}')">
+	@assets
+	<script type="text/javascript" src="https://www.dropbox.com/static/api/2/dropins.js" id='dropboxjs' data-app-key='{{ $this->api_key }}'></script>
+	@endassets
+	<div class="p-9">
+		<p class="mb-5 text-text-main-200 text-sm/4">{{ __('lychee.IMPORT_DROPBOX') }}</p>
+		<x-forms.buttons.action class="rounded-md w-full"
+			x-bind:class="urlArea === '' ? '' : 'hidden'"
+			x-on:click="chooseFromDropbox">Select from Dropbox</x-forms.buttons.action>
+		<form>
+			<div class="my-3 first:mt-0 last:mb-0"
+				x-bind:class="urlArea === '' ? 'hidden' : ''">
+				<x-forms.textarea
+					class="w-full text-2xs !text-text-main-400" autocapitalize="off"
+					x-model="urlArea" wire:model="form.urlArea"
+					placeholder="https://&#10;https://&#10;..."
+					:has_error="$errors->has('form.urls.*')" />
+			</div>
+		</form>
+	</div>
+	<div class="flex w-full box-border">
+		<x-forms.buttons.cancel class="border-t border-t-bg-800 rounded-bl-md w-full" wire:click="close">{{ __('lychee.CANCEL') }}</x-forms.buttons.cancel>
+		<x-forms.buttons.action class="border-t border-t-bg-800 rounded-br-md w-full"
+			x-bind:disabled="urlArea === ''"
+			x-bind:class="urlArea === '' ? '!cursor-not-allowed hover:!text-primary-500 hover:!bg-transparent' : ''"
+			x-on:click="send()"
+			@keydown.enter.window="send()"
+			>{{ __('lychee.UPLOAD_IMPORT') }}</x-forms.buttons.action>
+	</div>
+</div>
\ No newline at end of file
diff --git a/resources/views/livewire/forms/add/import-from-url.blade.php b/resources/views/livewire/forms/add/import-from-url.blade.php
index ba57857025d..8acabb8a72b 100644
--- a/resources/views/livewire/forms/add/import-from-url.blade.php
+++ b/resources/views/livewire/forms/add/import-from-url.blade.php
@@ -3,7 +3,10 @@
 		<p class="mb-5 text-text-main-200 text-sm/4">{{ __('lychee.UPLOAD_IMPORT_INSTR') }}</p>
 		<form>
 			<div class="my-3 first:mt-0 last:mb-0">
-				<x-forms.inputs.text class="w-full" x-intersect="$el.focus()" autocapitalize="off" wire:model="form.url" placeholder="https://" :has_error="$errors->has('form.urls.*')" />
+				<x-forms.textarea
+					class="w-full" autocapitalize="off" wire:model="form.urlArea"
+					placeholder="https://&#10;https://&#10;..."
+					:has_error="$errors->has('form.urls.*')" />
 			</div>
 		</form>
 	</div>
diff --git a/resources/views/livewire/forms/settings/password.blade.php b/resources/views/livewire/forms/settings/password.blade.php
new file mode 100644
index 00000000000..343a5d8e5d2
--- /dev/null
+++ b/resources/views/livewire/forms/settings/password.blade.php
@@ -0,0 +1,9 @@
+<div class="my-8">
+	<p class="m-0 w-full text-text-main-400">
+		{!! $description !!}
+		<x-forms.inputs.password class="mt-2 w-full" placeholder="{{ $placeholder }}" wire:model="value" />
+	</p>
+	<div class="basicModal__buttons w-full">
+		<x-forms.buttons.action class="rounded-md w-full" wire:click="save">{{ $action }}</x-forms.buttons.action>
+	</div>
+</div>
diff --git a/resources/views/livewire/pages/settings.blade.php b/resources/views/livewire/pages/settings.blade.php
index 89324f71c1a..b9d0929da5a 100644
--- a/resources/views/livewire/pages/settings.blade.php
+++ b/resources/views/livewire/pages/settings.blade.php
@@ -5,7 +5,7 @@
     </x-header.bar>
 	<div class="overflow-x-clip overflow-y-auto h-[calc(100vh-56px)]">
 		<div class="settings_view w-10/12 max-w-xl text-text-main-400 text-sm mx-auto">
-			<livewire:forms.settings.base.string-setting key="set-dropbox-key" description="DROPBOX_TEXT"
+			<livewire:forms.settings.base.password-setting key="set-dropbox-key" description="DROPBOX_TEXT"
 				placeholder="SETTINGS_DROPBOX_KEY" action="DROPBOX_TITLE" name="dropbox_key" />
 			<livewire:forms.settings.set-album-sorting-setting />
 			<livewire:forms.settings.set-photo-sorting-setting />


Test patch:
diff --git a/tests/Livewire/Forms/ImportFromDropBoxTest.php b/tests/Livewire/Forms/ImportFromDropBoxTest.php
new file mode 100644
index 00000000000..23239858b02
--- /dev/null
+++ b/tests/Livewire/Forms/ImportFromDropBoxTest.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * We don't care for unhandled exceptions in tests.
+ * It is the nature of a test to throw an exception.
+ * Without this suppression we had 100+ Linter warning in this file which
+ * don't help anything.
+ *
+ * @noinspection PhpDocMissingThrowsInspection
+ * @noinspection PhpUnhandledExceptionInspection
+ */
+
+namespace Tests\Livewire\Forms;
+
+use App\Livewire\Components\Forms\Add\ImportFromDropbox;
+use Illuminate\Foundation\Testing\DatabaseTransactions;
+use Livewire\Livewire;
+use Tests\Feature\Constants\TestConstants;
+use Tests\Livewire\Base\BaseLivewireTest;
+
+class ImportFromDropBoxTest extends BaseLivewireTest
+{
+	use DatabaseTransactions;
+
+	public function testLoggedOut(): void
+	{
+		Livewire::test(ImportFromDropbox::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedInNoUpload(): void
+	{
+		Livewire::actingAs($this->userNoUpload)->test(ImportFromDropbox::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedInUpload(): void
+	{
+		Livewire::actingAs($this->userMayUpload1)->test(ImportFromDropbox::class)
+			->assertForbidden();
+	}
+
+	public function testLoggedInAdmin(): void
+	{
+		Livewire::actingAs($this->admin)->test(ImportFromDropbox::class)
+			->assertViewIs('livewire.forms.add.import-from-dropbox')
+			->assertOk()
+			->set('form.urlArea', TestConstants::SAMPLE_DOWNLOAD_JPG)
+			->call('submit')
+			->assertOk()
+			->assertDispatched('reloadPage')
+			->assertDispatched('closeModal');
+	}
+
+	public function testLoggedInClose(): void
+	{
+		Livewire::actingAs($this->admin)->test(ImportFromDropbox::class)
+			->assertViewIs('livewire.forms.add.import-from-dropbox')
+			->assertOk()
+			->call('close')
+			->assertDispatched('closeModal');
+	}
+}
\ No newline at end of file
diff --git a/tests/Livewire/Forms/ImportFromUrlTest.php b/tests/Livewire/Forms/ImportFromUrlTest.php
index 7912c10501f..e9f376d6540 100644
--- a/tests/Livewire/Forms/ImportFromUrlTest.php
+++ b/tests/Livewire/Forms/ImportFromUrlTest.php
@@ -39,7 +39,7 @@ public function testLoggedIn(): void
 		Livewire::actingAs($this->userMayUpload1)->test(ImportFromUrl::class)
 			->assertViewIs('livewire.forms.add.import-from-url')
 			->assertOk()
-			->set('form.url', TestConstants::SAMPLE_DOWNLOAD_JPG)
+			->set('form.urlArea', TestConstants::SAMPLE_DOWNLOAD_JPG)
 			->call('submit')
 			->assertOk()
 			->assertDispatched('reloadPage')