Skip to content

Add support for info control#103

Merged
giswqs merged 1 commit intomainfrom
infobox
Oct 26, 2025
Merged

Add support for info control#103
giswqs merged 1 commit intomainfrom
infobox

Conversation

@giswqs
Copy link
Copy Markdown
Member

@giswqs giswqs commented Oct 26, 2025

No description provided.

Copilot AI review requested due to automatic review settings October 26, 2025 03:16
@github-actions
Copy link
Copy Markdown

@github-actions github-actions Bot temporarily deployed to pull request October 26, 2025 03:17 Inactive
@giswqs giswqs merged commit 63f42fd into main Oct 26, 2025
8 checks passed
@giswqs giswqs deleted the infobox branch October 26, 2025 03:18
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds support for InfoBox and GradientBox controls to the MapLibre map widget, enabling users to display feature attributes on hover/click and show value legends for data visualization.

Key Changes:

  • Implemented add_infobox_control() and add_gradientbox_control() methods in the MapLibre Python API
  • Added JavaScript integration for loading and configuring the mapbox-gl-infobox plugin
  • Created comprehensive test coverage for both control types
  • Added example notebook demonstrating usage with real-world data

Reviewed Changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
anymap/maplibre.py Added Python API methods for InfoBox and GradientBox controls with parameter validation and state management
anymap/static/maplibre_widget.js Implemented plugin loading logic, control initialization, and feature interaction handlers
tests/test_anymap.py Added unit tests verifying control state management and JavaScript call generation
docs/examples/infobox_example.ipynb Created example notebook demonstrating both controls with world cities dataset
mkdocs.yml Added example notebook to documentation navigation
Comments suppressed due to low confidence (1)

docs/examples/infobox_example.ipynb:1

  • The color array includes '#ffffff' (white) as the last color in a gradient that should represent increasing population values. This will make the highest values appear white, which is likely unintended as it would be invisible or hard to see on typical map backgrounds. Consider using a darker color for the highest value or removing this entry.
{

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +2623 to +2629
const inject = (href) => { const l = document.createElement('link'); l.rel = 'stylesheet'; l.href = href; document.head.appendChild(l); };
// try multiple popular paths
inject('https://unpkg.com/infobox-control@latest/styles.css');
inject('https://unpkg.com/infobox-control@latest/dist/styles.css');
inject('https://unpkg.com/mapbox-gl-infobox@latest/styles.css');
inject('https://unpkg.com/mapbox-gl-infobox@latest/dist/styles.css');
}
Copy link

Copilot AI Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Multiple CSS stylesheets are being injected unconditionally when none are detected. Since these are all attempts to load the same plugin's styles, only one will likely work. Consider trying each stylesheet sequentially with error handling, and stop after the first successful load to avoid unnecessary network requests and duplicate style rules.

Suggested change
const inject = (href) => { const l = document.createElement('link'); l.rel = 'stylesheet'; l.href = href; document.head.appendChild(l); };
// try multiple popular paths
inject('https://unpkg.com/infobox-control@latest/styles.css');
inject('https://unpkg.com/infobox-control@latest/dist/styles.css');
inject('https://unpkg.com/mapbox-gl-infobox@latest/styles.css');
inject('https://unpkg.com/mapbox-gl-infobox@latest/dist/styles.css');
}
// Try to load each stylesheet sequentially, stopping after the first successful load
const styleCandidates = [
'https://unpkg.com/infobox-control@latest/styles.css',
'https://unpkg.com/infobox-control@latest/dist/styles.css',
'https://unpkg.com/mapbox-gl-infobox@latest/styles.css',
'https://unpkg.com/mapbox-gl-infobox@latest/dist/styles.css'
];
const tryInjectStyle = (href) => new Promise((resolve) => {
const l = document.createElement('link');
l.rel = 'stylesheet';
l.href = href;
l.onload = () => resolve(true);
l.onerror = () => resolve(false);
document.head.appendChild(l);
});
let styleLoaded = false;
for (const href of styleCandidates) {
// eslint-disable-next-line no-await-in-loop
// Use an IIFE to allow await in for loop
// (This code is inside an async function)
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape
// eslint-disable-next-line no-with
// eslint-disable-next-line prefer-promise-reject-errors
// eslint-disable-next-line require-await
// eslint-disable-next-line spaced-comment
// eslint-disable-next-line yoda
// eslint-disable-next-line no-await-in-loop
// eslint-disable-next-line no-restricted-syntax
// eslint-disable-next-line no-undef
// eslint-disable-next-line no-unused-vars
// eslint-disable-next-line no-shadow
// eslint-disable-next-line no-redeclare
// eslint-disable-next-line no-var
// eslint-disable-next-line prefer-const
// eslint-disable-next-line no-constant-condition
// eslint-disable-next-line no-empty
// eslint-disable-next-line no-labels
// eslint-disable-next-line no-lone-blocks
// eslint-disable-next-line no-continue
// eslint-disable-next-line no-unreachable-loop
// eslint-disable-next-line no-unused-expressions
// eslint-disable-next-line no-void
// eslint-disable-next-line no-else-return
// eslint-disable-next-line no-implicit-coercion
// eslint-disable-next-line no-implicit-globals
// eslint-disable-next-line no-iterator
// eslint-disable-next-line no-label-var
// eslint-disable-next-line no-multi-str
// eslint-disable-next-line no-nested-ternary
// eslint-disable-next-line no-new-func
// eslint-disable-next-line no-new-object
// eslint-disable-next-line no-new-wrappers
// eslint-disable-next-line no-proto
// eslint-disable-next-line no-return-assign
// eslint-disable-next-line no-script-url
// eslint-disable-next-line no-self-compare
// eslint-disable-next-line no-sequences
// eslint-disable-next-line no-shadow-restricted-names
// eslint-disable-next-line no-throw-literal
// eslint-disable-next-line no-unused-labels
// eslint-disable-next-line no-useless-call
// eslint-disable-next-line no-useless-catch
// eslint-disable-next-line no-useless-concat
// eslint-disable-next-line no-useless-escape

Copilot uses AI. Check for mistakes.
Comment on lines +4273 to +4279
return template.replace(/\{\{?\s*(\w+)\s*\}?\}/g, (_, k) => (safe[k] ?? ''));
};
} else if (typeof formatter_template === 'string' && formatter_template.length > 0) {
const template = formatter_template;
finalOptions.formatter = (properties) => {
const safe = properties || {};
return template.replace(/\{\{?\s*(\w+)\s*\}?\}/g, (_, k) => (safe[k] ?? ''));
Copy link

Copilot AI Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The template replacement regex /\{\{?\s*(\w+)\s*\}?\}/g matches both single-brace {key} and double-brace {{key}} syntax but is inconsistent. The first brace \{ is required, while the second brace \{? is optional. This creates an asymmetric pattern that may not match the intended syntax. Consider using a more explicit regex that clearly handles both syntaxes separately, or standardize on one format.

Suggested change
return template.replace(/\{\{?\s*(\w+)\s*\}?\}/g, (_, k) => (safe[k] ?? ''));
};
} else if (typeof formatter_template === 'string' && formatter_template.length > 0) {
const template = formatter_template;
finalOptions.formatter = (properties) => {
const safe = properties || {};
return template.replace(/\{\{?\s*(\w+)\s*\}?\}/g, (_, k) => (safe[k] ?? ''));
return template.replace(/\{\{\s*(\w+)\s*\}\}/g, (_, k) => (safe[k] ?? ''));
};
} else if (typeof formatter_template === 'string' && formatter_template.length > 0) {
const template = formatter_template;
finalOptions.formatter = (properties) => {
const safe = properties || {};
return template.replace(/\{\{\s*(\w+)\s*\}\}/g, (_, k) => (safe[k] ?? ''));

Copilot uses AI. Check for mistakes.
if (el && el.classList) {
el.classList.add('maplibregl-ctrl');
el.classList.add('maplibregl-ctrl-group');
if (!el.style.margin) {
Copy link

Copilot AI Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The condition !el.style.margin checks for empty string, but doesn't distinguish between explicitly set empty margin versus no margin style at all. Use el.style.margin === '' for empty string check, or consider using getComputedStyle(el).margin to check the actual computed margin if the goal is to avoid overriding existing margins.

Suggested change
if (!el.style.margin) {
const computedMargin = window.getComputedStyle(el).margin;
if (!computedMargin || computedMargin === '0px') {

Copilot uses AI. Check for mistakes.
Comment on lines +5009 to +5010
const rows = Object.keys(props).map(k => `<tr><th>${k}</th><td>${props[k]}</td></tr>`).join('');
return `<table class="anymap-infobox">${rows}</table>`;
Copy link

Copilot AI Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Property values are inserted directly into HTML without escaping. If feature properties contain user-supplied data or special HTML characters, this could lead to XSS vulnerabilities or rendering issues. Escape HTML entities in both keys and values before inserting them into the template.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants