From 1566bac8f105fcc30e12f1a8c2a241374dbf79b4 Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 24 Jun 2026 07:13:17 +0000 Subject: [PATCH 01/29] Initial commit with task details Adding .gitkeep for PR creation (default mode). This file will be removed when the task is complete. Issue: https://github.com/ProverCoderAI/rust-browser-connection/issues/13 --- .gitkeep | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitkeep b/.gitkeep index a81614e..21bfcdb 100644 --- a/.gitkeep +++ b/.gitkeep @@ -1 +1,2 @@ -# .gitkeep file auto-generated at 2026-05-12T22:59:34.075Z for PR creation at branch issue-50-f6272907aac6 for issue https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/50 \ No newline at end of file +# .gitkeep file auto-generated at 2026-05-12T22:59:34.075Z for PR creation at branch issue-50-f6272907aac6 for issue https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/50 +# Updated: 2026-06-24T07:13:17.623Z \ No newline at end of file From ec8968f4f6aa6739083d0d59b617e466a8bef1ed Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 24 Jun 2026 07:26:15 +0000 Subject: [PATCH 02/29] feat: add personal browser targets --- README.md | 41 ++ ...0260624_071400_personal_browser_targets.md | 6 + src/bin/browser-connection.rs | 36 +- src/browser_target.rs | 149 ++++++++ src/lib.rs | 1 + src/mcp.rs | 358 ++++++++++++++++-- tests/mcp_stdio.rs | 84 ++++ 7 files changed, 643 insertions(+), 32 deletions(-) create mode 100644 changelog.d/20260624_071400_personal_browser_targets.md create mode 100644 src/browser_target.rs diff --git a/README.md b/README.md index 88de6db..f640f05 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,43 @@ args = ["--project", "dg-my-project"] Use `browser-connection`, not `npx @playwright/mcp`. The MCP server starts/reuses the same Rust-managed browser container automatically. +## Personal browser + +You can attach an already running desktop Chrome/Chromium browser if it exposes a CDP port: + +```bash +google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.browser-connection-personal" +``` + +Then point the MCP server at that browser: + +```toml +[mcp_servers.playwright] +command = "browser-connection" +args = ["--project", "dg-my-project", "--personal-browser", "http://127.0.0.1:9222"] +``` + +Multiple browser targets can be configured and switched at runtime: + +```toml +[mcp_servers.playwright] +command = "browser-connection" +args = [ + "--project", "dg-my-project", + "--browser", "personal=http://127.0.0.1:9222", + "--browser", "work=http://127.0.0.1:9333", + "--active-browser", "personal", +] +``` + +Environment alternatives: + +```bash +export BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT=http://127.0.0.1:9222 +export BROWSER_CONNECTION_BROWSERS=work=http://127.0.0.1:9333 +export BROWSER_CONNECTION_ACTIVE_BROWSER=personal +``` + ## Hermes MCP config `~/.hermes/config.yaml`: @@ -70,8 +107,12 @@ browser_click(selector) browser_type(selector, text) browser_press_key(key) browser_take_screenshot(full_page?) +browser_list() +browser_select(name, cdp_endpoint?) ``` +Use `browser_select` with `name=managed` to return to the Rust-managed noVNC/CDP browser, or with `name=personal` and `cdp_endpoint=http://127.0.0.1:9222` to connect a personal browser without restarting the MCP server. + ## Smoke test ```bash diff --git a/changelog.d/20260624_071400_personal_browser_targets.md b/changelog.d/20260624_071400_personal_browser_targets.md new file mode 100644 index 0000000..ed2ced7 --- /dev/null +++ b/changelog.d/20260624_071400_personal_browser_targets.md @@ -0,0 +1,6 @@ +--- +bump: minor +--- + +### Added +- Add named MCP browser targets so agents can connect to a personal CDP browser and switch between personal, external, and Rust-managed browser sessions at runtime. diff --git a/src/bin/browser-connection.rs b/src/bin/browser-connection.rs index 96bc34d..876c8af 100644 --- a/src/bin/browser-connection.rs +++ b/src/bin/browser-connection.rs @@ -7,7 +7,9 @@ use clap::Parser; use docker_git_browser_connection::mcp::{ - project_id_from_env_or_default, run_stdio, McpServerConfig, SERVER_NAME, + active_browser_from_env, browser_endpoints_from_env, parse_named_browser_endpoint, + project_id_from_env_or_default, run_stdio, McpServerConfig, NamedBrowserEndpoint, + PERSONAL_BROWSER_NAME, SERVER_NAME, }; use std::io; @@ -30,6 +32,18 @@ struct Cli { #[arg(long)] cdp_endpoint: Option, + /// Register an additional browser target as NAME=CDP_ENDPOINT. Can be repeated. + #[arg(long = "browser", value_name = "NAME=CDP_ENDPOINT")] + browser: Vec, + + /// Register and select a personal browser CDP endpoint, e.g. http://127.0.0.1:9222. + #[arg(long)] + personal_browser: Option, + + /// Browser target to use at startup: managed, explicit, personal, or a --browser name. + #[arg(long)] + active_browser: Option, + /// Do not start/reuse Docker browser on startup; useful for MCP handshake tests. #[arg(long)] no_start_browser: bool, @@ -38,12 +52,30 @@ struct Cli { fn main() -> anyhow::Result<()> { env_logger::init(); let cli = Cli::parse(); + let mut browser_endpoints = browser_endpoints_from_env()?; + let mut active_browser = active_browser_from_env(); + + for browser in &cli.browser { + browser_endpoints.push(parse_named_browser_endpoint(browser)?); + } + + if let Some(endpoint) = cli.personal_browser { + browser_endpoints.push(NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, endpoint)?); + active_browser = Some(PERSONAL_BROWSER_NAME.to_string()); + } + + if cli.active_browser.is_some() { + active_browser = cli.active_browser; + } + let config = McpServerConfig::new( project_id_from_env_or_default(cli.project), cli.network, cli.cdp_endpoint, !cli.no_start_browser, - ); + ) + .with_browser_endpoints(browser_endpoints) + .with_active_browser(active_browser)?; let stdin = io::stdin(); let stdout = io::stdout(); diff --git a/src/browser_target.rs b/src/browser_target.rs new file mode 100644 index 0000000..48db4e3 --- /dev/null +++ b/src/browser_target.rs @@ -0,0 +1,149 @@ +use anyhow::{anyhow, Result}; +use std::env; + +pub const MANAGED_BROWSER_NAME: &str = "managed"; +pub const EXPLICIT_BROWSER_NAME: &str = "explicit"; +pub const PERSONAL_BROWSER_NAME: &str = "personal"; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct NamedBrowserEndpoint { + pub name: String, + pub cdp_endpoint: String, +} + +impl NamedBrowserEndpoint { + pub fn new(name: impl AsRef, cdp_endpoint: impl AsRef) -> Result { + let name = normalize_configured_browser_name(name.as_ref())?; + let cdp_endpoint = normalize_cdp_endpoint(cdp_endpoint.as_ref())?; + Ok(Self { name, cdp_endpoint }) + } +} + +pub fn parse_named_browser_endpoint(value: &str) -> Result { + let (name, endpoint) = value + .split_once('=') + .ok_or_else(|| anyhow!("browser endpoint must use NAME=CDP_ENDPOINT format"))?; + NamedBrowserEndpoint::new(name, endpoint) +} + +pub fn parse_named_browser_endpoints(value: &str) -> Result> { + value + .split([',', ';']) + .map(str::trim) + .filter(|entry| !entry.is_empty()) + .map(parse_named_browser_endpoint) + .collect() +} + +pub fn browser_endpoints_from_env() -> Result> { + let mut endpoints = Vec::new(); + + if let Some(value) = nonempty_env("BROWSER_CONNECTION_BROWSERS") { + endpoints.extend(parse_named_browser_endpoints(&value)?); + } + + if let Some(endpoint) = nonempty_env("BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT") { + endpoints.push(NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, endpoint)?); + } + + Ok(endpoints) +} + +pub fn active_browser_from_env() -> Option { + nonempty_env("BROWSER_CONNECTION_ACTIVE_BROWSER") +} + +pub(crate) fn configured_browser_kind(name: &str) -> &'static str { + if name == PERSONAL_BROWSER_NAME { + "personal" + } else { + "external" + } +} + +pub(crate) fn normalize_browser_name(name: &str) -> Result { + let name = name.trim(); + if name.is_empty() { + return Err(anyhow!("browser name must not be empty")); + } + if !name + .chars() + .all(|ch| ch.is_ascii_alphanumeric() || matches!(ch, '-' | '_' | '.')) + { + return Err(anyhow!( + "browser name `{name}` may only contain ASCII letters, digits, '.', '_' or '-'" + )); + } + Ok(name.to_string()) +} + +pub(crate) fn normalize_cdp_endpoint(endpoint: &str) -> Result { + let endpoint = endpoint.trim().trim_end_matches('/'); + if endpoint.is_empty() { + return Err(anyhow!("CDP endpoint must not be empty")); + } + let endpoint = endpoint + .strip_suffix("/json/version") + .or_else(|| endpoint.strip_suffix("/json/list")) + .unwrap_or(endpoint) + .trim_end_matches('/'); + if !(endpoint.starts_with("http://") || endpoint.starts_with("https://")) { + return Err(anyhow!( + "CDP endpoint `{endpoint}` must start with http:// or https://" + )); + } + Ok(endpoint.to_string()) +} + +pub(crate) fn upsert_browser_endpoint( + endpoints: &mut Vec, + endpoint: NamedBrowserEndpoint, +) { + if let Some(existing) = endpoints + .iter_mut() + .find(|existing| existing.name == endpoint.name) + { + *existing = endpoint; + } else { + endpoints.push(endpoint); + } +} + +fn normalize_configured_browser_name(name: &str) -> Result { + let name = normalize_browser_name(name)?; + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Err(anyhow!( + "`{name}` is reserved and cannot name a configured browser" + )); + } + Ok(name) +} + +fn nonempty_env(name: &str) -> Option { + env::var(name) + .ok() + .map(|value| value.trim().to_string()) + .filter(|value| !value.is_empty()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_named_personal_browser_endpoint() { + let endpoint = parse_named_browser_endpoint("personal=http://127.0.0.1:9222/json/version") + .expect("personal endpoint parses"); + + assert_eq!(endpoint.name, PERSONAL_BROWSER_NAME); + assert_eq!(endpoint.cdp_endpoint, "http://127.0.0.1:9222"); + } + + #[test] + fn rejects_reserved_configured_browser_names() { + let error = NamedBrowserEndpoint::new(MANAGED_BROWSER_NAME, "http://127.0.0.1:9222") + .expect_err("managed is reserved"); + + assert!(error.to_string().contains("reserved")); + } +} diff --git a/src/lib.rs b/src/lib.rs index cabde1e..f6ccdf0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,6 +15,7 @@ */ mod browser; +mod browser_target; pub mod cdp; pub mod mcp; diff --git a/src/mcp.rs b/src/mcp.rs index 035b271..8e96ed0 100644 --- a/src/mcp.rs +++ b/src/mcp.rs @@ -7,17 +7,26 @@ REF: https://github.com/ProverCoderAI/docker-git/issues/347 SOURCE: n/a FORMAT THEOREM: initialize ∧ tools/list -> MCP-compatible JSON-RPC responses with browser tools. PURITY: SHELL -EFFECT: stdio JSON-RPC and optional CDP/browser Docker startup. -INVARIANT: MCP startup resolves exactly one CDP endpoint from BrowserConnection or an explicit override. +EFFECT: stdio JSON-RPC, optional CDP/browser Docker startup, and active browser target selection. +INVARIANT: browser tools always target the active CDP endpoint: managed, explicit, or configured. */ +use crate::browser_target::{ + configured_browser_kind, normalize_browser_name, normalize_cdp_endpoint, + upsert_browser_endpoint, +}; use crate::cdp::CdpClient; -use crate::{render_cdp_url, BrowserConnection}; +use crate::{compute_browser_ports, render_cdp_url, render_cdp_url_for_ports, BrowserConnection}; use anyhow::{anyhow, Context, Result}; use serde_json::{json, Value}; use std::env; use std::io::{BufRead, Write}; +pub use crate::browser_target::{ + active_browser_from_env, browser_endpoints_from_env, parse_named_browser_endpoint, + parse_named_browser_endpoints, NamedBrowserEndpoint, EXPLICIT_BROWSER_NAME, + MANAGED_BROWSER_NAME, PERSONAL_BROWSER_NAME, +}; pub const SERVER_NAME: &str = "browser-connection"; pub const MCP_PROTOCOL_VERSION: &str = "2025-11-25"; pub const PREVIOUS_MCP_PROTOCOL_VERSION: &str = "2025-06-18"; @@ -36,6 +45,8 @@ pub struct McpServerConfig { pub network: Option, pub cdp_endpoint: Option, pub start_browser: bool, + pub browser_endpoints: Vec, + pub active_browser: Option, } impl McpServerConfig { @@ -50,8 +61,25 @@ impl McpServerConfig { network, cdp_endpoint, start_browser, + browser_endpoints: Vec::new(), + active_browser: None, } } + + pub fn with_browser_endpoints(mut self, endpoints: Vec) -> Self { + for endpoint in endpoints { + upsert_browser_endpoint(&mut self.browser_endpoints, endpoint); + } + self + } + + pub fn with_active_browser(mut self, active_browser: Option) -> Result { + self.active_browser = active_browser + .as_deref() + .map(normalize_browser_name) + .transpose()?; + Ok(self) + } } pub fn project_id_from_env_or_default(project_id: Option) -> String { @@ -74,8 +102,9 @@ where while let Some(message) = read_message(&mut reader, &mut transport)? { match handle_message(&mut runtime, &message) { Ok(Some(response)) => { - let transport = transport - .ok_or_else(|| anyhow!("stdio transport was unknown after reading a message"))?; + let transport = transport.ok_or_else(|| { + anyhow!("stdio transport was unknown after reading a message") + })?; write_message(&mut writer, &response, transport)?; } Ok(None) => {} @@ -97,38 +126,185 @@ where #[derive(Debug, Clone, PartialEq, Eq)] struct McpRuntime { config: McpServerConfig, - cdp_endpoint: Option, + managed_cdp_endpoint: Option, + active_browser: String, } impl McpRuntime { fn new(config: McpServerConfig) -> Self { + let active_browser = config.active_browser.clone().unwrap_or_else(|| { + if has_explicit_cdp_endpoint(&config) { + EXPLICIT_BROWSER_NAME.to_string() + } else { + MANAGED_BROWSER_NAME.to_string() + } + }); + Self { config, - cdp_endpoint: None, + managed_cdp_endpoint: None, + active_browser, } } - fn cdp_endpoint(&mut self) -> Result<&str> { - if self.cdp_endpoint.is_none() { - self.cdp_endpoint = Some(resolve_cdp_endpoint(&self.config)?); + fn cdp_endpoint(&mut self) -> Result { + match self.active_browser.as_str() { + MANAGED_BROWSER_NAME => self.managed_cdp_endpoint(), + EXPLICIT_BROWSER_NAME => explicit_cdp_endpoint(&self.config) + .ok_or_else(|| anyhow!("explicit CDP endpoint is not configured")), + name => self + .config + .browser_endpoints + .iter() + .find(|endpoint| endpoint.name == name) + .map(|endpoint| endpoint.cdp_endpoint.clone()) + .ok_or_else(|| { + anyhow!( + "Unknown browser `{name}`. Available browsers: {}", + self.available_browser_names().join(", ") + ) + }), } + } - self.cdp_endpoint - .as_deref() - .ok_or_else(|| anyhow!("CDP endpoint cache was empty after resolution")) + fn managed_cdp_endpoint(&mut self) -> Result { + if self.managed_cdp_endpoint.is_none() { + self.managed_cdp_endpoint = Some(resolve_managed_cdp_endpoint(&self.config)?); + } + + self.managed_cdp_endpoint + .clone() + .ok_or_else(|| anyhow!("managed CDP endpoint cache was empty after resolution")) } -} -fn resolve_cdp_endpoint(config: &McpServerConfig) -> Result { - if let Some(endpoint) = config - .cdp_endpoint - .as_deref() - .map(str::trim) - .filter(|endpoint| !endpoint.is_empty()) - { - return Ok(endpoint.to_string()); + fn browser_inventory_text(&self) -> Result { + serde_json::to_string_pretty(&self.browser_inventory()) + .context("failed to render browser inventory") + } + + fn browser_inventory(&self) -> Value { + let mut browsers = vec![self.managed_browser_entry()]; + + if let Some(endpoint) = explicit_cdp_endpoint(&self.config) { + browsers.push(browser_entry( + EXPLICIT_BROWSER_NAME, + "explicit", + Some(endpoint), + "configured", + self.active_browser == EXPLICIT_BROWSER_NAME, + )); + } + + for endpoint in &self.config.browser_endpoints { + browsers.push(browser_entry( + &endpoint.name, + configured_browser_kind(&endpoint.name), + Some(endpoint.cdp_endpoint.clone()), + "configured", + self.active_browser == endpoint.name, + )); + } + + json!({ + "active": self.active_browser, + "browsers": browsers + }) } + fn managed_browser_entry(&self) -> Value { + let cached_endpoint = self.managed_cdp_endpoint.clone(); + let endpoint = cached_endpoint + .clone() + .or_else(|| (!self.config.start_browser).then(render_cdp_url)) + .or_else(|| { + let ports = compute_browser_ports(&self.config.project_id); + Some(render_cdp_url_for_ports(ports)) + }); + let resolution = if cached_endpoint.is_some() { + "resolved" + } else if self.config.start_browser { + "auto-start" + } else { + "default-localhost" + }; + + browser_entry( + MANAGED_BROWSER_NAME, + "managed", + endpoint, + resolution, + self.active_browser == MANAGED_BROWSER_NAME, + ) + } + + fn select_browser(&mut self, name: &str, cdp_endpoint: Option<&str>) -> Result { + let name = normalize_browser_name(name)?; + + if let Some(endpoint) = cdp_endpoint { + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Err(anyhow!( + "`{name}` is reserved; choose a custom name such as `{PERSONAL_BROWSER_NAME}`" + )); + } + let endpoint = NamedBrowserEndpoint::new(&name, endpoint)?; + upsert_browser_endpoint(&mut self.config.browser_endpoints, endpoint); + } else { + self.ensure_browser_exists(&name)?; + } + + self.active_browser = name; + serde_json::to_string_pretty(&json!({ + "selected": self.active_browser, + "browser": self.browser_inventory() + .get("browsers") + .and_then(Value::as_array) + .and_then(|browsers| browsers.iter().find(|browser| { + browser.get("name").and_then(Value::as_str) == Some(self.active_browser.as_str()) + })) + .cloned() + .unwrap_or(Value::Null) + })) + .context("failed to render browser selection") + } + + fn ensure_browser_exists(&self, name: &str) -> Result<()> { + if name == MANAGED_BROWSER_NAME { + return Ok(()); + } + if name == EXPLICIT_BROWSER_NAME && has_explicit_cdp_endpoint(&self.config) { + return Ok(()); + } + if self + .config + .browser_endpoints + .iter() + .any(|endpoint| endpoint.name == name) + { + return Ok(()); + } + + Err(anyhow!( + "Unknown browser `{name}`. Available browsers: {}", + self.available_browser_names().join(", ") + )) + } + + fn available_browser_names(&self) -> Vec { + let mut names = vec![MANAGED_BROWSER_NAME.to_string()]; + if has_explicit_cdp_endpoint(&self.config) { + names.push(EXPLICIT_BROWSER_NAME.to_string()); + } + names.extend( + self.config + .browser_endpoints + .iter() + .map(|endpoint| endpoint.name.clone()), + ); + names + } +} + +fn resolve_managed_cdp_endpoint(config: &McpServerConfig) -> Result { if !config.start_browser { return Ok(render_cdp_url()); } @@ -138,6 +314,33 @@ fn resolve_cdp_endpoint(config: &McpServerConfig) -> Result { Ok(info.cdp_url) } +fn explicit_cdp_endpoint(config: &McpServerConfig) -> Option { + config + .cdp_endpoint + .as_deref() + .and_then(|endpoint| normalize_cdp_endpoint(endpoint).ok()) +} + +fn has_explicit_cdp_endpoint(config: &McpServerConfig) -> bool { + explicit_cdp_endpoint(config).is_some() +} + +fn browser_entry( + name: &str, + kind: &str, + cdp_endpoint: Option, + resolution: &str, + active: bool, +) -> Value { + json!({ + "name": name, + "kind": kind, + "cdpEndpoint": cdp_endpoint, + "resolution": resolution, + "active": active + }) +} + fn read_message( reader: &mut R, transport: &mut Option, @@ -340,9 +543,24 @@ fn initialize_result(protocol_version: &str) -> Value { fn tool_definitions() -> Vec { vec![ + tool( + "browser_list", + "List available browser targets and show which target is active.", + json!({}), + vec![], + ), + tool( + "browser_select", + "Switch the active browser target by name, optionally registering a CDP endpoint first.", + json!({ + "name": { "type": "string", "description": "Browser target name, e.g. managed or personal" }, + "cdp_endpoint": { "type": "string", "description": "Optional CDP endpoint to register for this browser name" } + }), + vec!["name"], + ), tool( "browser_navigate", - "Navigate the noVNC-visible Chromium page to a URL through the Rust CDP adapter.", + "Navigate the active browser page to a URL through the Rust CDP adapter.", json!({ "url": { "type": "string", "description": "Absolute URL to open" } }), vec!["url"], ), @@ -405,9 +623,16 @@ fn handle_tool_call(runtime: &mut McpRuntime, request: &Value) -> Value { let name = params.get("name").and_then(Value::as_str).unwrap_or(""); let arguments = params.get("arguments").unwrap_or(&Value::Null); - let result = runtime - .cdp_endpoint() - .and_then(|cdp_endpoint| dispatch_tool(cdp_endpoint, name, arguments)); + let result = match name { + "browser_list" => runtime.browser_inventory_text(), + "browser_select" => runtime.select_browser( + required_str(arguments, "name").unwrap_or(""), + arguments.get("cdp_endpoint").and_then(Value::as_str), + ), + _ => runtime + .cdp_endpoint() + .and_then(|cdp_endpoint| dispatch_tool(&cdp_endpoint, name, arguments)), + }; match result { Ok(text) => tool_result(text, false), Err(error) => tool_result(format!("{error:#}"), true), @@ -488,7 +713,9 @@ mod tests { let mut responses = Vec::new(); let mut transport = Some(StdioTransport::Framed); - while let Some(message) = read_message(&mut cursor, &mut transport).expect("stdout frame parses") { + while let Some(message) = + read_message(&mut cursor, &mut transport).expect("stdout frame parses") + { responses.push(serde_json::from_str(&message).expect("stdout frame body is JSON")); } @@ -596,7 +823,8 @@ mod tests { ) .expect("tools/list succeeds"); - assert_eq!(runtime.cdp_endpoint, None); + assert_eq!(runtime.managed_cdp_endpoint, None); + assert_eq!(runtime.active_browser, MANAGED_BROWSER_NAME); } #[test] @@ -612,7 +840,10 @@ mod tests { .expect("request with id returns a response"); assert_eq!(response["result"]["protocolVersion"], "2024-11-05"); - assert_eq!(response["result"]["capabilities"]["tools"]["listChanged"], false); + assert_eq!( + response["result"]["capabilities"]["tools"]["listChanged"], + false + ); } #[test] @@ -678,7 +909,7 @@ mod tests { .expect("request with id returns a response"); assert_eq!( - runtime.cdp_endpoint.as_deref(), + runtime.managed_cdp_endpoint.as_deref(), Some(expected_cdp_url.as_str()) ); assert_eq!(response["id"], 3); @@ -688,4 +919,71 @@ mod tests { .expect("tool result text exists") .contains("Unknown browser-connection tool")); } + + #[test] + fn configured_personal_browser_can_be_active_without_docker() { + let config = McpServerConfig::new("dg-test", None, None, true) + .with_browser_endpoints(vec![NamedBrowserEndpoint::new( + PERSONAL_BROWSER_NAME, + "http://127.0.0.1:9333", + ) + .expect("endpoint is valid")]) + .with_active_browser(Some(PERSONAL_BROWSER_NAME.to_string())) + .expect("active browser name is valid"); + let mut runtime = McpRuntime::new(config); + + assert_eq!( + runtime.cdp_endpoint().expect("personal endpoint resolves"), + "http://127.0.0.1:9333" + ); + assert_eq!(runtime.managed_cdp_endpoint, None); + } + + #[test] + fn browser_select_registers_ad_hoc_personal_endpoint_without_resolving_managed_browser() { + let config = McpServerConfig::new("dg-test", None, None, true); + let mut runtime = McpRuntime::new(config); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"browser_select","arguments":{"name":"personal","cdp_endpoint":"http://127.0.0.1:9444"}}}"#, + ) + .expect("browser_select response serializes") + .expect("request with id returns a response"); + + assert_eq!(response["id"], 4); + assert_eq!(response["result"]["isError"], false); + assert_eq!(runtime.active_browser, PERSONAL_BROWSER_NAME); + assert_eq!(runtime.managed_cdp_endpoint, None); + assert_eq!( + runtime.cdp_endpoint().expect("personal endpoint resolves"), + "http://127.0.0.1:9444" + ); + } + + #[test] + fn browser_list_reports_active_personal_browser() { + let config = McpServerConfig::new("dg-test", None, None, false) + .with_browser_endpoints(vec![NamedBrowserEndpoint::new( + PERSONAL_BROWSER_NAME, + "http://127.0.0.1:9222", + ) + .expect("endpoint is valid")]) + .with_active_browser(Some(PERSONAL_BROWSER_NAME.to_string())) + .expect("active browser name is valid"); + let runtime = McpRuntime::new(config); + + let inventory = runtime.browser_inventory(); + + assert_eq!(inventory["active"], PERSONAL_BROWSER_NAME); + assert!(inventory["browsers"] + .as_array() + .expect("browsers array") + .iter() + .any(|browser| { + browser["name"] == PERSONAL_BROWSER_NAME + && browser["kind"] == "personal" + && browser["active"] == true + })); + } } diff --git a/tests/mcp_stdio.rs b/tests/mcp_stdio.rs index 05b7174..6f4e84b 100644 --- a/tests/mcp_stdio.rs +++ b/tests/mcp_stdio.rs @@ -60,6 +60,9 @@ fn browser_connection_help_exposes_custom_mcp_command_without_npx() { let stdout = String::from_utf8_lossy(&output.stdout); assert!(stdout.contains("browser-connection")); assert!(stdout.contains("--project")); + assert!(stdout.contains("--browser")); + assert!(stdout.contains("--personal-browser")); + assert!(stdout.contains("--active-browser")); assert!(stdout.contains("--no-start-browser")); assert!(!stdout.contains("playwright/mcp")); assert!(!stdout.contains("npx")); @@ -144,6 +147,87 @@ fn browser_connection_stdio_initializes_and_lists_browser_tools_without_docker() assert!(names.contains(&"browser_type")); assert!(names.contains(&"browser_press_key")); assert!(names.contains(&"browser_take_screenshot")); + assert!(names.contains(&"browser_list")); + assert!(names.contains(&"browser_select")); +} + +#[test] +fn browser_connection_stdio_selects_personal_browser_without_docker() { + let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) + .args(["--project", "dg-test", "--no-start-browser"]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("Failed to spawn browser-connection MCP server"); + + { + let stdin = child.stdin.as_mut().expect("stdin is piped"); + let mut input = Vec::new(); + input.extend(encode_message(serde_json::json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { "name": "probe", "version": "0" } + } + }))); + input.extend(encode_message(serde_json::json!({ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/call", + "params": { + "name": "browser_select", + "arguments": { + "name": "personal", + "cdp_endpoint": "http://127.0.0.1:9444/json/version" + } + } + }))); + input.extend(encode_message(serde_json::json!({ + "jsonrpc": "2.0", + "id": 3, + "method": "tools/call", + "params": { + "name": "browser_list", + "arguments": {} + } + }))); + stdin + .write_all(&input) + .expect("write MCP browser selection requests"); + } + drop(child.stdin.take()); + + let output = child + .wait_with_output() + .expect("browser-connection process exits after stdin EOF"); + assert!( + output.status.success(), + "stderr: {}", + String::from_utf8_lossy(&output.stderr) + ); + + let responses = decode_messages(&output.stdout); + assert_eq!(responses.len(), 3); + assert_eq!(responses[1]["result"]["isError"], false); + let inventory_text = responses[2]["result"]["content"][0]["text"] + .as_str() + .expect("browser_list returns text content"); + let inventory: Value = serde_json::from_str(inventory_text).expect("browser_list text is JSON"); + + assert_eq!(inventory["active"], "personal"); + assert!(inventory["browsers"] + .as_array() + .expect("browsers array") + .iter() + .any(|browser| { + browser["name"] == "personal" + && browser["cdpEndpoint"] == "http://127.0.0.1:9444" + && browser["active"] == true + })); } #[test] From 0c56a862bb0c341c35df9d3b94128a6ca405c9b3 Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 24 Jun 2026 07:33:30 +0000 Subject: [PATCH 03/29] Revert "Initial commit with task details" This reverts commit 1566bac8f105fcc30e12f1a8c2a241374dbf79b4. --- .gitkeep | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitkeep b/.gitkeep index 21bfcdb..a81614e 100644 --- a/.gitkeep +++ b/.gitkeep @@ -1,2 +1 @@ -# .gitkeep file auto-generated at 2026-05-12T22:59:34.075Z for PR creation at branch issue-50-f6272907aac6 for issue https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/50 -# Updated: 2026-06-24T07:13:17.623Z \ No newline at end of file +# .gitkeep file auto-generated at 2026-05-12T22:59:34.075Z for PR creation at branch issue-50-f6272907aac6 for issue https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/issues/50 \ No newline at end of file From 25fac54918b61ede142a82a820862ea3f6af7753 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Wed, 24 Jun 2026 12:55:24 +0000 Subject: [PATCH 04/29] Add browser share relay and Edge extension artifact --- Cargo.toml | 4 + README.md | 100 +- artifacts/README.md | 15 + artifacts/edge-share-extension.tar.gz | Bin 0 -> 9833 bytes ...0260624_071400_personal_browser_targets.md | 3 + extension/edge-share/README.md | 102 ++ extension/edge-share/manifest.json | 26 + extension/edge-share/popup.html | 189 ++++ extension/edge-share/popup.js | 158 ++++ extension/edge-share/service_worker.js | 884 ++++++++++++++++++ src/bin/browser-connection-relay.rs | 22 + src/bin/browser-connection.rs | 85 +- src/browser.rs | 346 ++++--- src/browser/assets.rs | 71 ++ src/browser/tests.rs | 81 ++ src/browser_target.rs | 417 ++++++++- src/lib.rs | 212 +++++ src/mcp.rs | 639 ++++++------- src/mcp/control_panel.rs | 602 ++++++++++++ src/mcp/tests.rs | 409 ++++++++ src/shared_browser.rs | 752 +++++++++++++++ tests/mcp_stdio.rs | 161 +++- tests/shared_browser_relay.rs | 181 ++++ 23 files changed, 4982 insertions(+), 477 deletions(-) create mode 100644 artifacts/README.md create mode 100644 artifacts/edge-share-extension.tar.gz create mode 100644 extension/edge-share/README.md create mode 100644 extension/edge-share/manifest.json create mode 100644 extension/edge-share/popup.html create mode 100644 extension/edge-share/popup.js create mode 100644 extension/edge-share/service_worker.js create mode 100644 src/bin/browser-connection-relay.rs create mode 100644 src/browser/assets.rs create mode 100644 src/browser/tests.rs create mode 100644 src/mcp/control_panel.rs create mode 100644 src/mcp/tests.rs create mode 100644 src/shared_browser.rs create mode 100644 tests/shared_browser_relay.rs diff --git a/Cargo.toml b/Cargo.toml index 0eabfc8..b8d2cf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,10 @@ tungstenite = "0.24" name = "browser-connection" path = "src/bin/browser-connection.rs" +[[bin]] +name = "browser-connection-relay" +path = "src/bin/browser-connection-relay.rs" + [dev-dependencies] tempfile = "=3.10.1" proptest = "=1.4.0" diff --git a/README.md b/README.md index f640f05..168857c 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Installs two binaries: ```text docker-git-browser-connection # start/status browser container browser-connection # MCP stdio server for Codex/Hermes +browser-connection-relay # WebSocket relay for browser share links ``` ## Start browser manually @@ -46,44 +47,117 @@ args = ["--project", "dg-my-project"] ``` Use `browser-connection`, not `npx @playwright/mcp`. The MCP server starts/reuses the same Rust-managed browser container automatically. +It also starts a local browser/noVNC control panel by default; `browser_list` reports its +`controlPanelUrl`. + +Optional panel controls: + +```toml +[mcp_servers.playwright] +command = "browser-connection" +args = ["--project", "dg-my-project", "--control-port", "6888"] +``` + +Use `--no-control-panel` for headless tests or when another process owns the chosen port. + +## Share a remote Edge by link + +For a remote Microsoft Edge where you do not want SSH, VPN, or an exposed CDP port, use the Edge +share extension plus the relay: + +```bash +browser-connection-relay --bind 127.0.0.1:8765 +``` + +In Edge, load `extension/edge-share` as an unpacked extension, open the extension popup, keep the +relay URL as `http://127.0.0.1:8765` for local testing or set your hosted relay URL, then click +`Share` and copy the link. + +Open the `browser-connection` control panel (`controlPanelUrl` from `browser_list`), paste the link +into `Shared Link`, and add it as `edge`. The target appears as `kind=shared-extension`; selecting +it makes MCP tools route through the extension session instead of a CDP port: + +```toml +[mcp_servers.playwright] +command = "browser-connection" +args = [ + "--project", "dg-my-project", + "--browser-share", "edge=https://relay.example/share/session#agent=token", + "--active-browser", "managed", +] +``` + +The share link is a bearer credential. Anyone with the link can control that shared session until +the user clicks `Stop` in the extension or the relay session is removed. Extension sharing supports +common browser tools such as navigate, snapshot, evaluate, click, type, key press, and screenshot, +but it is not full CDP/VNC parity and protected Edge pages may reject actions. ## Personal browser -You can attach an already running desktop Chrome/Chromium browser if it exposes a CDP port: +You can attach an already running desktop Chrome/Chromium browser if it exposes a CDP port. +When `browser-connection` runs inside Docker, use a host-reachable address such as +`host.docker.internal`, not `127.0.0.1`. + +```bash +google-chrome \ + --remote-debugging-address=0.0.0.0 \ + --remote-debugging-port=9222 \ + --user-data-dir="$HOME/.browser-connection-personal" \ + --no-first-run +``` + +To also view that desktop browser through noVNC, expose the host desktop/browser through VNC: ```bash -google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.browser-connection-personal" +x11vnc -display :0 -rfbport 5900 -listen 0.0.0.0 -nopw -forever -shared ``` -Then point the MCP server at that browser: +Then register both the CDP endpoint and the VNC display endpoint: ```toml [mcp_servers.playwright] command = "browser-connection" -args = ["--project", "dg-my-project", "--personal-browser", "http://127.0.0.1:9222"] +args = [ + "--project", "dg-my-project", + "--personal-browser", "http://host.docker.internal:9222", + "--personal-vnc", "host.docker.internal:5900", +] ``` -Multiple browser targets can be configured and switched at runtime: +Multiple browser targets can be configured and switched at runtime. This example starts on the +Docker-managed noVNC browser and keeps the personal browser ready in the noVNC control panel: ```toml [mcp_servers.playwright] command = "browser-connection" args = [ "--project", "dg-my-project", - "--browser", "personal=http://127.0.0.1:9222", + "--browser", "personal=http://host.docker.internal:9222", + "--browser-vnc", "personal=host.docker.internal:5900", "--browser", "work=http://127.0.0.1:9333", - "--active-browser", "personal", + "--active-browser", "managed", ] ``` Environment alternatives: ```bash -export BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT=http://127.0.0.1:9222 +export BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT=http://host.docker.internal:9222 +export BROWSER_CONNECTION_PERSONAL_VNC_ENDPOINT=host.docker.internal:5900 export BROWSER_CONNECTION_BROWSERS=work=http://127.0.0.1:9333 -export BROWSER_CONNECTION_ACTIVE_BROWSER=personal +export BROWSER_CONNECTION_BROWSER_VNCS=work=host.docker.internal:5901 +export BROWSER_CONNECTION_BROWSER_SHARES=edge=https://relay.example/share/session#agent=token +export BROWSER_CONNECTION_ACTIVE_BROWSER=managed ``` +`browser_list` reports each target's `cdpEndpoint`, `vncEndpoint`, `novncUrl`, and `shareUrl`. If a +target has a VNC endpoint but no explicit noVNC URL, `browser_select` starts a lightweight noVNC +proxy for that target unless `--no-start-browser` is set. + +Open the reported `controlPanelUrl` to choose `managed`, `personal`, or any configured browser from +the noVNC UI. The same `browser-connection` process keeps running, and MCP browser tools use the new +active target on the next tool call. + ## Hermes MCP config `~/.hermes/config.yaml`: @@ -108,10 +182,14 @@ browser_type(selector, text) browser_press_key(key) browser_take_screenshot(full_page?) browser_list() -browser_select(name, cdp_endpoint?) +browser_select(name, cdp_endpoint?, vnc_endpoint?, novnc_url?, share_url?) ``` -Use `browser_select` with `name=managed` to return to the Rust-managed noVNC/CDP browser, or with `name=personal` and `cdp_endpoint=http://127.0.0.1:9222` to connect a personal browser without restarting the MCP server. +The noVNC control panel is the interactive switcher. Use `browser_select` with `name=managed` to +return to the Rust-managed noVNC/CDP browser, or with +`name=personal`, `cdp_endpoint=http://host.docker.internal:9222`, and +`vnc_endpoint=host.docker.internal:5900` to connect a personal browser without restarting the MCP +server. ## Smoke test diff --git a/artifacts/README.md b/artifacts/README.md new file mode 100644 index 0000000..0c1382e --- /dev/null +++ b/artifacts/README.md @@ -0,0 +1,15 @@ +# Downloadable Artifacts + +## Edge share extension + +Download `edge-share-extension.tar.gz`, extract it, then open Edge: + +```text +edge://extensions +``` + +Enable `Developer mode`, choose `Load unpacked`, and select the extracted +`edge-share` folder. + +The extension connects to `browser-connection-relay` and produces share links +that can be pasted into the `browser-connection` control panel. diff --git a/artifacts/edge-share-extension.tar.gz b/artifacts/edge-share-extension.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1f3409a8cea50103637a9c3782720b39199ed809 GIT binary patch literal 9833 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 literal 0 HcmV?d00001 diff --git a/changelog.d/20260624_071400_personal_browser_targets.md b/changelog.d/20260624_071400_personal_browser_targets.md index ed2ced7..a3fc29b 100644 --- a/changelog.d/20260624_071400_personal_browser_targets.md +++ b/changelog.d/20260624_071400_personal_browser_targets.md @@ -4,3 +4,6 @@ bump: minor ### Added - Add named MCP browser targets so agents can connect to a personal CDP browser and switch between personal, external, and Rust-managed browser sessions at runtime. +- Add optional VNC/noVNC display metadata for browser targets, including a Docker-managed noVNC proxy for host personal browsers. +- Add a local noVNC control panel for choosing the active browser target while one `browser-connection` MCP process keeps running. +- Add link-based shared browser targets through an Edge extension, `browser-connection-relay`, and `--browser-share NAME=URL`. diff --git a/extension/edge-share/README.md b/extension/edge-share/README.md new file mode 100644 index 0000000..d01b3ca --- /dev/null +++ b/extension/edge-share/README.md @@ -0,0 +1,102 @@ +# Browser Connection Edge Share + +Static Microsoft Edge extension skeleton for sharing a running Edge browser with +`browser-connection` through a relay link. This directory intentionally has no +build step and no dependencies. + +## Install for development + +1. Open `edge://extensions`. +2. Enable `Developer mode`. +3. Choose `Load unpacked`. +4. Select this `extension/edge-share` directory. +5. Open the extension popup, enter the relay URL, and click `Share`. + +The popup generates a one-time browser session and a share link such as: + +```text +https://relay.example.com/share/#agent= +``` + +The extension connects as the browser side to: + +```text +wss://relay.example.com/ws/browser/?token=&agent_token= +``` + +For local development, `http://127.0.0.1:8765` becomes +`ws://127.0.0.1:8765/ws/browser/...`. + +## Relay protocol + +On WebSocket open the extension sends: + +```json +{ + "type": "hello", + "role": "browser", + "protocolVersion": 1, + "sessionId": "", + "userAgent": "" +} +``` + +The relay forwards command messages from the agent: + +```json +{ + "type": "command", + "id": "request-1", + "command": "navigate", + "params": { + "url": "https://example.com" + } +} +``` + +The extension replies: + +```json +{ + "type": "response", + "id": "request-1", + "ok": true, + "result": {} +} +``` + +Failed commands return `ok: false` and an `error` string. + +## Commands + +All commands accept optional `params.tabId`. If omitted, the extension uses the +last selected tab or the active tab in the last focused window. + +- `navigate`: requires `url`; uses `chrome.tabs.update`. +- `evaluate`: requires `expression`; runs JavaScript with `Runtime.evaluate`. +- `snapshot`: returns title, URL, visible text, active element, and common + interactive elements. +- `click`: requires `selector`; scrolls, dispatches mouse events, and calls + `click()`. +- `type`: requires `text`; uses `selector` when provided, otherwise the active + element. Set `replace: true` to replace existing input text. +- `press_key`: requires `key`; dispatches common keyboard events through CDP. +- `screenshot`: returns a base64 PNG by default, or JPEG with + `format: "jpeg"`. +- `list_tabs`: returns basic tab metadata. +- `activate_tab`: activates `tabId` or the current target tab. + +## Notes and limits + +- This extension is the browser side for `browser-connection-relay` and the + `browser-connection` shared-extension driver. +- `chrome.debugger` exposes useful CDP commands but is not identical to a full + remote debugging port. +- Pages such as `edge://`, extension pages, store pages, and policy-restricted + tabs may reject debugger, scripting, or screenshot actions. +- The share link should be treated as a bearer credential. Anyone with the link + can control the shared session until the user clicks `Stop` or the relay + expires the session. +- The extension uses broad host permissions so it can connect to arbitrary relay + hosts during development. A production build should narrow this to known relay + origins. diff --git a/extension/edge-share/manifest.json b/extension/edge-share/manifest.json new file mode 100644 index 0000000..8787079 --- /dev/null +++ b/extension/edge-share/manifest.json @@ -0,0 +1,26 @@ +{ + "manifest_version": 3, + "name": "Browser Connection Edge Share", + "version": "0.1.0", + "description": "Share this Edge browser with browser-connection through a relay link.", + "permissions": [ + "activeTab", + "debugger", + "scripting", + "storage", + "tabs" + ], + "host_permissions": [ + "" + ], + "background": { + "service_worker": "service_worker.js" + }, + "action": { + "default_title": "Edge Share", + "default_popup": "popup.html" + }, + "content_security_policy": { + "extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' http://* https://* ws://* wss://*;" + } +} diff --git a/extension/edge-share/popup.html b/extension/edge-share/popup.html new file mode 100644 index 0000000..61b443a --- /dev/null +++ b/extension/edge-share/popup.html @@ -0,0 +1,189 @@ + + + + + Edge Share + + + +
+

Edge Share

+ +
+ + Loading +
+ + + + + +
+ + + +
+ +

+ Keep Edge open while sharing. Anyone with the share link can control this browser session through the relay. +

+

+
+ + + + diff --git a/extension/edge-share/popup.js b/extension/edge-share/popup.js new file mode 100644 index 0000000..1878536 --- /dev/null +++ b/extension/edge-share/popup.js @@ -0,0 +1,158 @@ +"use strict"; + +const DEFAULT_RELAY_URL = "http://127.0.0.1:8765"; + +const relayUrlInput = document.getElementById("relayUrl"); +const shareUrlInput = document.getElementById("shareUrl"); +const shareButton = document.getElementById("shareButton"); +const stopButton = document.getElementById("stopButton"); +const copyButton = document.getElementById("copyButton"); +const statusDot = document.getElementById("statusDot"); +const statusText = document.getElementById("statusText"); +const errorText = document.getElementById("errorText"); + +let currentState = null; + +document.addEventListener("DOMContentLoaded", () => { + shareButton.addEventListener("click", onShare); + stopButton.addEventListener("click", onStop); + copyButton.addEventListener("click", onCopy); + + refreshState(); + setInterval(refreshState, 1000); +}); + +chrome.runtime.onMessage.addListener((message) => { + if (message && message.type === "state_changed") { + renderState(message.state); + } +}); + +async function onShare() { + setBusy(true); + clearError(); + + try { + const response = await sendMessage({ + type: "start_share", + relayUrl: relayUrlInput.value || DEFAULT_RELAY_URL + }); + renderState(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onStop() { + setBusy(true); + clearError(); + + try { + const response = await sendMessage({ type: "stop_share" }); + renderState(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onCopy() { + clearError(); + + try { + const link = shareUrlInput.value.trim(); + if (!link) { + throw new Error("No share link to copy"); + } + + await navigator.clipboard.writeText(link); + copyButton.textContent = "Copied"; + setTimeout(() => { + copyButton.textContent = "Copy"; + }, 1200); + } catch (error) { + showError(error); + } +} + +async function refreshState() { + try { + const response = await sendMessage({ type: "get_state" }); + renderState(response); + } catch (error) { + showError(error); + } +} + +function renderState(state) { + currentState = state || {}; + + relayUrlInput.value = currentState.relayUrl || relayUrlInput.value || DEFAULT_RELAY_URL; + shareUrlInput.value = currentState.shareUrl || ""; + + statusDot.className = "dot"; + if (currentState.connected) { + statusDot.classList.add("connected"); + } else if (currentState.lastError) { + statusDot.classList.add("error"); + } + + statusText.textContent = statusLabel(currentState); + stopButton.disabled = !currentState.sharing; + copyButton.disabled = !currentState.shareUrl; + + if (currentState.lastError) { + showError(currentState.lastError); + } else { + clearError(); + } +} + +function statusLabel(state) { + if (!state) { + return "Unknown"; + } + if (state.connected) { + return "Connected"; + } + if (state.sharing) { + return state.status || "Sharing"; + } + return state.status || "Idle"; +} + +function setBusy(busy) { + shareButton.disabled = busy; + stopButton.disabled = busy || !(currentState && currentState.sharing); + copyButton.disabled = busy || !(currentState && currentState.shareUrl); +} + +function sendMessage(message) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage(message, (response) => { + const runtimeError = chrome.runtime.lastError; + if (runtimeError) { + reject(new Error(runtimeError.message)); + return; + } + if (!response || response.ok !== true) { + reject(new Error((response && response.error) || "Extension message failed")); + return; + } + resolve(response.result); + }); + }); +} + +function showError(error) { + errorText.textContent = typeof error === "string" ? error : error.message || String(error); + errorText.classList.add("visible"); +} + +function clearError() { + errorText.textContent = ""; + errorText.classList.remove("visible"); +} diff --git a/extension/edge-share/service_worker.js b/extension/edge-share/service_worker.js new file mode 100644 index 0000000..2681de6 --- /dev/null +++ b/extension/edge-share/service_worker.js @@ -0,0 +1,884 @@ +"use strict"; + +const PROTOCOL_VERSION = 1; +const DEFAULT_RELAY_URL = "http://127.0.0.1:8765"; +const STORAGE_KEY = "edgeShareState"; +const RECONNECT_MIN_MS = 1000; +const RECONNECT_MAX_MS = 30000; + +let state = { + sharing: false, + connected: false, + relayUrl: DEFAULT_RELAY_URL, + sessionId: "", + browserToken: "", + agentToken: "", + shareUrl: "", + status: "idle", + lastError: "", + activeTabId: null, + updatedAt: "" +}; + +let socket = null; +let reconnectTimer = null; +let reconnectDelayMs = RECONNECT_MIN_MS; +let intentionallyClosed = false; +const attachedTabs = new Set(); + +chrome.runtime.onInstalled.addListener(() => { + restoreState().then(connectIfNeeded).catch(reportError); +}); + +chrome.runtime.onStartup.addListener(() => { + restoreState().then(connectIfNeeded).catch(reportError); +}); + +chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => { + handlePopupMessage(message) + .then((result) => sendResponse({ ok: true, result })) + .catch((error) => sendResponse({ ok: false, error: errorMessage(error) })); + return true; +}); + +chrome.debugger.onDetach.addListener((source) => { + if (Number.isInteger(source.tabId)) { + attachedTabs.delete(source.tabId); + } +}); + +restoreState().then(connectIfNeeded).catch(reportError); + +async function handlePopupMessage(message) { + if (!message || typeof message.type !== "string") { + throw new Error("Invalid message"); + } + + if (message.type === "get_state") { + await restoreState(); + return publicState(); + } + + if (message.type === "start_share") { + return startShare(message.relayUrl || DEFAULT_RELAY_URL); + } + + if (message.type === "stop_share") { + return stopShare(); + } + + throw new Error(`Unknown popup message: ${message.type}`); +} + +async function startShare(relayUrlInput) { + const relayUrl = normalizeRelayUrl(relayUrlInput); + const sessionId = randomHex(12); + const browserToken = randomHex(24); + const agentToken = randomHex(24); + const shareUrl = buildShareUrl(relayUrl, sessionId, agentToken); + + intentionallyClosed = false; + reconnectDelayMs = RECONNECT_MIN_MS; + + await persistState({ + sharing: true, + connected: false, + relayUrl, + sessionId, + browserToken, + agentToken, + shareUrl, + status: "connecting", + lastError: "", + activeTabId: null + }); + + connectRelay(); + return publicState(); +} + +async function stopShare() { + intentionallyClosed = true; + clearReconnectTimer(); + + if (socket) { + try { + socket.close(1000, "sharing stopped"); + } catch (_error) { + // Ignore close errors while stopping. + } + socket = null; + } + + await detachAllDebuggers(); + + await persistState({ + sharing: false, + connected: false, + sessionId: "", + browserToken: "", + agentToken: "", + shareUrl: "", + status: "stopped", + lastError: "" + }); + + return publicState(); +} + +async function restoreState() { + const stored = await chromeCall(chrome.storage.local.get, chrome.storage.local, STORAGE_KEY); + if (stored && stored[STORAGE_KEY]) { + state = { ...state, ...stored[STORAGE_KEY] }; + } +} + +async function persistState(patch) { + state = { + ...state, + ...patch, + updatedAt: new Date().toISOString() + }; + + await chromeCall(chrome.storage.local.set, chrome.storage.local, { + [STORAGE_KEY]: state + }); + + notifyPopup(); +} + +function publicState() { + return { + sharing: state.sharing, + connected: state.connected, + relayUrl: state.relayUrl || DEFAULT_RELAY_URL, + sessionId: state.sessionId, + shareUrl: state.shareUrl, + status: state.status, + lastError: state.lastError, + activeTabId: state.activeTabId, + updatedAt: state.updatedAt + }; +} + +function notifyPopup() { + try { + chrome.runtime.sendMessage({ type: "state_changed", state: publicState() }, () => { + // Popup may be closed; reading lastError prevents noisy extension logs. + void chrome.runtime.lastError; + }); + } catch (_error) { + // Popup may be closed. + } +} + +function connectIfNeeded() { + if (state.sharing) { + connectRelay(); + } +} + +function connectRelay() { + if (!state.sharing || !state.relayUrl || !state.sessionId || !state.browserToken) { + return; + } + + clearReconnectTimer(); + + if (socket) { + try { + socket.close(1000, "reconnecting"); + } catch (_error) { + // Continue with a new socket. + } + } + + const wsUrl = buildBrowserWsUrl( + state.relayUrl, + state.sessionId, + state.browserToken, + state.agentToken + ); + socket = new WebSocket(wsUrl); + + persistState({ connected: false, status: "connecting", lastError: "" }).catch(reportError); + + socket.addEventListener("open", () => { + reconnectDelayMs = RECONNECT_MIN_MS; + persistState({ connected: true, status: "connected", lastError: "" }).catch(reportError); + sendSocket({ + type: "hello", + role: "browser", + protocolVersion: PROTOCOL_VERSION, + sessionId: state.sessionId, + userAgent: navigator.userAgent + }); + }); + + socket.addEventListener("message", (event) => { + handleRelayMessage(event.data).catch((error) => { + sendSocket({ + type: "event", + event: "handler_error", + error: errorMessage(error) + }); + }); + }); + + socket.addEventListener("close", (event) => { + socket = null; + persistState({ + connected: false, + status: state.sharing ? "disconnected" : "stopped", + lastError: event.reason || "" + }).catch(reportError); + + if (state.sharing && !intentionallyClosed) { + scheduleReconnect(); + } + }); + + socket.addEventListener("error", () => { + persistState({ lastError: "WebSocket error" }).catch(reportError); + }); +} + +function scheduleReconnect() { + clearReconnectTimer(); + reconnectTimer = setTimeout(() => { + reconnectTimer = null; + reconnectDelayMs = Math.min(reconnectDelayMs * 2, RECONNECT_MAX_MS); + connectRelay(); + }, reconnectDelayMs); +} + +function clearReconnectTimer() { + if (reconnectTimer) { + clearTimeout(reconnectTimer); + reconnectTimer = null; + } +} + +async function handleRelayMessage(rawData) { + let message; + try { + message = JSON.parse(rawData); + } catch (_error) { + sendSocket({ type: "event", event: "invalid_json" }); + return; + } + + if (message.type === "ping") { + sendSocket({ type: "pong", at: new Date().toISOString() }); + return; + } + + const requestId = message.id || message.requestId; + const command = message.command || message.method; + const params = message.params || {}; + + if (!requestId || !command) { + sendSocket({ + type: "event", + event: "ignored_message", + reason: "missing id or command" + }); + return; + } + + try { + const result = await handleCommand(command, params); + sendSocket({ + type: "response", + id: requestId, + ok: true, + result + }); + } catch (error) { + sendSocket({ + type: "response", + id: requestId, + ok: false, + error: errorMessage(error) + }); + } +} + +async function handleCommand(command, params) { + if (command === "navigate") { + return commandNavigate(params); + } + if (command === "evaluate") { + return commandEvaluate(params); + } + if (command === "snapshot") { + return commandSnapshot(params); + } + if (command === "click") { + return commandClick(params); + } + if (command === "type") { + return commandType(params); + } + if (command === "press_key") { + return commandPressKey(params); + } + if (command === "screenshot") { + return commandScreenshot(params); + } + if (command === "list_tabs") { + return commandListTabs(); + } + if (command === "activate_tab") { + return commandActivateTab(params); + } + + throw new Error(`Unsupported command: ${command}`); +} + +async function commandNavigate(params) { + if (!params.url || typeof params.url !== "string") { + throw new Error("navigate requires params.url"); + } + + const tabId = await getTargetTabId(params); + const tab = await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { + url: params.url, + active: params.activate !== false + }); + + state.activeTabId = tab.id; + return { tab: tabSummary(tab) }; +} + +async function commandEvaluate(params) { + if (!params.expression || typeof params.expression !== "string") { + throw new Error("evaluate requires params.expression"); + } + + const tabId = await getTargetTabId(params); + const value = await evaluateInPage(tabId, params.expression); + return { + tab: await currentTabSummary(tabId), + value + }; +} + +async function commandSnapshot(params) { + const tabId = await getTargetTabId(params); + const snapshot = await runFunctionInPage(tabId, createSnapshot, [ + params.maxTextLength || 200000, + params.maxItems || 200 + ]); + + return { + tab: await currentTabSummary(tabId), + snapshot + }; +} + +async function commandClick(params) { + if (!params.selector || typeof params.selector !== "string") { + throw new Error("click requires params.selector"); + } + + const tabId = await getTargetTabId(params); + const result = await runFunctionInPage(tabId, clickSelector, [params.selector]); + return { + tab: await currentTabSummary(tabId), + action: result + }; +} + +async function commandType(params) { + if (typeof params.text !== "string") { + throw new Error("type requires params.text"); + } + + const tabId = await getTargetTabId(params); + const result = await runFunctionInPage(tabId, typeText, [ + params.selector || "", + params.text, + params.replace === true || params.clear === true + ]); + + return { + tab: await currentTabSummary(tabId), + action: result + }; +} + +async function commandPressKey(params) { + if (!params.key || typeof params.key !== "string") { + throw new Error("press_key requires params.key"); + } + + const tabId = await getTargetTabId(params); + const key = normalizeKey(params.key); + await sendKeyEvent(tabId, key, "rawKeyDown"); + + if (key.text) { + await sendKeyEvent(tabId, key, "char"); + } + + await sendKeyEvent(tabId, key, "keyUp"); + + return { + tab: await currentTabSummary(tabId), + action: { key: key.key, code: key.code } + }; +} + +async function commandScreenshot(params) { + const tabId = await getTargetTabId(params); + const format = params.format === "jpeg" ? "jpeg" : "png"; + const quality = format === "jpeg" ? clampNumber(params.quality || 80, 1, 100) : undefined; + + try { + await sendCdp(tabId, "Page.enable", {}); + const result = await sendCdp(tabId, "Page.captureScreenshot", { + format, + quality, + fromSurface: true, + captureBeyondViewport: params.fullPage === true + }); + + return { + tab: await currentTabSummary(tabId), + mimeType: `image/${format}`, + data: result.data + }; + } catch (error) { + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { active: true }); + const dataUrl = await chromeCall(chrome.tabs.captureVisibleTab, chrome.tabs, tab.windowId, { + format, + quality + }); + + return { + tab: tabSummary(tab), + mimeType: `image/${format}`, + dataUrl, + fallback: "tabs.captureVisibleTab", + warning: errorMessage(error) + }; + } +} + +async function commandListTabs() { + const tabs = await chromeCall(chrome.tabs.query, chrome.tabs, {}); + return { tabs: tabs.map(tabSummary) }; +} + +async function commandActivateTab(params) { + const tabId = await getTargetTabId(params); + const tab = await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { active: true }); + state.activeTabId = tab.id; + await persistState({ activeTabId: tab.id }); + return { tab: tabSummary(tab) }; +} + +async function getTargetTabId(params) { + if (Number.isInteger(params.tabId)) { + state.activeTabId = params.tabId; + return params.tabId; + } + + if (Number.isInteger(state.activeTabId)) { + try { + await chromeCall(chrome.tabs.get, chrome.tabs, state.activeTabId); + return state.activeTabId; + } catch (_error) { + state.activeTabId = null; + } + } + + const activeTabs = await chromeCall(chrome.tabs.query, chrome.tabs, { + active: true, + lastFocusedWindow: true + }); + + if (activeTabs.length > 0 && Number.isInteger(activeTabs[0].id)) { + state.activeTabId = activeTabs[0].id; + return activeTabs[0].id; + } + + const tabs = await chromeCall(chrome.tabs.query, chrome.tabs, { active: true }); + if (tabs.length > 0 && Number.isInteger(tabs[0].id)) { + state.activeTabId = tabs[0].id; + return tabs[0].id; + } + + throw new Error("No active tab found"); +} + +async function currentTabSummary(tabId) { + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + return tabSummary(tab); +} + +function tabSummary(tab) { + return { + id: tab.id, + windowId: tab.windowId, + active: tab.active, + title: tab.title || "", + url: tab.url || "", + status: tab.status || "" + }; +} + +async function evaluateInPage(tabId, expression) { + await sendCdp(tabId, "Runtime.enable", {}); + const result = await sendCdp(tabId, "Runtime.evaluate", { + expression, + awaitPromise: true, + returnByValue: true, + userGesture: true + }); + + if (result.exceptionDetails) { + throw new Error(formatException(result.exceptionDetails)); + } + + return unwrapRemoteObject(result.result); +} + +async function runFunctionInPage(tabId, fn, args) { + const expression = `(${fn.toString()})(${args.map((arg) => JSON.stringify(arg)).join(",")})`; + return evaluateInPage(tabId, expression); +} + +async function ensureDebugger(tabId) { + if (attachedTabs.has(tabId)) { + return; + } + + try { + await chromeCall(chrome.debugger.attach, chrome.debugger, { tabId }, "1.3"); + attachedTabs.add(tabId); + } catch (error) { + if (String(errorMessage(error)).includes("Another debugger is already attached")) { + attachedTabs.add(tabId); + return; + } + throw error; + } +} + +async function detachAllDebuggers() { + const tabIds = Array.from(attachedTabs); + attachedTabs.clear(); + + await Promise.all( + tabIds.map(async (tabId) => { + try { + await chromeCall(chrome.debugger.detach, chrome.debugger, { tabId }); + } catch (_error) { + // The tab may have closed or detached already. + } + }) + ); +} + +async function sendCdp(tabId, method, params) { + await ensureDebugger(tabId); + return chromeCall(chrome.debugger.sendCommand, chrome.debugger, { tabId }, method, params || {}); +} + +async function sendKeyEvent(tabId, key, type) { + await sendCdp(tabId, "Input.dispatchKeyEvent", { + type, + key: key.key, + code: key.code, + windowsVirtualKeyCode: key.keyCode, + nativeVirtualKeyCode: key.keyCode, + text: type === "char" ? key.text : "", + unmodifiedText: type === "char" ? key.text : "", + modifiers: 0 + }); +} + +function createSnapshot(maxTextLength, maxItems) { + function trim(value, length) { + return String(value || "").replace(/\s+/g, " ").trim().slice(0, length); + } + + function cssPath(element) { + if (!element || element.nodeType !== Node.ELEMENT_NODE) { + return ""; + } + + if (element.id) { + return `#${CSS.escape(element.id)}`; + } + + const parts = []; + let current = element; + + while (current && current.nodeType === Node.ELEMENT_NODE && parts.length < 5) { + let part = current.tagName.toLowerCase(); + if (current.classList.length > 0) { + part += `.${CSS.escape(current.classList[0])}`; + } + + const parent = current.parentElement; + if (parent) { + const siblings = Array.from(parent.children).filter((child) => child.tagName === current.tagName); + if (siblings.length > 1) { + part += `:nth-of-type(${siblings.indexOf(current) + 1})`; + } + } + + parts.unshift(part); + current = parent; + } + + return parts.join(" > "); + } + + function describe(element) { + return { + selector: cssPath(element), + tag: element.tagName.toLowerCase(), + role: element.getAttribute("role") || "", + label: trim( + element.getAttribute("aria-label") || + element.getAttribute("alt") || + element.getAttribute("title") || + element.value || + element.innerText, + 300 + ), + href: element.href || "", + type: element.getAttribute("type") || "" + }; + } + + const clickableSelector = "a,button,input,textarea,select,[role='button'],[contenteditable='true']"; + const elements = Array.from(document.querySelectorAll(clickableSelector)) + .slice(0, maxItems) + .map(describe); + + return { + url: location.href, + title: document.title, + text: trim(document.body ? document.body.innerText : "", maxTextLength), + activeElement: cssPath(document.activeElement), + elements + }; +} + +function clickSelector(selector) { + const element = document.querySelector(selector); + if (!element) { + throw new Error(`No element matches selector: ${selector}`); + } + + element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); + const rect = element.getBoundingClientRect(); + const x = rect.left + rect.width / 2; + const y = rect.top + rect.height / 2; + + element.dispatchEvent(new MouseEvent("mouseover", { bubbles: true, clientX: x, clientY: y })); + element.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, clientX: x, clientY: y })); + element.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, clientX: x, clientY: y })); + element.click(); + + return { + selector, + text: String(element.innerText || element.value || "").trim().slice(0, 300), + rect: { + x: Math.round(rect.x), + y: Math.round(rect.y), + width: Math.round(rect.width), + height: Math.round(rect.height) + } + }; +} + +function typeText(selector, text, replace) { + const element = selector ? document.querySelector(selector) : document.activeElement; + if (!element) { + throw new Error(selector ? `No element matches selector: ${selector}` : "No active element"); + } + + element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); + element.focus(); + + if (element.isContentEditable) { + if (replace) { + element.innerText = ""; + } + document.execCommand("insertText", false, text); + } else if ("value" in element) { + if (replace) { + element.value = text; + } else { + const start = Number.isInteger(element.selectionStart) ? element.selectionStart : element.value.length; + const end = Number.isInteger(element.selectionEnd) ? element.selectionEnd : element.value.length; + element.value = `${element.value.slice(0, start)}${text}${element.value.slice(end)}`; + const cursor = start + text.length; + if (element.setSelectionRange) { + element.setSelectionRange(cursor, cursor); + } + } + element.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertText", data: text })); + element.dispatchEvent(new Event("change", { bubbles: true })); + } else { + throw new Error("Target element is not editable"); + } + + return { + selector: selector || "", + tag: element.tagName.toLowerCase(), + textLength: text.length + }; +} + +function normalizeKey(input) { + const aliases = { + escape: ["Escape", "Escape", 27], + esc: ["Escape", "Escape", 27], + enter: ["Enter", "Enter", 13], + tab: ["Tab", "Tab", 9], + backspace: ["Backspace", "Backspace", 8], + delete: ["Delete", "Delete", 46], + arrowup: ["ArrowUp", "ArrowUp", 38], + arrowdown: ["ArrowDown", "ArrowDown", 40], + arrowleft: ["ArrowLeft", "ArrowLeft", 37], + arrowright: ["ArrowRight", "ArrowRight", 39], + home: ["Home", "Home", 36], + end: ["End", "End", 35], + pageup: ["PageUp", "PageUp", 33], + pagedown: ["PageDown", "PageDown", 34], + space: [" ", "Space", 32] + }; + + const lower = input.toLowerCase(); + if (aliases[lower]) { + const [key, code, keyCode] = aliases[lower]; + return { key, code, keyCode, text: key.length === 1 ? key : "" }; + } + + if (input.length === 1) { + const keyCode = input.toUpperCase().charCodeAt(0); + return { key: input, code: `Key${input.toUpperCase()}`, keyCode, text: input }; + } + + return { key: input, code: input, keyCode: 0, text: "" }; +} + +function unwrapRemoteObject(remoteObject) { + if (!remoteObject) { + return null; + } + if (Object.prototype.hasOwnProperty.call(remoteObject, "value")) { + return remoteObject.value; + } + if (remoteObject.unserializableValue) { + return remoteObject.unserializableValue; + } + return remoteObject.description || null; +} + +function formatException(exceptionDetails) { + if (exceptionDetails.exception) { + return unwrapRemoteObject(exceptionDetails.exception) || exceptionDetails.exception.description || "Evaluation failed"; + } + return exceptionDetails.text || "Evaluation failed"; +} + +function sendSocket(message) { + if (!socket || socket.readyState !== WebSocket.OPEN) { + return false; + } + socket.send(JSON.stringify(message)); + return true; +} + +function buildShareUrl(relayUrl, sessionId, agentToken) { + const url = new URL(relayUrl); + const prefix = url.pathname.replace(/\/+$/, ""); + url.pathname = `${prefix}/share/${encodeURIComponent(sessionId)}`; + url.search = ""; + url.hash = `agent=${encodeURIComponent(agentToken)}`; + return url.href; +} + +function buildBrowserWsUrl(relayUrl, sessionId, browserToken, agentToken) { + const url = new URL(relayUrl); + url.protocol = url.protocol === "https:" ? "wss:" : "ws:"; + const prefix = url.pathname.replace(/\/+$/, ""); + url.pathname = `${prefix}/ws/browser/${encodeURIComponent(sessionId)}`; + url.search = `token=${encodeURIComponent(browserToken)}&agent_token=${encodeURIComponent(agentToken)}`; + url.hash = ""; + return url.href; +} + +function normalizeRelayUrl(input) { + const raw = String(input || "").trim(); + if (!raw) { + throw new Error("Relay URL is required"); + } + + const withScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(raw) ? raw : `https://${raw}`; + const url = new URL(withScheme); + + if (url.protocol !== "http:" && url.protocol !== "https:") { + throw new Error("Relay URL must use http or https"); + } + + url.search = ""; + url.hash = ""; + url.pathname = url.pathname.replace(/\/+$/, ""); + return url.href.replace(/\/$/, ""); +} + +function randomHex(lengthBytes) { + const bytes = new Uint8Array(lengthBytes); + crypto.getRandomValues(bytes); + return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join(""); +} + +function clampNumber(value, min, max) { + const number = Number(value); + if (!Number.isFinite(number)) { + return min; + } + return Math.min(Math.max(number, min), max); +} + +function chromeCall(fn, context, ...args) { + return new Promise((resolve, reject) => { + try { + fn.call(context, ...args, (result) => { + const error = chrome.runtime.lastError; + if (error) { + reject(new Error(error.message)); + } else { + resolve(result); + } + }); + } catch (error) { + reject(error); + } + }); +} + +function reportError(error) { + persistState({ lastError: errorMessage(error), status: "error" }).catch(() => { + // Avoid recursive error reporting. + }); +} + +function errorMessage(error) { + if (!error) { + return "Unknown error"; + } + if (error.message) { + return error.message; + } + return String(error); +} diff --git a/src/bin/browser-connection-relay.rs b/src/bin/browser-connection-relay.rs new file mode 100644 index 0000000..0d8d7d9 --- /dev/null +++ b/src/bin/browser-connection-relay.rs @@ -0,0 +1,22 @@ +//! WebSocket relay for browser-connection shared browser extension sessions. + +use clap::Parser; +use docker_git_browser_connection::shared_browser::{run_relay, RelayConfig, DEFAULT_RELAY_BIND}; + +#[derive(Debug, Parser)] +#[command( + name = "browser-connection-relay", + version, + about = "WebSocket relay for browser-connection shared browser links" +)] +struct Cli { + /// Address to bind, e.g. 127.0.0.1:8765 or 0.0.0.0:8765. + #[arg(long, default_value = DEFAULT_RELAY_BIND)] + bind: String, +} + +fn main() -> anyhow::Result<()> { + env_logger::init(); + let cli = Cli::parse(); + run_relay(RelayConfig::new(cli.bind)) +} diff --git a/src/bin/browser-connection.rs b/src/bin/browser-connection.rs index 876c8af..83685dd 100644 --- a/src/bin/browser-connection.rs +++ b/src/bin/browser-connection.rs @@ -6,8 +6,10 @@ //! This command intentionally replaces external upstream Playwright MCP configs. use clap::Parser; +use docker_git_browser_connection::compute_browser_control_panel_port; use docker_git_browser_connection::mcp::{ active_browser_from_env, browser_endpoints_from_env, parse_named_browser_endpoint, + parse_named_browser_novnc_url, parse_named_browser_share_url, parse_named_browser_vnc_endpoint, project_id_from_env_or_default, run_stdio, McpServerConfig, NamedBrowserEndpoint, PERSONAL_BROWSER_NAME, SERVER_NAME, }; @@ -36,14 +38,42 @@ struct Cli { #[arg(long = "browser", value_name = "NAME=CDP_ENDPOINT")] browser: Vec, + /// Register a VNC display endpoint for a browser target as NAME=HOST:PORT. Can be repeated. + #[arg(long = "browser-vnc", value_name = "NAME=HOST:PORT")] + browser_vnc: Vec, + + /// Register a pre-existing noVNC URL for a browser target as NAME=URL. Can be repeated. + #[arg(long = "browser-novnc", value_name = "NAME=URL")] + browser_novnc: Vec, + + /// Register a shared browser extension link as NAME=URL. Can be repeated. + #[arg(long = "browser-share", value_name = "NAME=URL")] + browser_share: Vec, + /// Register and select a personal browser CDP endpoint, e.g. http://127.0.0.1:9222. #[arg(long)] personal_browser: Option, + /// Register a VNC display endpoint for the personal browser, e.g. host.docker.internal:5900. + #[arg(long)] + personal_vnc: Option, + + /// Register a pre-existing noVNC URL for the personal browser. + #[arg(long)] + personal_novnc: Option, + /// Browser target to use at startup: managed, explicit, personal, or a --browser name. #[arg(long)] active_browser: Option, + /// Host port for the local browser/noVNC control panel. + #[arg(long)] + control_port: Option, + + /// Disable the local browser/noVNC control panel. + #[arg(long)] + no_control_panel: bool, + /// Do not start/reuse Docker browser on startup; useful for MCP handshake tests. #[arg(long)] no_start_browser: bool, @@ -54,28 +84,65 @@ fn main() -> anyhow::Result<()> { let cli = Cli::parse(); let mut browser_endpoints = browser_endpoints_from_env()?; let mut active_browser = active_browser_from_env(); + let project_id = project_id_from_env_or_default(cli.project); + let control_port = if cli.no_control_panel { + None + } else { + Some( + cli.control_port + .unwrap_or_else(|| compute_browser_control_panel_port(&project_id)), + ) + }; for browser in &cli.browser { browser_endpoints.push(parse_named_browser_endpoint(browser)?); } + let mut config = McpServerConfig::new( + project_id, + cli.network, + cli.cdp_endpoint, + !cli.no_start_browser, + ) + .with_browser_endpoints(browser_endpoints) + .with_control_port(control_port); + + for browser_vnc in &cli.browser_vnc { + let (name, endpoint) = parse_named_browser_vnc_endpoint(browser_vnc)?; + config = config.with_browser_vnc_endpoint(name, endpoint)?; + } + + for browser_novnc in &cli.browser_novnc { + let (name, url) = parse_named_browser_novnc_url(browser_novnc)?; + config = config.with_browser_novnc_url(name, url)?; + } + + for browser_share in &cli.browser_share { + let (name, url) = parse_named_browser_share_url(browser_share)?; + config = config.with_browser_share_url(name, url)?; + } + if let Some(endpoint) = cli.personal_browser { - browser_endpoints.push(NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, endpoint)?); + config = config.with_browser_endpoints(vec![NamedBrowserEndpoint::new( + PERSONAL_BROWSER_NAME, + endpoint, + )?]); active_browser = Some(PERSONAL_BROWSER_NAME.to_string()); } + if let Some(endpoint) = cli.personal_vnc { + config = config.with_browser_vnc_endpoint(PERSONAL_BROWSER_NAME, endpoint)?; + } + + if let Some(url) = cli.personal_novnc { + config = config.with_browser_novnc_url(PERSONAL_BROWSER_NAME, url)?; + } + if cli.active_browser.is_some() { active_browser = cli.active_browser; } - let config = McpServerConfig::new( - project_id_from_env_or_default(cli.project), - cli.network, - cli.cdp_endpoint, - !cli.no_start_browser, - ) - .with_browser_endpoints(browser_endpoints) - .with_active_browser(active_browser)?; + let config = config.with_active_browser(active_browser)?; let stdin = io::stdin(); let stdout = io::stdout(); diff --git a/src/browser.rs b/src/browser.rs index 7b45aa8..e12ce54 100644 --- a/src/browser.rs +++ b/src/browser.rs @@ -14,6 +14,8 @@ EFFECT: Docker CLI process execution + temporary filesystem writes. INVARIANT: repeated ensure_browser_container(spec) reuses exactly spec.container_name. */ +mod assets; + use anyhow::{anyhow, Context, Result}; use std::fs; use std::net::{TcpStream, ToSocketAddrs}; @@ -21,7 +23,10 @@ use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use crate::{BrowserResourceLimits, BrowserSpec}; +use crate::{BrowserResourceLimits, BrowserSpec, BrowserTargetDisplaySpec}; +use assets::{ + BROWSER_DOCKERFILE, BROWSER_START_SCRIPT, NOVNC_PROXY_DOCKERFILE, NOVNC_PROXY_START_SCRIPT, +}; pub(crate) struct BrowserRuntime { pub container_name: String, @@ -29,64 +34,17 @@ pub(crate) struct BrowserRuntime { pub cdp_url: String, } +pub(crate) struct BrowserTargetDisplayRuntime { + pub container_name: String, + pub vnc_endpoint: String, + pub novnc_url: String, +} + pub(crate) struct BrowserStopRuntime { pub container_name: String, pub removed: bool, } -const BROWSER_DOCKERFILE: &str = r#"FROM kechangdev/browser-vnc:latest - -# bash/procps keep upstream startup scripts compatible; socat exposes a stable CDP port. -# xwd/imagemagick provide deterministic X11 framebuffer screenshots for noVNC/CDP proof. -RUN apk add --no-cache bash procps socat python3 net-tools curl xwd imagemagick - -# CHANGE: patch upstream noVNC/websockify for Python 3.12. -# WHY: old websockify calls array.array.fromstring(), removed in Python 3.12, which closes noVNC after the RFB protocol banner. -# QUOTE(ТЗ): "добиться что бы всё работало и этому были доказательства" -# REF: issue-347 -# SOURCE: n/a -# FORMAT THEOREM: websocket_rfb_handshake -> security_types_frame, not websockify_exception(fromstring) -# PURITY: SHELL -# EFFECT: Docker build mutates vendored websockify Python files in the browser image. -# INVARIANT: noVNC connects to the same X11/VNC framebuffer that Chromium renders into. -RUN python3 -c "from pathlib import Path; root=Path('/opt/noVNC/utils/websockify'); [p.write_text(p.read_text().replace('.fromstring(', '.frombytes(').replace('.tostring(', '.tobytes(')) for p in root.rglob('*.py')]" - -COPY docker-git-browser-start.sh /usr/local/bin/docker-git-browser-start.sh -RUN chmod +x /usr/local/bin/docker-git-browser-start.sh - -ENTRYPOINT ["/usr/local/bin/docker-git-browser-start.sh"] -"#; - -const BROWSER_START_SCRIPT: &str = r#"#!/usr/bin/env bash -set -euo pipefail - -rm -f /data/SingletonLock /data/SingletonCookie /data/SingletonSocket || true - -# CHANGE: force no-password shared VNC for automatic noVNC proof/control. -# WHY: docker-git's browser URL is opened by agents and users without a manual VNC password prompt. -# QUOTE(ТЗ): "автоматически для него поднимает noVNC что бы управлять единым браузером с агентом" -# REF: issue-347 -# SOURCE: n/a -# FORMAT THEOREM: start_browser -> noVNC autoconnect reaches Chromium framebuffer -# PURITY: SHELL -# EFFECT: rewrites upstream supervisor config before /start.sh starts supervisord. -# INVARIANT: x11vnc remains shared, so noVNC viewing does not disconnect the agent-controlled browser. -for supervisor_file in /etc/supervisor.d/*.ini /etc/supervisor/conf.d/*.conf; do - if [[ -f "$supervisor_file" ]]; then - sed -i \ - -e 's|-forever -usepw -display :99 -rfbport 5900|-forever -nopw -shared -display :99 -rfbport 5900|g' \ - -e 's|x11vnc -forever -usepw|x11vnc -forever -nopw -shared|g' \ - "$supervisor_file" - fi -done - -# kechangdev/browser-vnc binds Chromium CDP on 127.0.0.1:9222. MCP/Hermes use :9223. -# The proxy keeps Host checks stable and makes the endpoint reachable from the project namespace. -socat TCP-LISTEN:9223,fork,reuseaddr TCP:127.0.0.1:9222 & - -exec /start.sh -"#; - pub struct DockerBrowserShell; impl DockerBrowserShell { @@ -159,6 +117,44 @@ impl DockerBrowserShell { removed, }) } + + pub fn ensure_novnc_proxy_container( + &self, + spec: &BrowserTargetDisplaySpec, + ) -> Result { + ensure_docker_available()?; + ensure_novnc_proxy_image(spec)?; + + let state = inspect_container_state(&spec.container_name)?; + match state.as_deref() { + Some("running") if novnc_proxy_matches(spec)? => { + let novnc_url = wait_for_novnc_proxy(spec)?; + return Ok(BrowserTargetDisplayRuntime { + container_name: spec.container_name.clone(), + vnc_endpoint: spec.vnc_endpoint.clone(), + novnc_url, + }); + } + Some(_) => { + docker(["rm", "-f", &spec.container_name], "docker rm noVNC proxy")?; + } + None => {} + } + + let mut runtime_spec = spec.clone(); + runtime_spec.network_mode = effective_network_mode( + &spec.network_mode, + referenced_container_state(&spec.network_mode)?.as_deref(), + ); + run_novnc_proxy_container(&runtime_spec)?; + let novnc_url = wait_for_novnc_proxy(&runtime_spec)?; + + Ok(BrowserTargetDisplayRuntime { + container_name: runtime_spec.container_name, + vnc_endpoint: runtime_spec.vnc_endpoint, + novnc_url, + }) + } } fn docker(args: [&str; N], label: &str) -> Result { @@ -316,6 +312,41 @@ fn inspect_container_network_mode(container_name: &str) -> Result } } +fn inspect_container_label(container_name: &str, label: &str) -> Result> { + let output = docker_command() + .args([ + "inspect", + "-f", + &format!("{{{{ index .Config.Labels \"{label}\" }}}}"), + container_name, + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::null()) + .output() + .with_context(|| { + format!("failed to inspect container label {label} for {container_name}") + })?; + + if !output.status.success() { + return Ok(None); + } + + let value = String::from_utf8_lossy(&output.stdout).trim().to_string(); + if value.is_empty() || value == "" { + Ok(None) + } else { + Ok(Some(value)) + } +} + +fn novnc_proxy_matches(spec: &BrowserTargetDisplaySpec) -> Result { + Ok( + inspect_container_label(&spec.container_name, "docker-git.browser-vnc-endpoint")? + .as_deref() + == Some(spec.vnc_endpoint.as_str()), + ) +} + // CHANGE: avoid `docker run --network container:` hard failure by falling back to bridge. // WHY: MCP stdio startup must work when launched before/without a docker-git project container. // QUOTE(ТЗ): "добить задачу ... поднятие MCP Playright вместе с noVNC" @@ -374,6 +405,26 @@ fn ensure_browser_image(spec: &BrowserSpec) -> Result<()> { Ok(()) } +fn ensure_novnc_proxy_image(spec: &BrowserTargetDisplaySpec) -> Result<()> { + if image_exists(&spec.image_name)? { + return Ok(()); + } + + let context = NovncProxyBuildContext::create()?; + docker( + [ + "build", + "-t", + &spec.image_name, + "-f", + context.dockerfile_path_str(), + context.path_str(), + ], + "docker build noVNC proxy image", + )?; + Ok(()) +} + fn ensure_volume(volume_name: &str) -> Result<()> { docker(["volume", "create", volume_name], "docker volume create").map(|_| ()) } @@ -436,6 +487,42 @@ fn run_browser_container(spec: &BrowserSpec, limits: &BrowserResourceLimits) -> docker_dynamic(&args, "docker run browser").map(|_| ()) } +fn run_novnc_proxy_container(spec: &BrowserTargetDisplaySpec) -> Result<()> { + let mut args = vec![ + "run".to_string(), + "-d".to_string(), + "--name".to_string(), + spec.container_name.clone(), + "--label".to_string(), + "docker-git.browser-novnc-proxy=1".to_string(), + "--label".to_string(), + format!("docker-git.browser-target={}", spec.browser_name), + "--label".to_string(), + format!("docker-git.browser-vnc-endpoint={}", spec.vnc_endpoint), + "--network".to_string(), + spec.network_mode.clone(), + ]; + + if should_publish_ports(&spec.network_mode) { + args.extend([ + "--add-host".to_string(), + "host.docker.internal:host-gateway".to_string(), + "-p".to_string(), + format!("127.0.0.1:{}:{}", spec.novnc_port, spec.novnc_port), + ]); + } + + args.extend([ + "-e".to_string(), + format!("BROWSER_CONNECTION_VNC_ENDPOINT={}", spec.vnc_endpoint), + "-e".to_string(), + format!("BROWSER_CONNECTION_NOVNC_PORT={}", spec.novnc_port), + spec.image_name.clone(), + ]); + + docker_dynamic(&args, "docker run noVNC proxy").map(|_| ()) +} + fn cdp_probe_candidates(spec: &BrowserSpec) -> Vec { let mut candidates = if should_publish_ports(&spec.network_mode) { vec![format!("http://127.0.0.1:{}/json/version", spec.ports.cdp)] @@ -499,6 +586,30 @@ fn novnc_probe_candidates(spec: &BrowserSpec) -> Vec { candidates } +fn novnc_proxy_probe_candidates(spec: &BrowserTargetDisplaySpec) -> Vec { + let mut candidates = vec![crate::render_novnc_url_for_port(spec.novnc_port)]; + + if let Some(container_name) = spec.network_mode.strip_prefix("container:") { + if let Ok(Some(ip)) = inspect_container_ip(container_name) { + candidates.push(format!( + "http://{}:{}/vnc.html?autoconnect=true&resize=remote&path=websockify", + ip, spec.novnc_port + )); + } + } + + if let Ok(Some(ip)) = inspect_container_ip(&spec.container_name) { + candidates.push(format!( + "http://{}:{}/vnc.html?autoconnect=true&resize=remote&path=websockify", + ip, spec.novnc_port + )); + } + + candidates.sort(); + candidates.dedup(); + candidates +} + fn runtime_urls(spec: &BrowserSpec) -> Result<(String, String)> { let cdp_url = wait_for_cdp(spec)?; let novnc_url = wait_for_novnc(spec)?; @@ -574,6 +685,29 @@ fn wait_for_novnc(spec: &BrowserSpec) -> Result { )) } +fn wait_for_novnc_proxy(spec: &BrowserTargetDisplaySpec) -> Result { + ensure_curl_available()?; + let mut last_candidates = Vec::new(); + for _ in 0..30 { + last_candidates = novnc_proxy_probe_candidates(spec); + for url in &last_candidates { + let status = Command::new("curl") + .args(["-sSf", "--connect-timeout", "2", "--max-time", "5", url]) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status(); + if matches!(status, Ok(exit) if exit.success()) { + return Ok(url.to_string()); + } + } + std::thread::sleep(std::time::Duration::from_secs(1)); + } + Err(anyhow!( + "browser target noVNC proxy did not become ready; tried: {}", + last_candidates.join(", ") + )) +} + // CHANGE: fail fast when the host shell lacks curl for CDP readiness checks. // WHY: otherwise a missing binary is indistinguishable from a slow browser and produces a misleading timeout. // QUOTE(ТЗ): "добиться что бы всё работало и этому были доказательства" @@ -665,76 +799,50 @@ impl Drop for BrowserBuildContext { } } -fn path_to_str(path: &Path) -> &str { - path.to_str() - .expect("temporary Docker build path must be valid UTF-8") +struct NovncProxyBuildContext { + path: PathBuf, + dockerfile: PathBuf, } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn missing_project_container_falls_back_to_bridge_network() { - assert_eq!( - effective_network_mode("container:dg-missing", None), - "bridge" - ); - assert_eq!( - effective_network_mode("container:dg-project", Some("running")), - "container:dg-project" - ); - assert_eq!(effective_network_mode("bridge", None), "bridge"); - } - - #[test] - fn browser_resource_limit_args_are_omitted_when_limits_are_empty() { - assert!(browser_resource_limit_args(&BrowserResourceLimits::none()).is_empty()); - } - - #[test] - fn browser_resource_limit_args_render_docker_run_limits() { - assert_eq!( - browser_resource_limit_args(&BrowserResourceLimits::from_values( - Some("0.5"), - Some("1g") - )), - vec![ - "--cpus".to_string(), - "0.5".to_string(), - "--memory".to_string(), - "1g".to_string() - ] - ); +impl NovncProxyBuildContext { + fn create() -> Result { + let nonce = SystemTime::now() + .duration_since(UNIX_EPOCH) + .context("system clock before unix epoch")? + .as_nanos(); + let path = std::env::temp_dir().join(format!("docker-git-novnc-proxy-build-{nonce}")); + fs::create_dir_all(&path) + .with_context(|| format!("failed to create {}", path.display()))?; + let dockerfile = path.join("Dockerfile.novnc-proxy"); + fs::write(&dockerfile, NOVNC_PROXY_DOCKERFILE) + .context("failed to write noVNC proxy Dockerfile")?; + fs::write( + path.join("docker-git-novnc-proxy-start.sh"), + NOVNC_PROXY_START_SCRIPT, + ) + .context("failed to write noVNC proxy start script")?; + Ok(Self { path, dockerfile }) } - #[test] - fn docker_host_autodetect_keeps_explicit_env_and_project_env_precedence() { - assert_eq!( - selected_docker_host_override( - Some("tcp://explicit.example:2375"), - Some("tcp://project.example:2375"), - false, - true, - ), - None - ); - assert_eq!( - selected_docker_host_override(None, Some("tcp://project.example:2375"), false, true), - Some("tcp://project.example:2375".to_string()) - ); + fn path_str(&self) -> &str { + path_to_str(&self.path) } - #[test] - fn docker_host_autodetect_falls_back_to_host_docker_internal_when_socket_missing() { - assert_eq!( - selected_docker_host_override(None, None, false, true), - Some("tcp://host.docker.internal:2375".to_string()) - ); - assert_eq!(selected_docker_host_override(None, None, true, true), None); - assert_eq!( - selected_docker_host_override(None, None, false, false), - None - ); + fn dockerfile_path_str(&self) -> &str { + path_to_str(&self.dockerfile) + } +} + +impl Drop for NovncProxyBuildContext { + fn drop(&mut self) { + let _ = fs::remove_dir_all(&self.path); } } + +fn path_to_str(path: &Path) -> &str { + path.to_str() + .expect("temporary Docker build path must be valid UTF-8") +} + +#[cfg(test)] +mod tests; diff --git a/src/browser/assets.rs b/src/browser/assets.rs new file mode 100644 index 0000000..6c9eb87 --- /dev/null +++ b/src/browser/assets.rs @@ -0,0 +1,71 @@ +pub(super) const BROWSER_DOCKERFILE: &str = r#"FROM kechangdev/browser-vnc:latest + +# bash/procps keep upstream startup scripts compatible; socat exposes a stable CDP port. +# xwd/imagemagick provide deterministic X11 framebuffer screenshots for noVNC/CDP proof. +RUN apk add --no-cache bash procps socat python3 net-tools curl xwd imagemagick + +RUN python3 -c "from pathlib import Path; root=Path('/opt/noVNC/utils/websockify'); [p.write_text(p.read_text().replace('.fromstring(', '.frombytes(').replace('.tostring(', '.tobytes(')) for p in root.rglob('*.py')]" + +COPY docker-git-browser-start.sh /usr/local/bin/docker-git-browser-start.sh +RUN chmod +x /usr/local/bin/docker-git-browser-start.sh + +ENTRYPOINT ["/usr/local/bin/docker-git-browser-start.sh"] +"#; + +pub(super) const BROWSER_START_SCRIPT: &str = r#"#!/usr/bin/env bash +set -euo pipefail + +rm -f /data/SingletonLock /data/SingletonCookie /data/SingletonSocket || true + +for supervisor_file in /etc/supervisor.d/*.ini /etc/supervisor/conf.d/*.conf; do + if [[ -f "$supervisor_file" ]]; then + sed -i \ + -e 's|-forever -usepw -display :99 -rfbport 5900|-forever -nopw -shared -display :99 -rfbport 5900|g' \ + -e 's|x11vnc -forever -usepw|x11vnc -forever -nopw -shared|g' \ + "$supervisor_file" + fi +done + +socat TCP-LISTEN:9223,fork,reuseaddr TCP:127.0.0.1:9222 & + +exec /start.sh +"#; + +pub(super) const NOVNC_PROXY_DOCKERFILE: &str = r#"FROM kechangdev/browser-vnc:latest + +RUN apk add --no-cache bash curl python3 + +RUN python3 -c "from pathlib import Path; root=Path('/opt/noVNC/utils/websockify'); [p.write_text(p.read_text().replace('.fromstring(', '.frombytes(').replace('.tostring(', '.tobytes(')) for p in root.rglob('*.py')]" + +COPY docker-git-novnc-proxy-start.sh /usr/local/bin/docker-git-novnc-proxy-start.sh +RUN chmod +x /usr/local/bin/docker-git-novnc-proxy-start.sh + +ENTRYPOINT ["/usr/local/bin/docker-git-novnc-proxy-start.sh"] +"#; + +pub(super) const NOVNC_PROXY_START_SCRIPT: &str = r#"#!/usr/bin/env bash +set -euo pipefail + +target="${BROWSER_CONNECTION_VNC_ENDPOINT:?BROWSER_CONNECTION_VNC_ENDPOINT is required}" +listen_port="${BROWSER_CONNECTION_NOVNC_PORT:-6080}" +web_root="${BROWSER_CONNECTION_NOVNC_WEB:-/usr/share/novnc}" + +if [[ ! -d "$web_root" && -d /usr/share/noVNC ]]; then + web_root=/usr/share/noVNC +fi +if [[ ! -d "$web_root" && -d /usr/share/webapps/novnc ]]; then + web_root=/usr/share/webapps/novnc +fi + +if [[ -x /opt/noVNC/utils/novnc_proxy ]]; then + exec /opt/noVNC/utils/novnc_proxy \ + --listen "$listen_port" \ + --vnc "$target" +fi + +if command -v websockify >/dev/null 2>&1; then + exec websockify --web "$web_root" "0.0.0.0:${listen_port}" "$target" +fi + +exec python3 -m websockify --web "$web_root" "0.0.0.0:${listen_port}" "$target" +"#; diff --git a/src/browser/tests.rs b/src/browser/tests.rs new file mode 100644 index 0000000..74ad712 --- /dev/null +++ b/src/browser/tests.rs @@ -0,0 +1,81 @@ +use super::*; + +#[test] +fn missing_project_container_falls_back_to_bridge_network() { + assert_eq!( + effective_network_mode("container:dg-missing", None), + "bridge" + ); + assert_eq!( + effective_network_mode("container:dg-project", Some("running")), + "container:dg-project" + ); + assert_eq!(effective_network_mode("bridge", None), "bridge"); +} + +#[test] +fn browser_resource_limit_args_are_omitted_when_limits_are_empty() { + assert!(browser_resource_limit_args(&BrowserResourceLimits::none()).is_empty()); +} + +#[test] +fn browser_resource_limit_args_render_docker_run_limits() { + assert_eq!( + browser_resource_limit_args(&BrowserResourceLimits::from_values(Some("0.5"), Some("1g"))), + vec![ + "--cpus".to_string(), + "0.5".to_string(), + "--memory".to_string(), + "1g".to_string() + ] + ); +} + +#[test] +fn novnc_proxy_candidates_include_target_specific_localhost_port() { + let spec = BrowserTargetDisplaySpec { + project_id: "dg-test".to_string(), + browser_name: "personal".to_string(), + main_container_name: "dg-test".to_string(), + container_name: "dg-test-browser-novnc-personal".to_string(), + image_name: "dg-test-browser-novnc-proxy:docker-git-browser".to_string(), + network_mode: "bridge".to_string(), + vnc_endpoint: "host.docker.internal:5900".to_string(), + novnc_port: 6611, + }; + + assert!(novnc_proxy_probe_candidates(&spec).contains( + &"http://127.0.0.1:6611/vnc.html?autoconnect=true&resize=remote&path=websockify" + .to_string() + )); +} + +#[test] +fn docker_host_autodetect_keeps_explicit_env_and_project_env_precedence() { + assert_eq!( + selected_docker_host_override( + Some("tcp://explicit.example:2375"), + Some("tcp://project.example:2375"), + false, + true, + ), + None + ); + assert_eq!( + selected_docker_host_override(None, Some("tcp://project.example:2375"), false, true), + Some("tcp://project.example:2375".to_string()) + ); +} + +#[test] +fn docker_host_autodetect_falls_back_to_host_docker_internal_when_socket_missing() { + assert_eq!( + selected_docker_host_override(None, None, false, true), + Some("tcp://host.docker.internal:2375".to_string()) + ); + assert_eq!(selected_docker_host_override(None, None, true, true), None); + assert_eq!( + selected_docker_host_override(None, None, false, false), + None + ); +} diff --git a/src/browser_target.rs b/src/browser_target.rs index 48db4e3..59730b6 100644 --- a/src/browser_target.rs +++ b/src/browser_target.rs @@ -9,13 +9,49 @@ pub const PERSONAL_BROWSER_NAME: &str = "personal"; pub struct NamedBrowserEndpoint { pub name: String, pub cdp_endpoint: String, + pub vnc_endpoint: Option, + pub novnc_url: Option, + pub share_url: Option, } impl NamedBrowserEndpoint { pub fn new(name: impl AsRef, cdp_endpoint: impl AsRef) -> Result { let name = normalize_configured_browser_name(name.as_ref())?; let cdp_endpoint = normalize_cdp_endpoint(cdp_endpoint.as_ref())?; - Ok(Self { name, cdp_endpoint }) + Ok(Self { + name, + cdp_endpoint, + vnc_endpoint: None, + novnc_url: None, + share_url: None, + }) + } + + pub fn shared(name: impl AsRef, share_url: impl AsRef) -> Result { + let name = normalize_configured_browser_name(name.as_ref())?; + let share_url = normalize_share_url(share_url.as_ref())?; + Ok(Self { + name, + cdp_endpoint: String::new(), + vnc_endpoint: None, + novnc_url: None, + share_url: Some(share_url), + }) + } + + pub fn with_vnc_endpoint(mut self, vnc_endpoint: impl AsRef) -> Result { + self.vnc_endpoint = Some(normalize_vnc_endpoint(vnc_endpoint.as_ref())?); + Ok(self) + } + + pub fn with_novnc_url(mut self, novnc_url: impl AsRef) -> Result { + self.novnc_url = Some(normalize_novnc_url(novnc_url.as_ref())?); + Ok(self) + } + + pub fn with_share_url(mut self, share_url: impl AsRef) -> Result { + self.share_url = Some(normalize_share_url(share_url.as_ref())?); + Ok(self) } } @@ -35,6 +71,63 @@ pub fn parse_named_browser_endpoints(value: &str) -> Result Result<(String, String)> { + let (name, endpoint) = value + .split_once('=') + .ok_or_else(|| anyhow!("browser VNC endpoint must use NAME=HOST:PORT format"))?; + Ok(( + normalize_configured_browser_name(name)?, + normalize_vnc_endpoint(endpoint)?, + )) +} + +pub fn parse_named_browser_vnc_endpoints(value: &str) -> Result> { + value + .split([',', ';']) + .map(str::trim) + .filter(|entry| !entry.is_empty()) + .map(parse_named_browser_vnc_endpoint) + .collect() +} + +pub fn parse_named_browser_novnc_url(value: &str) -> Result<(String, String)> { + let (name, url) = value + .split_once('=') + .ok_or_else(|| anyhow!("browser noVNC URL must use NAME=URL format"))?; + Ok(( + normalize_configured_browser_name(name)?, + normalize_novnc_url(url)?, + )) +} + +pub fn parse_named_browser_novnc_urls(value: &str) -> Result> { + value + .split([',', ';']) + .map(str::trim) + .filter(|entry| !entry.is_empty()) + .map(parse_named_browser_novnc_url) + .collect() +} + +pub fn parse_named_browser_share_url(value: &str) -> Result<(String, String)> { + let (name, url) = value + .split_once('=') + .ok_or_else(|| anyhow!("browser share URL must use NAME=URL format"))?; + Ok(( + normalize_configured_browser_name(name)?, + normalize_share_url(url)?, + )) +} + +pub fn parse_named_browser_share_urls(value: &str) -> Result> { + value + .split([',', ';']) + .map(str::trim) + .filter(|entry| !entry.is_empty()) + .map(parse_named_browser_share_url) + .collect() +} + pub fn browser_endpoints_from_env() -> Result> { let mut endpoints = Vec::new(); @@ -46,6 +139,40 @@ pub fn browser_endpoints_from_env() -> Result> { endpoints.push(NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, endpoint)?); } + if let Some(value) = nonempty_env("BROWSER_CONNECTION_BROWSER_VNCS") { + for (name, endpoint) in parse_named_browser_vnc_endpoints(&value)? { + upsert_browser_vnc_endpoint(&mut endpoints, name, endpoint); + } + } + + if let Some(endpoint) = nonempty_env("BROWSER_CONNECTION_PERSONAL_VNC_ENDPOINT") { + upsert_browser_vnc_endpoint( + &mut endpoints, + PERSONAL_BROWSER_NAME.to_string(), + normalize_vnc_endpoint(&endpoint)?, + ); + } + + if let Some(value) = nonempty_env("BROWSER_CONNECTION_BROWSER_NOVNC_URLS") { + for (name, url) in parse_named_browser_novnc_urls(&value)? { + upsert_browser_novnc_url(&mut endpoints, name, url); + } + } + + if let Some(url) = nonempty_env("BROWSER_CONNECTION_PERSONAL_NOVNC_URL") { + upsert_browser_novnc_url( + &mut endpoints, + PERSONAL_BROWSER_NAME.to_string(), + normalize_novnc_url(&url)?, + ); + } + + if let Some(value) = nonempty_env("BROWSER_CONNECTION_BROWSER_SHARES") { + for (name, url) in parse_named_browser_share_urls(&value)? { + upsert_browser_share_url(&mut endpoints, name, url); + } + } + Ok(endpoints) } @@ -95,6 +222,64 @@ pub(crate) fn normalize_cdp_endpoint(endpoint: &str) -> Result { Ok(endpoint.to_string()) } +pub(crate) fn normalize_vnc_endpoint(endpoint: &str) -> Result { + let endpoint = endpoint.trim().trim_end_matches('/'); + if endpoint.is_empty() { + return Err(anyhow!("VNC endpoint must not be empty")); + } + if endpoint.starts_with("http://") + || endpoint.starts_with("https://") + || endpoint.starts_with("ws://") + || endpoint.starts_with("wss://") + { + return Err(anyhow!( + "VNC endpoint `{endpoint}` must use HOST:PORT, not a URL" + )); + } + let Some((host, port)) = endpoint.rsplit_once(':') else { + return Err(anyhow!("VNC endpoint `{endpoint}` must use HOST:PORT")); + }; + let host = host.trim().trim_matches(['[', ']']); + let port = port + .trim() + .parse::() + .map_err(|_| anyhow!("VNC endpoint `{endpoint}` must end with a valid TCP port"))?; + if host.is_empty() { + return Err(anyhow!("VNC endpoint `{endpoint}` must include a host")); + } + Ok(format!("{host}:{port}")) +} + +pub(crate) fn normalize_novnc_url(url: &str) -> Result { + let url = url.trim().trim_end_matches('/'); + if url.is_empty() { + return Err(anyhow!("noVNC URL must not be empty")); + } + if !(url.starts_with("http://") || url.starts_with("https://")) { + return Err(anyhow!( + "noVNC URL `{url}` must start with http:// or https://" + )); + } + Ok(url.to_string()) +} + +pub(crate) fn normalize_share_url(url: &str) -> Result { + let url = url.trim(); + if url.is_empty() { + return Err(anyhow!("browser share URL must not be empty")); + } + if !(url.starts_with("http://") + || url.starts_with("https://") + || url.starts_with("ws://") + || url.starts_with("wss://")) + { + return Err(anyhow!( + "browser share URL `{url}` must start with http://, https://, ws:// or wss://" + )); + } + Ok(url.to_string()) +} + pub(crate) fn upsert_browser_endpoint( endpoints: &mut Vec, endpoint: NamedBrowserEndpoint, @@ -103,12 +288,78 @@ pub(crate) fn upsert_browser_endpoint( .iter_mut() .find(|existing| existing.name == endpoint.name) { + let vnc_endpoint = existing.vnc_endpoint.clone(); + let novnc_url = existing.novnc_url.clone(); + let share_url = existing.share_url.clone(); *existing = endpoint; + if existing.vnc_endpoint.is_none() { + existing.vnc_endpoint = vnc_endpoint; + } + if existing.novnc_url.is_none() { + existing.novnc_url = novnc_url; + } + if existing.share_url.is_none() { + existing.share_url = share_url; + } } else { endpoints.push(endpoint); } } +pub(crate) fn upsert_browser_vnc_endpoint( + endpoints: &mut Vec, + name: String, + vnc_endpoint: String, +) { + if let Some(existing) = endpoints.iter_mut().find(|existing| existing.name == name) { + existing.vnc_endpoint = Some(vnc_endpoint); + } else { + endpoints.push(NamedBrowserEndpoint { + name, + cdp_endpoint: String::new(), + vnc_endpoint: Some(vnc_endpoint), + novnc_url: None, + share_url: None, + }); + } +} + +pub(crate) fn upsert_browser_novnc_url( + endpoints: &mut Vec, + name: String, + novnc_url: String, +) { + if let Some(existing) = endpoints.iter_mut().find(|existing| existing.name == name) { + existing.novnc_url = Some(novnc_url); + } else { + endpoints.push(NamedBrowserEndpoint { + name, + cdp_endpoint: String::new(), + vnc_endpoint: None, + novnc_url: Some(novnc_url), + share_url: None, + }); + } +} + +pub(crate) fn upsert_browser_share_url( + endpoints: &mut Vec, + name: String, + share_url: String, +) { + if let Some(existing) = endpoints.iter_mut().find(|existing| existing.name == name) { + existing.share_url = Some(share_url); + } else { + endpoints.push(NamedBrowserEndpoint { + name, + cdp_endpoint: String::new(), + vnc_endpoint: None, + novnc_url: None, + share_url: Some(share_url), + }); + } +} + fn normalize_configured_browser_name(name: &str) -> Result { let name = normalize_browser_name(name)?; if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { @@ -137,6 +388,85 @@ mod tests { assert_eq!(endpoint.name, PERSONAL_BROWSER_NAME); assert_eq!(endpoint.cdp_endpoint, "http://127.0.0.1:9222"); + assert_eq!(endpoint.vnc_endpoint, None); + assert_eq!(endpoint.novnc_url, None); + assert_eq!(endpoint.share_url, None); + } + + #[test] + fn parses_named_vnc_endpoint() { + let (name, endpoint) = + parse_named_browser_vnc_endpoint("personal=host.docker.internal:5900") + .expect("vnc endpoint parses"); + + assert_eq!(name, PERSONAL_BROWSER_NAME); + assert_eq!(endpoint, "host.docker.internal:5900"); + } + + #[test] + fn rejects_url_as_vnc_endpoint() { + let error = parse_named_browser_vnc_endpoint("personal=http://127.0.0.1:5900") + .expect_err("VNC endpoint is not an HTTP URL"); + + assert!(error.to_string().contains("HOST:PORT")); + } + + #[test] + fn parses_named_novnc_url() { + let (name, url) = parse_named_browser_novnc_url("personal=http://127.0.0.1:6680/vnc.html") + .expect("noVNC URL parses"); + + assert_eq!(name, PERSONAL_BROWSER_NAME); + assert_eq!(url, "http://127.0.0.1:6680/vnc.html"); + } + + #[test] + fn parses_named_share_url() { + let (name, url) = + parse_named_browser_share_url("edge=https://relay.example/share/s1#agent=a1") + .expect("share URL parses"); + + assert_eq!(name, "edge"); + assert_eq!(url, "https://relay.example/share/s1#agent=a1"); + } + + #[test] + fn rejects_novnc_url_without_http_scheme() { + let error = parse_named_browser_novnc_url("personal=127.0.0.1:6680/vnc.html") + .expect_err("noVNC URL requires a URL scheme"); + + assert!(error + .to_string() + .contains("must start with http:// or https://")); + } + + #[test] + fn upserting_cdp_preserves_display_metadata() { + let mut endpoints = + vec![ + NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, "http://127.0.0.1:9222") + .expect("endpoint is valid") + .with_vnc_endpoint("host.docker.internal:5900") + .expect("vnc endpoint is valid") + .with_share_url("https://relay.example/share/s1#agent=a1") + .expect("share URL is valid"), + ]; + + upsert_browser_endpoint( + &mut endpoints, + NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, "http://127.0.0.1:9333") + .expect("endpoint is valid"), + ); + + assert_eq!(endpoints[0].cdp_endpoint, "http://127.0.0.1:9333"); + assert_eq!( + endpoints[0].vnc_endpoint.as_deref(), + Some("host.docker.internal:5900") + ); + assert_eq!( + endpoints[0].share_url.as_deref(), + Some("https://relay.example/share/s1#agent=a1") + ); } #[test] @@ -146,4 +476,89 @@ mod tests { assert!(error.to_string().contains("reserved")); } + + #[test] + fn env_configuration_merges_personal_cdp_vnc_and_novnc() { + let saved = [ + ( + "BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT", + env::var("BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT").ok(), + ), + ( + "BROWSER_CONNECTION_PERSONAL_VNC_ENDPOINT", + env::var("BROWSER_CONNECTION_PERSONAL_VNC_ENDPOINT").ok(), + ), + ( + "BROWSER_CONNECTION_PERSONAL_NOVNC_URL", + env::var("BROWSER_CONNECTION_PERSONAL_NOVNC_URL").ok(), + ), + ( + "BROWSER_CONNECTION_BROWSERS", + env::var("BROWSER_CONNECTION_BROWSERS").ok(), + ), + ( + "BROWSER_CONNECTION_BROWSER_VNCS", + env::var("BROWSER_CONNECTION_BROWSER_VNCS").ok(), + ), + ( + "BROWSER_CONNECTION_BROWSER_NOVNC_URLS", + env::var("BROWSER_CONNECTION_BROWSER_NOVNC_URLS").ok(), + ), + ( + "BROWSER_CONNECTION_BROWSER_SHARES", + env::var("BROWSER_CONNECTION_BROWSER_SHARES").ok(), + ), + ]; + + env::set_var( + "BROWSER_CONNECTION_PERSONAL_CDP_ENDPOINT", + "http://host.docker.internal:9222", + ); + env::set_var( + "BROWSER_CONNECTION_PERSONAL_VNC_ENDPOINT", + "host.docker.internal:5900", + ); + env::set_var( + "BROWSER_CONNECTION_PERSONAL_NOVNC_URL", + "http://127.0.0.1:6680/vnc.html", + ); + env::remove_var("BROWSER_CONNECTION_BROWSERS"); + env::remove_var("BROWSER_CONNECTION_BROWSER_VNCS"); + env::remove_var("BROWSER_CONNECTION_BROWSER_NOVNC_URLS"); + env::set_var( + "BROWSER_CONNECTION_BROWSER_SHARES", + "edge=https://relay.example/share/s1#agent=a1", + ); + + let endpoints = browser_endpoints_from_env().expect("env endpoints parse"); + let personal = endpoints + .iter() + .find(|endpoint| endpoint.name == PERSONAL_BROWSER_NAME) + .expect("personal endpoint exists"); + + assert_eq!(personal.cdp_endpoint, "http://host.docker.internal:9222"); + assert_eq!( + personal.vnc_endpoint.as_deref(), + Some("host.docker.internal:5900") + ); + assert_eq!( + personal.novnc_url.as_deref(), + Some("http://127.0.0.1:6680/vnc.html") + ); + let edge = endpoints + .iter() + .find(|endpoint| endpoint.name == "edge") + .expect("edge shared endpoint exists"); + assert_eq!( + edge.share_url.as_deref(), + Some("https://relay.example/share/s1#agent=a1") + ); + + for (name, value) in saved { + match value { + Some(value) => env::set_var(name, value), + None => env::remove_var(name), + } + } + } } diff --git a/src/lib.rs b/src/lib.rs index f6ccdf0..7604655 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,7 @@ mod browser; mod browser_target; pub mod cdp; pub mod mcp; +pub mod shared_browser; use crate::browser::DockerBrowserShell; use anyhow::Result; @@ -27,6 +28,8 @@ use std::env; pub const BROWSER_VNC_PORT: u16 = 5900; pub const BROWSER_NOVNC_PORT: u16 = 6080; pub const BROWSER_CDP_PORT: u16 = 9223; +pub const BROWSER_TARGET_NOVNC_PORT_OFFSET: u16 = 400; +pub const BROWSER_CONTROL_PANEL_PORT_OFFSET: u16 = 800; const DOCKER_GIT_CONTAINER_PREFIX: &str = "dg-"; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] @@ -60,6 +63,27 @@ pub fn compute_browser_ports(project_id: &str) -> BrowserPorts { } } +pub fn compute_browser_target_novnc_port(project_id: &str, browser_name: &str) -> u16 { + let normalized = normalize_project_container_name(project_id); + let key = format!("{normalized}:{}", browser_name.trim()); + let hash = key.bytes().fold(0u32, |acc, byte| { + acc.wrapping_mul(31).wrapping_add(u32::from(byte)) + }); + let offset = (hash % 400) as u16; + + BROWSER_NOVNC_PORT + BROWSER_TARGET_NOVNC_PORT_OFFSET + offset +} + +pub fn compute_browser_control_panel_port(project_id: &str) -> u16 { + let normalized = normalize_project_container_name(project_id); + let hash = normalized.bytes().fold(0u32, |acc, byte| { + acc.wrapping_mul(31).wrapping_add(u32::from(byte)) + }); + let offset = (hash % 400) as u16; + + BROWSER_NOVNC_PORT + BROWSER_CONTROL_PANEL_PORT_OFFSET + offset +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct BrowserSpec { pub project_id: String, @@ -71,6 +95,18 @@ pub struct BrowserSpec { pub ports: BrowserPorts, } +#[derive(Debug, Clone, PartialEq, Eq, Serialize)] +pub struct BrowserTargetDisplaySpec { + pub project_id: String, + pub browser_name: String, + pub main_container_name: String, + pub container_name: String, + pub image_name: String, + pub network_mode: String, + pub vnc_endpoint: String, + pub novnc_port: u16, +} + #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize)] pub struct BrowserResourceLimits { pub cpu_limit: Option, @@ -112,6 +148,15 @@ pub struct BrowserStopInfo { pub removed: bool, } +#[derive(Debug, Clone, Serialize)] +pub struct BrowserTargetDisplayInfo { + pub project_id: String, + pub browser_name: String, + pub container_name: String, + pub vnc_endpoint: String, + pub novnc_url: String, +} + fn resolved_or(resolve: &F, name: &str, fallback: String) -> String where F: Fn(&str) -> Option, @@ -231,6 +276,75 @@ pub fn browser_spec_from_env(project_id: &str, network: Option<&str>) -> Browser browser_spec_from_resolver(project_id, network, env_value) } +fn browser_target_display_spec_from_resolver( + project_id: &str, + network: Option<&str>, + browser_name: &str, + vnc_endpoint: &str, + resolve: F, +) -> BrowserTargetDisplaySpec +where + F: Fn(&str) -> Option, +{ + let browser_spec = browser_spec_from_resolver(project_id, network, resolve); + let browser_name = browser_name.trim(); + let novnc_port = compute_browser_target_novnc_port(&browser_spec.project_id, browser_name); + let network_mode = display_proxy_network_mode(&browser_spec.network_mode); + + BrowserTargetDisplaySpec { + project_id: browser_spec.project_id, + browser_name: browser_name.to_string(), + main_container_name: browser_spec.main_container_name, + container_name: format!("{}-novnc-{browser_name}", browser_spec.container_name), + image_name: format!( + "{}-novnc-proxy:docker-git-browser", + browser_spec.container_name + ), + network_mode, + vnc_endpoint: vnc_endpoint.trim().to_string(), + novnc_port, + } +} + +fn display_proxy_network_mode(managed_network_mode: &str) -> String { + let network_mode = managed_network_mode.trim(); + if network_mode.is_empty() || network_mode.starts_with("container:") { + "bridge".to_string() + } else { + network_mode.to_string() + } +} + +pub fn browser_target_display_spec_from_defaults( + project_id: &str, + network: Option<&str>, + browser_name: &str, + vnc_endpoint: &str, +) -> BrowserTargetDisplaySpec { + browser_target_display_spec_from_resolver( + project_id, + network, + browser_name, + vnc_endpoint, + |_| None, + ) +} + +pub fn browser_target_display_spec_from_env( + project_id: &str, + network: Option<&str>, + browser_name: &str, + vnc_endpoint: &str, +) -> BrowserTargetDisplaySpec { + browser_target_display_spec_from_resolver( + project_id, + network, + browser_name, + vnc_endpoint, + env_value, + ) +} + // CHANGE: read browser container resource ceilings from docker-git's generated environment. // WHY: docker-git emits DOCKER_GIT_BROWSER_*_LIMIT for the Rust-owned browser container. // QUOTE(ТЗ): "When users set --playwright-cpu/--playwright-ram or rely on the defaults" @@ -276,6 +390,22 @@ pub fn render_cdp_url_for_ports(ports: BrowserPorts) -> String { format!("http://127.0.0.1:{}", ports.cdp) } +pub fn render_novnc_url_for_port(port: u16) -> String { + format!("http://127.0.0.1:{port}/vnc.html?autoconnect=true&resize=remote&path=websockify") +} + +pub fn render_browser_target_novnc_url(project_id: &str, browser_name: &str) -> String { + render_novnc_url_for_port(compute_browser_target_novnc_port(project_id, browser_name)) +} + +pub fn render_browser_control_panel_url(project_id: &str) -> String { + render_browser_control_panel_url_for_port(compute_browser_control_panel_port(project_id)) +} + +pub fn render_browser_control_panel_url_for_port(port: u16) -> String { + format!("http://127.0.0.1:{port}/") +} + pub fn is_single_browser_session(cdp_url: &str, novnc_url: &str) -> bool { novnc_url.contains("/vnc.html") && (cdp_url.starts_with("http://") || cdp_url.starts_with("https://")) @@ -324,6 +454,26 @@ impl BrowserConnection { }) } + pub fn start_browser_target_display( + &self, + project_id: &str, + network: Option<&str>, + browser_name: &str, + vnc_endpoint: &str, + ) -> Result { + let spec = + browser_target_display_spec_from_env(project_id, network, browser_name, vnc_endpoint); + let runtime = self.shell.ensure_novnc_proxy_container(&spec)?; + + Ok(BrowserTargetDisplayInfo { + project_id: spec.project_id, + browser_name: spec.browser_name, + container_name: runtime.container_name, + vnc_endpoint: runtime.vnc_endpoint, + novnc_url: runtime.novnc_url, + }) + } + pub fn get_novnc_url(&self, project_id: &str) -> String { render_novnc_url_for_ports(compute_browser_ports(project_id)) } @@ -332,6 +482,10 @@ impl BrowserConnection { render_cdp_url_for_ports(compute_browser_ports(project_id)) } + pub fn get_browser_target_novnc_url(&self, project_id: &str, browser_name: &str) -> String { + render_browser_target_novnc_url(project_id, browser_name) + } + pub fn is_single_browser_session(&self, cdp_url: &str, novnc_url: &str) -> bool { is_single_browser_session(cdp_url, novnc_url) } @@ -368,6 +522,64 @@ mod tests { assert_eq!(spec.ports, compute_browser_ports("dg-docker-git-issue-347")); } + #[test] + fn target_novnc_port_is_deterministic_and_separate_from_managed_ports() { + let managed = compute_browser_ports("docker-git-issue-347"); + let personal = compute_browser_target_novnc_port("docker-git-issue-347", "personal"); + + assert_eq!( + personal, + compute_browser_target_novnc_port("docker-git-issue-347", "personal") + ); + assert!(personal >= BROWSER_NOVNC_PORT + BROWSER_TARGET_NOVNC_PORT_OFFSET); + assert_ne!(personal, managed.novnc); + } + + #[test] + fn control_panel_port_is_deterministic_and_separate_from_browser_ports() { + let managed = compute_browser_ports("docker-git-issue-347"); + let control = compute_browser_control_panel_port("docker-git-issue-347"); + + assert_eq!( + control, + compute_browser_control_panel_port("docker-git-issue-347") + ); + assert!(control >= BROWSER_NOVNC_PORT + BROWSER_CONTROL_PANEL_PORT_OFFSET); + assert_ne!(control, managed.novnc); + assert_ne!(control, managed.cdp); + } + + #[test] + fn target_display_spec_derives_names_from_browser_spec() { + let spec = browser_target_display_spec_from_defaults( + "docker-git-issue-347", + Some("bridge"), + "personal", + "host.docker.internal:5900", + ); + + assert_eq!(spec.project_id, "docker-git-issue-347"); + assert_eq!(spec.browser_name, "personal"); + assert_eq!( + spec.container_name, + "dg-docker-git-issue-347-browser-novnc-personal" + ); + assert_eq!(spec.network_mode, "bridge"); + assert_eq!(spec.vnc_endpoint, "host.docker.internal:5900"); + } + + #[test] + fn target_display_spec_uses_bridge_when_managed_browser_uses_project_namespace() { + let spec = browser_target_display_spec_from_defaults( + "docker-git-issue-347", + Some("container:dg-docker-git-issue-347"), + "personal", + "host.docker.internal:5900", + ); + + assert_eq!(spec.network_mode, "bridge"); + } + #[test] fn browser_resource_limits_from_resolver_trims_empty_values() { let limits = browser_resource_limits_from_resolver(|name| match name { diff --git a/src/mcp.rs b/src/mcp.rs index 8e96ed0..337fdff 100644 --- a/src/mcp.rs +++ b/src/mcp.rs @@ -12,20 +12,30 @@ INVARIANT: browser tools always target the active CDP endpoint: managed, explici */ use crate::browser_target::{ - configured_browser_kind, normalize_browser_name, normalize_cdp_endpoint, - upsert_browser_endpoint, + configured_browser_kind, normalize_browser_name, normalize_cdp_endpoint, normalize_novnc_url, + normalize_share_url, normalize_vnc_endpoint, upsert_browser_endpoint, upsert_browser_novnc_url, + upsert_browser_share_url, upsert_browser_vnc_endpoint, }; use crate::cdp::CdpClient; -use crate::{compute_browser_ports, render_cdp_url, render_cdp_url_for_ports, BrowserConnection}; +use crate::shared_browser::SharedBrowserClient; +use crate::{ + compute_browser_ports, render_browser_control_panel_url_for_port, + render_browser_target_novnc_url, render_cdp_url, render_cdp_url_for_ports, BrowserConnection, +}; use anyhow::{anyhow, Context, Result}; use serde_json::{json, Value}; use std::env; use std::io::{BufRead, Write}; +use std::sync::{Arc, Mutex}; + +mod control_panel; pub use crate::browser_target::{ active_browser_from_env, browser_endpoints_from_env, parse_named_browser_endpoint, - parse_named_browser_endpoints, NamedBrowserEndpoint, EXPLICIT_BROWSER_NAME, - MANAGED_BROWSER_NAME, PERSONAL_BROWSER_NAME, + parse_named_browser_endpoints, parse_named_browser_novnc_url, parse_named_browser_novnc_urls, + parse_named_browser_share_url, parse_named_browser_share_urls, + parse_named_browser_vnc_endpoint, parse_named_browser_vnc_endpoints, NamedBrowserEndpoint, + EXPLICIT_BROWSER_NAME, MANAGED_BROWSER_NAME, PERSONAL_BROWSER_NAME, }; pub const SERVER_NAME: &str = "browser-connection"; pub const MCP_PROTOCOL_VERSION: &str = "2025-11-25"; @@ -47,6 +57,7 @@ pub struct McpServerConfig { pub start_browser: bool, pub browser_endpoints: Vec, pub active_browser: Option, + pub control_port: Option, } impl McpServerConfig { @@ -63,6 +74,7 @@ impl McpServerConfig { start_browser, browser_endpoints: Vec::new(), active_browser: None, + control_port: None, } } @@ -73,6 +85,48 @@ impl McpServerConfig { self } + pub fn with_browser_vnc_endpoint( + mut self, + name: impl AsRef, + vnc_endpoint: impl AsRef, + ) -> Result { + let name = normalize_configured_browser_name_for_display(name.as_ref())?; + upsert_browser_vnc_endpoint( + &mut self.browser_endpoints, + name, + normalize_vnc_endpoint(vnc_endpoint.as_ref())?, + ); + Ok(self) + } + + pub fn with_browser_novnc_url( + mut self, + name: impl AsRef, + novnc_url: impl AsRef, + ) -> Result { + let name = normalize_configured_browser_name_for_display(name.as_ref())?; + upsert_browser_novnc_url( + &mut self.browser_endpoints, + name, + normalize_novnc_url(novnc_url.as_ref())?, + ); + Ok(self) + } + + pub fn with_browser_share_url( + mut self, + name: impl AsRef, + share_url: impl AsRef, + ) -> Result { + let name = normalize_configured_browser_name_for_display(name.as_ref())?; + upsert_browser_share_url( + &mut self.browser_endpoints, + name, + normalize_share_url(share_url.as_ref())?, + ); + Ok(self) + } + pub fn with_active_browser(mut self, active_browser: Option) -> Result { self.active_browser = active_browser .as_deref() @@ -80,6 +134,11 @@ impl McpServerConfig { .transpose()?; Ok(self) } + + pub fn with_control_port(mut self, control_port: Option) -> Self { + self.control_port = control_port; + self + } } pub fn project_id_from_env_or_default(project_id: Option) -> String { @@ -96,11 +155,18 @@ where W: Write, { let mut reader = reader; - let mut runtime = McpRuntime::new(config); + let runtime = Arc::new(Mutex::new(McpRuntime::new(config)?)); + control_panel::spawn_control_panel(Arc::clone(&runtime))?; let mut transport = None; while let Some(message) = read_message(&mut reader, &mut transport)? { - match handle_message(&mut runtime, &message) { + let result = { + let mut runtime = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned"))?; + handle_message(&mut runtime, &message) + }; + match result { Ok(Some(response)) => { let transport = transport.ok_or_else(|| { anyhow!("stdio transport was unknown after reading a message") @@ -131,42 +197,60 @@ struct McpRuntime { } impl McpRuntime { - fn new(config: McpServerConfig) -> Self { + fn new(config: McpServerConfig) -> Result { + let explicit_endpoint = explicit_cdp_endpoint(&config)?; let active_browser = config.active_browser.clone().unwrap_or_else(|| { - if has_explicit_cdp_endpoint(&config) { + if explicit_endpoint.is_some() { EXPLICIT_BROWSER_NAME.to_string() } else { MANAGED_BROWSER_NAME.to_string() } }); - Self { + let runtime = Self { config, managed_cdp_endpoint: None, active_browser, - } + }; + runtime.ensure_browser_exists(&runtime.active_browser)?; + Ok(runtime) } fn cdp_endpoint(&mut self) -> Result { match self.active_browser.as_str() { MANAGED_BROWSER_NAME => self.managed_cdp_endpoint(), - EXPLICIT_BROWSER_NAME => explicit_cdp_endpoint(&self.config) + EXPLICIT_BROWSER_NAME => explicit_cdp_endpoint(&self.config)? .ok_or_else(|| anyhow!("explicit CDP endpoint is not configured")), name => self .config .browser_endpoints .iter() .find(|endpoint| endpoint.name == name) - .map(|endpoint| endpoint.cdp_endpoint.clone()) + .and_then(|endpoint| { + (!endpoint.cdp_endpoint.trim().is_empty()) + .then(|| endpoint.cdp_endpoint.clone()) + }) .ok_or_else(|| { anyhow!( - "Unknown browser `{name}`. Available browsers: {}", + "Browser `{name}` does not have a CDP endpoint configured. Available browsers: {}", self.available_browser_names().join(", ") ) }), } } + fn active_share_url(&self) -> Option { + let name = self.active_browser.as_str(); + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return None; + } + self.config + .browser_endpoints + .iter() + .find(|endpoint| endpoint.name == name) + .and_then(|endpoint| endpoint.share_url.clone()) + } + fn managed_cdp_endpoint(&mut self) -> Result { if self.managed_cdp_endpoint.is_none() { self.managed_cdp_endpoint = Some(resolve_managed_cdp_endpoint(&self.config)?); @@ -178,18 +262,21 @@ impl McpRuntime { } fn browser_inventory_text(&self) -> Result { - serde_json::to_string_pretty(&self.browser_inventory()) + serde_json::to_string_pretty(&self.browser_inventory()?) .context("failed to render browser inventory") } - fn browser_inventory(&self) -> Value { + fn browser_inventory(&self) -> Result { let mut browsers = vec![self.managed_browser_entry()]; - if let Some(endpoint) = explicit_cdp_endpoint(&self.config) { + if let Some(endpoint) = explicit_cdp_endpoint(&self.config)? { browsers.push(browser_entry( EXPLICIT_BROWSER_NAME, "explicit", Some(endpoint), + None, + None, + None, "configured", self.active_browser == EXPLICIT_BROWSER_NAME, )); @@ -198,17 +285,21 @@ impl McpRuntime { for endpoint in &self.config.browser_endpoints { browsers.push(browser_entry( &endpoint.name, - configured_browser_kind(&endpoint.name), - Some(endpoint.cdp_endpoint.clone()), + browser_endpoint_kind(endpoint), + (!endpoint.cdp_endpoint.trim().is_empty()).then(|| endpoint.cdp_endpoint.clone()), + endpoint.vnc_endpoint.clone(), + endpoint_novnc_url(&self.config, endpoint), + endpoint.share_url.clone(), "configured", self.active_browser == endpoint.name, )); } - json!({ + Ok(json!({ "active": self.active_browser, + "controlPanelUrl": control_panel_url(&self.config), "browsers": browsers - }) + })) } fn managed_browser_entry(&self) -> Value { @@ -232,12 +323,22 @@ impl McpRuntime { MANAGED_BROWSER_NAME, "managed", endpoint, + None, + Some(managed_novnc_url(&self.config)), + None, resolution, self.active_browser == MANAGED_BROWSER_NAME, ) } - fn select_browser(&mut self, name: &str, cdp_endpoint: Option<&str>) -> Result { + fn select_browser( + &mut self, + name: &str, + cdp_endpoint: Option<&str>, + vnc_endpoint: Option<&str>, + novnc_url: Option<&str>, + share_url: Option<&str>, + ) -> Result { let name = normalize_browser_name(name)?; if let Some(endpoint) = cdp_endpoint { @@ -248,14 +349,52 @@ impl McpRuntime { } let endpoint = NamedBrowserEndpoint::new(&name, endpoint)?; upsert_browser_endpoint(&mut self.config.browser_endpoints, endpoint); - } else { - self.ensure_browser_exists(&name)?; } + if let Some(endpoint) = vnc_endpoint { + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Err(anyhow!( + "`{name}` is reserved; VNC metadata belongs to custom browser targets" + )); + } + upsert_browser_vnc_endpoint( + &mut self.config.browser_endpoints, + name.clone(), + normalize_vnc_endpoint(endpoint)?, + ); + } + if let Some(url) = novnc_url { + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Err(anyhow!( + "`{name}` is reserved; noVNC metadata belongs to custom browser targets" + )); + } + upsert_browser_novnc_url( + &mut self.config.browser_endpoints, + name.clone(), + normalize_novnc_url(url)?, + ); + } + if let Some(url) = share_url { + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Err(anyhow!( + "`{name}` is reserved; shared browser links belong to custom browser targets" + )); + } + upsert_browser_share_url( + &mut self.config.browser_endpoints, + name.clone(), + normalize_share_url(url)?, + ); + } + + self.ensure_browser_exists(&name)?; self.active_browser = name; + self.ensure_active_display()?; + let inventory = self.browser_inventory()?; serde_json::to_string_pretty(&json!({ "selected": self.active_browser, - "browser": self.browser_inventory() + "browser": inventory .get("browsers") .and_then(Value::as_array) .and_then(|browsers| browsers.iter().find(|browser| { @@ -271,15 +410,23 @@ impl McpRuntime { if name == MANAGED_BROWSER_NAME { return Ok(()); } - if name == EXPLICIT_BROWSER_NAME && has_explicit_cdp_endpoint(&self.config) { - return Ok(()); + if name == EXPLICIT_BROWSER_NAME { + if explicit_cdp_endpoint(&self.config)?.is_some() { + return Ok(()); + } + return Err(anyhow!("explicit CDP endpoint is not configured")); } - if self + if let Some(endpoint) = self .config .browser_endpoints .iter() - .any(|endpoint| endpoint.name == name) + .find(|endpoint| endpoint.name == name) { + if endpoint.cdp_endpoint.trim().is_empty() && endpoint.share_url.is_none() { + return Err(anyhow!( + "Browser `{name}` does not have a CDP endpoint or share URL configured" + )); + } return Ok(()); } @@ -289,9 +436,46 @@ impl McpRuntime { )) } + fn ensure_active_display(&mut self) -> Result<()> { + if !self.config.start_browser { + return Ok(()); + } + + let name = self.active_browser.clone(); + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Ok(()); + } + + let Some(index) = self + .config + .browser_endpoints + .iter() + .position(|endpoint| endpoint.name == name) + else { + return Ok(()); + }; + let endpoint = self.config.browser_endpoints[index].clone(); + let Some(vnc_endpoint) = endpoint.vnc_endpoint else { + return Ok(()); + }; + if endpoint.novnc_url.is_some() { + return Ok(()); + } + + let connection = BrowserConnection::new()?; + let info = connection.start_browser_target_display( + &self.config.project_id, + self.config.network.as_deref(), + &name, + &vnc_endpoint, + )?; + self.config.browser_endpoints[index].novnc_url = Some(info.novnc_url); + Ok(()) + } + fn available_browser_names(&self) -> Vec { let mut names = vec![MANAGED_BROWSER_NAME.to_string()]; - if has_explicit_cdp_endpoint(&self.config) { + if explicit_cdp_endpoint(&self.config).ok().flatten().is_some() { names.push(EXPLICIT_BROWSER_NAME.to_string()); } names.extend( @@ -314,21 +498,22 @@ fn resolve_managed_cdp_endpoint(config: &McpServerConfig) -> Result { Ok(info.cdp_url) } -fn explicit_cdp_endpoint(config: &McpServerConfig) -> Option { +fn explicit_cdp_endpoint(config: &McpServerConfig) -> Result> { config .cdp_endpoint .as_deref() - .and_then(|endpoint| normalize_cdp_endpoint(endpoint).ok()) -} - -fn has_explicit_cdp_endpoint(config: &McpServerConfig) -> bool { - explicit_cdp_endpoint(config).is_some() + .map(normalize_cdp_endpoint) + .transpose() } +#[allow(clippy::too_many_arguments)] fn browser_entry( name: &str, kind: &str, cdp_endpoint: Option, + vnc_endpoint: Option, + novnc_url: Option, + share_url: Option, resolution: &str, active: bool, ) -> Value { @@ -336,11 +521,56 @@ fn browser_entry( "name": name, "kind": kind, "cdpEndpoint": cdp_endpoint, + "vncEndpoint": vnc_endpoint, + "novncUrl": novnc_url, + "shareUrl": share_url, "resolution": resolution, "active": active }) } +fn browser_endpoint_kind(endpoint: &NamedBrowserEndpoint) -> &'static str { + if endpoint.share_url.is_some() && endpoint.cdp_endpoint.trim().is_empty() { + "shared-extension" + } else { + configured_browser_kind(&endpoint.name) + } +} + +fn managed_novnc_url(config: &McpServerConfig) -> String { + if !config.start_browser { + return crate::render_novnc_url(); + } + + let ports = compute_browser_ports(&config.project_id); + crate::render_novnc_url_for_ports(ports) +} + +fn endpoint_novnc_url(config: &McpServerConfig, endpoint: &NamedBrowserEndpoint) -> Option { + endpoint.novnc_url.clone().or_else(|| { + endpoint + .vnc_endpoint + .as_ref() + .map(|_| render_browser_target_novnc_url(&config.project_id, &endpoint.name)) + }) +} + +fn control_panel_url(config: &McpServerConfig) -> Option { + config + .control_port + .map(render_browser_control_panel_url_for_port) +} + +fn normalize_configured_browser_name_for_display(name: &str) -> Result { + let name = normalize_browser_name(name)?; + if name == MANAGED_BROWSER_NAME || name == EXPLICIT_BROWSER_NAME { + return Err(anyhow!( + "`{name}` is reserved and cannot name a configured browser" + )); + } + Ok(name) +} + fn read_message( reader: &mut R, transport: &mut Option, @@ -551,10 +781,13 @@ fn tool_definitions() -> Vec { ), tool( "browser_select", - "Switch the active browser target by name, optionally registering a CDP endpoint first.", + "Switch the active browser target by name, optionally registering CDP and display endpoints first.", json!({ "name": { "type": "string", "description": "Browser target name, e.g. managed or personal" }, - "cdp_endpoint": { "type": "string", "description": "Optional CDP endpoint to register for this browser name" } + "cdp_endpoint": { "type": "string", "description": "Optional CDP endpoint to register for this browser name" }, + "vnc_endpoint": { "type": "string", "description": "Optional VNC endpoint to register as HOST:PORT" }, + "novnc_url": { "type": "string", "description": "Optional pre-existing noVNC URL for this browser name" }, + "share_url": { "type": "string", "description": "Optional shared browser extension link for this browser name" } }), vec!["name"], ), @@ -628,10 +861,19 @@ fn handle_tool_call(runtime: &mut McpRuntime, request: &Value) -> Value { "browser_select" => runtime.select_browser( required_str(arguments, "name").unwrap_or(""), arguments.get("cdp_endpoint").and_then(Value::as_str), + arguments.get("vnc_endpoint").and_then(Value::as_str), + arguments.get("novnc_url").and_then(Value::as_str), + arguments.get("share_url").and_then(Value::as_str), ), - _ => runtime - .cdp_endpoint() - .and_then(|cdp_endpoint| dispatch_tool(&cdp_endpoint, name, arguments)), + _ => runtime.ensure_active_display().and_then(|_| { + if let Some(share_url) = runtime.active_share_url() { + dispatch_shared_tool(&share_url, name, arguments) + } else { + runtime + .cdp_endpoint() + .and_then(|cdp_endpoint| dispatch_tool(&cdp_endpoint, name, arguments)) + } + }), }; match result { Ok(text) => tool_result(text, false), @@ -663,6 +905,30 @@ fn dispatch_tool(cdp_endpoint: &str, name: &str, arguments: &Value) -> Result Result { + let client = SharedBrowserClient::new(share_url); + match name { + "browser_navigate" => client.navigate(required_str(arguments, "url")?), + "browser_snapshot" => client.snapshot(), + "browser_evaluate" => client.evaluate(required_str(arguments, "expression")?), + "browser_click" => client.click(required_str(arguments, "selector")?), + "browser_type" => client.type_text( + required_str(arguments, "selector")?, + required_str(arguments, "text")?, + ), + "browser_press_key" => client.press_key(required_str(arguments, "key")?), + "browser_take_screenshot" => { + let full_page = arguments + .get("full_page") + .and_then(Value::as_bool) + .unwrap_or(true); + client.screenshot(full_page) + } + "" => Err(anyhow!("tools/call params.name is required")), + _ => Err(anyhow!("Unknown browser-connection tool: {name}")), + } +} + fn required_str<'a>(arguments: &'a Value, name: &str) -> Result<&'a str> { arguments .get(name) @@ -697,293 +963,4 @@ fn normalize_project_id(project_id: String) -> String { } #[cfg(test)] -mod tests { - use super::*; - use std::io::Cursor; - - fn encode_message(value: Value) -> Vec { - let body = serde_json::to_vec(&value).expect("message body serializes"); - let mut framed = format!("Content-Length: {}\r\n\r\n", body.len()).into_bytes(); - framed.extend_from_slice(&body); - framed - } - - fn decode_messages(bytes: &[u8]) -> Vec { - let mut cursor = Cursor::new(bytes); - let mut responses = Vec::new(); - - let mut transport = Some(StdioTransport::Framed); - while let Some(message) = - read_message(&mut cursor, &mut transport).expect("stdout frame parses") - { - responses.push(serde_json::from_str(&message).expect("stdout frame body is JSON")); - } - - responses - } - - fn decode_line_messages(bytes: &[u8]) -> Vec { - let text = String::from_utf8(bytes.to_vec()).expect("stdout lines are utf8"); - text.lines() - .filter(|line| !line.trim().is_empty()) - .map(|line| serde_json::from_str(line).expect("stdout line is JSON")) - .collect() - } - - #[test] - fn env_fallback_prefers_explicit_project() { - assert_eq!( - project_id_from_env_or_default(Some(" dg-x ".to_string())), - "dg-x" - ); - } - - #[test] - fn stdio_initialize_and_list_use_framed_mcp_transport() { - let config = McpServerConfig::new("dg-test", None, None, false); - let mut input = Vec::new(); - input.extend(encode_message(json!({ - "jsonrpc": "2.0", - "id": 1, - "method": "initialize", - "params": { - "protocolVersion": MCP_PROTOCOL_VERSION, - "capabilities": {}, - "clientInfo": { "name": "probe", "version": "0" } - } - }))); - input.extend(encode_message(json!({ - "jsonrpc": "2.0", - "method": "notifications/initialized", - "params": {} - }))); - input.extend(encode_message(json!({ - "jsonrpc": "2.0", - "id": 2, - "method": "tools/list", - "params": {} - }))); - - let input = Cursor::new(input); - let mut output = Vec::new(); - - run_stdio(config, input, &mut output).expect("stdio loop succeeds"); - - let responses = decode_messages(&output); - assert_eq!(responses.len(), 2); - assert_eq!(responses[0]["id"], 1); - assert_eq!(responses[0]["result"]["serverInfo"]["name"], SERVER_NAME); - assert_eq!(responses[1]["id"], 2); - assert!(responses[1]["result"]["tools"] - .as_array() - .expect("tools/list returns an array") - .iter() - .any(|tool| tool["name"] == "browser_navigate")); - } - - #[test] - fn stdio_initialize_and_list_use_line_delimited_transport() { - let config = McpServerConfig::new("dg-test", None, None, false); - let input = Cursor::new( - [ - r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"elicitation":{}},"clientInfo":{"name":"codex-mcp-client","version":"0"}}}"#, - r#"{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}"#, - ] - .join("\n"), - ); - let mut output = Vec::new(); - - run_stdio(config, input, &mut output).expect("stdio loop succeeds"); - - let responses = decode_line_messages(&output); - assert_eq!(responses.len(), 2); - assert_eq!(responses[0]["id"], 1); - assert_eq!(responses[0]["result"]["protocolVersion"], "2025-06-18"); - assert_eq!(responses[1]["id"], 2); - assert!(responses[1]["result"]["tools"] - .as_array() - .expect("tools/list returns an array") - .iter() - .any(|tool| tool["name"] == "browser_navigate")); - } - - #[test] - fn initialize_and_tools_list_do_not_resolve_cdp_endpoint() { - let config = McpServerConfig::new("dg-test", None, None, true); - let mut runtime = McpRuntime::new(config); - - handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}"#, - ) - .expect("initialize succeeds"); - handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}"#, - ) - .expect("tools/list succeeds"); - - assert_eq!(runtime.managed_cdp_endpoint, None); - assert_eq!(runtime.active_browser, MANAGED_BROWSER_NAME); - } - - #[test] - fn initialize_negotiates_legacy_protocol_version() { - let config = McpServerConfig::new("dg-test", None, None, false); - let mut runtime = McpRuntime::new(config); - - let response = handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}"#, - ) - .expect("initialize succeeds") - .expect("request with id returns a response"); - - assert_eq!(response["result"]["protocolVersion"], "2024-11-05"); - assert_eq!( - response["result"]["capabilities"]["tools"]["listChanged"], - false - ); - } - - #[test] - fn initialize_negotiates_latest_protocol_version() { - let config = McpServerConfig::new("dg-test", None, None, false); - let mut runtime = McpRuntime::new(config); - - let response = handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"roots":{"listChanged":true}},"clientInfo":{"name":"claude-code","version":"2.1.160"}}}"#, - ) - .expect("initialize succeeds") - .expect("request with id returns a response"); - - assert_eq!(response["result"]["protocolVersion"], "2025-11-25"); - } - - #[test] - fn initialize_negotiates_previous_protocol_version() { - let config = McpServerConfig::new("dg-test", None, None, false); - let mut runtime = McpRuntime::new(config); - - let response = handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"elicitation":{}},"clientInfo":{"name":"codex-mcp-client","version":"0"}}}"#, - ) - .expect("initialize succeeds") - .expect("request with id returns a response"); - - assert_eq!(response["result"]["protocolVersion"], "2025-06-18"); - } - - #[test] - fn initialize_rejects_unknown_protocol_version() { - let config = McpServerConfig::new("dg-test", None, None, false); - let mut runtime = McpRuntime::new(config); - - let response = handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2099-01-01","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}"#, - ) - .expect("initialize response serializes") - .expect("request with id returns a response"); - - assert_eq!(response["error"]["code"], -32602); - assert!(response["error"]["message"] - .as_str() - .expect("error message exists") - .contains("Unsupported MCP protocol version")); - } - - #[test] - fn tools_call_resolves_cdp_endpoint_lazily() { - let config = McpServerConfig::new("dg-test", None, None, false); - let mut runtime = McpRuntime::new(config); - let expected_cdp_url = render_cdp_url(); - - let response = handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"unknown","arguments":{}}}"#, - ) - .expect("tools/call response serializes") - .expect("request with id returns a response"); - - assert_eq!( - runtime.managed_cdp_endpoint.as_deref(), - Some(expected_cdp_url.as_str()) - ); - assert_eq!(response["id"], 3); - assert_eq!(response["result"]["isError"], true); - assert!(response["result"]["content"][0]["text"] - .as_str() - .expect("tool result text exists") - .contains("Unknown browser-connection tool")); - } - - #[test] - fn configured_personal_browser_can_be_active_without_docker() { - let config = McpServerConfig::new("dg-test", None, None, true) - .with_browser_endpoints(vec![NamedBrowserEndpoint::new( - PERSONAL_BROWSER_NAME, - "http://127.0.0.1:9333", - ) - .expect("endpoint is valid")]) - .with_active_browser(Some(PERSONAL_BROWSER_NAME.to_string())) - .expect("active browser name is valid"); - let mut runtime = McpRuntime::new(config); - - assert_eq!( - runtime.cdp_endpoint().expect("personal endpoint resolves"), - "http://127.0.0.1:9333" - ); - assert_eq!(runtime.managed_cdp_endpoint, None); - } - - #[test] - fn browser_select_registers_ad_hoc_personal_endpoint_without_resolving_managed_browser() { - let config = McpServerConfig::new("dg-test", None, None, true); - let mut runtime = McpRuntime::new(config); - - let response = handle_message( - &mut runtime, - r#"{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"browser_select","arguments":{"name":"personal","cdp_endpoint":"http://127.0.0.1:9444"}}}"#, - ) - .expect("browser_select response serializes") - .expect("request with id returns a response"); - - assert_eq!(response["id"], 4); - assert_eq!(response["result"]["isError"], false); - assert_eq!(runtime.active_browser, PERSONAL_BROWSER_NAME); - assert_eq!(runtime.managed_cdp_endpoint, None); - assert_eq!( - runtime.cdp_endpoint().expect("personal endpoint resolves"), - "http://127.0.0.1:9444" - ); - } - - #[test] - fn browser_list_reports_active_personal_browser() { - let config = McpServerConfig::new("dg-test", None, None, false) - .with_browser_endpoints(vec![NamedBrowserEndpoint::new( - PERSONAL_BROWSER_NAME, - "http://127.0.0.1:9222", - ) - .expect("endpoint is valid")]) - .with_active_browser(Some(PERSONAL_BROWSER_NAME.to_string())) - .expect("active browser name is valid"); - let runtime = McpRuntime::new(config); - - let inventory = runtime.browser_inventory(); - - assert_eq!(inventory["active"], PERSONAL_BROWSER_NAME); - assert!(inventory["browsers"] - .as_array() - .expect("browsers array") - .iter() - .any(|browser| { - browser["name"] == PERSONAL_BROWSER_NAME - && browser["kind"] == "personal" - && browser["active"] == true - })); - } -} +mod tests; diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs new file mode 100644 index 0000000..cab32a1 --- /dev/null +++ b/src/mcp/control_panel.rs @@ -0,0 +1,602 @@ +use super::{McpRuntime, PERSONAL_BROWSER_NAME}; +use anyhow::{anyhow, Context, Result}; +use serde_json::{json, Value}; +use std::io::{Read, Write}; +use std::net::{TcpListener, TcpStream}; +use std::sync::{Arc, Mutex}; +use std::thread; +use std::time::Duration; + +const MAX_HTTP_REQUEST_BYTES: usize = 64 * 1024; + +pub(super) fn spawn_control_panel(runtime: Arc>) -> Result<()> { + let port = { + let runtime = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned"))?; + runtime.config.control_port + }; + let Some(port) = port else { + return Ok(()); + }; + + let listener = TcpListener::bind(("127.0.0.1", port)) + .with_context(|| format!("failed to bind browser control panel on 127.0.0.1:{port}"))?; + thread::Builder::new() + .name("browser-control-panel".to_string()) + .spawn(move || { + for stream in listener.incoming().flatten() { + let runtime = Arc::clone(&runtime); + thread::Builder::new() + .name("browser-control-panel-client".to_string()) + .spawn(move || { + let _ = handle_connection(runtime, stream); + }) + .ok(); + } + }) + .context("failed to spawn browser control panel thread")?; + + Ok(()) +} + +fn handle_connection(runtime: Arc>, mut stream: TcpStream) -> Result<()> { + stream.set_read_timeout(Some(Duration::from_secs(3))).ok(); + stream.set_write_timeout(Some(Duration::from_secs(3))).ok(); + + let request = read_http_request(&mut stream)?; + let response = route_request(runtime, &request); + write_http_response(&mut stream, response) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +struct HttpRequest { + method: String, + target: String, + body: String, +} + +struct HttpResponse { + status: u16, + reason: &'static str, + content_type: &'static str, + body: Vec, +} + +fn read_http_request(stream: &mut TcpStream) -> Result { + let mut data = Vec::new(); + let mut buffer = [0_u8; 4096]; + + loop { + let read = stream + .read(&mut buffer) + .context("failed to read control panel HTTP request")?; + if read == 0 { + break; + } + data.extend_from_slice(&buffer[..read]); + if data.len() > MAX_HTTP_REQUEST_BYTES { + return Err(anyhow!("control panel HTTP request was too large")); + } + if let Some(header_end) = header_end(&data) { + let content_length = content_length(&data[..header_end])?; + let request_end = header_end + 4 + content_length; + while data.len() < request_end { + let read = stream + .read(&mut buffer) + .context("failed to read control panel HTTP request body")?; + if read == 0 { + break; + } + data.extend_from_slice(&buffer[..read]); + if data.len() > MAX_HTTP_REQUEST_BYTES { + return Err(anyhow!("control panel HTTP request was too large")); + } + } + break; + } + } + + parse_http_request(&data) +} + +fn header_end(data: &[u8]) -> Option { + data.windows(4).position(|window| window == b"\r\n\r\n") +} + +fn content_length(header: &[u8]) -> Result { + let header = String::from_utf8_lossy(header); + for line in header.lines().skip(1) { + let Some((name, value)) = line.split_once(':') else { + continue; + }; + if name.eq_ignore_ascii_case("Content-Length") { + return value + .trim() + .parse::() + .context("control panel Content-Length was invalid"); + } + } + Ok(0) +} + +fn parse_http_request(data: &[u8]) -> Result { + let header_end = header_end(data).ok_or_else(|| anyhow!("HTTP header terminator missing"))?; + let head = String::from_utf8_lossy(&data[..header_end]); + let request_line = head + .lines() + .next() + .ok_or_else(|| anyhow!("HTTP request line missing"))?; + let mut parts = request_line.split_whitespace(); + let method = parts + .next() + .ok_or_else(|| anyhow!("HTTP method missing"))? + .to_string(); + let target = parts + .next() + .ok_or_else(|| anyhow!("HTTP target missing"))? + .to_string(); + let body = String::from_utf8_lossy(&data[header_end + 4..]).to_string(); + + Ok(HttpRequest { + method, + target, + body, + }) +} + +fn route_request(runtime: Arc>, request: &HttpRequest) -> HttpResponse { + match (request.method.as_str(), request_path(&request.target)) { + ("OPTIONS", _) => empty_response(204, "No Content"), + ("GET", "/") | ("GET", "/index.html") => html_response(control_panel_html()), + ("GET", "/api/browsers") => browser_inventory_response(runtime), + ("POST", "/api/share") | ("GET", "/api/share") => register_share_response(runtime, request), + ("POST", "/api/select") | ("GET", "/api/select") => { + select_browser_response(runtime, request) + } + _ => json_response(404, "Not Found", json!({ "error": "not found" })), + } +} + +fn request_path(target: &str) -> &str { + target + .split_once('?') + .map(|(path, _)| path) + .unwrap_or(target) +} + +fn browser_inventory_response(runtime: Arc>) -> HttpResponse { + let result = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned")) + .and_then(|runtime| runtime.browser_inventory()); + match result { + Ok(inventory) => json_response(200, "OK", inventory), + Err(error) => json_response( + 500, + "Internal Server Error", + json!({ "error": error.to_string() }), + ), + } +} + +fn select_browser_response(runtime: Arc>, request: &HttpRequest) -> HttpResponse { + let Some(name) = + query_param(&request.target, "name").or_else(|| query_param(&request.body, "name")) + else { + return json_response(400, "Bad Request", json!({ "error": "name is required" })); + }; + + let result = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned")) + .and_then(|mut runtime| runtime.select_browser(&name, None, None, None, None)); + match result { + Ok(text) => { + let value = serde_json::from_str::(&text) + .unwrap_or_else(|_| json!({ "selected": name })); + json_response(200, "OK", value) + } + Err(error) => json_response(400, "Bad Request", json!({ "error": error.to_string() })), + } +} + +fn register_share_response(runtime: Arc>, request: &HttpRequest) -> HttpResponse { + let Some(name) = + query_param(&request.target, "name").or_else(|| query_param(&request.body, "name")) + else { + return json_response(400, "Bad Request", json!({ "error": "name is required" })); + }; + let Some(share_url) = query_param(&request.target, "share_url") + .or_else(|| query_param(&request.body, "share_url")) + else { + return json_response( + 400, + "Bad Request", + json!({ "error": "share_url is required" }), + ); + }; + + let result = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned")) + .and_then(|mut runtime| runtime.select_browser(&name, None, None, None, Some(&share_url))); + match result { + Ok(text) => { + let value = serde_json::from_str::(&text) + .unwrap_or_else(|_| json!({ "selected": name })); + json_response(200, "OK", value) + } + Err(error) => json_response(400, "Bad Request", json!({ "error": error.to_string() })), + } +} + +fn query_param(target: &str, name: &str) -> Option { + let query = target + .split_once('?') + .map(|(_, query)| query) + .unwrap_or(target); + query.split('&').find_map(|part| { + let (key, value) = part.split_once('=')?; + (url_decode(key) == name).then(|| url_decode(value)) + }) +} + +fn url_decode(value: &str) -> String { + let mut decoded = Vec::with_capacity(value.len()); + let bytes = value.as_bytes(); + let mut index = 0; + while index < bytes.len() { + match bytes[index] { + b'+' => decoded.push(b' '), + b'%' if index + 2 < bytes.len() => { + if let (Some(high), Some(low)) = + (hex_value(bytes[index + 1]), hex_value(bytes[index + 2])) + { + decoded.push(high * 16 + low); + index += 2; + } else { + decoded.push(bytes[index]); + } + } + byte => decoded.push(byte), + } + index += 1; + } + String::from_utf8_lossy(&decoded).to_string() +} + +fn hex_value(byte: u8) -> Option { + match byte { + b'0'..=b'9' => Some(byte - b'0'), + b'a'..=b'f' => Some(byte - b'a' + 10), + b'A'..=b'F' => Some(byte - b'A' + 10), + _ => None, + } +} + +fn write_http_response(stream: &mut TcpStream, response: HttpResponse) -> Result<()> { + write!( + stream, + "HTTP/1.1 {} {}\r\nContent-Type: {}\r\nContent-Length: {}\r\nCache-Control: no-store\r\nConnection: close\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Methods: GET, POST, OPTIONS\r\nAccess-Control-Allow-Headers: Content-Type\r\n\r\n", + response.status, + response.reason, + response.content_type, + response.body.len() + ) + .context("failed to write control panel HTTP response headers")?; + stream + .write_all(&response.body) + .context("failed to write control panel HTTP response body")?; + stream + .flush() + .context("failed to flush control panel HTTP response") +} + +fn empty_response(status: u16, reason: &'static str) -> HttpResponse { + HttpResponse { + status, + reason, + content_type: "text/plain; charset=utf-8", + body: Vec::new(), + } +} + +fn html_response(html: String) -> HttpResponse { + HttpResponse { + status: 200, + reason: "OK", + content_type: "text/html; charset=utf-8", + body: html.into_bytes(), + } +} + +fn json_response(status: u16, reason: &'static str, value: Value) -> HttpResponse { + let body = + serde_json::to_vec_pretty(&value).unwrap_or_else(|_| b"{\"error\":\"json\"}".to_vec()); + HttpResponse { + status, + reason, + content_type: "application/json; charset=utf-8", + body, + } +} + +fn control_panel_html() -> String { + format!( + r##" + + + + +browser-connection + + + +
+ +
+ + + +
+
+ + + +"##, + personal = PERSONAL_BROWSER_NAME + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn query_param_decodes_names() { + assert_eq!( + query_param("/api/select?name=personal+browser", "name").as_deref(), + Some("personal browser") + ); + assert_eq!( + query_param("/api/select?name=work%2Dbrowser", "name").as_deref(), + Some("work-browser") + ); + } +} diff --git a/src/mcp/tests.rs b/src/mcp/tests.rs new file mode 100644 index 0000000..0fa35f1 --- /dev/null +++ b/src/mcp/tests.rs @@ -0,0 +1,409 @@ +use super::*; +use serde_json::{json, Value}; +use std::io::Cursor; + +fn encode_message(value: Value) -> Vec { + let body = serde_json::to_vec(&value).expect("message body serializes"); + let mut framed = format!("Content-Length: {}\r\n\r\n", body.len()).into_bytes(); + framed.extend_from_slice(&body); + framed +} + +fn decode_messages(bytes: &[u8]) -> Vec { + let mut cursor = Cursor::new(bytes); + let mut responses = Vec::new(); + + let mut transport = Some(StdioTransport::Framed); + while let Some(message) = + read_message(&mut cursor, &mut transport).expect("stdout frame parses") + { + responses.push(serde_json::from_str(&message).expect("stdout frame body is JSON")); + } + + responses +} + +fn decode_line_messages(bytes: &[u8]) -> Vec { + let text = String::from_utf8(bytes.to_vec()).expect("stdout lines are utf8"); + text.lines() + .filter(|line| !line.trim().is_empty()) + .map(|line| serde_json::from_str(line).expect("stdout line is JSON")) + .collect() +} + +#[test] +fn env_fallback_prefers_explicit_project() { + assert_eq!( + project_id_from_env_or_default(Some(" dg-x ".to_string())), + "dg-x" + ); +} + +#[test] +fn stdio_initialize_and_list_use_framed_mcp_transport() { + let config = McpServerConfig::new("dg-test", None, None, false); + let mut input = Vec::new(); + input.extend(encode_message(json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": MCP_PROTOCOL_VERSION, + "capabilities": {}, + "clientInfo": { "name": "probe", "version": "0" } + } + }))); + input.extend(encode_message(json!({ + "jsonrpc": "2.0", + "method": "notifications/initialized", + "params": {} + }))); + input.extend(encode_message(json!({ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/list", + "params": {} + }))); + + let input = Cursor::new(input); + let mut output = Vec::new(); + + run_stdio(config, input, &mut output).expect("stdio loop succeeds"); + + let responses = decode_messages(&output); + assert_eq!(responses.len(), 2); + assert_eq!(responses[0]["id"], 1); + assert_eq!(responses[0]["result"]["serverInfo"]["name"], SERVER_NAME); + assert_eq!(responses[1]["id"], 2); + assert!(responses[1]["result"]["tools"] + .as_array() + .expect("tools/list returns an array") + .iter() + .any(|tool| tool["name"] == "browser_navigate")); +} + +#[test] +fn stdio_initialize_and_list_use_line_delimited_transport() { + let config = McpServerConfig::new("dg-test", None, None, false); + let input = Cursor::new( + [ + r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"elicitation":{}},"clientInfo":{"name":"codex-mcp-client","version":"0"}}}"#, + r#"{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}"#, + ] + .join("\n"), + ); + let mut output = Vec::new(); + + run_stdio(config, input, &mut output).expect("stdio loop succeeds"); + + let responses = decode_line_messages(&output); + assert_eq!(responses.len(), 2); + assert_eq!(responses[0]["id"], 1); + assert_eq!(responses[0]["result"]["protocolVersion"], "2025-06-18"); + assert_eq!(responses[1]["id"], 2); + assert!(responses[1]["result"]["tools"] + .as_array() + .expect("tools/list returns an array") + .iter() + .any(|tool| tool["name"] == "browser_navigate")); +} + +#[test] +fn initialize_and_tools_list_do_not_resolve_cdp_endpoint() { + let config = McpServerConfig::new("dg-test", None, None, true); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}"#, + ) + .expect("initialize succeeds"); + handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}"#, + ) + .expect("tools/list succeeds"); + + assert_eq!(runtime.managed_cdp_endpoint, None); + assert_eq!(runtime.active_browser, MANAGED_BROWSER_NAME); +} + +#[test] +fn initialize_negotiates_legacy_protocol_version() { + let config = McpServerConfig::new("dg-test", None, None, false); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}"#, + ) + .expect("initialize succeeds") + .expect("request with id returns a response"); + + assert_eq!(response["result"]["protocolVersion"], "2024-11-05"); + assert_eq!( + response["result"]["capabilities"]["tools"]["listChanged"], + false + ); +} + +#[test] +fn initialize_negotiates_latest_protocol_version() { + let config = McpServerConfig::new("dg-test", None, None, false); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"roots":{"listChanged":true}},"clientInfo":{"name":"claude-code","version":"2.1.160"}}}"#, + ) + .expect("initialize succeeds") + .expect("request with id returns a response"); + + assert_eq!(response["result"]["protocolVersion"], "2025-11-25"); +} + +#[test] +fn initialize_negotiates_previous_protocol_version() { + let config = McpServerConfig::new("dg-test", None, None, false); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{"elicitation":{}},"clientInfo":{"name":"codex-mcp-client","version":"0"}}}"#, + ) + .expect("initialize succeeds") + .expect("request with id returns a response"); + + assert_eq!(response["result"]["protocolVersion"], "2025-06-18"); +} + +#[test] +fn initialize_rejects_unknown_protocol_version() { + let config = McpServerConfig::new("dg-test", None, None, false); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2099-01-01","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}"#, + ) + .expect("initialize response serializes") + .expect("request with id returns a response"); + + assert_eq!(response["error"]["code"], -32602); + assert!(response["error"]["message"] + .as_str() + .expect("error message exists") + .contains("Unsupported MCP protocol version")); +} + +#[test] +fn tools_call_resolves_cdp_endpoint_lazily() { + let config = McpServerConfig::new("dg-test", None, None, false); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + let expected_cdp_url = crate::render_cdp_url(); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"unknown","arguments":{}}}"#, + ) + .expect("tools/call response serializes") + .expect("request with id returns a response"); + + assert_eq!( + runtime.managed_cdp_endpoint.as_deref(), + Some(expected_cdp_url.as_str()) + ); + assert_eq!(response["id"], 3); + assert_eq!(response["result"]["isError"], true); + assert!(response["result"]["content"][0]["text"] + .as_str() + .expect("tool result text exists") + .contains("Unknown browser-connection tool")); +} + +#[test] +fn configured_personal_browser_can_be_active_without_docker() { + let config = McpServerConfig::new("dg-test", None, None, true) + .with_browser_endpoints(vec![NamedBrowserEndpoint::new( + PERSONAL_BROWSER_NAME, + "http://127.0.0.1:9333", + ) + .expect("endpoint is valid")]) + .with_active_browser(Some(PERSONAL_BROWSER_NAME.to_string())) + .expect("active browser name is valid"); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + assert_eq!( + runtime.cdp_endpoint().expect("personal endpoint resolves"), + "http://127.0.0.1:9333" + ); + assert_eq!(runtime.managed_cdp_endpoint, None); +} + +#[test] +fn browser_select_registers_ad_hoc_personal_endpoint_without_resolving_managed_browser() { + let config = McpServerConfig::new("dg-test", None, None, true); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"browser_select","arguments":{"name":"personal","cdp_endpoint":"http://127.0.0.1:9444"}}}"#, + ) + .expect("browser_select response serializes") + .expect("request with id returns a response"); + + assert_eq!(response["id"], 4); + assert_eq!(response["result"]["isError"], false); + assert_eq!(runtime.active_browser, PERSONAL_BROWSER_NAME); + assert_eq!(runtime.managed_cdp_endpoint, None); + assert_eq!( + runtime.cdp_endpoint().expect("personal endpoint resolves"), + "http://127.0.0.1:9444" + ); +} + +#[test] +fn browser_select_registers_personal_display_metadata_without_docker_when_novnc_url_exists() { + let config = McpServerConfig::new("dg-test", None, None, true); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let response = handle_message( + &mut runtime, + r#"{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"browser_select","arguments":{"name":"personal","cdp_endpoint":"http://127.0.0.1:9444","vnc_endpoint":"host.docker.internal:5900","novnc_url":"http://127.0.0.1:6680/vnc.html"}}}"#, + ) + .expect("browser_select response serializes") + .expect("request with id returns a response"); + + assert_eq!(response["result"]["isError"], false); + let text = response["result"]["content"][0]["text"] + .as_str() + .expect("tool result text exists"); + let selection: Value = serde_json::from_str(text).expect("selection text is JSON"); + assert_eq!( + selection["browser"]["vncEndpoint"], + "host.docker.internal:5900" + ); + assert_eq!( + selection["browser"]["novncUrl"], + "http://127.0.0.1:6680/vnc.html" + ); + assert_eq!(runtime.managed_cdp_endpoint, None); +} + +#[test] +fn browser_list_reports_active_personal_browser() { + let config = McpServerConfig::new("dg-test", None, None, false) + .with_browser_endpoints(vec![NamedBrowserEndpoint::new( + PERSONAL_BROWSER_NAME, + "http://127.0.0.1:9222", + ) + .expect("endpoint is valid")]) + .with_active_browser(Some(PERSONAL_BROWSER_NAME.to_string())) + .expect("active browser name is valid"); + let runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let inventory = runtime.browser_inventory().expect("inventory renders"); + + assert_eq!(inventory["active"], PERSONAL_BROWSER_NAME); + assert!(inventory["browsers"] + .as_array() + .expect("browsers array") + .iter() + .any(|browser| { + browser["name"] == PERSONAL_BROWSER_NAME + && browser["kind"] == "personal" + && browser["active"] == true + })); +} + +#[test] +fn browser_list_reports_active_shared_browser_without_cdp() { + let config = McpServerConfig::new("dg-test", None, None, false) + .with_browser_share_url("edge", "https://relay.example/share/s1#agent=a1") + .expect("share URL is valid") + .with_active_browser(Some("edge".to_string())) + .expect("active browser name is valid"); + let runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let inventory = runtime.browser_inventory().expect("inventory renders"); + + assert_eq!(inventory["active"], "edge"); + assert!(inventory["browsers"] + .as_array() + .expect("browsers array") + .iter() + .any(|browser| { + browser["name"] == "edge" + && browser["kind"] == "shared-extension" + && browser["shareUrl"] == "https://relay.example/share/s1#agent=a1" + && browser["active"] == true + })); +} + +#[test] +fn browser_list_reports_control_panel_url_when_enabled() { + let config = McpServerConfig::new("dg-test", None, None, false).with_control_port(Some(6888)); + let runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let inventory = runtime.browser_inventory().expect("inventory renders"); + + assert_eq!(inventory["controlPanelUrl"], "http://127.0.0.1:6888/"); +} + +#[test] +fn browser_list_reports_null_control_panel_url_when_disabled() { + let config = McpServerConfig::new("dg-test", None, None, false); + let runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let inventory = runtime.browser_inventory().expect("inventory renders"); + + assert!(inventory["controlPanelUrl"].is_null()); +} + +#[test] +fn browser_list_reports_personal_vnc_and_deterministic_novnc_url_without_docker() { + let config = McpServerConfig::new("dg-test", None, None, false).with_browser_endpoints(vec![ + NamedBrowserEndpoint::new(PERSONAL_BROWSER_NAME, "http://127.0.0.1:9222") + .expect("endpoint is valid") + .with_vnc_endpoint("host.docker.internal:5900") + .expect("vnc endpoint is valid"), + ]); + let runtime = McpRuntime::new(config).expect("runtime config is valid"); + + let inventory = runtime.browser_inventory().expect("inventory renders"); + + let personal = inventory["browsers"] + .as_array() + .expect("browsers array") + .iter() + .find(|browser| browser["name"] == PERSONAL_BROWSER_NAME) + .expect("personal browser is listed"); + assert_eq!(personal["vncEndpoint"], "host.docker.internal:5900"); + assert_eq!( + personal["novncUrl"], + crate::render_browser_target_novnc_url("dg-test", PERSONAL_BROWSER_NAME) + ); + assert_eq!(runtime.managed_cdp_endpoint, None); +} + +#[test] +fn invalid_active_browser_fails_runtime_creation() { + let config = McpServerConfig::new("dg-test", None, None, false) + .with_active_browser(Some("personal".to_string())) + .expect("active browser name normalizes"); + + let error = McpRuntime::new(config).expect_err("unknown active browser fails"); + + assert!(error.to_string().contains("Unknown browser `personal`")); +} + +#[test] +fn malformed_explicit_cdp_endpoint_fails_runtime_creation() { + let config = McpServerConfig::new("dg-test", None, Some("127.0.0.1:9222".to_string()), false); + + let error = McpRuntime::new(config).expect_err("malformed explicit endpoint fails"); + + assert!(error + .to_string() + .contains("must start with http:// or https://")); +} diff --git a/src/shared_browser.rs b/src/shared_browser.rs new file mode 100644 index 0000000..2c3e95b --- /dev/null +++ b/src/shared_browser.rs @@ -0,0 +1,752 @@ +/*! Bounded WebSocket relay for browser share sessions. + +CHANGE: pair browser-extension clients and agent clients through an outbound-friendly relay. +WHY: remote browsers need simple share links without exposing CDP/VNC ports. +PURITY: SHELL +EFFECT: listens for WebSocket clients and forwards bounded JSON messages by request id. +INVARIANT: browser clients register sessions; agent clients must present the matching agent token. +*/ + +use anyhow::{anyhow, Context, Result}; +use serde_json::{json, Value}; +use std::collections::HashMap; +use std::io::ErrorKind; +use std::net::{TcpListener, TcpStream}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{mpsc, Arc, Mutex}; +use std::thread; +use std::time::Duration; +use tungstenite::handshake::server::{Callback, ErrorResponse, Request, Response}; +use tungstenite::protocol::WebSocketConfig; +use tungstenite::{accept_hdr_with_config, connect, Error as WsError, Message, WebSocket}; + +pub const DEFAULT_RELAY_BIND: &str = "127.0.0.1:8765"; +pub const MAX_SESSION_ID_BYTES: usize = 128; +pub const MAX_TOKEN_BYTES: usize = 512; +pub const MAX_JSON_MESSAGE_BYTES: usize = 256 * 1024; +pub const MAX_SESSIONS: usize = 1024; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RelayConfig { + pub bind: String, +} + +impl RelayConfig { + pub fn new(bind: impl Into) -> Self { + Self { bind: bind.into() } + } +} + +impl Default for RelayConfig { + fn default() -> Self { + Self::new(DEFAULT_RELAY_BIND) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ShareAgentUrl { + pub session: String, + pub agent_token: String, + pub websocket_url: String, +} + +pub fn parse_share_agent_url(input: &str) -> Result { + let input = input.trim(); + let (scheme, rest) = input + .split_once("://") + .ok_or_else(|| anyhow!("share URL must include http:// or https:// scheme"))?; + let websocket_scheme = match scheme { + "http" | "ws" => "ws", + "https" | "wss" => "wss", + _ => return Err(anyhow!("share URL scheme must be http, https, ws, or wss")), + }; + if (input.starts_with("ws://") || input.starts_with("wss://")) && input.contains("/ws/agent/") { + let endpoint = + RelayEndpoint::parse(rest.split_once('/').map(|(_, path)| path).unwrap_or(rest))?; + if let RelayEndpoint::Agent { + session, + agent_token, + } = endpoint + { + return Ok(ShareAgentUrl { + session, + agent_token, + websocket_url: input.to_string(), + }); + } + } + + let (without_fragment, fragment) = input + .split_once('#') + .ok_or_else(|| anyhow!("share URL must include #agent= fragment"))?; + let agent_token = query_param(fragment, "agent") + .ok_or_else(|| anyhow!("share URL fragment must include agent token"))?; + let rest = without_fragment + .split_once("://") + .map(|(_, rest)| rest) + .unwrap_or(rest); + let (authority, path_and_query) = rest + .split_once('/') + .ok_or_else(|| anyhow!("share URL must include /share/ path"))?; + if authority.trim().is_empty() { + return Err(anyhow!("share URL host is required")); + } + let (path, query) = path_and_query + .split_once('?') + .unwrap_or((path_and_query, "")); + let session = parse_share_path(path)?; + let agent_token = query_param(fragment, "agent") + .or_else(|| query_param(query, "agent")) + .unwrap_or(agent_token); + let agent_token = validate_token("agent token", &agent_token)?; + let websocket_url = + format!("{websocket_scheme}://{authority}/ws/agent/{session}?token={agent_token}"); + + Ok(ShareAgentUrl { + session, + agent_token, + websocket_url, + }) +} + +pub fn agent_ws_url_from_share_url(input: &str) -> Result { + Ok(parse_share_agent_url(input)?.websocket_url) +} + +pub fn agent_websocket_url_from_share_url(input: &str) -> Result { + agent_ws_url_from_share_url(input) +} + +pub fn run_relay(config: RelayConfig) -> Result<()> { + let listener = TcpListener::bind(&config.bind) + .with_context(|| format!("failed to bind browser share relay on {}", config.bind))?; + serve_listener(listener) +} + +pub fn serve_listener(listener: TcpListener) -> Result<()> { + let state: SharedRelayState = Arc::new(RelayState::default()); + for stream in listener.incoming() { + match stream { + Ok(stream) => { + let state = Arc::clone(&state); + thread::Builder::new() + .name("browser-share-relay-client".to_string()) + .spawn(move || { + let _ = handle_client(state, stream); + }) + .context("failed to spawn relay client thread")?; + } + Err(error) => return Err(error).context("failed to accept relay TCP connection"), + } + } + Ok(()) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SharedBrowserClient { + share_url: String, +} + +impl SharedBrowserClient { + pub fn new(share_url: impl Into) -> Self { + Self { + share_url: share_url.into(), + } + } + + pub fn navigate(&self, url: &str) -> Result { + self.call_text("navigate", json!({ "url": url })) + } + + pub fn snapshot(&self) -> Result { + self.call_text("snapshot", json!({})) + } + + pub fn evaluate(&self, expression: &str) -> Result { + self.call_text("evaluate", json!({ "expression": expression })) + } + + pub fn click(&self, selector: &str) -> Result { + self.call_text("click", json!({ "selector": selector })) + } + + pub fn type_text(&self, selector: &str, text: &str) -> Result { + self.call_text("type", json!({ "selector": selector, "text": text })) + } + + pub fn press_key(&self, key: &str) -> Result { + self.call_text("press_key", json!({ "key": key })) + } + + pub fn screenshot(&self, full_page: bool) -> Result { + self.call_text("screenshot", json!({ "fullPage": full_page })) + } + + fn call_text(&self, command: &str, params: Value) -> Result { + let result = self.call(command, params)?; + if let Some(text) = result.as_str() { + return Ok(text.to_string()); + } + serde_json::to_string_pretty(&result).context("failed to render shared browser response") + } + + fn call(&self, command: &str, params: Value) -> Result { + let websocket_url = agent_ws_url_from_share_url(&self.share_url)?; + let (mut socket, _) = connect(&websocket_url).with_context(|| { + format!("failed to connect to shared browser relay {websocket_url}") + })?; + let request = json!({ "id": 1, "command": command, "params": params }); + socket + .send(Message::Text(request.to_string())) + .with_context(|| format!("failed to send shared browser command {command}"))?; + + loop { + match socket + .read() + .with_context(|| format!("failed to read shared browser response for {command}"))? + { + Message::Text(text) => { + let value: Value = serde_json::from_str(&text).with_context(|| { + format!("shared browser response for {command} was not JSON") + })?; + if value.get("id").and_then(Value::as_i64) != Some(1) { + continue; + } + if value.get("ok").and_then(Value::as_bool) == Some(false) { + let error = value + .get("error") + .and_then(Value::as_str) + .unwrap_or("shared browser command failed"); + return Err(anyhow!("{error}")); + } + return Ok(value.get("result").cloned().unwrap_or(Value::Null)); + } + Message::Ping(payload) => { + socket + .send(Message::Pong(payload)) + .context("failed to answer shared browser relay ping")?; + } + Message::Close(_) => { + return Err(anyhow!( + "shared browser relay closed before {command} response" + )) + } + _ => {} + } + } + } +} + +type SharedRelayState = Arc; + +#[derive(Debug, Default)] +struct RelayState { + sessions: Mutex>, + next_connection_id: AtomicU64, +} + +#[derive(Debug)] +struct RelaySession { + browser_token: String, + agent_token: String, + browser: Option, + agent: Option, +} + +#[derive(Debug, Clone)] +struct PeerHandle { + connection_id: u64, + tx: mpsc::Sender, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum PeerRole { + Browser, + Agent, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +enum RelayEndpoint { + Browser { + session: String, + browser_token: String, + agent_token: String, + }, + Agent { + session: String, + agent_token: String, + }, +} + +impl RelayState { + fn register( + &self, + endpoint: &RelayEndpoint, + tx: mpsc::Sender, + ) -> Result<(String, PeerRole, u64)> { + let connection_id = self.next_connection_id.fetch_add(1, Ordering::Relaxed) + 1; + let mut sessions = self + .sessions + .lock() + .map_err(|_| anyhow!("relay session lock was poisoned"))?; + match endpoint { + RelayEndpoint::Browser { + session, + browser_token, + agent_token, + } => { + if !sessions.contains_key(session) && sessions.len() >= MAX_SESSIONS { + return Err(anyhow!("relay session limit reached")); + } + let session_entry = + sessions + .entry(session.clone()) + .or_insert_with(|| RelaySession { + browser_token: browser_token.clone(), + agent_token: agent_token.clone(), + browser: None, + agent: None, + }); + if session_entry.browser_token != *browser_token { + return Err(anyhow!("browser token did not match session")); + } + if session_entry.agent_token != *agent_token { + return Err(anyhow!("agent token did not match session")); + } + session_entry.browser = Some(PeerHandle { connection_id, tx }); + Ok((session.clone(), PeerRole::Browser, connection_id)) + } + RelayEndpoint::Agent { + session, + agent_token, + } => { + let session_entry = sessions + .get_mut(session) + .ok_or_else(|| anyhow!("relay session is not registered"))?; + if session_entry.agent_token != *agent_token { + return Err(anyhow!("agent token did not match session")); + } + session_entry.agent = Some(PeerHandle { connection_id, tx }); + Ok((session.clone(), PeerRole::Agent, connection_id)) + } + } + } + + fn unregister(&self, session: &str, role: PeerRole, connection_id: u64) { + let Ok(mut sessions) = self.sessions.lock() else { + return; + }; + let Some(session_entry) = sessions.get_mut(session) else { + return; + }; + match role { + PeerRole::Browser => { + if session_entry + .browser + .as_ref() + .is_some_and(|peer| peer.connection_id == connection_id) + { + sessions.remove(session); + } + } + PeerRole::Agent => { + if session_entry + .agent + .as_ref() + .is_some_and(|peer| peer.connection_id == connection_id) + { + session_entry.agent = None; + } + } + } + } + + fn route_message( + &self, + session: &str, + from: PeerRole, + connection_id: u64, + raw_message: &str, + ) -> Result<()> { + let message = validate_relay_json_message(raw_message)?; + let sessions = self + .sessions + .lock() + .map_err(|_| anyhow!("relay session lock was poisoned"))?; + let session_entry = sessions + .get(session) + .ok_or_else(|| anyhow!("relay session is not registered"))?; + let sender = match from { + PeerRole::Browser => session_entry.browser.as_ref(), + PeerRole::Agent => session_entry.agent.as_ref(), + } + .ok_or_else(|| anyhow!("relay sender is not connected"))?; + if sender.connection_id != connection_id { + return Err(anyhow!("relay sender connection is stale")); + } + let target = match from { + PeerRole::Browser => session_entry.agent.as_ref(), + PeerRole::Agent => session_entry.browser.as_ref(), + } + .ok_or_else(|| anyhow!("relay peer is not connected"))?; + target + .tx + .send(message) + .context("failed to forward relay message") + } +} + +impl RelayEndpoint { + fn parse(target: &str) -> Result { + let (path, query) = target.split_once('?').unwrap_or((target, "")); + let segments = path + .trim_matches('/') + .split('/') + .filter(|segment| !segment.is_empty()) + .collect::>(); + match segments.as_slice() { + ["ws", "browser", session] => Ok(Self::Browser { + session: validate_session_id(session)?, + browser_token: validate_token( + "browser token", + &query_param(query, "token") + .ok_or_else(|| anyhow!("browser token is required"))?, + )?, + agent_token: validate_token( + "agent token", + &query_param(query, "agent_token") + .ok_or_else(|| anyhow!("agent token is required"))?, + )?, + }), + ["ws", "agent", session] => Ok(Self::Agent { + session: validate_session_id(session)?, + agent_token: validate_token( + "agent token", + &query_param(query, "token") + .ok_or_else(|| anyhow!("agent token is required"))?, + )?, + }), + _ => Err(anyhow!( + "relay endpoint must be /ws/browser/ or /ws/agent/" + )), + } + } + + fn role(&self) -> PeerRole { + match self { + Self::Browser { .. } => PeerRole::Browser, + Self::Agent { .. } => PeerRole::Agent, + } + } + + fn session(&self) -> &str { + match self { + Self::Browser { session, .. } | Self::Agent { session, .. } => session, + } + } +} + +fn handle_client(state: SharedRelayState, stream: TcpStream) -> Result<()> { + stream + .set_read_timeout(Some(Duration::from_millis(100))) + .ok(); + stream.set_write_timeout(Some(Duration::from_secs(5))).ok(); + let target = Arc::new(Mutex::new(String::new())); + let callback = TargetCapture { + target: Arc::clone(&target), + }; + let mut websocket = accept_hdr_with_config(stream, callback, Some(websocket_config())) + .context("failed to accept relay websocket")?; + let target = target + .lock() + .map_err(|_| anyhow!("relay request target lock was poisoned"))? + .clone(); + let endpoint = RelayEndpoint::parse(&target)?; + let (tx, rx) = mpsc::channel(); + let (session, role, connection_id) = state.register(&endpoint, tx)?; + let result = relay_client_loop( + &state, + endpoint.session(), + endpoint.role(), + connection_id, + &mut websocket, + rx, + ); + state.unregister(&session, role, connection_id); + result +} + +struct TargetCapture { + target: Arc>, +} + +impl Callback for TargetCapture { + #[allow(clippy::result_large_err)] + fn on_request( + self, + request: &Request, + response: Response, + ) -> std::result::Result { + if let Ok(mut target) = self.target.lock() { + *target = request.uri().to_string(); + } + Ok(response) + } +} + +fn relay_client_loop( + state: &SharedRelayState, + session: &str, + role: PeerRole, + connection_id: u64, + websocket: &mut WebSocket, + rx: mpsc::Receiver, +) -> Result<()> { + loop { + drain_outbound(websocket, &rx)?; + match websocket.read() { + Ok(message) => { + if message.is_close() { + return Ok(()); + } + if message.is_ping() || message.is_pong() { + continue; + } + let text = message + .to_text() + .context("relay message was not valid utf8")?; + state.route_message(session, role, connection_id, text)?; + } + Err(WsError::Io(error)) + if matches!(error.kind(), ErrorKind::WouldBlock | ErrorKind::TimedOut) => {} + Err(WsError::ConnectionClosed | WsError::AlreadyClosed) => return Ok(()), + Err(error) => return Err(error).context("relay websocket read failed"), + } + } +} + +fn drain_outbound(websocket: &mut WebSocket, rx: &mpsc::Receiver) -> Result<()> { + loop { + match rx.try_recv() { + Ok(message) => websocket + .send(Message::Text(message)) + .context("failed to send relay websocket message")?, + Err(mpsc::TryRecvError::Empty) => return Ok(()), + Err(mpsc::TryRecvError::Disconnected) => return Ok(()), + } + } +} + +fn websocket_config() -> WebSocketConfig { + WebSocketConfig { + max_message_size: Some(MAX_JSON_MESSAGE_BYTES), + max_frame_size: Some(MAX_JSON_MESSAGE_BYTES), + max_write_buffer_size: MAX_JSON_MESSAGE_BYTES * 2, + ..WebSocketConfig::default() + } +} + +fn parse_share_path(path: &str) -> Result { + let segments = path + .trim_matches('/') + .split('/') + .filter(|segment| !segment.is_empty()) + .collect::>(); + match segments.as_slice() { + ["share", session] => validate_session_id(session), + _ => Err(anyhow!("share URL path must be /share/")), + } +} + +fn validate_relay_json_message(raw_message: &str) -> Result { + if raw_message.len() > MAX_JSON_MESSAGE_BYTES { + return Err(anyhow!("relay JSON message exceeded size limit")); + } + let value: Value = serde_json::from_str(raw_message).context("relay message was not JSON")?; + let id = value + .get("id") + .ok_or_else(|| anyhow!("relay JSON message must include request id"))?; + if id.is_null() || id.is_array() || id.is_object() { + return Err(anyhow!( + "relay JSON message id must be a string, number, or boolean" + )); + } + serde_json::to_string(&value).context("failed to encode relay JSON message") +} + +fn validate_session_id(value: &str) -> Result { + let value = decode_url_component(value).trim().to_string(); + if value.is_empty() { + return Err(anyhow!("session id is required")); + } + if value.len() > MAX_SESSION_ID_BYTES { + return Err(anyhow!("session id is too long")); + } + if !value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_' | b'.')) + { + return Err(anyhow!("session id contains unsupported characters")); + } + Ok(value) +} + +fn validate_token(name: &str, value: &str) -> Result { + let value = value.trim(); + if value.is_empty() { + return Err(anyhow!("{name} is required")); + } + if value.len() > MAX_TOKEN_BYTES { + return Err(anyhow!("{name} is too long")); + } + if value + .chars() + .any(|ch| ch.is_control() || ch.is_whitespace()) + { + return Err(anyhow!( + "{name} contains unsupported whitespace/control characters" + )); + } + Ok(value.to_string()) +} + +fn query_param(query: &str, name: &str) -> Option { + query.split('&').find_map(|part| { + let (key, value) = part.split_once('=')?; + (decode_url_component(key) == name).then(|| decode_url_component(value)) + }) +} + +fn decode_url_component(value: &str) -> String { + let mut decoded = Vec::with_capacity(value.len()); + let bytes = value.as_bytes(); + let mut index = 0; + while index < bytes.len() { + match bytes[index] { + b'+' => decoded.push(b' '), + b'%' if index + 2 < bytes.len() => { + if let (Some(high), Some(low)) = + (hex_value(bytes[index + 1]), hex_value(bytes[index + 2])) + { + decoded.push(high * 16 + low); + index += 2; + } else { + decoded.push(bytes[index]); + } + } + byte => decoded.push(byte), + } + index += 1; + } + String::from_utf8_lossy(&decoded).to_string() +} + +fn hex_value(byte: u8) -> Option { + match byte { + b'0'..=b'9' => Some(byte - b'0'), + b'a'..=b'f' => Some(byte - b'a' + 10), + b'A'..=b'F' => Some(byte - b'A' + 10), + _ => None, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::net::TcpListener; + + #[test] + fn parses_share_url_into_agent_websocket_url() { + let parsed = + parse_share_agent_url("http://relay.local/share/edge-1#agent=agent-token").unwrap(); + + assert_eq!(parsed.session, "edge-1"); + assert_eq!(parsed.agent_token, "agent-token"); + assert_eq!( + parsed.websocket_url, + "ws://relay.local/ws/agent/edge-1?token=agent-token" + ); + } + + #[test] + fn parses_https_share_url_into_wss_url() { + let ws_url = + agent_ws_url_from_share_url("https://relay.example.com/share/s_1#agent=a%2Db").unwrap(); + + assert_eq!(ws_url, "wss://relay.example.com/ws/agent/s_1?token=a-b"); + } + + #[test] + fn preserves_direct_agent_websocket_url() { + let url = agent_websocket_url_from_share_url("ws://127.0.0.1:8787/ws/agent/abc?token=tok") + .unwrap(); + + assert_eq!(url, "ws://127.0.0.1:8787/ws/agent/abc?token=tok"); + } + + #[test] + fn rejects_share_url_without_agent_fragment() { + let error = parse_share_agent_url("http://relay.local/share/edge-1").unwrap_err(); + + assert!(error.to_string().contains("#agent")); + } + + #[test] + fn parses_browser_and_agent_ws_endpoints() { + let browser = + RelayEndpoint::parse("/ws/browser/edge-1?token=browser-token&agent_token=agent-token") + .unwrap(); + let agent = RelayEndpoint::parse("/ws/agent/edge-1?token=agent-token").unwrap(); + + assert_eq!( + browser, + RelayEndpoint::Browser { + session: "edge-1".to_string(), + browser_token: "browser-token".to_string(), + agent_token: "agent-token".to_string() + } + ); + assert_eq!( + agent, + RelayEndpoint::Agent { + session: "edge-1".to_string(), + agent_token: "agent-token".to_string() + } + ); + } + + #[test] + fn rejects_messages_without_request_id() { + let error = validate_relay_json_message(r#"{"method":"ping"}"#).unwrap_err(); + + assert!(error.to_string().contains("request id")); + } + + #[test] + fn forwards_json_messages_between_browser_and_agent() { + let listener = TcpListener::bind(("127.0.0.1", 0)).unwrap(); + let port = listener.local_addr().unwrap().port(); + thread::spawn(move || { + let _ = serve_listener(listener); + }); + + let browser_url = format!( + "ws://127.0.0.1:{port}/ws/browser/session-1?token=browser-token&agent_token=agent-token" + ); + let agent_url = format!("ws://127.0.0.1:{port}/ws/agent/session-1?token=agent-token"); + let (mut browser, _) = connect(browser_url).unwrap(); + let (mut agent, _) = connect(agent_url).unwrap(); + + agent + .send(Message::Text(r#"{"id":"1","method":"ping"}"#.to_string())) + .unwrap(); + let forwarded_to_browser = browser.read().unwrap().to_text().unwrap().to_string(); + assert_eq!(forwarded_to_browser, r#"{"id":"1","method":"ping"}"#); + + browser + .send(Message::Text(r#"{"id":"1","result":"pong"}"#.to_string())) + .unwrap(); + let forwarded_to_agent = agent.read().unwrap().to_text().unwrap().to_string(); + assert_eq!(forwarded_to_agent, r#"{"id":"1","result":"pong"}"#); + } +} diff --git a/tests/mcp_stdio.rs b/tests/mcp_stdio.rs index 6f4e84b..6c32494 100644 --- a/tests/mcp_stdio.rs +++ b/tests/mcp_stdio.rs @@ -1,5 +1,8 @@ -use std::io::Write; +use std::io::{Read, Write}; +use std::net::{TcpListener, TcpStream}; use std::process::{Command, Stdio}; +use std::thread; +use std::time::Duration; use serde_json::Value; @@ -49,6 +52,37 @@ fn decode_line_messages(stdout: &[u8]) -> Vec { .collect() } +fn unused_local_port() -> u16 { + let listener = TcpListener::bind(("127.0.0.1", 0)).expect("bind an unused local port"); + listener + .local_addr() + .expect("read local listener address") + .port() +} + +fn http_request(port: u16, request: &str) -> String { + let mut last_error = None; + for _ in 0..50 { + match TcpStream::connect(("127.0.0.1", port)) { + Ok(mut stream) => { + stream + .write_all(request.as_bytes()) + .expect("write HTTP request"); + let mut response = String::new(); + stream + .read_to_string(&mut response) + .expect("read HTTP response"); + return response; + } + Err(error) => { + last_error = Some(error); + thread::sleep(Duration::from_millis(20)); + } + } + } + panic!("control panel did not accept connections: {last_error:?}"); +} + #[test] fn browser_connection_help_exposes_custom_mcp_command_without_npx() { let output = Command::new(env!("CARGO_BIN_EXE_browser-connection")) @@ -61,8 +95,15 @@ fn browser_connection_help_exposes_custom_mcp_command_without_npx() { assert!(stdout.contains("browser-connection")); assert!(stdout.contains("--project")); assert!(stdout.contains("--browser")); + assert!(stdout.contains("--browser-vnc")); + assert!(stdout.contains("--browser-novnc")); + assert!(stdout.contains("--browser-share")); assert!(stdout.contains("--personal-browser")); + assert!(stdout.contains("--personal-vnc")); + assert!(stdout.contains("--personal-novnc")); assert!(stdout.contains("--active-browser")); + assert!(stdout.contains("--control-port")); + assert!(stdout.contains("--no-control-panel")); assert!(stdout.contains("--no-start-browser")); assert!(!stdout.contains("playwright/mcp")); assert!(!stdout.contains("npx")); @@ -71,7 +112,12 @@ fn browser_connection_help_exposes_custom_mcp_command_without_npx() { #[test] fn browser_connection_stdio_initializes_and_lists_browser_tools_without_docker() { let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) - .args(["--project", "dg-test", "--no-start-browser"]) + .args([ + "--project", + "dg-test", + "--no-start-browser", + "--no-control-panel", + ]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) @@ -154,7 +200,12 @@ fn browser_connection_stdio_initializes_and_lists_browser_tools_without_docker() #[test] fn browser_connection_stdio_selects_personal_browser_without_docker() { let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) - .args(["--project", "dg-test", "--no-start-browser"]) + .args([ + "--project", + "dg-test", + "--no-start-browser", + "--no-control-panel", + ]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) @@ -182,7 +233,9 @@ fn browser_connection_stdio_selects_personal_browser_without_docker() { "name": "browser_select", "arguments": { "name": "personal", - "cdp_endpoint": "http://127.0.0.1:9444/json/version" + "cdp_endpoint": "http://127.0.0.1:9444/json/version", + "vnc_endpoint": "host.docker.internal:5900", + "novnc_url": "http://127.0.0.1:6680/vnc.html" } } }))); @@ -226,14 +279,105 @@ fn browser_connection_stdio_selects_personal_browser_without_docker() { .any(|browser| { browser["name"] == "personal" && browser["cdpEndpoint"] == "http://127.0.0.1:9444" + && browser["vncEndpoint"] == "host.docker.internal:5900" + && browser["novncUrl"] == "http://127.0.0.1:6680/vnc.html" && browser["active"] == true })); } +#[test] +fn control_panel_selection_updates_mcp_browser_list_without_restart() { + let port = unused_local_port(); + let port_arg = port.to_string(); + let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) + .args([ + "--project", + "dg-test-control-panel", + "--no-start-browser", + "--control-port", + &port_arg, + "--browser", + "personal=http://127.0.0.1:9444", + "--browser-novnc", + "personal=http://127.0.0.1:6680/vnc.html", + ]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("Failed to spawn browser-connection MCP server"); + + { + let stdin = child.stdin.as_mut().expect("stdin is piped"); + stdin + .write_all(&encode_message(serde_json::json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { "name": "probe", "version": "0" } + } + }))) + .expect("write MCP initialize request"); + + let response = http_request( + port, + "POST /api/select?name=personal HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", + ); + assert!(response.contains("200 OK"), "{response}"); + assert!( + response.contains("\"selected\": \"personal\""), + "{response}" + ); + + stdin + .write_all(&encode_message(serde_json::json!({ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/call", + "params": { + "name": "browser_list", + "arguments": {} + } + }))) + .expect("write MCP browser_list request"); + } + drop(child.stdin.take()); + + let output = child + .wait_with_output() + .expect("browser-connection process exits after stdin EOF"); + assert!( + output.status.success(), + "stderr: {}", + String::from_utf8_lossy(&output.stderr) + ); + + let responses = decode_messages(&output.stdout); + assert_eq!(responses.len(), 2); + let inventory_text = responses[1]["result"]["content"][0]["text"] + .as_str() + .expect("browser_list returns text content"); + let inventory: Value = serde_json::from_str(inventory_text).expect("browser_list text is JSON"); + + assert_eq!(inventory["active"], "personal"); + assert_eq!( + inventory["controlPanelUrl"], + format!("http://127.0.0.1:{port}/") + ); +} + #[test] fn browser_connection_stdio_accepts_claude_framed_initialize() { let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) - .args(["--project", "dg-test", "--no-start-browser"]) + .args([ + "--project", + "dg-test", + "--no-start-browser", + "--no-control-panel", + ]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) @@ -287,7 +431,12 @@ fn browser_connection_stdio_accepts_claude_framed_initialize() { #[test] fn browser_connection_stdio_accepts_codex_line_delimited_initialize() { let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) - .args(["--project", "dg-test", "--no-start-browser"]) + .args([ + "--project", + "dg-test", + "--no-start-browser", + "--no-control-panel", + ]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) diff --git a/tests/shared_browser_relay.rs b/tests/shared_browser_relay.rs new file mode 100644 index 0000000..199952e --- /dev/null +++ b/tests/shared_browser_relay.rs @@ -0,0 +1,181 @@ +use std::io::Write; +use std::net::TcpListener; +use std::process::{Child, Command, Stdio}; +use std::sync::mpsc; +use std::thread; +use std::time::Duration; + +use serde_json::{json, Value}; +use tungstenite::{connect, stream::MaybeTlsStream, Message, WebSocket}; + +fn unused_local_port() -> u16 { + let listener = TcpListener::bind(("127.0.0.1", 0)).expect("bind an unused local port"); + listener + .local_addr() + .expect("read local listener address") + .port() +} + +fn encode_message(value: Value) -> Vec { + let body = serde_json::to_vec(&value).expect("message body serializes"); + let mut framed = format!("Content-Length: {}\r\n\r\n", body.len()).into_bytes(); + framed.extend_from_slice(&body); + framed +} + +fn decode_messages(mut stdout: &[u8]) -> Vec { + let mut responses = Vec::new(); + + while !stdout.is_empty() { + let split = stdout + .windows(4) + .position(|window| window == b"\r\n\r\n") + .expect("frame separator present"); + let (header, rest) = stdout.split_at(split); + let body_start = &rest[4..]; + let header_text = String::from_utf8(header.to_vec()).expect("header is utf8"); + let content_length = header_text + .lines() + .find_map(|line| { + line.split_once(':').and_then(|(name, value)| { + name.eq_ignore_ascii_case("Content-Length") + .then(|| value.trim().parse::().ok()) + .flatten() + }) + }) + .expect("Content-Length header present"); + let (body, remaining) = body_start.split_at(content_length); + responses.push(serde_json::from_slice(body).expect("frame body is JSON")); + stdout = remaining; + } + + responses +} + +fn retry_browser_connect(url: &str) -> WebSocket> { + let mut last_error = None; + for _ in 0..100 { + match connect(url) { + Ok((socket, _)) => return socket, + Err(error) => { + last_error = Some(error); + thread::sleep(Duration::from_millis(20)); + } + } + } + panic!("browser websocket did not connect: {last_error:?}"); +} + +fn stop_child(mut child: Child) { + let _ = child.kill(); + let _ = child.wait(); +} + +#[test] +fn mcp_navigates_shared_browser_through_relay_link() { + let relay_port = unused_local_port(); + let relay_bind = format!("127.0.0.1:{relay_port}"); + let relay = Command::new(env!("CARGO_BIN_EXE_browser-connection-relay")) + .args(["--bind", &relay_bind]) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::piped()) + .spawn() + .expect("spawn browser-connection-relay"); + + let session = "session-test"; + let agent_token = "agent-token"; + let browser_url = format!( + "ws://127.0.0.1:{relay_port}/ws/browser/{session}?token=browser-token&agent_token={agent_token}" + ); + let (ready_tx, ready_rx) = mpsc::channel(); + let browser_thread = thread::spawn(move || { + let mut socket = retry_browser_connect(&browser_url); + ready_tx.send(()).expect("signal browser websocket ready"); + loop { + let message = socket.read().expect("read relayed browser command"); + if let Message::Text(text) = message { + let request: Value = serde_json::from_str(&text).expect("request is JSON"); + assert_eq!(request["command"], "navigate"); + assert_eq!(request["params"]["url"], "https://example.com/"); + socket + .send(Message::Text( + json!({ + "id": request["id"].clone(), + "ok": true, + "result": "Navigated remote Edge" + }) + .to_string(), + )) + .expect("send relayed browser response"); + break; + } + } + }); + ready_rx + .recv_timeout(Duration::from_secs(5)) + .expect("browser websocket connects to relay"); + + let share_url = format!("http://127.0.0.1:{relay_port}/share/{session}#agent={agent_token}"); + let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) + .args([ + "--project", + "dg-shared-browser-test", + "--no-start-browser", + "--no-control-panel", + "--browser-share", + &format!("edge={share_url}"), + "--active-browser", + "edge", + ]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("spawn browser-connection MCP server"); + + { + let stdin = child.stdin.as_mut().expect("stdin is piped"); + let mut input = Vec::new(); + input.extend(encode_message(json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { "name": "probe", "version": "0" } + } + }))); + input.extend(encode_message(json!({ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/call", + "params": { + "name": "browser_navigate", + "arguments": { "url": "https://example.com/" } + } + }))); + stdin.write_all(&input).expect("write MCP requests"); + } + drop(child.stdin.take()); + + let output = child + .wait_with_output() + .expect("browser-connection process exits after stdin EOF"); + stop_child(relay); + browser_thread.join().expect("browser thread exits"); + + assert!( + output.status.success(), + "stderr: {}", + String::from_utf8_lossy(&output.stderr) + ); + let responses = decode_messages(&output.stdout); + assert_eq!(responses.len(), 2); + assert_eq!(responses[1]["result"]["isError"], false); + assert_eq!( + responses[1]["result"]["content"][0]["text"], + "Navigated remote Edge" + ); +} From 3b4f970a16d4422585cd51af9ec2d2db3e5e7c27 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Wed, 24 Jun 2026 13:16:26 +0000 Subject: [PATCH 05/29] Add zip artifact for Edge share extension --- artifacts/README.md | 3 ++- artifacts/edge-share-extension.zip | Bin 0 -> 10910 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 artifacts/edge-share-extension.zip diff --git a/artifacts/README.md b/artifacts/README.md index 0c1382e..a02cc42 100644 --- a/artifacts/README.md +++ b/artifacts/README.md @@ -2,7 +2,8 @@ ## Edge share extension -Download `edge-share-extension.tar.gz`, extract it, then open Edge: +Download `edge-share-extension.zip` or `edge-share-extension.tar.gz`, extract it, +then open Edge: ```text edge://extensions diff --git a/artifacts/edge-share-extension.zip b/artifacts/edge-share-extension.zip new file mode 100644 index 0000000000000000000000000000000000000000..1614c3748062931732214965f9259218668040cf GIT binary patch literal 10910 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 Date: Thu, 25 Jun 2026 07:00:28 +0000 Subject: [PATCH 06/29] Connect Edge from control panel --- README.md | 13 ++ artifacts/README.md | 5 +- artifacts/edge-share-extension.tar.gz | Bin 9833 -> 14097 bytes artifacts/edge-share-extension.zip | Bin 10910 -> 16841 bytes extension/edge-share/README.md | 17 ++ extension/edge-share/connect.html | 149 +++++++++++++++ extension/edge-share/connect.js | 95 +++++++++ extension/edge-share/content_script.js | 66 +++++++ extension/edge-share/manifest.json | 21 ++ extension/edge-share/popup.js | 11 ++ extension/edge-share/provider.js | 73 +++++++ extension/edge-share/service_worker.js | 223 ++++++++++++++++++++- src/mcp/control_panel.rs | 255 +++++++++++++++++++++++-- src/shared_browser.rs | 59 +++++- tests/mcp_stdio.rs | 114 ++++++++++- 15 files changed, 1064 insertions(+), 37 deletions(-) create mode 100644 extension/edge-share/connect.html create mode 100644 extension/edge-share/connect.js create mode 100644 extension/edge-share/content_script.js create mode 100644 extension/edge-share/provider.js diff --git a/README.md b/README.md index 168857c..d82ec98 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,19 @@ the user clicks `Stop` in the extension or the relay session is removed. Extensi common browser tools such as navigate, snapshot, evaluate, click, type, key press, and screenshot, but it is not full CDP/VNC parity and protected Edge pages may reject actions. +### Connect Edge from the noVNC control panel + +The control panel can also act as the connection page. Install the Edge share extension, then open +the `controlPanelUrl` in that Edge. The page detects `window.browserConnection`, opens the +extension approval window, and registers the returned `shareUrl` into the current +`browser-connection` runtime through `/api/share`. + +This mode uses the control panel origin as the relay URL, so a separate +`browser-connection-relay` process is not required for the current workspace. If Edge runs on +another machine, expose the control panel only through an authenticated platform proxy or private +tunnel that forwards HTTP and WebSocket upgrade to the same origin; the panel token is CSRF +protection for the UI, not public authentication. + ## Personal browser You can attach an already running desktop Chrome/Chromium browser if it exposes a CDP port. diff --git a/artifacts/README.md b/artifacts/README.md index a02cc42..72a3b84 100644 --- a/artifacts/README.md +++ b/artifacts/README.md @@ -12,5 +12,6 @@ edge://extensions Enable `Developer mode`, choose `Load unpacked`, and select the extracted `edge-share` folder. -The extension connects to `browser-connection-relay` and produces share links -that can be pasted into the `browser-connection` control panel. +Open the `browser-connection` control panel in Edge to approve an automatic +connection into the current browser pool. The popup/manual mode is still +available for hosted `browser-connection-relay` share links. diff --git a/artifacts/edge-share-extension.tar.gz b/artifacts/edge-share-extension.tar.gz index 1f3409a8cea50103637a9c3782720b39199ed809..6c06da85dc68bfabdb08d4d38faf9bc2f44a131f 100644 GIT binary patch literal 14097 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 PUZ4L996=w&0Pp|+G2IAj literal 9833 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 diff --git a/artifacts/edge-share-extension.zip b/artifacts/edge-share-extension.zip index 1614c3748062931732214965f9259218668040cf..51b5b718dcf5df529db9d3d8f7e1d90b575e1965 100644 GIT binary patch delta 15570 zcmaKz19T`d5gNovp2jku$BO z(|_Xt+?Hm4=Ow9b%dOKR`dsN5y!#?S6Y92v%LF_CLofPMjiLoN31+_)0X%oS*a9=q0hR!zV{Ne3Vjwux_ zRTE_(W!j-6+EDidpyX@Ct{lvet_l=_M>zOOWU*6vLJON<%VOdY46PXma1!M@R-sF5 z8qm{?p|^?&^T3R@k zOaK9Z%-B5wbVu>}7V|3u{8<9<-B)p_J1D=PE09BKx*3&2MkcAIbc-rxQR|J)RE_cY z2`vrIc{qk_s+@##@-*tquZAg_RUJ{@&5>L7My=X~csJpmNEuo^R)PWz|qRc!uabe+7m$v-zvoJ6QanKSi^SPUiYNy*Fn0m43DTcao2yymk+b22^f{yxYcKde$V zc1r1d)kSJCRjIzho1x-iS?4B9NX*hEKL_^Y_H1PE089!}^2;G+Bu%q4HX*)~P!{PA zvFj1+t^t#?2U+lnJ~N63LFDRwtyrEV-&{#kjXcT0LA1DR`&Q1kz{lRhvrT|@ipBt` z%rLw>fC0&rZE*2MGQZxHjD^ufH$qonbIj26fpSTdgY}Uu0S?q1lKY+jF@@+7r6Cv$a%>y>$aXj=a zD&`iKgRC`|zuYq!Uo9+^?MedB6V0*UBkT6oo5AhH=IJ#o3-gMqRCkSSQ#ps@_zbpW z2ft?8rlaWep75glz$`7i@t{fcHAE*IkGA7?Ab_Vp+_5ZYCf%8y4AF?q3NNwTN&648 zb&+)h>UOT9dAy#@#y7w`mBRu9JT{FN?E(`ACm-1sosrAD_vp)JW0*%X4T zvB*(mf&9IZt3sG^K9mu*!>rj$^a2+$@&>>ihQC`Q`kdz%Z9>FWCGLvPGwQmQcg856 zJm7yV*WkDLuZhzel>N5c2N)nA^#9v(&7Ezm|6#k2lmF*bP^G#az0V5kol_&zbOF$^6}qnXQ(uI{XGuTl3?ovZ#p^454R|5NuBfTq_VLk9{=7(wVEjwcD*ZAe+4 z0xNE)Rda6Oj|41fOcfi z!sJUNpp|(XtaWiJvIAYa%PV)b?AArKyafu3TMwFq$?GaDOwsUo}4P$@9 zNU}){s}tb{UQR*AF^m+ljV)PU*$z6PONh=3KspV$8M!24?8CgHvBy*_n0D%S0lFVc zF_KI@${wrO43hSuTXiJs^cZ*!EGFD+z^k&u=TDW7w;j(M^Kk5RW`m}E;*2cVzreZmadypgo1x^QGUo{+liR9pZG`aR>} z&7Juh3D<#lks5k0ctp%kPxxNB__`vrN)xS=%uT|jU|vNjkJ64-{8OMG@9Bc98l&9X zw5~8Zfs5&Io?&Y{?#X>!vX;z?>S<9&09Zd4bWE7{&`xSI`FNsUjHsL1+7y(#Q(m>Q z{M4AVRXSewSD?+S?uC={SDro?%DQFz93;D@mpD}nN7068~91iP1;pz=PxKE}Qu1c?r+BykX+izhWDW;-{F`d(YTJR(zKoLb@pXdC z3)~`(u92x;-10z}`;V)*_wsufTY#87U!qgN?PtLY=CxlNei&`^CvNyJF-ZB3K9_NI zHzV&{+n6!*=qN1w>8C^J5EP>8t+FXDIF~+=CWdD9ypKpTTZ~*r5Qc?r=uXR`FY2AV z?}g?!&0pcV5B06Z*t8p!5o8KIOv7epx56k_?xstlIjBigx|MDG;pE|80C>Rv^4;~U ztJ=z0N$8z8KtMi@K)>xDC&7vm7w`{rx0~U%wEx}y&GQfPSU6!1*KNO0sk)cD8}xr8 zdHI4eB%)Cr0Z>P`6}=z9sanf2X^f_h?H4DDj-Q45^NZ=a0>Ma#vR= zth9XGS^G)X)+Q>Vqr4zte*bR&V}Ch?4?i;-fQyGO@?*9krT%iUH|D#YUXETiUdPtk z@ZtLWvixes(t}rH=g0X=OF!=OXTz-9w$Gi5918~*AMfVdc<-Se!Y{ubLr1EqVhM_= z(?T??(|i5T=bu0IKi_XBcV`bXn9iNe%*fWmh1I<~kzZ=UZbi$J*e0F(OD zfP(1)JJ+2YGXi_O5L@Txqn+mq4z~B`ofbv~&=6l`a?h3U{4eHmck2qy3C2kn{Lr}* zgRN-D6_qF&j-SmFqBhY6E+plYG`B+Lb7uy0i3$BuGn%rOID(sUsALFqcmt9kR8J0D2w?ChF|d@vp_?X2T|)8J6ee_a%xOrS&2T zT{TCe>KKa0B5_Sne3GVus4RETwN~|NM!idlH?1C28?MPvQ)W3i4GevuAkEWiXicV z;T{|KOGAG-~`_60N}CmLZzgA_Ide5zs^IWsK}@yLtvY{Bcfi3Dd@1y zL>lCq=rteI4fqGo&c>@55xeuu;EP0CL;lo7dO9thC?iWDLU!2P*a}Bdzm?2IX~QWC zFUHBpD`8XcT9~K?=BFYR)9f=Evhv0pZ*Dav>!ynhkZpKb*xBDcd>0)EC!zg*>z1O@wFwS(~JH z9vWVVRn;G~B$>+>`)^c(bnLY*n+z*tPZ05}SMhO%Q-p^0&xC*nRzMCqOzgPf)-4!UxIirr{VZ^dgR3e!9CpH!@}puAl?Wx7Bve+L5%I#RXJox~DIcl3LSd zr(hB%h^9#7D8G{bdqee3+Tt&qRZPk+9L_^U`*cDK-fJ6sNKDawmtv_$V@?U)dGLqn z$&kyt{Y{&C6_{0;&h75CIZlgMhG9qgcNePa?Hu`kYj$Gsy3Tr-(RTWf1TS$J{v~T zK;*KkCx`mCrQR22X^I+W7d$Jr<9-=_bai%zsZbRT4Ax1c1ZYanOVcCuuo~lN6)Rm( zNWl%%^AJFq(2eU#loZA9tJA$ECx)1Gqt*lxCCg9DMQc)@s70QleApKvMXUJFhU3>X z5~2|~WQ?Vpg{zmRhAT9u?w<=?1}qHDWeEc@18FeG))TDk3!s!^t}rl-B8CwfefHxU z^IcKr!jLF&0u-Zy`w6^ZpVcZv8WVX&7TR?`|w~!mTN{)n(wAS`n45NL%YDozHkfW*%{roix8VNv=Z~^=lD@+L!lf zUiz|p3bJfidYW`;Y?U_(uft`u6rWdOqhgHf-IR=`1~~Qi4KskMAn!oKoS=cL6oP07 z-!P%5n^DvEb8J#sh^G&p0jE}fgyl+*o434gMSsbkuiDFp{NgDt0em#h@O;)%THe|p zN5(!bV4Uwzwl22IDg8EM9Cjfzt@Z<>5Tsc zDxceu1@OhfbcGBKJAs0f6)p<{%RbvL&G2xYA~2|hpJfwa*%cGuH=PM1)w164n1 zb!gaSwn^cg=Azw|kzzr|Zh_zyXhu{xqA^<(nnEB<4g2mexfwfR>^2&(llK8PZdfoM zlKqCM3{SJQayY~+L;%<4j?BNkJ@A0(JuD3002p(@TALDBiE)AB7%^ez$@9pPCWUMT zaW*Vcn-JM@Qd=A}rMP3K5BNRYPjBnsCMI7S{NW7$=dkrqitof`&njDUqXH2!G_ z6>?^%ZOlg$2TrcQw^|Lfj0qy|=j(=Wj1p;mOVBCPLk;heSM_y?UaQE|ce^l@y4We& zAD~(@l}Rvym}oO+N49%UXz3(z7lvpaEd14*=(DsYJ|#hCJFP3>+xV|>vB+dJSMy4m z?KO0gRh<1 zne%2`pfzV96x1LU5}>ZtR1V&I3aTOv5I?a4K+!gRu^~)#D4(F{wLEOv%D@W8D{*$f zK6#s8l?k%IuqZ2fU<)r6@T&JNUo9819QEWlCYW|Yd!C537v!dQYYcsQIf&2IzV?e? zKjBHBAYbeCB13*6cNTk67Sg-e*8rqVTc1&I>w(<&E`-U&jinu;PPXxWYS*};@KDR} zDjxg&NXQ9))Tv@HMpj)7iuBb^w%<%-L^7>!Ym~LRhjfO(;8Q@NSzR!pR8SZyEw{OG21T z6WPC-yWqiaS5>OOTz!xmGVht}U1PD~{rc_Jf#Iv29Kut?YR5?LLtQJh>Ii%BTuzY< z-ngDlVS*=Tc$a6F(O5BIXO@4D&&Oo6qozs`SB)gth#Cm6I_}N>r#xV%6RPnLU7Yk$ zPZKC6IX4$YVOpqc=@sqVar~Fnn_KqqY$uh4c&%e4Jw9UPm1{i0Ps21LX3y+IOTCOu zvOwdH_$Txs!m^RTO%xekfwMBTaKG zJT0-N5BRaVIeKLhG|SQ|c%xH(wuvin6(tp7G&O74BrV4W?)54hhDjMXjv*S=XtRK|d_jVlYe~$MNd7W1 zwv?po$%Jd(N-6|}k+rYf)B<@7B$#mJ8Z-7Y8ARo~L_Bp;kaC7yca-XV7KD^u_u<2! z_Zc|bQbZQyS}))Vb%4tw9p0+sT>HC{4AXZM%qE=3TEX!kqRQr_B!=Yj+-d%fg|^y- z`Y$x(W*p#X@%U$rl~MTZE>2dYvO~k& zY7g#4Rt-i>AA$8;WV8{_l+iuZ;*K&pXMw`;vv$1Go&($aZnI&rRPR#hdDILi*Y*vm zgtL41F-QtJK$-rcCGwSxr%R@Aqnvs0D@a!KI_qfo$7?m-ItA(?K(f5i<$0>K!hsV_$1J*!8KD|(of}2VxRMM5NVem-seI#v3@RnX2G0gpWtW1A}K5+5_Nt* z#IKg0ORH=e4c!gQKgN1Z)&_~Q3YH9mr35Y$o8SSilDR}0xLTRI!Pijgkuq%Apcmxio4sr=q|ZpGxb0820uKL zeI-y{D2vT~n_BA|%jwPz+E4j|erUQw@Lh@u4C`M5K^>L_s6P@z={r)aX*RqOtnb@~ zyaQGps9S}&Cq2HT@z^{c1Wv?h1z~3`szn5#(SThg1?45>mz+1Ms_%g1kdb`A46>p# z--kOnunXOS#qb^mnSfr31f3>MGZC+nr8u{x(_%54q|r1Ko#a^cjik<7S4rCoKN5qem^ST7r2iO z0KRK|r*6C8HL807gqE%Fg*TI3H}CvRSPW(_$wj$?-LtIENu;Oe3Q8QFLCt9=#$%D{ z0-e*u-ucm(0*+?OY`6AlA%piKoC9EX3tepAGJ^1Hg_ebw+sP0j!Cg_fgGO}sXVBmu ztS}T95`f1kH^1G;aNQIiLR``!(tw2j?8!~GyPRzml&&ew1ia%^5}vv-j>vGb5mXS z=*z)&HbD#TD@RZ@Kv%MV+$bp^?(2O~ePH^dGYUWR^+D;-V<{#R+bRIOv8B(*kfJ@vAbL6GY)y ztfEN{Zd#DBm2>Tjj--=a9=-K~=~8g7hWo@O`a=@izV-qFTpxt9>+t)RtauxIiTl}8 z_=^gt7-ce>LOK#cvMgKR5oNDsnc$h7Nd=87qyUJwR+im?+acv0(c758*0O;EyFy>l zv2WB-_(tt`rZ}-59BY8y27j6^>=8FEbayQ0MeetrDeVwSozKhtXGBd26j^KfcFzWf z#oe!q7j=!98wG-MVpsuFp7(vw74TB$mZfqGX~C9SsI6MUUD>s);Rn1aOH7Uh@>p$g zR=3)_fmpvTthtu*h%yuF`moYc@926AQ9oIibA--e$qXvbVWI$J=Y3gY4Mts%t#O|v z*cDzan&rh;em8mtQyHDUX`6f-pOF%HKS1ot-$j(o>x8T{J@xl&see|p^LEFZs;E5= zR`>b&Us`W*rmh}DFs9{%YbZn*aq?BJjj37qv-$q;KhE$%^qX{`u1nfkkE%Abx4JdZ zDfMnL!I!LsUi}5Y@R@ZbxxjZEN!!{`asWI_#T_}=%>;<5Eg`8>;Ru9{QSEfJQ`*+Z z&XqpCG0zu<>r||?r7bq4KX7qIs?%Aj@am7lpISf*K3P8tWP~koZ$4Hg$Wj5s9X#?`TiDnuk=h%sxE##I z9>*Bl@D14yrQt$;vFar1Ib42>vv3To%FnWWBXKaYTsY7gmbalZ4$wF>s7zOxES5D3 zpq0&*Tdm(AS+uwn&`}!HQMm;58Rt+$H%ejLTgg`{_FMj@9X0eedP$on?Hr;S*fgOU zne!_D7E=KbUcbm4u!Vz@ zrH6;x&1s(1ck+;!Jg1IY+~_@Vd+t}4nI zAWsR<8b9~t4l6A0ElT2>40RPE+N)5QiE#}5MDe!yIfPe-CO0kR?BW;^(%5s}MT?fd zAxG&QseJh?*~2h^jSBIWTwzl|-uDKcdXv|msOofG!1A3rfEtZ~O__<7UA}|C*da*9 zcVj@Zh6#~lnvwqA9#%W6r{>o+>7=DsakL~rynCK*5Z)x_bBgjVU=+*xP_fA8{Hv<^zHfG6QHqNDzu=KBq*^ZG^7&#eTy+LO zbAYGv?BU`XXn)JfFAvlbcCy_5u24FG4mvwlJz*X=XE6gC6i9O!v9|C&A1fU` zHs84Cj@v!tuJ#SH-^-Q39kTQqz9|(@$dbSI0b7tbOyK1PNpiPd9|=4J`tkXayT zRFqMcU%$ljli@{6k8g|75q@6Lc-24`y*1z~pYSq0YHAc-!NLye3-hp0lj~>`Pz!5O z#Epa!`sufl@WJ8aIN`KUU?%EZv8M(UN!bS(@8Ir!m`e9B8f3QIpcghBzKG_6V~9)L z-o-&}znduL;D(_>95Gk!laF-(2%*cb^T}(s8$VHyew%86M5>4Cp;YttH}ZC+?oS5) z>OJu%?{p$P8NNgcb_ zic4fLU3x#tiKI$6+D+yUZ6BIm#>BwQk#g!~uG|(OzZ}99cU751G!m=4S!co*I@Ak+ zg{%woM=r@j0zcOrmA4`rx#Tye93_!kSpy}GK>~hu0F~&0p~#2u#P8z4(%n9H$K$w6 z!77wzLG_gZEmnA*PqfSdHq)<|mCC#be;_zvSBHt(F3**DpWKuF$R#7! zn~&jpuP8yFZPoo?zWsH30_tdv2?6R^B`)O2C!-NJ-e39V&wj38Af-fd$|Ukh(dB6R z_MFAf;KmfYnFbp}qP8iSc8j7&k-&$hII7&6(N|4>OUncPDdlnoX#GLA3fH}}bSai+ zUs%)h(EB}1)1=UAQ-ves0{gRC1w$kcR5@b^p~>b>L%co zpZ#s03wjcLAMqX)@FB?laaLhRtPIl7Y<>jQ9KyGqKiT5b^*jY3oFWv^W%$|u@@zQ_ zAqJ2N=nh7Jqvg}}vI*<{(XbcL=bq0U41RWNfD(B^*gZYb5++FPHLH{ov_ zH`9bn(^%HC_Y}?l5K*-8p2fQ?;vqYMp}SL@I6tsj?G?Hv12K2iH<3G`t{=URNd`mY zvp%_+X69(4oGw@H*=9<7RM zW-R83@}#{0V1KP|^MJT<&WOJhH{x2?W>}IFW2g?X#}+;VI`EOdFXE$!M&I-5!#)(* z7KLySiVI=KM^W#$GP3%?-UO!^fTDtHskf%B9YhUOEg#auaZns3q`b^+m=X8O)yO>~ z-nvrFsF|3@6V$1poJJHeYw;J5=WQ@Z9DJ_f++FZCpigC-o@8aAE!g5Rpv;Uv5@VF@ z;X04VM>e|I_Gc>sNyWpyegA$!08tFlYcu&A#k!GQT?@x)2k+jm5^icv{HOa46Bg`a zRJxDkSm>JLqE-n8G`s6ETBtNf=6zF0{kMpcbx@a*jbMZ0m<+m>lQjQ}9Z=?U(UVhx zcuC?zfO|QQ2ep4t2)G(^^tBS}5@O0D9wQ5+APBb;9x>eQq=&=(jkfhU`jl&@+*vOZ zx8{%1>tQHBq-XaF3U#>+M{-PRNCnm~j_Hp(-HTgne--;*{g>haF9NYnCtm zCiV0&__a+Aj)IY;l@)eKz!Phd)iuY?=^;cs13O*n!}5Z0%XU&`|aImE;t@re{wz z0Nz+@PV3Ab`gta*XuOxzb4lqZ&#uV5FZt)SQ=abHdxU>d7!ddC3@&5w&zX>Hm)RoD z>aE@O;U9HOHrT!PoIoFf?j83uXJzxM?>o)##?d_i%q(Qn?7vfU2>dMcGj7)9<4n3X zN-t>&#oTc72C5sj`Zy>56u&fSevjcrL4PAiA+g6W|Lrq?fY&eY^EvHtE|a06spc1zC_p;m zBJ>CH4y)5CcUW_b$ybk0gn#{M>h!y8!emo;H6IKJhzJn~2>GvN6ZUrYF82RZ?u7Nb z(#i1e)lQRYI(F-`v_!M4=xNO2l+|&s z-B-Fk;)&-gx^=)pzUpYxZ5?{tDYBH4p{(J@q?iw$Z76H86*u_!mv)z=dP8jZU9y+m z8?jFD6HyxQdfmL=?`XM#x*K-i-0T20?BPky-Zf)Zb(OF?FllNqq|&TLrrL~N9qM}M z7D&FM`Uhp6vH(=BU@TwUQxTI$6v!}mG>0f{Jb@|&IHr{G2Lsc9@TbD!IWD)7SL zX5Ez-;@3s`G(|;R!liEq50VfBs*=68H0s7ZC@LC#k~Y3*gU`@-wymtv^hu;@Iefa3 z2G?1I;8gL*@$e%rb_Z=@dyE&kMc?Fz_Q5!~(Lm z#H_E;se9uzzV@mPtjh69m<_Em&t-27V6WVthe+k;%6W-KDPv~t9tISakEn)Y2OB1> z*@$ipzrJIu-zo+=!5ALc7m5-vxY=8qn9PZ0!QU=tcLGzm8x`%~qne4GuAdr>@-55f z9srOlpgwK+^2XyDq6A8KtBux(`l@$ce74;EHhDjeX%x}Ejc}?`iyCB}v*CU-Cz7ZX zdQcD2&DR9v!x)nUF*kRtw9+8UL-acKhjS{~fR;X%zOtY2Fy45W+MhSWfs96Kl>tU` zs{+}UTBCWkPh?x{h49r^*DAP#V5(1qMgd=P?^|vM1}m8apZXZ8So6fd)Ss4MTFG^~ zp0pSjE(X{)N|CFMgtzNnq>I2LE(Z%@sp8m`;LF_9S~N717o>|cy;Qx1L<)?yezuJB zi=4b3YG|q-C@=RMX~{RQG_8%nAA6~A&OWnbfUYmMz^h`rL%ZoD!ty(i8kLx!m;nj| zw=l+7aee@e9Vuocr%G#D?rFex7Wn$m^YnE0E-lhqa)EVh^tXn`J!p9cu~q0yZgzhA zl}TXz)?11!Q!w%nb=9^!wwYtEbC6y{K3MPNzg}nv5ZEj@nQv3Pto`D4qB***G%ou^ ztg!^brPijJ*P2MKk2QiqCIIN%*9@0lm?uoCP&=heD}a6TB)Of5r0VKn zx;UD0-#S^T1*iJyF*knuV?6H-7IQGvmWCLsFX~~+*?liv=#vx|-RNZFOcyb}!&tX2 zC~%y+(WF59u?cn`pstX7p zAO!>pmgge4I= z(agpe4NJE|6X7_mcq=db_+!VT2^0L;r>zT+@1B>Hhpd)nCn7DT z?H5VMy_HwP(IZur58!tAh zX;ou7tk6(8b!%236;&J{96nhbLpe^tPG*r54GE~?sv5V;QA`!&rd2_*uy)R}7$Z(m zw)1)Aohd4j?MHeM24KQ*^U&Y2_kRu=C*7vHd(M0lp!E&4{XSB~0$>m0cjg9Kj@}~5 zQeuIf!X&1R(>52$GRkv?$9(sd>(>nz*PT9>$P+mvs>UlXzB{lL@`F57FL9w#0=M8E&sn zRoJ#2@f5J^)|wwm3h+CwQ&Z61px6d~J$X3Gh_U1Q+FHTq;c+If7B^&Yfl5!Q4%u`V zUkKVCPuj9O(0$xeqZ{6-UaALFx}{Br)YsoC{4q13Abv>sspZQJW(F$InW6VJXhUFUhn^-^7DxoERf zQiVdowJO2K6mT+v{$wBqm->YS^2)zqaT|43V*|monSZ{poA zJ(zJrulNpR-i3_rDEH8e2!$Kje6C5w&9iFe;q2u7MB`zaA+2pzx(G9%ae~B0tKS&rC&m7^uxjmymQ4dwl|>GgkVs~=5CPw`Fk$AHhOAB591O-Qn=0!1!^KXST>MVg!L>A-`Lhex9Y94FyzEqBK767}u5+s5&ajuE57EI2AGX`+#%%MPV zRg%c^l}BnLBq+o+Xl4|m6-E$iV;y`zyf=Dz)=yMAvUgIV`Y!d8Z*Jys;+E-dTso%O zj~ML{)Ah?DmVuk8nQ1vuu!W8wy!uDu9ZRklMuMas2}swj{cp%A2T%JR_Ly{iFLQbC zQh?NXZSPXRfGpS zvE99sXBq9^s%kBY5l`vygQ~Tnzu+iIFdKk`hq4zU@PY3t6W?#;`>~iz-flChZQ0RI z$`VhRCn_TLb@OhX+=I?b4LyBYb9yi(Dg$_0$BN_DvhZb`SNK-Uz8qtFLAVz$xd%hzPiVx3dG2$bjm ztv~_mKZC>QDB=_?pM=Vz3rV~A+~0LuMDlMo7rB@fyi#mj;=u=GSugh#UVUQUpNpb( zUp|b*wsz+orS&QrKEN0x`F;*{uqHFdjKjvNq!RylhXyIaK67 zReM$*SuPV82&nUSkv7I}$C*cg`A^4bJiu+4^t=6=OvvcY#FpY znGp*4@V{V1@uy}=M$%v;r_@C}=$0$KXdQJdr8^oX!hadqmkiBU*|Pl>zX2+W?Nx`i zjTaoKMq^y!K0G7Fe?#Pskj^OlUWtv^9VtkT0ccM|n?96!;TE+D#j+7o3cm4=j56|O zdAOiSTlH9gfyRU_V-SP}D}nFR=%yN;!qvCh=f`w9=Ho~VpiH^gZ7Ij-e^;@@>RHVx zzM16U2UY=XkSY%sVdYEh53C%O$-f%oNShgK0oS4Ew7Tu+nrhu&z_Yhw8R6Zbm8y&AincpC<>wV>pDD8StyRFX+$0o4NK)1mQtfd3_SI0lbT=65 zvxI%aU}gQ4`r^=4PvzQjwZS$QS(Ebs6_B|YV)FetDv~#sEHgWu)m8AXep>`Vn$8ZDwEW}At8MXZ_oaua{!a#*07Dk<^fNLQKDIlMr z9&x0_usEnq5>G1JV~_sT*)Nly)ynS;B|PYc9e)Wq{9p_NxwyQZ008VxFYU21ia zd73|SQm*hF7zY3gV8BN-e001{j-p>gNyg>4BLktAfyfslOYRLUNf1@m63dYDLNPmz zbaX?0I}&M z*Aw%rNZ0xLkue*!;mswtKlcL0P}~dje7Ppi?)Udz6ke$wTTQYNVloO0DPl*VkWQ*h z`ili^!hS$D6GxeFu@I_^w5-*!y)+sK75=&lTmm2KzKWtbDa2#Jdb69wns|Qp5NrXa+OWK!-K%lT)q16-MVya* zin#%M+=bWp=;9OnUzVZx+cF;H!Z2NaTZYc>HN)?!^gqkei~x4F&L+0bdQL`;7WV(E zEc5!8f&AG%f|S>P+Xt-ov>Lq+InK8`Na7LSJo?AECXppx^zuPsOY6~u180#80KQ9I zRU@?NHz*Ojo7j-}`l)Xi6(S}LhsKH&7S!)u-?jBpjycKEdC-{$l0i3Pi2?{q5yc1rIs+jN5tPMh>IQy>L5p@j6qP2jNh zTaRK3A|~`7aJR^S43T+)6tb!jiz`qAnXhkv2?`rmzN7_)YpP5vA`3C)!0;DbG-}6t z7wVZ)DJt<1V45WZXo&6_5s*}v=Q$ODp=S$VdZ)i~4rQsrp|vNd&U6cm0)lwjLPBJK z9;*hyjcq2+MNf_-_H*E)CXX0spFu?Hx7Kqv%ZQPdyc>lufGXrgsu;>6m9i zdrrk)VAovLM23A2->bUi zWkga`ZJlEhz+UVOJ;L3d(S1?~__lLbvC{-i#Fm6sRb+s0Ts${Ioy^j%k`2x;j(^_w z^YrXwCEr_n`#=L*BOKkSJ}iyxq}js*xjVkeFcYMWFLt(~P62Yl+uw`4ip|hL_MD(u zXe^#H8x@d&T4{6Ar*|bhc^A80mSFCb->9U1(b=U7P{oOH>F|X2d3=GATiBbA;NivV zciDbYB@UyKOVVAqyAr^;I>48g0tUeY{r{Af82_!gLMsAywf_@{ z0tEQKWtaaX{tgv@8vR86O8m13^FOoyK>uAA_Gk1HsLo%W_J7#_%mw_W{~;6mf1dmg z`rkDtf2Q9+CRkG9{f=;cgZ>bp{0GqA^RRygfsy>>DgTv~{SE#jEBhb7Mk)y-6o?jo zrrlBeAGH7N@gLcb|G@iu{^QSRG`a*`3N+z=^!Sft$bSI+Js$is==T~ZmjdgbukMfF z@IQe59((*5#K->E&i*+P`Th3(h(!K>whhqVr|&<*mAL)_|NZOv_qqJ{E&iCx|8@)T V->v`%=*#a<((hOpkN1zW{{n+E=Uo5* delta 9589 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 Y2)>E}9Q;3i!~Y$ze}(jChJVcd3uDRlu>b%7 diff --git a/extension/edge-share/README.md b/extension/edge-share/README.md index d01b3ca..38f8701 100644 --- a/extension/edge-share/README.md +++ b/extension/edge-share/README.md @@ -12,6 +12,23 @@ build step and no dependencies. 4. Select this `extension/edge-share` directory. 5. Open the extension popup, enter the relay URL, and click `Share`. +## Connect from browser-connection control panel + +Open the `browser-connection` `controlPanelUrl` in the Edge profile where this +extension is installed. The page injects `window.browserConnection`, triggers a +connect request, and this extension opens a confirmation window. After approval, +the extension connects to the control panel origin as the relay and returns a +share link to the page, which registers it in the current browser pool. + +This mode does not require copying the share link or starting +`browser-connection-relay` separately for the current workspace. If the Edge +browser is on another machine, expose the control panel only through an +authenticated platform proxy or private tunnel that forwards HTTP(S) and +WebSocket upgrade to the same origin. The panel token is CSRF protection for the +UI, not public authentication. + +## Manual share link + The popup generates a one-time browser session and a share link such as: ```text diff --git a/extension/edge-share/connect.html b/extension/edge-share/connect.html new file mode 100644 index 0000000..0582858 --- /dev/null +++ b/extension/edge-share/connect.html @@ -0,0 +1,149 @@ + + + + + Connect Edge + + + +
+

Connect this Edge

+
+
+ Platform + - +
+
+ Workspace + - +
+
+ Relay + - +
+
+
+ + +
+
Loading request
+
+ + + diff --git a/extension/edge-share/connect.js b/extension/edge-share/connect.js new file mode 100644 index 0000000..05a5e64 --- /dev/null +++ b/extension/edge-share/connect.js @@ -0,0 +1,95 @@ +"use strict"; + +const params = new URLSearchParams(window.location.search); +const requestId = params.get("requestId") || ""; + +const originEl = document.getElementById("origin"); +const workspaceEl = document.getElementById("workspace"); +const relayEl = document.getElementById("relay"); +const statusEl = document.getElementById("status"); +const approveButton = document.getElementById("approveButton"); +const rejectButton = document.getElementById("rejectButton"); + +let request = null; + +document.addEventListener("DOMContentLoaded", () => { + approveButton.addEventListener("click", approve); + rejectButton.addEventListener("click", reject); + loadRequest().catch(showError); +}); + +async function loadRequest() { + if (!requestId) { + throw new Error("Missing request id"); + } + + request = await sendMessage({ + type: "get_platform_connect_request", + requestId + }); + + originEl.textContent = request.origin || "-"; + workspaceEl.textContent = request.workspaceId || request.poolId || "current-runtime"; + relayEl.textContent = request.relayUrl || "-"; + statusEl.textContent = "Allow this page to control this Edge session through the relay."; +} + +async function approve() { + setBusy(true); + statusEl.classList.remove("error"); + statusEl.textContent = "Connecting"; + + try { + const result = await sendMessage({ + type: "approve_platform_connect", + requestId + }); + statusEl.textContent = result.connected + ? "Connected" + : "Share session created. Waiting for relay connection."; + setTimeout(() => window.close(), 900); + } catch (error) { + showError(error); + setBusy(false); + } +} + +async function reject() { + setBusy(true); + + try { + await sendMessage({ + type: "reject_platform_connect", + requestId + }); + } finally { + window.close(); + } +} + +function setBusy(busy) { + approveButton.disabled = busy; + rejectButton.disabled = busy; +} + +function sendMessage(message) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage(message, (response) => { + const runtimeError = chrome.runtime.lastError; + if (runtimeError) { + reject(new Error(runtimeError.message)); + return; + } + if (!response || response.ok !== true) { + reject(new Error((response && response.error) || "Extension message failed")); + return; + } + resolve(response.result); + }); + }); +} + +function showError(error) { + statusEl.textContent = error.message || String(error); + statusEl.classList.add("error"); +} diff --git a/extension/edge-share/content_script.js b/extension/edge-share/content_script.js new file mode 100644 index 0000000..5f14ad2 --- /dev/null +++ b/extension/edge-share/content_script.js @@ -0,0 +1,66 @@ +"use strict"; + +const SOURCE_PAGE = "browser-connection:page"; +const SOURCE_CONTENT = "browser-connection:content"; + +injectProvider(); + +window.addEventListener("message", (event) => { + if (event.source !== window || event.origin !== window.location.origin) { + return; + } + const message = event.data; + if (!message || message.source !== SOURCE_PAGE || !message.id) { + return; + } + + chrome.runtime.sendMessage( + { + type: "platform_request", + id: message.id, + method: message.method, + params: message.params || {}, + origin: window.location.origin, + href: window.location.href, + title: document.title || "" + }, + (response) => { + const runtimeError = chrome.runtime.lastError; + if (runtimeError) { + postResponse(message.id, false, null, runtimeError.message); + return; + } + if (!response || response.ok !== true) { + postResponse( + message.id, + false, + null, + (response && response.error) || "Extension request failed" + ); + return; + } + postResponse(message.id, true, response.result, ""); + } + ); +}); + +function injectProvider() { + const script = document.createElement("script"); + script.src = chrome.runtime.getURL("provider.js"); + script.async = false; + script.onload = () => script.remove(); + (document.documentElement || document.head || document.body).appendChild(script); +} + +function postResponse(id, ok, result, error) { + window.postMessage( + { + source: SOURCE_CONTENT, + id, + ok, + result, + error + }, + window.location.origin + ); +} diff --git a/extension/edge-share/manifest.json b/extension/edge-share/manifest.json index 8787079..e7b10ec 100644 --- a/extension/edge-share/manifest.json +++ b/extension/edge-share/manifest.json @@ -16,10 +16,31 @@ "background": { "service_worker": "service_worker.js" }, + "content_scripts": [ + { + "matches": [ + "" + ], + "js": [ + "content_script.js" + ], + "run_at": "document_start" + } + ], "action": { "default_title": "Edge Share", "default_popup": "popup.html" }, + "web_accessible_resources": [ + { + "resources": [ + "provider.js" + ], + "matches": [ + "" + ] + } + ], "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' http://* https://* ws://* wss://*;" } diff --git a/extension/edge-share/popup.js b/extension/edge-share/popup.js index 1878536..bda8f7c 100644 --- a/extension/edge-share/popup.js +++ b/extension/edge-share/popup.js @@ -116,6 +116,9 @@ function statusLabel(state) { return "Unknown"; } if (state.connected) { + if (state.platformOrigin) { + return `Connected to ${originLabel(state.platformOrigin)}`; + } return "Connected"; } if (state.sharing) { @@ -124,6 +127,14 @@ function statusLabel(state) { return state.status || "Idle"; } +function originLabel(origin) { + try { + return new URL(origin).host; + } catch (_error) { + return origin; + } +} + function setBusy(busy) { shareButton.disabled = busy; stopButton.disabled = busy || !(currentState && currentState.sharing); diff --git a/extension/edge-share/provider.js b/extension/edge-share/provider.js new file mode 100644 index 0000000..45f0034 --- /dev/null +++ b/extension/edge-share/provider.js @@ -0,0 +1,73 @@ +"use strict"; + +(() => { + if (window.browserConnection) { + return; + } + + const SOURCE_PAGE = "browser-connection:page"; + const SOURCE_CONTENT = "browser-connection:content"; + const pending = new Map(); + let nextId = 1; + + function request(input) { + const payload = normalizeRequest(input); + const id = String(nextId++); + + return new Promise((resolve, reject) => { + pending.set(id, { resolve, reject }); + window.postMessage( + { + source: SOURCE_PAGE, + id, + method: payload.method, + params: payload.params + }, + window.location.origin + ); + }); + } + + function normalizeRequest(input) { + if (!input || typeof input !== "object") { + throw new Error("browserConnection.request expects an object"); + } + const method = String(input.method || "").trim(); + if (!method) { + throw new Error("browserConnection request method is required"); + } + const params = input.params && typeof input.params === "object" ? input.params : {}; + return { method, params }; + } + + window.addEventListener("message", (event) => { + if (event.source !== window || event.origin !== window.location.origin) { + return; + } + const message = event.data; + if (!message || message.source !== SOURCE_CONTENT || !message.id) { + return; + } + + const entry = pending.get(message.id); + if (!entry) { + return; + } + pending.delete(message.id); + + if (message.ok) { + entry.resolve(message.result); + } else { + entry.reject(new Error(message.error || "browserConnection request failed")); + } + }); + + Object.defineProperty(window, "browserConnection", { + value: Object.freeze({ request }), + enumerable: false, + configurable: false, + writable: false + }); + + window.dispatchEvent(new Event("browserConnection#initialized")); +})(); diff --git a/extension/edge-share/service_worker.js b/extension/edge-share/service_worker.js index 2681de6..6e033bf 100644 --- a/extension/edge-share/service_worker.js +++ b/extension/edge-share/service_worker.js @@ -5,6 +5,8 @@ const DEFAULT_RELAY_URL = "http://127.0.0.1:8765"; const STORAGE_KEY = "edgeShareState"; const RECONNECT_MIN_MS = 1000; const RECONNECT_MAX_MS = 30000; +const PLATFORM_CONNECT_TTL_MS = 2 * 60 * 1000; +const PLATFORM_RELAY_CONNECT_TIMEOUT_MS = 8000; let state = { sharing: false, @@ -17,6 +19,11 @@ let state = { status: "idle", lastError: "", activeTabId: null, + platformOrigin: "", + platformHref: "", + workspaceId: "", + poolId: "", + browserName: "", updatedAt: "" }; @@ -25,6 +32,7 @@ let reconnectTimer = null; let reconnectDelayMs = RECONNECT_MIN_MS; let intentionallyClosed = false; const attachedTabs = new Set(); +const pendingPlatformRequests = new Map(); chrome.runtime.onInstalled.addListener(() => { restoreState().then(connectIfNeeded).catch(reportError); @@ -34,8 +42,8 @@ chrome.runtime.onStartup.addListener(() => { restoreState().then(connectIfNeeded).catch(reportError); }); -chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => { - handlePopupMessage(message) +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + handleExtensionMessage(message, sender) .then((result) => sendResponse({ ok: true, result })) .catch((error) => sendResponse({ ok: false, error: errorMessage(error) })); return true; @@ -49,7 +57,7 @@ chrome.debugger.onDetach.addListener((source) => { restoreState().then(connectIfNeeded).catch(reportError); -async function handlePopupMessage(message) { +async function handleExtensionMessage(message, sender) { if (!message || typeof message.type !== "string") { throw new Error("Invalid message"); } @@ -63,6 +71,22 @@ async function handlePopupMessage(message) { return startShare(message.relayUrl || DEFAULT_RELAY_URL); } + if (message.type === "platform_request") { + return handlePlatformRequest(message, sender); + } + + if (message.type === "get_platform_connect_request") { + return getPlatformConnectRequest(message.requestId); + } + + if (message.type === "approve_platform_connect") { + return approvePlatformConnect(message.requestId); + } + + if (message.type === "reject_platform_connect") { + return rejectPlatformConnect(message.requestId); + } + if (message.type === "stop_share") { return stopShare(); } @@ -70,7 +94,7 @@ async function handlePopupMessage(message) { throw new Error(`Unknown popup message: ${message.type}`); } -async function startShare(relayUrlInput) { +async function startShare(relayUrlInput, options = {}) { const relayUrl = normalizeRelayUrl(relayUrlInput); const sessionId = randomHex(12); const browserToken = randomHex(24); @@ -90,7 +114,12 @@ async function startShare(relayUrlInput) { shareUrl, status: "connecting", lastError: "", - activeTabId: null + activeTabId: null, + platformOrigin: options.platformOrigin || "", + platformHref: options.platformHref || "", + workspaceId: options.workspaceId || "", + poolId: options.poolId || "", + browserName: options.browserName || "" }); connectRelay(); @@ -120,7 +149,12 @@ async function stopShare() { agentToken: "", shareUrl: "", status: "stopped", - lastError: "" + lastError: "", + platformOrigin: "", + platformHref: "", + workspaceId: "", + poolId: "", + browserName: "" }); return publicState(); @@ -157,6 +191,10 @@ function publicState() { status: state.status, lastError: state.lastError, activeTabId: state.activeTabId, + platformOrigin: state.platformOrigin, + workspaceId: state.workspaceId, + poolId: state.poolId, + browserName: state.browserName, updatedAt: state.updatedAt }; } @@ -259,6 +297,172 @@ function clearReconnectTimer() { } } +async function handlePlatformRequest(message, sender) { + if (message.method !== "connect") { + throw new Error(`Unsupported platform request method: ${message.method}`); + } + if (!sender || !sender.tab || !Number.isInteger(sender.tab.id) || !sender.url) { + throw new Error("Platform requests must come from a browser tab"); + } + + const pageUrl = new URL(sender.url); + if (pageUrl.protocol !== "http:" && pageUrl.protocol !== "https:") { + throw new Error("Platform requests must come from an http or https page"); + } + if (message.origin !== pageUrl.origin) { + throw new Error("Platform request origin did not match the sender tab"); + } + + const params = message.params && typeof message.params === "object" ? message.params : {}; + const requestId = randomHex(12); + const request = { + requestId, + origin: pageUrl.origin, + href: sender.url, + title: message.title || sender.tab.title || "", + tabId: sender.tab.id, + workspaceId: stringParam(params.workspaceId), + poolId: stringParam(params.poolId), + browserName: stringParam(params.displayName || params.browserName) || "Edge", + relayUrl: normalizeRelayUrl(stringParam(params.relayUrl) || pageUrl.origin), + createdAt: Date.now() + }; + + if (new URL(request.relayUrl).origin !== request.origin) { + throw new Error("Platform relayUrl must use the requesting page origin"); + } + + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + pendingPlatformRequests.delete(requestId); + reject(new Error("Platform connect request expired")); + }, PLATFORM_CONNECT_TTL_MS); + + pendingPlatformRequests.set(requestId, { + request, + resolve, + reject, + timeout + }); + + chrome.windows.create( + { + url: chrome.runtime.getURL(`connect.html?requestId=${encodeURIComponent(requestId)}`), + type: "popup", + width: 420, + height: 560 + }, + () => { + const error = chrome.runtime.lastError; + if (error) { + clearTimeout(timeout); + pendingPlatformRequests.delete(requestId); + reject(new Error(error.message)); + } + } + ); + }); +} + +async function getPlatformConnectRequest(requestId) { + const entry = pendingPlatformRequests.get(String(requestId || "")); + if (!entry) { + throw new Error("Platform connect request was not found or expired"); + } + return sanitizePlatformRequest(entry.request); +} + +async function approvePlatformConnect(requestId) { + const id = String(requestId || ""); + const entry = pendingPlatformRequests.get(id); + if (!entry) { + throw new Error("Platform connect request was not found or expired"); + } + + pendingPlatformRequests.delete(id); + clearTimeout(entry.timeout); + + let started = false; + try { + await startShare(entry.request.relayUrl, { + platformOrigin: entry.request.origin, + platformHref: entry.request.href, + workspaceId: entry.request.workspaceId, + poolId: entry.request.poolId, + browserName: entry.request.browserName + }); + started = true; + if (!(await waitForRelayConnection(PLATFORM_RELAY_CONNECT_TIMEOUT_MS))) { + throw new Error(state.lastError || "Timed out connecting to browser relay"); + } + const result = publicState(); + const response = { + shareUrl: result.shareUrl, + sessionId: result.sessionId, + connected: result.connected, + relayUrl: result.relayUrl, + platformOrigin: entry.request.origin, + workspaceId: entry.request.workspaceId, + poolId: entry.request.poolId, + browserName: entry.request.browserName + }; + entry.resolve(response); + return response; + } catch (error) { + if (started) { + await stopShare().catch(reportError); + } + entry.reject(error); + throw error; + } +} + +async function rejectPlatformConnect(requestId) { + const id = String(requestId || ""); + const entry = pendingPlatformRequests.get(id); + if (!entry) { + return { rejected: true }; + } + + pendingPlatformRequests.delete(id); + clearTimeout(entry.timeout); + const error = new Error("User rejected browser connection"); + entry.reject(error); + return { rejected: true }; +} + +function sanitizePlatformRequest(request) { + return { + requestId: request.requestId, + origin: request.origin, + href: request.href, + title: request.title, + workspaceId: request.workspaceId, + poolId: request.poolId, + browserName: request.browserName, + relayUrl: request.relayUrl, + createdAt: request.createdAt + }; +} + +async function waitForRelayConnection(timeoutMs) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + if (state.connected) { + return true; + } + if (!state.sharing) { + return false; + } + await sleep(100); + } + return state.connected; +} + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + async function handleRelayMessage(rawData) { let message; try { @@ -836,6 +1040,13 @@ function normalizeRelayUrl(input) { return url.href.replace(/\/$/, ""); } +function stringParam(value) { + if (typeof value !== "string") { + return ""; + } + return value.trim().slice(0, 512); +} + function randomHex(lengthBytes) { const bytes = new Uint8Array(lengthBytes); crypto.getRandomValues(bytes); diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index cab32a1..510eab3 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -1,6 +1,9 @@ use super::{McpRuntime, PERSONAL_BROWSER_NAME}; +use crate::shared_browser::BrowserShareRelay; use anyhow::{anyhow, Context, Result}; use serde_json::{json, Value}; +use std::fmt::Write as _; +use std::fs::File; use std::io::{Read, Write}; use std::net::{TcpListener, TcpStream}; use std::sync::{Arc, Mutex}; @@ -22,15 +25,19 @@ pub(super) fn spawn_control_panel(runtime: Arc>) -> Result<()> let listener = TcpListener::bind(("127.0.0.1", port)) .with_context(|| format!("failed to bind browser control panel on 127.0.0.1:{port}"))?; + let relay = BrowserShareRelay::new(); + let control_token = Arc::new(generate_control_token()?); thread::Builder::new() .name("browser-control-panel".to_string()) .spawn(move || { for stream in listener.incoming().flatten() { let runtime = Arc::clone(&runtime); + let relay = relay.clone(); + let control_token = Arc::clone(&control_token); thread::Builder::new() .name("browser-control-panel-client".to_string()) .spawn(move || { - let _ = handle_connection(runtime, stream); + let _ = handle_connection(runtime, relay, control_token, stream); }) .ok(); } @@ -40,12 +47,23 @@ pub(super) fn spawn_control_panel(runtime: Arc>) -> Result<()> Ok(()) } -fn handle_connection(runtime: Arc>, mut stream: TcpStream) -> Result<()> { +fn handle_connection( + runtime: Arc>, + relay: BrowserShareRelay, + control_token: Arc, + mut stream: TcpStream, +) -> Result<()> { stream.set_read_timeout(Some(Duration::from_secs(3))).ok(); stream.set_write_timeout(Some(Duration::from_secs(3))).ok(); + if is_relay_websocket_request(&stream)? { + return relay + .handle_stream(stream) + .context("failed to handle embedded browser share relay client"); + } + let request = read_http_request(&mut stream)?; - let response = route_request(runtime, &request); + let response = route_request(runtime, control_token.as_str(), &request); write_http_response(&mut stream, response) } @@ -53,6 +71,7 @@ fn handle_connection(runtime: Arc>, mut stream: TcpStream) -> struct HttpRequest { method: String, target: String, + headers: Vec<(String, String)>, body: String, } @@ -100,6 +119,28 @@ fn read_http_request(stream: &mut TcpStream) -> Result { parse_http_request(&data) } +fn is_relay_websocket_request(stream: &TcpStream) -> Result { + let mut data = [0_u8; 2048]; + let read = stream + .peek(&mut data) + .context("failed to peek control panel request")?; + if read == 0 { + return Ok(false); + } + let head = String::from_utf8_lossy(&data[..read]); + let Some(request_line) = head.lines().next() else { + return Ok(false); + }; + let mut parts = request_line.split_whitespace(); + let method = parts.next().unwrap_or_default(); + let target = parts.next().unwrap_or_default(); + Ok(method.eq_ignore_ascii_case("GET") && is_relay_path(request_path(target))) +} + +fn is_relay_path(path: &str) -> bool { + path.starts_with("/ws/browser/") || path.starts_with("/ws/agent/") +} + fn header_end(data: &[u8]) -> Option { data.windows(4).position(|window| window == b"\r\n\r\n") } @@ -136,22 +177,51 @@ fn parse_http_request(data: &[u8]) -> Result { .next() .ok_or_else(|| anyhow!("HTTP target missing"))? .to_string(); + let headers = head + .lines() + .skip(1) + .filter_map(|line| { + let (name, value) = line.split_once(':')?; + Some((name.trim().to_ascii_lowercase(), value.trim().to_string())) + }) + .collect(); let body = String::from_utf8_lossy(&data[header_end + 4..]).to_string(); Ok(HttpRequest { method, target, + headers, body, }) } -fn route_request(runtime: Arc>, request: &HttpRequest) -> HttpResponse { +fn route_request( + runtime: Arc>, + control_token: &str, + request: &HttpRequest, +) -> HttpResponse { match (request.method.as_str(), request_path(&request.target)) { ("OPTIONS", _) => empty_response(204, "No Content"), - ("GET", "/") | ("GET", "/index.html") => html_response(control_panel_html()), + ("GET", "/") | ("GET", "/index.html") => control_panel_response(runtime, control_token), ("GET", "/api/browsers") => browser_inventory_response(runtime), - ("POST", "/api/share") | ("GET", "/api/share") => register_share_response(runtime, request), + ("POST", "/api/share") | ("GET", "/api/share") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + register_share_response(runtime, request) + } ("POST", "/api/select") | ("GET", "/api/select") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } select_browser_response(runtime, request) } _ => json_response(404, "Not Found", json!({ "error": "not found" })), @@ -165,6 +235,31 @@ fn request_path(target: &str) -> &str { .unwrap_or(target) } +fn control_panel_response(runtime: Arc>, control_token: &str) -> HttpResponse { + let project_id = runtime + .lock() + .map(|runtime| runtime.config.project_id.clone()) + .unwrap_or_else(|_| "browser-connection".to_string()); + html_response(control_panel_html(control_token, &project_id)) +} + +fn has_valid_control_token(request: &HttpRequest, control_token: &str) -> bool { + let provided = request + .header("x-browser-control-token") + .or_else(|| query_param(&request.target, "control_token")) + .or_else(|| query_param(&request.body, "control_token")); + provided.as_deref() == Some(control_token) +} + +impl HttpRequest { + fn header(&self, name: &str) -> Option { + let name = name.to_ascii_lowercase(); + self.headers + .iter() + .find_map(|(key, value)| (key == &name).then(|| value.clone())) + } +} + fn browser_inventory_response(runtime: Arc>) -> HttpResponse { let result = runtime .lock() @@ -278,7 +373,7 @@ fn hex_value(byte: u8) -> Option { fn write_http_response(stream: &mut TcpStream, response: HttpResponse) -> Result<()> { write!( stream, - "HTTP/1.1 {} {}\r\nContent-Type: {}\r\nContent-Length: {}\r\nCache-Control: no-store\r\nConnection: close\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Methods: GET, POST, OPTIONS\r\nAccess-Control-Allow-Headers: Content-Type\r\n\r\n", + "HTTP/1.1 {} {}\r\nContent-Type: {}\r\nContent-Length: {}\r\nCache-Control: no-store\r\nConnection: close\r\n\r\n", response.status, response.reason, response.content_type, @@ -322,7 +417,36 @@ fn json_response(status: u16, reason: &'static str, value: Value) -> HttpRespons } } -fn control_panel_html() -> String { +fn generate_control_token() -> Result { + let mut bytes = [0_u8; 32]; + File::open("/dev/urandom") + .context("failed to open /dev/urandom for control panel token")? + .read_exact(&mut bytes) + .context("failed to read control panel token bytes")?; + let mut token = String::with_capacity(bytes.len() * 2); + for byte in bytes { + write!(&mut token, "{byte:02x}").expect("writing to a String cannot fail"); + } + Ok(token) +} + +fn escape_js_string(value: &str) -> String { + value + .chars() + .flat_map(|ch| match ch { + '\\' => "\\\\".chars().collect::>(), + '"' => "\\\"".chars().collect(), + '\n' => "\\n".chars().collect(), + '\r' => "\\r".chars().collect(), + '<' => "\\u003c".chars().collect(), + '>' => "\\u003e".chars().collect(), + '&' => "\\u0026".chars().collect(), + _ => vec![ch], + }) + .collect() +} + +fn control_panel_html(control_token: &str, project_id: &str) -> String { format!( r##" @@ -432,6 +556,19 @@ button:hover {{ background: var(--accent-strong); }} padding-top: 16px; border-top: 1px solid var(--line); }} +.connect {{ + margin-top: 14px; + padding-top: 14px; + border-top: 1px solid var(--line); +}} +.connect-status {{ + margin-top: 8px; + min-height: 34px; + color: var(--muted); + font-size: 12px; + line-height: 1.35; + overflow-wrap: anywhere; +}} .meta strong {{ color: var(--text); font-weight: 650; }} .toolbar {{ display: flex; @@ -473,6 +610,10 @@ button:hover {{ background: var(--accent-strong); }} +
+ +
Checking Edge extension
+
"##, - personal = PERSONAL_BROWSER_NAME + personal = PERSONAL_BROWSER_NAME, + project_id = escape_js_string(project_id), + control_token = control_token ) } @@ -599,4 +807,15 @@ mod tests { Some("work-browser") ); } + + #[test] + fn validates_control_token_from_header() { + let request = parse_http_request( + b"POST /api/share HTTP/1.1\r\nX-Browser-Control-Token: secret\r\nContent-Length: 0\r\n\r\n", + ) + .expect("request parses"); + + assert!(has_valid_control_token(&request, "secret")); + assert!(!has_valid_control_token(&request, "other")); + } } diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 2c3e95b..3eb5751 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -124,15 +124,15 @@ pub fn run_relay(config: RelayConfig) -> Result<()> { } pub fn serve_listener(listener: TcpListener) -> Result<()> { - let state: SharedRelayState = Arc::new(RelayState::default()); + let relay = BrowserShareRelay::new(); for stream in listener.incoming() { match stream { Ok(stream) => { - let state = Arc::clone(&state); + let relay = relay.clone(); thread::Builder::new() .name("browser-share-relay-client".to_string()) .spawn(move || { - let _ = handle_client(state, stream); + let _ = relay.handle_stream(stream); }) .context("failed to spawn relay client thread")?; } @@ -142,6 +142,29 @@ pub fn serve_listener(listener: TcpListener) -> Result<()> { Ok(()) } +#[derive(Debug, Clone)] +pub struct BrowserShareRelay { + state: SharedRelayState, +} + +impl BrowserShareRelay { + pub fn new() -> Self { + Self { + state: Arc::new(RelayState::default()), + } + } + + pub fn handle_stream(&self, stream: TcpStream) -> Result<()> { + handle_client(Arc::clone(&self.state), stream) + } +} + +impl Default for BrowserShareRelay { + fn default() -> Self { + Self::new() + } +} + #[derive(Debug, Clone, PartialEq, Eq)] pub struct SharedBrowserClient { share_url: String, @@ -368,7 +391,10 @@ impl RelayState { connection_id: u64, raw_message: &str, ) -> Result<()> { - let message = validate_relay_json_message(raw_message)?; + let message = match validate_relay_json_message(from, raw_message)? { + Some(message) => message, + None => return Ok(()), + }; let sessions = self .sessions .lock() @@ -558,20 +584,25 @@ fn parse_share_path(path: &str) -> Result { } } -fn validate_relay_json_message(raw_message: &str) -> Result { +fn validate_relay_json_message(from: PeerRole, raw_message: &str) -> Result> { if raw_message.len() > MAX_JSON_MESSAGE_BYTES { return Err(anyhow!("relay JSON message exceeded size limit")); } let value: Value = serde_json::from_str(raw_message).context("relay message was not JSON")?; - let id = value - .get("id") - .ok_or_else(|| anyhow!("relay JSON message must include request id"))?; + let Some(id) = value.get("id") else { + if from == PeerRole::Browser { + return Ok(None); + } + return Err(anyhow!("relay JSON message must include request id")); + }; if id.is_null() || id.is_array() || id.is_object() { return Err(anyhow!( "relay JSON message id must be a string, number, or boolean" )); } - serde_json::to_string(&value).context("failed to encode relay JSON message") + serde_json::to_string(&value) + .map(Some) + .context("failed to encode relay JSON message") } fn validate_session_id(value: &str) -> Result { @@ -717,11 +748,19 @@ mod tests { #[test] fn rejects_messages_without_request_id() { - let error = validate_relay_json_message(r#"{"method":"ping"}"#).unwrap_err(); + let error = + validate_relay_json_message(PeerRole::Agent, r#"{"method":"ping"}"#).unwrap_err(); assert!(error.to_string().contains("request id")); } + #[test] + fn ignores_browser_events_without_request_id() { + let result = validate_relay_json_message(PeerRole::Browser, r#"{"type":"hello"}"#).unwrap(); + + assert_eq!(result, None); + } + #[test] fn forwards_json_messages_between_browser_and_agent() { let listener = TcpListener::bind(("127.0.0.1", 0)).unwrap(); diff --git a/tests/mcp_stdio.rs b/tests/mcp_stdio.rs index 6c32494..0c49241 100644 --- a/tests/mcp_stdio.rs +++ b/tests/mcp_stdio.rs @@ -5,6 +5,8 @@ use std::thread; use std::time::Duration; use serde_json::Value; +use tungstenite::stream::MaybeTlsStream; +use tungstenite::{connect, Message, WebSocket}; fn encode_message(value: Value) -> Vec { let body = serde_json::to_vec(&value).expect("message body serializes"); @@ -83,6 +85,48 @@ fn http_request(port: u16, request: &str) -> String { panic!("control panel did not accept connections: {last_error:?}"); } +fn websocket_connect(url: &str) -> WebSocket> { + let mut last_error = None; + for _ in 0..50 { + match connect(url) { + Ok((socket, _response)) => return socket, + Err(error) => { + last_error = Some(error); + thread::sleep(Duration::from_millis(20)); + } + } + } + panic!("control panel websocket did not accept connections: {last_error:?}"); +} + +fn control_panel_token(port: u16) -> String { + let response = http_request( + port, + "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n", + ); + assert!(response.contains("200 OK"), "{response}"); + let marker = "const controlToken = \""; + let token = response + .split_once(marker) + .and_then(|(_, rest)| rest.split_once('"')) + .map(|(token, _)| token) + .expect("control token is embedded in panel HTML"); + token.to_string() +} + +fn initialize_request(id: u64) -> Vec { + encode_message(serde_json::json!({ + "jsonrpc": "2.0", + "id": id, + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { "name": "probe", "version": "0" } + } + })) +} + #[test] fn browser_connection_help_exposes_custom_mcp_command_without_npx() { let output = Command::new(env!("CARGO_BIN_EXE_browser-connection")) @@ -322,9 +366,12 @@ fn control_panel_selection_updates_mcp_browser_list_without_restart() { }))) .expect("write MCP initialize request"); + let token = control_panel_token(port); let response = http_request( port, - "POST /api/select?name=personal HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", + &format!( + "POST /api/select?name=personal HTTP/1.1\r\nHost: 127.0.0.1\r\nX-Browser-Control-Token: {token}\r\nContent-Length: 0\r\nConnection: close\r\n\r\n" + ), ); assert!(response.contains("200 OK"), "{response}"); assert!( @@ -369,6 +416,71 @@ fn control_panel_selection_updates_mcp_browser_list_without_restart() { ); } +#[test] +fn control_panel_embeds_browser_share_relay() { + let port = unused_local_port(); + let port_arg = port.to_string(); + let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) + .args([ + "--project", + "dg-test-embedded-relay", + "--no-start-browser", + "--control-port", + &port_arg, + ]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("Failed to spawn browser-connection MCP server"); + + { + let stdin = child.stdin.as_mut().expect("stdin is piped"); + stdin + .write_all(&initialize_request(1)) + .expect("write MCP initialize request"); + + let browser_url = format!( + "ws://127.0.0.1:{port}/ws/browser/session-1?token=browser-token&agent_token=agent-token" + ); + let agent_url = format!("ws://127.0.0.1:{port}/ws/agent/session-1?token=agent-token"); + let mut browser = websocket_connect(&browser_url); + let mut agent = websocket_connect(&agent_url); + + agent + .send(Message::Text(r#"{"id":"1","method":"ping"}"#.to_string())) + .expect("send agent command"); + let forwarded_to_browser = browser + .read() + .expect("browser receives command") + .to_text() + .expect("command is text") + .to_string(); + assert_eq!(forwarded_to_browser, r#"{"id":"1","method":"ping"}"#); + + browser + .send(Message::Text(r#"{"id":"1","result":"pong"}"#.to_string())) + .expect("send browser response"); + let forwarded_to_agent = agent + .read() + .expect("agent receives response") + .to_text() + .expect("response is text") + .to_string(); + assert_eq!(forwarded_to_agent, r#"{"id":"1","result":"pong"}"#); + } + drop(child.stdin.take()); + + let output = child + .wait_with_output() + .expect("browser-connection process exits after stdin EOF"); + assert!( + output.status.success(), + "stderr: {}", + String::from_utf8_lossy(&output.stderr) + ); +} + #[test] fn browser_connection_stdio_accepts_claude_framed_initialize() { let mut child = Command::new(env!("CARGO_BIN_EXE_browser-connection")) From 08cc457bef03c5b1b15569adfe239119a82f62b4 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Thu, 25 Jun 2026 07:50:08 +0000 Subject: [PATCH 07/29] Keep shared Edge relay sessions alive --- Cargo.lock | 165 +++++++++++++++++++++++++ Cargo.toml | 2 +- artifacts/edge-share-extension.tar.gz | Bin 14097 -> 14200 bytes artifacts/edge-share-extension.zip | Bin 16841 -> 16954 bytes extension/edge-share/service_worker.js | 24 ++++ 5 files changed, 190 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 2151630..e2ed194 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,6 +139,16 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +[[package]] +name = "cc" +version = "1.2.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -191,6 +201,22 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -280,12 +306,33 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "generic-array" version = "0.14.7" @@ -401,6 +448,23 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -411,12 +475,68 @@ dependencies = [ "libm", ] +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + [[package]] name = "once_cell_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + [[package]] name = "portable-atomic" version = "1.13.1" @@ -578,6 +698,38 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.228" @@ -632,6 +784,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "strsim" version = "0.10.0" @@ -693,6 +851,7 @@ dependencies = [ "http", "httparse", "log", + "native-tls", "rand", "sha1", "thiserror", @@ -729,6 +888,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index b8d2cf3..0bcd4e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ clap = { version = "=4.4.18", features = ["derive"] } anyhow = "1.0" log = "0.4" env_logger = "0.11" -tungstenite = "0.24" +tungstenite = { version = "0.24", features = ["native-tls"] } [[bin]] name = "browser-connection" diff --git a/artifacts/edge-share-extension.tar.gz b/artifacts/edge-share-extension.tar.gz index 6c06da85dc68bfabdb08d4d38faf9bc2f44a131f..63b07c813d943145e87a5b48230fce3396e58c01 100644 GIT binary patch literal 14200 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 A#Q*>R diff --git a/artifacts/edge-share-extension.zip b/artifacts/edge-share-extension.zip index 51b5b718dcf5df529db9d3d8f7e1d90b575e1965..d0a3aa0a770b012401ebf0e35507ac8d1b2238e0 100644 GIT binary patch delta 7691 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 delta 7570 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 diff --git a/extension/edge-share/service_worker.js b/extension/edge-share/service_worker.js index 6e033bf..08a902b 100644 --- a/extension/edge-share/service_worker.js +++ b/extension/edge-share/service_worker.js @@ -5,6 +5,7 @@ const DEFAULT_RELAY_URL = "http://127.0.0.1:8765"; const STORAGE_KEY = "edgeShareState"; const RECONNECT_MIN_MS = 1000; const RECONNECT_MAX_MS = 30000; +const RELAY_KEEPALIVE_MS = 20 * 1000; const PLATFORM_CONNECT_TTL_MS = 2 * 60 * 1000; const PLATFORM_RELAY_CONNECT_TIMEOUT_MS = 8000; @@ -29,6 +30,7 @@ let state = { let socket = null; let reconnectTimer = null; +let keepAliveTimer = null; let reconnectDelayMs = RECONNECT_MIN_MS; let intentionallyClosed = false; const attachedTabs = new Set(); @@ -129,6 +131,7 @@ async function startShare(relayUrlInput, options = {}) { async function stopShare() { intentionallyClosed = true; clearReconnectTimer(); + clearKeepAliveTimer(); if (socket) { try { @@ -222,6 +225,7 @@ function connectRelay() { } clearReconnectTimer(); + clearKeepAliveTimer(); if (socket) { try { @@ -251,6 +255,7 @@ function connectRelay() { sessionId: state.sessionId, userAgent: navigator.userAgent }); + startKeepAliveTimer(); }); socket.addEventListener("message", (event) => { @@ -264,6 +269,7 @@ function connectRelay() { }); socket.addEventListener("close", (event) => { + clearKeepAliveTimer(); socket = null; persistState({ connected: false, @@ -277,6 +283,7 @@ function connectRelay() { }); socket.addEventListener("error", () => { + clearKeepAliveTimer(); persistState({ lastError: "WebSocket error" }).catch(reportError); }); } @@ -297,6 +304,23 @@ function clearReconnectTimer() { } } +function startKeepAliveTimer() { + clearKeepAliveTimer(); + keepAliveTimer = setInterval(() => { + sendSocket({ + type: "keepalive", + at: new Date().toISOString() + }); + }, RELAY_KEEPALIVE_MS); +} + +function clearKeepAliveTimer() { + if (keepAliveTimer) { + clearInterval(keepAliveTimer); + keepAliveTimer = null; + } +} + async function handlePlatformRequest(message, sender) { if (message.method !== "connect") { throw new Error(`Unsupported platform request method: ${message.method}`); From 688314825b6fadd3e5caab889b556869f7e5b03a Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Thu, 25 Jun 2026 08:18:05 +0000 Subject: [PATCH 08/29] Add shared browser activity audit panel --- src/mcp.rs | 276 ++++++++++++---------------------- src/mcp/activity.rs | 315 +++++++++++++++++++++++++++++++++++++++ src/mcp/control_panel.rs | 172 ++++++++++++++++++++- src/mcp/tools.rs | 209 ++++++++++++++++++++++++++ src/shared_browser.rs | 10 +- 5 files changed, 800 insertions(+), 182 deletions(-) create mode 100644 src/mcp/activity.rs create mode 100644 src/mcp/tools.rs diff --git a/src/mcp.rs b/src/mcp.rs index 337fdff..3649c15 100644 --- a/src/mcp.rs +++ b/src/mcp.rs @@ -16,19 +16,21 @@ use crate::browser_target::{ normalize_share_url, normalize_vnc_endpoint, upsert_browser_endpoint, upsert_browser_novnc_url, upsert_browser_share_url, upsert_browser_vnc_endpoint, }; -use crate::cdp::CdpClient; use crate::shared_browser::SharedBrowserClient; use crate::{ compute_browser_ports, render_browser_control_panel_url_for_port, render_browser_target_novnc_url, render_cdp_url, render_cdp_url_for_ports, BrowserConnection, }; +use activity::BrowserActivityLog; use anyhow::{anyhow, Context, Result}; use serde_json::{json, Value}; use std::env; use std::io::{BufRead, Write}; use std::sync::{Arc, Mutex}; +mod activity; mod control_panel; +mod tools; pub use crate::browser_target::{ active_browser_from_env, browser_endpoints_from_env, parse_named_browser_endpoint, @@ -189,11 +191,12 @@ where Ok(()) } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq)] struct McpRuntime { config: McpServerConfig, managed_cdp_endpoint: Option, active_browser: String, + activity: BrowserActivityLog, } impl McpRuntime { @@ -211,6 +214,7 @@ impl McpRuntime { config, managed_cdp_endpoint: None, active_browser, + activity: BrowserActivityLog::new(), }; runtime.ensure_browser_exists(&runtime.active_browser)?; Ok(runtime) @@ -251,6 +255,82 @@ impl McpRuntime { .and_then(|endpoint| endpoint.share_url.clone()) } + fn active_browser_mode(&self) -> String { + match self.active_browser.as_str() { + MANAGED_BROWSER_NAME => "managed".to_string(), + EXPLICIT_BROWSER_NAME => "explicit".to_string(), + name => self + .config + .browser_endpoints + .iter() + .find(|endpoint| endpoint.name == name) + .map(browser_endpoint_kind) + .unwrap_or("unknown") + .to_string(), + } + } + + fn browser_activity(&mut self, refresh: bool) -> Value { + if refresh { + self.refresh_active_shared_tabs(); + } + self.activity + .snapshot(&self.active_browser, &self.active_browser_mode()) + } + + fn refresh_active_shared_tabs(&mut self) { + let Some(share_url) = self.active_share_url() else { + self.activity.clear_tabs(); + return; + }; + match SharedBrowserClient::new(share_url).list_tabs() { + Ok(tabs) => self.activity.record_tabs(tabs), + Err(error) => self.activity.record_tab_error(error), + } + } + + fn record_tool_activity( + &mut self, + tool: &str, + arguments: &Value, + started_at_ms: u64, + result: &Result, + ) { + let browser = self.active_browser.clone(); + let mode = self.active_browser_mode(); + self.activity + .record_tool_result(&browser, &mode, tool, arguments, started_at_ms, result); + + let Ok(text) = result else { + return; + }; + if tool == "browser_list_tabs" { + match serde_json::from_str::(text) { + Ok(tabs) => self.activity.record_tabs(tabs), + Err(error) => self.activity.record_tab_error(error), + } + return; + } + if self.active_share_url().is_some() && refresh_tabs_after_tool(tool) { + self.refresh_active_shared_tabs(); + } + } + + fn activate_shared_tab_from_panel(&mut self, tab_id: i64) -> Result { + let started_at_ms = activity::now_ms(); + let result = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser")) + .and_then(|share_url| SharedBrowserClient::new(share_url).activate_tab(tab_id)); + let arguments = json!({ "tab_id": tab_id, "source": "control_panel" }); + self.record_tool_activity("browser_activate_tab", &arguments, started_at_ms, &result); + result + .and_then(|text| { + serde_json::from_str::(&text).or_else(|_| Ok(json!({ "result": text }))) + }) + .context("failed to activate shared browser tab") + } + fn managed_cdp_endpoint(&mut self) -> Result { if self.managed_cdp_endpoint.is_none() { self.managed_cdp_endpoint = Some(resolve_managed_cdp_endpoint(&self.config)?); @@ -537,6 +617,20 @@ fn browser_endpoint_kind(endpoint: &NamedBrowserEndpoint) -> &'static str { } } +fn refresh_tabs_after_tool(tool: &str) -> bool { + matches!( + tool, + "browser_navigate" + | "browser_snapshot" + | "browser_evaluate" + | "browser_click" + | "browser_type" + | "browser_press_key" + | "browser_take_screenshot" + | "browser_activate_tab" + ) +} + fn managed_novnc_url(config: &McpServerConfig) -> String { if !config.start_browser { return crate::render_novnc_url(); @@ -736,8 +830,8 @@ fn handle_message(runtime: &mut McpRuntime, message: &str) -> Result success_response(id, initialize_result(protocol_version)), Err(error) => error_response(id, -32602, &error.to_string()), }, - "tools/list" => success_response(id, json!({ "tools": tool_definitions() })), - "tools/call" => success_response(id, handle_tool_call(runtime, &request)), + "tools/list" => success_response(id, json!({ "tools": tools::tool_definitions() })), + "tools/call" => success_response(id, tools::handle_tool_call(runtime, &request)), _ => error_response(id, -32601, &format!("Unknown MCP method: {method}")), }; @@ -771,180 +865,6 @@ fn initialize_result(protocol_version: &str) -> Value { }) } -fn tool_definitions() -> Vec { - vec![ - tool( - "browser_list", - "List available browser targets and show which target is active.", - json!({}), - vec![], - ), - tool( - "browser_select", - "Switch the active browser target by name, optionally registering CDP and display endpoints first.", - json!({ - "name": { "type": "string", "description": "Browser target name, e.g. managed or personal" }, - "cdp_endpoint": { "type": "string", "description": "Optional CDP endpoint to register for this browser name" }, - "vnc_endpoint": { "type": "string", "description": "Optional VNC endpoint to register as HOST:PORT" }, - "novnc_url": { "type": "string", "description": "Optional pre-existing noVNC URL for this browser name" }, - "share_url": { "type": "string", "description": "Optional shared browser extension link for this browser name" } - }), - vec!["name"], - ), - tool( - "browser_navigate", - "Navigate the active browser page to a URL through the Rust CDP adapter.", - json!({ "url": { "type": "string", "description": "Absolute URL to open" } }), - vec!["url"], - ), - tool( - "browser_snapshot", - "Return page title, URL, visible text and simple interactive element selectors.", - json!({}), - vec![], - ), - tool( - "browser_evaluate", - "Evaluate JavaScript in the current page and return a JSON/text result.", - json!({ "expression": { "type": "string", "description": "JavaScript expression" } }), - vec!["expression"], - ), - tool( - "browser_click", - "Click an element by CSS selector in the current page.", - json!({ "selector": { "type": "string", "description": "CSS selector" } }), - vec!["selector"], - ), - tool( - "browser_type", - "Set text in an input-like element by CSS selector and dispatch input/change events.", - json!({ - "selector": { "type": "string", "description": "CSS selector" }, - "text": { "type": "string", "description": "Text to type" } - }), - vec!["selector", "text"], - ), - tool( - "browser_press_key", - "Press a key through CDP Input.dispatchKeyEvent.", - json!({ "key": { "type": "string", "description": "Key name, e.g. Enter or a" } }), - vec!["key"], - ), - tool( - "browser_take_screenshot", - "Capture a PNG screenshot and return it as a data URL.", - json!({ "full_page": { "type": "boolean", "description": "Capture beyond viewport", "default": true } }), - vec![], - ), - ] -} - -fn tool(name: &str, description: &str, properties: Value, required: Vec<&str>) -> Value { - json!({ - "name": name, - "description": description, - "inputSchema": { - "type": "object", - "properties": properties, - "required": required - } - }) -} - -fn handle_tool_call(runtime: &mut McpRuntime, request: &Value) -> Value { - let params = request.get("params").unwrap_or(&Value::Null); - let name = params.get("name").and_then(Value::as_str).unwrap_or(""); - let arguments = params.get("arguments").unwrap_or(&Value::Null); - - let result = match name { - "browser_list" => runtime.browser_inventory_text(), - "browser_select" => runtime.select_browser( - required_str(arguments, "name").unwrap_or(""), - arguments.get("cdp_endpoint").and_then(Value::as_str), - arguments.get("vnc_endpoint").and_then(Value::as_str), - arguments.get("novnc_url").and_then(Value::as_str), - arguments.get("share_url").and_then(Value::as_str), - ), - _ => runtime.ensure_active_display().and_then(|_| { - if let Some(share_url) = runtime.active_share_url() { - dispatch_shared_tool(&share_url, name, arguments) - } else { - runtime - .cdp_endpoint() - .and_then(|cdp_endpoint| dispatch_tool(&cdp_endpoint, name, arguments)) - } - }), - }; - match result { - Ok(text) => tool_result(text, false), - Err(error) => tool_result(format!("{error:#}"), true), - } -} - -fn dispatch_tool(cdp_endpoint: &str, name: &str, arguments: &Value) -> Result { - let client = CdpClient::new(cdp_endpoint); - match name { - "browser_navigate" => client.navigate(required_str(arguments, "url")?), - "browser_snapshot" => client.snapshot(), - "browser_evaluate" => client.evaluate(required_str(arguments, "expression")?), - "browser_click" => client.click(required_str(arguments, "selector")?), - "browser_type" => client.type_text( - required_str(arguments, "selector")?, - required_str(arguments, "text")?, - ), - "browser_press_key" => client.press_key(required_str(arguments, "key")?), - "browser_take_screenshot" => { - let full_page = arguments - .get("full_page") - .and_then(Value::as_bool) - .unwrap_or(true); - client.screenshot(full_page) - } - "" => Err(anyhow!("tools/call params.name is required")), - _ => Err(anyhow!("Unknown browser-connection tool: {name}")), - } -} - -fn dispatch_shared_tool(share_url: &str, name: &str, arguments: &Value) -> Result { - let client = SharedBrowserClient::new(share_url); - match name { - "browser_navigate" => client.navigate(required_str(arguments, "url")?), - "browser_snapshot" => client.snapshot(), - "browser_evaluate" => client.evaluate(required_str(arguments, "expression")?), - "browser_click" => client.click(required_str(arguments, "selector")?), - "browser_type" => client.type_text( - required_str(arguments, "selector")?, - required_str(arguments, "text")?, - ), - "browser_press_key" => client.press_key(required_str(arguments, "key")?), - "browser_take_screenshot" => { - let full_page = arguments - .get("full_page") - .and_then(Value::as_bool) - .unwrap_or(true); - client.screenshot(full_page) - } - "" => Err(anyhow!("tools/call params.name is required")), - _ => Err(anyhow!("Unknown browser-connection tool: {name}")), - } -} - -fn required_str<'a>(arguments: &'a Value, name: &str) -> Result<&'a str> { - arguments - .get(name) - .and_then(Value::as_str) - .map(str::trim) - .filter(|value| !value.is_empty()) - .ok_or_else(|| anyhow!("argument `{name}` is required")) -} - -fn tool_result(text: String, is_error: bool) -> Value { - json!({ - "content": [{ "type": "text", "text": text }], - "isError": is_error - }) -} - fn success_response(id: Value, result: Value) -> Value { json!({ "jsonrpc": "2.0", "id": id, "result": result }) } diff --git a/src/mcp/activity.rs b/src/mcp/activity.rs new file mode 100644 index 0000000..c5e7876 --- /dev/null +++ b/src/mcp/activity.rs @@ -0,0 +1,315 @@ +use anyhow::Result; +use serde_json::{json, Map, Value}; +use std::collections::{BTreeMap, VecDeque}; +use std::time::{SystemTime, UNIX_EPOCH}; + +const MAX_EVENTS: usize = 200; +const MAX_SCREENSHOTS: usize = 24; +const MAX_TEXT_CHARS: usize = 700; + +#[derive(Debug, Clone, PartialEq)] +pub(super) struct BrowserActivityLog { + next_event_id: u64, + events: VecDeque, + screenshots: VecDeque, + latest_tabs: Option, + latest_tab_error: Option, +} + +impl BrowserActivityLog { + pub(super) fn new() -> Self { + Self { + next_event_id: 1, + events: VecDeque::new(), + screenshots: VecDeque::new(), + latest_tabs: None, + latest_tab_error: None, + } + } + + pub(super) fn snapshot(&self, active_browser: &str, mode: &str) -> Value { + json!({ + "activeBrowser": active_browser, + "mode": mode, + "tabs": self.latest_tabs.clone().unwrap_or(Value::Null), + "tabsError": self.latest_tab_error, + "screenshots": self.screenshots.iter().cloned().collect::>(), + "latestScreenshot": self.screenshots.front().cloned().unwrap_or(Value::Null), + "events": self.events.iter().cloned().collect::>(), + }) + } + + pub(super) fn record_tabs(&mut self, value: Value) { + self.latest_tabs = Some(tab_inventory(value)); + self.latest_tab_error = None; + } + + pub(super) fn record_tab_error(&mut self, error: impl ToString) { + self.latest_tab_error = Some(error.to_string()); + } + + pub(super) fn clear_tabs(&mut self) { + self.latest_tabs = None; + self.latest_tab_error = None; + } + + pub(super) fn record_tool_result( + &mut self, + browser: &str, + mode: &str, + tool: &str, + arguments: &Value, + started_at_ms: u64, + result: &Result, + ) { + let event_id = self.next_event_id; + self.next_event_id += 1; + + let duration_ms = now_ms().saturating_sub(started_at_ms); + let (ok, error, result_summary) = match result { + Ok(text) => (true, Value::Null, result_summary(tool, text)), + Err(error) => (false, json!(error.to_string()), Value::Null), + }; + let screenshot_id = result + .as_ref() + .ok() + .and_then(|text| self.record_screenshot(event_id, browser, tool, text)); + + self.events.push_front(json!({ + "id": event_id, + "at": started_at_ms, + "browser": browser, + "mode": mode, + "tool": tool, + "arguments": sanitize_value(arguments), + "ok": ok, + "durationMs": duration_ms, + "error": error, + "result": result_summary, + "screenshotId": screenshot_id, + })); + truncate(&mut self.events, MAX_EVENTS); + } + + fn record_screenshot( + &mut self, + event_id: u64, + browser: &str, + tool: &str, + text: &str, + ) -> Option { + let screenshot = extract_screenshot(text)?; + let screenshot_id = event_id; + self.screenshots.push_front(json!({ + "id": screenshot_id, + "eventId": event_id, + "at": now_ms(), + "browser": browser, + "tool": tool, + "mimeType": screenshot.mime_type, + "dataUrl": screenshot.data_url, + })); + truncate(&mut self.screenshots, MAX_SCREENSHOTS); + Some(screenshot_id) + } +} + +pub(super) fn now_ms() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_millis().min(u128::from(u64::MAX)) as u64) + .unwrap_or(0) +} + +fn truncate(values: &mut VecDeque, limit: usize) { + while values.len() > limit { + values.pop_back(); + } +} + +fn sanitize_value(value: &Value) -> Value { + match value { + Value::Object(object) => { + let mut sanitized = Map::new(); + for (key, value) in object { + let lower = key.to_ascii_lowercase(); + if lower.contains("token") || lower == "share_url" || lower == "shareurl" { + sanitized.insert(key.clone(), json!("[redacted]")); + } else { + sanitized.insert(key.clone(), sanitize_value(value)); + } + } + Value::Object(sanitized) + } + Value::Array(values) => Value::Array(values.iter().map(sanitize_value).collect()), + _ => value.clone(), + } +} + +fn result_summary(tool: &str, text: &str) -> Value { + if extract_screenshot(text).is_some() { + return json!({ "kind": "screenshot", "text": "screenshot captured" }); + } + + if let Ok(value) = serde_json::from_str::(text) { + let tab = value.get("tab").cloned().unwrap_or(Value::Null); + let snapshot = value.get("snapshot").cloned().unwrap_or(Value::Null); + return json!({ + "kind": "json", + "tool": tool, + "title": snapshot.get("title").or_else(|| tab.get("title")).cloned().unwrap_or(Value::Null), + "url": snapshot.get("url").or_else(|| tab.get("url")).cloned().unwrap_or(Value::Null), + "tab": tab, + }); + } + + json!({ + "kind": "text", + "text": truncate_text(text, MAX_TEXT_CHARS), + }) +} + +struct Screenshot { + data_url: String, + mime_type: String, +} + +fn extract_screenshot(text: &str) -> Option { + let trimmed = text.trim(); + if trimmed.starts_with("data:image/") { + return Some(Screenshot { + mime_type: mime_type_from_data_url(trimmed), + data_url: trimmed.to_string(), + }); + } + + let value = serde_json::from_str::(trimmed).ok()?; + extract_screenshot_from_value(&value) +} + +fn find_data_url(value: &Value) -> Option { + match value { + Value::String(text) if text.starts_with("data:image/") => Some(text.clone()), + Value::Array(values) => values.iter().find_map(find_data_url), + Value::Object(object) => object.values().find_map(find_data_url), + _ => None, + } +} + +fn extract_screenshot_from_value(value: &Value) -> Option { + if let Some(data_url) = find_data_url(value) { + return Some(Screenshot { + mime_type: mime_type_from_data_url(&data_url), + data_url, + }); + } + + let object = value.as_object()?; + let data = object.get("data").and_then(Value::as_str)?; + let mime_type = object + .get("mimeType") + .and_then(Value::as_str) + .filter(|value| value.starts_with("image/")) + .unwrap_or("image/png") + .to_string(); + Some(Screenshot { + data_url: format!("data:{mime_type};base64,{data}"), + mime_type, + }) +} + +fn mime_type_from_data_url(data_url: &str) -> String { + data_url + .strip_prefix("data:") + .and_then(|rest| rest.split_once(';').map(|(mime, _)| mime.to_string())) + .unwrap_or_else(|| "image/png".to_string()) +} + +fn tab_inventory(value: Value) -> Value { + let tabs = value + .get("tabs") + .and_then(Value::as_array) + .cloned() + .unwrap_or_default(); + let mut windows = BTreeMap::>::new(); + let mut active_tab = Value::Null; + + for tab in &tabs { + let window_id = tab.get("windowId").and_then(Value::as_i64).unwrap_or(-1); + if tab.get("active").and_then(Value::as_bool) == Some(true) { + active_tab = tab.clone(); + } + windows.entry(window_id).or_default().push(tab.clone()); + } + + let windows = windows + .into_iter() + .map(|(window_id, tabs)| { + let active = tabs + .iter() + .any(|tab| tab.get("active").and_then(Value::as_bool) == Some(true)); + json!({ + "windowId": window_id, + "active": active, + "tabCount": tabs.len(), + "tabs": tabs, + }) + }) + .collect::>(); + + json!({ + "totalTabs": tabs.len(), + "totalWindows": windows.len(), + "activeTab": active_tab, + "windows": windows, + "tabs": tabs, + }) +} + +fn truncate_text(text: &str, max_chars: usize) -> String { + let mut output = String::new(); + for (index, ch) in text.chars().enumerate() { + if index >= max_chars { + output.push_str("..."); + return output; + } + output.push(ch); + } + output +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn extracts_data_url_from_screenshot_json() { + let screenshot = extract_screenshot(r#"{"dataUrl":"data:image/png;base64,abc"}"#).unwrap(); + + assert_eq!(screenshot.mime_type, "image/png"); + assert_eq!(screenshot.data_url, "data:image/png;base64,abc"); + } + + #[test] + fn extracts_base64_data_from_screenshot_json() { + let screenshot = extract_screenshot(r#"{"mimeType":"image/jpeg","data":"abc"}"#).unwrap(); + + assert_eq!(screenshot.mime_type, "image/jpeg"); + assert_eq!(screenshot.data_url, "data:image/jpeg;base64,abc"); + } + + #[test] + fn groups_tabs_by_window() { + let inventory = tab_inventory(json!({ + "tabs": [ + {"id": 1, "windowId": 10, "active": true}, + {"id": 2, "windowId": 10, "active": false}, + {"id": 3, "windowId": 11, "active": false} + ] + })); + + assert_eq!(inventory["totalTabs"], 3); + assert_eq!(inventory["totalWindows"], 2); + assert_eq!(inventory["activeTab"]["id"], 1); + } +} diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index 510eab3..3f386ad 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -204,6 +204,26 @@ fn route_request( ("OPTIONS", _) => empty_response(204, "No Content"), ("GET", "/") | ("GET", "/index.html") => control_panel_response(runtime, control_token), ("GET", "/api/browsers") => browser_inventory_response(runtime), + ("GET", "/api/activity") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + activity_response(runtime, request) + } + ("POST", "/api/activate-tab") | ("GET", "/api/activate-tab") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + activate_tab_response(runtime, request) + } ("POST", "/api/share") | ("GET", "/api/share") => { if !has_valid_control_token(request, control_token) { return json_response( @@ -275,6 +295,46 @@ fn browser_inventory_response(runtime: Arc>) -> HttpResponse { } } +fn activity_response(runtime: Arc>, request: &HttpRequest) -> HttpResponse { + let refresh = query_param(&request.target, "refresh").as_deref() == Some("1"); + let result = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned")) + .map(|mut runtime| runtime.browser_activity(refresh)); + match result { + Ok(activity) => json_response(200, "OK", activity), + Err(error) => json_response( + 500, + "Internal Server Error", + json!({ "error": error.to_string() }), + ), + } +} + +fn activate_tab_response(runtime: Arc>, request: &HttpRequest) -> HttpResponse { + let Some(tab_id) = + query_param(&request.target, "tab_id").or_else(|| query_param(&request.body, "tab_id")) + else { + return json_response(400, "Bad Request", json!({ "error": "tab_id is required" })); + }; + let Ok(tab_id) = tab_id.parse::() else { + return json_response( + 400, + "Bad Request", + json!({ "error": "tab_id must be an integer" }), + ); + }; + + let result = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned")) + .and_then(|mut runtime| runtime.activate_shared_tab_from_panel(tab_id)); + match result { + Ok(value) => json_response(200, "OK", value), + Err(error) => json_response(400, "Bad Request", json!({ "error": error.to_string() })), + } +} + fn select_browser_response(runtime: Arc>, request: &HttpRequest) -> HttpResponse { let Some(name) = query_param(&request.target, "name").or_else(|| query_param(&request.body, "name")) @@ -477,6 +537,7 @@ fn control_panel_html(control_token: &str, project_id: &str) -> String { }} }} * {{ box-sizing: border-box; }} +[hidden] {{ display: none !important; }} body {{ margin: 0; min-height: 100vh; @@ -596,10 +657,30 @@ button:hover {{ background: var(--accent-strong); }} place-items: center; color: var(--muted); }} +.activity {{ + flex: 1; + min-height: 0; + overflow: auto; + padding: 14px; +}} +.activity-grid {{ display: grid; grid-template-columns: minmax(260px, 1fr) minmax(260px, 1fr); gap: 14px; }} +.activity-panel {{ border: 1px solid var(--line); border-radius: 6px; background: var(--panel); padding: 12px; min-width: 0; }} +.activity h2 {{ margin: 0 0 10px; font-size: 14px; }} +.stats {{ display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-bottom: 14px; }} +.stat {{ border: 1px solid var(--line); border-radius: 6px; padding: 8px; background: var(--panel); min-width: 0; }} +.stat strong, .row strong {{ display: block; font-size: 18px; }} +.row {{ border-top: 1px solid var(--line); padding: 8px 0; color: var(--muted); overflow-wrap: anywhere; white-space: pre-wrap; }} +.row:first-child {{ border-top: 0; padding-top: 0; }} +.thumbs {{ display: flex; gap: 8px; overflow-x: auto; margin-top: 8px; }} +.thumbs img {{ width: 96px; height: 64px; object-fit: cover; border: 1px solid var(--line); border-radius: 4px; }} +#latestScreenshot {{ width: 100%; max-height: 46vh; object-fit: contain; background: #000; border-radius: 4px; }} +.tab-button {{ margin: 6px 0 0; min-height: 28px; width: auto; padding: 0 10px; font-size: 12px; }} +.error {{ color: #ef4444; }} @media (max-width: 760px) {{ .shell {{ grid-template-columns: 1fr; }} aside {{ border-right: 0; border-bottom: 1px solid var(--line); }} main {{ min-height: 70vh; }} + .activity-grid, .stats {{ grid-template-columns: 1fr; }} }} @@ -630,6 +711,19 @@ button:hover {{ background: var(--accent-strong); }} + diff --git a/src/mcp/tools.rs b/src/mcp/tools.rs new file mode 100644 index 0000000..70127e7 --- /dev/null +++ b/src/mcp/tools.rs @@ -0,0 +1,209 @@ +use super::activity; +use super::McpRuntime; +use crate::cdp::CdpClient; +use crate::shared_browser::SharedBrowserClient; +use anyhow::{anyhow, Context, Result}; +use serde_json::{json, Value}; + +pub(super) fn tool_definitions() -> Vec { + vec![ + tool( + "browser_list", + "List available browser targets and show which target is active.", + json!({}), + vec![], + ), + tool( + "browser_select", + "Switch the active browser target by name, optionally registering CDP and display endpoints first.", + json!({ + "name": { "type": "string", "description": "Browser target name, e.g. managed or personal" }, + "cdp_endpoint": { "type": "string", "description": "Optional CDP endpoint to register for this browser name" }, + "vnc_endpoint": { "type": "string", "description": "Optional VNC endpoint to register as HOST:PORT" }, + "novnc_url": { "type": "string", "description": "Optional pre-existing noVNC URL for this browser name" }, + "share_url": { "type": "string", "description": "Optional shared browser extension link for this browser name" } + }), + vec!["name"], + ), + tool( + "browser_navigate", + "Navigate the active browser page to a URL through the Rust CDP adapter.", + json!({ "url": { "type": "string", "description": "Absolute URL to open" } }), + vec!["url"], + ), + tool( + "browser_snapshot", + "Return page title, URL, visible text and simple interactive element selectors.", + json!({}), + vec![], + ), + tool( + "browser_evaluate", + "Evaluate JavaScript in the current page and return a JSON/text result.", + json!({ "expression": { "type": "string", "description": "JavaScript expression" } }), + vec!["expression"], + ), + tool( + "browser_click", + "Click an element by CSS selector in the current page.", + json!({ "selector": { "type": "string", "description": "CSS selector" } }), + vec!["selector"], + ), + tool( + "browser_type", + "Set text in an input-like element by CSS selector and dispatch input/change events.", + json!({ + "selector": { "type": "string", "description": "CSS selector" }, + "text": { "type": "string", "description": "Text to type" } + }), + vec!["selector", "text"], + ), + tool( + "browser_press_key", + "Press a key through CDP Input.dispatchKeyEvent.", + json!({ "key": { "type": "string", "description": "Key name, e.g. Enter or a" } }), + vec!["key"], + ), + tool( + "browser_take_screenshot", + "Capture a PNG screenshot and return it as a data URL.", + json!({ "full_page": { "type": "boolean", "description": "Capture beyond viewport", "default": true } }), + vec![], + ), + tool( + "browser_list_tabs", + "List tabs and windows visible to the active shared browser extension.", + json!({}), + vec![], + ), + tool( + "browser_activate_tab", + "Activate a tab in the active shared browser extension.", + json!({ "tab_id": { "type": "integer", "description": "Chrome tab id to activate" } }), + vec!["tab_id"], + ), + ] +} + +fn tool(name: &str, description: &str, properties: Value, required: Vec<&str>) -> Value { + json!({ + "name": name, + "description": description, + "inputSchema": { + "type": "object", + "properties": properties, + "required": required + } + }) +} + +pub(super) fn handle_tool_call(runtime: &mut McpRuntime, request: &Value) -> Value { + let params = request.get("params").unwrap_or(&Value::Null); + let name = params.get("name").and_then(Value::as_str).unwrap_or(""); + let arguments = params.get("arguments").unwrap_or(&Value::Null); + let started_at_ms = activity::now_ms(); + + let result = match name { + "browser_list" => runtime.browser_inventory_text(), + "browser_select" => runtime.select_browser( + required_str(arguments, "name").unwrap_or(""), + arguments.get("cdp_endpoint").and_then(Value::as_str), + arguments.get("vnc_endpoint").and_then(Value::as_str), + arguments.get("novnc_url").and_then(Value::as_str), + arguments.get("share_url").and_then(Value::as_str), + ), + _ => runtime.ensure_active_display().and_then(|_| { + if let Some(share_url) = runtime.active_share_url() { + dispatch_shared_tool(&share_url, name, arguments) + } else { + runtime + .cdp_endpoint() + .and_then(|cdp_endpoint| dispatch_tool(&cdp_endpoint, name, arguments)) + } + }), + }; + + runtime.record_tool_activity(name, arguments, started_at_ms, &result); + + match result { + Ok(text) => tool_result(text, false), + Err(error) => tool_result(format!("{error:#}"), true), + } +} + +fn dispatch_tool(cdp_endpoint: &str, name: &str, arguments: &Value) -> Result { + let client = CdpClient::new(cdp_endpoint); + match name { + "browser_navigate" => client.navigate(required_str(arguments, "url")?), + "browser_snapshot" => client.snapshot(), + "browser_evaluate" => client.evaluate(required_str(arguments, "expression")?), + "browser_click" => client.click(required_str(arguments, "selector")?), + "browser_type" => client.type_text( + required_str(arguments, "selector")?, + required_str(arguments, "text")?, + ), + "browser_press_key" => client.press_key(required_str(arguments, "key")?), + "browser_take_screenshot" => { + let full_page = arguments + .get("full_page") + .and_then(Value::as_bool) + .unwrap_or(true); + client.screenshot(full_page) + } + "browser_list_tabs" | "browser_activate_tab" => Err(anyhow!( + "{name} is only available for shared-extension browsers" + )), + "" => Err(anyhow!("tools/call params.name is required")), + _ => Err(anyhow!("Unknown browser-connection tool: {name}")), + } +} + +fn dispatch_shared_tool(share_url: &str, name: &str, arguments: &Value) -> Result { + let client = SharedBrowserClient::new(share_url); + match name { + "browser_navigate" => client.navigate(required_str(arguments, "url")?), + "browser_snapshot" => client.snapshot(), + "browser_evaluate" => client.evaluate(required_str(arguments, "expression")?), + "browser_click" => client.click(required_str(arguments, "selector")?), + "browser_type" => client.type_text( + required_str(arguments, "selector")?, + required_str(arguments, "text")?, + ), + "browser_press_key" => client.press_key(required_str(arguments, "key")?), + "browser_take_screenshot" => { + let full_page = arguments + .get("full_page") + .and_then(Value::as_bool) + .unwrap_or(true); + client.screenshot(full_page) + } + "browser_list_tabs" => serde_json::to_string_pretty(&client.list_tabs()?) + .context("failed to render shared browser tabs"), + "browser_activate_tab" => client.activate_tab(required_i64(arguments, "tab_id")?), + "" => Err(anyhow!("tools/call params.name is required")), + _ => Err(anyhow!("Unknown browser-connection tool: {name}")), + } +} + +fn required_str<'a>(arguments: &'a Value, name: &str) -> Result<&'a str> { + arguments + .get(name) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| anyhow!("argument `{name}` is required")) +} + +fn required_i64(arguments: &Value, name: &str) -> Result { + arguments + .get(name) + .and_then(Value::as_i64) + .ok_or_else(|| anyhow!("argument `{name}` is required")) +} + +fn tool_result(text: String, is_error: bool) -> Value { + json!({ + "content": [{ "type": "text", "text": text }], + "isError": is_error + }) +} diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 3eb5751..f78159f 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -23,7 +23,7 @@ use tungstenite::{accept_hdr_with_config, connect, Error as WsError, Message, We pub const DEFAULT_RELAY_BIND: &str = "127.0.0.1:8765"; pub const MAX_SESSION_ID_BYTES: usize = 128; pub const MAX_TOKEN_BYTES: usize = 512; -pub const MAX_JSON_MESSAGE_BYTES: usize = 256 * 1024; +pub const MAX_JSON_MESSAGE_BYTES: usize = 8 * 1024 * 1024; pub const MAX_SESSIONS: usize = 1024; #[derive(Debug, Clone, PartialEq, Eq)] @@ -205,6 +205,14 @@ impl SharedBrowserClient { self.call_text("screenshot", json!({ "fullPage": full_page })) } + pub fn list_tabs(&self) -> Result { + self.call("list_tabs", json!({})) + } + + pub fn activate_tab(&self, tab_id: i64) -> Result { + self.call_text("activate_tab", json!({ "tabId": tab_id })) + } + fn call_text(&self, command: &str, params: Value) -> Result { let result = self.call(command, params)?; if let Some(text) = result.as_str() { From 4abd3b28f832b6548db192502de1cc2d8599d135 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Thu, 25 Jun 2026 08:24:50 +0000 Subject: [PATCH 09/29] Separate shared browser tabs by window profile --- artifacts/edge-share-extension.tar.gz | Bin 14200 -> 14562 bytes artifacts/edge-share-extension.zip | Bin 16954 -> 17336 bytes extension/edge-share/README.md | 6 +- extension/edge-share/service_worker.js | 34 +++++++- src/mcp/activity.rs | 105 +++++++++++++++++++++++++ src/mcp/control_panel.rs | 11 ++- 6 files changed, 148 insertions(+), 8 deletions(-) diff --git a/artifacts/edge-share-extension.tar.gz b/artifacts/edge-share-extension.tar.gz index 63b07c813d943145e87a5b48230fce3396e58c01..31e7a3997779d04ab7c5429f8347cb58dba7d31a 100644 GIT binary patch literal 14562 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 M2WOlo*Z}YV0R5)GSpWb4 literal 14200 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�^@Tn~(V+`6w-E5Pcp+W4!i&0-i&n^aV!WhQpyflk~6~ z9Nlvu*BP5~O}qnrSnIdB`tJdMm-PA3BW`T&f8w)T237|v^i55{!$hWc_tqwTgSW@< z_Ub1WL-)jn~1f;RjygBQ= zum6@CkHs~_{RQxwd36nrc8_Jz@ctiAO9KQH000080CP3jTxH!v*`frK5I_i{ktGTa z&_dZEppAeIuFCPL&<&(fKC4Z{!9Zs4eb(7XbFGifSk6CJ$(lVmREy=Yk z6#e&}8B#0Baf>{};*y**XU<&sguV}c8+D*7@0@Ov@s3`0D^0h(3c9LplS-zgUrif) z^vje#>ieW!tWaF>XbQ!ss0TCA$~J#MY#~YRa$kb~4yd>VqFwJ%1n6 zR_(|dx31|;Zz6RjV3!X&G7d(0zp{2my^7>~wHS@b;Nn_KQ~?jc!owT6g&LMNPM$q<>9t3h z&@a0sqC@aY17^0p4q6BW+%QvHY?Gat20B+hgC#K$CF9q&;!%7y`mMWy9dTMc_o_EGz1~ zW=Ut4p$}jhcAP|f`p6z9T7Oa@;nQQ;bS`ikih58%C5>ER;U7cT`ml~rtgh*LIYqVF zBLg5XqyVL7$*Zh1MR7#_w2@`sLqVpqr`~q;o#fN;}P*vgo|i=gDji4|ZvAF1$L7z8#h*`m-4?LD#ZWEat_%nSVc!)3^-ZFJ!&YblvfZ zW76`m5f{8*YUHz1cV?wf_3LT<`C0YPA(*+)OsN1yHY_Ia5<64HHi$`$n0M zRn-ej1=A&}ZS}y?$ukBunT6cx%lEHQLbXO^}|h$OB*y~ zcN!T*3l;TOU(n5OKhk1{lDkyMnHkIP=bM*5=6}%}G;t$V2^sf((5th|mIds0tfr$2 zvmj$uh(l^-IY)H!kR}Viy@n52hN-L@UkzEpnRw=A}^sjy1^J$l3Mg zbbo*}kF-jj75-mLl zkje8PP|1+O0}gXPS_|_*Z{Q&1+gNsk4?^6H^olZcOmCZJcKo{FEi)8FAN2kQJ2rTv z(GIS1x#SuKI}-K{`clw5z|$W7j8ha<1b?PQX9r{F+T#!+9^IIS@bXm8 z1UZGiyv+|fT)K9C>!u6yWDouP3j|P00|b)}K^U{%HpU1JvqITiK;vWd7#;us#dnjk zKQ#gp<&&{N9g_w?9s*w`lO{k{15PUdlYuH2lbApvAkaeDT&ergaDfK^0G|*502BZi z00000009610JMQ|Fq7Iq8v;k=ld(Y^lN3Q713)+clixNQlTblG11>rMlg&68ldM5N W142Cjli@oblMX^A1`R*}0000n5>D9w delta 9529 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 XS_8y80Fz%mACrtjCI*i_00000Vk(7i diff --git a/extension/edge-share/README.md b/extension/edge-share/README.md index 38f8701..1f73993 100644 --- a/extension/edge-share/README.md +++ b/extension/edge-share/README.md @@ -100,7 +100,8 @@ last selected tab or the active tab in the last focused window. - `press_key`: requires `key`; dispatches common keyboard events through CDP. - `screenshot`: returns a base64 PNG by default, or JPEG with `format: "jpeg"`. -- `list_tabs`: returns basic tab metadata. +- `list_tabs`: returns windows with nested tabs plus a flat `tabs` list. Window + and tab metadata includes `regular`/`incognito` when Edge exposes it. - `activate_tab`: activates `tabId` or the current target tab. ## Notes and limits @@ -111,6 +112,9 @@ last selected tab or the active tab in the last focused window. remote debugging port. - Pages such as `edge://`, extension pages, store pages, and policy-restricted tabs may reject debugger, scripting, or screenshot actions. +- Edge/Chrome extensions cannot read the human profile name. A loaded extension + instance represents one browser profile; incognito windows are visible only + when the user enables the extension in InPrivate/Incognito mode. - The share link should be treated as a bearer credential. Anyone with the link can control the shared session until the user clicks `Stop` or the relay expires the session. diff --git a/extension/edge-share/service_worker.js b/extension/edge-share/service_worker.js index 08a902b..bf5d906 100644 --- a/extension/edge-share/service_worker.js +++ b/extension/edge-share/service_worker.js @@ -695,8 +695,14 @@ async function commandScreenshot(params) { } async function commandListTabs() { - const tabs = await chromeCall(chrome.tabs.query, chrome.tabs, {}); - return { tabs: tabs.map(tabSummary) }; + const windows = await chromeCall(chrome.windows.getAll, chrome.windows, { + populate: true + }); + const summaries = windows.map(windowSummary); + return { + windows: summaries, + tabs: summaries.flatMap((window) => window.tabs) + }; } async function commandActivateTab(params) { @@ -746,11 +752,33 @@ async function currentTabSummary(tabId) { return tabSummary(tab); } -function tabSummary(tab) { +function windowSummary(window) { + return { + id: window.id, + focused: window.focused, + incognito: window.incognito, + profile: window.incognito ? "incognito" : "regular", + type: window.type || "", + state: window.state || "", + top: window.top, + left: window.left, + width: window.width, + height: window.height, + tabs: (window.tabs || []).map((tab) => tabSummary(tab, window)) + }; +} + +function tabSummary(tab, window) { return { id: tab.id, windowId: tab.windowId, active: tab.active, + index: tab.index, + incognito: tab.incognito || window?.incognito || false, + profile: tab.incognito || window?.incognito ? "incognito" : "regular", + pinned: tab.pinned || false, + audible: tab.audible || false, + discarded: tab.discarded || false, title: tab.title || "", url: tab.url || "", status: tab.status || "" diff --git a/src/mcp/activity.rs b/src/mcp/activity.rs index c5e7876..8a722d7 100644 --- a/src/mcp/activity.rs +++ b/src/mcp/activity.rs @@ -231,6 +231,33 @@ fn tab_inventory(value: Value) -> Value { .and_then(Value::as_array) .cloned() .unwrap_or_default(); + if let Some(windows) = value.get("windows").and_then(Value::as_array) { + let windows = windows + .iter() + .cloned() + .map(normalize_window) + .collect::>(); + let tabs = if tabs.is_empty() { + tabs_from_windows(&windows) + } else { + tabs + }; + let active_tab = focused_active_tab(&windows) + .or_else(|| { + tabs.iter() + .find(|tab| tab.get("active").and_then(Value::as_bool) == Some(true)) + .cloned() + }) + .unwrap_or(Value::Null); + return json!({ + "totalTabs": tabs.len(), + "totalWindows": windows.len(), + "activeTab": active_tab, + "windows": windows, + "tabs": tabs, + }); + } + let mut windows = BTreeMap::>::new(); let mut active_tab = Value::Null; @@ -266,6 +293,51 @@ fn tab_inventory(value: Value) -> Value { }) } +fn focused_active_tab(windows: &[Value]) -> Option { + windows + .iter() + .find(|window| window.get("focused").and_then(Value::as_bool) == Some(true)) + .and_then(|window| { + window + .get("tabs") + .and_then(Value::as_array) + .and_then(|tabs| { + tabs.iter() + .find(|tab| tab.get("active").and_then(Value::as_bool) == Some(true)) + .cloned() + }) + }) +} + +fn tabs_from_windows(windows: &[Value]) -> Vec { + windows + .iter() + .filter_map(|window| window.get("tabs").and_then(Value::as_array)) + .flatten() + .cloned() + .collect() +} + +fn normalize_window(mut window: Value) -> Value { + let tab_count = window + .get("tabs") + .and_then(Value::as_array) + .map(Vec::len) + .unwrap_or(0); + let active = window + .get("tabs") + .and_then(Value::as_array) + .is_some_and(|tabs| { + tabs.iter() + .any(|tab| tab.get("active").and_then(Value::as_bool) == Some(true)) + }); + if let Some(object) = window.as_object_mut() { + object.insert("tabCount".to_string(), json!(tab_count)); + object.insert("active".to_string(), json!(active)); + } + window +} + fn truncate_text(text: &str, max_chars: usize) -> String { let mut output = String::new(); for (index, ch) in text.chars().enumerate() { @@ -312,4 +384,37 @@ mod tests { assert_eq!(inventory["totalWindows"], 2); assert_eq!(inventory["activeTab"]["id"], 1); } + + #[test] + fn preserves_window_metadata_from_extension() { + let inventory = tab_inventory(json!({ + "windows": [{ + "id": 10, + "focused": true, + "incognito": true, + "profile": "incognito", + "type": "normal", + "tabs": [{"id": 1, "windowId": 10, "active": true}] + }], + "tabs": [{"id": 1, "windowId": 10, "active": true}] + })); + + assert_eq!(inventory["totalWindows"], 1); + assert_eq!(inventory["windows"][0]["incognito"], true); + assert_eq!(inventory["windows"][0]["profile"], "incognito"); + assert_eq!(inventory["windows"][0]["tabCount"], 1); + } + + #[test] + fn active_tab_prefers_focused_window() { + let inventory = tab_inventory(json!({ + "windows": [ + {"id": 10, "focused": false, "tabs": [{"id": 1, "active": true}]}, + {"id": 11, "focused": true, "tabs": [{"id": 2, "active": true}]} + ] + })); + + assert_eq!(inventory["totalTabs"], 2); + assert_eq!(inventory["activeTab"]["id"], 2); + } } diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index 3f386ad..26801a9 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -887,10 +887,13 @@ function renderScreenshot(latest, shots) {{ function renderTabs(windows) {{ const rows = []; - for (const win of windows) for (const tab of win.tabs || []) {{ - const row = el("div", {{ className: "row" }}, (tab.active ? "Active: " : "") + (tab.title || "(untitled)") + "\\n" + (tab.url || "")); - row.appendChild(el("button", {{ className: "tab-button", onclick: () => activateTab(tab.id) }}, "Activate")); - rows.push(row); + for (const win of windows) {{ + rows.push(el("div", {{ className: "row" }}, "Window " + (win.windowId ?? win.id ?? "-") + " " + (win.profile || (win.incognito ? "incognito" : "regular")) + " " + (win.focused ? "focused " : "") + (win.type || "") + " " + (win.state || "") + "\\n" + (win.tabCount || 0) + " tabs")); + for (const tab of win.tabs || []) {{ + const row = el("div", {{ className: "row" }}, (tab.active ? "Active: " : "") + (tab.profile || "") + " " + (tab.title || "(untitled)") + "\\n" + (tab.url || "")); + row.appendChild(el("button", {{ className: "tab-button", onclick: () => activateTab(tab.id) }}, "Activate")); + rows.push(row); + }} }} document.getElementById("tabsList").replaceChildren(...rows); }} From 2251cc4b8ad1630204139b7193b1cc752faa8de9 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Thu, 25 Jun 2026 08:31:04 +0000 Subject: [PATCH 10/29] Render shared tabs as window groups --- src/mcp/control_panel.rs | 190 +++++++++------------------------------ 1 file changed, 42 insertions(+), 148 deletions(-) diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index 26801a9..ffa168e 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -515,154 +515,33 @@ fn control_panel_html(control_token: &str, project_id: &str) -> String { browser-connection +

+
+
+ + Recording 0 actions +
+ +
+
+

User actions are being recorded for the agent.

+
+ + + +
+
+
+ + `; + + overlay.host = host; + overlay.shadow = shadow; + document.documentElement.appendChild(host); + + shadow.getElementById("stopButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + sendRuntimeMessage({ type: "stop_recording" }) + .then((recording) => renderRecorderOverlay(overlay, recording)) + .catch(() => refreshRecorderOverlay(overlay)); + }); + + shadow.getElementById("clearButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + sendRuntimeMessage({ type: "clear_recording" }) + .then((recording) => renderRecorderOverlay(overlay, recording)) + .catch(() => refreshRecorderOverlay(overlay)); + }); + + shadow.getElementById("copyButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + copyRecordedScript(overlay); + }); + + shadow.getElementById("minimizeButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + overlay.prefs.minimized = true; + saveOverlayPrefs(overlay.prefs); + renderRecorderOverlay(overlay, overlay.state); + }); + + shadow.getElementById("restoreButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + overlay.prefs.minimized = false; + saveOverlayPrefs(overlay.prefs); + renderRecorderOverlay(overlay, overlay.state); + }); + + shadow.getElementById("dragHandle").addEventListener("pointerdown", (event) => { + beginOverlayDrag(event, overlay); + }); + shadow.getElementById("restoreButton").addEventListener("pointerdown", (event) => { + beginOverlayDrag(event, overlay); + }); +} + +function refreshRecorderOverlay(overlay) { + if (!overlay.host) { + return; + } + sendRuntimeMessage({ type: "get_recording" }) + .then((recording) => renderRecorderOverlay(overlay, recording)) + .catch(() => { + if (overlay.host) { + overlay.host.style.display = "none"; + } + }); +} + +function renderRecorderOverlay(overlay, recording) { + if (!overlay.host || !overlay.shadow) { + return; + } + + overlay.state = { + ...overlay.state, + ...(recording || {}) + }; + + const recordingActive = !!overlay.state.recording; + overlay.host.style.display = recordingActive ? "block" : "none"; + overlay.host.classList.toggle("is-minimized", !!overlay.prefs.minimized); + + const count = Number(overlay.state.count || 0); + const label = `${count} ${count === 1 ? "action" : "actions"}`; + overlay.shadow.getElementById("statusText").textContent = `Recording ${label}`; + overlay.shadow.getElementById("pillText").textContent = `REC ${count}`; +} + +function beginOverlayDrag(event, overlay) { + if (!overlay.host || event.button !== 0) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + const rect = overlay.host.getBoundingClientRect(); + overlay.dragging = { + pointerId: event.pointerId, + startX: event.clientX, + startY: event.clientY, + left: rect.left, + top: rect.top + }; + + const move = (moveEvent) => moveOverlay(moveEvent, overlay); + const up = (upEvent) => { + if (!overlay.dragging || upEvent.pointerId !== overlay.dragging.pointerId) { + return; + } + document.removeEventListener("pointermove", move, true); + document.removeEventListener("pointerup", up, true); + overlay.dragging = null; + saveOverlayPrefs(overlay.prefs); + }; + + document.addEventListener("pointermove", move, true); + document.addEventListener("pointerup", up, true); +} + +function moveOverlay(event, overlay) { + if (!overlay.host || !overlay.dragging || event.pointerId !== overlay.dragging.pointerId) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + const width = overlay.host.offsetWidth || 300; + const height = overlay.host.offsetHeight || 120; + const left = clampNumber( + overlay.dragging.left + event.clientX - overlay.dragging.startX, + 8, + Math.max(8, window.innerWidth - width - 8) + ); + const top = clampNumber( + overlay.dragging.top + event.clientY - overlay.dragging.startY, + 8, + Math.max(8, window.innerHeight - height - 8) + ); + + overlay.prefs.left = Math.round(left); + overlay.prefs.top = Math.round(top); + applyOverlayPosition(overlay.host, overlay.prefs); +} + +function applyOverlayPosition(host, prefs) { + if (Number.isFinite(prefs.left) && Number.isFinite(prefs.top)) { + host.style.left = `${prefs.left}px`; + host.style.top = `${prefs.top}px`; + host.style.right = "auto"; + host.style.bottom = "auto"; + return; + } + host.style.left = "auto"; + host.style.top = "auto"; + host.style.right = "16px"; + host.style.bottom = "16px"; +} + +function readOverlayPrefs() { + return new Promise((resolve) => { + chrome.storage.local.get(RECORDER_OVERLAY_STORAGE_KEY, (items) => { + const prefs = items && items[RECORDER_OVERLAY_STORAGE_KEY]; + resolve(prefs && typeof prefs === "object" ? prefs : {}); + }); + }); +} + +function saveOverlayPrefs(prefs) { + chrome.storage.local.set({ + [RECORDER_OVERLAY_STORAGE_KEY]: { + left: Number.isFinite(prefs.left) ? prefs.left : null, + top: Number.isFinite(prefs.top) ? prefs.top : null, + minimized: !!prefs.minimized + } + }); +} + +function copyRecordedScript(overlay) { + const script = String(overlay.state.script || ""); + if (!script) { + return; + } + + const button = overlay.shadow.getElementById("copyButton"); + copyText(script).then(() => { + button.classList.add("copied"); + button.textContent = "Copied"; + setTimeout(() => { + button.classList.remove("copied"); + button.textContent = "Copy"; + }, 1200); + }); +} + +function copyText(text) { + if (navigator.clipboard && window.isSecureContext) { + return navigator.clipboard.writeText(text); + } + + const textarea = document.createElement("textarea"); + textarea.value = text; + textarea.setAttribute("readonly", "true"); + textarea.style.position = "fixed"; + textarea.style.left = "-9999px"; + document.documentElement.appendChild(textarea); + textarea.select(); + document.execCommand("copy"); + textarea.remove(); + return Promise.resolve(); +} + +function sendRuntimeMessage(message) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage(message, (response) => { + const runtimeError = chrome.runtime.lastError; + if (runtimeError) { + reject(new Error(runtimeError.message)); + return; + } + if (!response || response.ok !== true) { + reject(new Error((response && response.error) || "Extension message failed")); + return; + } + resolve(response.result); + }); + }); +} + +function isRecorderOverlayEvent(event) { + if (!event || typeof event.composedPath !== "function") { + return false; + } + return event.composedPath().some((node) => { + return node && node.nodeType === Node.ELEMENT_NODE && node.id === RECORDER_OVERLAY_ID; + }); +} + +function clampNumber(value, min, max) { + return Math.min(Math.max(value, min), max); +} + +function recordFill(element) { + if (isSensitiveEditable(element)) return; + const value = elementValue(element); + recordAction({ + kind: "fill", + selector: bestSelector(element), + text: value, + label: elementLabel(element), + tag: element.tagName.toLowerCase() + }); +} + +function recordAction(action) { + if (!/^https?:\/\//i.test(location.href)) return; + chrome.runtime.sendMessage({ + type: "recorder_action", + action: { + ...action, + url: location.href, + title: document.title || "" + } + }, () => { + void chrome.runtime.lastError; + }); +} + +function closestRecordableElement(node) { + if (!node || node.nodeType !== Node.ELEMENT_NODE) { + return null; + } + return node.closest("a,button,input,textarea,select,[role='button'],[contenteditable='true'],[data-testid],[data-test],[data-qa]"); +} + +function isEditable(element) { + const tag = element.tagName.toLowerCase(); + return element.isContentEditable || tag === "input" || tag === "textarea" || tag === "select"; +} + +function isSensitiveEditable(element) { + const haystack = [ + element.type, + element.name, + element.id, + element.getAttribute("autocomplete"), + element.getAttribute("aria-label"), + element.getAttribute("placeholder") + ].join(" ").toLowerCase(); + return /\b(password|passwd|token|secret|otp|2fa|mfa|code)\b/.test(haystack); +} + +function elementValue(element) { + if (element.isContentEditable) return element.innerText || ""; + if ("value" in element) return element.value || ""; + return ""; +} + +function shouldRecordKey(event) { + if (event.isComposing) return false; + if (event.ctrlKey || event.metaKey || event.altKey) return true; + return [ + "Enter", + "Escape", + "Tab", + "ArrowUp", + "ArrowDown", + "ArrowLeft", + "ArrowRight", + "Backspace", + "Delete" + ].includes(event.key); +} + +function keyName(event) { + const parts = []; + if (event.ctrlKey) parts.push("Control"); + if (event.metaKey) parts.push("Meta"); + if (event.altKey) parts.push("Alt"); + if (event.shiftKey && event.key !== "Shift") parts.push("Shift"); + parts.push(event.key); + return parts.join("+"); +} + +function bestSelector(element) { + const direct = stableSelector(element); + if (direct) return direct; + const labelled = labelledSelector(element); + if (labelled) return labelled; + return cssPath(element); +} + +function stableSelector(element) { + for (const name of ["data-testid", "data-test", "data-qa", "data-cy"]) { + const value = element.getAttribute(name); + if (value) return `[${name}="${cssString(value)}"]`; + } + if (element.id) return `#${cssIdent(element.id)}`; + if (element.getAttribute("name")) { + return `${element.tagName.toLowerCase()}[name="${cssString(element.getAttribute("name"))}"]`; + } + return ""; +} + +function labelledSelector(element) { + const label = element.getAttribute("aria-label") || element.getAttribute("placeholder") || element.getAttribute("title"); + if (!label) return ""; + return `${element.tagName.toLowerCase()}[${element.getAttribute("aria-label") ? "aria-label" : element.getAttribute("placeholder") ? "placeholder" : "title"}="${cssString(label)}"]`; +} + +function cssPath(element) { + const parts = []; + let current = element; + while (current && current.nodeType === Node.ELEMENT_NODE && parts.length < 5) { + let part = current.tagName.toLowerCase(); + if (current.classList.length > 0) { + part += `.${cssIdent(current.classList[0])}`; + } + const parent = current.parentElement; + if (parent) { + const siblings = Array.from(parent.children).filter((child) => child.tagName === current.tagName); + if (siblings.length > 1) { + part += `:nth-of-type(${siblings.indexOf(current) + 1})`; + } + } + parts.unshift(part); + current = parent; + } + return parts.join(" > "); +} + +function elementLabel(element) { + return String( + element.getAttribute("aria-label") || + element.getAttribute("alt") || + element.getAttribute("title") || + element.getAttribute("placeholder") || + element.innerText || + element.value || + "" + ).replace(/\s+/g, " ").trim().slice(0, 300); +} + +function cssIdent(value) { + if (window.CSS && typeof CSS.escape === "function") { + return CSS.escape(String(value)); + } + return String(value).replace(/[^a-zA-Z0-9_-]/g, "\\$&"); +} + +function cssString(value) { + return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"'); +} diff --git a/extension/edge-share/popup.html b/extension/edge-share/popup.html index 61b443a..9b55dfa 100644 --- a/extension/edge-share/popup.html +++ b/extension/edge-share/popup.html @@ -89,6 +89,50 @@ gap: 8px; } + .recorder { + display: grid; + gap: 8px; + border-top: 1px solid #d0d7de; + padding-top: 12px; + } + + .recorder-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + } + + .recorder-head strong { + font-size: 14px; + } + + .recording-pill { + border: 1px solid #d0d7de; + border-radius: 999px; + padding: 3px 8px; + color: #57606a; + font-size: 12px; + font-weight: 700; + } + + .recording-pill.active { + border-color: #1a7f37; + color: #1a7f37; + } + + .record-actions { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: 8px; + } + + .recorder-note { + margin: 0; + color: #57606a; + line-height: 1.35; + } + button { border: 1px solid #d0d7de; border-radius: 6px; @@ -150,6 +194,24 @@ .note { color: #8b949e; } + + .recorder-note { + color: #8b949e; + } + + .recorder { + border-color: #30363d; + } + + .recording-pill { + border-color: #30363d; + color: #8b949e; + } + + .recording-pill.active { + border-color: #3fb950; + color: #3fb950; + } } @@ -178,6 +240,21 @@

Edge Share

+
+
+ Action recorder + idle +
+
+ + + + +
+

After Record starts, a floating recorder stays visible on each supported page.

+ +
+

Keep Edge open while sharing. Anyone with the share link can control this browser session through the relay.

diff --git a/extension/edge-share/popup.js b/extension/edge-share/popup.js index bda8f7c..12e6bcd 100644 --- a/extension/edge-share/popup.js +++ b/extension/edge-share/popup.js @@ -7,16 +7,27 @@ const shareUrlInput = document.getElementById("shareUrl"); const shareButton = document.getElementById("shareButton"); const stopButton = document.getElementById("stopButton"); const copyButton = document.getElementById("copyButton"); +const recordButton = document.getElementById("recordButton"); +const stopRecordButton = document.getElementById("stopRecordButton"); +const clearRecordButton = document.getElementById("clearRecordButton"); +const copyScriptButton = document.getElementById("copyScriptButton"); +const recordingStatus = document.getElementById("recordingStatus"); +const recordedScript = document.getElementById("recordedScript"); const statusDot = document.getElementById("statusDot"); const statusText = document.getElementById("statusText"); const errorText = document.getElementById("errorText"); let currentState = null; +let currentRecording = null; document.addEventListener("DOMContentLoaded", () => { shareButton.addEventListener("click", onShare); stopButton.addEventListener("click", onStop); copyButton.addEventListener("click", onCopy); + recordButton.addEventListener("click", onRecord); + stopRecordButton.addEventListener("click", onStopRecord); + clearRecordButton.addEventListener("click", onClearRecord); + copyScriptButton.addEventListener("click", onCopyScript); refreshState(); setInterval(refreshState, 1000); @@ -78,10 +89,74 @@ async function onCopy() { } } +async function onRecord() { + setBusy(true); + clearError(); + + try { + const response = await sendMessage({ type: "start_recording" }); + renderRecording(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onStopRecord() { + setBusy(true); + clearError(); + + try { + const response = await sendMessage({ type: "stop_recording" }); + renderRecording(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onClearRecord() { + setBusy(true); + clearError(); + + try { + const response = await sendMessage({ type: "clear_recording" }); + renderRecording(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onCopyScript() { + clearError(); + + try { + const script = recordedScript.value.trim(); + if (!script) { + throw new Error("No recorded script to copy"); + } + await navigator.clipboard.writeText(script); + copyScriptButton.textContent = "Copied"; + setTimeout(() => { + copyScriptButton.textContent = "Copy script"; + }, 1200); + } catch (error) { + showError(error); + } +} + async function refreshState() { try { - const response = await sendMessage({ type: "get_state" }); - renderState(response); + const [stateResponse, recordingResponse] = await Promise.all([ + sendMessage({ type: "get_state" }), + sendMessage({ type: "get_recording" }) + ]); + renderState(stateResponse); + renderRecording(recordingResponse); } catch (error) { showError(error); } @@ -103,6 +178,8 @@ function renderState(state) { statusText.textContent = statusLabel(currentState); stopButton.disabled = !currentState.sharing; copyButton.disabled = !currentState.shareUrl; + recordButton.disabled = false; + stopRecordButton.disabled = !currentState.recording; if (currentState.lastError) { showError(currentState.lastError); @@ -111,6 +188,17 @@ function renderState(state) { } } +function renderRecording(recording) { + currentRecording = recording || {}; + const count = currentRecording.count || 0; + recordingStatus.textContent = currentRecording.recording ? `recording ${count}` : `idle ${count}`; + recordingStatus.classList.toggle("active", !!currentRecording.recording); + recordedScript.value = currentRecording.script || ""; + stopRecordButton.disabled = !currentRecording.recording; + clearRecordButton.disabled = count === 0 && !currentRecording.recording; + copyScriptButton.disabled = !recordedScript.value.trim(); +} + function statusLabel(state) { if (!state) { return "Unknown"; @@ -139,6 +227,10 @@ function setBusy(busy) { shareButton.disabled = busy; stopButton.disabled = busy || !(currentState && currentState.sharing); copyButton.disabled = busy || !(currentState && currentState.shareUrl); + recordButton.disabled = busy; + stopRecordButton.disabled = busy || !(currentRecording && currentRecording.recording); + clearRecordButton.disabled = busy || !(currentRecording && (currentRecording.count || currentRecording.recording)); + copyScriptButton.disabled = busy || !recordedScript.value.trim(); } function sendMessage(message) { diff --git a/extension/edge-share/provider.js b/extension/edge-share/provider.js index 45f0034..1463eea 100644 --- a/extension/edge-share/provider.js +++ b/extension/edge-share/provider.js @@ -7,6 +7,7 @@ const SOURCE_PAGE = "browser-connection:page"; const SOURCE_CONTENT = "browser-connection:content"; + const SOURCE_RECORDER = "browser-connection:recorder"; const pending = new Map(); let nextId = 1; @@ -70,4 +71,45 @@ }); window.dispatchEvent(new Event("browserConnection#initialized")); + + installNavigationRecorder(); + + function installNavigationRecorder() { + if (window.__browserConnectionRecorderInstalled) { + return; + } + Object.defineProperty(window, "__browserConnectionRecorderInstalled", { + value: true, + enumerable: false, + configurable: false, + writable: false + }); + + const notify = () => { + window.postMessage( + { + source: SOURCE_RECORDER, + kind: "navigate", + href: location.href, + title: document.title || "" + }, + window.location.origin + ); + }; + + const pushState = history.pushState; + const replaceState = history.replaceState; + history.pushState = function (...args) { + const result = pushState.apply(this, args); + queueMicrotask(notify); + return result; + }; + history.replaceState = function (...args) { + const result = replaceState.apply(this, args); + queueMicrotask(notify); + return result; + }; + window.addEventListener("popstate", notify); + window.addEventListener("hashchange", notify); + } })(); diff --git a/extension/edge-share/service_worker.js b/extension/edge-share/service_worker.js index bf5d906..51f530b 100644 --- a/extension/edge-share/service_worker.js +++ b/extension/edge-share/service_worker.js @@ -8,6 +8,7 @@ const RECONNECT_MAX_MS = 30000; const RELAY_KEEPALIVE_MS = 20 * 1000; const PLATFORM_CONNECT_TTL_MS = 2 * 60 * 1000; const PLATFORM_RELAY_CONNECT_TIMEOUT_MS = 8000; +const MAX_RECORDED_ACTIONS = 500; let state = { sharing: false, @@ -25,6 +26,11 @@ let state = { workspaceId: "", poolId: "", browserName: "", + recording: false, + recordingTabId: null, + recordingStartedAt: "", + recordingStoppedAt: "", + recordedActions: [], updatedAt: "" }; @@ -69,10 +75,35 @@ async function handleExtensionMessage(message, sender) { return publicState(); } + if (message.type === "get_recording") { + await restoreState(); + return recordingState(); + } + if (message.type === "start_share") { return startShare(message.relayUrl || DEFAULT_RELAY_URL); } + if (message.type === "start_recording") { + await restoreState(); + return startRecording(); + } + + if (message.type === "stop_recording") { + await restoreState(); + return stopRecording(); + } + + if (message.type === "clear_recording") { + await restoreState(); + return clearRecording(); + } + + if (message.type === "recorder_action") { + await restoreState(); + return recordContentAction(message.action || {}, sender); + } + if (message.type === "platform_request") { return handlePlatformRequest(message, sender); } @@ -153,6 +184,9 @@ async function stopShare() { shareUrl: "", status: "stopped", lastError: "", + recording: false, + recordingTabId: null, + recordingStoppedAt: new Date().toISOString(), platformOrigin: "", platformHref: "", workspaceId: "", @@ -194,6 +228,11 @@ function publicState() { status: state.status, lastError: state.lastError, activeTabId: state.activeTabId, + recording: state.recording, + recordingTabId: state.recordingTabId, + recordingCount: Array.isArray(state.recordedActions) ? state.recordedActions.length : 0, + recordingStartedAt: state.recordingStartedAt, + recordingStoppedAt: state.recordingStoppedAt, platformOrigin: state.platformOrigin, workspaceId: state.workspaceId, poolId: state.poolId, @@ -213,6 +252,33 @@ function notifyPopup() { } } +function notifyRecordingChanged() { + const message = { + type: "recording_state_changed", + recording: recordingState() + }; + + try { + chrome.tabs.query({}, (tabs) => { + const error = chrome.runtime.lastError; + if (error || !Array.isArray(tabs)) { + return; + } + for (const tab of tabs) { + if (!Number.isInteger(tab.id) || !isRecordableUrl(tab.url || "")) { + continue; + } + chrome.tabs.sendMessage(tab.id, message, () => { + // Some pages will not have this content script yet. + void chrome.runtime.lastError; + }); + } + }); + } catch (_error) { + // Tabs may be unavailable in restricted extension contexts. + } +} + function connectIfNeeded() { if (state.sharing) { connectRelay(); @@ -560,6 +626,18 @@ async function handleCommand(command, params) { if (command === "activate_tab") { return commandActivateTab(params); } + if (command === "start_recording") { + return startRecording(params); + } + if (command === "stop_recording") { + return stopRecording(); + } + if (command === "clear_recording") { + return clearRecording(); + } + if (command === "recording_state") { + return recordingState(); + } throw new Error(`Unsupported command: ${command}`); } @@ -713,6 +791,176 @@ async function commandActivateTab(params) { return { tab: tabSummary(tab) }; } +async function startRecording(params = {}) { + const tabId = Number.isInteger(params.tabId) ? params.tabId : await getTargetTabId({}); + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + const startedAt = new Date().toISOString(); + const actions = []; + if (tab.url && isRecordableUrl(tab.url)) { + actions.push(recordedAction("navigate", { + url: tab.url, + title: tab.title || "", + tabId, + windowId: tab.windowId + })); + } + + await persistState({ + recording: true, + recordingTabId: null, + recordingStartedAt: startedAt, + recordingStoppedAt: "", + recordedActions: actions, + activeTabId: tabId + }); + + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function stopRecording() { + await persistState({ + recording: false, + recordingStoppedAt: new Date().toISOString() + }); + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function clearRecording() { + await persistState({ + recording: false, + recordingTabId: null, + recordingStartedAt: "", + recordingStoppedAt: "", + recordedActions: [] + }); + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function recordContentAction(action, sender) { + if (!state.recording || !sender?.tab || !Number.isInteger(sender.tab.id)) { + return { recorded: false }; + } + if (!isRecordableUrl(sender.tab.url || action.url || "")) { + return { recorded: false }; + } + + const normalized = recordedAction(action.kind, { + ...action, + tabId: sender.tab.id, + windowId: sender.tab.windowId, + title: action.title || sender.tab.title || "", + url: action.url || sender.tab.url || "" + }); + if (!normalized) { + return { recorded: false }; + } + + const actions = Array.isArray(state.recordedActions) ? [...state.recordedActions] : []; + upsertRecordedAction(actions, normalized); + while (actions.length > MAX_RECORDED_ACTIONS) { + actions.shift(); + } + + await persistState({ recordedActions: actions, activeTabId: sender.tab.id }); + notifyRecordingChanged(); + return { recorded: true, action: normalized, count: actions.length }; +} + +function recordingState() { + const actions = Array.isArray(state.recordedActions) ? state.recordedActions : []; + return { + recording: state.recording, + tabId: state.recordingTabId, + startedAt: state.recordingStartedAt, + stoppedAt: state.recordingStoppedAt, + count: actions.length, + actions, + script: renderRecordedPlaywright(actions) + }; +} + +function recordedAction(kind, fields) { + const actionKind = String(kind || ""); + if (!["navigate", "click", "fill", "press"].includes(actionKind)) { + return null; + } + const action = { + id: randomHex(6), + kind: actionKind, + at: new Date().toISOString(), + url: String(fields.url || "").slice(0, 4096), + title: String(fields.title || "").slice(0, 512), + tabId: Number.isInteger(fields.tabId) ? fields.tabId : null, + windowId: Number.isInteger(fields.windowId) ? fields.windowId : null + }; + if (fields.selector) action.selector = String(fields.selector).slice(0, 1024); + if (fields.text !== undefined) action.text = String(fields.text).slice(0, 4096); + if (fields.key) action.key = String(fields.key).slice(0, 128); + if (fields.label) action.label = String(fields.label).slice(0, 512); + if (fields.tag) action.tag = String(fields.tag).slice(0, 64); + return action; +} + +function upsertRecordedAction(actions, action) { + const previous = actions[actions.length - 1]; + if ( + previous && + action.kind === "fill" && + previous.kind === "fill" && + previous.selector === action.selector + ) { + actions[actions.length - 1] = { ...previous, ...action, id: previous.id }; + return; + } + if ( + previous && + action.kind === "navigate" && + previous.kind === "navigate" && + previous.url === action.url + ) { + return; + } + actions.push(action); +} + +function renderRecordedPlaywright(actions) { + const lines = [ + "module.exports = async ({ page }) => {" + ]; + let previousTabId = null; + for (const action of actions) { + if (action.tabId && action.tabId !== previousTabId) { + lines.push(` // Tab ${action.tabId}${action.title ? `: ${action.title}` : ""}`); + previousTabId = action.tabId; + } + if (action.kind === "navigate" && action.url) { + lines.push(` await page.goto(${JSON.stringify(action.url)});`); + } else if (action.kind === "click" && action.selector) { + lines.push(` await page.click(${JSON.stringify(action.selector)});`); + } else if (action.kind === "fill" && action.selector) { + lines.push(` await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.text || "")});`); + } else if (action.kind === "press" && action.key) { + if (action.selector) { + lines.push(` await page.press(${JSON.stringify(action.selector)}, ${JSON.stringify(action.key)});`); + } else { + lines.push(` await page.keyboard.press(${JSON.stringify(action.key)});`); + } + } + } + lines.push("};"); + return lines.join("\n"); +} + +function isRecordableUrl(url) { + return /^https?:\/\//i.test(String(url || "")); +} + async function getTargetTabId(params) { if (Number.isInteger(params.tabId)) { state.activeTabId = params.tabId; diff --git a/src/mcp.rs b/src/mcp.rs index 3649c15..d482652 100644 --- a/src/mcp.rs +++ b/src/mcp.rs @@ -331,6 +331,34 @@ impl McpRuntime { .context("failed to activate shared browser tab") } + fn shared_recording_state_from_panel(&self) -> Result { + let share_url = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser"))?; + SharedBrowserClient::new(share_url).recording_state() + } + + fn start_shared_recording_from_panel(&self) -> Result { + let share_url = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser"))?; + SharedBrowserClient::new(share_url).start_recording() + } + + fn stop_shared_recording_from_panel(&self) -> Result { + let share_url = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser"))?; + SharedBrowserClient::new(share_url).stop_recording() + } + + fn clear_shared_recording_from_panel(&self) -> Result { + let share_url = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser"))?; + SharedBrowserClient::new(share_url).clear_recording() + } + fn managed_cdp_endpoint(&mut self) -> Result { if self.managed_cdp_endpoint.is_none() { self.managed_cdp_endpoint = Some(resolve_managed_cdp_endpoint(&self.config)?); diff --git a/src/mcp/control_panel.html b/src/mcp/control_panel.html new file mode 100644 index 0000000..d56bc6a --- /dev/null +++ b/src/mcp/control_panel.html @@ -0,0 +1,1501 @@ + + + + + +browser-connection + + + +
+ + +
+
+
+
Current target
+

Waiting for browser

+
-
+
+ +
+ + + + + + +
+
+ + + + diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index a15c5e6..6546fc5 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -224,6 +224,46 @@ fn route_request( } activate_tab_response(runtime, request) } + ("GET", "/api/recording") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "state") + } + ("POST", "/api/recording/start") | ("GET", "/api/recording/start") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "start") + } + ("POST", "/api/recording/stop") | ("GET", "/api/recording/stop") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "stop") + } + ("POST", "/api/recording/clear") | ("GET", "/api/recording/clear") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "clear") + } ("POST", "/api/share") | ("GET", "/api/share") => { if !has_valid_control_token(request, control_token) { return json_response( @@ -335,6 +375,23 @@ fn activate_tab_response(runtime: Arc>, request: &HttpRequest) } } +fn recording_response(runtime: Arc>, action: &str) -> HttpResponse { + let result = runtime + .lock() + .map_err(|_| anyhow!("MCP runtime lock was poisoned")) + .and_then(|runtime| match action { + "state" => runtime.shared_recording_state_from_panel(), + "start" => runtime.start_shared_recording_from_panel(), + "stop" => runtime.stop_shared_recording_from_panel(), + "clear" => runtime.clear_shared_recording_from_panel(), + _ => Err(anyhow!("unknown recording action")), + }); + match result { + Ok(value) => json_response(200, "OK", value), + Err(error) => json_response(400, "Bad Request", json!({ "error": error.to_string() })), + } +} + fn select_browser_response(runtime: Arc>, request: &HttpRequest) -> HttpResponse { let Some(name) = query_param(&request.target, "name").or_else(|| query_param(&request.body, "name")) @@ -507,368 +564,13 @@ fn escape_js_string(value: &str) -> String { } fn control_panel_html(control_token: &str, project_id: &str) -> String { - format!( - r##" - - - - -browser-connection - - - -
- -
- - - - -
-
- - - -"##, - personal = PERSONAL_BROWSER_NAME, - project_id = escape_js_string(project_id), - control_token = control_token - ) + include_str!("control_panel.html") + .replace( + "__PERSONAL_BROWSER_NAME__", + &escape_js_string(PERSONAL_BROWSER_NAME), + ) + .replace("__PROJECT_ID__", &escape_js_string(project_id)) + .replace("__CONTROL_TOKEN__", &escape_js_string(control_token)) } #[cfg(test)] diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 2d2f71d..79d4e4c 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -213,6 +213,22 @@ impl SharedBrowserClient { self.call_text("activate_tab", json!({ "tabId": tab_id })) } + pub fn recording_state(&self) -> Result { + self.call("recording_state", json!({})) + } + + pub fn start_recording(&self) -> Result { + self.call("start_recording", json!({})) + } + + pub fn stop_recording(&self) -> Result { + self.call("stop_recording", json!({})) + } + + pub fn clear_recording(&self) -> Result { + self.call("clear_recording", json!({})) + } + pub fn call_command(&self, command: &str, params: Value) -> Result { self.call(command, params) } From 0d1be1b865b8fff53ff300d535c356343ebcdc25 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 26 Jun 2026 04:59:50 +0000 Subject: [PATCH 21/29] feat: add recorder inspect and replay modes --- artifacts/edge-share.zip | Bin 24819 -> 27830 bytes .../20260625_124424_control_panel_redesign.md | 1 + extension/edge-share/README.md | 6 + extension/edge-share/content_script.js | 311 +++++++++++++++++- extension/edge-share/popup.html | 4 +- extension/edge-share/popup.js | 51 ++- extension/edge-share/service_worker.js | 209 +++++++++++- src/mcp.rs | 14 + src/mcp/control_panel.html | 32 +- src/mcp/control_panel.rs | 33 ++ src/shared_browser.rs | 8 + 11 files changed, 652 insertions(+), 17 deletions(-) diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index 9b8566d16664f57be3cfafb253353eed96fb9968..9f8c1f7f4558d5984f76d72f6038dfdca94d236d 100644 GIT binary patch delta 23436 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 delta 20399 zcmZU4V{@Qg*km%v#I`fBZQJI=w(ZFs8xz}hCbn(cw#|L^t=ihE-4A{0{DE`z>At#~ zRzdH3L2I$0kd5yD333zx{gxA*>-Q1s^&o>tK z-*Uhmujhm8nBLV_%jeVL?dk4S#btL+7oX41;LeKTv}g_vLcTA%hM(VjIKcPjyuEkZ z*zE1s?o*Dt0*5M8r)$gG`Rxq~cXMqm0?qzA zIx@$`^Kd06$ITtFN&oV*V;m{AIbOg+0|C&pCH!syUfxtmc=&zEazS1jP&5B!NPE|~ zKW`H_4_@PYT;RAp+#Ftw&tGO4=i&$WL?Yp~TKUZ}ns_)j$C0wl{Gy>B9u-Spwt}(; zk;)^FPUpU+PAX}(ukhI@=EYbpudc6K38d~M=;Evy%g|CAKJ->QaX&4h#<_-Xssf-Y zctyI8*mzCnb!Ibot1>prsc8aD=1d3|9KB*}(eHVOQ|ftb>Br8zy2t2Q0(HATWs2w@ z+B53B^rz>->vXe{Ot;QnG9I)}e@`vtAb!Hz4bOqpGxcz}rn zzT#3`%ilcuu*<=RLA7Ecb}Y=H&EV67CXbpl#-&oo0II3-JnZW!yRXdgU;ZcgjSVuV`iC zo^1a_rs?CqGF~6KddwdQ7|9pVQk4Q}92tML3>ZsUfMaRC`mI#_bU#ceaU-d+kCbv^ zVz4-^=3z0TL@XqIod)8M+=|B{MYp1Em^^Rr(9p{V_v%U@mq0e{EPzc#hPTenJ&|;C z72SFYk_2*IpK0XnA}e_*P^`pLxpX$rK!F03w5HV$-f43AQJ4qurK;^98qQ^lqM=4F z>9_s{qSVqb*7mZJM$Ea^qV6T@Gt>}KbVS!qwh+}R{;D*mCSRHaoub7ORuS}Ndx=CX z*Yvr$76y`w#6njMG63fx3fBDA&QN_mBF2ISWJp$v!UR*V-rvfKZj~){iDnpQv;_6{3gml4BTv;aZT!E24JW>H6kgp@7ddFggP9C zRcmQ5^DFMV3gIv-Hn43XDQXq2k$R{9?v3Hh_^`BA5C14eeKo}A<1E~l&<0)2Ws$9$=U$Rui}B9+jH581bluUH~Q z>tiU!*kVno321ZUETl^e)0uPP<<^O9x+lV8zS}OCnG5q7CJh>Hrf)c|voJU=3f1(% z4ot|_g_`c3HJFkK85A45=bt5pDcy3HYwaNqt0JnGT-^zGLedTjS7TU8*gY!Up_q<6 zg_Q|dFmNAP5nrtOkRDLNk*m$)_nH^^OF3b(z~<2F1>}2TKx4a0eXB;PM;kk{thNUo zR-y>^L)c|)=$N(|k^0#VaI)JJ3{9iV4#*0S-MjHj>qm@gk8`TmK!<+rN9G>_!+bZX zh+9v6S*Cf=i>>5FU5?G}c+UY!X5DD>?HfF60>pvM0$~g_FT@e_$qs6w%YNe*=XFi? zU7T8efF6nVeP&&3Js8|JraL64;`6~F>7;}K3|xZ7=uEUaatca4%M(M_U$-qTL5g&1 zIU5S>Xz>Te1N|zTQDL9lr59ek%-uDE3%d=mV=wO zL+nRgYh`p}a%ubCl9KK}&Dr6R z@bQ>Z4F-u7dv&eSL!;_4BdNc1X3$mU=#sVA3Q6gcvDN@wWGT3#jytkMgS?Wk$~~iF zK+XCeQ;=t`^@ORLJw8&Xb`dss+05fCQ4~*v!e4Qai4xSCbb2KQhroRUczCcK z>3myRamgW||DxvG`wN~(yJB`M@+eK10UKu=Bw8H_!;OB)!KDUPtkECKWo?%Q&+EhH zu_GHqIFv5tT%H5WPzvMu?|L^(JYEO0FLMl|VEh@3iW z;=7}cz4F8Dk0ONtyK6>dprYCK5FuZ5@w%P%hmwo3opBlgbNYJIls8f->v5KK&D&Mi zzXAZ0u-Bsw4PX26*9DZyk9|J`X<&2%xnqb)!v@RKQH6*81(Eltd#}B#aZB7k7MBf7 zOVoK=n}tws?pLMxkI(lCZh`z`e%DZ`L!Mu@5+ql&@A9AyuDptN7FqHo?UXxmVcox{ zRA=v(54C2&!7r{@t}TOf$&(t@W5bhwNd(Dz^@(-pm+>-)rHZ(ZHZi+y#p?+#86dZh&qGmXKa*9sB6GUNfz~cA6^UrI zpX@m7O*?Hp6x5AwD_x-*QfPd8-twcp2|&vHd+39`eCiyUK4&X zOByx0$-2wYVB6Q{XA20NL2Eldpu#(P*<3GWIPHUt&@jI9aI_)@Wcyq4hJMM-*mZ-< z4J7QKntEV{?K6KtFxTigGFxMm zj8C;W{Bgr5iN`=SizP;c#b|J-t?$D|5RfszWFqKU8}GU7-za7N7KBzDsjZ&u%Y$Ev z-NX=@OWH2JkNLp2&xWumC&W#Ivgv;~+o!E?sFB7s=m)AFlx(kDA0gW8+nHIjQhpDm zAv<~SEh-4Z7D%Vb;=Q+w8r*IzkQ{||E!4VwZ0-(wcXP7`jG z87a#zuJ?Cl-Fc~F7?^P{fYX_Lg8hTGXx?_jwX3sqW|Qyo>@eNdExWjb!FpOR(Oz?( z2{v>&@dcRJD9SNJt93+V!Zhu}HVjBn@D7;JXB1*XqT25w zw@IZQweO4uS9q5^fP9@|4%dq(=PO|WX}f6?9uwypoUoO)?n#BjRrvW~53Sf)!>~E$ zXp{wYdoDRRW8rY{sI8~J(WL2sTEF6%iw`{L&3Q7Q&F5V;e;D%YnZ_5^GW&MDWPVUB zn&+ia#L-%&e5GdU;jGA%S#k&YGNFd3SdnAE<~(Y5uIr;;drH=+h?re!i-8K!DFd*t zLK-h9yJ11sm8#Cy_G?me$Rwn2aNW?JVb8>)Ye$YmlD0YqvLLNs<&c;>|IGK>O@43B ze&I&(FEo`?uzcF`aqM7SsHf^iL?P;Ceku2tvr+S})LckPy3b!3+xp86M>m@Oo2bTE zCqm!!70+)-3bY+uEbQolkmgZ)zy(SOB))Bmsz;DaPcoo-z!WkCkUE%9ELg~!#7ra= zu+!#M>h(=qaGFIyKvt^6GssECe{0RRlPcA5wPJJ?_0t4!IfNoV{@hiB=ys}6w6>g| zosed;CQ5bISb`6w=gf+sdC@P>w2!qKWMA(i2NzAT#Eg@TTC2sT|G7GDa|k@c&frpA z@g(XE+)!#n-P`fDD|etM=oZ$$mD}K3Amx%!>4lsBIJ$jDAm!0$LIIOEf($UG)Y1eX z=Jj*BemCPwBGi6RxVER0=Ax+mi=u=uAgkuB$WWP>ITZ}%2}^yNyA~Is3QtuOb3CI= zwgm;1t&muDY@+cEux4vIfd;Bgj~ntQPzCZDAMn({75)Y+@fXfJ?%16o#5MTw2;bH3 zgUb!0G@S~g7$)m5tV%fORl7bZ!6Kp9VBa(Z<~2qOA^VUl^eS=6)4XBowL4q0thL>@ zP)$e8(}vnzt^U=X-Gz(rT%&JIYdY#Qv&3N<-Ggr*BskhNdhlx^;00nq^rCNb3b>Fu z^FKO;HheGthE-WA5lRJ&Sn>dFnRSiiQZmO&q?)2RT)$WRm}lDl6H9{3AkR_6PHPXD z)K^^bN@hNKYN^79vkMpFir%{P!l88zc!BTm@-$>BdFhw}(#Bs%tKPHlhzaf&lD9oI z^RdHc#`h7i;3VJi6ceK$vd_>;K01uX<0`qBhO>SZdvUa9M;4z;ir`zFu z9+hS!tQ1AFhT{H)9fk;Lo(Z?Xaw38G7Y9t%)xHf8$cQsJ;b0&sD!jIxg*(X8v7`c{daJx&QW z5=oa=8@b6tzi8V-AlM1F9KSKmaloA&CYvDn9o9FQ0vj*2pFQ%8H^yvy+AM8o4Px}Y z>m$K-WUGo^Ou2oh&frqPN0#lRQBXEiLr)fJvdeqwx{fzEGZYOrkB?6e_-GqmC}nGp z$g5zu0m23Bu+xbC1|LfaC&`E*l)W=jgw(f7UP6dg{Pg%#leqa-hTX?t>l&0Y=HN*S zm*vyS>F(gawjvUO!%bbI?N0hJ^tpx|Owu<>oN2(^0;0O)lBCN{g4p?STi8F>+Kv54 zeDr4pJLbw?@8FP3ICmDCZh5B*V^<3h7^BcL0P>YHbIkmsoufcHJ*vzbR#WCx;$^c2 z)TVI#)R0gYk7u#1Ay>%LAg0tXG@JK)Vy1A`r4Mt(N7SM4*UYS&OYjBM7#REO0NYd7}^mHL8!$Rb{%2zfAxfkUaaN*I`>};&; z$}+Xx(=f(7(c(_8OJgP$B-xq5#^JUAXP>;5Ce3TQNwL5QyV8Ulfv`BwfVawUc@P@| zxkm{@KNPG&{J+wq*GhG*Mug2W)1i1kEpGwAqUtuMp1T%RbCtHP`^ql z9h94pmPVKI(O;$-0h8ZozB(qJF#r|FA`iCdAZd<*+Gewdh`*VF)axI{w2+2&+n88h zbP9MLHn%pK1uf50q)}YY!G3qZlU{|Bd)@9aNb=1W_}BYrA}F@z%$9LFB16 zdx8*b=)o3LLzpvMg5i#$(SZfg{4lic+>bBsNJ81!6&ty^B^W3nwS~fMz~gp(6C% z2!W2Bg8HQQ{K}iqr*!=dKv|i$F){qrQL`#@*WDvB-&mxjX;aLg(^b520kP^G)|_D^ z#^}-E;)B4~oylKpofI>%_Kfr3Gq}Ui8$R11^qzKMowe;T!&jb8gE4;#NjTWe(*9#e zDCN{8IW-jiZRZ$bc$SSP=z1&~J1jQB7+HILi|s~UU$JZ?Z5Z|n)Y*)E_47#69b{oJ zM!X@wFebZDV1^6Ru&jYCMabW)zf@motsC4x9`IB!Wl&m<(+w^sn4T#S~MH9;C)}`Uejei>ip>! z>rT|1z5Wb*TGU|z(Au)h@Fg!Nfw|WM%zeP->pv4HkgHHPMBOa>ZqZiOmBe7h`QBBUDU(A=h^z@mb{3gNV%ze5XS+eJP!Sr_fF&*Bv zuGfwW*X45C1WX)7ljv0vQmk`v7rONFns1G>U_Sx_v}5B;&f z7tGjBYRd$U%eq{`?n@t+P>xzSL8)4w6s2GFRG;hooXjecSu_RC@|o;!h29-pgf+M3 z6EZ8~jK`GwVy}udwpX9~mbSCtEJ~uA-Ft5CDNHC+A&`f=!I=34ZawsQX3Ucj6L0MK z%vBzhW_G5RWSzpZDX_5j|Lk_V1T2`vFPF9&t(gOwN|e|L-w12c$0{3DNrtx~AOX)@ zMJS&?e%)jF(XBr^x`zu7_45?gh5_p{<~Fy(2}D`6lI9A(WQ#Zxov#eZhqOGgitDB( zmm>z7=pF{noTNv#6NH=Icc08{92&vPydU{&glkbZUcbnOPo>~0x8EkgDr`>9I@a_}WPt)Kaw z!q?(nnh7MC@KvrLRR1!9uubl=XjpVIJfk%a4QVsfhGWkdqq$NY2HlXhQl&YX@3Md{ zj~`L%e%s6vZ+Gf{5YHht!;n{TpU7}>{@g3DO7(f#h;feFjJ}k?|53NXwtla=2W_9y zlc>j?4bmjPJl!XCDME_ZEMPRkt&maNoU|$A@O3M&###_CS7T9d7Hl^5+qwtqN2kJp zpy_24WR%am#xgXcIC08CPG9*v^mGJtj>IEwXJ|Tbized4|G|PAh>v@Ga@%c!MDpZ2oSqao_%LJ+%t7u5&YOoLd4^rnOeG zn(vZ#tKYmG|2-QVs#;&Ov0$A{Pmc-Bxgqjhhe~A~Ob?nyG8u&?30EdggS+{d6Hgma zpJ?2Mg3V?DvTg2Ny1~w#3}0~F1id|fC&l)fF^rO@J)rr-I(eL>ow@BCx1W7YAjfx&8e=~!VS@2TsV12Nt zW44!9J};5GEMH3}Bu6k5?D7#$SId$3{WyRuo@k`SqPmNop=-z#1|zymvby&xm>fAf z6Cgc`r0K>dzMYtY-2xe=n5P<-Vg=Jh^BvI01EYE2%H8CCIn#7_Snd%hqX@4lwM-5-wLWa(hl6l(^SW&`1R zV<{B!W}Of88lm$}%q8+FoYKz*xR)Wd+HW*j;$&F(1J|>X^BXu^GlExSzWl+&V^!Kb zvJ#orJfdJE`e}RjD6(6a;mvACLOtGuRhF zr~if{&blA)nrS=Gk+E1{TCduO$?kVEIxWajDTh~j|+@Xz)Gyy74A zeH0^X9xPe;H0G#gE(z81N$1JKw==;icndVt(b!fDfqe>Ke)|qY|UNtm+jY)u7^gk$iR^>#bcd9m6{Mf63wUYzOVMh8dQs=Z=4KKgbf@ZW65Ki< z3Rt1sY5?5r1=HRn()J}9VBEtXMkQ!)o0i4QuMZr>l7lkw|F#>j8mBv!RFV0RXZu>T zWeezf-_b9F`USi_jsr6m6-Wqa3ATuWF&r6BYW6L|9$9Lvm_1Wn^pS%D^;$MmD~=?e zzmetzb#c2^vKAImAoxplRd>#W8X>y*ERdu<45QamY%UY{W{7DPr1y(JqrIl z+}|bg_4v+Z$GhrgnQq36`46v;%~3^>DsUl7aY5pxiC75*`3XJDA9(wxEuvo^N@F*S z_`oJkD3ZVlWRNpq7p6tm0HToo977OGcb6x%BGts&q)&*!`pZ4tna}ZY!nLj-D;L~} zOp`!IsC|=;!xk9Y&F>q7p2OWycY2S(HPs!&+fmgS1qD{7>M?7a4gDPk;n8gh1^B8G z*;A@{>~G%JCsD$nZdG234VWFK41I-cPC(IXK%*S;;=}hYx+mRJ3TaRBXm4~s0saq9 zi%A2~^bd37`9?6hhO(ZE=NQ4s6#CXT9_Oy~y-X~o0bb$mh~`$`l!gkp!K=QJTv1xa zq1&*)U}%79WSnI8s;$foJPmyLo>wXR&;ATKZh?w8%aCinn7~XqhfL5c1r#Xo$W2BG6f<_>((*Ai5TAU|U5H7U?SRFD4}eQUYSHWROO3s0Z!ef4GB z8;&;K_rhMU{9S9zliEgRFmv|J#d=Js6{FYj{U&P&><}KqVK76Y1**GNfI^xij)IiK z4E~6+P)VyK^#mH@(R~^XkC(luA>?kiZS1|iO_AcWnK-D)j_Gx=)1yD#S6`}`?fS-^ z1iajY=DnG*88|@H?QqL;g+i}fCzbJQkSC|L!-QjN((a1P|` z2x#kn-&V{nQvf&2N@cB>3w$%Fy!RQ5xHkb*$i@`w0j^2MGF_l(4BAhhggnakWhmFq z0#msu4D#=NhP|#W?5Pfz6N0aV_jTL;uLh3=&SGdhx&LHBI--RE37Oh`Y>2WK&S-bE zKD=F{@v~6vRPB`asoUV}o=S_ZV-kR#b<)+9$66XLhyX=gdBgR414ObrbB8Ah9`#K| zTkoa+Xr0%K8$?=xieLtSGg&`N8%X~fa5c$U_wAj9jt1>Mtc(-{jRW;>@{K7kh_Ig6 zS~aIvWF8U;vVk4g&fF(Fl_-}uE@OijIg*3 z(qo>IU2~Mp>s1>&^7V&*d(wtG!NT#P##dmBuatAWlHN<4()UA^%U|nze?Yr(ed=b} z20o#0Dm+a=CE6`D7dpQo6=lG{(Lg{zpg`O+S9PKyOw#BeKtS?w6Ji)B0pvhFt3UtY z{|OIGYS`MZvmLbP#~<}8qJ(y5 zTql~0(j?PCA+7J-<6Xx*i;KC6Ns)PEhg&e?m{wMTdkTDhP9ClvSKObjW(d^KPfw3P zhbIdIm9hFA98Mq04f=vTeuhpbR+np}rTFpY=FA;Q z0v3fpo~}iwBLAF+V-Wb(gb|PwDEjlhC7|j#S1Zxj%%&6Dj62cTDV>QQ_vo!fasQr= zjP+mk(@(kAE+eg-8CXp0>187U{g;(ui9092kw{tTcfb6E&UUVZ%iBYX ziP$a@yQm?EPmz$209hqw(ROOehpv%{>!+X*m?@XWMB`|FAEJ4jA#mlVIKuY)$~>tF zU#TP-kw;*Cq?VLQ(;USjl-zLA4NPIVD22pEHmKsm(|;@O`MMR&W4R(<4InZZHQ@_ zgVvZ6!yKlrWeQD9#~SttX)pyE!*uZp4(wUIVT*Q>Xn%g6IB@IMoUIgu;vSXQo=>LM zcV2vtG<=VM{VNJ``DM|S=Vt$g!EY(k2?S|#0JPgFi( zU??rcnEc@&g!8v<*6aIxkt#EqwAB+w{{YLWI`C*_lX;?`hMoS~&z}mYF%YDVc!_MP zW>Gif?2b2Ll12>uDPK7Mdca{7B0o zMOebnVmW4vovm&aZwPH-)^ll=k!{CV;99>UyP5k=hw%&-0owi*)b&Wtues02I~_H0g-gCNW8{io1y_NKdKY{e%W$0SJyfDmr=M4%tJ^>iK@ zo@1*=q`JBKDQ+H~oGw5PC2uTZ}xNtF5%KJkR#Q$2klX7u_KHjh8X^~we4ztV-nJE zUAJ#=EA61M)Ov4?KYH3w1NEB!r|)#0R}sRO;nt0EzUBga!#$ZXyo;Y3q6KASUm0}> z*6zv21OP(i9{o1^Nt&SxB70YayGXS5+!2)T$V+vKnYPBLa(xpIRMq52RoWNTp!|$X z>;$sBKeViT?K|m)o_>%YGd=PdHk-hysq5{(JvBb<`D-^#$zdV zi69racA8*at1b9f)zz??;_OF@ErF|XbyC}U^L}(lqzY$7h3Wm9@)G+=^V#mdH&z0% zNP5x%+>ES;Azt^C-&_MW3yQOZ(q4-yRShz{B{UE*(C#m||Cel7{tK)YEK(7P{6{w1 z7$6{o{{>bFkSttmZPZkuLBMvS_^hC#`4T8Oh=G-G-C>P&+n(C19FtFw2A8^(8DgP1 z$Bw-1KN3oaXNRmS5oD6Iw;mnaow0fVX5>gF>EDHm*CQia0jQGID|$cL6&<8HdHrL!jvoTXlzlz45#eC}$m%GUnbhz&hLdnX4= zU}U(6naw-?3EKS7QNnr`l~71or(apeBw#Sbx!yS4ai7Fcj|)fC&81_L(ooB^)u5wu79Q=^%7{s7tD>&@u? z)hKNOq_buRmIphQ$3j8_`ZR`9^@DmTmTH(xqhB9a!tIOqG~}zePSUg}?3B?RIY2PX z!PL+k6fty>i>y_XWWQcsiDVx!YtHTUAlR&wgi*e&^DaTx0na68 z5EWrd3eA}g7W)W>8d=CpaB*N7(pJL>hC~zrqa&F$zybCM>Tl!5(##_+R&7BByR-?9 zf|&o2WD94t)L?rplwpyid04yCGOUT8I#`3S2Z(! zpk78 zxv)s;fWwd8@@V+S!7YxBO~AUUczOPCA!9LpewMgZjyI_wa4uN}=7>T^W;ae1?$X05 zHYdxm0##uD&v7{mJ4CF6 zN_93n9Ig!|-FEMsEGj$I%p!qbN}E1^7-3t%I}DplK=LOvB|f`7Jn+%jo>rwtWtQNTmtdTgn;vZ*srm8r$Vm}7>c)LJ$c1&X z86U<4zHW$3S4UBRAINsKetG8w{V6LFeCfJT^Upk`yX3O7kA`6%_ew&SY1EC2@HyO4 zrAy}}=e**KyR(bh9yqqfy**^Zw+}ls_0E#VX?F6VW2!NJ5+#;z?1I%ffyj_Pz!{FO zEZl3rLc&N{_Z?b>&+ozK55yHcvjvPoz%yb4v@ri68GQSQ}*Vq^183 z_Pl2;teeQwH{zS-_?8^XadoPFM+4p2a3Z5}yl!$qWr~IHvI8Ty2A&m_^djKJx**y9 zbDTR_BiHe5A~+ptHs>?ngYXQ*$2_+rM^pr^AqyKkwUu&-mg`i@COq^lr%9u^R@PMp z_l~l7sy9|*fL`t?T|D&H_Z_D^s^W=rgMK4~tQ~hRxB|HLFP>|m;U)Xg_spe7k>$u| zbNPQ=4aJ_PnPFgR#|Uo*9337oUf)E@vgx}gzqq$&Pz~tr$K;__Vo+?h$T(k-L(v(; zRk8m_QEp9vvz_!%Bhg+KN^u4L63tbTeh`w*yRg-o1Ms7kemk-J-5nJAH-BQ2jf!VQ zEcsKS)!o0pSjw|XGI3@9Ph7$RmZ#~rrO}Cc0*U;%pzIi{Q14$$+>r?;{@&7VAGB8$ z3RP1|^Bn1nZBWwD^?<*BSM3F7;F>IQlf(~n-TDk;@zSJ_{YhE^B#77192|ZJ@Hl9b z#jI(exo9BF7IN}m;OXn7NuallrL$H37w-bi5ok+RvengZRX@_xaY3pgo`WicU9IWc-$lmDTe z1Xw<+Jh=Z)@BGnNx5MK=`Ey-EInqN6Dqf|=&M^{$sW&)9Jt9_nFD&i*D zBp&$dyQ?JPA{$#1`okbxuC81@tDJj*``9HT%Kf2D+q&&sZAQ%%NKs{` z`?OixDbO$aP!b@$B)*QuwRP=7q#>l-i*mG9MiW1Np;+ytC3ho#R8#Tgu{RHdFXDf3 z+`JdEUCgd@%t+sQBv&^7;r3cfv2T$0Ok@4LP$4<>dwg~!#%KT{gW5Z!aloxN$af*P^d(PRG-)K%_E|&^GLkco4Dj}KOZGi9J%TQu#Z^0#!$64H8o z+@PVnAA%jZE1+IYgf2J$SVkpjY~TDT1cDQ&sO-A&_L^S;)IcG0iyIv1X=a7t%@(nv zuv0O*s~$^{^T-aQ56+X0sL$I70j8ER(eAv;q6_^MJKAGzfHY2H-++Ld;c-8Cz`wTQ zjK$1Ft2;OZP@<*^jOh)3mmzyAmeExL?yMR~J3Yx#_qFEN zp$1pC;V9|gF(rCrZjL3wn5W&>TbsUa&s_bwpT#Ne1g=RIcuPW{1p%(A+Pd+qOtN-& zxO5-wUEc2@mqo&#KLj7Y%!r^6_fZ~2Bw~zySLf#>;U@9*WvCQ7^UZ1TOr|oQcFZ4- z+8|!iol!0r<(KXQL4(MNinrzE>BUkz2LE*kL|O5q)T#&<+-lqGKA(hRbUP^B|1fTj zo9`saY8rN0q&+C6X#N1x^9_Svgu^BACs|nEgfE@XZBP@ZW=})yGkU`k1(^Mwu|dCDDtY zU8+W!Y#=jXMfq>VpZ8?twvRmvqd0--QQ}z(cMu6cmUhv0dQf(ghbUd4idA(TH91oB zu)s#Y5Ovn?Jj6|FO{#strfQ$a`c2mQ^0UlzDw4@XRwzc6xUeJ7rul}G2JK0^K`%V+ zEv>H6=$1U%;u|E7Y9}Si9`sg zbW=(V-He^geA#*bj={Y6rA^3IhEvXu zZ}01wDeM+ASF9`%$<${x-G%G=zPX14bnZopEU?AfvCTEW$Q&-??Jsp`^k>JJ^ZKad z;B~@OISEWN;h_nn(76ehnA9VZ3~j?wFm--WpRVHV18|!#d9dkbZmPd3pfO7^_``63 zCaV^DdL)Fk@1^V=8T6rA?~g#XgcmYs5W-cC7WPk^L3-+Vf-)S7{Klj2WXeKvTJ3c4 zB^ewy_?EqvA3L9PYZnM-c?vUf+N6S|c*CXxo{j3X`mqom;Du^1V`8F{&@uarFFmQO zm2WsPjnDY!TeOOM3*#k6%JbeFIpqkz)9K>n=rL>zRCFj(GPHtySJU7!8ci=zxic44Iu#iU5#>EJ9hA8CULu zxhcN#`SG})e^`z&$Xamd>R)F(Qc5uriWoXj_=dD%EZMbS?}hA=(CHkDTy#>Y>$kYlDcFVOSaNESTLigIiNLZf?CKgz&8*YT&Mwu2_z=~TkC!(70^ zruxB%^=~tejMB%G(|BAh)Q?*Lxv{9r`lp`uc>Si^S-gIWHpgboEd7m%=DYJk4DqZE z5v1?1=4X^klwLC06|OLFFS4fO=HgNOLkZO+Zg0#Dl2!11}= zxP$hC(AKBmvW)^l2+Im5Ier1p4+~i^KGOW>QU~6XX7VFiv1x_Iy*OT0-ZVc$OT}kH zf%RSIxHhG)2}e>JuHX>~j-zMs*9uXH5vqlI`fgpv)1lX_42FqVtefNSdPi|82xNx; z6l`MPbyU}X?rDy~|EXNM+n@sf>DSf&^y}q+_~ zq6z<<)m^xngq|%^RCY@lTWwU$IY}oJg%O}z?NixZrfyPiYJ#4HRN39twX@=lXhTdW zD}SOO*9Gxv6LzkUGArRZCni?>m{9M-_5hFj3gA?zflYtTWyur5E*fPdQGvOEc$s~7 zCzQD6Z;J98jwdhTJMnON_|xS&RS@c>(%>87pI(|(^>1@F{pB)k@|&^ytz}K{UV_S zj$OX49>3Ei<|${}J~-i_?tZm#!=>yWH0T_Rg7R+n>eFK~v4#1Oz)DFW3`{(mQpl1K zxN^G$f%#V{nerHNxglYsibkc|`!vWfM{<3h=4H&vO}lcd8cNkmgfd=2 zQA^nvl^fm3gc|hOI1W(+J!9>9fO*)NSP~m32XQ8N-Cz^C*s48|t+vI=o7%8(`V$Rj zP!G}A77k6)2~#|tM5a}TBupU!Q!+~JRk^<^4&_R+x0B9XAQIC#pTvk~OH4(FCHoxN z8R42A+c3sRRLRf?#(Rrv^Q7|7EnWLefoN4+St7E}SU(iv$O*w6DQy-xfC4`;d#sY( zy8Q%Nuuy??F~<|f4N81D_K-rQzEiRU22`4=39S}_0FDquf};@i;>v(fr)Qa0QgUQ_ z8|qD^jD3H_nmipE8p}1Ytpbxb?okX=P-gj)#`|OwS^=)4(lajVu!5bs?7WtHvEZcZ z6$8*UCff7_rFgsvFk5nY05;-oXx9XfhGqXWtRGs&%#L0QF4K%1X%Cf4Xok*J*tqtc zm5|#w^-;9L^G8`w#Axb}NT`$Y)=mbza{Q^H1E{F{HZtQ2^PdDg5qO~1&ITfk0J`*`3^js#gR|zP%)BFcGfMq~(R|*dw)J_-; zM-=mjhKzVxQtK!e2_mtf&nI^Sj_lSMZJ0bbwCH#Bf3adEpB}zv5 z&jF0hITyQdIZxdYo#n>|HXRufcSAA+($5gHU5rA-6u7LeIgas9kqRt`j8ruAx>Wh7 zRUtV`GxmuB(sT)6MscFV7}l9Ni&@zLoY_m!5oTXn?NAi~DAYlGV1Ro+ymLKaqYdDB z3n+EMY&{{$LwbcYkuD@1z8%Mw=3Z**5=E`eXR{Pr<)Px{mj1YE92z3mPpr zR_S%M&;N=`UB{uoQ-4Y%UgyC02%T z<;O)A_}~y40LRS{y3+IFd$WWO%OO14aIMn`GpVkkQo2D>II`f}Z0(2~s!{>5U9dVm zDJ`mv*2}(8YE_ZWp~3OQ{gfvR+~(p?s^5#&z=~P|<${mU29}pPcrx{y&8M|`vgYml zjm^1@HO-w&*g^I`$)jgtAmX9xsIOKABq&5hsWkE5knB$mv!hA5o;LhtL9n0Wu;^_`!!ZCpOpi<{XgZ zWFp7^tBmuEhI{+|uoj}%(MymZTJ+H(Li83Ab`oH+!bzhvd_KWlEv(DT7dDf;l4UbIDBK6YGbootF!)0aFox8>t z(7Txo^q9aC?TtI!h;PFO$9LlOe3h=^AdQSur$Ihd-f#+`djeI5S?$c21?jke-4)EU z^Gd;sqd;EIJU^28Vle-n$W^vsrSTyBh}Cp_C9lvuq5f%BnqP`-%dK|G;7bm2B+pT} zvDxa2=d`BfH}vpgZoEd~BR3oeagI96B))iHCQf^p1G-2&I4s~V_TI?(7o0VM-)L2^ z`{wvu#D<1ULWzRxs{;3-*q7HByws(^7Fn$lF)|tA!OqQGT}eqV54%5N3rFMPWpAZd zq|tOp*A}1>>)*?`Tf@=^XutU+1oCcqbTf+Yl2o{4B>RmvwSD%pAJsS~Mo;vfCaN0( zP5Di-ZWG<=5EOg&xz-1Jw}+eu;psUOuu$`;VAToP1SB&;h8L4gcswrec zBQzfjt6DAes*OfiHWWx#Q83-pvDz=_Zm&t);gV2#*H2F?yQ zje)@WcKKo7$zM*xs#Fqz?yp3i`$q(_atJ9zA%(K#_t!+Zwyv3U=EjFq0|JHkbBUjG z6%^j_6e294Pp}wa3`VH&4`K7jqbXxZs#uq20}e*SQe3eH^vS?n(O9W~PTbik{SYqZnfj^Ck%|DdCS$nWFXst8IHBC1 z=wF%el_U81@S=fmJI|h?$r_mA{)o=IjtYDA<>@+H8BXddkyeP(dY(}=wjmwmE_ETV zaAp`znR&g4g;iM@ar!%ILb#;jxXCfrv{4OI=JyAgD_>?I3ba+$o%1bhGwy7UR$6_s z;X*eZs>~t;dg|MqDyFweUUD6+jIB47c;yA)R|+r3`{GUa9ByL2Ze4Ou&WDH2Y=?XG zajBG-m3(^Ck)!$H18lKue`~u;s6(I^B(E^Hfs!P%Dewe6@hw7tl(V`={0|}+ zCj7NtgE;mj&@GF|-&jb0&m5D`IhGl-OcDHo3_>&CauEg@1D2yH0%T;>hl0|-xut=Q zerSD$dWtlROub)NV11{E=$tJ5)E@@X?$BnpcyHZ9@wVvKT!&mQ5{1=HS2ZJvuYJbQ{)Os@C4&<5WBByg-6ESvQ!2$~=MN`N_6cWEk6I zFV##Wnq@0jkl4nrj|HY_`J*h}VpKT{n2m=U-m)V)Pl}5s@;S%*@FYhwC@f92C=hv`bl)wM)V5w(cms%&BoB!8TbX~E<=#_ z;@zR%3gZv+^19x{(CnwRlztumTBz;Cw;2O)6U(u3%V-N88)?$B7GM5ifCH8%C z@~h zx1CdCpSL6(Tz#M}G;CbE+SUrFj3tbDSG>zfvN?B=hX_}OR^W#x-n+GtBARRS)%P<% zg(y(0o}n#MyV%6s!d`K%l?t2ti}wz_jBG)^5+RSF+e`-i-u;!Qe^FX8!+l!jlj(x$ zV-E_PCp%X};SNw@iQ4Zm(1CZi+n2OO)qYX_H-g)6)l=wq=>pMnaAjd{H&p;HkO%QC0e9VpGe`3cTXsk z61=Cu4`(@ek8fh$_ryA zCk$)jX_ThMlEBodOy(qGNy|>&re5VMLWAAQohshecP$DmR?Wbe@Uu(>dP-N6{la*_ z?4^J66n1vIJrf%vs)m7>WSN&9Xib0R{yM@iqN<j)LJf))X!%2hajSJJFv>uiw;E%bRd=J67)J z49!7A7mihRt`ZVCaW4p~kUMgok38s=ZP}gq9`hDt$4bZ=-vdfkg=g8)&`?-y?|q`n z8F0^$Rpe;$kptlOTU?;$FSKZI4CA71s4#xR7CR%GwHAQ*!JC% z*>xnWW(7dRu4XT}8`AS3Fi{RoML%6cK&hx>2F;rRb4Q1F&0SbleRfX*cX1WC(hR^Y zg5L_V$oj3W=#~a08z`UkO|f;Nrg_wQsUkYfO|FEb(`|9OS>f|We1!v2*g(WS%pmt7 zr9@+gNPmq}g0dP~*PGzJcs5e(>MI>Z%-Tx+6i^Z4AN6`S>T7LCqHOR4`|@SWAKaxx zgyL`IhVKM{wTjvgY4?%OX|>PZ-VJx?+kYeEKuxs>IgyvBts*e*BIy9qkH2bnSdaW~ zbM-NChB+K;X@6X)GaFXhba!n0a&9ikZp*r7EBq+&Q<5r8nQ8v`C-K}9=GK@&F+HIr z^#EYddAW~DTx5^k*PP4O--f9mr0W(|jC)tr5{n=pbQ;8j^RrY$N#2;A945srE>K6S zkLSoN9Dr2HhdF1|Uwg`NFQ|pUgD5?ofbq~yu|w0+zBnQM&}WQ88ruPSX{nLlOsEgO zH|Pzh&8nRbiDc7JY}aZ@@7a#rBm2wawi}>35RRgLt&p2iOm`$8=~eB_YQ(@$Mu%g# z6K!1GCodhX(3K~@_U57f!ud3gcXFp%8tIu&CFtj9Dz#P>qA#SFS;KYV!J~p(w}PnE z<-Z}KN{0_VqlyUy1&>;F!ZO@p@OeAg1m=jO!4Qr8kX>@>-p5Bz_hkx*zaTQflp$SDY+<-)*qy z6!;^$bN)d8{emijJTQye-~Z+1uPMk)aR+|kRfpn-0UeXIst(^Z)N`_;ILE_I5!RUf z$VK6XV^Lkh*0TE#Zd%bobpTLp>Da19fo3WSo8N9zxUifuzgssDqXRM1l`m%Dp9D`G+8Afl>WbBfuml(B2n$b1lVVR&K%Or?GhO^Jwjh}f?jR3akctMf5LN<7&S&XzpqK~Cl2Z()9oi1bQC z{fGOHHuNv9()OFT_T pay0)bGj(Z`dEo*#{xkmlSL1G-tIHC9kAagD;Wx;C+5Y{x{{h0xwATOt diff --git a/changelog.d/20260625_124424_control_panel_redesign.md b/changelog.d/20260625_124424_control_panel_redesign.md index ca67b38..294ad20 100644 --- a/changelog.d/20260625_124424_control_panel_redesign.md +++ b/changelog.d/20260625_124424_control_panel_redesign.md @@ -7,3 +7,4 @@ bump: patch - Redesigned the browser control panel with clearer target status, shared Edge activity, screenshot history, action logs, and filterable window/tab inventory. - Added a searchable agent action timeline with status counts, stable action IDs, expandable details, and screenshot jump links. - Added an Edge extension action recorder with popup Record/Stop controls, shared relay sync, and Playwright-like script export in the control panel. +- Added Playwright CRX-inspired recorder modes with Inspect selector preview, floating step list, and replay of recorded actions through the shared Edge relay. diff --git a/extension/edge-share/README.md b/extension/edge-share/README.md index 24d955a..918cfc5 100644 --- a/extension/edge-share/README.md +++ b/extension/edge-share/README.md @@ -103,6 +103,12 @@ last selected tab or the active tab in the last focused window. - `list_tabs`: returns windows with nested tabs plus a flat `tabs` list. Window and tab metadata includes `regular`/`incognito` when Edge exposes it. - `activate_tab`: activates `tabId` or the current target tab. +- `start_recording`, `stop_recording`, `clear_recording`, and + `recording_state`: control the user action recorder. +- `set_recording_mode`: accepts `mode: "record"` or `mode: "inspect"`. Inspect + mode highlights elements and reports selectors without activating the page. +- `play_recording`: replays the currently recorded steps through the same + shared browser debugger transport. `rbc pw` can run a Playwright-compatible subset against share links by translating supported `page` methods into these relay commands. Unsupported diff --git a/extension/edge-share/content_script.js b/extension/edge-share/content_script.js index 3b36a70..7be65ce 100644 --- a/extension/edge-share/content_script.js +++ b/extension/edge-share/content_script.js @@ -6,6 +6,13 @@ const SOURCE_RECORDER = "browser-connection:recorder"; const RECORDER_OVERLAY_ID = "browser-connection-recorder-overlay"; const RECORDER_OVERLAY_STORAGE_KEY = "browserConnectionRecorderOverlay"; +let currentRecorderState = { + recording: false, + mode: "record" +}; +let lastInspectSentAt = 0; +let lastInspectSelector = ""; + injectProvider(); installRecorder(); installRecorderOverlay(); @@ -76,8 +83,19 @@ function postResponse(id, ok, result, error) { function installRecorder() { const pendingInputs = new Map(); + document.addEventListener("mousemove", (event) => { + if (isRecorderOverlayEvent(event) || !isInspectMode()) return; + inspectEventTarget(event, false); + }, true); + document.addEventListener("click", (event) => { if (isRecorderOverlayEvent(event)) return; + if (isInspectMode()) { + inspectEventTarget(event, true); + event.preventDefault(); + event.stopPropagation(); + return; + } const target = closestRecordableElement(event.target); if (!target) return; recordAction({ @@ -89,7 +107,7 @@ function installRecorder() { }, true); document.addEventListener("input", (event) => { - if (isRecorderOverlayEvent(event)) return; + if (isRecorderOverlayEvent(event) || isInspectMode()) return; const target = closestRecordableElement(event.target); if (!target || !isEditable(target)) return; const selector = bestSelector(target); @@ -101,7 +119,7 @@ function installRecorder() { }, true); document.addEventListener("change", (event) => { - if (isRecorderOverlayEvent(event)) return; + if (isRecorderOverlayEvent(event) || isInspectMode()) return; const target = closestRecordableElement(event.target); if (!target || !isEditable(target)) return; recordFill(target); @@ -109,6 +127,13 @@ function installRecorder() { document.addEventListener("keydown", (event) => { if (isRecorderOverlayEvent(event)) return; + if (isInspectMode()) { + if (event.key === "Escape") { + hideInspectorHighlight(); + sendRuntimeMessage({ type: "set_recording_mode", mode: "record" }).catch(() => {}); + } + return; + } if (!shouldRecordKey(event)) return; const target = closestRecordableElement(event.target); recordAction({ @@ -125,6 +150,82 @@ function installRecorder() { }); } +function isInspectMode() { + return !!currentRecorderState.recording && currentRecorderState.mode === "inspect"; +} + +function inspectEventTarget(event, commit) { + const target = closestRecordableElement(event.target) || elementFromEvent(event); + if (!target) return; + showInspectorHighlight(target); + sendInspectTarget(target, commit); +} + +function elementFromEvent(event) { + if (event.target && event.target.nodeType === Node.ELEMENT_NODE) { + return event.target; + } + return null; +} + +function sendInspectTarget(element, force) { + const selector = bestSelector(element); + const now = Date.now(); + if (!force && selector === lastInspectSelector && now - lastInspectSentAt < 400) { + return; + } + if (!force && now - lastInspectSentAt < 160) { + return; + } + + lastInspectSentAt = now; + lastInspectSelector = selector; + chrome.runtime.sendMessage({ + type: "inspect_target", + target: { + selector, + label: elementLabel(element), + tag: element.tagName.toLowerCase(), + url: location.href, + title: document.title || "" + } + }, () => { + void chrome.runtime.lastError; + }); +} + +function showInspectorHighlight(element) { + const rect = element.getBoundingClientRect(); + if (rect.width <= 0 || rect.height <= 0) return; + + let highlight = document.getElementById(`${RECORDER_OVERLAY_ID}-highlight`); + if (!highlight) { + highlight = document.createElement("div"); + highlight.id = `${RECORDER_OVERLAY_ID}-highlight`; + highlight.style.position = "fixed"; + highlight.style.zIndex = "2147483646"; + highlight.style.pointerEvents = "none"; + highlight.style.border = "2px solid #35b184"; + highlight.style.borderRadius = "6px"; + highlight.style.boxShadow = "0 0 0 4px rgba(53, 177, 132, 0.22)"; + highlight.style.transition = "left 80ms ease, top 80ms ease, width 80ms ease, height 80ms ease"; + document.documentElement.appendChild(highlight); + } + + highlight.style.left = `${Math.max(0, rect.left)}px`; + highlight.style.top = `${Math.max(0, rect.top)}px`; + highlight.style.width = `${rect.width}px`; + highlight.style.height = `${rect.height}px`; + highlight.style.display = "block"; +} + +function hideInspectorHighlight() { + const highlight = document.getElementById(`${RECORDER_OVERLAY_ID}-highlight`); + if (highlight) { + highlight.style.display = "none"; + } +} + function installRecorderOverlay() { if (!canInstallRecorderOverlay()) { return; @@ -210,7 +311,7 @@ function createRecorderOverlay(overlay) { .panel, .pill { - width: 292px; + width: 344px; color: #e6edf3; border: 1px solid #3a4656; border-radius: 10px; @@ -296,9 +397,102 @@ function createRecorderOverlay(overlay) { color: #b8c7dc; } + .mode-switch { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 6px; + padding: 3px; + border: 1px solid #2b3543; + border-radius: 8px; + background: #0b1018; + } + + .mode-button { + min-height: 30px; + border-color: transparent; + background: transparent; + } + + .mode-button.active { + border-color: #35b184; + color: #d9fff0; + background: rgba(53, 177, 132, 0.2); + } + + .inspect-target, + .steps { + display: grid; + gap: 6px; + max-height: 132px; + overflow: auto; + padding: 8px; + border: 1px solid #2b3543; + border-radius: 8px; + background: #0b1018; + } + + .inspect-target { + display: none; + } + + .inspect-target.visible { + display: grid; + } + + .label { + color: #8ea2bd; + font-size: 11px; + font-weight: 800; + text-transform: uppercase; + } + + .selector, + .empty, + .step-selector { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .selector { + color: #f8fafc; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; + } + + .empty { + color: #8ea2bd; + } + + .step { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 8px; + align-items: center; + min-width: 0; + } + + .step-kind { + min-width: 54px; + color: #d9fff0; + font-size: 11px; + font-weight: 800; + text-transform: uppercase; + } + + .step-selector { + color: #c8d7eb; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 11px; + } + + .step.playing .step-selector { + color: #ffffff; + } + .actions { display: grid; - grid-template-columns: 1fr 1fr 1fr; + grid-template-columns: 1fr 1fr 1fr 1fr; gap: 8px; } @@ -321,6 +515,11 @@ function createRecorderOverlay(overlay) { color: #d9fff0; } + button:disabled { + cursor: not-allowed; + opacity: 0.55; + } + .pill { width: auto; min-width: 126px; @@ -353,8 +552,20 @@ function createRecorderOverlay(overlay) {
-

User actions are being recorded for the agent.

+
+ + +
+

User actions are being recorded for the agent.

+
+
Selector
+
Hover an element
+
+
+
No recorded steps yet.
+
+ @@ -371,9 +582,36 @@ function createRecorderOverlay(overlay) { overlay.shadow = shadow; document.documentElement.appendChild(host); + shadow.getElementById("recordModeButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + hideInspectorHighlight(); + sendRuntimeMessage({ type: "set_recording_mode", mode: "record" }) + .then((recording) => renderRecorderOverlay(overlay, recording)) + .catch(() => refreshRecorderOverlay(overlay)); + }); + + shadow.getElementById("inspectModeButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + sendRuntimeMessage({ type: "set_recording_mode", mode: "inspect" }) + .then((recording) => renderRecorderOverlay(overlay, recording)) + .catch(() => refreshRecorderOverlay(overlay)); + }); + + shadow.getElementById("playButton").addEventListener("click", (event) => { + event.preventDefault(); + event.stopPropagation(); + hideInspectorHighlight(); + sendRuntimeMessage({ type: "play_recording" }) + .then((recording) => renderRecorderOverlay(overlay, recording)) + .catch(() => refreshRecorderOverlay(overlay)); + }); + shadow.getElementById("stopButton").addEventListener("click", (event) => { event.preventDefault(); event.stopPropagation(); + hideInspectorHighlight(); sendRuntimeMessage({ type: "stop_recording" }) .then((recording) => renderRecorderOverlay(overlay, recording)) .catch(() => refreshRecorderOverlay(overlay)); @@ -439,6 +677,10 @@ function renderRecorderOverlay(overlay, recording) { ...overlay.state, ...(recording || {}) }; + currentRecorderState = { + recording: !!overlay.state.recording, + mode: overlay.state.mode || "record" + }; const recordingActive = !!overlay.state.recording; overlay.host.style.display = recordingActive ? "block" : "none"; @@ -446,8 +688,65 @@ function renderRecorderOverlay(overlay, recording) { const count = Number(overlay.state.count || 0); const label = `${count} ${count === 1 ? "action" : "actions"}`; - overlay.shadow.getElementById("statusText").textContent = `Recording ${label}`; + const mode = overlay.state.mode === "inspect" ? "inspect" : "record"; + const playing = !!overlay.state.playing; + overlay.shadow.getElementById("statusText").textContent = playing + ? `Playing ${label}` + : mode === "inspect" + ? `Inspecting ${label}` + : `Recording ${label}`; overlay.shadow.getElementById("pillText").textContent = `REC ${count}`; + overlay.shadow.getElementById("hintText").textContent = mode === "inspect" + ? "Hover elements to preview selectors. Click captures the selector without activating the page." + : "User actions are being recorded for the agent."; + + overlay.shadow.getElementById("recordModeButton").classList.toggle("active", mode === "record"); + overlay.shadow.getElementById("inspectModeButton").classList.toggle("active", mode === "inspect"); + overlay.shadow.getElementById("playButton").disabled = playing || count === 0; + overlay.shadow.getElementById("clearButton").disabled = playing || count === 0; + overlay.shadow.getElementById("copyButton").disabled = !String(overlay.state.script || "").trim(); + + const inspectTarget = overlay.shadow.getElementById("inspectTarget"); + const inspect = overlay.state.lastInspect || null; + inspectTarget.classList.toggle("visible", mode === "inspect"); + overlay.shadow.getElementById("inspectSelector").textContent = inspect?.selector || "Hover an element"; + renderOverlaySteps(overlay); + if (mode !== "inspect") { + hideInspectorHighlight(); + } +} + +function renderOverlaySteps(overlay) { + const steps = Array.isArray(overlay.state.actions) ? overlay.state.actions : []; + const list = overlay.shadow.getElementById("stepsList"); + const visible = steps.slice(-6).reverse(); + if (visible.length === 0) { + list.replaceChildren(createShadowElement(overlay.shadow, "div", "empty", "No recorded steps yet.")); + return; + } + + list.replaceChildren(...visible.map((action) => { + const row = createShadowElement(overlay.shadow, "div", `step${action.id && action.id === overlay.state.playbackStepId ? " playing" : ""}`, ""); + row.appendChild(createShadowElement(overlay.shadow, "span", "step-kind", action.kind || "step")); + row.appendChild(createShadowElement(overlay.shadow, "span", "step-selector", recordedActionLabel(action))); + return row; + })); +} + +function createShadowElement(shadow, tag, className, text) { + const element = document.createElement(tag); + if (className) { + element.className = className; + } + element.textContent = text; + return element; +} + +function recordedActionLabel(action) { + if (action.selector) return action.selector; + if (action.url) return action.url; + if (action.key) return action.key; + return action.title || "-"; } function beginOverlayDrag(event, overlay) { diff --git a/extension/edge-share/popup.html b/extension/edge-share/popup.html index 9b55dfa..114eb2c 100644 --- a/extension/edge-share/popup.html +++ b/extension/edge-share/popup.html @@ -123,7 +123,7 @@ .record-actions { display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-columns: 1fr 1fr 1fr; gap: 8px; } @@ -247,6 +247,8 @@

Edge Share

+ + diff --git a/extension/edge-share/popup.js b/extension/edge-share/popup.js index 12e6bcd..209d0e2 100644 --- a/extension/edge-share/popup.js +++ b/extension/edge-share/popup.js @@ -8,6 +8,8 @@ const shareButton = document.getElementById("shareButton"); const stopButton = document.getElementById("stopButton"); const copyButton = document.getElementById("copyButton"); const recordButton = document.getElementById("recordButton"); +const inspectButton = document.getElementById("inspectButton"); +const playRecordButton = document.getElementById("playRecordButton"); const stopRecordButton = document.getElementById("stopRecordButton"); const clearRecordButton = document.getElementById("clearRecordButton"); const copyScriptButton = document.getElementById("copyScriptButton"); @@ -25,6 +27,8 @@ document.addEventListener("DOMContentLoaded", () => { stopButton.addEventListener("click", onStop); copyButton.addEventListener("click", onCopy); recordButton.addEventListener("click", onRecord); + inspectButton.addEventListener("click", onInspect); + playRecordButton.addEventListener("click", onPlayRecord); stopRecordButton.addEventListener("click", onStopRecord); clearRecordButton.addEventListener("click", onClearRecord); copyScriptButton.addEventListener("click", onCopyScript); @@ -37,6 +41,9 @@ chrome.runtime.onMessage.addListener((message) => { if (message && message.type === "state_changed") { renderState(message.state); } + if (message && message.type === "recording_state_changed") { + renderRecording(message.recording); + } }); async function onShare() { @@ -94,7 +101,39 @@ async function onRecord() { clearError(); try { - const response = await sendMessage({ type: "start_recording" }); + const response = currentRecording && currentRecording.recording + ? await sendMessage({ type: "set_recording_mode", mode: "record" }) + : await sendMessage({ type: "start_recording", params: { mode: "record" } }); + renderRecording(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onInspect() { + setBusy(true); + clearError(); + + try { + const response = currentRecording && currentRecording.recording + ? await sendMessage({ type: "set_recording_mode", mode: "inspect" }) + : await sendMessage({ type: "start_recording", params: { mode: "inspect" } }); + renderRecording(response); + } catch (error) { + showError(error); + } finally { + setBusy(false); + } +} + +async function onPlayRecord() { + setBusy(true); + clearError(); + + try { + const response = await sendMessage({ type: "play_recording" }); renderRecording(response); } catch (error) { showError(error); @@ -191,9 +230,15 @@ function renderState(state) { function renderRecording(recording) { currentRecording = recording || {}; const count = currentRecording.count || 0; - recordingStatus.textContent = currentRecording.recording ? `recording ${count}` : `idle ${count}`; + const mode = currentRecording.mode === "inspect" ? "inspect" : "record"; + recordingStatus.textContent = currentRecording.playing + ? `playing ${count}` + : currentRecording.recording ? `${mode} ${count}` : `idle ${count}`; recordingStatus.classList.toggle("active", !!currentRecording.recording); recordedScript.value = currentRecording.script || ""; + recordButton.classList.toggle("primary", mode === "record"); + inspectButton.classList.toggle("primary", mode === "inspect"); + playRecordButton.disabled = !!currentRecording.playing || count === 0; stopRecordButton.disabled = !currentRecording.recording; clearRecordButton.disabled = count === 0 && !currentRecording.recording; copyScriptButton.disabled = !recordedScript.value.trim(); @@ -228,6 +273,8 @@ function setBusy(busy) { stopButton.disabled = busy || !(currentState && currentState.sharing); copyButton.disabled = busy || !(currentState && currentState.shareUrl); recordButton.disabled = busy; + inspectButton.disabled = busy; + playRecordButton.disabled = busy || !(currentRecording && currentRecording.count > 0) || !!(currentRecording && currentRecording.playing); stopRecordButton.disabled = busy || !(currentRecording && currentRecording.recording); clearRecordButton.disabled = busy || !(currentRecording && (currentRecording.count || currentRecording.recording)); copyScriptButton.disabled = busy || !recordedScript.value.trim(); diff --git a/extension/edge-share/service_worker.js b/extension/edge-share/service_worker.js index 51f530b..fe14382 100644 --- a/extension/edge-share/service_worker.js +++ b/extension/edge-share/service_worker.js @@ -28,9 +28,14 @@ let state = { browserName: "", recording: false, recordingTabId: null, + recorderMode: "record", recordingStartedAt: "", recordingStoppedAt: "", recordedActions: [], + lastInspect: null, + playbackRunning: false, + playbackError: "", + playbackStepId: "", updatedAt: "" }; @@ -86,7 +91,12 @@ async function handleExtensionMessage(message, sender) { if (message.type === "start_recording") { await restoreState(); - return startRecording(); + return startRecording(message.params || {}); + } + + if (message.type === "set_recording_mode") { + await restoreState(); + return setRecordingMode(message.mode); } if (message.type === "stop_recording") { @@ -104,6 +114,16 @@ async function handleExtensionMessage(message, sender) { return recordContentAction(message.action || {}, sender); } + if (message.type === "inspect_target") { + await restoreState(); + return recordInspectTarget(message.target || {}, sender); + } + + if (message.type === "play_recording") { + await restoreState(); + return playRecording(); + } + if (message.type === "platform_request") { return handlePlatformRequest(message, sender); } @@ -186,7 +206,11 @@ async function stopShare() { lastError: "", recording: false, recordingTabId: null, + recorderMode: "record", recordingStoppedAt: new Date().toISOString(), + playbackRunning: false, + playbackError: "", + playbackStepId: "", platformOrigin: "", platformHref: "", workspaceId: "", @@ -230,6 +254,7 @@ function publicState() { activeTabId: state.activeTabId, recording: state.recording, recordingTabId: state.recordingTabId, + recorderMode: state.recorderMode || "record", recordingCount: Array.isArray(state.recordedActions) ? state.recordedActions.length : 0, recordingStartedAt: state.recordingStartedAt, recordingStoppedAt: state.recordingStoppedAt, @@ -629,12 +654,18 @@ async function handleCommand(command, params) { if (command === "start_recording") { return startRecording(params); } + if (command === "set_recording_mode") { + return setRecordingMode(params.mode); + } if (command === "stop_recording") { return stopRecording(); } if (command === "clear_recording") { return clearRecording(); } + if (command === "play_recording") { + return playRecording(); + } if (command === "recording_state") { return recordingState(); } @@ -808,9 +839,13 @@ async function startRecording(params = {}) { await persistState({ recording: true, recordingTabId: null, + recorderMode: normalizeRecorderMode(params.mode), recordingStartedAt: startedAt, recordingStoppedAt: "", recordedActions: actions, + lastInspect: null, + playbackError: "", + playbackStepId: "", activeTabId: tabId }); @@ -819,10 +854,26 @@ async function startRecording(params = {}) { return recording; } +async function setRecordingMode(mode) { + if (!state.recording) { + return startRecording({ mode }); + } + await persistState({ + recorderMode: normalizeRecorderMode(mode), + lastInspect: null + }); + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + async function stopRecording() { await persistState({ recording: false, - recordingStoppedAt: new Date().toISOString() + recorderMode: "record", + recordingStoppedAt: new Date().toISOString(), + lastInspect: null, + playbackRunning: false }); const recording = recordingState(); notifyRecordingChanged(); @@ -833,9 +884,14 @@ async function clearRecording() { await persistState({ recording: false, recordingTabId: null, + recorderMode: "record", recordingStartedAt: "", recordingStoppedAt: "", - recordedActions: [] + recordedActions: [], + lastInspect: null, + playbackRunning: false, + playbackError: "", + playbackStepId: "" }); const recording = recordingState(); notifyRecordingChanged(); @@ -846,6 +902,9 @@ async function recordContentAction(action, sender) { if (!state.recording || !sender?.tab || !Number.isInteger(sender.tab.id)) { return { recorded: false }; } + if ((state.recorderMode || "record") !== "record") { + return { recorded: false }; + } if (!isRecordableUrl(sender.tab.url || action.url || "")) { return { recorded: false }; } @@ -872,19 +931,149 @@ async function recordContentAction(action, sender) { return { recorded: true, action: normalized, count: actions.length }; } +async function recordInspectTarget(target, sender) { + if (!state.recording || (state.recorderMode || "record") !== "inspect") { + return { inspected: false }; + } + if (!sender?.tab || !Number.isInteger(sender.tab.id)) { + return { inspected: false }; + } + if (!isRecordableUrl(sender.tab.url || target.url || "")) { + return { inspected: false }; + } + + const inspected = { + at: new Date().toISOString(), + selector: String(target.selector || "").slice(0, 1024), + label: String(target.label || "").slice(0, 512), + tag: String(target.tag || "").slice(0, 64), + url: String(target.url || sender.tab.url || "").slice(0, 4096), + title: String(target.title || sender.tab.title || "").slice(0, 512), + tabId: sender.tab.id, + windowId: sender.tab.windowId + }; + + await persistState({ lastInspect: inspected, activeTabId: sender.tab.id }); + notifyRecordingChanged(); + return { inspected: true, target: inspected }; +} + +async function playRecording() { + const actions = Array.isArray(state.recordedActions) ? [...state.recordedActions] : []; + if (actions.length === 0) { + throw new Error("No recorded actions to play"); + } + + await persistState({ + playbackRunning: true, + playbackError: "", + playbackStepId: "" + }); + notifyRecordingChanged(); + + let caught = null; + try { + for (const action of actions) { + await persistState({ playbackStepId: action.id || "" }); + notifyRecordingChanged(); + await playRecordedAction(action); + } + } catch (error) { + caught = error; + await persistState({ playbackError: errorMessage(error) }); + } finally { + await persistState({ playbackRunning: false }); + notifyRecordingChanged(); + } + + if (caught) { + throw caught; + } + return recordingState(); +} + +async function playRecordedAction(action) { + const tabId = await playbackTabId(action); + if (action.kind === "navigate" && action.url) { + await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { + url: action.url, + active: true + }); + state.activeTabId = tabId; + await waitForTabReady(tabId, 10000); + return; + } + if (action.kind === "click" && action.selector) { + await runFunctionInPage(tabId, clickSelector, [action.selector]); + return; + } + if (action.kind === "fill" && action.selector) { + await runFunctionInPage(tabId, typeText, [action.selector, action.text || "", true]); + return; + } + if (action.kind === "press" && action.key) { + if (action.selector) { + await runFunctionInPage(tabId, focusSelector, [action.selector]); + } + const key = normalizeKey(action.key); + await sendKeyEvent(tabId, key, "rawKeyDown"); + if (key.text) { + await sendKeyEvent(tabId, key, "char"); + } + await sendKeyEvent(tabId, key, "keyUp"); + } +} + +async function playbackTabId(action) { + if (Number.isInteger(action.tabId)) { + try { + await chromeCall(chrome.tabs.get, chrome.tabs, action.tabId); + state.activeTabId = action.tabId; + return action.tabId; + } catch (_error) { + // The original tab was closed; fall back to the active tab. + } + } + return getTargetTabId({}); +} + +async function waitForTabReady(tabId, timeoutMs) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + if (tab.status === "complete") { + return; + } + } catch (_error) { + return; + } + await sleep(100); + } +} + function recordingState() { const actions = Array.isArray(state.recordedActions) ? state.recordedActions : []; return { recording: state.recording, + mode: state.recorderMode || "record", tabId: state.recordingTabId, startedAt: state.recordingStartedAt, stoppedAt: state.recordingStoppedAt, count: actions.length, actions, + lastInspect: state.lastInspect || null, + playing: !!state.playbackRunning, + playbackError: state.playbackError || "", + playbackStepId: state.playbackStepId || "", script: renderRecordedPlaywright(actions) }; } +function normalizeRecorderMode(mode) { + return mode === "inspect" ? "inspect" : "record"; +} + function recordedAction(kind, fields) { const actionKind = String(kind || ""); if (!["navigate", "click", "fill", "press"].includes(actionKind)) { @@ -1241,6 +1430,20 @@ function typeText(selector, text, replace) { }; } +function focusSelector(selector) { + const element = document.querySelector(selector); + if (!element) { + throw new Error(`No element matches selector: ${selector}`); + } + + element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); + element.focus(); + return { + selector, + tag: element.tagName.toLowerCase() + }; +} + function normalizeKey(input) { const aliases = { escape: ["Escape", "Escape", 27], diff --git a/src/mcp.rs b/src/mcp.rs index d482652..cdbea23 100644 --- a/src/mcp.rs +++ b/src/mcp.rs @@ -345,6 +345,13 @@ impl McpRuntime { SharedBrowserClient::new(share_url).start_recording() } + fn set_shared_recording_mode_from_panel(&self, mode: &str) -> Result { + let share_url = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser"))?; + SharedBrowserClient::new(share_url).set_recording_mode(mode) + } + fn stop_shared_recording_from_panel(&self) -> Result { let share_url = self .active_share_url() @@ -359,6 +366,13 @@ impl McpRuntime { SharedBrowserClient::new(share_url).clear_recording() } + fn play_shared_recording_from_panel(&self) -> Result { + let share_url = self + .active_share_url() + .ok_or_else(|| anyhow!("active browser is not a shared-extension browser"))?; + SharedBrowserClient::new(share_url).play_recording() + } + fn managed_cdp_endpoint(&mut self) -> Result { if self.managed_cdp_endpoint.is_none() { self.managed_cdp_endpoint = Some(resolve_managed_cdp_endpoint(&self.config)?); diff --git a/src/mcp/control_panel.html b/src/mcp/control_panel.html index d56bc6a..335fe35 100644 --- a/src/mcp/control_panel.html +++ b/src/mcp/control_panel.html @@ -855,6 +855,8 @@

Agent timeline

Start recording here or in the extension. A floating recorder stays visible on supported Edge pages.

+ + @@ -1223,10 +1225,16 @@

Windows and tabs

function renderRecording(recording) { latestRecording = recording || {}; const actions = latestRecording.actions || []; + const mode = latestRecording.mode === "inspect" ? "inspect" : "record"; const badge = document.getElementById("recordingBadge"); - badge.textContent = latestRecording.recording ? "recording " + actions.length : "idle " + actions.length; + badge.textContent = latestRecording.playing + ? "playing " + actions.length + : latestRecording.recording ? mode + " " + actions.length : "idle " + actions.length; badge.className = "tag" + (latestRecording.recording ? " badge-ok" : ""); document.getElementById("recordedScript").value = latestRecording.script || ""; + document.getElementById("startRecordingButton").classList.toggle("secondary-button", mode !== "record"); + document.getElementById("inspectRecordingButton").classList.toggle("secondary-button", mode !== "inspect"); + document.getElementById("playRecordingButton").disabled = latestRecording.playing || actions.length === 0; document.getElementById("stopRecordingButton").disabled = !latestRecording.recording; document.getElementById("clearRecordingButton").disabled = !latestRecording.recording && actions.length === 0; document.getElementById("copyRecordingButton").disabled = !(latestRecording.script || "").trim(); @@ -1237,15 +1245,23 @@

Windows and tabs

return; } if (!actions.length) { - list.replaceChildren(el("div", { className: "empty-list" }, "Press Record, then use any http/https tab in this Edge profile.")); + const inspect = latestRecording.lastInspect?.selector ? " Inspect target: " + latestRecording.lastInspect.selector : ""; + list.replaceChildren(el("div", { className: "empty-list" }, "Press Record, then use any http/https tab in this Edge profile." + inspect)); return; } - list.replaceChildren(...actions.slice(-12).reverse().map(action => { + const rows = actions.slice(-12).reverse().map(action => { const row = el("div", { className: "recorded-action" }); row.appendChild(el("strong", {}, action.kind || "action")); row.appendChild(el("span", { title: recordedActionText(action) }, recordedActionText(action))); return row; - })); + }); + if (latestRecording.lastInspect?.selector) { + const row = el("div", { className: "recorded-action" }); + row.appendChild(el("strong", {}, "inspect")); + row.appendChild(el("span", { title: latestRecording.lastInspect.selector }, latestRecording.lastInspect.selector)); + rows.unshift(row); + } + list.replaceChildren(...rows); } function recordedActionText(action) { @@ -1475,7 +1491,13 @@

Windows and tabs

document.getElementById("expandAllButton").addEventListener("click", expandAllWindows); document.getElementById("collapseAllButton").addEventListener("click", collapseAllWindows); document.getElementById("startRecordingButton").addEventListener("click", () => { - setRecording("start").catch(error => console.error(error)); + setRecording(latestRecording?.recording ? "record" : "start").catch(error => console.error(error)); +}); +document.getElementById("inspectRecordingButton").addEventListener("click", () => { + setRecording("inspect").catch(error => console.error(error)); +}); +document.getElementById("playRecordingButton").addEventListener("click", () => { + setRecording("play").catch(error => console.error(error)); }); document.getElementById("stopRecordingButton").addEventListener("click", () => { setRecording("stop").catch(error => console.error(error)); diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index 6546fc5..6281290 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -244,6 +244,26 @@ fn route_request( } recording_response(runtime, "start") } + ("POST", "/api/recording/record") | ("GET", "/api/recording/record") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "record") + } + ("POST", "/api/recording/inspect") | ("GET", "/api/recording/inspect") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "inspect") + } ("POST", "/api/recording/stop") | ("GET", "/api/recording/stop") => { if !has_valid_control_token(request, control_token) { return json_response( @@ -264,6 +284,16 @@ fn route_request( } recording_response(runtime, "clear") } + ("POST", "/api/recording/play") | ("GET", "/api/recording/play") => { + if !has_valid_control_token(request, control_token) { + return json_response( + 403, + "Forbidden", + json!({ "error": "invalid control token" }), + ); + } + recording_response(runtime, "play") + } ("POST", "/api/share") | ("GET", "/api/share") => { if !has_valid_control_token(request, control_token) { return json_response( @@ -382,8 +412,11 @@ fn recording_response(runtime: Arc>, action: &str) -> HttpResp .and_then(|runtime| match action { "state" => runtime.shared_recording_state_from_panel(), "start" => runtime.start_shared_recording_from_panel(), + "record" => runtime.set_shared_recording_mode_from_panel("record"), + "inspect" => runtime.set_shared_recording_mode_from_panel("inspect"), "stop" => runtime.stop_shared_recording_from_panel(), "clear" => runtime.clear_shared_recording_from_panel(), + "play" => runtime.play_shared_recording_from_panel(), _ => Err(anyhow!("unknown recording action")), }); match result { diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 79d4e4c..982e326 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -221,6 +221,10 @@ impl SharedBrowserClient { self.call("start_recording", json!({})) } + pub fn set_recording_mode(&self, mode: &str) -> Result { + self.call("set_recording_mode", json!({ "mode": mode })) + } + pub fn stop_recording(&self) -> Result { self.call("stop_recording", json!({})) } @@ -229,6 +233,10 @@ impl SharedBrowserClient { self.call("clear_recording", json!({})) } + pub fn play_recording(&self) -> Result { + self.call("play_recording", json!({})) + } + pub fn call_command(&self, command: &str, params: Value) -> Result { self.call(command, params) } From a096eb48bf8f39e19c5f6eb5f620d7304e491060 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Fri, 26 Jun 2026 05:20:16 +0000 Subject: [PATCH 22/29] feat: add playwright crx edge share extension --- artifacts/edge-share.zip | Bin 27830 -> 1453924 bytes .../20260625_124424_control_panel_redesign.md | 1 + .../edge-share-crx/PLAYWRIGHT_CRX_LICENSE | 203 + .../edge-share-crx/PLAYWRIGHT_CRX_NOTICE | 5 + extension/edge-share-crx/README.md | 29 + extension/edge-share-crx/background.js | 143484 +++++++++++++++ extension/edge-share-crx/codeMirrorModule.css | 344 + extension/edge-share-crx/codeMirrorModule.js | 16684 ++ extension/edge-share-crx/codicon.ttf | Bin 0 -> 80340 bytes extension/edge-share-crx/connect.html | 149 + extension/edge-share-crx/connect.js | 95 + .../edge-share-crx/edge_share_content.js | 66 + extension/edge-share-crx/edge_share_relay.js | 1655 + extension/edge-share-crx/empty.html | 8 + extension/edge-share-crx/form.css | 53 + extension/edge-share-crx/form.js | 7168 + extension/edge-share-crx/icon-16x16.png | Bin 0 -> 593 bytes extension/edge-share-crx/icon-192x192.png | Bin 0 -> 16906 bytes extension/edge-share-crx/icon-32x32.png | Bin 0 -> 1330 bytes extension/edge-share-crx/icon-48x48.png | Bin 0 -> 5962 bytes extension/edge-share-crx/index.css | 2603 + extension/edge-share-crx/index.html | 32 + extension/edge-share-crx/index.js | 10229 + extension/edge-share-crx/manifest.json | 80 + extension/edge-share-crx/playwright-logo.svg | 9 + extension/edge-share-crx/preferences.css | 4 + extension/edge-share-crx/preferences.html | 31 + extension/edge-share-crx/preferences.js | 5 + extension/edge-share-crx/provider.js | 115 + extension/edge-share-crx/settings.js | 41 + src/mcp/control_panel.html | 2 +- 31 files changed, 183094 insertions(+), 1 deletion(-) create mode 100644 extension/edge-share-crx/PLAYWRIGHT_CRX_LICENSE create mode 100644 extension/edge-share-crx/PLAYWRIGHT_CRX_NOTICE create mode 100644 extension/edge-share-crx/README.md create mode 100644 extension/edge-share-crx/background.js create mode 100644 extension/edge-share-crx/codeMirrorModule.css create mode 100644 extension/edge-share-crx/codeMirrorModule.js create mode 100644 extension/edge-share-crx/codicon.ttf create mode 100644 extension/edge-share-crx/connect.html create mode 100644 extension/edge-share-crx/connect.js create mode 100644 extension/edge-share-crx/edge_share_content.js create mode 100644 extension/edge-share-crx/edge_share_relay.js create mode 100644 extension/edge-share-crx/empty.html create mode 100644 extension/edge-share-crx/form.css create mode 100644 extension/edge-share-crx/form.js create mode 100644 extension/edge-share-crx/icon-16x16.png create mode 100644 extension/edge-share-crx/icon-192x192.png create mode 100644 extension/edge-share-crx/icon-32x32.png create mode 100644 extension/edge-share-crx/icon-48x48.png create mode 100644 extension/edge-share-crx/index.css create mode 100644 extension/edge-share-crx/index.html create mode 100644 extension/edge-share-crx/index.js create mode 100644 extension/edge-share-crx/manifest.json create mode 100644 extension/edge-share-crx/playwright-logo.svg create mode 100644 extension/edge-share-crx/preferences.css create mode 100644 extension/edge-share-crx/preferences.html create mode 100644 extension/edge-share-crx/preferences.js create mode 100644 extension/edge-share-crx/provider.js create mode 100644 extension/edge-share-crx/settings.js diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index 9f8c1f7f4558d5984f76d72f6038dfdca94d236d..fb4c1162521d2f42704d838a481bc2775a7337c0 100644 GIT binary patch literal 1453924 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%0A7|ez4xO{_CJTsD`&rs-YnnY^bS-wJzCqT)jd> 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

%{jvHI z+pY0oh$3%bN0;JfDf~p(oen>K(pK?i^kFnU8+qAcjeEPTENXTBjs ziwD=yQtge(MQ`c5TC%wtBD^edx!LO=|9N{nL+{)8`{SejG$HC0FOC?5(%r&N6fW9BfyRpReT} zxN_4fNp)Ypyn}CWR&EPk>&7g3LlPcun&sTP3F1x>4xHI}tV4m2S`rF&Bn$wTz>N)c zO<8%#)u+^-U;-XP7(%cGx8agcEEn?|$ho}ooo6D;Z2q|n)_L%txQlFl&(~YY)T4yp z%OR`r?My{V(0)6tnLC0dUA23Z!_=_$jb+2fH&&dCNXPhWg+<`|(1*aRYI} zu!a=F@y1Gw;O~Uo%D)D3(l%oIG2I|w?}K33OCO2fCC}?d#PQbIYva>w+Q&N;!Cn)- zqHuJ#c8jlzczD4kHDpl{HqXVa2Rgx{lBFHNLIDvYzm*S(U&{Y2bX! zIDzi#gH8~FrbQY73w(U3?QHVT-LWPY+mzxd+2-0wn30*)8a0vbDIK&IJpV_ETd! zBd8E=)Y2BqYK!GvMcPe+NAitj%~&s&zPRd&N4T8f{uSknmKl}9F~`hqGP{wIrLs02 z&VLu)=1fP6xrv-F_?pNFQ8q}iy3gxZPdMN!QV+Adq)X^FQ<0+Mtfad&EhzHMPW)}~ zKsQRM=sBB4)_*Q_q+hNfTyLIq{T1CTt@MFYG23I4kW0e~xgpTNj}a1v+rM`dzS(8RG=dRbRXFm36I&e| zE%aX=huZE%aO`~lxvqo6pA*Tz!NXVv&)kpQz-)rd?qPz-{v;w zl?|O;1;c8^Q8|V6Pj?{)`@}3&0A1F>#@j6Fz_yT18+~MC78Hx)AH9h=>JLy17V8#d z6r-GdinT)c z*RWv4btH9??_rFj?PN9n!Z!<@sC*G>J4xojj?eb!oU~aqVEk?7yNv1X@un85@w7WE z5p0tFkmIXls_?WF!aP+gBvHgR6j8#U(Mh{EBcBaNG1@AT=HSZT6otR_n9_2h(s;EJ zhPYDYyy@Q+Sx8=|Mr{<(1Z`?9D8x=pB}Le^OH|?4z93eI{kEs7#ICdxV-_jKuHMCz zV;s7CUG{7=C_il;lGKlU_2tKx{g?d1tNyftR}%D%{9vCz_7B*TCgpTCEGu62m-4gt zEn}uqiQUvzeO^rZ3~pf%X@q_RP0EIJNxpjxpB4BVhA`1JihfAgQoLqU;QsD~08SJX zN&FUyf5VWqEC!1R85f6(-rC?wob}V+iUJjnjwD36-s&cxDdDp*BnF$;pyD$jCj$-~{sT z-{R#qFIlG*PK%rqS(6tV+dpqU*?YOUz4z?JtLGapHePOTJmEDq-)!$~KHYo$=;cov z{JY%{UcK4+dGFEF?Ty!a8=Fs+3U6L+{rv3dwyX2<$==3aO(!Hv7tbi_-dB+jnEx8@ z!z&1I1sZtB=1HGg@$z8~QDS1GTWe^9B0f|kdj%A$L7lw>VBw&Xz|QlV`$i0r(HO3= zLaeZJJ}?;q97o2OnGs699xU$Pr;ABjx?z(qVZpL22)UlHbcL0^_WL##-DX8T?LugI zhZS$p$rQieW#7Rx#&j2EZj3nPh!k3fTb0^xmqoqOrb zy%M{a_T8}) zCPsR;<@uO$Z%~jF+(*AI5H1|q{B8QVYhRi6;*BQ!2l|u!$l(084uFCt7#`%?e%6cs zi&bD}@DK$)R$|&>i|5Oqu;Jzlm1JyX+S4^=Ld(_0l^QDAIjX7cG7WaWa>_A!mg@B_ zTiD9xh)?1O4*1m!UbXC(u%LLRoc?HFRPhl#3UbXt!m?9y3^)!Acoukw6?E7in&sDX z?daSlYMZXd6LW?e!EJUqEf0ZZ&q{c|IGveOq-)A>3h{;Phum}F~XeEk`P@97!@Fo2^2*B^Z@`Uhmmnt@r1%vqyvz;H1! z>Y$}|3%h7JYu9^F5c|i+rtxt#cEDi5Y^!}DDvS*~MlQjePDDwVlpF~`kO$iRVotM$ zJX4q;XYj>rt$55mqrvt)fvf&!*AmBbRvN0(;TPDf&xmZPZU|geJ~YFK?G`x%`Hte& zjod`Ci$_*tD@bfFb!$mf^Z>-xlW#7n1sZPyk2qFDi_=-ZGE)nPeRgBRWywN8?3Z-n zHw^gR>J$6S8BkL0_K{q-7<{yXEUxL;9iC#LUwWcpE-bj zdkx^sVRm@XhZpl_Mf)OhZnPXIGexmg`hhYw_t>&BjikOe+kNefJ(5teN55FD4_7 zU`bbk!wFhucXrvw!{hOpeeB||2cTfb9xQi7Np_k-CTyQarxWR#H&$-l`C$$io_;kC z=+3PlzGFksQuktkeKx}0N~)d4)!^v>d-{f;`d&z&kHWOldUNlOq5}S)r~xIDheI)R zGwt#nQ`&ZoH!aig`)}cf@>~-v?Kr*@Uh^S?bE)8U25+$ycbgu_TF_LvoQc8Zg^bLo z8Qr1AQjnIRUt=lV)hEwFQY2SI0SiveDT^nkfy(9nA!y-}Gj31^GbFmzp|WzN5r^zc zZJ2rr^Y0{6oMj-YO=OnQAzZdQkzb5+0JGTylx)>@nxP?``5sq=`AJyp))u1DKE8PN zZbYeJD@>k1o6V5YX3wXti<?(xRQA4`Y~2qZ$TgP{4A3tc8yn`+Y~5w>_fw5_PxYGHxVHEE}gdU%P*$%X0X zln@`$)z_oJ;4##+_{FWdMbHy+J==igzendjX|H^(m9+PYX$r!~neFk@>3HN#YINPv zZpBbqwz=3&D8y7zpM2S}WZ*{^naUa7xOFOa_+~;FyU)fk;QGaCotU=K6F zBUpNfAc%eO!~-WOkc|W0cpUY-nj0wL?p8Kg1vt$&zQOLUu_fBv4;7 z64R|?*+S%jD~lq zp?WQG&ci4o_JgJ2eb<>ZvjpA|K@gm>&NHFa6CxcRn_FiB2^%Qy4f)BD0Xb#A`B!2 zuluzoV%oyPcfN-BX_QZuZA%s}pQ}D0##W3s?5#65!`#uJD!G-6#}1PST8X)$nxR7E z9__>)3|J0GzAm#^)qskOSUyz04Wp*D+-Ko4G4Q`(Gq`69DjIs?@?uMGeXVLHoNA8?GX8FBR6%)0=p0Rk4)V!)ZV5G^iJk{>R?Wzq|l1 zhg;v>{_f85_Y{Vk#bP~~oX*OZ<(afYi!`~A_P|2oc1rGJ%U!M7Er{p`$|(fr_-XiK zE99?;_gQo&Ga5Nqjrs9%`oAFlu~<2K8Utrs&75Y7w0FgfW_ zNA&2FmO;M;-3&hHgN%rPpJfA`Xicmx;015kYjrIsHWH1-iA=mvj510;n{kJvjJio^ zSUAUJh0Z~v;tT+s(7md_={&}agib)oJ;&e{y6ou{gB#jU%;ieKS{!OQ_hPgXLITpq zdG9YYm z{yal#*%ApR4I+o*$}B$7<{iVo7Wy^VnMtY)=;Rp?Q8hfJ#XOc1=ybN8i`8ZMa}N@ zrtwa^H5_BkO~pbG*k8KS;#vL{=P}|zR3&eT?c}(0sbRTw!S598akF4TIZMG1s@oQl z02f|8lEy9lrD3~8I&h~|?*THLh?vi?g1ZHL-DI(8tZ11YI0M3(CULTs1-7rD-)EGO zT~o5=D~2b@Q!5$NqfQM3b1^+#ZfC1KEOv5bkX>(QH#!iAnWkZ)8UYmTNU@7VKY)9h z^*;?T2+;bUehuQ6(}>Llr}<#KfsxnRORg9eiu)TwNiPMLRkLCM3;g8eK{XqUPiNUO z@0wyC6ORT@fyUJFL&%D0{#`9jN6@LJ%y~6b+4KMyKe7O4^~R%v(rig1u$S=~fSxIA zx2P{uIv&xVwgS^c>3ay1(6tCY8y$|*o!!-MiN)<3(-Myod_j!>6UY~S^^W@08~iok z9>bw=k*gf>F1$4;`=iqd4+W71V--V3omUwm5VR8{pP?nwj>BnlJQ@IpulWy%K{+BwU?a2R95t!f1f)H{nIW1#d{sV~@e$QhgYB!SFof-T2}isK zcT2(R*+?DbGpbu8xI2#8lI1)bP2korj@{(ZjaOcF7h%|AAx1@9Cx2JD0v(qkPZyN* zU|LoaBj(Jx0?}dFL@lNBdkJ))R84oM$ayApQxSuDkPfLgG%MxQ^haCDMMjmisfavk zbtCTe2LryP@#SMV(#~kSxNu^XmFn1UowlzL_U3Xg%8vX_P`{AvPE31>z9N|1gs=9j zuSidFqwvdU98$j{GMcxJw}$!(!k{7za>*8LJJH6QMJO{7bfI?(q+djc7*2Hl6 z+S*JEupVh5?S6}DT2Mp%+5-lA={6(pni9Gf%Z*>VMrNJ_U)160J#j1Ek>R5xk+q+? z%|aSbGjdP5ziYLh+Hde)`Iv`th)qF&mcHKD{-f+}$_C2EZ_zO1=h3s9+TW86u;$FC z_u6zj%hnr|82w&sGkm}DY>*Bn*d_GtomhlT9LTS_=ZRx&$~#FM4D}&}c7$Klm5b`J zbIrQPEF4p8^pJp3y-pS!M1sWtmzHFy5C*CW_8J5h8T;ZVqwXcC+%VB+3d6|a%~S#D zoDjIP0TsjR*E@`{OwrD8*GdzwztgoJ-#m0WAT8os09`<$zwR(z?tw9cfNn4gYMeJg zMxpuOQ)1f|^1v)BbQN<@O)#oGwFzr;&RnI$WKuSw3p-S=eWeUMXKfmfgh$`UZgDu0 ztV;13lkiQZC4a(aTP|*eDnHUo8S5SUMRJ&H#KRZS6K1)1gFPBjXZ~uTB%0XS>dJqAYPY-#hnRXS-TF*A<9P&T-O&$rlr)=F1nf|lhzHVsHN4T<6~E^lJr`HRvb#NKbagm&yc>&F+0n215q)}c^(soa$zrijvHXPp$Gyi)TeBwNH$9G+n5kY41`;W&{+K~!;N zQo~1k4M7#NBDsNdO%RgqZ89HjBu(T*#Lr7HCNspTif*MG&i+O!>z4|nx{PywqeD<~ z{)q{aC1TK+ko>fkk_*TpWeXV$KGizddtZdy=(<&gdrH-UIACG@1uNBWezR)p&-0$K z#LjG!wHuszl^I=4#$#l3j&I}nq$gM3IcM(#IR&WuuY(e)L(Jbw0AZP>Bp}ZJf%j_JU(CzJJwyOZ&gsS8^=sGj zY-T&&gRN84%<#xhkivF(t@st)QCv%JI{5Ya_1JJR^a}}U?)>VF z6Hc=140oC0$C40O3|zUM{J}$D)qDHqXdewgJ%!9Uj;pzEG%*`ePnjOK$D%rVSuFU)SLP3SwmjVDZL9?%FL<@Wyel7 zApJrIVfy0?JZ`SVU@arg@H}{6V9d&SnA^?IROs0tjGn>7-U2n8(3V+4zHQhOli#pQ z@AnVDUw1T~*o7yOkl4^QQJfQq$VJ{(VoSiGTaesOLhDAk4r0}8x7teLLXa6Q09)H- z99qaaCX){YL|qwIZ8`BSd~(3W-Bd`+qK~tj$bS~22m*9GRASlt+(b4i5I4OqL^u4` ziFEeT!tVa^IwkeXCh`TxP#-`^DhUA%9*#syu=06W9uKI4(1@GTqSQo)H#*GmSyCHi zQo1BreU#`2m^4NNbz&?M=;)bCeSG34bVk!_s41y3U1RJW`QJ~$jOY8(Kg0w5>3tI;T6R_h!WVWWP(K`|54t4*yVb7m|L&N zq_KBZSn>_Rji-^uT~8rv#NHlO+S{X*my5V=O;2?P@xXz_(h^1#nfl{&pg*3lrjY~o zG<_&CWj16#_$Z!x>~y2Wtc#Xcdi3!qt{b#J_K&kGL56mIGDIWtTte2xv|rV7!pQ{Q z@gx55G-j<1I}G?%{+`$^Evd&*eZtkM;=Q06(7=Vh0e;XU9(d=?T59|((*XXVGp0U9 zQ?Yc(cm7E9P|Kea@*#unQ#wZf!Q`}ucTFO!@-sQNOTm8^77xKPLO>gehv#?@yA*Mn zl0<#KC9&CL+WGH~k;@Mp;mMw#twzDCG@M;%m470}KBCI1_8`*+x+fv^&&1L`TdG0Q z#in0y(_a`B>Zf*kSy29e8pXoS6Jt6zVT`s9%~8VrU-hW0t7$OfH8J?-vRb&-*XQ^v zcjUiVBAlBy3rb7}sDhaQ%w6x$2?X!Q-cjCw@ZnM{&7DhBvIle~G=$FaSWRRhkojEZB4J^4Sx8VOLV#?K2aS_NXn5n~_8Yu+4aG0&-Bc z1@=iZg)8HaZgAa=Kua94xG1rIh4uzpga7MzIBK`Tbx7>oXRFDVUm74A@JGPW>Y1aH zIYUQoA+A+al}8MS&Wst*XjdMw7qK*S#m4B~#Pf;f5Bsm+m2QC6;!kj;lCJv+C6}4$ zt8?{Pa_I8qc8Fj&?|CwB)s7oQcXpz(Hm=A$NE>E&S*%4sh+dttuj*1u3DqPDp?F?J z{7%KrrpIqMF!TA({o}*UiG4wu`u}Tl@r(0h-j3%$^P}aKmBiL?MjH|1JmH?d7F8EX zFp4GH+Q^Kv#EJt0g*;RxWP|=@R+OJ6kVp~|{dii;#s%i6`i8v2zwy06#;(Iq5Au0^ z0yoCt?D#XK=^7KQdcH~9qTo{p1*|-rKw@cN%#f&v4VLxq?_%Z;)1oK2SE zj~ni-^imZYQp0NSP?hKN@}-}+dWFr1U&-J#%|66d7_*nZEXnc;OO+W_Mga)_1H02% zxldkH)uTaw0uIq)6Flz!`{!SLl{Vi2)0VVuSx)42rr2R;3YB5!%p!^?&k54LW~R~+&0_T zVYk>b6|TjHWHC)5C5z))e%aLqNN{hg!g6mK(t~(M#LLkeFL5KcUS-ujAIrf7ptKoHR7mdB@%-x;HU6n@Rd|N|^4XN0Ko8 z7he!3Om`)E!gN>ab=S~Cp}{Y%Dq;E-c)b&)@y=wG{;|Y&Z)HMty!`&TUp=#N`?LAd zKR3;!u4PWAu(ba3_W1euteigX%k1br2|EACaDz!K^10E&epmd$sO|pl{UToAg-U+Q zzgTYcEq{@nq(ARb8Hc@K7Id~0ig}5_uOwgkRp%F9IC1#AwBcC(=K1zB^L_8}qvy|m zeDwG)p~wctfBfhrw0`yM)kaeGWW)Ti`8N*GmOOfH{(17Zy{FG!KHK_Psqpg6^XGd8 z?Kc}+N!c&2pKWi1Yy+YE&C9>M-2COG`S^JA$+MR~Nj7#_$a|P^olnI4)Y@t)Z_n=+ z%LMM4%S_MaUYk@a_B%`NtQ#rQ-5qW+}IZlOGn{(X;Nl$iK+!Eu*1MjaS^v^vND&c zo+6*u%p}<`Xg{iwlMzeo=c^P;4y>qiWr+;c%#bj1I?WEo(+@a$UcI7h_ThkzU&)a3 zij)Z*+IU1!5)A(I7rE7uMi(EmJ!a*>zVP!81r%?Jqt-t(9EEQ};T&(DRfeY1(wu8; z!XEatgKVh8IM~@OL4uI8G#T_{TGp_Sa0O6`L(^EAfG8}%%{@u+4wJ*X{^e-wd+#Sfnq-AZ5TUz=r%?$$;0*KRj4;Q?1hx_r6-r-@ z$2=O#In&o7Gk)*ALy;ZA3jZ;7(^RzLHd_>6SQ9@H|8P#w6ySCSGb3mn6j1BU)Z+C) z%UwLEMtfByC)yc#2H&OmCkUoN;DQzzNK^b6A4f4V z)X6vxfR}S*uvBd7cOjTOHxQVTPp2WFCY%1`UcFu3aXV#-Sog*D}nGjkNLHb zwklUmgVk=SO^w5&{3yH@N*mbi62pkNlC<9l8fsGbS1cKr*h&uZTr8$Xp(NC!8?XA9 zB+9nN4wY?|Qq&7yTIqEuHCfKs%ng{rXl(Vd6owhMdQ_HtHAh#T`p{qIDLF5rYe8gi zmbtAd7Rh@*bn#r; zMA?0M{;zo~%MGT=9#o&JG`VVa2NC5F9!~he89qfGOgkZ=++XlqBC}@%^q-O6Q%50m zAgA|tOX->9w+;8IVz-bPMsRh zX_WKQN_I~R87S5r^jzvEW;8E1r~YIzRZ|H{`5GT1#Oq4Z>$1s~xq!APSeZ`yfnMLm z)AAdF(lwmgwQWbyF6;@PNRfkQ;A9{+RbLqUP>0FgKYb3_zf^T+j*@d;Glt4ro|H^? zMOxZUa){=4MlV>oP{`jxB)bWY^=daLZK_igdek3vBi@EMP>|oksR$qUH{Y3a+Ogv)V0)g z+d$+H6B|SzhrOyCDS?ZG9YyhtjQc>d3MBe)ui5b4c0AERTO*9-bE)RlV3s~V^|BC^ zE!VkHA&y)U@(9I-%tEThr6RK(=aK<4_I|SvlavU-aV?XkAxY=BTLa3X*W`xynN9H))62iKghIn*Wd*A0)5#$vDlL8vv{h;Jj265U8AWnVa)?w8 zM@(z1O*@`kyt0(z+&BGPXH*fgBI52~?3O#njrDkuqyWUN1F5lmOpu){h#|#yQW1;6 z3LigJk`9jPlcy!UNbjqzX1;Hc7D?07`6@^v@c3nrJsdS!M729b;`1Er**=Y?G`(jG zXHoBo?M$Nw-wV^*C+@J^k1W3^cB%CGzK zHxb9bB99AAXD+2DD>>)3fRuG4a@{=6np0>z4THRexGh< zK0FRPF3DRtoueIxO%!Whv(nzv$$I}-oycqO=V_-qqg~l*(UY9A*D{6P zJ6HPU+?FVZzWm-M{Z2*Y$l+9!t90aq5H;7T0{S88d9?=v(CDmVYh`l;KF(}k3r#1k)+Ojh68V|uz8 z-8u>P`C=`0nIkn@J6uP)%?ew&dyhBtFx?iy*=L?Bl%f`A8VplqxK2t41BhZ@_kJvm?mI#d zi&&uWuVE|OVQV@%yGWZU{HL%fKau#qcbPSHKiaP(5gTTIB)dz8E3moih~TH=R)bQh z91WThbdigg^kz7BwJ$<`xm!}ceEEe3i^LrG`wCqNWTa>1wo`^M^QouR;D-G2p!U{H zEPANVZl*VqxMy?`>K}{C#nto@tXK~_CQc;XzojP{+$F7nFm?-2Y|HUAusjAzJ9y4Z zD7t73AR_PB^xD|@$?f8UrEek_59p$A(0&GlZ=zvRY?5;(3XJE+bu@7 zEk?H^3qa^M9^dUKGb{Zkh8cjaMHQ8s6E>FHni%y>#qV?Nxf;J!V!PP3Mx~^`8pd{U z9fa5}W-?r07Ygg*tIQAU(zboG=sN)+4<`-lQWMlAx=va!=&$ys*q(B)Ao`zl?tiE| zMP6m}ze{6ti6DOpI4w|UuD>XfUm`iEf7kkgp_tF=-@ULny=Sl{&O-bi8H)KV3dMXT z&cJ8<%yUL3)*KzLgo-RcM3ZRDuDTP0zdu`fNnOY0>3i|tAF+nvRb8Wo(S{d5%ZCz{ zc(Lc7wFotfZFy-jS$=LpBA<@=qD$26akc9dwfZx=JhTT_VJV-*k_K0$7#A#c`Ve^< zWX8ByXza^#!~AgAuKr`R>iq$`7FiEh*tK;P%==JSD)78=#LB+ZjI18#N_ZXo~NCi5bUiA7xwOGdfe{{>0 z^N$HeTzT@aw|I4rl9+#wnmy5CB@(<&xeudezSS;>PDeVa{r6nM2Grj7W}Qs;I~yBj z1QUa4`MQMN*g&DzxVsTt@wSKsTl?Q4K%pPF5}+_}-vt8{I^Ylp@D~9r4?CTbOn^dH z-T)ifcL+=9zQ+(f4oNUM3ST$C7zo3|&q@5cC!r(`VCReU2zI{MD-NueLhYltNDw=c z14gwxMa8@(7MkV2%13Loza5#}?`JM7r~Uns9?`i!c8?FO99N;-D65-?)bQFJCEg$GedO6~1+`h@s}QzsflzDW^XrZ6H?LpPyJp&5 ziX=Q4!@?i5r@W#Xl+H&RQKE}bjo03q;p+H^n5>o~XQ<_uiolGru{|jb?-<6kS*T*# zOB6AvYp4K=kr)4XJl==m_vYXJ@ivH5_ypS(=Un_4S`90#wC=JT5)^!O0h>8?|EGSmzHw_m70Waj8$K#QispI2v8VxKeMVpgcxkDqrqFS8% zNw^5G^3}#{JUH%GRS_hJ+0)Ho!+qhZ2wZxOr%H5}>U2_0<9ISQ<=3V1d^tl~M~_jh zW8$eJiK2J`B;&uqHc|vuUy}x#_1lDX};$%Ved}e^sgdxH>$)( zLffzw=_c3-=X7&f@Z#{rhbK}!Djm!1^&=_R z_U4n#qCFjt`tLidg|NdsWHsYNuKXrWj)oP`xY!3fLjUEw6H7xP)ag6?DSZW*+j)~uo?u39u?d_GnpH~T=w@Z=U2a5N=G#ZXdr z5@apj3D^AEEoceZty{n)?e(2vc|58 z<02u{oEh8kt3daik^{HZTXOFH5&ol;sg^_5l49L=O=SP{)Kr~D=7Eam1R=>Omvgq* zLTtiy{(N+X0QXACZjI53}`(7WO2DqC81(X+zI=DnCk_Hio z-jqS}>=|vHi|vp?*!d5stV3D^H5VRIXnWs6;JhB0P|edzZi$(l@De?ffF|0u(E55& zkn#xNK&C#+R0}p6gvi|s{Ra!#ehNp0hpIv1GPpi0F5KAsj@L?nyJ{P)iP1Zhca+jHB!#V+tBfq`zd<7ooh&QB?p? z7!is;|4UU-<|rsO@J_68@U6&Ji8epBA*nh@jRxX?$1%$4bdSaYTb^~q4b!D||87Xnab8UN!zr(3 z4RtO1#lHgbhf*cjra0Ri`bUPq#9y33)rBWtuLWladgF^RQQLIQ<#{kRS3dChZj$WTGXgjQwvv{y!`%v?-#(DsmCs!@0VH2vxqZ-Au zz1XCSwx5UP@j$+;Vym>>aqJjSB&>w8EAJ9rRdIf!M@@Ba#=^wyxk0SE;qWt(E0UA$ z+K97K@){3jPdW1V_jW>$cQv$g&lMv|c*TdbdbDIJDS@3?n#hDac^$iDMKC0OQMPc= z!nSmfRPsg~UNXVgpfZ841#Pe5JN^+xS~9z|H%4K0D$xRT4Do?Wl{43Gxcq}c%7hy9 z&!wfHO}5=o@xGU-X;8^upq#Nv#J zz$o0$h;{I#k7UAVN?GJ#c@7>VSK*8W@PG6BezW78qYHP;TUu(%*GAJw8=h+E+ql3` zAf5?`XA#8Ujj2GaQA~4csatlLEQ{s1YM*sA<%@G%bU&cX4_DQuIaRHQImyqX|7+0f z-LsN*4hPuNg>>ZY?*kX4j|F%&yPS$N79!hU7~(Dpe?VM8^Nc674OU!8B}7>auV9GqD?~E; zRAqK9ga0^YpCSoe-}OWcyG)jhQnEW7*rn#8Q%v~5^WF?<+M!OYW!yxSFvsxU9L;(E z6mn;hfNdvAES4rw-<2_2B-TWYRQWxR;4j&snSPSDP<5>%xnQ@Z8XvMmL{QZJ=@j!P z*ll!48EJTx&D8P4gqxjzec@-;9kHO@(iL3vM4o9}LZ=j@@-!@{vv@&e*BVm*!|C6t zgQ?dOcecuSTIJlV>U^vs2P^15sUuyhh$8b-asE`!HqS;bQ^=FDI+zY8Gv_!&b^cO* zu1VkdRZ;7{F>uH|@u**=TaTKckhKjO(Vbey}yVL`iOQIl?e5&{?@MP?g$b_DBOd7rr zyCfDiUyF)C!#6jV#DIFyF=+g*@RB%$B)l3H4WB|?5(nx<$DrBcyh|d0o#_2He~NcW z9DGL-kBh%s4liNF*21p^^|wdj!3IB@=x+qW=|nv0lKYu>{8RfN%I^aWA4|)@>Cm;; zzd8JpH`JGXbp4e(wEhb}tg$DGfih>&{2czb<*z!(nAi4LFY!OCTyTy^>1YtN0WQ&Wo# zCv=hz>!>|X>ESDw(0=~IlP^jBbPg9KfO{yS9wa@|T-3*EXoKdi5ku{R3yxy&vD9q0 z{6}IOKks3}n;qx^2Z%GB0%nb!ik&F^`7-I~RUj=Jzfe5;<>uF@OBwYjyl!Cf-)z&q zSO4)y>f(G`E%f1q;^hA476fq_jc3^ZN&mR0hK9OE`kM9gvE=Rgkk;vat2jFZ2|K#S# ztbkuD{O9JxjPB;`mG8g*?t)G4{%~j6H_aSplC!CtDWiGZa@!=Aigu0UO#s^Fon~>O z)aGtc$RNhe(?HLHj8n51vvQ@;S`FmGuJbDiP z3~P_6EAaoyp2jXET}E)V7GEd}+`Bdm<2(ym4bz)cL@sdo8$}IM? zf97^77F|}1eoix4_rCirwr+Lo`75Jzn@H}+zX}UB&sMp6NVn!#ABlTQ(B`6=4u!hC zEFGl}VyHDMP@bHS4#m5I$s2?C$1+PDf-il0LO%4&YXNHM@1(3Hx zp9GbkSkm)QRu^ZmxH7NsK_eKfrBu~forcOfYa!Kj6%?^YKs%>m0RyRHZZ5`o;1X1& zSq^N@n}RhgZw@D=QFY6`G=7oD5O6haI*0#VsgHNS0@qwRcmuIO|NZ-E z`QFIq?XxkR$7Ns&E5;THPoXs7kH&cUi)UL~&tConjkoysILf?I_UiS%SnBEpirTK>kX_F(8ryN%)dD+(|xoN&3ah zf+#wPv#8YvF>znr1%f1n62|0r3NHZ$yhz@|Cx@Q<-5(6F@$+FdD@W8cJoooLAU=pL zZ0Sav(aQvuh5=x)n@f?j6r19~3_VfIp-jH^RBt@pVZf>b$7O$X3JI6No6NS0LK6r5 zMLKK(y1qy{Y?>mc(6}mE&ZdChlF!sp@4{{=r>1}c2^?}R#D}tM$ZaJ~8J`%N(;=TP z0>pYN`0)DyThbEIlQZ&UJaH>`mGZ)tq@inWx^Ab3 z_LKgHQaq>OkxtVW`ss^GAH$TVFVY?ps;v*1>7FV5&7LE*OasIHJN~5+yc-YCg5q~V zyWurCz>goqB&cw$$h+$J0nGC*a)ZE!9p5VcK|9LcOzFtlc{Gd3>B(e!3}kH&{i9{? z<=ib?_JA)1qzO9b@&sel*&I5~i#~lD;cTtd=?N4h3r;!y5nvD|@oEl!pV(3Qa)X^q ze66rXbquj}dg=-*&YzOuh0(f|j;OI(y{O%`a6tfrBCU-u%Hcy5T|xG&$5Bon;p?FD z;MFduIz3*=7^lu7s@Q6tPlP8n&Gr2KA#hpE4k2EO2akW~fy;Lui9k5@_mYch@t_8$ z6#gf55(Q5@LY(t;c=jDXVoEU%uLj9f@QT0eIvqUpokEO>-hu zi>GktQ*gkl0|OguRu2^&*w!J3(_)qRot~2^?KsSWo$`PZW0u3i47WI=ohqc@b$xi@ z(LhMi))DE8?7c@I0e{w!vJMx&;eB{H6_wwYvtRIQTVcsOFDVZBent@-`s#gN6KqgU z1%vf)R@|Vphy9D+^=S|xF7p{ zX2+64IkvVL0!FE`W+V&OjXGpOrw5mjw8R;XpBV^(#V0qQM*Jz97M)F_rycmLy9e4= zf;>V^D2#-8bNGr%pK|axIDxjN*fB>TVQ;Azox=h1G2~D$e5%km-;1*KATjZ7;KmIB z1MkH-b`h}9FuD@LWY#gkLUKKbIQoSCSQ_TToNV1)3aBbJ+}rLH}!W3@xndmrpohvFL0f{!ow@^EyBGuwuv;g#}879s_!4{A)g83 z@CG8dnvg4c3Np=HZA~9o`#~IQ3rkSk=#wV}F3Rh3KNW}oz{w+=L{hZ0 z5X*!PhbSbYr(WqTyIr2@l zM+%Qd=4A018Lk_B%0zUfnW9KiB3Btlwl?G|{5P3d>qi>P73r!%O}26dEwZQO0p*hG zCXLS%g6OeiEdp8;m-)RmiFB%2ej|yWU(7Ykz^)Cj{ba_ha1lm^yyDAw9w~Weiy}_n zXSB`JE}`*ja%OQp?R zJr<{yqG}O`Ttt2So%B?}H**dk**nCPjkx{c`g*aFQZ3wNfVq!o#KzQMRz}mL#?g$d!_Z2(4p0i z@OXgYq+rMKbfo#oTR@sKSQVWrykSvF8RvzF6cwvjNeKyP9cDpOSd=)v!3lDYjkcUSx7z#CVj(_aF$DZ-FKzEC`h2AILLoXEA@hc67p72y> ze)yqolNZ;`69*C%>vA{dvOgxi%{d=v5eHp&g#K!t!!x1TI3puDuP1H<3}0r(m}JgUw{ri<^p7YNiRR~a~Y1{ufV}6JFOKx1`ccO&1 z=0H>u(r}K*x)VE?S>sQCcx+8z=vL>w-2#b(OPCDR&iM_x(K(Hk#5{&YqJuDM+ks!E zfU3SgSxMXh7TFGD5cLHksAuAxAGtvK?l|W^gmWBxY7+Q70*zC{LHiE@G<<3jrF}K^ z(hh2-CwX#)QkX6=)Y23Rro3pBbE_XZa?K5Ot_M5MSnBHno@abVnua|uXo{2jr<&;J zq91HMHwb!781#98(Cb2>$6+D_Ei}QzH|1pVrIdg}M`qC%59PWjR`K_m0!esi-%dTW z?Nm9YlTPQ2Suah3Sm(YC|222vmbA3v%dl=fRbnQb!hGh9DRQ;rw?5?y483+;TpbPE zr|6m^vq>0+6w=f%B>Z;3;MDGJH{vn=i)8{xL^N%JT!n*yHVMyPAE3WMi2gZ2`kM(K zhHy>1{%jgHDJG^hQTuD+_RGlqo>O9ngL&cmn*{LJg7C)<0rSH6&xfHc7+uIG>?1Wb zUC1|CQydZsc@GkV{A>K$R%b7gXpQGk%XAy1u7+GsEE5^wrp~pTg)~of-AtrzDIt4V z3PES=Mc_M`dKFy4B+!2)f3U#w$sguRW1a;93Uf(U@+l$Ue_|8rd2FKHoX}(9DmBvj zBHc{ui@l+C9AFh{AJSO+I|X0hhR!C2&88tf(%>EVW%JGU-saQ2*N3+uLcE9Lp@mck<|B^nWaeesb*Z6Wg`b4kW`8SW_wojWIMaz|porwkXVdG>ngH0d=g~cy| z**3<9vc~u@iWuu}2D~eS7L3YAR!#g%<>G0x0I&AX^lBhLi{9RZkLvpyijG;?M|)XJ z#DhiID*I?LAg8*-In%hb^m60KJQJTXWPpK-g)I1_&4ctOG7oPMdEA7LP&V2Un=cQsz?y+oP?w#0iQHD3#~2?)!KXQ} z8&@}iDBNT+h8PWH6cPj}fdK8oUNyLZ77@#}(sLg8)4 z@p;T*z1r^3#m}rtlp63!ZbMx1+fB_^WSmXZ9Eke8SXEFr?EI z#sz;iD^FgL?^8KQ4{zaFzEYVVzYH=r*2BGYVW#`@J}5F~G&NvFt;kYmV;I3Eiujv9 zpqu+*&6k+3Z5XxcatBwZn0w-%#*h+&gB$$@$x6w*P!*VMEHUsZ#xW{0%Ps4bSv zgY`(N8-WUge;|arVlgBBRs(Zo-d_2|mV^qkIM>Vw|C><|4kyC#FUJQYpPO*P<>xp% z!)e?m_)itjc~;OEA;SjBJ0ANlNibJeuJ^2A))q+iiSs{6QWKM43-8jv2N)!Una6(_ z`4=8W=4BX0229^oNsQZ4gYpxE{vJ*%rie%B#{To1wQ@SOq|^%2NHD4jl&uIQF^-F7^%9&1HnsS?+ah$0 z2Y^z@KG#yvjvy858qETjxVnTEmFkOLUGR~N>Ysv1F2V%vkE-!#&cbnPe}^c1{W@BM zy>P4H@kouV#%B3&14hE*$&8(j4Bi8nG&;oa2<^fYlDN&vM5t+=J_Wz>V>$g?kKjMg z)MD{pBJuz!#dCQiiO}A`jk!O4Uqymb!ZG@-tLEp^fpJ8@pSd|TGIgLDrIM)xQF%PO z$W&5Gg%~t9Im~Q`r++PrnU3VsQQO}0T1;;<3!|H;xW<~K5^dbPubR~awnQ-j4i7O8 z$zEkG3IEz8MI7rW3aDnO+DX@nNM(6GkLtD{p|C|u$t-bj+^?$QbvZaaC?B2m@tW?% zu&Rcm_m9lVER32{js{iw3W6}jxt*RKKsHt8z<)Y{fJRe<8hn{CY0ZgI=KJqKZD~=j zz!H5U0P(hjj_uAyRYAdUG@K31=7f}Jh0!X@jyi19Khv&j`d2|_&o#={Yu`mOezLGG z&Qun_e9p2J{}bD|k3h)^GX_VR>3gH%j%HOj0x`q!WmKb;1$CnsUR<1NNA@j{=D9&& z_+#WII?}mZNb+5tbifN$t*mjr{ZYoYX@|iCM)u(zuP`?1mECvQr$!h9P`a8VPd0bB z55VrKP*I>%y{_Mt&j=l5;z{Wb1{)s@Q-;WGIQM=MLc~ZL7dPhf_v6{4(PuDjKq6d! zbI8*r)AdDpytn0^WHkVJV5$wbr$zr;Qs)-T`87iiM9l8~$s3x)j1fmi6>10{ zYDQ6>jVToLe_o#kaX<;TT+QqU%8I|U#u(!=OZm=%OZiUyQof@tWpyE^yJJ%uLK+u7 zbvkMjsY8a7h-t%tPo6%G`?DAQiF*8CV!6VAhLQFi>)m-PlkJ6@mvW3i-Em^t{3*;# z+QbAn8`}%&&FM3A2%UXykI=8m!KPnkVAl7_6^GrO`C+-jq!h6n2T6)4J?Rgp(`uSy=>T~Hp~ zt(Ql48_T2gPW|Gx-FsK3YTa9q9{1|$aqlWrEn=D*H;Vh~@m-a2hqK5{#jO9K{I9ip zm1`F$I%n;EcU5cmy9IgmyLw*z?w_)DzrVV*`~8CS_`aSV-(Tt4O|F@1mag2&lSQ9P z{9d!-{W}U9LgY1qFb5L;kb?SV|ucrI2#&zV>k(j#Xc}cmZERg zi0QH{K9cB5Qj916nHZOsgr*LXZ$ZbRjZ6t#G??+eeu8}MXeT-N6jHTg&0ajn8fsq*3mYJk+3+B)*st$vgM3py4i3i2p#( z{^%KGCc$Cs>@w9IrD{_f${a8pyMo8-=8dh6!M^ZNn6A0gIJ|HU%hwAf$KCaD)7Y|4 zUg5bX2eD{zD?t-1E_ATS+9gU@n|wR{@g?=5zUY|!^6+;R`1}nnvG9Z?Z2;F zQ5?e4NW8mdY2F>vuW&wayJe_$3j54T?Y^_+-Q#0M z56zyJ@B0UzuPwu)ME{1zHtY>6I}VKKNj>t9QQcu>7-c`I>psf58#cxyt7$*UdauLF zWMA<$i;fU#x<_2Rru)WgGKgwgVGO=zpV^h4S3t=ROSPR_EPhwPv~MCfs`qJef|R^Q z&w4ZSxtyhEk<4mI4<%NL#UrEWa$KggLH{AEBBJ61^qO6!vFx>%EKbSsl|No3H5yb=q@rq(=HE3 z?n7zLHKdG0fkzME>HPcCX&Nk62}l}t&w7r`3h93)OV%-8j`y+y`7h@CCo-SIkcn3- zHvOyF4i~R=5n^2(AK@fa^PgnRW(kR0ZNF=WFnoNYmhWCyqu(p@p1r$XWV2#DhQsUn zGaTmm<|QH6hu0r?aftQmR3KiO(RVm|H#PA6K=X-m+!j(g1taXO1%BPzS*SdjB< z_-e3eC)YtnthMwVYYP?{JT9tN{a%ynGDU6>yHlLI3Mb-x#OMh<$2q8lN*lkmlig@ZWgiMHcTQ>|IunQB%T= zoj24rTHOp+i1tbq9aO}|5(qC;o69qeXdInvl&0Z`6E$Q99i|9x`^Z)MFAJeUqA=Ag-doQ}ZKZPx$ol^gp*c&LYW<=+r2 z0Mt4hu=)`s+vkhTCmVauUT&M(Cy<`S*9RZRnXUBrM^o&A-EolK=^v}Tc?O-H4hI~H zM>Bx?3G2O|TkrYC%T+wtMp(fxZIwsc&t7bpO8wdJBu1W9dts}c)K`1;dgJM{{{e(E zw8Bj0lc{08Pe!A33^1@&e|+=w=>|+KX>k%J>6Ksvv8n;4d4}LgV!k(@KHb^?%8ya+ z%j0DT@zeIttL~IvGl0#lXWP#zCK=uh&n0 zc@6(Qe!cN%8~)h%ACI5IzuT|hynGCQJbLwNALHSat(uy+O%<Sg>!`M&oZq)&25fb)kUQBlr~_|v@RG0GW0pUxz;5wJx()1;r0i`YM)fdKlM<_fvv_7eGij^2Gv z@4lsXuG@rQI?}m8rv#sebdKVEN%4N5xb561IkZ3j_FK``c5V0Xm-7x+f`m#z>d)!) zn67cHN;5efeTIv^Yp|1lDXg-zYRW+l-u!l{IGW8S)#}ZgC$pofw_o0LEsBrJy*s_- zV*hjT=M%Gu5BpW|?M(p`EO{P&P{d+46I(@bGqEKZHxpYL+)R|d3azKyS-k7U?}Tos zFddI)(rfN;T9zCBeC$rj;I`oO){*II`||`t!Z3t50MgIAW{b_OlFM7ur?~M?7&_K8 zww@Q}P;fFH{aU&2(*Hu1I#@u{0IT=jHC^XD7`9_|&W5AG_^iH8RURKkHN?5WP_y8L z@kIpZqLprO(*N`f!*Q)F-}&y&_qXreF$(T}pRSf~-|H5$7Z~Vx8UE_S>2}3@tUi=y zQ2u?l81zrzlH$8txBUCiAAw=brxpL@B|un#+U7iVV)HGuZeTv@_vI(XJvaaUX>{Yp zOy#4gu#;z;hDkpvK)OB;mRM>cXdi&O`mA9u)pWfPl z|Gl@od-FZUJ2tg~n+5#W8h9Ue!(Uyi{KI3W$4C9?W1{sIenjh_ z`%1Sfj%PwN1)$yvzTsWbeMDdPNAJl`p>0XMgSB^)n=lyzvya|&@C-b17Ik^l3asJM zdx% z%~t7EljGs6-THH@lNnm86$(J2AOQAyR~sK}4p0pezFjX2@HJM&_U!8{?`lI1wH&6? za&p|q$KYb!nbUADM*g_JUmh!?Oe$i=6f`CwFHk!qTklu1Jfaq28qC0K>+FP_9#kuX z5_dU^NIVbflm*+n|GzWUVe>*C&> zyUT`l>)7Q=5;Lo?bfl(<3=TWs|O>$Xp7^(chiK zM4GhF&jaqb+v6w0_e0?JLHP>zT}CF%u;&WQE_&ztf>`!TiUF^;vZ4vj7}~wN2HMKK zxzO(2Z369w@0vmT;X4hQGvM~^t+`6D0Z?jt{3Fn4|t4B`es-%YU43sEQy{+YYt4LkbO&Ps2N0~X`|F?-d|Nn(7W8%0+2a6PK%~Fi=X~C2r$k+|cAvx=&)xor zzx?iKDw+zkg^sY4)PJM1(wTsr5W2KByTz|v8}H4uKOPLb#hKAUyM^Pu8CQ4%MM#zQ z2=uENK1A6(Z2L0?qaP+s!WQ@AH#H8>EsfeZ(Z6D8@vCWzl_AOOuTj(kh@_90u+7!f zd4T7hWJ4x(njIXnQ55<9q;#ON2qNu6=+XEd;FCJ~+i-|k17<|F&V4?oYlXxXfx)~0 ztaL^cI2ObMcZf1) zZTHD7v9>)T-zbJ1v!2eBaIy|}f1a$5&Aou}jnHtoU|aUH-``fvaL# zD^_>EE(0K20Ysb3&X{2D$j4@Z69j$gCe3M|Z@w83$VQ zT>J?~vz7`1I7*pQ*bpK&f{?A-BbW|Kt@F~~R#T<_s9V@g`3P@!2ajJp25s94@aIRuJ< z@O>&(CfKf!Zefu^!1f6tP?Oz)Q^n!6^XqQRe4^TYZ6o2kgQ7`u0G+u98#xC~ta|E+ z)ursLnqcSnY1?w>+@7E#9Pa1$45au8nhsz=8qRA<{YLaxX23|`5gxbYw49_e4$$JY zYR;tWZ*>hAND)mUxdv#SfH=~2EaYO?wN%)NbZ#!eys}JvgTkqH!P~<^J6VgT@OPiK z`!s9UuRCp>sB`IEJnjcxo2Ni=jQ=Rsod|8HIKh8cqzX7>|DkIF@Sma$qyvWk{^3=E zf28UFLTaEkz<*pYC(BlMQIMNEo0f>$8> z55y_~DHIZQgZ0~BESZI9P5>)g7yWnrx&+irEZK##CO#=K2qH7heACQq{AM)N)sA2x zvnF+{!OUceL6;eb*_BdnR#vl6{b3<3!o3RBsXLwCZ2WwDR!$%H;SD9&2y6{*ZmJmy zUQ_)Z194Yi$v|3gQP%Qy@KDqUb$EWoP%1qR=+7r5eA_(q{fbh!DYCaw?E6jscguo?OEJ6}XV+#i%7*_attCW8 zE@wyM0bbi3j7J8@tbog|;=lDj_P5X_?VAcO_om}i z4MfYl>^2V`a*YNB_^Zj$SEbp8{B1wo=3B& z$H0!0-TnGT@DB+0{;`2K_PSr^P6m-;>47jOeZO4Tno6$|aI?p!h{NDBk?ifhpm)@- zHqS=h$rM^*cm_T$dgRAZpf7XO`2;&~4CpEDBZ+5m+m+A*knsE3a#wK#;a)MCo5=ZB zdotoy*bP}}|Y%;&dd-GB>p4|1_5(I@5_x;@9py)S2vPTxZe=5p|| ze^OQxxKzyyy+a;7B+#CXs)_k0aq`)erAgvtUYtq3%&UY1%o1*q?bG@ESiD~JC&6(B ze~3`uz~AO;c+lyZnmuxB`0o%Pz_}f-yQwrpW9x*~FtBWo59ifwi%z>mt1_LnV7GMX zUKkR1>O#2SB9tH&Lb4=f(0@GQhnZ?g*H0-5k?38Z-Lr9u7`eBgKZnj%+PMK?zNX}^ z%Gm|U4V}yp#@PmqkDbbNI1y9N; z0%A}frj3k5hiVd$eM*FhNAOL6VKZa0W*@1{wII2+ZN+)u`q03Mde_2@g|%^s25MSe zJHd2r-pwl1!~$OpPas+~Eb!H=|BY7B7Wt}1WtvRrD5F(p#jJ@x{pd}6acE-BBc|@_ z^1abicwO_|SAsNreW-?S30W;F@b%!ZsMLbbzD|ES-LkZb>q%1K!CpAPd2SiLe`f79 zn~ZaR#LuZ5q3PdXo0wA0t$sPZ$?Dsf~4%btB4qU_0%jpoWSSegrIS zamtD5n%z3;pPZBfi_|4CupY1uJX4Sw08X_kRD5NB0_6I-GJ=P}5qH(oq!Wn3AxLTr zs}27YPZI(YJAuzwJwM^EHcbMWKC{pFk@+Nhhyw*1#>0m;~656pRufZaMuD-W!{IJ`8 zxZZxaihq8&ecrj=ez=4`I-Q&E*Ze^2EIHg=+-vD_ZcguD2_Zb;ru+s;k@gMq3A7gb z6MpdnD7LeskMGS)nPEOJPO)y}0BO$4rku6_qKFxH*S2IAnW-0~+YhJ}HRyU08GY;8 z*LyASvTOCgMkK4tUj~V8akK5|2=3C<+uY z@(Yv7=m~4F&g=ImG(=R>$r!Vw>Cd(R0n$Lil!D+Nr(l2aW-v9(L~AfUHS52%T71*8 zZyh1013cnwedAxYd1$XU8pAVmZ@qoH3q%)S&G&EUyMsQC&Rik#1by0Tn;IdOGhEtE z;A*uhOMfqc`VZxM@v$Aviu`gOmWz?G5Q-NZdvPpVv(Lw%xZCU(Z6X(CV(En%Yy}6W zaCl@vKH=X`cLJt=B-o-sx8TL1qs%u+=xB!6N&geADYAeQc5a~~Vo?pT@(n+zb?*Cg zIceDvmxQbNIw)@&k|G{O7lvt=<>PPw*?Gf@S9(?Xv2^bcx*nA-knA0F`c4uIUs@x# z2Zmt;6h*jS;)rC6RhF5B2~t@J^LSY$oF2oZ#eQ3^Ba4mBUA&dZz0Hy39U%9vTfD5#%>S^$=v`)IVIXt$?v^TiU^kdxXF=cJq3c|+W3=2FH@@LAXK zOjy$hKw9aiBeMPtT8U!8%3`9q<}$XtYX@JGCUM6p(SkJ%lvNl!s;W5lx!~yfC57g8 zK2j{4+^-Tgh~Xu=4JcAyqgGwya-#ja0oYUd0%w?xUAwjk7?vphmcG}&hA51 zC&fXbPP!T^gDT-6O2{nI>gc$)6(a;%(WrF^v^-ou&i{zn*vR)Mumy+H5OVQ=zDYJU zz1?;D3RXyXTWuDGYm3vgFjVkhJ)naoP5bu)+Vf&++A~$kcNHE-R)~y-6L#?TF7m?; z9cy-5F(Iq~#5iit@NX-d5VuY;RM1%RBc)RR=F47mcu&*K!#33D7Kq{l!Pagm?>rt( z4^EH!Q;BP=QMr7gaA#=rsnM8_m#YU0`O2~Qd2@wTi$M!p6P3t&fZE3k2~S{2e^xw} zXPa@(KFa`{gM8U}=(a||lebj152oNbAsoK2tFTyXc$L&r(1Now4ksF`m&W7Hv>(?r z&dUU0a9DykQDCYf=9Pj1!)~nOKZbv}(86~H<>!hXA{q|I*rF%}ERwN&Ywh?fq~M&7 zpv_7#3&i}yU+`zUKN^odpNvnd4jt2Wu{LxSUiYD}Exuq&G?5W6eZbh*khuw47U#J9 zQkBP_htdHXJ;__4G^>g{(=pj;j)Z@2Q@ywC-nVZ%oxPpEcXq$UW8$@CwD2<{7qwS* zfsDj)$BYD_lm7I>kK<3}pzTq&T?MPF9Q(#`d4i%Q9X!0Fx{pLa&8-%vjw(u-jl`f`gI{Qz!9v4^NjU&hPxPt z6{dF`zMf6{lmCt zCnPYvUN71EspS661?URHdk}BLRXUYy(@9hpw_0)Dz80%;Q|W4rO7?Y#m0Xzd`tU6P<~ zZ$?gq?}qhppdBd^wH;MFp3XCjhGBNX8jc9N)-cR(Up&GDKN8C&AdO%`m)j9#yUM1> zY-_kfJ7(>NZ)c^rhTV2z->;?KFkO1)vq}S!)B9KgV4HBgk)d24k=0TR1{tTqT+T;q`6jvt3Q)pIV*(g0r(FvZkCzN4SBRzMT zy}~-D{(?1j^Sc0r3)(&!R&^b*T1ElYgB8^@mo@9~4IODX8%^LzACywu{^lLF8XczS ziuToUe>ftu0$k6*z3W5xU+M^k5Z~K^5ygy-h1sSWm}U}G25`}vo*uYcY%1lwA}G4V z)*+cQ86LRMRO~x$aTpc5315na0b8HE_1?7kGu@c1e#L7IoduEK6=DS|;J)t`Hzj@F-9{)Bf`s^hXWxEPJC!P zbs8f)FBC1|gKv$$L0eq4y4Y?Z4$#EYpXVxyGeoiVMb|ZliR~t8mYfkj%QHd>HUbc< zn6XiSuhNhahg)UQGUTmZ?2L)V7Ich7OOHKLvP;BDHwoeUY1VMfH^4gZJ_ge@Aq^(mBD;d{WRd0~coK7EQgx9@q9O-afdpx7D}p zowsM#cCUACvOC0+^pxjg9EurpK46j=?G++eT|e>Rd?G)NPYRobqV^|oW|Y?e-2!~n zKCwFh2-p{01yENzLo(KVQq;$xX7;jWHPf1(wh!w#Gh*6}H%V5|*b= zejV{Dg|y6sN`7rsn!Y>@0Td!l_!F0`W}KIjLeBmpNyXl3TqU&vSWAm8`;;MGc(Ebc z(5I`VrKQEC=?S*0l%D>@$5m6*0gn0Wsx~Sx>dE1_2TWHvlFTBJ%#c}beqbk;n0+(M zOV4~tD)!*$s^@+Fsz_JT{MC15E9tWIbT`?Oo|hpY(>Z_Me(~IPpqUEAU|8L`s;Ru^ z|Kx9dg<~7joj<{Ih)3>1J-P}~_G#__hd$@rM1i*y!Gr#R>aZ)VlG766Gmu9FYkEU% zy2cvLrv2eD1vKyVdT5jhu)q>?GM<(pxB$9&gbELeWiV$|kp)Wi^Gn_d-0JEBbHupr zkc;&#>!t2&F|RkO9mSI4{Iad~WUGc)i^1K@c~#UsGeC?jj4rseg11N)qqg6IujCO-k`YBm1X8gbjpOhtIiawF+5WJbW7aT6pvd3Td z5n)IEl~a59o^rZnt~23@kL%0Yo}oW*+%){!NmpBP(mdK4pA>xc?#^0APv09ry#?_{>DQdK7TtSm3JrUovV#1SF~vc$fRI zuahTyz$Y{)u*B_i-UontzH%V$Er#MGuLEcENjX+|Gk7A^g^PubKpGA%!@ru}trqUclS>cLX=1`wqRbkP`K>LR403hu?Z%5%up$ABZ zU;BN>EEX1PsdyU!oKOSr6B6Lb2y-`jjJ?pvj@M1h*v_OdcQx>yUx5ycKzO$#LlJ7L zjn#@>?(8W$7*K}np%{F@HHbzLepz)MO+oefguSDsm%#BI8GLP9NN#wxtv_VVF*j0G z8!japFNMK|P;rQjAMl6B#}Gm6w639`GZl9}U@j#4r#8UQg|$I38fCl;Rp)4pYm)D{L15PLKg@LxWWO}j{)NFlZarvU}lNo=#V9R$I~U$O4|9qdpy z6(W4fxdGv#N<7*qv`^&yl7#YcK#?}h!RY$G!m?oio&i{tM!{phN*=QgiJDg+ve~b@ zk)OF6igTHyA-KADIh&5o7RLh&^RMiOpDHJ?^zb&6!>bw&;JR@%DvzHJt2EZmR$LxO z+leaZ@pht0KH^T&dr{LjkGkXi=aO(kdJrJj?wWtcm2V1FLW^V5^H1gMCB=~PW^4FN z+~0+Z%ksFKm0a-SZnTcAgZP6Oa%(}(tWi8o2u)>b_eSL>LzyLdjkV?=Kn*E@;7iZ+ z?4<^0Fb~N##lP1CyDr7}+LiBWBV}BGwJ$Hnqn8FB;O+Z%0l}cK=7Vz{aIFXhYuZPP zQOdl*wT%@Ajy{j3f=>hSbR{nX++7NkBsxXNKg&0@kqr#UW;=o{lnJU1&-^i}*+&=h zR-n37gQ`udBaUkgQJ{x1BFY-W!T|Uf0`NwH)PhrHd3XZB%i7=cZsK$edb8@AP7hWc z;Nd3TdMesq1}Dw{ftPOHEJ|~5AI)wIh7~Z*4NO%%8sC67WhXbLWxs+fwD7>_2Ik0t zf^t-O2nO^j(aC=ToL9vNLK))a_-0LK918n$3C2lGO7{EGQvHkxENJ01LL`Srwm0i% z8;!q8geX58>C)TE$}y8%REHT2%oLVWGb8Fno+qYl2N!_tL{;GLYlC2Jw*V>M<6vwK zqL51tG?Tv3$oSq!AeHUV@kVQa1aH;giKZ~hA$V;JYx>$al3^6L0^khnHV~$=eQhjO zryDu1Z(w2v?q87GtXz`B;IJ-)6dxC3ItE}Z9<`a+ngL5bN(bPgsjk4i&k#9O(+I8Kk z%Lt6B13>eMkP^RN6oDtohQ!4zi{8!Cg(|z2 zG~qVet+Y`(*H>C?+Tap;*6(F=I>G%d-^rZuEwKMZC?M&P$&kgho~`Kc=sD1r+lx^2 zCtDHR?4HzbN4`qUmSpS9-Ii=UZENz~8GW((5Y z&AJSvJ6syYRomrk^K_?6n`^tB2qIhGT-)_*b9LuSA*8!s%6=eXLnK>LGZ)&=vOAjd z%#s)O*Uo%08NSWsHo68|U9-*Z>bE;C!DLwdd7GY<)sF1WUe2PS;qUdxZ#F3lrr&t1 z2>(pUapX1x!AMY5*;?iP$c*U8(pI~#>HTEKQE9h5uiJDt6FZckef=){uS0g+@SD(F z+sg5He*(fOrX8b1y{ho9LkZMME=CEXe>+CxoXA5*$XA8ZY^Uw!**Gzq<{7pY|{7(P@6&{^9$3^d0{4k)97d zb_AhiA3dAJL9lza1p%V!vvOL61YEw;e25fpNMc^J_R=vLVYg^qZ>9X`2Qaq}>xZLq zO;-{r3=n=tl#-*5Sj*2eu@!_Ds;=El*y@e@97hW~w0uE{E5#Sf_{XdGH5hX%MlAGQr{m-sM1qG}7Iixa(k& zi&nnb-T8GlemW5=zrJUhB5E{8lP$EdVw4OED_W;+wRtAm9uv#*DG~)M?P`2#1j$MW z8_zkB2<`*LldCTN-J67PArPH0lY;GFTJ~pUo8l?2df!Ejqb(wg`G?RtuE6Y3<1?Stq{5^o;3P`B zS1dw3DPv_8@!GM4Fp>Pd6;n==EQdtuooJ?_*`G5dOO`C*RBk`iKC-fX?%LEw(LAuX z&cI9Cmhb`tZI*2`CHpa@mV_o&w`W(+rSU+u&T9H{Yt&{%^RKkqAfC{HTC$Fxc8AC? znr4dp17*)h^4obI?sCZ(I2UWh+)GWPs0%|`a~Ri2OuDXPP`UYHe?~*Y|BdLFVZnGk zLff3APup@tpryj|$+OmkiEV*hZ4fTl&!$n82d4*Rn7jVLK^(;prp39>IRT0u#eAdn zlN$hVqMENhbEze$|I{r)SZ7JlgdiLY^W;kwvZ-eY(B(@)x}1@po!AZW%N9Q2*}{>= zGCq3bbWxJ>ai}C!#xYZdKnZra>WI(k==0R}Y(73B~R6Mti7e z-+X%=10(sTGw4%GKxoAbtMQHRzrXv#jpbD4Nzei4pCFk~|Hk3&mzDFI?}y#ubW~Oc z{YfcA5Py_w0n$L;yngoBC^_R1JXMl?_y<1mOWF)hp+8SUN=3}sfWE9aTH;Y|1HVl@ zMa_&3M}w|CE@U2>>JN9cTvik)h$bTt-YEmKX(kR#XqV0U=3iUNw@?xIB{jVS1Mgqf zCc8#s?w~36iOCszoO=GaL;T^{`I;J%_fISL{$aR*45J9j~Uuz%kRfB(R~FR$2w z2d2*V80fdSzh2z^&VRjk*MI%tmjC+0cmC`03Wn=Dv=$9WY;Di8?u3qto5kZ6!)aN_ zYaq^bIXE$}`o}g0aMWD+J_fi>VEvJI=U}%vyp>ybvH;s2;_?q>{6Lil#l2nLl|cs! zzAocen4{nUBTF${mNr@`{QE;77Pz3Q3rwW%m`h@!s9Lx9{O` zAD}GXTDjdR?wiRlGp%!~tL1>$i4Q{oCb2{LJ~x!*mHb#5j8xH83>spivxi*8y0Fqt z9t-@#8X|VSz*){5G>h@7)nLvs@Z)6FXnw8YoISpqmWTYgp(YNvu|g3B+*-j@)<&iZ z`>2kYl|I;qlYU|}qXbJ2kys`CJ3V{`0}rIuMA=77x9(qug+jJ7V4X;n{%B*!y3ANW zI3MunBZQ5`l#t6(rM5O4P=LQs*lU^w#PD3`!w3*-0yIV8W!%CoOxD1(#@Q%+d*TBZ za#nI5Z!1x+5;NZ{34o=CIgGmf@$~QzALjB%XZUSp!BA%lJief?_$*+n%jv+vuzJ*L z%0f70z9RSG;fh?5@M)#p?-u(J8F&0a7z?F=rT=-qq^mp@rGUQS@-_;=h!e;kN`XV< zDm>{=CXqo;Tg#>)3%mtVl=CYAu?cz5N^TZ({B$w|6vNsI{i$gf>#4UkQ&-}6PL^}~ z_Qx?dkh9A_qPbH!c|`Y;4Hr~Qf>I@ zr*cFYlfzZf{$SK||Tyv-e^U&U&C&5^0iH&?Dyb0Njjo21OSmuH5iNG9 z$<3P(xnx?J&7~YfJRkb3%IUCwJpA_(CWmpX_}(7$XQ>GR=g%fb?)z9ob_rA;h7))y z74>Fj`(Os&f9{V4$7bejvE+LD%xYL2y_y2SA*-v<5R?jrL!-UbX=^f;R!|^5$`~t2 zfzQ{Pl(_sXX%ot?D7e3}oK(256k^K|3YY(S+rHB57ET(yCmC5j3SzTMg6%cPooD?E*)}dkFr^grppJ{gX#rkKQ|%q{p8Rj)w=9Xe4Y~TcWa~rygo4dlEl1`kF_ci77b(3oe~Kd3amV4S0@dX?|X7f{nz3VnuX90#{1B z*v-E0%Kgl_jo9vU+!ow2`cW$wgI9&76NW})mVujWKAu$0)2Yx%UOO%FEGEY5P*u+V zf3+7k$^fm3w|a?@uEj*%@dC8%I`8AVJCNW%Q|+-XWA`K=Oe66 z{)#IOIkiA0X=oLO}zlhDg9SFDF zP-f$v#F1Pd^1{{B3W!3~=~LF~cUmgaHgB7@Bk{zIb49y&Q@Q0JBBrI4+H&^XDRwoU z)#StVqV3f{aE9yo!%n%h zgH~OxOf%_!>`rO$pPvZ+q$$<2*`x}6o9RV~-W|%k{$1BcEbBCZ7PE>KF>$K-4O4TIn!@|zbBX{!hC_r?!nxY?v0|9%YU@zLy#x@%l`(@Gh z!|uschW7ac-9A&7?q^6m<-etyI&Yw*#Y@Z4e4>}BH{a?Aw~tDXHo3eMCq_cSP|M-$ zs016O=?6?w4x~9Yn6E+ih^cTm$BvYa+qTFa=3F#Kn`$F9#dJ9w>3ygT`pxLWXnf|J zzTLPd)A2{MPzJqLqK)_=v2OHX&*)l3u@=#v?3T|R*aCBK%_E_acDw`D3IZxrV5Y2R{;siJehd zep}vjqzy2xw3@7KSLFI+_DkNI|6Di3P-!)4<)C{@Xd>%${B7B4e9)2brW(M6`yR^D z1ZIRJH^8RQ*|uAQIIER(mu`r1PnJ7tvad!)S&pG7%1}YpVaTcbJhRk_j=Y|$(jXLb z__3}7nnwf{jv^Vfp=cF%R^MK+7Yk@fc?R3G9!EPVC8^}~4|efZBw_f{w2!*I)4PbT z=hc+957n<6lY^wz z8P0T*S2iFxUOhf#Tc^|Tyb8l=KtN~pt}=R6^i*ujNf+FzX?tqf`o)j!v(DoGRs5&$YLYw#KYo;;_T5n z6Z$=}x(sWrE<<4p2}p6Hh&P)oWEkN`c%T$Jz^{Y@yoW6g@hg`+zlU+u9OTo%DrHuu zc^H40MjKlZ3r4LUacq}whvfM^G|><8p|9vf9~J0$uyR|U6bZ|8(ryJ;?z|{^#_R_<)vj?I6C~H< zx~N}?bx;zXCenw5yS8awD41qtwYY1Yo8B7@v&?zJ3`eG|;Tt38PK>-b*f1Eu^LSAS zqi&a`q8;3FdD|CMBwZ`+^unJyUcluegHrT_Cvxx*FLb{CxAxn?_0Af+(_!x4ESh4o1^nH8~#6u#Rq373dqO7Ay>^2y3~ji9sS3TrEM9zq(69FG%n+ zawJjRrh#%f=`ydXzZ83Wxcc|@X#aH4IS?n%_O@o?l#y`05s`vT{{Hsi%`U$3Uk#6n z02;0-4oa>7oTX=@!{KN+gIi*IvA3G5&vvc;6h)6i*UnM8({%|4w&8)M;d02`SPtKZ zj0oJ&D|W6$c0N=MnOcZA>q?<@XMqYv8w_lT?9fuqSqDHUv}dkr$*Yo zLgyx^7G`XBy(RAG$N?&ChVK?Y)ex=MaS0{0uLlPycYNqN!Q*+sL*>JCCylT!a0|p) z?s7Y%>U+U_F6gTMBZmEfKc#e)hh>Iakfq4A}Y+*PpcE(qw{P7hD@8mQbvzZ?|tHin}id3Og` zKiWh+X#R-8a0)m!?-r|^hob~qapw3q#D;s(Y$x5mU*H+21lBPlau5j;wGldym6G5l z@G^Bc!cGGtS!eJHHT41Ch|R8bSgea;^8N;&j)+&K(xX@%u5UAi!C3E#iZRV!IbRC-*CIFj!=TUVG>7y`A0b9gMKBb8UGSH49fWsJiX} zkb!-({dQ;P?>ldIcfZ~3+~nHu@OY4vzh@eC`Tm45rLsM6Vy!8LRa_sv@>6-h;}=@u zQd`nnl24?@glM3{ zcYn5@c+Q8xE!=wK>-24h3Bb8xbnXbh8Z=G|5R6EPAO3|%W>MK$-WAgG_ord#IJpY2 zMFDbX6}<2)x)HZ=*E}I4m>OU$>vbz$h!cNNiG_6zSG>ZNI9plmQ!qtR5FT|%e})S< zSUo8lJ6Qe4be0OIWNmCUo*}Nvs%WvsS1U&uAdn!uA=;tYH&;!xp3aC1@|hn!H* zeNSBJYI^+jK%4kZu~&xveF{A?Z_DbP&~xysN}a7-?`e8WNNVSEWDZXzW=j~(ZXAru z>46zoE={JrCy*nUShs!t6f!D8i@iblI{Pm0H6I+V%IyPrFeJ8FcVFjQW^X1q!uiVr zja9O>8Tz?8KDT{z8N#tq%*63BjHHi5HgQZ^g9~?rUXV$JsM2@W1nqi~c)A)>LD-mQ<;i3d zkEKcAGb?Q#@>`eqP9?hMxJq+I<`I%bxW?_|Lld8q57OZT_0jT-DB;h!HjumR(x-Iy zx^0GJ{E-y1$3n0VvgA=uHBmw3p@41knEWZ>3HA6MEP@ck#QO&EyL*43PWSf5!~JV% zkdf!+>q>fSkDv8hdo1#|_7-Z9z~p!K;>mg%!bDgg?u07Vb-)$R2_u4-_%Cel;rSpTd3}e?1yw>XGQ{1U+%Jx+AkE zDJA_%fnAmT>4Eb7AF$0Uo%Ux(I(R5iIyH&{`+DxEYDx17eU>0t>CL~lcltN}{nm{i zde?94USI9p9K!9)bjGTzLOjLYZ?D~iS7b(GGQ2rE5+L5*e0%d@`{B~to1LA%KYUy5 ze%ookeYo>?{Och!M9mDXIEZBHzIDK8J+Oa#)B47KdFP4>_s83*|7+y_`ad9D!Y;)A zJR72uj0OC~RXBHl{N@|Kb$|W6<@*9C&Y(?5cDjY(hw%o+mjuAAZ(6;HKdI&5qwO-i!XH=Os+X%H6x+ ztC1pnCjY*3ohJLyjsJ7+#_pF}-FvssVS0G|tr=a80&6JMJMG@L9cXhps``iJtFYQ= z4gT8y*sl(z!^w>MxwP2l78L+rQqRX_Rb3Vit?fYq=4dvXZ~*XIc;Fn$^7rG(5gt}T zh2gP?Q`16_t>jY`eLGBQS=doE0567uGJwQ!kbZVk5~9z@QQ9WVA1mF&UhRldJt;@y zSqbdQjZ4sonSk(T{Pq_=vScqO&X+ep?P&iZJDQV*i;3`ZZr%sL;kUVCS zb&>Nr?S)9eNubBBRjo;{+%cs1#x(tg`BYc7SICD1=10~+VnD*_cAgVZBV4#XY#E_| zelPSYfK^>0_X0CV?Bo5Y{lB$3!Kd@zT4v2|0WjAOdDJ-g9ZMv0?nYE@zJ2Si0I1o{ zExe9(fBUVv4rFW>AfiC6_mTzal?FsWl#D(k6No$i~m_HvY2R1Hthp{g(hh_51G^AVR62)-yu z=luFOi3bBU{pEGEBvHP=aY^b+35OuAP$wWLnwnL@k74G(Q%+y;3ccC*IeerHIcr|n zNHsRJb2a!Xv1BE9#Qf>~NV0Iu*_=={e;}9>2zd^Uenywu`TL)5?q2^h{c|&li5awL z-uGV8$QygJwDbpR@tyvJB zB!Fq8Po(JKX^8YS=4Pm$+atX$#0tHBJr1&SR35k?J24)$hTx%6T0onyAGAGI^vMhh zDtIiSoBJ>ZQ!9TBhY!HaG07;$v#sI#5uah%AqP)&-GB^9XV2W;^k?=+J4wt?*UYQQ zs>hOTx|E`F>V07??T*5`xH&XKE zEI~oyH5|F!@~IUK?T(`yRg;{=)`n?Ok~@AJ7O7i&a4x%Um>AsL{1Xq;p@WrK9Q$9v z$#Hq*yR>%U(SSEdpCUvu3Q^Py{uS}lQyRs;kY*Od0%Y?sgof~x2w5lafL~R^PK*k< zFwB0YH5fM;MzS!p*&jNmY6VF&D3}yma+qqt^+V8>Q0<+Ls-xlI3@fgr z70;EfT~n(zDOgw;W6m{Z*seN-EbC#;L#gBIUB%*t4b6j!VeC)K{)e?JQz*HqnJ7`^ z&V$HUl$>W6hBY4EwX#!JXgO+GDHp@_CSU{e(bnT<&*Z2Q;3%{lJ`)Pv)>_5WxBs#l z3HGCU+0VD4BghXU3*eAY{nR&80p-N<$M{1OpkE<=WBSGX*u{2%OPx)1b{|t+8ERRpvJ5X6_EjgnW z6GAL)DU(dmWsdMQ31Tx*el=n1y#rXwF1N0P05>7J4hx>CC7E!;O2e`^fg4E{KUTQW zxNd(&%fPdrspkH6I}hw(s3@&6iQpR$;ZR?LvW(*uU9>Cq?6vav$><(uatH*pni4^`s%iX_3;qfTNWdi+^KSxaDj< zLWVZ@mF#sip$3}07>K|<b* zHu#|MKts~1#7(A$9TF0%aGfWtu_No1?SC#$Jpojlm&iepE|IgH%ohFALp(>8ZT zH@vr&c&)oGdSr2yj~~y)+LS|zm!*WtZ#L?n#0x5dl-O`%Xcl{KI83Ak4bBVP`H6we2m&!_vAnVc7U{|DM2lA{|MBG*U}^v!E#u^4kW1>RgyxTS%cD9 z;r=E310T8l78CAby8s3C+CuH{(SD_jIP7uCNsOFcT3t+xdh7s1e2@wvvCGsz1+T)5 z(SYFkE--F9u&z&t9sJyrL$BP#Bu3-$+#~-8VP|3MomFQmKq58(g&6XjJlhgrk!p+cLCDw-XmF%iq93hbt3$D~WVpW`)b508oLzJ3x*_&bUN!Ttz16ORHY}lSVS3hn!JPyR@ zX-Z~7MbO2}|qgqSw$&) z-B-1+A4Ywxa+CDc9k|`R8^HE@E#ALa+BjjW(&ByatR)+d@bT-^o`|? z_Yb!&0o&955T0&t9h3Eo@BZmV5H_3O;j@ev4{hoYWOxrZCHA{V8dvzz3MibiG_}IX zL-rHG&kb+f2(utZ8AY4p7%5^Ig#$R3b(w1b6Nk|Nnzb*?fUaLxpq)+@0deDoEX$?j^~qLU*z^rfAS19%p`ueHPk?a&^S6SzK= zCpT^Ug39l*7?vrGq%*9{$i~N~vyyR9PPY;SNRLem9tK#~523Hscx63|H&WqB)@T>` zLw3^qKH7X2U2G3+Gpw-Y6-E;P1gJ6LY35spI_ z)&u?kEkNARXof6?XRvEs*sjxH<4v|*yj)b?h}t!$y4G0Ujl4xDwll?v4iDn#4H!FK zQeVY5w3&20=Q#t;Kq#&Pc_VVf|_%IhY2twu|m^`A#&Zx{)#*q?Z zHTY+??kY8uglpq)k(-qI>(cnLH`MgbPu{mHlu>L5j5onAbs>fXMWrx5Ha@|yiMv81 zinXuInaxma?-W7AVOrjovnLclhnhcylm@?6?EtUCLR`SY*&aU~9+z)kKX2Rp-Q`pO zRH!fN>Pyk<^`P6XYzI{J^)O~fjMN^6Q+a7-q?+^(%Bl_BMDhH=v&M%0Sp`7wTXgf) zdAHaJ!`Stdu++JBZTZ?=og$A;F+O5B@F=tq)lL#W1=5db0aWOFCJqReg-{^yGtPTL zbqX5}q#Xiu+c~lPYp=~HppZ*$;wp6^l5APM7!OX5A>+HxL5_)ToJ)tTY_^Hvr{N)- z(cG8))5F7Zx;@4Ovh)()6&V`+G9Av!tu-;L z#D3Ukd>hc8l}`uk>~vs!YAwOYv2~U_FVz6 z*W;t|-~;=1G9HvlcMjFZ{o~{PzGz{%^<-E{k`Ak1hVZD5qEFHU5L4p+_D8b{69rl> zdh9-4yXT}m)h=NuJQNO&t-7`>tI-T{h(znSUTJ5T*L1V4LR^^#(H!qj%NN4~vts+z z2M+hYi;{N4g^oamcxK&WG_e`TMN(?dhNIgnR^<#b$^soM|(J$ zoEnM0{-Cgb1$6-zVB3hPzTsA^0uCat5MtSGTiFe^eOPB$A#7Qux1Gb$Zg1bHs?c@E z0qPcQoFH`I0W6}1*5w|nbl6w6m!l(&ts#vyZnH;+CO=NA!0@-}=V9j*d!WXjfrb%r zWBzU**gvEd&bs-y!Z>~^+vOpKM2H{3xW2dX`t{cK>)zuZV}pW&strO}fAObiM0OpF;xo|NxO`zG7B{G|R@cz^I>ilrEOo-*d*Sy8_-H+Ow4p*oB`#9V<&fu% z*lmk;!Q?2UjMKJRib6nAly=9G(d^3zA_@n**nG0F_w42Ne8W;kIP;&;?0eCUzNKb? z>ildDOV(F$r4vq~Z*R3a%Cl-Gk_&P#^N|2@K#jjqj3yd~Ln+RNv!n6pj7~KBpJ!#o zy#dN;kCGl2t&NwP8!xxn?eQYZ%#k`|O*J~it!^Tfdscz!wA+b@a-Fn&uo9$u>h&TH z-{*45LO=pJVSI=6e@9bgWE;>B6jGzjy&6};PZ-)p&J>0|@%nq}$`N?Z?wLIny~Z${ zVYI(Kdj9Om-qUB#H}*_Ndp~b(ZG+Q(v;!sQ5Sn&&&P7yWe+x8x9hYXt(XMFzxgWfA zoh@-By_dM_^UlaxfBqC*8dCS>_%a2xDBPYK{&{5%=(9(&Hayuk*^vUTI83@mW%6UvvkP%QbOC; zXwgm(N>s%r*6Za5uBMWdP2{aD{PEF~r&tDm$RcEOEW^KK;j4|;FR%>$h>BisZf{Z< z{3Q!F{>QT|LI(e8MVM|sdG^|(3V+Jt7qH;46#tTij~+kX*up~mD;mm{gNuJ9y>7gC zwf#5OFaC(DZ2fJ^mYct1p^*qrxAs^c{6kW8^Ue0&=F`2`k6!+?;cD}5vFcA26XIZ$ zM~_iifpYW#>3Tl(f71_kV^b1SKDB9V2Z{3tv8UjCUin?|&9yIB=lq*@NxN*r>(KJX z1K*gpu8fvoS1t`nXdC^iw0ygo9t_^u5+iAg>eK*%*m@AYe_({n!E6jqmacsP0-aOG z9;5SjYf&G-^=cPbQ0(^y1bt9aG{W(;Ic!`tDsU<>A`^SwgU?3V4J)wmG=)w= zBf~OSgaqkdgi~-e>$8a^#qjvJeBVE2#5ezUp{`JXsa;VC&1h9YAA@oNMgnKhhZ3HC#b{y>IFAgS&AZ?N zT9h$|`K_Rz8)mLtY+LIVXfd3g0`bfj1QDO}$*N=z ztE_&zW;eCHxXyx^iGaCNt8bO=pKJ%SZJZx86lac)R8!OOq(ztgN)D0E9NdoSfPvkM z_6xYuG>kA9pR_v|mZ3KrTg~+LJ$IcCzgA*14WtKVp*HU&HX9#4zrZ`vxR@iS4N};$ z!;e@A;+F6>{!))LSW<7z!YYcHhc!*!?m2Q|9fJf+2RlqWeg5dDtsN|kUTksL&@Re> z)JfNxs~U4l<3s7@tL;7W*P9JEkRmkm2T@F;e|*Oven+za*Ap?Tv(w5-@!$bCF#ru2 z$IJfg6$kv2F~gcZ4hM2}m#}B^bs;P3(i4C-gR6 zKHhxt?B!2;Z?>O)FA>k4r4eE$VNU$amlK&v;j0K$0e4K8@Fal%CNOt_VQ;tK;M%c0 z)-Ba+Q!6P50waS;-srxI|BNnK!d)5A$=^(b!NF&X2x8U)W8&uFA!gfkzn}9PaP=lG z{NM;gcX)=ox<%iB?G|PyFn^cAS}2**Q4tPSW5j1Ac+}Bn8T1fOVB>0ttR=lgpvY5{ zf0S1O-WWEV^b4Qsq@NV-hr<1&@E{Z(B!z=eI1us?dep;Z`wII};;6`s7cMULgM8#+ zIuNxQ2!Y7^#czSo5%7Z?@WDlayPc1N7F`aKE-wX{@yH<4qvoz0_xuOV3d45)YNsRz znM>d%Qxa{WUi3tQsohVdT2tny6~k1d%>M2t90XSs5;aMxoXV7X0AhRx`^pVrxYUg7 zj5{FsNUE@5qI~T-M7p-~uAdkqCHLKXekpn*xypZP;+J_>L?XDM{8eSA#k-k6mXgqI z(M-q+2H@P`>UPw*YwyE7;jNBb`r5+RmVLq$`kGKz#Krkt8_|3=7i+hMPisWhMOmJ6 zF=tsMeag4>Jj<9d{uHT)vEPu@^th53sjy+93}$TBFb5nqPR}Y9Xr0n#tAz7hy>_Pf zJH?;)Djil^C1l~Fqc-JE8;XUAn#xfhicKkd4Pfyb`rO7;i~P2c2ErW%lBfF$Z{K=X zRE`b#-Fx@+2(tvOA>qX0F$+$|SL`*XSsNyRk-&{Vv>Jv-0|5Z@*yKTU#ZXwzJ@Vs4 z&>&(aZhT@qYz@Mheo1w^P_vg9GM5Knjd%C+;r@}V1AuV|rS$ggTSx}*p6B@RmVkg9 zi+AO_Cvcfb!Wl|wrI02#>9xT!2q(#iGKEVc7ZFHs6cC0 zHAA^~*yP{}y`RE5ZtDJ-pk{j1ks(2*&8TGC8qJNyyT^ia6&p9aIxB-Ov(|`#MuZ!X35Ax0^)$s4_;}Vw(ZT( zD1d6Y&t^-Dq4LfTj!wn{^j%uGvqNmlJ3=rL`uJ?rJ{_8}_rt+OdNA#I4<3~0<#=3` z?S-LZvjALx1d>%|*Ipdzp=+9f43|=2qtEKb3-=3f&BAD-uheVv10`GgOW{8_!_2DN z@6Eblq-}sxJdTfcAk`)D{@4uhN<+A+!4KEeg%^{9!1+&IL)8qT%U-mbLufv~kBc#5 z4I>)i1y9t=_HnuRtR1@69B}}|doTb_%BtOme~fT|e-`hEfbebvJl@|K=-R)>+Cspd zM?s~Z0nHej+HY68#IW0|SYrfekpV2U)DZlY>|Y*Iv+e7=ZrkVEI8%POQbG#Q)5`j> z!+s3`x?`=#mn&M4FUx2}zC36}3|yi2Ge;}(^%`kKzIIP^u!vUF=;g(COoQ?raSbZ; zp3$Jf)T}g7r82WED|w`&>o)(ltPPLa=jsiUprGSda6lLgrwy9gno)b$0C0r!np4H7 z^)X4v2F;J1EEVnh2jITjpgC2HTB8owglMEIMs1CD*QhOOfziB9KEs?hX>O~=bZd(G zv4;C`Q{;~|?9KV`LzA|qTHF$Nph;8GDn#3p56!p~>!ocW0erL8P%~-|%2c!7ZB3

X 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%0Dfq(!pVx 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

1raX- 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 k?)t%^Y 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 z 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 z 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

  • uD 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

    fm7$gC%s8Q2e$VJOcL4cF@|f+ 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

    $rHFXtKC6 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 lBxQ~v47Qxjd8f>rv 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Ğvr~r8hyl}zTGy4`4EML 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

    @ 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ξRtU1E%uMj@?k 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 z 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


    MgbxAoQdO1( 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%0Ak)ST;afzh61pjnQML`n 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%0DkHPs#3!TR6RGD8ZklzMM1x&#I@;qy92Bsb)LBMZ zYV=taBsdq^gow=GA+wu8yO%+zrWi`qDDg^8g)Yv*Vc5lMjt9^d@6$>CMK$#G7nB;0 zZV(($5cO*lc0DhB01gOf=sju-I5nsS22}P7FA$VsPfo`z9&ehQIJxF`K+HRaX2;4x zKIqvPRA>rIVjhJWm5zj1#m*y|jSq++FG1l+jC76pd7~K~jcY*);Qi~@`;v*NDAbsp zVo6i1V2b00V`a>al}2|>bLPC^_#60P;=p_)CR>t-Zr~>we z#JY$J!MB;Ygg88>%SVlzut_LmB3@Gije@pX@l2DP@5=3mA|_gxL72WPtX#KH!IaGz zw`SW(D?PRe>sDvzV+eCXIfM`bwWOk4qNl@2!rEF!sL@PgjcUvX-l_S5`*Y__*Y(tOZA%O6E#8 zgeC}S7?mN60^xfAj_R9M&m&*!2KH97?%%U?5lkEW$HzKo8tXbSm>}7q80^ner{P-a zBrFw&>!{OkO`rAD2{|0#o*$>HVK*-!mhTjv&(rP;xFsG^jEQ@r*gpx3+P)`8Q$%v<1k ze^=uqh86ewPhIQ+SBrv2cFRvTBY5g`#wPlEZx5t}kXRe9bT>If(*Q<;kr5(yoKzR} z_FKu%Y6Xo2V`MEYr?|gsIK?|Ty5Bl^1_QeWsA3#boZ)kHsD~fghx3*MdrRT*zi**4 z-i}LAa)?6j-vNI2#+10UqdkFh7gqRJktj%JML~oIRQfU5-Ga@9V%pO|D-xOcUY+ww zo=zrNnvdNndy!Mso3h?r!hx zU*EdnU+1BL({&9*FLi#`GLqEs7+hn1@z=^fDWm9?-3;Dp9L;NZ{a@r>(kB5`cBer= zgZJ7&*zCT|Th+87p`H8VR-4k7ib3kTP7q?}n|E!{0vkMRzU{3xOT7doX}A1*Hd>UF zp#Yt~&hP?0$CG`&9AQ zF(+r>!EaH==SLrnB}ea}W}T<_W9%X3C$7Eid-l~2j3i9QEXG&mV89ewmX^N5#9p8Z zJpcfBTot@|#q>>l^%!X+eO_kWu0AW|Xm@yoU-T|7slg{WtCHD93j#`*3@CdxHb4e$ z?$DlPbmZJc4k71l?3p$W1)>B5QJatxjOqiE-r_h4>Yb;kjWn^x9@qi#`B(n@D?9&+ z&%bK7?XjG-zkAxKURR9ia#$8`=g7~Nv3Dl<4-@xUiNMvQ0Zj%2+dI2nR#23*$xoi) z_*Y}#pugQ*A_*4NEfp?OZ+mO2zr6#wE?m@NOg1v69h+=Y&X69kZDHO~j@v}tw(7zc zYnPPsB}RE8*!p!Seq@4%0A2)2_xBV9XI?B8Kms?mrHI66{a`l|Sn(X^bO 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%0DtZ! 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 diff --git a/changelog.d/20260625_124424_control_panel_redesign.md b/changelog.d/20260625_124424_control_panel_redesign.md index 294ad20..e0b3be5 100644 --- a/changelog.d/20260625_124424_control_panel_redesign.md +++ b/changelog.d/20260625_124424_control_panel_redesign.md @@ -8,3 +8,4 @@ bump: patch - Added a searchable agent action timeline with status counts, stable action IDs, expandable details, and screenshot jump links. - Added an Edge extension action recorder with popup Record/Stop controls, shared relay sync, and Playwright-like script export in the control panel. - Added Playwright CRX-inspired recorder modes with Inspect selector preview, floating step list, and replay of recorded actions through the shared Edge relay. +- Added a full Playwright CRX fork artifact integrated with Browser Connection relay sharing and platform-triggered browser pool connection. diff --git a/extension/edge-share-crx/PLAYWRIGHT_CRX_LICENSE b/extension/edge-share-crx/PLAYWRIGHT_CRX_LICENSE new file mode 100644 index 0000000..717e848 --- /dev/null +++ b/extension/edge-share-crx/PLAYWRIGHT_CRX_LICENSE @@ -0,0 +1,203 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Portions Copyright (c) Rui Figueira. + Portions Copyright (c) Microsoft Corporation. + Portions Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/extension/edge-share-crx/PLAYWRIGHT_CRX_NOTICE b/extension/edge-share-crx/PLAYWRIGHT_CRX_NOTICE new file mode 100644 index 0000000..a132ddb --- /dev/null +++ b/extension/edge-share-crx/PLAYWRIGHT_CRX_NOTICE @@ -0,0 +1,5 @@ +Playwright CRX +Copyright (c) Rui Figueira + +This software contains code derived from the Playwright project (https://github.com/microsoft/playwright), +available under the Apache 2.0 license (https://github.com/microsoft/playwright/blob/master/LICENSE). diff --git a/extension/edge-share-crx/README.md b/extension/edge-share-crx/README.md new file mode 100644 index 0000000..ef1b50f --- /dev/null +++ b/extension/edge-share-crx/README.md @@ -0,0 +1,29 @@ +# Browser Connection Playwright CRX + +This directory contains the installable Edge/Chrome extension built from +`ruifigueira/playwright-crx` recorder sources and integrated with the +`browser-connection` relay. + +Upstream project: https://github.com/ruifigueira/playwright-crx + +## What is included + +- Playwright CRX recorder/player UI, side panel, shortcuts, context menu, and + options page. +- Browser Connection provider bridge exposed to web pages as + `window.browserConnection`. +- Browser relay WebSocket client used by the control panel and `rbc` tools. + +## Install + +1. Open `edge://extensions`. +2. Enable Developer mode. +3. Click `Load unpacked`. +4. Select this directory after unpacking the release archive. + +## Notes + +- The extension action button is reserved for Playwright CRX recorder attach, + so Browser Connection sharing is triggered from the platform page. +- Apache-2.0 upstream attribution is preserved in + `PLAYWRIGHT_CRX_LICENSE` and `PLAYWRIGHT_CRX_NOTICE`. diff --git a/extension/edge-share-crx/background.js b/extension/edge-share-crx/background.js new file mode 100644 index 0000000..c355f8b --- /dev/null +++ b/extension/edge-share-crx/background.js @@ -0,0 +1,143484 @@ +import { l as loadSettings, a as addSettingsChangedListener, d as defaultSettings } from "./settings.js"; +var define_process_env_default = {}; +var __defProp = Object.defineProperty; +var __defNormalProp = (obj, key2, value) => key2 in obj ? __defProp(obj, key2, { enumerable: true, configurable: true, writable: true, value }) : obj[key2] = value; +var __publicField = (obj, key2, value) => __defNormalProp(obj, typeof key2 !== "symbol" ? key2 + "" : key2, value); +var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j; +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + } + } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { value: "Module" })); +} +var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; +function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +function getAugmentedNamespace(n) { + if (Object.prototype.hasOwnProperty.call(n, "__esModule")) return n; + var f = n.default; + if (typeof f == "function") { + var a = function a2() { + if (this instanceof a2) { + return Reflect.construct(f, arguments, this.constructor); + } + return f.apply(this, arguments); + }; + a.prototype = f.prototype; + } else a = {}; + Object.defineProperty(a, "__esModule", { value: true }); + Object.keys(n).forEach(function(k) { + var d = Object.getOwnPropertyDescriptor(n, k); + Object.defineProperty(a, k, d.get ? d : { + enumerable: true, + get: function() { + return n[k]; + } + }); + }); + return a; +} +var browser$j = { exports: {} }; +var hasRequiredBrowser$j; +function requireBrowser$j() { + if (hasRequiredBrowser$j) return browser$j.exports; + hasRequiredBrowser$j = 1; + var process2 = browser$j.exports = {}; + var cachedSetTimeout; + var cachedClearTimeout; + function defaultSetTimout() { + throw new Error("setTimeout has not been defined"); + } + function defaultClearTimeout() { + throw new Error("clearTimeout has not been defined"); + } + (function() { + try { + if (typeof setTimeout === "function") { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === "function") { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + })(); + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + return setTimeout(fun, 0); + } + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + return cachedSetTimeout.call(null, fun, 0); + } catch (e2) { + return cachedSetTimeout.call(this, fun, 0); + } + } + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + return clearTimeout(marker); + } + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + return cachedClearTimeout(marker); + } catch (e) { + try { + return cachedClearTimeout.call(null, marker); + } catch (e2) { + return cachedClearTimeout.call(this, marker); + } + } + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + process2.nextTick = function(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function() { + this.fun.apply(null, this.array); + }; + process2.title = "browser"; + process2.browser = true; + process2.env = {}; + process2.argv = []; + process2.version = ""; + process2.versions = {}; + function noop2() { + } + process2.on = noop2; + process2.addListener = noop2; + process2.once = noop2; + process2.off = noop2; + process2.removeListener = noop2; + process2.removeAllListeners = noop2; + process2.emit = noop2; + process2.prependListener = noop2; + process2.prependOnceListener = noop2; + process2.listeners = function(name) { + return []; + }; + process2.binding = function(name) { + throw new Error("process.binding is not supported"); + }; + process2.cwd = function() { + return "/"; + }; + process2.chdir = function(dir) { + throw new Error("process.chdir is not supported"); + }; + process2.umask = function() { + return 0; + }; + return browser$j.exports; +} +var browserExports$4 = requireBrowser$j(); +const process$2 = /* @__PURE__ */ getDefaultExportFromCjs(browserExports$4); +process$2.hrtime = (previousTimestamp) => { + const baseNow = Math.floor((Date.now() - performance.now()) * 1e-3); + const clocktime = performance.now() * 1e-3; + let seconds = Math.floor(clocktime) + baseNow; + let nanoseconds = Math.floor(clocktime % 1 * 1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds < 0) { + seconds--; + nanoseconds += 1e9; + } + } + return [seconds, nanoseconds]; +}; +process$2.platform = "linux"; +process$2.versions.node = "18.16"; +process$2.stdout = { isTTY: "false" }; +process$2.geteuid = () => ""; +process$2.env["PLAYWRIGHT_BROWSERS_PATH"] = "."; +self.process = process$2; +var setImmediate$2 = {}; +var hasRequiredSetImmediate$1; +function requireSetImmediate$1() { + if (hasRequiredSetImmediate$1) return setImmediate$2; + hasRequiredSetImmediate$1 = 1; + (function(global2, undefined$1) { + if (global2.setImmediate) { + return; + } + var nextHandle = 1; + var tasksByHandle = {}; + var currentlyRunningATask = false; + var doc = global2.document; + var registerImmediate; + function setImmediate2(callback) { + if (typeof callback !== "function") { + callback = new Function("" + callback); + } + var args = new Array(arguments.length - 1); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i + 1]; + } + var task = { callback, args }; + tasksByHandle[nextHandle] = task; + registerImmediate(nextHandle); + return nextHandle++; + } + function clearImmediate(handle) { + delete tasksByHandle[handle]; + } + function run(task) { + var callback = task.callback; + var args = task.args; + switch (args.length) { + case 0: + callback(); + break; + case 1: + callback(args[0]); + break; + case 2: + callback(args[0], args[1]); + break; + case 3: + callback(args[0], args[1], args[2]); + break; + default: + callback.apply(undefined$1, args); + break; + } + } + function runIfPresent(handle) { + if (currentlyRunningATask) { + setTimeout(runIfPresent, 0, handle); + } else { + var task = tasksByHandle[handle]; + if (task) { + currentlyRunningATask = true; + try { + run(task); + } finally { + clearImmediate(handle); + currentlyRunningATask = false; + } + } + } + } + function installNextTickImplementation() { + registerImmediate = function(handle) { + process.nextTick(function() { + runIfPresent(handle); + }); + }; + } + function canUsePostMessage() { + if (global2.postMessage && !global2.importScripts) { + var postMessageIsAsynchronous = true; + var oldOnMessage = global2.onmessage; + global2.onmessage = function() { + postMessageIsAsynchronous = false; + }; + global2.postMessage("", "*"); + global2.onmessage = oldOnMessage; + return postMessageIsAsynchronous; + } + } + function installPostMessageImplementation() { + var messagePrefix = "setImmediate$" + Math.random() + "$"; + var onGlobalMessage = function(event) { + if (event.source === global2 && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) { + runIfPresent(+event.data.slice(messagePrefix.length)); + } + }; + if (global2.addEventListener) { + global2.addEventListener("message", onGlobalMessage, false); + } else { + global2.attachEvent("onmessage", onGlobalMessage); + } + registerImmediate = function(handle) { + global2.postMessage(messagePrefix + handle, "*"); + }; + } + function installMessageChannelImplementation() { + var channel = new MessageChannel(); + channel.port1.onmessage = function(event) { + var handle = event.data; + runIfPresent(handle); + }; + registerImmediate = function(handle) { + channel.port2.postMessage(handle); + }; + } + function installReadyStateChangeImplementation() { + var html = doc.documentElement; + registerImmediate = function(handle) { + var script = doc.createElement("script"); + script.onreadystatechange = function() { + runIfPresent(handle); + script.onreadystatechange = null; + html.removeChild(script); + script = null; + }; + html.appendChild(script); + }; + } + function installSetTimeoutImplementation() { + registerImmediate = function(handle) { + setTimeout(runIfPresent, 0, handle); + }; + } + var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global2); + attachTo = attachTo && attachTo.setTimeout ? attachTo : global2; + if ({}.toString.call(global2.process) === "[object process]") { + installNextTickImplementation(); + } else if (canUsePostMessage()) { + installPostMessageImplementation(); + } else if (global2.MessageChannel) { + installMessageChannelImplementation(); + } else if (doc && "onreadystatechange" in doc.createElement("script")) { + installReadyStateChangeImplementation(); + } else { + installSetTimeoutImplementation(); + } + attachTo.setImmediate = setImmediate2; + attachTo.clearImmediate = clearImmediate; + })(typeof self === "undefined" ? typeof commonjsGlobal === "undefined" ? setImmediate$2 : commonjsGlobal : self); + return setImmediate$2; +} +requireSetImmediate$1(); +self.setImmediate = setImmediate; +var buffer$3 = {}; +var base64Js = {}; +var hasRequiredBase64Js; +function requireBase64Js() { + if (hasRequiredBase64Js) return base64Js; + hasRequiredBase64Js = 1; + base64Js.byteLength = byteLength; + base64Js.toByteArray = toByteArray; + base64Js.fromByteArray = fromByteArray; + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array; + var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + revLookup["-".charCodeAt(0)] = 62; + revLookup["_".charCodeAt(0)] = 63; + function getLens(b64) { + var len2 = b64.length; + if (len2 % 4 > 0) { + throw new Error("Invalid string. Length must be a multiple of 4"); + } + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len2; + var placeHoldersLen = validLen === len2 ? 0 : 4 - validLen % 4; + return [validLen, placeHoldersLen]; + } + function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; + } + function _byteLength(b64, validLen, placeHoldersLen) { + return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; + } + function toByteArray(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); + var curByte = 0; + var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen; + var i2; + for (i2 = 0; i2 < len2; i2 += 4) { + tmp = revLookup[b64.charCodeAt(i2)] << 18 | revLookup[b64.charCodeAt(i2 + 1)] << 12 | revLookup[b64.charCodeAt(i2 + 2)] << 6 | revLookup[b64.charCodeAt(i2 + 3)]; + arr[curByte++] = tmp >> 16 & 255; + arr[curByte++] = tmp >> 8 & 255; + arr[curByte++] = tmp & 255; + } + if (placeHoldersLen === 2) { + tmp = revLookup[b64.charCodeAt(i2)] << 2 | revLookup[b64.charCodeAt(i2 + 1)] >> 4; + arr[curByte++] = tmp & 255; + } + if (placeHoldersLen === 1) { + tmp = revLookup[b64.charCodeAt(i2)] << 10 | revLookup[b64.charCodeAt(i2 + 1)] << 4 | revLookup[b64.charCodeAt(i2 + 2)] >> 2; + arr[curByte++] = tmp >> 8 & 255; + arr[curByte++] = tmp & 255; + } + return arr; + } + function tripletToBase64(num) { + return lookup[num >> 18 & 63] + lookup[num >> 12 & 63] + lookup[num >> 6 & 63] + lookup[num & 63]; + } + function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + for (var i2 = start; i2 < end; i2 += 3) { + tmp = (uint8[i2] << 16 & 16711680) + (uint8[i2 + 1] << 8 & 65280) + (uint8[i2 + 2] & 255); + output.push(tripletToBase64(tmp)); + } + return output.join(""); + } + function fromByteArray(uint8) { + var tmp; + var len2 = uint8.length; + var extraBytes = len2 % 3; + var parts = []; + var maxChunkLength = 16383; + for (var i2 = 0, len22 = len2 - extraBytes; i2 < len22; i2 += maxChunkLength) { + parts.push(encodeChunk(uint8, i2, i2 + maxChunkLength > len22 ? len22 : i2 + maxChunkLength)); + } + if (extraBytes === 1) { + tmp = uint8[len2 - 1]; + parts.push( + lookup[tmp >> 2] + lookup[tmp << 4 & 63] + "==" + ); + } else if (extraBytes === 2) { + tmp = (uint8[len2 - 2] << 8) + uint8[len2 - 1]; + parts.push( + lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + "=" + ); + } + return parts.join(""); + } + return base64Js; +} +var ieee754 = {}; +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +var hasRequiredIeee754; +function requireIeee754() { + if (hasRequiredIeee754) return ieee754; + hasRequiredIeee754 = 1; + ieee754.read = function(buffer2, offset2, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? nBytes - 1 : 0; + var d = isLE ? -1 : 1; + var s = buffer2[offset2 + i]; + i += d; + e = s & (1 << -nBits) - 1; + s >>= -nBits; + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer2[offset2 + i], i += d, nBits -= 8) { + } + m = e & (1 << -nBits) - 1; + e >>= -nBits; + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer2[offset2 + i], i += d, nBits -= 8) { + } + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : (s ? -1 : 1) * Infinity; + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen); + }; + ieee754.write = function(buffer2, value, offset2, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; + var i = isLE ? 0 : nBytes - 1; + var d = isLE ? 1 : -1; + var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; + value = Math.abs(value); + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + for (; mLen >= 8; buffer2[offset2 + i] = m & 255, i += d, m /= 256, mLen -= 8) { + } + e = e << mLen | m; + eLen += mLen; + for (; eLen > 0; buffer2[offset2 + i] = e & 255, i += d, e /= 256, eLen -= 8) { + } + buffer2[offset2 + i - d] |= s * 128; + }; + return ieee754; +} +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +var hasRequiredBuffer$2; +function requireBuffer$2() { + if (hasRequiredBuffer$2) return buffer$3; + hasRequiredBuffer$2 = 1; + (function(exports) { + const base64 = requireBase64Js(); + const ieee7542 = requireIeee754(); + const customInspectSymbol = typeof Symbol === "function" && typeof Symbol["for"] === "function" ? Symbol["for"]("nodejs.util.inspect.custom") : null; + exports.Buffer = Buffer2; + exports.SlowBuffer = SlowBuffer; + exports.INSPECT_MAX_BYTES = 50; + const K_MAX_LENGTH = 2147483647; + exports.kMaxLength = K_MAX_LENGTH; + Buffer2.TYPED_ARRAY_SUPPORT = typedArraySupport(); + if (!Buffer2.TYPED_ARRAY_SUPPORT && typeof console !== "undefined" && typeof console.error === "function") { + console.error( + "This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support." + ); + } + function typedArraySupport() { + try { + const arr = new Uint8Array(1); + const proto = { foo: function() { + return 42; + } }; + Object.setPrototypeOf(proto, Uint8Array.prototype); + Object.setPrototypeOf(arr, proto); + return arr.foo() === 42; + } catch (e) { + return false; + } + } + Object.defineProperty(Buffer2.prototype, "parent", { + enumerable: true, + get: function() { + if (!Buffer2.isBuffer(this)) return void 0; + return this.buffer; + } + }); + Object.defineProperty(Buffer2.prototype, "offset", { + enumerable: true, + get: function() { + if (!Buffer2.isBuffer(this)) return void 0; + return this.byteOffset; + } + }); + function createBuffer(length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"'); + } + const buf = new Uint8Array(length); + Object.setPrototypeOf(buf, Buffer2.prototype); + return buf; + } + function Buffer2(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + if (typeof encodingOrOffset === "string") { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ); + } + return allocUnsafe(arg); + } + return from2(arg, encodingOrOffset, length); + } + Buffer2.poolSize = 8192; + function from2(value, encodingOrOffset, length) { + if (typeof value === "string") { + return fromString(value, encodingOrOffset); + } + if (ArrayBuffer.isView(value)) { + return fromArrayView(value); + } + if (value == null) { + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value + ); + } + if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + if (typeof SharedArrayBuffer !== "undefined" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + if (typeof value === "number") { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ); + } + const valueOf = value.valueOf && value.valueOf(); + if (valueOf != null && valueOf !== value) { + return Buffer2.from(valueOf, encodingOrOffset, length); + } + const b = fromObject(value); + if (b) return b; + if (typeof Symbol !== "undefined" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === "function") { + return Buffer2.from(value[Symbol.toPrimitive]("string"), encodingOrOffset, length); + } + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value + ); + } + Buffer2.from = function(value, encodingOrOffset, length) { + return from2(value, encodingOrOffset, length); + }; + Object.setPrototypeOf(Buffer2.prototype, Uint8Array.prototype); + Object.setPrototypeOf(Buffer2, Uint8Array); + function assertSize(size) { + if (typeof size !== "number") { + throw new TypeError('"size" argument must be of type number'); + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"'); + } + } + function alloc(size, fill, encoding2) { + assertSize(size); + if (size <= 0) { + return createBuffer(size); + } + if (fill !== void 0) { + return typeof encoding2 === "string" ? createBuffer(size).fill(fill, encoding2) : createBuffer(size).fill(fill); + } + return createBuffer(size); + } + Buffer2.alloc = function(size, fill, encoding2) { + return alloc(size, fill, encoding2); + }; + function allocUnsafe(size) { + assertSize(size); + return createBuffer(size < 0 ? 0 : checked(size) | 0); + } + Buffer2.allocUnsafe = function(size) { + return allocUnsafe(size); + }; + Buffer2.allocUnsafeSlow = function(size) { + return allocUnsafe(size); + }; + function fromString(string2, encoding2) { + if (typeof encoding2 !== "string" || encoding2 === "") { + encoding2 = "utf8"; + } + if (!Buffer2.isEncoding(encoding2)) { + throw new TypeError("Unknown encoding: " + encoding2); + } + const length = byteLength(string2, encoding2) | 0; + let buf = createBuffer(length); + const actual = buf.write(string2, encoding2); + if (actual !== length) { + buf = buf.slice(0, actual); + } + return buf; + } + function fromArrayLike(array) { + const length = array.length < 0 ? 0 : checked(array.length) | 0; + const buf = createBuffer(length); + for (let i = 0; i < length; i += 1) { + buf[i] = array[i] & 255; + } + return buf; + } + function fromArrayView(arrayView) { + if (isInstance(arrayView, Uint8Array)) { + const copy = new Uint8Array(arrayView); + return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength); + } + return fromArrayLike(arrayView); + } + function fromArrayBuffer(array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds'); + } + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds'); + } + let buf; + if (byteOffset === void 0 && length === void 0) { + buf = new Uint8Array(array); + } else if (length === void 0) { + buf = new Uint8Array(array, byteOffset); + } else { + buf = new Uint8Array(array, byteOffset, length); + } + Object.setPrototypeOf(buf, Buffer2.prototype); + return buf; + } + function fromObject(obj) { + if (Buffer2.isBuffer(obj)) { + const len = checked(obj.length) | 0; + const buf = createBuffer(len); + if (buf.length === 0) { + return buf; + } + obj.copy(buf, 0, 0, len); + return buf; + } + if (obj.length !== void 0) { + if (typeof obj.length !== "number" || numberIsNaN(obj.length)) { + return createBuffer(0); + } + return fromArrayLike(obj); + } + if (obj.type === "Buffer" && Array.isArray(obj.data)) { + return fromArrayLike(obj.data); + } + } + function checked(length) { + if (length >= K_MAX_LENGTH) { + throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + K_MAX_LENGTH.toString(16) + " bytes"); + } + return length | 0; + } + function SlowBuffer(length) { + if (+length != length) { + length = 0; + } + return Buffer2.alloc(+length); + } + Buffer2.isBuffer = function isBuffer(b) { + return b != null && b._isBuffer === true && b !== Buffer2.prototype; + }; + Buffer2.compare = function compare2(a, b) { + if (isInstance(a, Uint8Array)) a = Buffer2.from(a, a.offset, a.byteLength); + if (isInstance(b, Uint8Array)) b = Buffer2.from(b, b.offset, b.byteLength); + if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ); + } + if (a === b) return 0; + let x = a.length; + let y = b.length; + for (let i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + Buffer2.isEncoding = function isEncoding(encoding2) { + switch (String(encoding2).toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "latin1": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return true; + default: + return false; + } + }; + Buffer2.concat = function concat(list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + if (list.length === 0) { + return Buffer2.alloc(0); + } + let i; + if (length === void 0) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + const buffer2 = Buffer2.allocUnsafe(length); + let pos = 0; + for (i = 0; i < list.length; ++i) { + let buf = list[i]; + if (isInstance(buf, Uint8Array)) { + if (pos + buf.length > buffer2.length) { + if (!Buffer2.isBuffer(buf)) buf = Buffer2.from(buf); + buf.copy(buffer2, pos); + } else { + Uint8Array.prototype.set.call( + buffer2, + buf, + pos + ); + } + } else if (!Buffer2.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } else { + buf.copy(buffer2, pos); + } + pos += buf.length; + } + return buffer2; + }; + function byteLength(string2, encoding2) { + if (Buffer2.isBuffer(string2)) { + return string2.length; + } + if (ArrayBuffer.isView(string2) || isInstance(string2, ArrayBuffer)) { + return string2.byteLength; + } + if (typeof string2 !== "string") { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string2 + ); + } + const len = string2.length; + const mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; + let loweredCase = false; + for (; ; ) { + switch (encoding2) { + case "ascii": + case "latin1": + case "binary": + return len; + case "utf8": + case "utf-8": + return utf8ToBytes(string2).length; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return len * 2; + case "hex": + return len >>> 1; + case "base64": + return base64ToBytes(string2).length; + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string2).length; + } + encoding2 = ("" + encoding2).toLowerCase(); + loweredCase = true; + } + } + } + Buffer2.byteLength = byteLength; + function slowToString(encoding2, start, end) { + let loweredCase = false; + if (start === void 0 || start < 0) { + start = 0; + } + if (start > this.length) { + return ""; + } + if (end === void 0 || end > this.length) { + end = this.length; + } + if (end <= 0) { + return ""; + } + end >>>= 0; + start >>>= 0; + if (end <= start) { + return ""; + } + if (!encoding2) encoding2 = "utf8"; + while (true) { + switch (encoding2) { + case "hex": + return hexSlice(this, start, end); + case "utf8": + case "utf-8": + return utf8Slice(this, start, end); + case "ascii": + return asciiSlice(this, start, end); + case "latin1": + case "binary": + return latin1Slice(this, start, end); + case "base64": + return base64Slice(this, start, end); + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return utf16leSlice(this, start, end); + default: + if (loweredCase) throw new TypeError("Unknown encoding: " + encoding2); + encoding2 = (encoding2 + "").toLowerCase(); + loweredCase = true; + } + } + } + Buffer2.prototype._isBuffer = true; + function swap(b, n, m) { + const i = b[n]; + b[n] = b[m]; + b[m] = i; + } + Buffer2.prototype.swap16 = function swap16() { + const len = this.length; + if (len % 2 !== 0) { + throw new RangeError("Buffer size must be a multiple of 16-bits"); + } + for (let i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this; + }; + Buffer2.prototype.swap32 = function swap32() { + const len = this.length; + if (len % 4 !== 0) { + throw new RangeError("Buffer size must be a multiple of 32-bits"); + } + for (let i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this; + }; + Buffer2.prototype.swap64 = function swap64() { + const len = this.length; + if (len % 8 !== 0) { + throw new RangeError("Buffer size must be a multiple of 64-bits"); + } + for (let i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this; + }; + Buffer2.prototype.toString = function toString2() { + const length = this.length; + if (length === 0) return ""; + if (arguments.length === 0) return utf8Slice(this, 0, length); + return slowToString.apply(this, arguments); + }; + Buffer2.prototype.toLocaleString = Buffer2.prototype.toString; + Buffer2.prototype.equals = function equals2(b) { + if (!Buffer2.isBuffer(b)) throw new TypeError("Argument must be a Buffer"); + if (this === b) return true; + return Buffer2.compare(this, b) === 0; + }; + Buffer2.prototype.inspect = function inspect() { + let str = ""; + const max2 = exports.INSPECT_MAX_BYTES; + str = this.toString("hex", 0, max2).replace(/(.{2})/g, "$1 ").trim(); + if (this.length > max2) str += " ... "; + return ""; + }; + if (customInspectSymbol) { + Buffer2.prototype[customInspectSymbol] = Buffer2.prototype.inspect; + } + Buffer2.prototype.compare = function compare2(target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer2.from(target, target.offset, target.byteLength); + } + if (!Buffer2.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target + ); + } + if (start === void 0) { + start = 0; + } + if (end === void 0) { + end = target ? target.length : 0; + } + if (thisStart === void 0) { + thisStart = 0; + } + if (thisEnd === void 0) { + thisEnd = this.length; + } + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError("out of range index"); + } + if (thisStart >= thisEnd && start >= end) { + return 0; + } + if (thisStart >= thisEnd) { + return -1; + } + if (start >= end) { + return 1; + } + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + if (this === target) return 0; + let x = thisEnd - thisStart; + let y = end - start; + const len = Math.min(x, y); + const thisCopy = this.slice(thisStart, thisEnd); + const targetCopy = target.slice(start, end); + for (let i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break; + } + } + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + function bidirectionalIndexOf(buffer2, val, byteOffset, encoding2, dir) { + if (buffer2.length === 0) return -1; + if (typeof byteOffset === "string") { + encoding2 = byteOffset; + byteOffset = 0; + } else if (byteOffset > 2147483647) { + byteOffset = 2147483647; + } else if (byteOffset < -2147483648) { + byteOffset = -2147483648; + } + byteOffset = +byteOffset; + if (numberIsNaN(byteOffset)) { + byteOffset = dir ? 0 : buffer2.length - 1; + } + if (byteOffset < 0) byteOffset = buffer2.length + byteOffset; + if (byteOffset >= buffer2.length) { + if (dir) return -1; + else byteOffset = buffer2.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1; + } + if (typeof val === "string") { + val = Buffer2.from(val, encoding2); + } + if (Buffer2.isBuffer(val)) { + if (val.length === 0) { + return -1; + } + return arrayIndexOf(buffer2, val, byteOffset, encoding2, dir); + } else if (typeof val === "number") { + val = val & 255; + if (typeof Uint8Array.prototype.indexOf === "function") { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer2, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer2, val, byteOffset); + } + } + return arrayIndexOf(buffer2, [val], byteOffset, encoding2, dir); + } + throw new TypeError("val must be string, number or Buffer"); + } + function arrayIndexOf(arr, val, byteOffset, encoding2, dir) { + let indexSize = 1; + let arrLength = arr.length; + let valLength = val.length; + if (encoding2 !== void 0) { + encoding2 = String(encoding2).toLowerCase(); + if (encoding2 === "ucs2" || encoding2 === "ucs-2" || encoding2 === "utf16le" || encoding2 === "utf-16le") { + if (arr.length < 2 || val.length < 2) { + return -1; + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + function read2(buf, i2) { + if (indexSize === 1) { + return buf[i2]; + } else { + return buf.readUInt16BE(i2 * indexSize); + } + } + let i; + if (dir) { + let foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read2(arr, i) === read2(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + let found = true; + for (let j = 0; j < valLength; j++) { + if (read2(arr, i + j) !== read2(val, j)) { + found = false; + break; + } + } + if (found) return i; + } + } + return -1; + } + Buffer2.prototype.includes = function includes(val, byteOffset, encoding2) { + return this.indexOf(val, byteOffset, encoding2) !== -1; + }; + Buffer2.prototype.indexOf = function indexOf(val, byteOffset, encoding2) { + return bidirectionalIndexOf(this, val, byteOffset, encoding2, true); + }; + Buffer2.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding2) { + return bidirectionalIndexOf(this, val, byteOffset, encoding2, false); + }; + function hexWrite(buf, string2, offset2, length) { + offset2 = Number(offset2) || 0; + const remaining = buf.length - offset2; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + const strLen = string2.length; + if (length > strLen / 2) { + length = strLen / 2; + } + let i; + for (i = 0; i < length; ++i) { + const parsed = parseInt(string2.substr(i * 2, 2), 16); + if (numberIsNaN(parsed)) return i; + buf[offset2 + i] = parsed; + } + return i; + } + function utf8Write(buf, string2, offset2, length) { + return blitBuffer(utf8ToBytes(string2, buf.length - offset2), buf, offset2, length); + } + function asciiWrite(buf, string2, offset2, length) { + return blitBuffer(asciiToBytes(string2), buf, offset2, length); + } + function base64Write(buf, string2, offset2, length) { + return blitBuffer(base64ToBytes(string2), buf, offset2, length); + } + function ucs2Write(buf, string2, offset2, length) { + return blitBuffer(utf16leToBytes(string2, buf.length - offset2), buf, offset2, length); + } + Buffer2.prototype.write = function write2(string2, offset2, length, encoding2) { + if (offset2 === void 0) { + encoding2 = "utf8"; + length = this.length; + offset2 = 0; + } else if (length === void 0 && typeof offset2 === "string") { + encoding2 = offset2; + length = this.length; + offset2 = 0; + } else if (isFinite(offset2)) { + offset2 = offset2 >>> 0; + if (isFinite(length)) { + length = length >>> 0; + if (encoding2 === void 0) encoding2 = "utf8"; + } else { + encoding2 = length; + length = void 0; + } + } else { + throw new Error( + "Buffer.write(string, encoding, offset[, length]) is no longer supported" + ); + } + const remaining = this.length - offset2; + if (length === void 0 || length > remaining) length = remaining; + if (string2.length > 0 && (length < 0 || offset2 < 0) || offset2 > this.length) { + throw new RangeError("Attempt to write outside buffer bounds"); + } + if (!encoding2) encoding2 = "utf8"; + let loweredCase = false; + for (; ; ) { + switch (encoding2) { + case "hex": + return hexWrite(this, string2, offset2, length); + case "utf8": + case "utf-8": + return utf8Write(this, string2, offset2, length); + case "ascii": + case "latin1": + case "binary": + return asciiWrite(this, string2, offset2, length); + case "base64": + return base64Write(this, string2, offset2, length); + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return ucs2Write(this, string2, offset2, length); + default: + if (loweredCase) throw new TypeError("Unknown encoding: " + encoding2); + encoding2 = ("" + encoding2).toLowerCase(); + loweredCase = true; + } + } + }; + Buffer2.prototype.toJSON = function toJSON() { + return { + type: "Buffer", + data: Array.prototype.slice.call(this._arr || this, 0) + }; + }; + function base64Slice(buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf); + } else { + return base64.fromByteArray(buf.slice(start, end)); + } + } + function utf8Slice(buf, start, end) { + end = Math.min(buf.length, end); + const res = []; + let i = start; + while (i < end) { + const firstByte = buf[i]; + let codePoint = null; + let bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1; + if (i + bytesPerSequence <= end) { + let secondByte, thirdByte, fourthByte, tempCodePoint; + switch (bytesPerSequence) { + case 1: + if (firstByte < 128) { + codePoint = firstByte; + } + break; + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 192) === 128) { + tempCodePoint = (firstByte & 31) << 6 | secondByte & 63; + if (tempCodePoint > 127) { + codePoint = tempCodePoint; + } + } + break; + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) { + tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63; + if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) { + codePoint = tempCodePoint; + } + } + break; + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) { + tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63; + if (tempCodePoint > 65535 && tempCodePoint < 1114112) { + codePoint = tempCodePoint; + } + } + } + } + if (codePoint === null) { + codePoint = 65533; + bytesPerSequence = 1; + } else if (codePoint > 65535) { + codePoint -= 65536; + res.push(codePoint >>> 10 & 1023 | 55296); + codePoint = 56320 | codePoint & 1023; + } + res.push(codePoint); + i += bytesPerSequence; + } + return decodeCodePointsArray(res); + } + const MAX_ARGUMENTS_LENGTH = 4096; + function decodeCodePointsArray(codePoints) { + const len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints); + } + let res = ""; + let i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ); + } + return res; + } + function asciiSlice(buf, start, end) { + let ret = ""; + end = Math.min(buf.length, end); + for (let i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 127); + } + return ret; + } + function latin1Slice(buf, start, end) { + let ret = ""; + end = Math.min(buf.length, end); + for (let i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret; + } + function hexSlice(buf, start, end) { + const len = buf.length; + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + let out = ""; + for (let i = start; i < end; ++i) { + out += hexSliceLookupTable[buf[i]]; + } + return out; + } + function utf16leSlice(buf, start, end) { + const bytes = buf.slice(start, end); + let res = ""; + for (let i = 0; i < bytes.length - 1; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res; + } + Buffer2.prototype.slice = function slice(start, end) { + const len = this.length; + start = ~~start; + end = end === void 0 ? len : ~~end; + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + if (end < start) end = start; + const newBuf = this.subarray(start, end); + Object.setPrototypeOf(newBuf, Buffer2.prototype); + return newBuf; + }; + function checkOffset(offset2, ext, length) { + if (offset2 % 1 !== 0 || offset2 < 0) throw new RangeError("offset is not uint"); + if (offset2 + ext > length) throw new RangeError("Trying to access beyond buffer length"); + } + Buffer2.prototype.readUintLE = Buffer2.prototype.readUIntLE = function readUIntLE(offset2, byteLength2, noAssert) { + offset2 = offset2 >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset2, byteLength2, this.length); + let val = this[offset2]; + let mul = 1; + let i = 0; + while (++i < byteLength2 && (mul *= 256)) { + val += this[offset2 + i] * mul; + } + return val; + }; + Buffer2.prototype.readUintBE = Buffer2.prototype.readUIntBE = function readUIntBE(offset2, byteLength2, noAssert) { + offset2 = offset2 >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + checkOffset(offset2, byteLength2, this.length); + } + let val = this[offset2 + --byteLength2]; + let mul = 1; + while (byteLength2 > 0 && (mul *= 256)) { + val += this[offset2 + --byteLength2] * mul; + } + return val; + }; + Buffer2.prototype.readUint8 = Buffer2.prototype.readUInt8 = function readUInt8(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 1, this.length); + return this[offset2]; + }; + Buffer2.prototype.readUint16LE = Buffer2.prototype.readUInt16LE = function readUInt16LE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 2, this.length); + return this[offset2] | this[offset2 + 1] << 8; + }; + Buffer2.prototype.readUint16BE = Buffer2.prototype.readUInt16BE = function readUInt16BE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 2, this.length); + return this[offset2] << 8 | this[offset2 + 1]; + }; + Buffer2.prototype.readUint32LE = Buffer2.prototype.readUInt32LE = function readUInt32LE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 4, this.length); + return (this[offset2] | this[offset2 + 1] << 8 | this[offset2 + 2] << 16) + this[offset2 + 3] * 16777216; + }; + Buffer2.prototype.readUint32BE = Buffer2.prototype.readUInt32BE = function readUInt32BE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 4, this.length); + return this[offset2] * 16777216 + (this[offset2 + 1] << 16 | this[offset2 + 2] << 8 | this[offset2 + 3]); + }; + Buffer2.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE(offset2) { + offset2 = offset2 >>> 0; + validateNumber(offset2, "offset"); + const first = this[offset2]; + const last = this[offset2 + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset2, this.length - 8); + } + const lo = first + this[++offset2] * 2 ** 8 + this[++offset2] * 2 ** 16 + this[++offset2] * 2 ** 24; + const hi = this[++offset2] + this[++offset2] * 2 ** 8 + this[++offset2] * 2 ** 16 + last * 2 ** 24; + return BigInt(lo) + (BigInt(hi) << BigInt(32)); + }); + Buffer2.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE(offset2) { + offset2 = offset2 >>> 0; + validateNumber(offset2, "offset"); + const first = this[offset2]; + const last = this[offset2 + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset2, this.length - 8); + } + const hi = first * 2 ** 24 + this[++offset2] * 2 ** 16 + this[++offset2] * 2 ** 8 + this[++offset2]; + const lo = this[++offset2] * 2 ** 24 + this[++offset2] * 2 ** 16 + this[++offset2] * 2 ** 8 + last; + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + }); + Buffer2.prototype.readIntLE = function readIntLE(offset2, byteLength2, noAssert) { + offset2 = offset2 >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset2, byteLength2, this.length); + let val = this[offset2]; + let mul = 1; + let i = 0; + while (++i < byteLength2 && (mul *= 256)) { + val += this[offset2 + i] * mul; + } + mul *= 128; + if (val >= mul) val -= Math.pow(2, 8 * byteLength2); + return val; + }; + Buffer2.prototype.readIntBE = function readIntBE(offset2, byteLength2, noAssert) { + offset2 = offset2 >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset2, byteLength2, this.length); + let i = byteLength2; + let mul = 1; + let val = this[offset2 + --i]; + while (i > 0 && (mul *= 256)) { + val += this[offset2 + --i] * mul; + } + mul *= 128; + if (val >= mul) val -= Math.pow(2, 8 * byteLength2); + return val; + }; + Buffer2.prototype.readInt8 = function readInt8(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 1, this.length); + if (!(this[offset2] & 128)) return this[offset2]; + return (255 - this[offset2] + 1) * -1; + }; + Buffer2.prototype.readInt16LE = function readInt16LE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 2, this.length); + const val = this[offset2] | this[offset2 + 1] << 8; + return val & 32768 ? val | 4294901760 : val; + }; + Buffer2.prototype.readInt16BE = function readInt16BE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 2, this.length); + const val = this[offset2 + 1] | this[offset2] << 8; + return val & 32768 ? val | 4294901760 : val; + }; + Buffer2.prototype.readInt32LE = function readInt32LE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 4, this.length); + return this[offset2] | this[offset2 + 1] << 8 | this[offset2 + 2] << 16 | this[offset2 + 3] << 24; + }; + Buffer2.prototype.readInt32BE = function readInt32BE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 4, this.length); + return this[offset2] << 24 | this[offset2 + 1] << 16 | this[offset2 + 2] << 8 | this[offset2 + 3]; + }; + Buffer2.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE(offset2) { + offset2 = offset2 >>> 0; + validateNumber(offset2, "offset"); + const first = this[offset2]; + const last = this[offset2 + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset2, this.length - 8); + } + const val = this[offset2 + 4] + this[offset2 + 5] * 2 ** 8 + this[offset2 + 6] * 2 ** 16 + (last << 24); + return (BigInt(val) << BigInt(32)) + BigInt(first + this[++offset2] * 2 ** 8 + this[++offset2] * 2 ** 16 + this[++offset2] * 2 ** 24); + }); + Buffer2.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE(offset2) { + offset2 = offset2 >>> 0; + validateNumber(offset2, "offset"); + const first = this[offset2]; + const last = this[offset2 + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset2, this.length - 8); + } + const val = (first << 24) + // Overflow + this[++offset2] * 2 ** 16 + this[++offset2] * 2 ** 8 + this[++offset2]; + return (BigInt(val) << BigInt(32)) + BigInt(this[++offset2] * 2 ** 24 + this[++offset2] * 2 ** 16 + this[++offset2] * 2 ** 8 + last); + }); + Buffer2.prototype.readFloatLE = function readFloatLE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 4, this.length); + return ieee7542.read(this, offset2, true, 23, 4); + }; + Buffer2.prototype.readFloatBE = function readFloatBE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 4, this.length); + return ieee7542.read(this, offset2, false, 23, 4); + }; + Buffer2.prototype.readDoubleLE = function readDoubleLE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 8, this.length); + return ieee7542.read(this, offset2, true, 52, 8); + }; + Buffer2.prototype.readDoubleBE = function readDoubleBE(offset2, noAssert) { + offset2 = offset2 >>> 0; + if (!noAssert) checkOffset(offset2, 8, this.length); + return ieee7542.read(this, offset2, false, 52, 8); + }; + function checkInt(buf, value, offset2, ext, max2, min2) { + if (!Buffer2.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance'); + if (value > max2 || value < min2) throw new RangeError('"value" argument is out of bounds'); + if (offset2 + ext > buf.length) throw new RangeError("Index out of range"); + } + Buffer2.prototype.writeUintLE = Buffer2.prototype.writeUIntLE = function writeUIntLE(value, offset2, byteLength2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + const maxBytes = Math.pow(2, 8 * byteLength2) - 1; + checkInt(this, value, offset2, byteLength2, maxBytes, 0); + } + let mul = 1; + let i = 0; + this[offset2] = value & 255; + while (++i < byteLength2 && (mul *= 256)) { + this[offset2 + i] = value / mul & 255; + } + return offset2 + byteLength2; + }; + Buffer2.prototype.writeUintBE = Buffer2.prototype.writeUIntBE = function writeUIntBE(value, offset2, byteLength2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + const maxBytes = Math.pow(2, 8 * byteLength2) - 1; + checkInt(this, value, offset2, byteLength2, maxBytes, 0); + } + let i = byteLength2 - 1; + let mul = 1; + this[offset2 + i] = value & 255; + while (--i >= 0 && (mul *= 256)) { + this[offset2 + i] = value / mul & 255; + } + return offset2 + byteLength2; + }; + Buffer2.prototype.writeUint8 = Buffer2.prototype.writeUInt8 = function writeUInt8(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 1, 255, 0); + this[offset2] = value & 255; + return offset2 + 1; + }; + Buffer2.prototype.writeUint16LE = Buffer2.prototype.writeUInt16LE = function writeUInt16LE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 2, 65535, 0); + this[offset2] = value & 255; + this[offset2 + 1] = value >>> 8; + return offset2 + 2; + }; + Buffer2.prototype.writeUint16BE = Buffer2.prototype.writeUInt16BE = function writeUInt16BE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 2, 65535, 0); + this[offset2] = value >>> 8; + this[offset2 + 1] = value & 255; + return offset2 + 2; + }; + Buffer2.prototype.writeUint32LE = Buffer2.prototype.writeUInt32LE = function writeUInt32LE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 4, 4294967295, 0); + this[offset2 + 3] = value >>> 24; + this[offset2 + 2] = value >>> 16; + this[offset2 + 1] = value >>> 8; + this[offset2] = value & 255; + return offset2 + 4; + }; + Buffer2.prototype.writeUint32BE = Buffer2.prototype.writeUInt32BE = function writeUInt32BE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 4, 4294967295, 0); + this[offset2] = value >>> 24; + this[offset2 + 1] = value >>> 16; + this[offset2 + 2] = value >>> 8; + this[offset2 + 3] = value & 255; + return offset2 + 4; + }; + function wrtBigUInt64LE(buf, value, offset2, min2, max2) { + checkIntBI(value, min2, max2, buf, offset2, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset2++] = lo; + lo = lo >> 8; + buf[offset2++] = lo; + lo = lo >> 8; + buf[offset2++] = lo; + lo = lo >> 8; + buf[offset2++] = lo; + let hi = Number(value >> BigInt(32) & BigInt(4294967295)); + buf[offset2++] = hi; + hi = hi >> 8; + buf[offset2++] = hi; + hi = hi >> 8; + buf[offset2++] = hi; + hi = hi >> 8; + buf[offset2++] = hi; + return offset2; + } + function wrtBigUInt64BE(buf, value, offset2, min2, max2) { + checkIntBI(value, min2, max2, buf, offset2, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset2 + 7] = lo; + lo = lo >> 8; + buf[offset2 + 6] = lo; + lo = lo >> 8; + buf[offset2 + 5] = lo; + lo = lo >> 8; + buf[offset2 + 4] = lo; + let hi = Number(value >> BigInt(32) & BigInt(4294967295)); + buf[offset2 + 3] = hi; + hi = hi >> 8; + buf[offset2 + 2] = hi; + hi = hi >> 8; + buf[offset2 + 1] = hi; + hi = hi >> 8; + buf[offset2] = hi; + return offset2 + 8; + } + Buffer2.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE(value, offset2 = 0) { + return wrtBigUInt64LE(this, value, offset2, BigInt(0), BigInt("0xffffffffffffffff")); + }); + Buffer2.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE(value, offset2 = 0) { + return wrtBigUInt64BE(this, value, offset2, BigInt(0), BigInt("0xffffffffffffffff")); + }); + Buffer2.prototype.writeIntLE = function writeIntLE(value, offset2, byteLength2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) { + const limit = Math.pow(2, 8 * byteLength2 - 1); + checkInt(this, value, offset2, byteLength2, limit - 1, -limit); + } + let i = 0; + let mul = 1; + let sub = 0; + this[offset2] = value & 255; + while (++i < byteLength2 && (mul *= 256)) { + if (value < 0 && sub === 0 && this[offset2 + i - 1] !== 0) { + sub = 1; + } + this[offset2 + i] = (value / mul >> 0) - sub & 255; + } + return offset2 + byteLength2; + }; + Buffer2.prototype.writeIntBE = function writeIntBE(value, offset2, byteLength2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) { + const limit = Math.pow(2, 8 * byteLength2 - 1); + checkInt(this, value, offset2, byteLength2, limit - 1, -limit); + } + let i = byteLength2 - 1; + let mul = 1; + let sub = 0; + this[offset2 + i] = value & 255; + while (--i >= 0 && (mul *= 256)) { + if (value < 0 && sub === 0 && this[offset2 + i + 1] !== 0) { + sub = 1; + } + this[offset2 + i] = (value / mul >> 0) - sub & 255; + } + return offset2 + byteLength2; + }; + Buffer2.prototype.writeInt8 = function writeInt8(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 1, 127, -128); + if (value < 0) value = 255 + value + 1; + this[offset2] = value & 255; + return offset2 + 1; + }; + Buffer2.prototype.writeInt16LE = function writeInt16LE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 2, 32767, -32768); + this[offset2] = value & 255; + this[offset2 + 1] = value >>> 8; + return offset2 + 2; + }; + Buffer2.prototype.writeInt16BE = function writeInt16BE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 2, 32767, -32768); + this[offset2] = value >>> 8; + this[offset2 + 1] = value & 255; + return offset2 + 2; + }; + Buffer2.prototype.writeInt32LE = function writeInt32LE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 4, 2147483647, -2147483648); + this[offset2] = value & 255; + this[offset2 + 1] = value >>> 8; + this[offset2 + 2] = value >>> 16; + this[offset2 + 3] = value >>> 24; + return offset2 + 4; + }; + Buffer2.prototype.writeInt32BE = function writeInt32BE(value, offset2, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) checkInt(this, value, offset2, 4, 2147483647, -2147483648); + if (value < 0) value = 4294967295 + value + 1; + this[offset2] = value >>> 24; + this[offset2 + 1] = value >>> 16; + this[offset2 + 2] = value >>> 8; + this[offset2 + 3] = value & 255; + return offset2 + 4; + }; + Buffer2.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE(value, offset2 = 0) { + return wrtBigUInt64LE(this, value, offset2, -BigInt("0x8000000000000000"), BigInt("0x7fffffffffffffff")); + }); + Buffer2.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE(value, offset2 = 0) { + return wrtBigUInt64BE(this, value, offset2, -BigInt("0x8000000000000000"), BigInt("0x7fffffffffffffff")); + }); + function checkIEEE754(buf, value, offset2, ext, max2, min2) { + if (offset2 + ext > buf.length) throw new RangeError("Index out of range"); + if (offset2 < 0) throw new RangeError("Index out of range"); + } + function writeFloat(buf, value, offset2, littleEndian, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) { + checkIEEE754(buf, value, offset2, 4); + } + ieee7542.write(buf, value, offset2, littleEndian, 23, 4); + return offset2 + 4; + } + Buffer2.prototype.writeFloatLE = function writeFloatLE(value, offset2, noAssert) { + return writeFloat(this, value, offset2, true, noAssert); + }; + Buffer2.prototype.writeFloatBE = function writeFloatBE(value, offset2, noAssert) { + return writeFloat(this, value, offset2, false, noAssert); + }; + function writeDouble(buf, value, offset2, littleEndian, noAssert) { + value = +value; + offset2 = offset2 >>> 0; + if (!noAssert) { + checkIEEE754(buf, value, offset2, 8); + } + ieee7542.write(buf, value, offset2, littleEndian, 52, 8); + return offset2 + 8; + } + Buffer2.prototype.writeDoubleLE = function writeDoubleLE(value, offset2, noAssert) { + return writeDouble(this, value, offset2, true, noAssert); + }; + Buffer2.prototype.writeDoubleBE = function writeDoubleBE(value, offset2, noAssert) { + return writeDouble(this, value, offset2, false, noAssert); + }; + Buffer2.prototype.copy = function copy(target, targetStart, start, end) { + if (!Buffer2.isBuffer(target)) throw new TypeError("argument should be a Buffer"); + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + if (end === start) return 0; + if (target.length === 0 || this.length === 0) return 0; + if (targetStart < 0) { + throw new RangeError("targetStart out of bounds"); + } + if (start < 0 || start >= this.length) throw new RangeError("Index out of range"); + if (end < 0) throw new RangeError("sourceEnd out of bounds"); + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + const len = end - start; + if (this === target && typeof Uint8Array.prototype.copyWithin === "function") { + this.copyWithin(targetStart, start, end); + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ); + } + return len; + }; + Buffer2.prototype.fill = function fill(val, start, end, encoding2) { + if (typeof val === "string") { + if (typeof start === "string") { + encoding2 = start; + start = 0; + end = this.length; + } else if (typeof end === "string") { + encoding2 = end; + end = this.length; + } + if (encoding2 !== void 0 && typeof encoding2 !== "string") { + throw new TypeError("encoding must be a string"); + } + if (typeof encoding2 === "string" && !Buffer2.isEncoding(encoding2)) { + throw new TypeError("Unknown encoding: " + encoding2); + } + if (val.length === 1) { + const code = val.charCodeAt(0); + if (encoding2 === "utf8" && code < 128 || encoding2 === "latin1") { + val = code; + } + } + } else if (typeof val === "number") { + val = val & 255; + } else if (typeof val === "boolean") { + val = Number(val); + } + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError("Out of range index"); + } + if (end <= start) { + return this; + } + start = start >>> 0; + end = end === void 0 ? this.length : end >>> 0; + if (!val) val = 0; + let i; + if (typeof val === "number") { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + const bytes = Buffer2.isBuffer(val) ? val : Buffer2.from(val, encoding2); + const len = bytes.length; + if (len === 0) { + throw new TypeError('The value "' + val + '" is invalid for argument "value"'); + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + return this; + }; + const errors2 = {}; + function E(sym, getMessage, Base) { + errors2[sym] = class NodeError extends Base { + constructor() { + super(); + Object.defineProperty(this, "message", { + value: getMessage.apply(this, arguments), + writable: true, + configurable: true + }); + this.name = `${this.name} [${sym}]`; + this.stack; + delete this.name; + } + get code() { + return sym; + } + set code(value) { + Object.defineProperty(this, "code", { + configurable: true, + enumerable: true, + value, + writable: true + }); + } + toString() { + return `${this.name} [${sym}]: ${this.message}`; + } + }; + } + E( + "ERR_BUFFER_OUT_OF_BOUNDS", + function(name) { + if (name) { + return `${name} is outside of buffer bounds`; + } + return "Attempt to access memory outside buffer bounds"; + }, + RangeError + ); + E( + "ERR_INVALID_ARG_TYPE", + function(name, actual) { + return `The "${name}" argument must be of type number. Received type ${typeof actual}`; + }, + TypeError + ); + E( + "ERR_OUT_OF_RANGE", + function(str, range2, input) { + let msg = `The value of "${str}" is out of range.`; + let received = input; + if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { + received = addNumericalSeparator(String(input)); + } else if (typeof input === "bigint") { + received = String(input); + if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) { + received = addNumericalSeparator(received); + } + received += "n"; + } + msg += ` It must be ${range2}. Received ${received}`; + return msg; + }, + RangeError + ); + function addNumericalSeparator(val) { + let res = ""; + let i = val.length; + const start = val[0] === "-" ? 1 : 0; + for (; i >= start + 4; i -= 3) { + res = `_${val.slice(i - 3, i)}${res}`; + } + return `${val.slice(0, i)}${res}`; + } + function checkBounds(buf, offset2, byteLength2) { + validateNumber(offset2, "offset"); + if (buf[offset2] === void 0 || buf[offset2 + byteLength2] === void 0) { + boundsError(offset2, buf.length - (byteLength2 + 1)); + } + } + function checkIntBI(value, min2, max2, buf, offset2, byteLength2) { + if (value > max2 || value < min2) { + const n = typeof min2 === "bigint" ? "n" : ""; + let range2; + { + if (min2 === 0 || min2 === BigInt(0)) { + range2 = `>= 0${n} and < 2${n} ** ${(byteLength2 + 1) * 8}${n}`; + } else { + range2 = `>= -(2${n} ** ${(byteLength2 + 1) * 8 - 1}${n}) and < 2 ** ${(byteLength2 + 1) * 8 - 1}${n}`; + } + } + throw new errors2.ERR_OUT_OF_RANGE("value", range2, value); + } + checkBounds(buf, offset2, byteLength2); + } + function validateNumber(value, name) { + if (typeof value !== "number") { + throw new errors2.ERR_INVALID_ARG_TYPE(name, "number", value); + } + } + function boundsError(value, length, type2) { + if (Math.floor(value) !== value) { + validateNumber(value, type2); + throw new errors2.ERR_OUT_OF_RANGE("offset", "an integer", value); + } + if (length < 0) { + throw new errors2.ERR_BUFFER_OUT_OF_BOUNDS(); + } + throw new errors2.ERR_OUT_OF_RANGE( + "offset", + `>= ${0} and <= ${length}`, + value + ); + } + const INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + function base64clean(str) { + str = str.split("=")[0]; + str = str.trim().replace(INVALID_BASE64_RE, ""); + if (str.length < 2) return ""; + while (str.length % 4 !== 0) { + str = str + "="; + } + return str; + } + function utf8ToBytes(string2, units) { + units = units || Infinity; + let codePoint; + const length = string2.length; + let leadSurrogate = null; + const bytes = []; + for (let i = 0; i < length; ++i) { + codePoint = string2.charCodeAt(i); + if (codePoint > 55295 && codePoint < 57344) { + if (!leadSurrogate) { + if (codePoint > 56319) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + continue; + } else if (i + 1 === length) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + continue; + } + leadSurrogate = codePoint; + continue; + } + if (codePoint < 56320) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + leadSurrogate = codePoint; + continue; + } + codePoint = (leadSurrogate - 55296 << 10 | codePoint - 56320) + 65536; + } else if (leadSurrogate) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + } + leadSurrogate = null; + if (codePoint < 128) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 2048) { + if ((units -= 2) < 0) break; + bytes.push( + codePoint >> 6 | 192, + codePoint & 63 | 128 + ); + } else if (codePoint < 65536) { + if ((units -= 3) < 0) break; + bytes.push( + codePoint >> 12 | 224, + codePoint >> 6 & 63 | 128, + codePoint & 63 | 128 + ); + } else if (codePoint < 1114112) { + if ((units -= 4) < 0) break; + bytes.push( + codePoint >> 18 | 240, + codePoint >> 12 & 63 | 128, + codePoint >> 6 & 63 | 128, + codePoint & 63 | 128 + ); + } else { + throw new Error("Invalid code point"); + } + } + return bytes; + } + function asciiToBytes(str) { + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + byteArray.push(str.charCodeAt(i) & 255); + } + return byteArray; + } + function utf16leToBytes(str, units) { + let c, hi, lo; + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + return byteArray; + } + function base64ToBytes(str) { + return base64.toByteArray(base64clean(str)); + } + function blitBuffer(src2, dst, offset2, length) { + let i; + for (i = 0; i < length; ++i) { + if (i + offset2 >= dst.length || i >= src2.length) break; + dst[i + offset2] = src2[i]; + } + return i; + } + function isInstance(obj, type2) { + return obj instanceof type2 || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type2.name; + } + function numberIsNaN(obj) { + return obj !== obj; + } + const hexSliceLookupTable = function() { + const alphabet = "0123456789abcdef"; + const table = new Array(256); + for (let i = 0; i < 16; ++i) { + const i16 = i * 16; + for (let j = 0; j < 16; ++j) { + table[i16 + j] = alphabet[i] + alphabet[j]; + } + } + return table; + }(); + function defineBigIntMethod(fn) { + return typeof BigInt === "undefined" ? BufferBigIntNotDefined : fn; + } + function BufferBigIntNotDefined() { + throw new Error("BigInt not supported"); + } + })(buffer$3); + return buffer$3; +} +var bufferExports = requireBuffer$2(); +const buffer$2 = /* @__PURE__ */ getDefaultExportFromCjs(bufferExports); +self.Buffer = buffer$2.Buffer; +var lib$2 = { exports: {} }; +var Stats$1 = {}; +var constants$8 = {}; +var hasRequiredConstants$7; +function requireConstants$7() { + if (hasRequiredConstants$7) return constants$8; + hasRequiredConstants$7 = 1; + Object.defineProperty(constants$8, "__esModule", { value: true }); + constants$8.constants = void 0; + constants$8.constants = { + O_RDONLY: 0, + O_WRONLY: 1, + O_RDWR: 2, + S_IFMT: 61440, + S_IFREG: 32768, + S_IFDIR: 16384, + S_IFCHR: 8192, + S_IFBLK: 24576, + S_IFIFO: 4096, + S_IFLNK: 40960, + S_IFSOCK: 49152, + O_CREAT: 64, + O_EXCL: 128, + O_NOCTTY: 256, + O_TRUNC: 512, + O_APPEND: 1024, + O_DIRECTORY: 65536, + O_NOATIME: 262144, + O_NOFOLLOW: 131072, + O_SYNC: 1052672, + O_SYMLINK: 2097152, + O_DIRECT: 16384, + O_NONBLOCK: 2048, + S_IRWXU: 448, + S_IRUSR: 256, + S_IWUSR: 128, + S_IXUSR: 64, + S_IRWXG: 56, + S_IRGRP: 32, + S_IWGRP: 16, + S_IXGRP: 8, + S_IRWXO: 7, + S_IROTH: 4, + S_IWOTH: 2, + S_IXOTH: 1, + F_OK: 0, + R_OK: 4, + W_OK: 2, + X_OK: 1, + UV_FS_SYMLINK_DIR: 1, + UV_FS_SYMLINK_JUNCTION: 2, + UV_FS_COPYFILE_EXCL: 1, + UV_FS_COPYFILE_FICLONE: 2, + UV_FS_COPYFILE_FICLONE_FORCE: 4, + COPYFILE_EXCL: 1, + COPYFILE_FICLONE: 2, + COPYFILE_FICLONE_FORCE: 4 + }; + return constants$8; +} +var hasRequiredStats; +function requireStats() { + if (hasRequiredStats) return Stats$1; + hasRequiredStats = 1; + Object.defineProperty(Stats$1, "__esModule", { value: true }); + Stats$1.Stats = void 0; + const constants_1 = requireConstants$7(); + const { S_IFMT, S_IFDIR, S_IFREG, S_IFBLK, S_IFCHR, S_IFLNK, S_IFIFO, S_IFSOCK } = constants_1.constants; + class Stats2 { + static build(node2, bigint = false) { + const stats = new Stats2(); + const { uid, gid, atime, mtime, ctime } = node2; + const getStatNumber = !bigint ? (number) => number : (number) => BigInt(number); + stats.uid = getStatNumber(uid); + stats.gid = getStatNumber(gid); + stats.rdev = getStatNumber(0); + stats.blksize = getStatNumber(4096); + stats.ino = getStatNumber(node2.ino); + stats.size = getStatNumber(node2.getSize()); + stats.blocks = getStatNumber(1); + stats.atime = atime; + stats.mtime = mtime; + stats.ctime = ctime; + stats.birthtime = ctime; + stats.atimeMs = getStatNumber(atime.getTime()); + stats.mtimeMs = getStatNumber(mtime.getTime()); + const ctimeMs = getStatNumber(ctime.getTime()); + stats.ctimeMs = ctimeMs; + stats.birthtimeMs = ctimeMs; + if (bigint) { + stats.atimeNs = BigInt(atime.getTime()) * BigInt(1e6); + stats.mtimeNs = BigInt(mtime.getTime()) * BigInt(1e6); + const ctimeNs = BigInt(ctime.getTime()) * BigInt(1e6); + stats.ctimeNs = ctimeNs; + stats.birthtimeNs = ctimeNs; + } + stats.dev = getStatNumber(0); + stats.mode = getStatNumber(node2.mode); + stats.nlink = getStatNumber(node2.nlink); + return stats; + } + _checkModeProperty(property) { + return (Number(this.mode) & S_IFMT) === property; + } + isDirectory() { + return this._checkModeProperty(S_IFDIR); + } + isFile() { + return this._checkModeProperty(S_IFREG); + } + isBlockDevice() { + return this._checkModeProperty(S_IFBLK); + } + isCharacterDevice() { + return this._checkModeProperty(S_IFCHR); + } + isSymbolicLink() { + return this._checkModeProperty(S_IFLNK); + } + isFIFO() { + return this._checkModeProperty(S_IFIFO); + } + isSocket() { + return this._checkModeProperty(S_IFSOCK); + } + } + Stats$1.Stats = Stats2; + Stats$1.default = Stats2; + return Stats$1; +} +var Dirent$1 = {}; +var encoding = {}; +var buffer$1 = {}; +var hasRequiredBuffer$1; +function requireBuffer$1() { + if (hasRequiredBuffer$1) return buffer$1; + hasRequiredBuffer$1 = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.bufferFrom = exports.bufferAllocUnsafe = exports.Buffer = void 0; + const buffer_1 = requireBuffer$2(); + Object.defineProperty(exports, "Buffer", { enumerable: true, get: function() { + return buffer_1.Buffer; + } }); + function bufferV0P12Ponyfill(arg0, ...args) { + return new buffer_1.Buffer(arg0, ...args); + } + const bufferAllocUnsafe = buffer_1.Buffer.allocUnsafe || bufferV0P12Ponyfill; + exports.bufferAllocUnsafe = bufferAllocUnsafe; + const bufferFrom = buffer_1.Buffer.from || bufferV0P12Ponyfill; + exports.bufferFrom = bufferFrom; + })(buffer$1); + return buffer$1; +} +var errors$3 = {}; +var assert$1 = { exports: {} }; +var errors$2 = {}; +var util$6 = {}; +var types$3 = {}; +var shams$1; +var hasRequiredShams$1; +function requireShams$1() { + if (hasRequiredShams$1) return shams$1; + hasRequiredShams$1 = 1; + shams$1 = function hasSymbols2() { + if (typeof Symbol !== "function" || typeof Object.getOwnPropertySymbols !== "function") { + return false; + } + if (typeof Symbol.iterator === "symbol") { + return true; + } + var obj = {}; + var sym = Symbol("test"); + var symObj = Object(sym); + if (typeof sym === "string") { + return false; + } + if (Object.prototype.toString.call(sym) !== "[object Symbol]") { + return false; + } + if (Object.prototype.toString.call(symObj) !== "[object Symbol]") { + return false; + } + var symVal = 42; + obj[sym] = symVal; + for (var _ in obj) { + return false; + } + if (typeof Object.keys === "function" && Object.keys(obj).length !== 0) { + return false; + } + if (typeof Object.getOwnPropertyNames === "function" && Object.getOwnPropertyNames(obj).length !== 0) { + return false; + } + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { + return false; + } + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { + return false; + } + if (typeof Object.getOwnPropertyDescriptor === "function") { + var descriptor = ( + /** @type {PropertyDescriptor} */ + Object.getOwnPropertyDescriptor(obj, sym) + ); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { + return false; + } + } + return true; + }; + return shams$1; +} +var shams; +var hasRequiredShams; +function requireShams() { + if (hasRequiredShams) return shams; + hasRequiredShams = 1; + var hasSymbols2 = requireShams$1(); + shams = function hasToStringTagShams() { + return hasSymbols2() && !!Symbol.toStringTag; + }; + return shams; +} +var esObjectAtoms; +var hasRequiredEsObjectAtoms; +function requireEsObjectAtoms() { + if (hasRequiredEsObjectAtoms) return esObjectAtoms; + hasRequiredEsObjectAtoms = 1; + esObjectAtoms = Object; + return esObjectAtoms; +} +var esErrors; +var hasRequiredEsErrors; +function requireEsErrors() { + if (hasRequiredEsErrors) return esErrors; + hasRequiredEsErrors = 1; + esErrors = Error; + return esErrors; +} +var _eval; +var hasRequired_eval; +function require_eval() { + if (hasRequired_eval) return _eval; + hasRequired_eval = 1; + _eval = EvalError; + return _eval; +} +var range; +var hasRequiredRange; +function requireRange() { + if (hasRequiredRange) return range; + hasRequiredRange = 1; + range = RangeError; + return range; +} +var ref$1; +var hasRequiredRef; +function requireRef() { + if (hasRequiredRef) return ref$1; + hasRequiredRef = 1; + ref$1 = ReferenceError; + return ref$1; +} +var syntax; +var hasRequiredSyntax; +function requireSyntax() { + if (hasRequiredSyntax) return syntax; + hasRequiredSyntax = 1; + syntax = SyntaxError; + return syntax; +} +var type; +var hasRequiredType; +function requireType() { + if (hasRequiredType) return type; + hasRequiredType = 1; + type = TypeError; + return type; +} +var uri; +var hasRequiredUri; +function requireUri() { + if (hasRequiredUri) return uri; + hasRequiredUri = 1; + uri = URIError; + return uri; +} +var abs; +var hasRequiredAbs; +function requireAbs() { + if (hasRequiredAbs) return abs; + hasRequiredAbs = 1; + abs = Math.abs; + return abs; +} +var floor; +var hasRequiredFloor; +function requireFloor() { + if (hasRequiredFloor) return floor; + hasRequiredFloor = 1; + floor = Math.floor; + return floor; +} +var max; +var hasRequiredMax; +function requireMax() { + if (hasRequiredMax) return max; + hasRequiredMax = 1; + max = Math.max; + return max; +} +var min; +var hasRequiredMin; +function requireMin() { + if (hasRequiredMin) return min; + hasRequiredMin = 1; + min = Math.min; + return min; +} +var pow; +var hasRequiredPow; +function requirePow() { + if (hasRequiredPow) return pow; + hasRequiredPow = 1; + pow = Math.pow; + return pow; +} +var round; +var hasRequiredRound; +function requireRound() { + if (hasRequiredRound) return round; + hasRequiredRound = 1; + round = Math.round; + return round; +} +var _isNaN; +var hasRequired_isNaN; +function require_isNaN() { + if (hasRequired_isNaN) return _isNaN; + hasRequired_isNaN = 1; + _isNaN = Number.isNaN || function isNaN2(a) { + return a !== a; + }; + return _isNaN; +} +var sign$1; +var hasRequiredSign$1; +function requireSign$1() { + if (hasRequiredSign$1) return sign$1; + hasRequiredSign$1 = 1; + var $isNaN = /* @__PURE__ */ require_isNaN(); + sign$1 = function sign2(number) { + if ($isNaN(number) || number === 0) { + return number; + } + return number < 0 ? -1 : 1; + }; + return sign$1; +} +var gOPD; +var hasRequiredGOPD; +function requireGOPD() { + if (hasRequiredGOPD) return gOPD; + hasRequiredGOPD = 1; + gOPD = Object.getOwnPropertyDescriptor; + return gOPD; +} +var gopd; +var hasRequiredGopd; +function requireGopd() { + if (hasRequiredGopd) return gopd; + hasRequiredGopd = 1; + var $gOPD = /* @__PURE__ */ requireGOPD(); + if ($gOPD) { + try { + $gOPD([], "length"); + } catch (e) { + $gOPD = null; + } + } + gopd = $gOPD; + return gopd; +} +var esDefineProperty; +var hasRequiredEsDefineProperty; +function requireEsDefineProperty() { + if (hasRequiredEsDefineProperty) return esDefineProperty; + hasRequiredEsDefineProperty = 1; + var $defineProperty = Object.defineProperty || false; + if ($defineProperty) { + try { + $defineProperty({}, "a", { value: 1 }); + } catch (e) { + $defineProperty = false; + } + } + esDefineProperty = $defineProperty; + return esDefineProperty; +} +var hasSymbols; +var hasRequiredHasSymbols; +function requireHasSymbols() { + if (hasRequiredHasSymbols) return hasSymbols; + hasRequiredHasSymbols = 1; + var origSymbol = typeof Symbol !== "undefined" && Symbol; + var hasSymbolSham = requireShams$1(); + hasSymbols = function hasNativeSymbols() { + if (typeof origSymbol !== "function") { + return false; + } + if (typeof Symbol !== "function") { + return false; + } + if (typeof origSymbol("foo") !== "symbol") { + return false; + } + if (typeof Symbol("bar") !== "symbol") { + return false; + } + return hasSymbolSham(); + }; + return hasSymbols; +} +var Reflect_getPrototypeOf; +var hasRequiredReflect_getPrototypeOf; +function requireReflect_getPrototypeOf() { + if (hasRequiredReflect_getPrototypeOf) return Reflect_getPrototypeOf; + hasRequiredReflect_getPrototypeOf = 1; + Reflect_getPrototypeOf = typeof Reflect !== "undefined" && Reflect.getPrototypeOf || null; + return Reflect_getPrototypeOf; +} +var Object_getPrototypeOf; +var hasRequiredObject_getPrototypeOf; +function requireObject_getPrototypeOf() { + if (hasRequiredObject_getPrototypeOf) return Object_getPrototypeOf; + hasRequiredObject_getPrototypeOf = 1; + var $Object = /* @__PURE__ */ requireEsObjectAtoms(); + Object_getPrototypeOf = $Object.getPrototypeOf || null; + return Object_getPrototypeOf; +} +var implementation$4; +var hasRequiredImplementation$4; +function requireImplementation$4() { + if (hasRequiredImplementation$4) return implementation$4; + hasRequiredImplementation$4 = 1; + var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; + var toStr = Object.prototype.toString; + var max2 = Math.max; + var funcType = "[object Function]"; + var concatty = function concatty2(a, b) { + var arr = []; + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } + return arr; + }; + var slicy = function slicy2(arrLike, offset2) { + var arr = []; + for (var i = offset2, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; + }; + var joiny = function(arr, joiner) { + var str = ""; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; + }; + implementation$4 = function bind(that) { + var target = this; + if (typeof target !== "function" || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + var bound; + var binder = function() { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + }; + var boundLength = max2(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = "$" + i; + } + bound = Function("binder", "return function (" + joiny(boundArgs, ",") + "){ return binder.apply(this,arguments); }")(binder); + if (target.prototype) { + var Empty = function Empty2() { + }; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; + return implementation$4; +} +var functionBind; +var hasRequiredFunctionBind; +function requireFunctionBind() { + if (hasRequiredFunctionBind) return functionBind; + hasRequiredFunctionBind = 1; + var implementation2 = requireImplementation$4(); + functionBind = Function.prototype.bind || implementation2; + return functionBind; +} +var functionCall; +var hasRequiredFunctionCall; +function requireFunctionCall() { + if (hasRequiredFunctionCall) return functionCall; + hasRequiredFunctionCall = 1; + functionCall = Function.prototype.call; + return functionCall; +} +var functionApply; +var hasRequiredFunctionApply; +function requireFunctionApply() { + if (hasRequiredFunctionApply) return functionApply; + hasRequiredFunctionApply = 1; + functionApply = Function.prototype.apply; + return functionApply; +} +var reflectApply; +var hasRequiredReflectApply; +function requireReflectApply() { + if (hasRequiredReflectApply) return reflectApply; + hasRequiredReflectApply = 1; + reflectApply = typeof Reflect !== "undefined" && Reflect && Reflect.apply; + return reflectApply; +} +var actualApply; +var hasRequiredActualApply; +function requireActualApply() { + if (hasRequiredActualApply) return actualApply; + hasRequiredActualApply = 1; + var bind = requireFunctionBind(); + var $apply = requireFunctionApply(); + var $call = requireFunctionCall(); + var $reflectApply = requireReflectApply(); + actualApply = $reflectApply || bind.call($call, $apply); + return actualApply; +} +var callBindApplyHelpers; +var hasRequiredCallBindApplyHelpers; +function requireCallBindApplyHelpers() { + if (hasRequiredCallBindApplyHelpers) return callBindApplyHelpers; + hasRequiredCallBindApplyHelpers = 1; + var bind = requireFunctionBind(); + var $TypeError = /* @__PURE__ */ requireType(); + var $call = requireFunctionCall(); + var $actualApply = requireActualApply(); + callBindApplyHelpers = function callBindBasic(args) { + if (args.length < 1 || typeof args[0] !== "function") { + throw new $TypeError("a function is required"); + } + return $actualApply(bind, $call, args); + }; + return callBindApplyHelpers; +} +var get; +var hasRequiredGet; +function requireGet() { + if (hasRequiredGet) return get; + hasRequiredGet = 1; + var callBind2 = requireCallBindApplyHelpers(); + var gOPD2 = /* @__PURE__ */ requireGopd(); + var hasProtoAccessor; + try { + hasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ + [].__proto__ === Array.prototype; + } catch (e) { + if (!e || typeof e !== "object" || !("code" in e) || e.code !== "ERR_PROTO_ACCESS") { + throw e; + } + } + var desc = !!hasProtoAccessor && gOPD2 && gOPD2( + Object.prototype, + /** @type {keyof typeof Object.prototype} */ + "__proto__" + ); + var $Object = Object; + var $getPrototypeOf = $Object.getPrototypeOf; + get = desc && typeof desc.get === "function" ? callBind2([desc.get]) : typeof $getPrototypeOf === "function" ? ( + /** @type {import('./get')} */ + function getDunder(value) { + return $getPrototypeOf(value == null ? value : $Object(value)); + } + ) : false; + return get; +} +var getProto; +var hasRequiredGetProto; +function requireGetProto() { + if (hasRequiredGetProto) return getProto; + hasRequiredGetProto = 1; + var reflectGetProto = requireReflect_getPrototypeOf(); + var originalGetProto = requireObject_getPrototypeOf(); + var getDunderProto = /* @__PURE__ */ requireGet(); + getProto = reflectGetProto ? function getProto2(O) { + return reflectGetProto(O); + } : originalGetProto ? function getProto2(O) { + if (!O || typeof O !== "object" && typeof O !== "function") { + throw new TypeError("getProto: not an object"); + } + return originalGetProto(O); + } : getDunderProto ? function getProto2(O) { + return getDunderProto(O); + } : null; + return getProto; +} +var hasown; +var hasRequiredHasown; +function requireHasown() { + if (hasRequiredHasown) return hasown; + hasRequiredHasown = 1; + var call = Function.prototype.call; + var $hasOwn = Object.prototype.hasOwnProperty; + var bind = requireFunctionBind(); + hasown = bind.call(call, $hasOwn); + return hasown; +} +var getIntrinsic; +var hasRequiredGetIntrinsic; +function requireGetIntrinsic() { + if (hasRequiredGetIntrinsic) return getIntrinsic; + hasRequiredGetIntrinsic = 1; + var undefined$1; + var $Object = /* @__PURE__ */ requireEsObjectAtoms(); + var $Error = /* @__PURE__ */ requireEsErrors(); + var $EvalError = /* @__PURE__ */ require_eval(); + var $RangeError = /* @__PURE__ */ requireRange(); + var $ReferenceError = /* @__PURE__ */ requireRef(); + var $SyntaxError = /* @__PURE__ */ requireSyntax(); + var $TypeError = /* @__PURE__ */ requireType(); + var $URIError = /* @__PURE__ */ requireUri(); + var abs2 = /* @__PURE__ */ requireAbs(); + var floor2 = /* @__PURE__ */ requireFloor(); + var max2 = /* @__PURE__ */ requireMax(); + var min2 = /* @__PURE__ */ requireMin(); + var pow2 = /* @__PURE__ */ requirePow(); + var round2 = /* @__PURE__ */ requireRound(); + var sign2 = /* @__PURE__ */ requireSign$1(); + var $Function = Function; + var getEvalledConstructor = function(expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")(); + } catch (e) { + } + }; + var $gOPD = /* @__PURE__ */ requireGopd(); + var $defineProperty = /* @__PURE__ */ requireEsDefineProperty(); + var throwTypeError = function() { + throw new $TypeError(); + }; + var ThrowTypeError = $gOPD ? function() { + try { + arguments.callee; + return throwTypeError; + } catch (calleeThrows) { + try { + return $gOPD(arguments, "callee").get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }() : throwTypeError; + var hasSymbols2 = requireHasSymbols()(); + var getProto2 = requireGetProto(); + var $ObjectGPO = requireObject_getPrototypeOf(); + var $ReflectGPO = requireReflect_getPrototypeOf(); + var $apply = requireFunctionApply(); + var $call = requireFunctionCall(); + var needsEval = {}; + var TypedArray = typeof Uint8Array === "undefined" || !getProto2 ? undefined$1 : getProto2(Uint8Array); + var INTRINSICS = { + __proto__: null, + "%AggregateError%": typeof AggregateError === "undefined" ? undefined$1 : AggregateError, + "%Array%": Array, + "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined$1 : ArrayBuffer, + "%ArrayIteratorPrototype%": hasSymbols2 && getProto2 ? getProto2([][Symbol.iterator]()) : undefined$1, + "%AsyncFromSyncIteratorPrototype%": undefined$1, + "%AsyncFunction%": needsEval, + "%AsyncGenerator%": needsEval, + "%AsyncGeneratorFunction%": needsEval, + "%AsyncIteratorPrototype%": needsEval, + "%Atomics%": typeof Atomics === "undefined" ? undefined$1 : Atomics, + "%BigInt%": typeof BigInt === "undefined" ? undefined$1 : BigInt, + "%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined$1 : BigInt64Array, + "%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined$1 : BigUint64Array, + "%Boolean%": Boolean, + "%DataView%": typeof DataView === "undefined" ? undefined$1 : DataView, + "%Date%": Date, + "%decodeURI%": decodeURI, + "%decodeURIComponent%": decodeURIComponent, + "%encodeURI%": encodeURI, + "%encodeURIComponent%": encodeURIComponent, + "%Error%": $Error, + "%eval%": eval, + // eslint-disable-line no-eval + "%EvalError%": $EvalError, + "%Float16Array%": typeof Float16Array === "undefined" ? undefined$1 : Float16Array, + "%Float32Array%": typeof Float32Array === "undefined" ? undefined$1 : Float32Array, + "%Float64Array%": typeof Float64Array === "undefined" ? undefined$1 : Float64Array, + "%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined$1 : FinalizationRegistry, + "%Function%": $Function, + "%GeneratorFunction%": needsEval, + "%Int8Array%": typeof Int8Array === "undefined" ? undefined$1 : Int8Array, + "%Int16Array%": typeof Int16Array === "undefined" ? undefined$1 : Int16Array, + "%Int32Array%": typeof Int32Array === "undefined" ? undefined$1 : Int32Array, + "%isFinite%": isFinite, + "%isNaN%": isNaN, + "%IteratorPrototype%": hasSymbols2 && getProto2 ? getProto2(getProto2([][Symbol.iterator]())) : undefined$1, + "%JSON%": typeof JSON === "object" ? JSON : undefined$1, + "%Map%": typeof Map === "undefined" ? undefined$1 : Map, + "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols2 || !getProto2 ? undefined$1 : getProto2((/* @__PURE__ */ new Map())[Symbol.iterator]()), + "%Math%": Math, + "%Number%": Number, + "%Object%": $Object, + "%Object.getOwnPropertyDescriptor%": $gOPD, + "%parseFloat%": parseFloat, + "%parseInt%": parseInt, + "%Promise%": typeof Promise === "undefined" ? undefined$1 : Promise, + "%Proxy%": typeof Proxy === "undefined" ? undefined$1 : Proxy, + "%RangeError%": $RangeError, + "%ReferenceError%": $ReferenceError, + "%Reflect%": typeof Reflect === "undefined" ? undefined$1 : Reflect, + "%RegExp%": RegExp, + "%Set%": typeof Set === "undefined" ? undefined$1 : Set, + "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols2 || !getProto2 ? undefined$1 : getProto2((/* @__PURE__ */ new Set())[Symbol.iterator]()), + "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined$1 : SharedArrayBuffer, + "%String%": String, + "%StringIteratorPrototype%": hasSymbols2 && getProto2 ? getProto2(""[Symbol.iterator]()) : undefined$1, + "%Symbol%": hasSymbols2 ? Symbol : undefined$1, + "%SyntaxError%": $SyntaxError, + "%ThrowTypeError%": ThrowTypeError, + "%TypedArray%": TypedArray, + "%TypeError%": $TypeError, + "%Uint8Array%": typeof Uint8Array === "undefined" ? undefined$1 : Uint8Array, + "%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined$1 : Uint8ClampedArray, + "%Uint16Array%": typeof Uint16Array === "undefined" ? undefined$1 : Uint16Array, + "%Uint32Array%": typeof Uint32Array === "undefined" ? undefined$1 : Uint32Array, + "%URIError%": $URIError, + "%WeakMap%": typeof WeakMap === "undefined" ? undefined$1 : WeakMap, + "%WeakRef%": typeof WeakRef === "undefined" ? undefined$1 : WeakRef, + "%WeakSet%": typeof WeakSet === "undefined" ? undefined$1 : WeakSet, + "%Function.prototype.call%": $call, + "%Function.prototype.apply%": $apply, + "%Object.defineProperty%": $defineProperty, + "%Object.getPrototypeOf%": $ObjectGPO, + "%Math.abs%": abs2, + "%Math.floor%": floor2, + "%Math.max%": max2, + "%Math.min%": min2, + "%Math.pow%": pow2, + "%Math.round%": round2, + "%Math.sign%": sign2, + "%Reflect.getPrototypeOf%": $ReflectGPO + }; + if (getProto2) { + try { + null.error; + } catch (e) { + var errorProto = getProto2(getProto2(e)); + INTRINSICS["%Error.prototype%"] = errorProto; + } + } + var doEval = function doEval2(name) { + var value; + if (name === "%AsyncFunction%") { + value = getEvalledConstructor("async function () {}"); + } else if (name === "%GeneratorFunction%") { + value = getEvalledConstructor("function* () {}"); + } else if (name === "%AsyncGeneratorFunction%") { + value = getEvalledConstructor("async function* () {}"); + } else if (name === "%AsyncGenerator%") { + var fn = doEval2("%AsyncGeneratorFunction%"); + if (fn) { + value = fn.prototype; + } + } else if (name === "%AsyncIteratorPrototype%") { + var gen = doEval2("%AsyncGenerator%"); + if (gen && getProto2) { + value = getProto2(gen.prototype); + } + } + INTRINSICS[name] = value; + return value; + }; + var LEGACY_ALIASES = { + __proto__: null, + "%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"], + "%ArrayPrototype%": ["Array", "prototype"], + "%ArrayProto_entries%": ["Array", "prototype", "entries"], + "%ArrayProto_forEach%": ["Array", "prototype", "forEach"], + "%ArrayProto_keys%": ["Array", "prototype", "keys"], + "%ArrayProto_values%": ["Array", "prototype", "values"], + "%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"], + "%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"], + "%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"], + "%BooleanPrototype%": ["Boolean", "prototype"], + "%DataViewPrototype%": ["DataView", "prototype"], + "%DatePrototype%": ["Date", "prototype"], + "%ErrorPrototype%": ["Error", "prototype"], + "%EvalErrorPrototype%": ["EvalError", "prototype"], + "%Float32ArrayPrototype%": ["Float32Array", "prototype"], + "%Float64ArrayPrototype%": ["Float64Array", "prototype"], + "%FunctionPrototype%": ["Function", "prototype"], + "%Generator%": ["GeneratorFunction", "prototype"], + "%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"], + "%Int8ArrayPrototype%": ["Int8Array", "prototype"], + "%Int16ArrayPrototype%": ["Int16Array", "prototype"], + "%Int32ArrayPrototype%": ["Int32Array", "prototype"], + "%JSONParse%": ["JSON", "parse"], + "%JSONStringify%": ["JSON", "stringify"], + "%MapPrototype%": ["Map", "prototype"], + "%NumberPrototype%": ["Number", "prototype"], + "%ObjectPrototype%": ["Object", "prototype"], + "%ObjProto_toString%": ["Object", "prototype", "toString"], + "%ObjProto_valueOf%": ["Object", "prototype", "valueOf"], + "%PromisePrototype%": ["Promise", "prototype"], + "%PromiseProto_then%": ["Promise", "prototype", "then"], + "%Promise_all%": ["Promise", "all"], + "%Promise_reject%": ["Promise", "reject"], + "%Promise_resolve%": ["Promise", "resolve"], + "%RangeErrorPrototype%": ["RangeError", "prototype"], + "%ReferenceErrorPrototype%": ["ReferenceError", "prototype"], + "%RegExpPrototype%": ["RegExp", "prototype"], + "%SetPrototype%": ["Set", "prototype"], + "%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"], + "%StringPrototype%": ["String", "prototype"], + "%SymbolPrototype%": ["Symbol", "prototype"], + "%SyntaxErrorPrototype%": ["SyntaxError", "prototype"], + "%TypedArrayPrototype%": ["TypedArray", "prototype"], + "%TypeErrorPrototype%": ["TypeError", "prototype"], + "%Uint8ArrayPrototype%": ["Uint8Array", "prototype"], + "%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"], + "%Uint16ArrayPrototype%": ["Uint16Array", "prototype"], + "%Uint32ArrayPrototype%": ["Uint32Array", "prototype"], + "%URIErrorPrototype%": ["URIError", "prototype"], + "%WeakMapPrototype%": ["WeakMap", "prototype"], + "%WeakSetPrototype%": ["WeakSet", "prototype"] + }; + var bind = requireFunctionBind(); + var hasOwn2 = /* @__PURE__ */ requireHasown(); + var $concat = bind.call($call, Array.prototype.concat); + var $spliceApply = bind.call($apply, Array.prototype.splice); + var $replace = bind.call($call, String.prototype.replace); + var $strSlice = bind.call($call, String.prototype.slice); + var $exec = bind.call($call, RegExp.prototype.exec); + var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; + var reEscapeChar = /\\(\\)?/g; + var stringToPath = function stringToPath2(string2) { + var first = $strSlice(string2, 0, 1); + var last = $strSlice(string2, -1); + if (first === "%" && last !== "%") { + throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`"); + } else if (last === "%" && first !== "%") { + throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`"); + } + var result = []; + $replace(string2, rePropName, function(match, number, quote2, subString) { + result[result.length] = quote2 ? $replace(subString, reEscapeChar, "$1") : number || match; + }); + return result; + }; + var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn2(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = "%" + alias[0] + "%"; + } + if (hasOwn2(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === "undefined" && !allowMissing) { + throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!"); + } + return { + alias, + name: intrinsicName, + value + }; + } + throw new $SyntaxError("intrinsic " + name + " does not exist!"); + }; + getIntrinsic = function GetIntrinsic(name, allowMissing) { + if (typeof name !== "string" || name.length === 0) { + throw new $TypeError("intrinsic name must be a non-empty string"); + } + if (arguments.length > 1 && typeof allowMissing !== "boolean") { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + if ($exec(/^%?[^%]*%?$/, name) === null) { + throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name"); + } + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ""; + var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ((first === '"' || first === "'" || first === "`" || (last === '"' || last === "'" || last === "`")) && first !== last) { + throw new $SyntaxError("property names with quotes must have matching quotes"); + } + if (part === "constructor" || !isOwn) { + skipFurtherCaching = true; + } + intrinsicBaseName += "." + part; + intrinsicRealName = "%" + intrinsicBaseName + "%"; + if (hasOwn2(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available."); + } + return void 0; + } + if ($gOPD && i + 1 >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + if (isOwn && "get" in desc && !("originalValue" in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn2(value, part); + value = value[part]; + } + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; + }; + return getIntrinsic; +} +var callBind = { exports: {} }; +var defineDataProperty; +var hasRequiredDefineDataProperty; +function requireDefineDataProperty() { + if (hasRequiredDefineDataProperty) return defineDataProperty; + hasRequiredDefineDataProperty = 1; + var $defineProperty = /* @__PURE__ */ requireEsDefineProperty(); + var $SyntaxError = /* @__PURE__ */ requireSyntax(); + var $TypeError = /* @__PURE__ */ requireType(); + var gopd2 = /* @__PURE__ */ requireGopd(); + defineDataProperty = function defineDataProperty2(obj, property, value) { + if (!obj || typeof obj !== "object" && typeof obj !== "function") { + throw new $TypeError("`obj` must be an object or a function`"); + } + if (typeof property !== "string" && typeof property !== "symbol") { + throw new $TypeError("`property` must be a string or a symbol`"); + } + if (arguments.length > 3 && typeof arguments[3] !== "boolean" && arguments[3] !== null) { + throw new $TypeError("`nonEnumerable`, if provided, must be a boolean or null"); + } + if (arguments.length > 4 && typeof arguments[4] !== "boolean" && arguments[4] !== null) { + throw new $TypeError("`nonWritable`, if provided, must be a boolean or null"); + } + if (arguments.length > 5 && typeof arguments[5] !== "boolean" && arguments[5] !== null) { + throw new $TypeError("`nonConfigurable`, if provided, must be a boolean or null"); + } + if (arguments.length > 6 && typeof arguments[6] !== "boolean") { + throw new $TypeError("`loose`, if provided, must be a boolean"); + } + var nonEnumerable = arguments.length > 3 ? arguments[3] : null; + var nonWritable = arguments.length > 4 ? arguments[4] : null; + var nonConfigurable = arguments.length > 5 ? arguments[5] : null; + var loose = arguments.length > 6 ? arguments[6] : false; + var desc = !!gopd2 && gopd2(obj, property); + if ($defineProperty) { + $defineProperty(obj, property, { + configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable, + enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable, + value, + writable: nonWritable === null && desc ? desc.writable : !nonWritable + }); + } else if (loose || !nonEnumerable && !nonWritable && !nonConfigurable) { + obj[property] = value; + } else { + throw new $SyntaxError("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable."); + } + }; + return defineDataProperty; +} +var hasPropertyDescriptors_1; +var hasRequiredHasPropertyDescriptors; +function requireHasPropertyDescriptors() { + if (hasRequiredHasPropertyDescriptors) return hasPropertyDescriptors_1; + hasRequiredHasPropertyDescriptors = 1; + var $defineProperty = /* @__PURE__ */ requireEsDefineProperty(); + var hasPropertyDescriptors = function hasPropertyDescriptors2() { + return !!$defineProperty; + }; + hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { + if (!$defineProperty) { + return null; + } + try { + return $defineProperty([], "length", { value: 1 }).length !== 1; + } catch (e) { + return true; + } + }; + hasPropertyDescriptors_1 = hasPropertyDescriptors; + return hasPropertyDescriptors_1; +} +var setFunctionLength; +var hasRequiredSetFunctionLength; +function requireSetFunctionLength() { + if (hasRequiredSetFunctionLength) return setFunctionLength; + hasRequiredSetFunctionLength = 1; + var GetIntrinsic = /* @__PURE__ */ requireGetIntrinsic(); + var define = /* @__PURE__ */ requireDefineDataProperty(); + var hasDescriptors = /* @__PURE__ */ requireHasPropertyDescriptors()(); + var gOPD2 = /* @__PURE__ */ requireGopd(); + var $TypeError = /* @__PURE__ */ requireType(); + var $floor = GetIntrinsic("%Math.floor%"); + setFunctionLength = function setFunctionLength2(fn, length) { + if (typeof fn !== "function") { + throw new $TypeError("`fn` is not a function"); + } + if (typeof length !== "number" || length < 0 || length > 4294967295 || $floor(length) !== length) { + throw new $TypeError("`length` must be a positive 32-bit integer"); + } + var loose = arguments.length > 2 && !!arguments[2]; + var functionLengthIsConfigurable = true; + var functionLengthIsWritable = true; + if ("length" in fn && gOPD2) { + var desc = gOPD2(fn, "length"); + if (desc && !desc.configurable) { + functionLengthIsConfigurable = false; + } + if (desc && !desc.writable) { + functionLengthIsWritable = false; + } + } + if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) { + if (hasDescriptors) { + define( + /** @type {Parameters[0]} */ + fn, + "length", + length, + true, + true + ); + } else { + define( + /** @type {Parameters[0]} */ + fn, + "length", + length + ); + } + } + return fn; + }; + return setFunctionLength; +} +var applyBind; +var hasRequiredApplyBind; +function requireApplyBind() { + if (hasRequiredApplyBind) return applyBind; + hasRequiredApplyBind = 1; + var bind = requireFunctionBind(); + var $apply = requireFunctionApply(); + var actualApply2 = requireActualApply(); + applyBind = function applyBind2() { + return actualApply2(bind, $apply, arguments); + }; + return applyBind; +} +var hasRequiredCallBind; +function requireCallBind() { + if (hasRequiredCallBind) return callBind.exports; + hasRequiredCallBind = 1; + (function(module) { + var setFunctionLength2 = /* @__PURE__ */ requireSetFunctionLength(); + var $defineProperty = /* @__PURE__ */ requireEsDefineProperty(); + var callBindBasic = requireCallBindApplyHelpers(); + var applyBind2 = requireApplyBind(); + module.exports = function callBind2(originalFunction) { + var func = callBindBasic(arguments); + var adjustedLength = originalFunction.length - (arguments.length - 1); + return setFunctionLength2( + func, + 1 + (adjustedLength > 0 ? adjustedLength : 0), + true + ); + }; + if ($defineProperty) { + $defineProperty(module.exports, "apply", { value: applyBind2 }); + } else { + module.exports.apply = applyBind2; + } + })(callBind); + return callBind.exports; +} +var callBound$1; +var hasRequiredCallBound$1; +function requireCallBound$1() { + if (hasRequiredCallBound$1) return callBound$1; + hasRequiredCallBound$1 = 1; + var GetIntrinsic = /* @__PURE__ */ requireGetIntrinsic(); + var callBind2 = requireCallBind(); + var $indexOf = callBind2(GetIntrinsic("String.prototype.indexOf")); + callBound$1 = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) { + return callBind2(intrinsic); + } + return intrinsic; + }; + return callBound$1; +} +var isArguments$1; +var hasRequiredIsArguments$1; +function requireIsArguments$1() { + if (hasRequiredIsArguments$1) return isArguments$1; + hasRequiredIsArguments$1 = 1; + var hasToStringTag = requireShams()(); + var callBound2 = requireCallBound$1(); + var $toString = callBound2("Object.prototype.toString"); + var isStandardArguments = function isArguments2(value) { + if (hasToStringTag && value && typeof value === "object" && Symbol.toStringTag in value) { + return false; + } + return $toString(value) === "[object Arguments]"; + }; + var isLegacyArguments = function isArguments2(value) { + if (isStandardArguments(value)) { + return true; + } + return value !== null && typeof value === "object" && typeof value.length === "number" && value.length >= 0 && $toString(value) !== "[object Array]" && $toString(value.callee) === "[object Function]"; + }; + var supportsStandardArguments = function() { + return isStandardArguments(arguments); + }(); + isStandardArguments.isLegacyArguments = isLegacyArguments; + isArguments$1 = supportsStandardArguments ? isStandardArguments : isLegacyArguments; + return isArguments$1; +} +var isGeneratorFunction; +var hasRequiredIsGeneratorFunction; +function requireIsGeneratorFunction() { + if (hasRequiredIsGeneratorFunction) return isGeneratorFunction; + hasRequiredIsGeneratorFunction = 1; + var toStr = Object.prototype.toString; + var fnToStr = Function.prototype.toString; + var isFnRegex = /^\s*(?:function)?\*/; + var hasToStringTag = requireShams()(); + var getProto2 = Object.getPrototypeOf; + var getGeneratorFunc = function() { + if (!hasToStringTag) { + return false; + } + try { + return Function("return function*() {}")(); + } catch (e) { + } + }; + var GeneratorFunction; + isGeneratorFunction = function isGeneratorFunction2(fn) { + if (typeof fn !== "function") { + return false; + } + if (isFnRegex.test(fnToStr.call(fn))) { + return true; + } + if (!hasToStringTag) { + var str = toStr.call(fn); + return str === "[object GeneratorFunction]"; + } + if (!getProto2) { + return false; + } + if (typeof GeneratorFunction === "undefined") { + var generatorFunc = getGeneratorFunc(); + GeneratorFunction = generatorFunc ? getProto2(generatorFunc) : false; + } + return getProto2(fn) === GeneratorFunction; + }; + return isGeneratorFunction; +} +var isCallable; +var hasRequiredIsCallable; +function requireIsCallable() { + if (hasRequiredIsCallable) return isCallable; + hasRequiredIsCallable = 1; + var fnToStr = Function.prototype.toString; + var reflectApply2 = typeof Reflect === "object" && Reflect !== null && Reflect.apply; + var badArrayLike; + var isCallableMarker; + if (typeof reflectApply2 === "function" && typeof Object.defineProperty === "function") { + try { + badArrayLike = Object.defineProperty({}, "length", { + get: function() { + throw isCallableMarker; + } + }); + isCallableMarker = {}; + reflectApply2(function() { + throw 42; + }, null, badArrayLike); + } catch (_) { + if (_ !== isCallableMarker) { + reflectApply2 = null; + } + } + } else { + reflectApply2 = null; + } + var constructorRegex = /^\s*class\b/; + var isES6ClassFn = function isES6ClassFunction(value) { + try { + var fnStr = fnToStr.call(value); + return constructorRegex.test(fnStr); + } catch (e) { + return false; + } + }; + var tryFunctionObject = function tryFunctionToStr(value) { + try { + if (isES6ClassFn(value)) { + return false; + } + fnToStr.call(value); + return true; + } catch (e) { + return false; + } + }; + var toStr = Object.prototype.toString; + var objectClass = "[object Object]"; + var fnClass = "[object Function]"; + var genClass = "[object GeneratorFunction]"; + var ddaClass = "[object HTMLAllCollection]"; + var ddaClass2 = "[object HTML document.all class]"; + var ddaClass3 = "[object HTMLCollection]"; + var hasToStringTag = typeof Symbol === "function" && !!Symbol.toStringTag; + var isIE68 = !(0 in [,]); + var isDDA = function isDocumentDotAll() { + return false; + }; + if (typeof document === "object") { + var all = document.all; + if (toStr.call(all) === toStr.call(document.all)) { + isDDA = function isDocumentDotAll(value) { + if ((isIE68 || !value) && (typeof value === "undefined" || typeof value === "object")) { + try { + var str = toStr.call(value); + return (str === ddaClass || str === ddaClass2 || str === ddaClass3 || str === objectClass) && value("") == null; + } catch (e) { + } + } + return false; + }; + } + } + isCallable = reflectApply2 ? function isCallable2(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + try { + reflectApply2(value, null, badArrayLike); + } catch (e) { + if (e !== isCallableMarker) { + return false; + } + } + return !isES6ClassFn(value) && tryFunctionObject(value); + } : function isCallable2(value) { + if (isDDA(value)) { + return true; + } + if (!value) { + return false; + } + if (typeof value !== "function" && typeof value !== "object") { + return false; + } + if (hasToStringTag) { + return tryFunctionObject(value); + } + if (isES6ClassFn(value)) { + return false; + } + var strClass = toStr.call(value); + if (strClass !== fnClass && strClass !== genClass && !/^\[object HTML/.test(strClass)) { + return false; + } + return tryFunctionObject(value); + }; + return isCallable; +} +var forEach_1; +var hasRequiredForEach; +function requireForEach() { + if (hasRequiredForEach) return forEach_1; + hasRequiredForEach = 1; + var isCallable2 = requireIsCallable(); + var toStr = Object.prototype.toString; + var hasOwnProperty2 = Object.prototype.hasOwnProperty; + var forEachArray = function forEachArray2(array, iterator, receiver) { + for (var i = 0, len = array.length; i < len; i++) { + if (hasOwnProperty2.call(array, i)) { + if (receiver == null) { + iterator(array[i], i, array); + } else { + iterator.call(receiver, array[i], i, array); + } + } + } + }; + var forEachString = function forEachString2(string2, iterator, receiver) { + for (var i = 0, len = string2.length; i < len; i++) { + if (receiver == null) { + iterator(string2.charAt(i), i, string2); + } else { + iterator.call(receiver, string2.charAt(i), i, string2); + } + } + }; + var forEachObject = function forEachObject2(object, iterator, receiver) { + for (var k in object) { + if (hasOwnProperty2.call(object, k)) { + if (receiver == null) { + iterator(object[k], k, object); + } else { + iterator.call(receiver, object[k], k, object); + } + } + } + }; + var forEach = function forEach2(list, iterator, thisArg) { + if (!isCallable2(iterator)) { + throw new TypeError("iterator must be a function"); + } + var receiver; + if (arguments.length >= 3) { + receiver = thisArg; + } + if (toStr.call(list) === "[object Array]") { + forEachArray(list, iterator, receiver); + } else if (typeof list === "string") { + forEachString(list, iterator, receiver); + } else { + forEachObject(list, iterator, receiver); + } + }; + forEach_1 = forEach; + return forEach_1; +} +var possibleTypedArrayNames; +var hasRequiredPossibleTypedArrayNames; +function requirePossibleTypedArrayNames() { + if (hasRequiredPossibleTypedArrayNames) return possibleTypedArrayNames; + hasRequiredPossibleTypedArrayNames = 1; + possibleTypedArrayNames = [ + "Float32Array", + "Float64Array", + "Int8Array", + "Int16Array", + "Int32Array", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "BigInt64Array", + "BigUint64Array" + ]; + return possibleTypedArrayNames; +} +var availableTypedArrays; +var hasRequiredAvailableTypedArrays; +function requireAvailableTypedArrays() { + if (hasRequiredAvailableTypedArrays) return availableTypedArrays; + hasRequiredAvailableTypedArrays = 1; + var possibleNames = /* @__PURE__ */ requirePossibleTypedArrayNames(); + var g = typeof globalThis === "undefined" ? commonjsGlobal : globalThis; + availableTypedArrays = function availableTypedArrays2() { + var out = []; + for (var i = 0; i < possibleNames.length; i++) { + if (typeof g[possibleNames[i]] === "function") { + out[out.length] = possibleNames[i]; + } + } + return out; + }; + return availableTypedArrays; +} +var callBound; +var hasRequiredCallBound; +function requireCallBound() { + if (hasRequiredCallBound) return callBound; + hasRequiredCallBound = 1; + var GetIntrinsic = /* @__PURE__ */ requireGetIntrinsic(); + var callBindBasic = requireCallBindApplyHelpers(); + var $indexOf = callBindBasic([GetIntrinsic("%String.prototype.indexOf%")]); + callBound = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = ( + /** @type {Parameters[0][0]} */ + GetIntrinsic(name, !!allowMissing) + ); + if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) { + return callBindBasic([intrinsic]); + } + return intrinsic; + }; + return callBound; +} +var whichTypedArray; +var hasRequiredWhichTypedArray; +function requireWhichTypedArray() { + if (hasRequiredWhichTypedArray) return whichTypedArray; + hasRequiredWhichTypedArray = 1; + var forEach = requireForEach(); + var availableTypedArrays2 = /* @__PURE__ */ requireAvailableTypedArrays(); + var callBind2 = requireCallBind(); + var callBound2 = /* @__PURE__ */ requireCallBound(); + var gOPD2 = /* @__PURE__ */ requireGopd(); + var $toString = callBound2("Object.prototype.toString"); + var hasToStringTag = requireShams()(); + var g = typeof globalThis === "undefined" ? commonjsGlobal : globalThis; + var typedArrays = availableTypedArrays2(); + var $slice = callBound2("String.prototype.slice"); + var getPrototypeOf = Object.getPrototypeOf; + var $indexOf = callBound2("Array.prototype.indexOf", true) || function indexOf(array, value) { + for (var i = 0; i < array.length; i += 1) { + if (array[i] === value) { + return i; + } + } + return -1; + }; + var cache = { __proto__: null }; + if (hasToStringTag && gOPD2 && getPrototypeOf) { + forEach(typedArrays, function(typedArray) { + var arr = new g[typedArray](); + if (Symbol.toStringTag in arr) { + var proto = getPrototypeOf(arr); + var descriptor = gOPD2(proto, Symbol.toStringTag); + if (!descriptor) { + var superProto = getPrototypeOf(proto); + descriptor = gOPD2(superProto, Symbol.toStringTag); + } + cache["$" + typedArray] = callBind2(descriptor.get); + } + }); + } else { + forEach(typedArrays, function(typedArray) { + var arr = new g[typedArray](); + var fn = arr.slice || arr.set; + if (fn) { + cache["$" + typedArray] = callBind2(fn); + } + }); + } + var tryTypedArrays = function tryAllTypedArrays(value) { + var found = false; + forEach( + // eslint-disable-next-line no-extra-parens + /** @type {Record<`\$${TypedArrayName}`, Getter>} */ + /** @type {any} */ + cache, + /** @type {(getter: Getter, name: `\$${import('.').TypedArrayName}`) => void} */ + function(getter, typedArray) { + if (!found) { + try { + if ("$" + getter(value) === typedArray) { + found = $slice(typedArray, 1); + } + } catch (e) { + } + } + } + ); + return found; + }; + var trySlices = function tryAllSlices(value) { + var found = false; + forEach( + // eslint-disable-next-line no-extra-parens + /** @type {Record<`\$${TypedArrayName}`, Getter>} */ + /** @type {any} */ + cache, + /** @type {(getter: typeof cache, name: `\$${import('.').TypedArrayName}`) => void} */ + function(getter, name) { + if (!found) { + try { + getter(value); + found = $slice(name, 1); + } catch (e) { + } + } + } + ); + return found; + }; + whichTypedArray = function whichTypedArray2(value) { + if (!value || typeof value !== "object") { + return false; + } + if (!hasToStringTag) { + var tag = $slice($toString(value), 8, -1); + if ($indexOf(typedArrays, tag) > -1) { + return tag; + } + if (tag !== "Object") { + return false; + } + return trySlices(value); + } + if (!gOPD2) { + return null; + } + return tryTypedArrays(value); + }; + return whichTypedArray; +} +var isTypedArray$1; +var hasRequiredIsTypedArray; +function requireIsTypedArray() { + if (hasRequiredIsTypedArray) return isTypedArray$1; + hasRequiredIsTypedArray = 1; + var whichTypedArray2 = /* @__PURE__ */ requireWhichTypedArray(); + isTypedArray$1 = function isTypedArray2(value) { + return !!whichTypedArray2(value); + }; + return isTypedArray$1; +} +var hasRequiredTypes; +function requireTypes() { + if (hasRequiredTypes) return types$3; + hasRequiredTypes = 1; + (function(exports) { + var isArgumentsObject = requireIsArguments$1(); + var isGeneratorFunction2 = requireIsGeneratorFunction(); + var whichTypedArray2 = /* @__PURE__ */ requireWhichTypedArray(); + var isTypedArray2 = /* @__PURE__ */ requireIsTypedArray(); + function uncurryThis(f) { + return f.call.bind(f); + } + var BigIntSupported = typeof BigInt !== "undefined"; + var SymbolSupported = typeof Symbol !== "undefined"; + var ObjectToString = uncurryThis(Object.prototype.toString); + var numberValue = uncurryThis(Number.prototype.valueOf); + var stringValue = uncurryThis(String.prototype.valueOf); + var booleanValue = uncurryThis(Boolean.prototype.valueOf); + if (BigIntSupported) { + var bigIntValue = uncurryThis(BigInt.prototype.valueOf); + } + if (SymbolSupported) { + var symbolValue = uncurryThis(Symbol.prototype.valueOf); + } + function checkBoxedPrimitive(value, prototypeValueOf) { + if (typeof value !== "object") { + return false; + } + try { + prototypeValueOf(value); + return true; + } catch (e) { + return false; + } + } + exports.isArgumentsObject = isArgumentsObject; + exports.isGeneratorFunction = isGeneratorFunction2; + exports.isTypedArray = isTypedArray2; + function isPromise(input) { + return typeof Promise !== "undefined" && input instanceof Promise || input !== null && typeof input === "object" && typeof input.then === "function" && typeof input.catch === "function"; + } + exports.isPromise = isPromise; + function isArrayBufferView(value) { + if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) { + return ArrayBuffer.isView(value); + } + return isTypedArray2(value) || isDataView(value); + } + exports.isArrayBufferView = isArrayBufferView; + function isUint8Array(value) { + return whichTypedArray2(value) === "Uint8Array"; + } + exports.isUint8Array = isUint8Array; + function isUint8ClampedArray(value) { + return whichTypedArray2(value) === "Uint8ClampedArray"; + } + exports.isUint8ClampedArray = isUint8ClampedArray; + function isUint16Array(value) { + return whichTypedArray2(value) === "Uint16Array"; + } + exports.isUint16Array = isUint16Array; + function isUint32Array(value) { + return whichTypedArray2(value) === "Uint32Array"; + } + exports.isUint32Array = isUint32Array; + function isInt8Array(value) { + return whichTypedArray2(value) === "Int8Array"; + } + exports.isInt8Array = isInt8Array; + function isInt16Array(value) { + return whichTypedArray2(value) === "Int16Array"; + } + exports.isInt16Array = isInt16Array; + function isInt32Array(value) { + return whichTypedArray2(value) === "Int32Array"; + } + exports.isInt32Array = isInt32Array; + function isFloat32Array(value) { + return whichTypedArray2(value) === "Float32Array"; + } + exports.isFloat32Array = isFloat32Array; + function isFloat64Array(value) { + return whichTypedArray2(value) === "Float64Array"; + } + exports.isFloat64Array = isFloat64Array; + function isBigInt64Array(value) { + return whichTypedArray2(value) === "BigInt64Array"; + } + exports.isBigInt64Array = isBigInt64Array; + function isBigUint64Array(value) { + return whichTypedArray2(value) === "BigUint64Array"; + } + exports.isBigUint64Array = isBigUint64Array; + function isMapToString(value) { + return ObjectToString(value) === "[object Map]"; + } + isMapToString.working = typeof Map !== "undefined" && isMapToString(/* @__PURE__ */ new Map()); + function isMap2(value) { + if (typeof Map === "undefined") { + return false; + } + return isMapToString.working ? isMapToString(value) : value instanceof Map; + } + exports.isMap = isMap2; + function isSetToString(value) { + return ObjectToString(value) === "[object Set]"; + } + isSetToString.working = typeof Set !== "undefined" && isSetToString(/* @__PURE__ */ new Set()); + function isSet(value) { + if (typeof Set === "undefined") { + return false; + } + return isSetToString.working ? isSetToString(value) : value instanceof Set; + } + exports.isSet = isSet; + function isWeakMapToString(value) { + return ObjectToString(value) === "[object WeakMap]"; + } + isWeakMapToString.working = typeof WeakMap !== "undefined" && isWeakMapToString(/* @__PURE__ */ new WeakMap()); + function isWeakMap(value) { + if (typeof WeakMap === "undefined") { + return false; + } + return isWeakMapToString.working ? isWeakMapToString(value) : value instanceof WeakMap; + } + exports.isWeakMap = isWeakMap; + function isWeakSetToString(value) { + return ObjectToString(value) === "[object WeakSet]"; + } + isWeakSetToString.working = typeof WeakSet !== "undefined" && isWeakSetToString(/* @__PURE__ */ new WeakSet()); + function isWeakSet(value) { + return isWeakSetToString(value); + } + exports.isWeakSet = isWeakSet; + function isArrayBufferToString(value) { + return ObjectToString(value) === "[object ArrayBuffer]"; + } + isArrayBufferToString.working = typeof ArrayBuffer !== "undefined" && isArrayBufferToString(new ArrayBuffer()); + function isArrayBuffer(value) { + if (typeof ArrayBuffer === "undefined") { + return false; + } + return isArrayBufferToString.working ? isArrayBufferToString(value) : value instanceof ArrayBuffer; + } + exports.isArrayBuffer = isArrayBuffer; + function isDataViewToString(value) { + return ObjectToString(value) === "[object DataView]"; + } + isDataViewToString.working = typeof ArrayBuffer !== "undefined" && typeof DataView !== "undefined" && isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1)); + function isDataView(value) { + if (typeof DataView === "undefined") { + return false; + } + return isDataViewToString.working ? isDataViewToString(value) : value instanceof DataView; + } + exports.isDataView = isDataView; + var SharedArrayBufferCopy = typeof SharedArrayBuffer !== "undefined" ? SharedArrayBuffer : void 0; + function isSharedArrayBufferToString(value) { + return ObjectToString(value) === "[object SharedArrayBuffer]"; + } + function isSharedArrayBuffer(value) { + if (typeof SharedArrayBufferCopy === "undefined") { + return false; + } + if (typeof isSharedArrayBufferToString.working === "undefined") { + isSharedArrayBufferToString.working = isSharedArrayBufferToString(new SharedArrayBufferCopy()); + } + return isSharedArrayBufferToString.working ? isSharedArrayBufferToString(value) : value instanceof SharedArrayBufferCopy; + } + exports.isSharedArrayBuffer = isSharedArrayBuffer; + function isAsyncFunction(value) { + return ObjectToString(value) === "[object AsyncFunction]"; + } + exports.isAsyncFunction = isAsyncFunction; + function isMapIterator(value) { + return ObjectToString(value) === "[object Map Iterator]"; + } + exports.isMapIterator = isMapIterator; + function isSetIterator(value) { + return ObjectToString(value) === "[object Set Iterator]"; + } + exports.isSetIterator = isSetIterator; + function isGeneratorObject(value) { + return ObjectToString(value) === "[object Generator]"; + } + exports.isGeneratorObject = isGeneratorObject; + function isWebAssemblyCompiledModule(value) { + return ObjectToString(value) === "[object WebAssembly.Module]"; + } + exports.isWebAssemblyCompiledModule = isWebAssemblyCompiledModule; + function isNumberObject(value) { + return checkBoxedPrimitive(value, numberValue); + } + exports.isNumberObject = isNumberObject; + function isStringObject(value) { + return checkBoxedPrimitive(value, stringValue); + } + exports.isStringObject = isStringObject; + function isBooleanObject(value) { + return checkBoxedPrimitive(value, booleanValue); + } + exports.isBooleanObject = isBooleanObject; + function isBigIntObject(value) { + return BigIntSupported && checkBoxedPrimitive(value, bigIntValue); + } + exports.isBigIntObject = isBigIntObject; + function isSymbolObject(value) { + return SymbolSupported && checkBoxedPrimitive(value, symbolValue); + } + exports.isSymbolObject = isSymbolObject; + function isBoxedPrimitive(value) { + return isNumberObject(value) || isStringObject(value) || isBooleanObject(value) || isBigIntObject(value) || isSymbolObject(value); + } + exports.isBoxedPrimitive = isBoxedPrimitive; + function isAnyArrayBuffer(value) { + return typeof Uint8Array !== "undefined" && (isArrayBuffer(value) || isSharedArrayBuffer(value)); + } + exports.isAnyArrayBuffer = isAnyArrayBuffer; + ["isProxy", "isExternal", "isModuleNamespaceObject"].forEach(function(method) { + Object.defineProperty(exports, method, { + enumerable: false, + value: function() { + throw new Error(method + " is not supported in userland"); + } + }); + }); + })(types$3); + return types$3; +} +var isBufferBrowser$1; +var hasRequiredIsBufferBrowser$1; +function requireIsBufferBrowser$1() { + if (hasRequiredIsBufferBrowser$1) return isBufferBrowser$1; + hasRequiredIsBufferBrowser$1 = 1; + isBufferBrowser$1 = function isBuffer(arg) { + return arg && typeof arg === "object" && typeof arg.copy === "function" && typeof arg.fill === "function" && typeof arg.readUInt8 === "function"; + }; + return isBufferBrowser$1; +} +var inherits_browser$1 = { exports: {} }; +var hasRequiredInherits_browser$1; +function requireInherits_browser$1() { + if (hasRequiredInherits_browser$1) return inherits_browser$1.exports; + hasRequiredInherits_browser$1 = 1; + if (typeof Object.create === "function") { + inherits_browser$1.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + } + }; + } else { + inherits_browser$1.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + }; + } + return inherits_browser$1.exports; +} +var hasRequiredUtil$5; +function requireUtil$5() { + if (hasRequiredUtil$5) return util$6; + hasRequiredUtil$5 = 1; + (function(exports) { + var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || function getOwnPropertyDescriptors2(obj) { + var keys = Object.keys(obj); + var descriptors = {}; + for (var i = 0; i < keys.length; i++) { + descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]); + } + return descriptors; + }; + var formatRegExp = /%[sdj%]/g; + exports.format = function(f) { + if (!isString2(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(" "); + } + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x2) { + if (x2 === "%%") return "%"; + if (i >= len) return x2; + switch (x2) { + case "%s": + return String(args[i++]); + case "%d": + return Number(args[i++]); + case "%j": + try { + return JSON.stringify(args[i++]); + } catch (_) { + return "[Circular]"; + } + default: + return x2; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject2(x)) { + str += " " + x; + } else { + str += " " + inspect(x); + } + } + return str; + }; + exports.deprecate = function(fn, msg) { + if (typeof process !== "undefined" && process.noDeprecation === true) { + return fn; + } + if (typeof process === "undefined") { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + return deprecated; + }; + var debugs = {}; + var debugEnvRegex = /^$/; + if (define_process_env_default.NODE_DEBUG) { + var debugEnv = define_process_env_default.NODE_DEBUG; + debugEnv = debugEnv.replace(/[|\\{}()[\]^$+?.]/g, "\\$&").replace(/\*/g, ".*").replace(/,/g, "$|^").toUpperCase(); + debugEnvRegex = new RegExp("^" + debugEnv + "$", "i"); + } + exports.debuglog = function(set2) { + set2 = set2.toUpperCase(); + if (!debugs[set2]) { + if (debugEnvRegex.test(set2)) { + var pid = process.pid; + debugs[set2] = function() { + var msg = exports.format.apply(exports, arguments); + console.error("%s %d: %s", set2, pid, msg); + }; + } else { + debugs[set2] = function() { + }; + } + } + return debugs[set2]; + }; + function inspect(obj, opts) { + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + ctx.showHidden = opts; + } else if (opts) { + exports._extend(ctx, opts); + } + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue2(ctx, obj, ctx.depth); + } + exports.inspect = inspect; + inspect.colors = { + "bold": [1, 22], + "italic": [3, 23], + "underline": [4, 24], + "inverse": [7, 27], + "white": [37, 39], + "grey": [90, 39], + "black": [30, 39], + "blue": [34, 39], + "cyan": [36, 39], + "green": [32, 39], + "magenta": [35, 39], + "red": [31, 39], + "yellow": [33, 39] + }; + inspect.styles = { + "special": "cyan", + "number": "yellow", + "boolean": "yellow", + "undefined": "grey", + "null": "bold", + "string": "green", + "date": "magenta", + // "name": intentionally not styling + "regexp": "red" + }; + function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + if (style) { + return "\x1B[" + inspect.colors[style][0] + "m" + str + "\x1B[" + inspect.colors[style][1] + "m"; + } else { + return str; + } + } + function stylizeNoColor(str, styleType) { + return str; + } + function arrayToHash(array) { + var hash2 = {}; + array.forEach(function(val, idx) { + hash2[val] = true; + }); + return hash2; + } + function formatValue2(ctx, value, recurseTimes) { + if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString2(ret)) { + ret = formatValue2(ctx, ret, recurseTimes); + } + return ret; + } + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + if (isError2(value) && (keys.indexOf("message") >= 0 || keys.indexOf("description") >= 0)) { + return formatError(value); + } + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ": " + value.name : ""; + return ctx.stylize("[Function" + name + "]", "special"); + } + if (isRegExp2(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), "regexp"); + } + if (isDate2(value)) { + return ctx.stylize(Date.prototype.toString.call(value), "date"); + } + if (isError2(value)) { + return formatError(value); + } + } + var base2 = "", array = false, braces = ["{", "}"]; + if (isArray2(value)) { + array = true; + braces = ["[", "]"]; + } + if (isFunction(value)) { + var n = value.name ? ": " + value.name : ""; + base2 = " [Function" + n + "]"; + } + if (isRegExp2(value)) { + base2 = " " + RegExp.prototype.toString.call(value); + } + if (isDate2(value)) { + base2 = " " + Date.prototype.toUTCString.call(value); + } + if (isError2(value)) { + base2 = " " + formatError(value); + } + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base2 + braces[1]; + } + if (recurseTimes < 0) { + if (isRegExp2(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), "regexp"); + } else { + return ctx.stylize("[Object]", "special"); + } + } + ctx.seen.push(value); + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key2) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key2, array); + }); + } + ctx.seen.pop(); + return reduceToSingleString(output, base2, braces); + } + function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize("undefined", "undefined"); + if (isString2(value)) { + var simple = "'" + JSON.stringify(value).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'"; + return ctx.stylize(simple, "string"); + } + if (isNumber(value)) + return ctx.stylize("" + value, "number"); + if (isBoolean(value)) + return ctx.stylize("" + value, "boolean"); + if (isNull(value)) + return ctx.stylize("null", "null"); + } + function formatError(value) { + return "[" + Error.prototype.toString.call(value) + "]"; + } + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty2(value, String(i))) { + output.push(formatProperty( + ctx, + value, + recurseTimes, + visibleKeys, + String(i), + true + )); + } else { + output.push(""); + } + } + keys.forEach(function(key2) { + if (!key2.match(/^\d+$/)) { + output.push(formatProperty( + ctx, + value, + recurseTimes, + visibleKeys, + key2, + true + )); + } + }); + return output; + } + function formatProperty(ctx, value, recurseTimes, visibleKeys, key2, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key2) || { value: value[key2] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize("[Getter/Setter]", "special"); + } else { + str = ctx.stylize("[Getter]", "special"); + } + } else { + if (desc.set) { + str = ctx.stylize("[Setter]", "special"); + } + } + if (!hasOwnProperty2(visibleKeys, key2)) { + name = "[" + key2 + "]"; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue2(ctx, desc.value, null); + } else { + str = formatValue2(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf("\n") > -1) { + if (array) { + str = str.split("\n").map(function(line) { + return " " + line; + }).join("\n").slice(2); + } else { + str = "\n" + str.split("\n").map(function(line) { + return " " + line; + }).join("\n"); + } + } + } else { + str = ctx.stylize("[Circular]", "special"); + } + } + if (isUndefined(name)) { + if (array && key2.match(/^\d+$/)) { + return str; + } + name = JSON.stringify("" + key2); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.slice(1, -1); + name = ctx.stylize(name, "name"); + } else { + name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, "string"); + } + } + return name + ": " + str; + } + function reduceToSingleString(output, base2, braces) { + var length = output.reduce(function(prev, cur) { + if (cur.indexOf("\n") >= 0) ; + return prev + cur.replace(/\u001b\[\d\d?m/g, "").length + 1; + }, 0); + if (length > 60) { + return braces[0] + (base2 === "" ? "" : base2 + "\n ") + " " + output.join(",\n ") + " " + braces[1]; + } + return braces[0] + base2 + " " + output.join(", ") + " " + braces[1]; + } + exports.types = requireTypes(); + function isArray2(ar) { + return Array.isArray(ar); + } + exports.isArray = isArray2; + function isBoolean(arg) { + return typeof arg === "boolean"; + } + exports.isBoolean = isBoolean; + function isNull(arg) { + return arg === null; + } + exports.isNull = isNull; + function isNullOrUndefined(arg) { + return arg == null; + } + exports.isNullOrUndefined = isNullOrUndefined; + function isNumber(arg) { + return typeof arg === "number"; + } + exports.isNumber = isNumber; + function isString2(arg) { + return typeof arg === "string"; + } + exports.isString = isString2; + function isSymbol(arg) { + return typeof arg === "symbol"; + } + exports.isSymbol = isSymbol; + function isUndefined(arg) { + return arg === void 0; + } + exports.isUndefined = isUndefined; + function isRegExp2(re2) { + return isObject2(re2) && objectToString(re2) === "[object RegExp]"; + } + exports.isRegExp = isRegExp2; + exports.types.isRegExp = isRegExp2; + function isObject2(arg) { + return typeof arg === "object" && arg !== null; + } + exports.isObject = isObject2; + function isDate2(d) { + return isObject2(d) && objectToString(d) === "[object Date]"; + } + exports.isDate = isDate2; + exports.types.isDate = isDate2; + function isError2(e) { + return isObject2(e) && (objectToString(e) === "[object Error]" || e instanceof Error); + } + exports.isError = isError2; + exports.types.isNativeError = isError2; + function isFunction(arg) { + return typeof arg === "function"; + } + exports.isFunction = isFunction; + function isPrimitive(arg) { + return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || // ES6 symbol + typeof arg === "undefined"; + } + exports.isPrimitive = isPrimitive; + exports.isBuffer = requireIsBufferBrowser$1(); + function objectToString(o) { + return Object.prototype.toString.call(o); + } + function pad(n) { + return n < 10 ? "0" + n.toString(10) : n.toString(10); + } + var months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + function timestamp2() { + var d = /* @__PURE__ */ new Date(); + var time = [ + pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds()) + ].join(":"); + return [d.getDate(), months[d.getMonth()], time].join(" "); + } + exports.log = function() { + console.log("%s - %s", timestamp2(), exports.format.apply(exports, arguments)); + }; + exports.inherits = requireInherits_browser$1(); + exports._extend = function(origin, add) { + if (!add || !isObject2(add)) return origin; + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + }; + function hasOwnProperty2(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + var kCustomPromisifiedSymbol = typeof Symbol !== "undefined" ? Symbol("util.promisify.custom") : void 0; + exports.promisify = function promisify2(original) { + if (typeof original !== "function") + throw new TypeError('The "original" argument must be of type Function'); + if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) { + var fn = original[kCustomPromisifiedSymbol]; + if (typeof fn !== "function") { + throw new TypeError('The "util.promisify.custom" argument must be of type Function'); + } + Object.defineProperty(fn, kCustomPromisifiedSymbol, { + value: fn, + enumerable: false, + writable: false, + configurable: true + }); + return fn; + } + function fn() { + var promiseResolve, promiseReject; + var promise = new Promise(function(resolve, reject) { + promiseResolve = resolve; + promiseReject = reject; + }); + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + args.push(function(err, value) { + if (err) { + promiseReject(err); + } else { + promiseResolve(value); + } + }); + try { + original.apply(this, args); + } catch (err) { + promiseReject(err); + } + return promise; + } + Object.setPrototypeOf(fn, Object.getPrototypeOf(original)); + if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, { + value: fn, + enumerable: false, + writable: false, + configurable: true + }); + return Object.defineProperties( + fn, + getOwnPropertyDescriptors(original) + ); + }; + exports.promisify.custom = kCustomPromisifiedSymbol; + function callbackifyOnRejected(reason, cb) { + if (!reason) { + var newReason = new Error("Promise was rejected with a falsy value"); + newReason.reason = reason; + reason = newReason; + } + return cb(reason); + } + function callbackify(original) { + if (typeof original !== "function") { + throw new TypeError('The "original" argument must be of type Function'); + } + function callbackified() { + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + var maybeCb = args.pop(); + if (typeof maybeCb !== "function") { + throw new TypeError("The last argument must be of type Function"); + } + var self2 = this; + var cb = function() { + return maybeCb.apply(self2, arguments); + }; + original.apply(this, args).then( + function(ret) { + process.nextTick(cb.bind(null, null, ret)); + }, + function(rej) { + process.nextTick(callbackifyOnRejected.bind(null, rej, cb)); + } + ); + } + Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original)); + Object.defineProperties( + callbackified, + getOwnPropertyDescriptors(original) + ); + return callbackified; + } + exports.callbackify = callbackify; + })(util$6); + return util$6; +} +var hasRequiredErrors$2; +function requireErrors$2() { + if (hasRequiredErrors$2) return errors$2; + hasRequiredErrors$2 = 1; + function _typeof2(o) { + "@babel/helpers - typeof"; + return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof2(o); + } + function _createClass(Constructor, protoProps, staticProps) { + Object.defineProperty(Constructor, "prototype", { writable: false }); + return Constructor; + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); + Object.defineProperty(subClass, "prototype", { writable: false }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + function _possibleConstructorReturn(self2, call) { + if (call && (_typeof2(call) === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); + } + return _assertThisInitialized(self2); + } + function _assertThisInitialized(self2) { + if (self2 === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self2; + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { + })); + return true; + } catch (e) { + return false; + } + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) { + return o2.__proto__ || Object.getPrototypeOf(o2); + }; + return _getPrototypeOf(o); + } + var codes = {}; + var assert2; + var util2; + function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + function getMessage(arg1, arg2, arg3) { + if (typeof message === "string") { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + var NodeError = /* @__PURE__ */ function(_Base) { + _inherits(NodeError2, _Base); + var _super = _createSuper(NodeError2); + function NodeError2(arg1, arg2, arg3) { + var _this; + _classCallCheck(this, NodeError2); + _this = _super.call(this, getMessage(arg1, arg2, arg3)); + _this.code = code; + return _this; + } + return _createClass(NodeError2); + }(Base); + codes[code] = NodeError; + } + function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function(i) { + return String(i); + }); + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(", "), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } + } + function startsWith(str, search, pos) { + return str.substr(0, search.length) === search; + } + function endsWith(str, search, this_len) { + if (this_len === void 0 || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; + } + function includes(str, search, start) { + if (typeof start !== "number") { + start = 0; + } + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } + } + createErrorType("ERR_AMBIGUOUS_ARGUMENT", 'The "%s" argument is ambiguous. %s', TypeError); + createErrorType("ERR_INVALID_ARG_TYPE", function(name, expected, actual) { + if (assert2 === void 0) assert2 = requireAssert(); + assert2(typeof name === "string", "'name' must be a string"); + var determiner; + if (typeof expected === "string" && startsWith(expected, "not ")) { + determiner = "must not be"; + expected = expected.replace(/^not /, ""); + } else { + determiner = "must be"; + } + var msg; + if (endsWith(name, " argument")) { + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } else { + var type2 = includes(name, ".") ? "property" : "argument"; + msg = 'The "'.concat(name, '" ').concat(type2, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } + msg += ". Received type ".concat(_typeof2(actual)); + return msg; + }, TypeError); + createErrorType("ERR_INVALID_ARG_VALUE", function(name, value) { + var reason = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "is invalid"; + if (util2 === void 0) util2 = requireUtil$5(); + var inspected = util2.inspect(value); + if (inspected.length > 128) { + inspected = "".concat(inspected.slice(0, 128), "..."); + } + return "The argument '".concat(name, "' ").concat(reason, ". Received ").concat(inspected); + }, TypeError); + createErrorType("ERR_INVALID_RETURN_VALUE", function(input, name, value) { + var type2; + if (value && value.constructor && value.constructor.name) { + type2 = "instance of ".concat(value.constructor.name); + } else { + type2 = "type ".concat(_typeof2(value)); + } + return "Expected ".concat(input, ' to be returned from the "').concat(name, '"') + " function but got ".concat(type2, "."); + }, TypeError); + createErrorType("ERR_MISSING_ARGS", function() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + if (assert2 === void 0) assert2 = requireAssert(); + assert2(args.length > 0, "At least one arg needs to be specified"); + var msg = "The "; + var len = args.length; + args = args.map(function(a) { + return '"'.concat(a, '"'); + }); + switch (len) { + case 1: + msg += "".concat(args[0], " argument"); + break; + case 2: + msg += "".concat(args[0], " and ").concat(args[1], " arguments"); + break; + default: + msg += args.slice(0, len - 1).join(", "); + msg += ", and ".concat(args[len - 1], " arguments"); + break; + } + return "".concat(msg, " must be specified"); + }, TypeError); + errors$2.codes = codes; + return errors$2; +} +var assertion_error; +var hasRequiredAssertion_error; +function requireAssertion_error() { + if (hasRequiredAssertion_error) return assertion_error; + hasRequiredAssertion_error = 1; + function ownKeys2(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function(r2) { + return Object.getOwnPropertyDescriptor(e, r2).enumerable; + })), t.push.apply(t, o); + } + return t; + } + function _objectSpread(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys2(Object(t), true).forEach(function(r2) { + _defineProperty2(e, r2, t[r2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys2(Object(t)).forEach(function(r2) { + Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); + }); + } + return e; + } + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey2(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + Object.defineProperty(Constructor, "prototype", { writable: false }); + return Constructor; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return _typeof2(key2) === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (_typeof2(input) !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (_typeof2(res) !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return String(input); + } + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); + Object.defineProperty(subClass, "prototype", { writable: false }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; + } + function _possibleConstructorReturn(self2, call) { + if (call && (_typeof2(call) === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); + } + return _assertThisInitialized(self2); + } + function _assertThisInitialized(self2) { + if (self2 === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self2; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? /* @__PURE__ */ new Map() : void 0; + _wrapNativeSuper = function _wrapNativeSuper2(Class2) { + if (Class2 === null || !_isNativeFunction(Class2)) return Class2; + if (typeof Class2 !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class2)) return _cache.get(Class2); + _cache.set(Class2, Wrapper); + } + function Wrapper() { + return _construct(Class2, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class2.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); + return _setPrototypeOf(Wrapper, Class2); + }; + return _wrapNativeSuper(Class); + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct2(Parent2, args2, Class2) { + var a = [null]; + a.push.apply(a, args2); + var Constructor = Function.bind.apply(Parent2, a); + var instance = new Constructor(); + if (Class2) _setPrototypeOf(instance, Class2.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { + })); + return true; + } catch (e) { + return false; + } + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf2(o2) { + return o2.__proto__ || Object.getPrototypeOf(o2); + }; + return _getPrototypeOf(o); + } + function _typeof2(o) { + "@babel/helpers - typeof"; + return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof2(o); + } + var _require = requireUtil$5(), inspect = _require.inspect; + var _require2 = requireErrors$2(), ERR_INVALID_ARG_TYPE2 = _require2.codes.ERR_INVALID_ARG_TYPE; + function endsWith(str, search, this_len) { + if (this_len === void 0 || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; + } + function repeat(str, count) { + count = Math.floor(count); + if (str.length == 0 || count == 0) return ""; + var maxCount = str.length * count; + count = Math.floor(Math.log(count) / Math.log(2)); + while (count) { + str += str; + count--; + } + str += str.substring(0, maxCount - str.length); + return str; + } + var blue = ""; + var green = ""; + var red = ""; + var white = ""; + var kReadableOperator = { + deepStrictEqual: "Expected values to be strictly deep-equal:", + strictEqual: "Expected values to be strictly equal:", + strictEqualObject: 'Expected "actual" to be reference-equal to "expected":', + deepEqual: "Expected values to be loosely deep-equal:", + equal: "Expected values to be loosely equal:", + notDeepStrictEqual: 'Expected "actual" not to be strictly deep-equal to:', + notStrictEqual: 'Expected "actual" to be strictly unequal to:', + notStrictEqualObject: 'Expected "actual" not to be reference-equal to "expected":', + notDeepEqual: 'Expected "actual" not to be loosely deep-equal to:', + notEqual: 'Expected "actual" to be loosely unequal to:', + notIdentical: "Values identical but not reference-equal:" + }; + var kMaxShortLength = 10; + function copyError(source2) { + var keys = Object.keys(source2); + var target = Object.create(Object.getPrototypeOf(source2)); + keys.forEach(function(key2) { + target[key2] = source2[key2]; + }); + Object.defineProperty(target, "message", { + value: source2.message + }); + return target; + } + function inspectValue(val) { + return inspect(val, { + compact: false, + customInspect: false, + depth: 1e3, + maxArrayLength: Infinity, + // Assert compares only enumerable properties (with a few exceptions). + showHidden: false, + // Having a long line as error is better than wrapping the line for + // comparison for now. + // TODO(BridgeAR): `breakLength` should be limited as soon as soon as we + // have meta information about the inspected properties (i.e., know where + // in what line the property starts and ends). + breakLength: Infinity, + // Assert does not detect proxies currently. + showProxy: false, + sorted: true, + // Inspect getters as we also check them when comparing entries. + getters: true + }); + } + function createErrDiff(actual, expected, operator) { + var other2 = ""; + var res = ""; + var lastPos = 0; + var end = ""; + var skipped = false; + var actualInspected = inspectValue(actual); + var actualLines = actualInspected.split("\n"); + var expectedLines = inspectValue(expected).split("\n"); + var i = 0; + var indicator = ""; + if (operator === "strictEqual" && _typeof2(actual) === "object" && _typeof2(expected) === "object" && actual !== null && expected !== null) { + operator = "strictEqualObject"; + } + if (actualLines.length === 1 && expectedLines.length === 1 && actualLines[0] !== expectedLines[0]) { + var inputLength = actualLines[0].length + expectedLines[0].length; + if (inputLength <= kMaxShortLength) { + if ((_typeof2(actual) !== "object" || actual === null) && (_typeof2(expected) !== "object" || expected === null) && (actual !== 0 || expected !== 0)) { + return "".concat(kReadableOperator[operator], "\n\n") + "".concat(actualLines[0], " !== ").concat(expectedLines[0], "\n"); + } + } else if (operator !== "strictEqualObject") { + var maxLength = process.stderr && process.stderr.isTTY ? process.stderr.columns : 80; + if (inputLength < maxLength) { + while (actualLines[0][i] === expectedLines[0][i]) { + i++; + } + if (i > 2) { + indicator = "\n ".concat(repeat(" ", i), "^"); + i = 0; + } + } + } + } + var a = actualLines[actualLines.length - 1]; + var b = expectedLines[expectedLines.length - 1]; + while (a === b) { + if (i++ < 2) { + end = "\n ".concat(a).concat(end); + } else { + other2 = a; + } + actualLines.pop(); + expectedLines.pop(); + if (actualLines.length === 0 || expectedLines.length === 0) break; + a = actualLines[actualLines.length - 1]; + b = expectedLines[expectedLines.length - 1]; + } + var maxLines = Math.max(actualLines.length, expectedLines.length); + if (maxLines === 0) { + var _actualLines = actualInspected.split("\n"); + if (_actualLines.length > 30) { + _actualLines[26] = "".concat(blue, "...").concat(white); + while (_actualLines.length > 27) { + _actualLines.pop(); + } + } + return "".concat(kReadableOperator.notIdentical, "\n\n").concat(_actualLines.join("\n"), "\n"); + } + if (i > 3) { + end = "\n".concat(blue, "...").concat(white).concat(end); + skipped = true; + } + if (other2 !== "") { + end = "\n ".concat(other2).concat(end); + other2 = ""; + } + var printedLines = 0; + var msg = kReadableOperator[operator] + "\n".concat(green, "+ actual").concat(white, " ").concat(red, "- expected").concat(white); + var skippedMsg = " ".concat(blue, "...").concat(white, " Lines skipped"); + for (i = 0; i < maxLines; i++) { + var cur = i - lastPos; + if (actualLines.length < i + 1) { + if (cur > 1 && i > 2) { + if (cur > 4) { + res += "\n".concat(blue, "...").concat(white); + skipped = true; + } else if (cur > 3) { + res += "\n ".concat(expectedLines[i - 2]); + printedLines++; + } + res += "\n ".concat(expectedLines[i - 1]); + printedLines++; + } + lastPos = i; + other2 += "\n".concat(red, "-").concat(white, " ").concat(expectedLines[i]); + printedLines++; + } else if (expectedLines.length < i + 1) { + if (cur > 1 && i > 2) { + if (cur > 4) { + res += "\n".concat(blue, "...").concat(white); + skipped = true; + } else if (cur > 3) { + res += "\n ".concat(actualLines[i - 2]); + printedLines++; + } + res += "\n ".concat(actualLines[i - 1]); + printedLines++; + } + lastPos = i; + res += "\n".concat(green, "+").concat(white, " ").concat(actualLines[i]); + printedLines++; + } else { + var expectedLine = expectedLines[i]; + var actualLine = actualLines[i]; + var divergingLines = actualLine !== expectedLine && (!endsWith(actualLine, ",") || actualLine.slice(0, -1) !== expectedLine); + if (divergingLines && endsWith(expectedLine, ",") && expectedLine.slice(0, -1) === actualLine) { + divergingLines = false; + actualLine += ","; + } + if (divergingLines) { + if (cur > 1 && i > 2) { + if (cur > 4) { + res += "\n".concat(blue, "...").concat(white); + skipped = true; + } else if (cur > 3) { + res += "\n ".concat(actualLines[i - 2]); + printedLines++; + } + res += "\n ".concat(actualLines[i - 1]); + printedLines++; + } + lastPos = i; + res += "\n".concat(green, "+").concat(white, " ").concat(actualLine); + other2 += "\n".concat(red, "-").concat(white, " ").concat(expectedLine); + printedLines += 2; + } else { + res += other2; + other2 = ""; + if (cur === 1 || i === 0) { + res += "\n ".concat(actualLine); + printedLines++; + } + } + } + if (printedLines > 20 && i < maxLines - 2) { + return "".concat(msg).concat(skippedMsg, "\n").concat(res, "\n").concat(blue, "...").concat(white).concat(other2, "\n") + "".concat(blue, "...").concat(white); + } + } + return "".concat(msg).concat(skipped ? skippedMsg : "", "\n").concat(res).concat(other2).concat(end).concat(indicator); + } + var AssertionError = /* @__PURE__ */ function(_Error, _inspect$custom) { + _inherits(AssertionError2, _Error); + var _super = _createSuper(AssertionError2); + function AssertionError2(options2) { + var _this; + _classCallCheck(this, AssertionError2); + if (_typeof2(options2) !== "object" || options2 === null) { + throw new ERR_INVALID_ARG_TYPE2("options", "Object", options2); + } + var message = options2.message, operator = options2.operator, stackStartFn = options2.stackStartFn; + var actual = options2.actual, expected = options2.expected; + var limit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + if (message != null) { + _this = _super.call(this, String(message)); + } else { + if (process.stderr && process.stderr.isTTY) { + if (process.stderr && process.stderr.getColorDepth && process.stderr.getColorDepth() !== 1) { + blue = "\x1B[34m"; + green = "\x1B[32m"; + white = "\x1B[39m"; + red = "\x1B[31m"; + } else { + blue = ""; + green = ""; + white = ""; + red = ""; + } + } + if (_typeof2(actual) === "object" && actual !== null && _typeof2(expected) === "object" && expected !== null && "stack" in actual && actual instanceof Error && "stack" in expected && expected instanceof Error) { + actual = copyError(actual); + expected = copyError(expected); + } + if (operator === "deepStrictEqual" || operator === "strictEqual") { + _this = _super.call(this, createErrDiff(actual, expected, operator)); + } else if (operator === "notDeepStrictEqual" || operator === "notStrictEqual") { + var base2 = kReadableOperator[operator]; + var res = inspectValue(actual).split("\n"); + if (operator === "notStrictEqual" && _typeof2(actual) === "object" && actual !== null) { + base2 = kReadableOperator.notStrictEqualObject; + } + if (res.length > 30) { + res[26] = "".concat(blue, "...").concat(white); + while (res.length > 27) { + res.pop(); + } + } + if (res.length === 1) { + _this = _super.call(this, "".concat(base2, " ").concat(res[0])); + } else { + _this = _super.call(this, "".concat(base2, "\n\n").concat(res.join("\n"), "\n")); + } + } else { + var _res = inspectValue(actual); + var other2 = ""; + var knownOperators = kReadableOperator[operator]; + if (operator === "notDeepEqual" || operator === "notEqual") { + _res = "".concat(kReadableOperator[operator], "\n\n").concat(_res); + if (_res.length > 1024) { + _res = "".concat(_res.slice(0, 1021), "..."); + } + } else { + other2 = "".concat(inspectValue(expected)); + if (_res.length > 512) { + _res = "".concat(_res.slice(0, 509), "..."); + } + if (other2.length > 512) { + other2 = "".concat(other2.slice(0, 509), "..."); + } + if (operator === "deepEqual" || operator === "equal") { + _res = "".concat(knownOperators, "\n\n").concat(_res, "\n\nshould equal\n\n"); + } else { + other2 = " ".concat(operator, " ").concat(other2); + } + } + _this = _super.call(this, "".concat(_res).concat(other2)); + } + } + Error.stackTraceLimit = limit; + _this.generatedMessage = !message; + Object.defineProperty(_assertThisInitialized(_this), "name", { + value: "AssertionError [ERR_ASSERTION]", + enumerable: false, + writable: true, + configurable: true + }); + _this.code = "ERR_ASSERTION"; + _this.actual = actual; + _this.expected = expected; + _this.operator = operator; + if (Error.captureStackTrace) { + Error.captureStackTrace(_assertThisInitialized(_this), stackStartFn); + } + _this.stack; + _this.name = "AssertionError"; + return _possibleConstructorReturn(_this); + } + _createClass(AssertionError2, [{ + key: "toString", + value: function toString2() { + return "".concat(this.name, " [").concat(this.code, "]: ").concat(this.message); + } + }, { + key: _inspect$custom, + value: function value(recurseTimes, ctx) { + return inspect(this, _objectSpread(_objectSpread({}, ctx), {}, { + customInspect: false, + depth: 0 + })); + } + }]); + return AssertionError2; + }(/* @__PURE__ */ _wrapNativeSuper(Error), inspect.custom); + assertion_error = AssertionError; + return assertion_error; +} +var isArguments; +var hasRequiredIsArguments; +function requireIsArguments() { + if (hasRequiredIsArguments) return isArguments; + hasRequiredIsArguments = 1; + var toStr = Object.prototype.toString; + isArguments = function isArguments2(value) { + var str = toStr.call(value); + var isArgs = str === "[object Arguments]"; + if (!isArgs) { + isArgs = str !== "[object Array]" && value !== null && typeof value === "object" && typeof value.length === "number" && value.length >= 0 && toStr.call(value.callee) === "[object Function]"; + } + return isArgs; + }; + return isArguments; +} +var implementation$3; +var hasRequiredImplementation$3; +function requireImplementation$3() { + if (hasRequiredImplementation$3) return implementation$3; + hasRequiredImplementation$3 = 1; + var keysShim; + if (!Object.keys) { + var has = Object.prototype.hasOwnProperty; + var toStr = Object.prototype.toString; + var isArgs = requireIsArguments(); + var isEnumerable = Object.prototype.propertyIsEnumerable; + var hasDontEnumBug = !isEnumerable.call({ toString: null }, "toString"); + var hasProtoEnumBug = isEnumerable.call(function() { + }, "prototype"); + var dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ]; + var equalsConstructorPrototype = function(o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; + }; + var excludedKeys = { + $applicationCache: true, + $console: true, + $external: true, + $frame: true, + $frameElement: true, + $frames: true, + $innerHeight: true, + $innerWidth: true, + $onmozfullscreenchange: true, + $onmozfullscreenerror: true, + $outerHeight: true, + $outerWidth: true, + $pageXOffset: true, + $pageYOffset: true, + $parent: true, + $scrollLeft: true, + $scrollTop: true, + $scrollX: true, + $scrollY: true, + $self: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $window: true + }; + var hasAutomationEqualityBug = function() { + if (typeof window === "undefined") { + return false; + } + for (var k in window) { + try { + if (!excludedKeys["$" + k] && has.call(window, k) && window[k] !== null && typeof window[k] === "object") { + try { + equalsConstructorPrototype(window[k]); + } catch (e) { + return true; + } + } + } catch (e) { + return true; + } + } + return false; + }(); + var equalsConstructorPrototypeIfNotBuggy = function(o) { + if (typeof window === "undefined" || !hasAutomationEqualityBug) { + return equalsConstructorPrototype(o); + } + try { + return equalsConstructorPrototype(o); + } catch (e) { + return false; + } + }; + keysShim = function keys(object) { + var isObject2 = object !== null && typeof object === "object"; + var isFunction = toStr.call(object) === "[object Function]"; + var isArguments2 = isArgs(object); + var isString2 = isObject2 && toStr.call(object) === "[object String]"; + var theKeys = []; + if (!isObject2 && !isFunction && !isArguments2) { + throw new TypeError("Object.keys called on a non-object"); + } + var skipProto = hasProtoEnumBug && isFunction; + if (isString2 && object.length > 0 && !has.call(object, 0)) { + for (var i = 0; i < object.length; ++i) { + theKeys.push(String(i)); + } + } + if (isArguments2 && object.length > 0) { + for (var j = 0; j < object.length; ++j) { + theKeys.push(String(j)); + } + } else { + for (var name in object) { + if (!(skipProto && name === "prototype") && has.call(object, name)) { + theKeys.push(String(name)); + } + } + } + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + for (var k = 0; k < dontEnums.length; ++k) { + if (!(skipConstructor && dontEnums[k] === "constructor") && has.call(object, dontEnums[k])) { + theKeys.push(dontEnums[k]); + } + } + } + return theKeys; + }; + } + implementation$3 = keysShim; + return implementation$3; +} +var objectKeys; +var hasRequiredObjectKeys; +function requireObjectKeys() { + if (hasRequiredObjectKeys) return objectKeys; + hasRequiredObjectKeys = 1; + var slice = Array.prototype.slice; + var isArgs = requireIsArguments(); + var origKeys = Object.keys; + var keysShim = origKeys ? function keys(o) { + return origKeys(o); + } : requireImplementation$3(); + var originalKeys = Object.keys; + keysShim.shim = function shimObjectKeys() { + if (Object.keys) { + var keysWorksWithArguments = function() { + var args = Object.keys(arguments); + return args && args.length === arguments.length; + }(1, 2); + if (!keysWorksWithArguments) { + Object.keys = function keys(object) { + if (isArgs(object)) { + return originalKeys(slice.call(object)); + } + return originalKeys(object); + }; + } + } else { + Object.keys = keysShim; + } + return Object.keys || keysShim; + }; + objectKeys = keysShim; + return objectKeys; +} +var implementation$2; +var hasRequiredImplementation$2; +function requireImplementation$2() { + if (hasRequiredImplementation$2) return implementation$2; + hasRequiredImplementation$2 = 1; + var objectKeys2 = requireObjectKeys(); + var hasSymbols2 = requireShams$1()(); + var callBound2 = /* @__PURE__ */ requireCallBound(); + var $Object = /* @__PURE__ */ requireEsObjectAtoms(); + var $push = callBound2("Array.prototype.push"); + var $propIsEnumerable = callBound2("Object.prototype.propertyIsEnumerable"); + var originalGetSymbols = hasSymbols2 ? $Object.getOwnPropertySymbols : null; + implementation$2 = function assign(target, source1) { + if (target == null) { + throw new TypeError("target must be an object"); + } + var to = $Object(target); + if (arguments.length === 1) { + return to; + } + for (var s = 1; s < arguments.length; ++s) { + var from2 = $Object(arguments[s]); + var keys = objectKeys2(from2); + var getSymbols = hasSymbols2 && ($Object.getOwnPropertySymbols || originalGetSymbols); + if (getSymbols) { + var syms = getSymbols(from2); + for (var j = 0; j < syms.length; ++j) { + var key2 = syms[j]; + if ($propIsEnumerable(from2, key2)) { + $push(keys, key2); + } + } + } + for (var i = 0; i < keys.length; ++i) { + var nextKey = keys[i]; + if ($propIsEnumerable(from2, nextKey)) { + var propValue = from2[nextKey]; + to[nextKey] = propValue; + } + } + } + return to; + }; + return implementation$2; +} +var polyfill$2; +var hasRequiredPolyfill$2; +function requirePolyfill$2() { + if (hasRequiredPolyfill$2) return polyfill$2; + hasRequiredPolyfill$2 = 1; + var implementation2 = requireImplementation$2(); + var lacksProperEnumerationOrder = function() { + if (!Object.assign) { + return false; + } + var str = "abcdefghijklmnopqrst"; + var letters = str.split(""); + var map2 = {}; + for (var i = 0; i < letters.length; ++i) { + map2[letters[i]] = letters[i]; + } + var obj = Object.assign({}, map2); + var actual = ""; + for (var k in obj) { + actual += k; + } + return str !== actual; + }; + var assignHasPendingExceptions = function() { + if (!Object.assign || !Object.preventExtensions) { + return false; + } + var thrower = Object.preventExtensions({ 1: 2 }); + try { + Object.assign(thrower, "xy"); + } catch (e) { + return thrower[1] === "y"; + } + return false; + }; + polyfill$2 = function getPolyfill() { + if (!Object.assign) { + return implementation2; + } + if (lacksProperEnumerationOrder()) { + return implementation2; + } + if (assignHasPendingExceptions()) { + return implementation2; + } + return Object.assign; + }; + return polyfill$2; +} +var implementation$1; +var hasRequiredImplementation$1; +function requireImplementation$1() { + if (hasRequiredImplementation$1) return implementation$1; + hasRequiredImplementation$1 = 1; + var numberIsNaN = function(value) { + return value !== value; + }; + implementation$1 = function is(a, b) { + if (a === 0 && b === 0) { + return 1 / a === 1 / b; + } + if (a === b) { + return true; + } + if (numberIsNaN(a) && numberIsNaN(b)) { + return true; + } + return false; + }; + return implementation$1; +} +var polyfill$1; +var hasRequiredPolyfill$1; +function requirePolyfill$1() { + if (hasRequiredPolyfill$1) return polyfill$1; + hasRequiredPolyfill$1 = 1; + var implementation2 = requireImplementation$1(); + polyfill$1 = function getPolyfill() { + return typeof Object.is === "function" ? Object.is : implementation2; + }; + return polyfill$1; +} +var defineProperties_1; +var hasRequiredDefineProperties; +function requireDefineProperties() { + if (hasRequiredDefineProperties) return defineProperties_1; + hasRequiredDefineProperties = 1; + var keys = requireObjectKeys(); + var hasSymbols2 = typeof Symbol === "function" && typeof Symbol("foo") === "symbol"; + var toStr = Object.prototype.toString; + var concat = Array.prototype.concat; + var defineDataProperty2 = /* @__PURE__ */ requireDefineDataProperty(); + var isFunction = function(fn) { + return typeof fn === "function" && toStr.call(fn) === "[object Function]"; + }; + var supportsDescriptors = /* @__PURE__ */ requireHasPropertyDescriptors()(); + var defineProperty = function(object, name, value, predicate) { + if (name in object) { + if (predicate === true) { + if (object[name] === value) { + return; + } + } else if (!isFunction(predicate) || !predicate()) { + return; + } + } + if (supportsDescriptors) { + defineDataProperty2(object, name, value, true); + } else { + defineDataProperty2(object, name, value); + } + }; + var defineProperties = function(object, map2) { + var predicates = arguments.length > 2 ? arguments[2] : {}; + var props = keys(map2); + if (hasSymbols2) { + props = concat.call(props, Object.getOwnPropertySymbols(map2)); + } + for (var i = 0; i < props.length; i += 1) { + defineProperty(object, props[i], map2[props[i]], predicates[props[i]]); + } + }; + defineProperties.supportsDescriptors = !!supportsDescriptors; + defineProperties_1 = defineProperties; + return defineProperties_1; +} +var shim$1; +var hasRequiredShim$1; +function requireShim$1() { + if (hasRequiredShim$1) return shim$1; + hasRequiredShim$1 = 1; + var getPolyfill = requirePolyfill$1(); + var define = requireDefineProperties(); + shim$1 = function shimObjectIs() { + var polyfill2 = getPolyfill(); + define(Object, { is: polyfill2 }, { + is: function testObjectIs() { + return Object.is !== polyfill2; + } + }); + return polyfill2; + }; + return shim$1; +} +var objectIs; +var hasRequiredObjectIs; +function requireObjectIs() { + if (hasRequiredObjectIs) return objectIs; + hasRequiredObjectIs = 1; + var define = requireDefineProperties(); + var callBind2 = requireCallBind(); + var implementation2 = requireImplementation$1(); + var getPolyfill = requirePolyfill$1(); + var shim2 = requireShim$1(); + var polyfill2 = callBind2(getPolyfill(), Object); + define(polyfill2, { + getPolyfill, + implementation: implementation2, + shim: shim2 + }); + objectIs = polyfill2; + return objectIs; +} +var implementation; +var hasRequiredImplementation; +function requireImplementation() { + if (hasRequiredImplementation) return implementation; + hasRequiredImplementation = 1; + implementation = function isNaN2(value) { + return value !== value; + }; + return implementation; +} +var polyfill; +var hasRequiredPolyfill; +function requirePolyfill() { + if (hasRequiredPolyfill) return polyfill; + hasRequiredPolyfill = 1; + var implementation2 = requireImplementation(); + polyfill = function getPolyfill() { + if (Number.isNaN && Number.isNaN(NaN) && !Number.isNaN("a")) { + return Number.isNaN; + } + return implementation2; + }; + return polyfill; +} +var shim; +var hasRequiredShim; +function requireShim() { + if (hasRequiredShim) return shim; + hasRequiredShim = 1; + var define = requireDefineProperties(); + var getPolyfill = requirePolyfill(); + shim = function shimNumberIsNaN() { + var polyfill2 = getPolyfill(); + define(Number, { isNaN: polyfill2 }, { + isNaN: function testIsNaN() { + return Number.isNaN !== polyfill2; + } + }); + return polyfill2; + }; + return shim; +} +var isNan; +var hasRequiredIsNan; +function requireIsNan() { + if (hasRequiredIsNan) return isNan; + hasRequiredIsNan = 1; + var callBind2 = requireCallBind(); + var define = requireDefineProperties(); + var implementation2 = requireImplementation(); + var getPolyfill = requirePolyfill(); + var shim2 = requireShim(); + var polyfill2 = callBind2(getPolyfill(), Number); + define(polyfill2, { + getPolyfill, + implementation: implementation2, + shim: shim2 + }); + isNan = polyfill2; + return isNan; +} +var comparisons; +var hasRequiredComparisons; +function requireComparisons() { + if (hasRequiredComparisons) return comparisons; + hasRequiredComparisons = 1; + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray2(arr, i) || _nonIterableRest(); + } + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + function _unsupportedIterableToArray2(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray2(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray2(o, minLen); + } + function _arrayLikeToArray2(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _iterableToArrayLimit(r, l) { + var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; + if (null != t) { + var e, n, i, u, a = [], f = true, o = false; + try { + if (i = (t = t.call(r)).next, 0 === l) ; + else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = true) ; + } catch (r2) { + o = true, n = r2; + } finally { + try { + if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; + } finally { + if (o) throw n; + } + } + return a; + } + } + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + function _typeof2(o) { + "@babel/helpers - typeof"; + return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof2(o); + } + var regexFlagsSupported = /a/g.flags !== void 0; + var arrayFromSet = function arrayFromSet2(set2) { + var array = []; + set2.forEach(function(value) { + return array.push(value); + }); + return array; + }; + var arrayFromMap = function arrayFromMap2(map2) { + var array = []; + map2.forEach(function(value, key2) { + return array.push([key2, value]); + }); + return array; + }; + var objectIs2 = Object.is ? Object.is : requireObjectIs(); + var objectGetOwnPropertySymbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols : function() { + return []; + }; + var numberIsNaN = Number.isNaN ? Number.isNaN : requireIsNan(); + function uncurryThis(f) { + return f.call.bind(f); + } + var hasOwnProperty2 = uncurryThis(Object.prototype.hasOwnProperty); + var propertyIsEnumerable = uncurryThis(Object.prototype.propertyIsEnumerable); + var objectToString = uncurryThis(Object.prototype.toString); + var _require$types = requireUtil$5().types, isAnyArrayBuffer = _require$types.isAnyArrayBuffer, isArrayBufferView = _require$types.isArrayBufferView, isDate2 = _require$types.isDate, isMap2 = _require$types.isMap, isRegExp2 = _require$types.isRegExp, isSet = _require$types.isSet, isNativeError = _require$types.isNativeError, isBoxedPrimitive = _require$types.isBoxedPrimitive, isNumberObject = _require$types.isNumberObject, isStringObject = _require$types.isStringObject, isBooleanObject = _require$types.isBooleanObject, isBigIntObject = _require$types.isBigIntObject, isSymbolObject = _require$types.isSymbolObject, isFloat32Array = _require$types.isFloat32Array, isFloat64Array = _require$types.isFloat64Array; + function isNonIndex(key2) { + if (key2.length === 0 || key2.length > 10) return true; + for (var i = 0; i < key2.length; i++) { + var code = key2.charCodeAt(i); + if (code < 48 || code > 57) return true; + } + return key2.length === 10 && key2 >= Math.pow(2, 32); + } + function getOwnNonIndexProperties(value) { + return Object.keys(value).filter(isNonIndex).concat(objectGetOwnPropertySymbols(value).filter(Object.prototype.propertyIsEnumerable.bind(value))); + } + /*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ + function compare2(a, b) { + if (a === b) { + return 0; + } + var x = a.length; + var y = b.length; + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + if (x < y) { + return -1; + } + if (y < x) { + return 1; + } + return 0; + } + var kStrict = true; + var kLoose = false; + var kNoIterator = 0; + var kIsArray = 1; + var kIsSet = 2; + var kIsMap = 3; + function areSimilarRegExps(a, b) { + return regexFlagsSupported ? a.source === b.source && a.flags === b.flags : RegExp.prototype.toString.call(a) === RegExp.prototype.toString.call(b); + } + function areSimilarFloatArrays(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + for (var offset2 = 0; offset2 < a.byteLength; offset2++) { + if (a[offset2] !== b[offset2]) { + return false; + } + } + return true; + } + function areSimilarTypedArrays(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + return compare2(new Uint8Array(a.buffer, a.byteOffset, a.byteLength), new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) === 0; + } + function areEqualArrayBuffers(buf1, buf2) { + return buf1.byteLength === buf2.byteLength && compare2(new Uint8Array(buf1), new Uint8Array(buf2)) === 0; + } + function isEqualBoxedPrimitive(val1, val2) { + if (isNumberObject(val1)) { + return isNumberObject(val2) && objectIs2(Number.prototype.valueOf.call(val1), Number.prototype.valueOf.call(val2)); + } + if (isStringObject(val1)) { + return isStringObject(val2) && String.prototype.valueOf.call(val1) === String.prototype.valueOf.call(val2); + } + if (isBooleanObject(val1)) { + return isBooleanObject(val2) && Boolean.prototype.valueOf.call(val1) === Boolean.prototype.valueOf.call(val2); + } + if (isBigIntObject(val1)) { + return isBigIntObject(val2) && BigInt.prototype.valueOf.call(val1) === BigInt.prototype.valueOf.call(val2); + } + return isSymbolObject(val2) && Symbol.prototype.valueOf.call(val1) === Symbol.prototype.valueOf.call(val2); + } + function innerDeepEqual(val1, val2, strict, memos) { + if (val1 === val2) { + if (val1 !== 0) return true; + return strict ? objectIs2(val1, val2) : true; + } + if (strict) { + if (_typeof2(val1) !== "object") { + return typeof val1 === "number" && numberIsNaN(val1) && numberIsNaN(val2); + } + if (_typeof2(val2) !== "object" || val1 === null || val2 === null) { + return false; + } + if (Object.getPrototypeOf(val1) !== Object.getPrototypeOf(val2)) { + return false; + } + } else { + if (val1 === null || _typeof2(val1) !== "object") { + if (val2 === null || _typeof2(val2) !== "object") { + return val1 == val2; + } + return false; + } + if (val2 === null || _typeof2(val2) !== "object") { + return false; + } + } + var val1Tag = objectToString(val1); + var val2Tag = objectToString(val2); + if (val1Tag !== val2Tag) { + return false; + } + if (Array.isArray(val1)) { + if (val1.length !== val2.length) { + return false; + } + var keys1 = getOwnNonIndexProperties(val1); + var keys2 = getOwnNonIndexProperties(val2); + if (keys1.length !== keys2.length) { + return false; + } + return keyCheck(val1, val2, strict, memos, kIsArray, keys1); + } + if (val1Tag === "[object Object]") { + if (!isMap2(val1) && isMap2(val2) || !isSet(val1) && isSet(val2)) { + return false; + } + } + if (isDate2(val1)) { + if (!isDate2(val2) || Date.prototype.getTime.call(val1) !== Date.prototype.getTime.call(val2)) { + return false; + } + } else if (isRegExp2(val1)) { + if (!isRegExp2(val2) || !areSimilarRegExps(val1, val2)) { + return false; + } + } else if (isNativeError(val1) || val1 instanceof Error) { + if (val1.message !== val2.message || val1.name !== val2.name) { + return false; + } + } else if (isArrayBufferView(val1)) { + if (!strict && (isFloat32Array(val1) || isFloat64Array(val1))) { + if (!areSimilarFloatArrays(val1, val2)) { + return false; + } + } else if (!areSimilarTypedArrays(val1, val2)) { + return false; + } + var _keys = getOwnNonIndexProperties(val1); + var _keys2 = getOwnNonIndexProperties(val2); + if (_keys.length !== _keys2.length) { + return false; + } + return keyCheck(val1, val2, strict, memos, kNoIterator, _keys); + } else if (isSet(val1)) { + if (!isSet(val2) || val1.size !== val2.size) { + return false; + } + return keyCheck(val1, val2, strict, memos, kIsSet); + } else if (isMap2(val1)) { + if (!isMap2(val2) || val1.size !== val2.size) { + return false; + } + return keyCheck(val1, val2, strict, memos, kIsMap); + } else if (isAnyArrayBuffer(val1)) { + if (!areEqualArrayBuffers(val1, val2)) { + return false; + } + } else if (isBoxedPrimitive(val1) && !isEqualBoxedPrimitive(val1, val2)) { + return false; + } + return keyCheck(val1, val2, strict, memos, kNoIterator); + } + function getEnumerables(val, keys) { + return keys.filter(function(k) { + return propertyIsEnumerable(val, k); + }); + } + function keyCheck(val1, val2, strict, memos, iterationType, aKeys) { + if (arguments.length === 5) { + aKeys = Object.keys(val1); + var bKeys = Object.keys(val2); + if (aKeys.length !== bKeys.length) { + return false; + } + } + var i = 0; + for (; i < aKeys.length; i++) { + if (!hasOwnProperty2(val2, aKeys[i])) { + return false; + } + } + if (strict && arguments.length === 5) { + var symbolKeysA = objectGetOwnPropertySymbols(val1); + if (symbolKeysA.length !== 0) { + var count = 0; + for (i = 0; i < symbolKeysA.length; i++) { + var key2 = symbolKeysA[i]; + if (propertyIsEnumerable(val1, key2)) { + if (!propertyIsEnumerable(val2, key2)) { + return false; + } + aKeys.push(key2); + count++; + } else if (propertyIsEnumerable(val2, key2)) { + return false; + } + } + var symbolKeysB = objectGetOwnPropertySymbols(val2); + if (symbolKeysA.length !== symbolKeysB.length && getEnumerables(val2, symbolKeysB).length !== count) { + return false; + } + } else { + var _symbolKeysB = objectGetOwnPropertySymbols(val2); + if (_symbolKeysB.length !== 0 && getEnumerables(val2, _symbolKeysB).length !== 0) { + return false; + } + } + } + if (aKeys.length === 0 && (iterationType === kNoIterator || iterationType === kIsArray && val1.length === 0 || val1.size === 0)) { + return true; + } + if (memos === void 0) { + memos = { + val1: /* @__PURE__ */ new Map(), + val2: /* @__PURE__ */ new Map(), + position: 0 + }; + } else { + var val2MemoA = memos.val1.get(val1); + if (val2MemoA !== void 0) { + var val2MemoB = memos.val2.get(val2); + if (val2MemoB !== void 0) { + return val2MemoA === val2MemoB; + } + } + memos.position++; + } + memos.val1.set(val1, memos.position); + memos.val2.set(val2, memos.position); + var areEq = objEquiv(val1, val2, strict, aKeys, memos, iterationType); + memos.val1.delete(val1); + memos.val2.delete(val2); + return areEq; + } + function setHasEqualElement(set2, val1, strict, memo) { + var setValues = arrayFromSet(set2); + for (var i = 0; i < setValues.length; i++) { + var val2 = setValues[i]; + if (innerDeepEqual(val1, val2, strict, memo)) { + set2.delete(val2); + return true; + } + } + return false; + } + function findLooseMatchingPrimitives(prim) { + switch (_typeof2(prim)) { + case "undefined": + return null; + case "object": + return void 0; + case "symbol": + return false; + case "string": + prim = +prim; + // Loose equal entries exist only if the string is possible to convert to + // a regular number and not NaN. + // Fall through + case "number": + if (numberIsNaN(prim)) { + return false; + } + } + return true; + } + function setMightHaveLoosePrim(a, b, prim) { + var altValue = findLooseMatchingPrimitives(prim); + if (altValue != null) return altValue; + return b.has(altValue) && !a.has(altValue); + } + function mapMightHaveLoosePrim(a, b, prim, item, memo) { + var altValue = findLooseMatchingPrimitives(prim); + if (altValue != null) { + return altValue; + } + var curB = b.get(altValue); + if (curB === void 0 && !b.has(altValue) || !innerDeepEqual(item, curB, false, memo)) { + return false; + } + return !a.has(altValue) && innerDeepEqual(item, curB, false, memo); + } + function setEquiv(a, b, strict, memo) { + var set2 = null; + var aValues = arrayFromSet(a); + for (var i = 0; i < aValues.length; i++) { + var val = aValues[i]; + if (_typeof2(val) === "object" && val !== null) { + if (set2 === null) { + set2 = /* @__PURE__ */ new Set(); + } + set2.add(val); + } else if (!b.has(val)) { + if (strict) return false; + if (!setMightHaveLoosePrim(a, b, val)) { + return false; + } + if (set2 === null) { + set2 = /* @__PURE__ */ new Set(); + } + set2.add(val); + } + } + if (set2 !== null) { + var bValues = arrayFromSet(b); + for (var _i2 = 0; _i2 < bValues.length; _i2++) { + var _val = bValues[_i2]; + if (_typeof2(_val) === "object" && _val !== null) { + if (!setHasEqualElement(set2, _val, strict, memo)) return false; + } else if (!strict && !a.has(_val) && !setHasEqualElement(set2, _val, strict, memo)) { + return false; + } + } + return set2.size === 0; + } + return true; + } + function mapHasEqualEntry(set2, map2, key1, item1, strict, memo) { + var setValues = arrayFromSet(set2); + for (var i = 0; i < setValues.length; i++) { + var key2 = setValues[i]; + if (innerDeepEqual(key1, key2, strict, memo) && innerDeepEqual(item1, map2.get(key2), strict, memo)) { + set2.delete(key2); + return true; + } + } + return false; + } + function mapEquiv(a, b, strict, memo) { + var set2 = null; + var aEntries = arrayFromMap(a); + for (var i = 0; i < aEntries.length; i++) { + var _aEntries$i = _slicedToArray(aEntries[i], 2), key2 = _aEntries$i[0], item1 = _aEntries$i[1]; + if (_typeof2(key2) === "object" && key2 !== null) { + if (set2 === null) { + set2 = /* @__PURE__ */ new Set(); + } + set2.add(key2); + } else { + var item2 = b.get(key2); + if (item2 === void 0 && !b.has(key2) || !innerDeepEqual(item1, item2, strict, memo)) { + if (strict) return false; + if (!mapMightHaveLoosePrim(a, b, key2, item1, memo)) return false; + if (set2 === null) { + set2 = /* @__PURE__ */ new Set(); + } + set2.add(key2); + } + } + } + if (set2 !== null) { + var bEntries = arrayFromMap(b); + for (var _i2 = 0; _i2 < bEntries.length; _i2++) { + var _bEntries$_i = _slicedToArray(bEntries[_i2], 2), _key = _bEntries$_i[0], item = _bEntries$_i[1]; + if (_typeof2(_key) === "object" && _key !== null) { + if (!mapHasEqualEntry(set2, a, _key, item, strict, memo)) return false; + } else if (!strict && (!a.has(_key) || !innerDeepEqual(a.get(_key), item, false, memo)) && !mapHasEqualEntry(set2, a, _key, item, false, memo)) { + return false; + } + } + return set2.size === 0; + } + return true; + } + function objEquiv(a, b, strict, keys, memos, iterationType) { + var i = 0; + if (iterationType === kIsSet) { + if (!setEquiv(a, b, strict, memos)) { + return false; + } + } else if (iterationType === kIsMap) { + if (!mapEquiv(a, b, strict, memos)) { + return false; + } + } else if (iterationType === kIsArray) { + for (; i < a.length; i++) { + if (hasOwnProperty2(a, i)) { + if (!hasOwnProperty2(b, i) || !innerDeepEqual(a[i], b[i], strict, memos)) { + return false; + } + } else if (hasOwnProperty2(b, i)) { + return false; + } else { + var keysA = Object.keys(a); + for (; i < keysA.length; i++) { + var key2 = keysA[i]; + if (!hasOwnProperty2(b, key2) || !innerDeepEqual(a[key2], b[key2], strict, memos)) { + return false; + } + } + if (keysA.length !== Object.keys(b).length) { + return false; + } + return true; + } + } + } + for (i = 0; i < keys.length; i++) { + var _key2 = keys[i]; + if (!innerDeepEqual(a[_key2], b[_key2], strict, memos)) { + return false; + } + } + return true; + } + function isDeepEqual(val1, val2) { + return innerDeepEqual(val1, val2, kLoose); + } + function isDeepStrictEqual(val1, val2) { + return innerDeepEqual(val1, val2, kStrict); + } + comparisons = { + isDeepEqual, + isDeepStrictEqual + }; + return comparisons; +} +var hasRequiredAssert; +function requireAssert() { + if (hasRequiredAssert) return assert$1.exports; + hasRequiredAssert = 1; + function _typeof2(o) { + "@babel/helpers - typeof"; + return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof2(o); + } + function _createClass(Constructor, protoProps, staticProps) { + Object.defineProperty(Constructor, "prototype", { writable: false }); + return Constructor; + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + var _require = requireErrors$2(), _require$codes = _require.codes, ERR_AMBIGUOUS_ARGUMENT = _require$codes.ERR_AMBIGUOUS_ARGUMENT, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE = _require$codes.ERR_INVALID_ARG_VALUE, ERR_INVALID_RETURN_VALUE = _require$codes.ERR_INVALID_RETURN_VALUE, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS; + var AssertionError = requireAssertion_error(); + var _require2 = requireUtil$5(), inspect = _require2.inspect; + var _require$types = requireUtil$5().types, isPromise = _require$types.isPromise, isRegExp2 = _require$types.isRegExp; + var objectAssign = requirePolyfill$2()(); + var objectIs2 = requirePolyfill$1()(); + var RegExpPrototypeTest = requireCallBound$1()("RegExp.prototype.test"); + var isDeepEqual; + var isDeepStrictEqual; + function lazyLoadComparison() { + var comparison = requireComparisons(); + isDeepEqual = comparison.isDeepEqual; + isDeepStrictEqual = comparison.isDeepStrictEqual; + } + var warned = false; + var assert2 = assert$1.exports = ok; + var NO_EXCEPTION_SENTINEL = {}; + function innerFail(obj) { + if (obj.message instanceof Error) throw obj.message; + throw new AssertionError(obj); + } + function fail(actual, expected, message, operator, stackStartFn) { + var argsLen = arguments.length; + var internalMessage; + if (argsLen === 0) { + internalMessage = "Failed"; + } else if (argsLen === 1) { + message = actual; + actual = void 0; + } else { + if (warned === false) { + warned = true; + var warn2 = process.emitWarning ? process.emitWarning : console.warn.bind(console); + warn2("assert.fail() with more than one argument is deprecated. Please use assert.strictEqual() instead or only pass a message.", "DeprecationWarning", "DEP0094"); + } + if (argsLen === 2) operator = "!="; + } + if (message instanceof Error) throw message; + var errArgs = { + actual, + expected, + operator: operator === void 0 ? "fail" : operator, + stackStartFn: stackStartFn || fail + }; + if (message !== void 0) { + errArgs.message = message; + } + var err = new AssertionError(errArgs); + if (internalMessage) { + err.message = internalMessage; + err.generatedMessage = true; + } + throw err; + } + assert2.fail = fail; + assert2.AssertionError = AssertionError; + function innerOk(fn, argLen, value, message) { + if (!value) { + var generatedMessage = false; + if (argLen === 0) { + generatedMessage = true; + message = "No value argument passed to `assert.ok()`"; + } else if (message instanceof Error) { + throw message; + } + var err = new AssertionError({ + actual: value, + expected: true, + message, + operator: "==", + stackStartFn: fn + }); + err.generatedMessage = generatedMessage; + throw err; + } + } + function ok() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + innerOk.apply(void 0, [ok, args.length].concat(args)); + } + assert2.ok = ok; + assert2.equal = function equal(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (actual != expected) { + innerFail({ + actual, + expected, + message, + operator: "==", + stackStartFn: equal + }); + } + }; + assert2.notEqual = function notEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (actual == expected) { + innerFail({ + actual, + expected, + message, + operator: "!=", + stackStartFn: notEqual + }); + } + }; + assert2.deepEqual = function deepEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (isDeepEqual === void 0) lazyLoadComparison(); + if (!isDeepEqual(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: "deepEqual", + stackStartFn: deepEqual + }); + } + }; + assert2.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (isDeepEqual === void 0) lazyLoadComparison(); + if (isDeepEqual(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: "notDeepEqual", + stackStartFn: notDeepEqual + }); + } + }; + assert2.deepStrictEqual = function deepStrictEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (isDeepEqual === void 0) lazyLoadComparison(); + if (!isDeepStrictEqual(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: "deepStrictEqual", + stackStartFn: deepStrictEqual + }); + } + }; + assert2.notDeepStrictEqual = notDeepStrictEqual; + function notDeepStrictEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (isDeepEqual === void 0) lazyLoadComparison(); + if (isDeepStrictEqual(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: "notDeepStrictEqual", + stackStartFn: notDeepStrictEqual + }); + } + } + assert2.strictEqual = function strictEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (!objectIs2(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: "strictEqual", + stackStartFn: strictEqual + }); + } + }; + assert2.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS("actual", "expected"); + } + if (objectIs2(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: "notStrictEqual", + stackStartFn: notStrictEqual + }); + } + }; + var Comparison = /* @__PURE__ */ _createClass(function Comparison2(obj, keys, actual) { + var _this = this; + _classCallCheck(this, Comparison2); + keys.forEach(function(key2) { + if (key2 in obj) { + if (actual !== void 0 && typeof actual[key2] === "string" && isRegExp2(obj[key2]) && RegExpPrototypeTest(obj[key2], actual[key2])) { + _this[key2] = actual[key2]; + } else { + _this[key2] = obj[key2]; + } + } + }); + }); + function compareExceptionKey(actual, expected, key2, message, keys, fn) { + if (!(key2 in actual) || !isDeepStrictEqual(actual[key2], expected[key2])) { + if (!message) { + var a = new Comparison(actual, keys); + var b = new Comparison(expected, keys, actual); + var err = new AssertionError({ + actual: a, + expected: b, + operator: "deepStrictEqual", + stackStartFn: fn + }); + err.actual = actual; + err.expected = expected; + err.operator = fn.name; + throw err; + } + innerFail({ + actual, + expected, + message, + operator: fn.name, + stackStartFn: fn + }); + } + } + function expectedException(actual, expected, msg, fn) { + if (typeof expected !== "function") { + if (isRegExp2(expected)) return RegExpPrototypeTest(expected, actual); + if (arguments.length === 2) { + throw new ERR_INVALID_ARG_TYPE2("expected", ["Function", "RegExp"], expected); + } + if (_typeof2(actual) !== "object" || actual === null) { + var err = new AssertionError({ + actual, + expected, + message: msg, + operator: "deepStrictEqual", + stackStartFn: fn + }); + err.operator = fn.name; + throw err; + } + var keys = Object.keys(expected); + if (expected instanceof Error) { + keys.push("name", "message"); + } else if (keys.length === 0) { + throw new ERR_INVALID_ARG_VALUE("error", expected, "may not be an empty object"); + } + if (isDeepEqual === void 0) lazyLoadComparison(); + keys.forEach(function(key2) { + if (typeof actual[key2] === "string" && isRegExp2(expected[key2]) && RegExpPrototypeTest(expected[key2], actual[key2])) { + return; + } + compareExceptionKey(actual, expected, key2, msg, keys, fn); + }); + return true; + } + if (expected.prototype !== void 0 && actual instanceof expected) { + return true; + } + if (Error.isPrototypeOf(expected)) { + return false; + } + return expected.call({}, actual) === true; + } + function getActual(fn) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("fn", "Function", fn); + } + try { + fn(); + } catch (e) { + return e; + } + return NO_EXCEPTION_SENTINEL; + } + function checkIsPromise(obj) { + return isPromise(obj) || obj !== null && _typeof2(obj) === "object" && typeof obj.then === "function" && typeof obj.catch === "function"; + } + function waitForActual(promiseFn) { + return Promise.resolve().then(function() { + var resultPromise; + if (typeof promiseFn === "function") { + resultPromise = promiseFn(); + if (!checkIsPromise(resultPromise)) { + throw new ERR_INVALID_RETURN_VALUE("instance of Promise", "promiseFn", resultPromise); + } + } else if (checkIsPromise(promiseFn)) { + resultPromise = promiseFn; + } else { + throw new ERR_INVALID_ARG_TYPE2("promiseFn", ["Function", "Promise"], promiseFn); + } + return Promise.resolve().then(function() { + return resultPromise; + }).then(function() { + return NO_EXCEPTION_SENTINEL; + }).catch(function(e) { + return e; + }); + }); + } + function expectsError(stackStartFn, actual, error2, message) { + if (typeof error2 === "string") { + if (arguments.length === 4) { + throw new ERR_INVALID_ARG_TYPE2("error", ["Object", "Error", "Function", "RegExp"], error2); + } + if (_typeof2(actual) === "object" && actual !== null) { + if (actual.message === error2) { + throw new ERR_AMBIGUOUS_ARGUMENT("error/message", 'The error message "'.concat(actual.message, '" is identical to the message.')); + } + } else if (actual === error2) { + throw new ERR_AMBIGUOUS_ARGUMENT("error/message", 'The error "'.concat(actual, '" is identical to the message.')); + } + message = error2; + error2 = void 0; + } else if (error2 != null && _typeof2(error2) !== "object" && typeof error2 !== "function") { + throw new ERR_INVALID_ARG_TYPE2("error", ["Object", "Error", "Function", "RegExp"], error2); + } + if (actual === NO_EXCEPTION_SENTINEL) { + var details = ""; + if (error2 && error2.name) { + details += " (".concat(error2.name, ")"); + } + details += message ? ": ".concat(message) : "."; + var fnType = stackStartFn.name === "rejects" ? "rejection" : "exception"; + innerFail({ + actual: void 0, + expected: error2, + operator: stackStartFn.name, + message: "Missing expected ".concat(fnType).concat(details), + stackStartFn + }); + } + if (error2 && !expectedException(actual, error2, message, stackStartFn)) { + throw actual; + } + } + function expectsNoError(stackStartFn, actual, error2, message) { + if (actual === NO_EXCEPTION_SENTINEL) return; + if (typeof error2 === "string") { + message = error2; + error2 = void 0; + } + if (!error2 || expectedException(actual, error2)) { + var details = message ? ": ".concat(message) : "."; + var fnType = stackStartFn.name === "doesNotReject" ? "rejection" : "exception"; + innerFail({ + actual, + expected: error2, + operator: stackStartFn.name, + message: "Got unwanted ".concat(fnType).concat(details, "\n") + 'Actual message: "'.concat(actual && actual.message, '"'), + stackStartFn + }); + } + throw actual; + } + assert2.throws = function throws(promiseFn) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + expectsError.apply(void 0, [throws, getActual(promiseFn)].concat(args)); + }; + assert2.rejects = function rejects(promiseFn) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + args[_key3 - 1] = arguments[_key3]; + } + return waitForActual(promiseFn).then(function(result) { + return expectsError.apply(void 0, [rejects, result].concat(args)); + }); + }; + assert2.doesNotThrow = function doesNotThrow(fn) { + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + args[_key4 - 1] = arguments[_key4]; + } + expectsNoError.apply(void 0, [doesNotThrow, getActual(fn)].concat(args)); + }; + assert2.doesNotReject = function doesNotReject(fn) { + for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + args[_key5 - 1] = arguments[_key5]; + } + return waitForActual(fn).then(function(result) { + return expectsNoError.apply(void 0, [doesNotReject, result].concat(args)); + }); + }; + assert2.ifError = function ifError(err) { + if (err !== null && err !== void 0) { + var message = "ifError got unwanted exception: "; + if (_typeof2(err) === "object" && typeof err.message === "string") { + if (err.message.length === 0 && err.constructor) { + message += err.constructor.name; + } else { + message += err.message; + } + } else { + message += inspect(err); + } + var newErr = new AssertionError({ + actual: err, + expected: null, + operator: "ifError", + message, + stackStartFn: ifError + }); + var origStack = err.stack; + if (typeof origStack === "string") { + var tmp2 = origStack.split("\n"); + tmp2.shift(); + var tmp1 = newErr.stack.split("\n"); + for (var i = 0; i < tmp2.length; i++) { + var pos = tmp1.indexOf(tmp2[i]); + if (pos !== -1) { + tmp1 = tmp1.slice(0, pos); + break; + } + } + newErr.stack = "".concat(tmp1.join("\n"), "\n").concat(tmp2.join("\n")); + } + throw newErr; + } + }; + function internalMatch(string2, regexp, message, fn, fnName) { + if (!isRegExp2(regexp)) { + throw new ERR_INVALID_ARG_TYPE2("regexp", "RegExp", regexp); + } + var match = fnName === "match"; + if (typeof string2 !== "string" || RegExpPrototypeTest(regexp, string2) !== match) { + if (message instanceof Error) { + throw message; + } + var generatedMessage = !message; + message = message || (typeof string2 !== "string" ? 'The "string" argument must be of type string. Received type ' + "".concat(_typeof2(string2), " (").concat(inspect(string2), ")") : (match ? "The input did not match the regular expression " : "The input was expected to not match the regular expression ") + "".concat(inspect(regexp), ". Input:\n\n").concat(inspect(string2), "\n")); + var err = new AssertionError({ + actual: string2, + expected: regexp, + message, + operator: fnName, + stackStartFn: fn + }); + err.generatedMessage = generatedMessage; + throw err; + } + } + assert2.match = function match(string2, regexp, message) { + internalMatch(string2, regexp, message, match, "match"); + }; + assert2.doesNotMatch = function doesNotMatch(string2, regexp, message) { + internalMatch(string2, regexp, message, doesNotMatch, "doesNotMatch"); + }; + function strict() { + for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { + args[_key6] = arguments[_key6]; + } + innerOk.apply(void 0, [strict, args.length].concat(args)); + } + assert2.strict = objectAssign(strict, assert2, { + equal: assert2.strictEqual, + deepEqual: assert2.deepStrictEqual, + notEqual: assert2.notStrictEqual, + notDeepEqual: assert2.notDeepStrictEqual + }); + assert2.strict.strict = assert2.strict; + return assert$1.exports; +} +var hasRequiredErrors$1; +function requireErrors$1() { + if (hasRequiredErrors$1) return errors$3; + hasRequiredErrors$1 = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.E = exports.AssertionError = exports.message = exports.RangeError = exports.TypeError = exports.Error = void 0; + const assert2 = requireAssert(); + const util2 = requireUtil$5(); + const kCode = typeof Symbol === "undefined" ? "_kCode" : Symbol("code"); + const messages2 = {}; + function makeNodeError(Base) { + return class NodeError extends Base { + constructor(key2, ...args) { + super(message(key2, args)); + this.code = key2; + this[kCode] = key2; + this.name = `${super.name} [${this[kCode]}]`; + } + }; + } + const g = typeof globalThis !== "undefined" ? globalThis : commonjsGlobal; + class AssertionError extends g.Error { + constructor(options2) { + if (typeof options2 !== "object" || options2 === null) { + throw new exports.TypeError("ERR_INVALID_ARG_TYPE", "options", "object"); + } + if (options2.message) { + super(options2.message); + } else { + super(`${util2.inspect(options2.actual).slice(0, 128)} ${options2.operator} ${util2.inspect(options2.expected).slice(0, 128)}`); + } + this.generatedMessage = !options2.message; + this.name = "AssertionError [ERR_ASSERTION]"; + this.code = "ERR_ASSERTION"; + this.actual = options2.actual; + this.expected = options2.expected; + this.operator = options2.operator; + exports.Error.captureStackTrace(this, options2.stackStartFunction); + } + } + exports.AssertionError = AssertionError; + function message(key2, args) { + assert2.strictEqual(typeof key2, "string"); + const msg = messages2[key2]; + assert2(msg, `An invalid error message key was used: ${key2}.`); + let fmt; + if (typeof msg === "function") { + fmt = msg; + } else { + fmt = util2.format; + if (args === void 0 || args.length === 0) + return msg; + args.unshift(msg); + } + return String(fmt.apply(null, args)); + } + exports.message = message; + function E(sym, val) { + messages2[sym] = typeof val === "function" ? val : String(val); + } + exports.E = E; + exports.Error = makeNodeError(g.Error); + exports.TypeError = makeNodeError(g.TypeError); + exports.RangeError = makeNodeError(g.RangeError); + E("ERR_ARG_NOT_ITERABLE", "%s must be iterable"); + E("ERR_ASSERTION", "%s"); + E("ERR_BUFFER_OUT_OF_BOUNDS", bufferOutOfBounds); + E("ERR_CHILD_CLOSED_BEFORE_REPLY", "Child closed before reply received"); + E("ERR_CONSOLE_WRITABLE_STREAM", "Console expects a writable stream instance for %s"); + E("ERR_CPU_USAGE", "Unable to obtain cpu usage %s"); + E("ERR_DNS_SET_SERVERS_FAILED", (err, servers) => `c-ares failed to set servers: "${err}" [${servers}]`); + E("ERR_FALSY_VALUE_REJECTION", "Promise was rejected with falsy value"); + E("ERR_ENCODING_NOT_SUPPORTED", (enc) => `The "${enc}" encoding is not supported`); + E("ERR_ENCODING_INVALID_ENCODED_DATA", (enc) => `The encoded data was not valid for encoding ${enc}`); + E("ERR_HTTP_HEADERS_SENT", "Cannot render headers after they are sent to the client"); + E("ERR_HTTP_INVALID_STATUS_CODE", "Invalid status code: %s"); + E("ERR_HTTP_TRAILER_INVALID", "Trailers are invalid with this transfer encoding"); + E("ERR_INDEX_OUT_OF_RANGE", "Index out of range"); + E("ERR_INVALID_ARG_TYPE", invalidArgType); + E("ERR_INVALID_ARRAY_LENGTH", (name, len, actual) => { + assert2.strictEqual(typeof actual, "number"); + return `The array "${name}" (length ${actual}) must be of length ${len}.`; + }); + E("ERR_INVALID_BUFFER_SIZE", "Buffer size must be a multiple of %s"); + E("ERR_INVALID_CALLBACK", "Callback must be a function"); + E("ERR_INVALID_CHAR", "Invalid character in %s"); + E("ERR_INVALID_CURSOR_POS", "Cannot set cursor row without setting its column"); + E("ERR_INVALID_FD", '"fd" must be a positive integer: %s'); + E("ERR_INVALID_FILE_URL_HOST", 'File URL host must be "localhost" or empty on %s'); + E("ERR_INVALID_FILE_URL_PATH", "File URL path %s"); + E("ERR_INVALID_HANDLE_TYPE", "This handle type cannot be sent"); + E("ERR_INVALID_IP_ADDRESS", "Invalid IP address: %s"); + E("ERR_INVALID_OPT_VALUE", (name, value) => { + return `The value "${String(value)}" is invalid for option "${name}"`; + }); + E("ERR_INVALID_OPT_VALUE_ENCODING", (value) => `The value "${String(value)}" is invalid for option "encoding"`); + E("ERR_INVALID_REPL_EVAL_CONFIG", 'Cannot specify both "breakEvalOnSigint" and "eval" for REPL'); + E("ERR_INVALID_SYNC_FORK_INPUT", "Asynchronous forks do not support Buffer, Uint8Array or string input: %s"); + E("ERR_INVALID_THIS", 'Value of "this" must be of type %s'); + E("ERR_INVALID_TUPLE", "%s must be an iterable %s tuple"); + E("ERR_INVALID_URL", "Invalid URL: %s"); + E("ERR_INVALID_URL_SCHEME", (expected) => `The URL must be ${oneOf(expected, "scheme")}`); + E("ERR_IPC_CHANNEL_CLOSED", "Channel closed"); + E("ERR_IPC_DISCONNECTED", "IPC channel is already disconnected"); + E("ERR_IPC_ONE_PIPE", "Child process can have only one IPC pipe"); + E("ERR_IPC_SYNC_FORK", "IPC cannot be used with synchronous forks"); + E("ERR_MISSING_ARGS", missingArgs); + E("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"); + E("ERR_NAPI_CONS_FUNCTION", "Constructor must be a function"); + E("ERR_NAPI_CONS_PROTOTYPE_OBJECT", "Constructor.prototype must be an object"); + E("ERR_NO_CRYPTO", "Node.js is not compiled with OpenSSL crypto support"); + E("ERR_NO_LONGER_SUPPORTED", "%s is no longer supported"); + E("ERR_PARSE_HISTORY_DATA", "Could not parse history data in %s"); + E("ERR_SOCKET_ALREADY_BOUND", "Socket is already bound"); + E("ERR_SOCKET_BAD_PORT", "Port should be > 0 and < 65536"); + E("ERR_SOCKET_BAD_TYPE", "Bad socket type specified. Valid types are: udp4, udp6"); + E("ERR_SOCKET_CANNOT_SEND", "Unable to send data"); + E("ERR_SOCKET_CLOSED", "Socket is closed"); + E("ERR_SOCKET_DGRAM_NOT_RUNNING", "Not running"); + E("ERR_STDERR_CLOSE", "process.stderr cannot be closed"); + E("ERR_STDOUT_CLOSE", "process.stdout cannot be closed"); + E("ERR_STREAM_WRAP", "Stream has StringDecoder set or is in objectMode"); + E("ERR_TLS_CERT_ALTNAME_INVALID", "Hostname/IP does not match certificate's altnames: %s"); + E("ERR_TLS_DH_PARAM_SIZE", (size) => `DH parameter size ${size} is less than 2048`); + E("ERR_TLS_HANDSHAKE_TIMEOUT", "TLS handshake timeout"); + E("ERR_TLS_RENEGOTIATION_FAILED", "Failed to renegotiate"); + E("ERR_TLS_REQUIRED_SERVER_NAME", '"servername" is required parameter for Server.addContext'); + E("ERR_TLS_SESSION_ATTACK", "TSL session renegotiation attack detected"); + E("ERR_TRANSFORM_ALREADY_TRANSFORMING", "Calling transform done when still transforming"); + E("ERR_TRANSFORM_WITH_LENGTH_0", "Calling transform done when writableState.length != 0"); + E("ERR_UNKNOWN_ENCODING", "Unknown encoding: %s"); + E("ERR_UNKNOWN_SIGNAL", "Unknown signal: %s"); + E("ERR_UNKNOWN_STDIN_TYPE", "Unknown stdin file type"); + E("ERR_UNKNOWN_STREAM_TYPE", "Unknown stream file type"); + E("ERR_V8BREAKITERATOR", "Full ICU data not installed. See https://github.com/nodejs/node/wiki/Intl"); + function invalidArgType(name, expected, actual) { + assert2(name, "name is required"); + let determiner; + if (expected.includes("not ")) { + determiner = "must not be"; + expected = expected.split("not ")[1]; + } else { + determiner = "must be"; + } + let msg; + if (Array.isArray(name)) { + const names = name.map((val) => `"${val}"`).join(", "); + msg = `The ${names} arguments ${determiner} ${oneOf(expected, "type")}`; + } else if (name.includes(" argument")) { + msg = `The ${name} ${determiner} ${oneOf(expected, "type")}`; + } else { + const type2 = name.includes(".") ? "property" : "argument"; + msg = `The "${name}" ${type2} ${determiner} ${oneOf(expected, "type")}`; + } + if (arguments.length >= 3) { + msg += `. Received type ${actual !== null ? typeof actual : "null"}`; + } + return msg; + } + function missingArgs(...args) { + assert2(args.length > 0, "At least one arg needs to be specified"); + let msg = "The "; + const len = args.length; + args = args.map((a) => `"${a}"`); + switch (len) { + case 1: + msg += `${args[0]} argument`; + break; + case 2: + msg += `${args[0]} and ${args[1]} arguments`; + break; + default: + msg += args.slice(0, len - 1).join(", "); + msg += `, and ${args[len - 1]} arguments`; + break; + } + return `${msg} must be specified`; + } + function oneOf(expected, thing) { + assert2(expected, "expected is required"); + assert2(typeof thing === "string", "thing is required"); + if (Array.isArray(expected)) { + const len = expected.length; + assert2(len > 0, "At least one expected value needs to be specified"); + expected = expected.map((i) => String(i)); + if (len > 2) { + return `one of ${thing} ${expected.slice(0, len - 1).join(", ")}, or ` + expected[len - 1]; + } else if (len === 2) { + return `one of ${thing} ${expected[0]} or ${expected[1]}`; + } else { + return `of ${thing} ${expected[0]}`; + } + } else { + return `of ${thing} ${String(expected)}`; + } + } + function bufferOutOfBounds(name, isWriting) { + if (isWriting) { + return "Attempt to write outside buffer bounds"; + } else { + return `"${name}" is outside of buffer bounds`; + } + } + })(errors$3); + return errors$3; +} +var hasRequiredEncoding; +function requireEncoding() { + if (hasRequiredEncoding) return encoding; + hasRequiredEncoding = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.strToEncoding = exports.assertEncoding = exports.ENCODING_UTF8 = void 0; + const buffer_1 = requireBuffer$1(); + const errors2 = requireErrors$1(); + exports.ENCODING_UTF8 = "utf8"; + function assertEncoding(encoding2) { + if (encoding2 && !buffer_1.Buffer.isEncoding(encoding2)) + throw new errors2.TypeError("ERR_INVALID_OPT_VALUE_ENCODING", encoding2); + } + exports.assertEncoding = assertEncoding; + function strToEncoding(str, encoding2) { + if (!encoding2 || encoding2 === exports.ENCODING_UTF8) + return str; + if (encoding2 === "buffer") + return new buffer_1.Buffer(str); + return new buffer_1.Buffer(str).toString(encoding2); + } + exports.strToEncoding = strToEncoding; + })(encoding); + return encoding; +} +var hasRequiredDirent; +function requireDirent() { + if (hasRequiredDirent) return Dirent$1; + hasRequiredDirent = 1; + Object.defineProperty(Dirent$1, "__esModule", { value: true }); + Dirent$1.Dirent = void 0; + const constants_1 = requireConstants$7(); + const encoding_1 = requireEncoding(); + const { S_IFMT, S_IFDIR, S_IFREG, S_IFBLK, S_IFCHR, S_IFLNK, S_IFIFO, S_IFSOCK } = constants_1.constants; + class Dirent2 { + constructor() { + this.name = ""; + this.path = ""; + this.mode = 0; + } + static build(link2, encoding2) { + const dirent = new Dirent2(); + const { mode } = link2.getNode(); + dirent.name = (0, encoding_1.strToEncoding)(link2.getName(), encoding2); + dirent.mode = mode; + dirent.path = link2.getPath(); + return dirent; + } + _checkModeProperty(property) { + return (this.mode & S_IFMT) === property; + } + isDirectory() { + return this._checkModeProperty(S_IFDIR); + } + isFile() { + return this._checkModeProperty(S_IFREG); + } + isBlockDevice() { + return this._checkModeProperty(S_IFBLK); + } + isCharacterDevice() { + return this._checkModeProperty(S_IFCHR); + } + isSymbolicLink() { + return this._checkModeProperty(S_IFLNK); + } + isFIFO() { + return this._checkModeProperty(S_IFIFO); + } + isSocket() { + return this._checkModeProperty(S_IFSOCK); + } + } + Dirent$1.Dirent = Dirent2; + Dirent$1.default = Dirent2; + return Dirent$1; +} +var volume = {}; +var path$1 = { exports: {} }; +var util$5 = {}; +var isBufferBrowser; +var hasRequiredIsBufferBrowser; +function requireIsBufferBrowser() { + if (hasRequiredIsBufferBrowser) return isBufferBrowser; + hasRequiredIsBufferBrowser = 1; + isBufferBrowser = function isBuffer(arg) { + return arg && typeof arg === "object" && typeof arg.copy === "function" && typeof arg.fill === "function" && typeof arg.readUInt8 === "function"; + }; + return isBufferBrowser; +} +var inherits_browser = { exports: {} }; +var hasRequiredInherits_browser; +function requireInherits_browser() { + if (hasRequiredInherits_browser) return inherits_browser.exports; + hasRequiredInherits_browser = 1; + if (typeof Object.create === "function") { + inherits_browser.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; + } else { + inherits_browser.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; + } + return inherits_browser.exports; +} +var hasRequiredUtil$4; +function requireUtil$4() { + if (hasRequiredUtil$4) return util$5; + hasRequiredUtil$4 = 1; + (function(exports) { + var formatRegExp = /%[sdj%]/g; + exports.format = function(f) { + if (!isString2(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(" "); + } + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x2) { + if (x2 === "%%") return "%"; + if (i >= len) return x2; + switch (x2) { + case "%s": + return String(args[i++]); + case "%d": + return Number(args[i++]); + case "%j": + try { + return JSON.stringify(args[i++]); + } catch (_) { + return "[Circular]"; + } + default: + return x2; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject2(x)) { + str += " " + x; + } else { + str += " " + inspect(x); + } + } + return str; + }; + exports.deprecate = function(fn, msg) { + if (isUndefined(commonjsGlobal.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + if (process.noDeprecation === true) { + return fn; + } + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + return deprecated; + }; + var debugs = {}; + var debugEnviron; + exports.debuglog = function(set2) { + if (isUndefined(debugEnviron)) + debugEnviron = define_process_env_default.NODE_DEBUG || ""; + set2 = set2.toUpperCase(); + if (!debugs[set2]) { + if (new RegExp("\\b" + set2 + "\\b", "i").test(debugEnviron)) { + var pid = process.pid; + debugs[set2] = function() { + var msg = exports.format.apply(exports, arguments); + console.error("%s %d: %s", set2, pid, msg); + }; + } else { + debugs[set2] = function() { + }; + } + } + return debugs[set2]; + }; + function inspect(obj, opts) { + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + ctx.showHidden = opts; + } else if (opts) { + exports._extend(ctx, opts); + } + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue2(ctx, obj, ctx.depth); + } + exports.inspect = inspect; + inspect.colors = { + "bold": [1, 22], + "italic": [3, 23], + "underline": [4, 24], + "inverse": [7, 27], + "white": [37, 39], + "grey": [90, 39], + "black": [30, 39], + "blue": [34, 39], + "cyan": [36, 39], + "green": [32, 39], + "magenta": [35, 39], + "red": [31, 39], + "yellow": [33, 39] + }; + inspect.styles = { + "special": "cyan", + "number": "yellow", + "boolean": "yellow", + "undefined": "grey", + "null": "bold", + "string": "green", + "date": "magenta", + // "name": intentionally not styling + "regexp": "red" + }; + function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + if (style) { + return "\x1B[" + inspect.colors[style][0] + "m" + str + "\x1B[" + inspect.colors[style][1] + "m"; + } else { + return str; + } + } + function stylizeNoColor(str, styleType) { + return str; + } + function arrayToHash(array) { + var hash2 = {}; + array.forEach(function(val, idx) { + hash2[val] = true; + }); + return hash2; + } + function formatValue2(ctx, value, recurseTimes) { + if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString2(ret)) { + ret = formatValue2(ctx, ret, recurseTimes); + } + return ret; + } + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + if (isError2(value) && (keys.indexOf("message") >= 0 || keys.indexOf("description") >= 0)) { + return formatError(value); + } + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ": " + value.name : ""; + return ctx.stylize("[Function" + name + "]", "special"); + } + if (isRegExp2(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), "regexp"); + } + if (isDate2(value)) { + return ctx.stylize(Date.prototype.toString.call(value), "date"); + } + if (isError2(value)) { + return formatError(value); + } + } + var base2 = "", array = false, braces = ["{", "}"]; + if (isArray2(value)) { + array = true; + braces = ["[", "]"]; + } + if (isFunction(value)) { + var n = value.name ? ": " + value.name : ""; + base2 = " [Function" + n + "]"; + } + if (isRegExp2(value)) { + base2 = " " + RegExp.prototype.toString.call(value); + } + if (isDate2(value)) { + base2 = " " + Date.prototype.toUTCString.call(value); + } + if (isError2(value)) { + base2 = " " + formatError(value); + } + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base2 + braces[1]; + } + if (recurseTimes < 0) { + if (isRegExp2(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), "regexp"); + } else { + return ctx.stylize("[Object]", "special"); + } + } + ctx.seen.push(value); + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key2) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key2, array); + }); + } + ctx.seen.pop(); + return reduceToSingleString(output, base2, braces); + } + function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize("undefined", "undefined"); + if (isString2(value)) { + var simple = "'" + JSON.stringify(value).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'"; + return ctx.stylize(simple, "string"); + } + if (isNumber(value)) + return ctx.stylize("" + value, "number"); + if (isBoolean(value)) + return ctx.stylize("" + value, "boolean"); + if (isNull(value)) + return ctx.stylize("null", "null"); + } + function formatError(value) { + return "[" + Error.prototype.toString.call(value) + "]"; + } + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty2(value, String(i))) { + output.push(formatProperty( + ctx, + value, + recurseTimes, + visibleKeys, + String(i), + true + )); + } else { + output.push(""); + } + } + keys.forEach(function(key2) { + if (!key2.match(/^\d+$/)) { + output.push(formatProperty( + ctx, + value, + recurseTimes, + visibleKeys, + key2, + true + )); + } + }); + return output; + } + function formatProperty(ctx, value, recurseTimes, visibleKeys, key2, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key2) || { value: value[key2] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize("[Getter/Setter]", "special"); + } else { + str = ctx.stylize("[Getter]", "special"); + } + } else { + if (desc.set) { + str = ctx.stylize("[Setter]", "special"); + } + } + if (!hasOwnProperty2(visibleKeys, key2)) { + name = "[" + key2 + "]"; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue2(ctx, desc.value, null); + } else { + str = formatValue2(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf("\n") > -1) { + if (array) { + str = str.split("\n").map(function(line) { + return " " + line; + }).join("\n").substr(2); + } else { + str = "\n" + str.split("\n").map(function(line) { + return " " + line; + }).join("\n"); + } + } + } else { + str = ctx.stylize("[Circular]", "special"); + } + } + if (isUndefined(name)) { + if (array && key2.match(/^\d+$/)) { + return str; + } + name = JSON.stringify("" + key2); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, "name"); + } else { + name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, "string"); + } + } + return name + ": " + str; + } + function reduceToSingleString(output, base2, braces) { + var length = output.reduce(function(prev, cur) { + if (cur.indexOf("\n") >= 0) ; + return prev + cur.replace(/\u001b\[\d\d?m/g, "").length + 1; + }, 0); + if (length > 60) { + return braces[0] + (base2 === "" ? "" : base2 + "\n ") + " " + output.join(",\n ") + " " + braces[1]; + } + return braces[0] + base2 + " " + output.join(", ") + " " + braces[1]; + } + function isArray2(ar) { + return Array.isArray(ar); + } + exports.isArray = isArray2; + function isBoolean(arg) { + return typeof arg === "boolean"; + } + exports.isBoolean = isBoolean; + function isNull(arg) { + return arg === null; + } + exports.isNull = isNull; + function isNullOrUndefined(arg) { + return arg == null; + } + exports.isNullOrUndefined = isNullOrUndefined; + function isNumber(arg) { + return typeof arg === "number"; + } + exports.isNumber = isNumber; + function isString2(arg) { + return typeof arg === "string"; + } + exports.isString = isString2; + function isSymbol(arg) { + return typeof arg === "symbol"; + } + exports.isSymbol = isSymbol; + function isUndefined(arg) { + return arg === void 0; + } + exports.isUndefined = isUndefined; + function isRegExp2(re2) { + return isObject2(re2) && objectToString(re2) === "[object RegExp]"; + } + exports.isRegExp = isRegExp2; + function isObject2(arg) { + return typeof arg === "object" && arg !== null; + } + exports.isObject = isObject2; + function isDate2(d) { + return isObject2(d) && objectToString(d) === "[object Date]"; + } + exports.isDate = isDate2; + function isError2(e) { + return isObject2(e) && (objectToString(e) === "[object Error]" || e instanceof Error); + } + exports.isError = isError2; + function isFunction(arg) { + return typeof arg === "function"; + } + exports.isFunction = isFunction; + function isPrimitive(arg) { + return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || // ES6 symbol + typeof arg === "undefined"; + } + exports.isPrimitive = isPrimitive; + exports.isBuffer = requireIsBufferBrowser(); + function objectToString(o) { + return Object.prototype.toString.call(o); + } + function pad(n) { + return n < 10 ? "0" + n.toString(10) : n.toString(10); + } + var months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + function timestamp2() { + var d = /* @__PURE__ */ new Date(); + var time = [ + pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds()) + ].join(":"); + return [d.getDate(), months[d.getMonth()], time].join(" "); + } + exports.log = function() { + console.log("%s - %s", timestamp2(), exports.format.apply(exports, arguments)); + }; + exports.inherits = requireInherits_browser(); + exports._extend = function(origin, add) { + if (!add || !isObject2(add)) return origin; + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + }; + function hasOwnProperty2(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + })(util$5); + return util$5; +} +var hasRequiredPath; +function requirePath() { + if (hasRequiredPath) return path$1.exports; + hasRequiredPath = 1; + var isWindows = process.platform === "win32"; + var util2 = requireUtil$4(); + function normalizeArray(parts, allowAboveRoot) { + var res = []; + for (var i = 0; i < parts.length; i++) { + var p = parts[i]; + if (!p || p === ".") + continue; + if (p === "..") { + if (res.length && res[res.length - 1] !== "..") { + res.pop(); + } else if (allowAboveRoot) { + res.push(".."); + } + } else { + res.push(p); + } + } + return res; + } + function trimArray(arr) { + var lastIndex = arr.length - 1; + var start = 0; + for (; start <= lastIndex; start++) { + if (arr[start]) + break; + } + var end = lastIndex; + for (; end >= 0; end--) { + if (arr[end]) + break; + } + if (start === 0 && end === lastIndex) + return arr; + if (start > end) + return []; + return arr.slice(start, end + 1); + } + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var splitTailRe = /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; + var win32 = {}; + function win32SplitPath(filename) { + var result = splitDeviceRe.exec(filename), device = (result[1] || "") + (result[2] || ""), tail = result[3] || ""; + var result2 = splitTailRe.exec(tail), dir = result2[1], basename = result2[2], ext = result2[3]; + return [device, dir, basename, ext]; + } + function win32StatPath(path2) { + var result = splitDeviceRe.exec(path2), device = result[1] || "", isUnc = !!device && device[1] !== ":"; + return { + device, + isUnc, + isAbsolute: isUnc || !!result[2], + // UNC paths are always absolute + tail: result[3] + }; + } + function normalizeUNCRoot(device) { + return "\\\\" + device.replace(/^[\\\/]+/, "").replace(/[\\\/]+/g, "\\"); + } + win32.resolve = function() { + var resolvedDevice = "", resolvedTail = "", resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1; i--) { + var path2; + if (i >= 0) { + path2 = arguments[i]; + } else if (!resolvedDevice) { + path2 = process.cwd(); + } else { + path2 = define_process_env_default["=" + resolvedDevice]; + if (!path2 || path2.substr(0, 3).toLowerCase() !== resolvedDevice.toLowerCase() + "\\") { + path2 = resolvedDevice + "\\"; + } + } + if (!util2.isString(path2)) { + throw new TypeError("Arguments to path.resolve must be strings"); + } else if (!path2) { + continue; + } + var result = win32StatPath(path2), device = result.device, isUnc = result.isUnc, isAbsolute = result.isAbsolute, tail = result.tail; + if (device && resolvedDevice && device.toLowerCase() !== resolvedDevice.toLowerCase()) { + continue; + } + if (!resolvedDevice) { + resolvedDevice = device; + } + if (!resolvedAbsolute) { + resolvedTail = tail + "\\" + resolvedTail; + resolvedAbsolute = isAbsolute; + } + if (resolvedDevice && resolvedAbsolute) { + break; + } + } + if (isUnc) { + resolvedDevice = normalizeUNCRoot(resolvedDevice); + } + resolvedTail = normalizeArray( + resolvedTail.split(/[\\\/]+/), + !resolvedAbsolute + ).join("\\"); + return resolvedDevice + (resolvedAbsolute ? "\\" : "") + resolvedTail || "."; + }; + win32.normalize = function(path2) { + var result = win32StatPath(path2), device = result.device, isUnc = result.isUnc, isAbsolute = result.isAbsolute, tail = result.tail, trailingSlash = /[\\\/]$/.test(tail); + tail = normalizeArray(tail.split(/[\\\/]+/), !isAbsolute).join("\\"); + if (!tail && !isAbsolute) { + tail = "."; + } + if (tail && trailingSlash) { + tail += "\\"; + } + if (isUnc) { + device = normalizeUNCRoot(device); + } + return device + (isAbsolute ? "\\" : "") + tail; + }; + win32.isAbsolute = function(path2) { + return win32StatPath(path2).isAbsolute; + }; + win32.join = function() { + var paths = []; + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!util2.isString(arg)) { + throw new TypeError("Arguments to path.join must be strings"); + } + if (arg) { + paths.push(arg); + } + } + var joined = paths.join("\\"); + if (!/^[\\\/]{2}[^\\\/]/.test(paths[0])) { + joined = joined.replace(/^[\\\/]{2,}/, "\\"); + } + return win32.normalize(joined); + }; + win32.relative = function(from2, to) { + from2 = win32.resolve(from2); + to = win32.resolve(to); + var lowerFrom = from2.toLowerCase(); + var lowerTo = to.toLowerCase(); + var toParts = trimArray(to.split("\\")); + var lowerFromParts = trimArray(lowerFrom.split("\\")); + var lowerToParts = trimArray(lowerTo.split("\\")); + var length = Math.min(lowerFromParts.length, lowerToParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (lowerFromParts[i] !== lowerToParts[i]) { + samePartsLength = i; + break; + } + } + if (samePartsLength == 0) { + return to; + } + var outputParts = []; + for (var i = samePartsLength; i < lowerFromParts.length; i++) { + outputParts.push(".."); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join("\\"); + }; + win32._makeLong = function(path2) { + if (!util2.isString(path2)) + return path2; + if (!path2) { + return ""; + } + var resolvedPath = win32.resolve(path2); + if (/^[a-zA-Z]\:\\/.test(resolvedPath)) { + return "\\\\?\\" + resolvedPath; + } else if (/^\\\\[^?.]/.test(resolvedPath)) { + return "\\\\?\\UNC\\" + resolvedPath.substring(2); + } + return path2; + }; + win32.dirname = function(path2) { + var result = win32SplitPath(path2), root = result[0], dir = result[1]; + if (!root && !dir) { + return "."; + } + if (dir) { + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + }; + win32.basename = function(path2, ext) { + var f = win32SplitPath(path2)[2]; + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; + }; + win32.extname = function(path2) { + return win32SplitPath(path2)[3]; + }; + win32.format = function(pathObject) { + if (!util2.isObject(pathObject)) { + throw new TypeError( + "Parameter 'pathObject' must be an object, not " + typeof pathObject + ); + } + var root = pathObject.root || ""; + if (!util2.isString(root)) { + throw new TypeError( + "'pathObject.root' must be a string or undefined, not " + typeof pathObject.root + ); + } + var dir = pathObject.dir; + var base2 = pathObject.base || ""; + if (!dir) { + return base2; + } + if (dir[dir.length - 1] === win32.sep) { + return dir + base2; + } + return dir + win32.sep + base2; + }; + win32.parse = function(pathString) { + if (!util2.isString(pathString)) { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); + } + var allParts = win32SplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); + } + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; + }; + win32.sep = "\\"; + win32.delimiter = ";"; + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + var posix = {}; + function posixSplitPath(filename) { + return splitPathRe.exec(filename).slice(1); + } + posix.resolve = function() { + var resolvedPath = "", resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path2 = i >= 0 ? arguments[i] : process.cwd(); + if (!util2.isString(path2)) { + throw new TypeError("Arguments to path.resolve must be strings"); + } else if (!path2) { + continue; + } + resolvedPath = path2 + "/" + resolvedPath; + resolvedAbsolute = path2[0] === "/"; + } + resolvedPath = normalizeArray( + resolvedPath.split("/"), + !resolvedAbsolute + ).join("/"); + return (resolvedAbsolute ? "/" : "") + resolvedPath || "."; + }; + posix.normalize = function(path2) { + var isAbsolute = posix.isAbsolute(path2), trailingSlash = path2 && path2[path2.length - 1] === "/"; + path2 = normalizeArray(path2.split("/"), !isAbsolute).join("/"); + if (!path2 && !isAbsolute) { + path2 = "."; + } + if (path2 && trailingSlash) { + path2 += "/"; + } + return (isAbsolute ? "/" : "") + path2; + }; + posix.isAbsolute = function(path2) { + return path2.charAt(0) === "/"; + }; + posix.join = function() { + var path2 = ""; + for (var i = 0; i < arguments.length; i++) { + var segment = arguments[i]; + if (!util2.isString(segment)) { + throw new TypeError("Arguments to path.join must be strings"); + } + if (segment) { + if (!path2) { + path2 += segment; + } else { + path2 += "/" + segment; + } + } + } + return posix.normalize(path2); + }; + posix.relative = function(from2, to) { + from2 = posix.resolve(from2).substr(1); + to = posix.resolve(to).substr(1); + var fromParts = trimArray(from2.split("/")); + var toParts = trimArray(to.split("/")); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push(".."); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join("/"); + }; + posix._makeLong = function(path2) { + return path2; + }; + posix.dirname = function(path2) { + var result = posixSplitPath(path2), root = result[0], dir = result[1]; + if (!root && !dir) { + return "."; + } + if (dir) { + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + }; + posix.basename = function(path2, ext) { + var f = posixSplitPath(path2)[2]; + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; + }; + posix.extname = function(path2) { + return posixSplitPath(path2)[3]; + }; + posix.format = function(pathObject) { + if (!util2.isObject(pathObject)) { + throw new TypeError( + "Parameter 'pathObject' must be an object, not " + typeof pathObject + ); + } + var root = pathObject.root || ""; + if (!util2.isString(root)) { + throw new TypeError( + "'pathObject.root' must be a string or undefined, not " + typeof pathObject.root + ); + } + var dir = pathObject.dir ? pathObject.dir + posix.sep : ""; + var base2 = pathObject.base || ""; + return dir + base2; + }; + posix.parse = function(pathString) { + if (!util2.isString(pathString)) { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); + } + var allParts = posixSplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); + } + allParts[1] = allParts[1] || ""; + allParts[2] = allParts[2] || ""; + allParts[3] = allParts[3] || ""; + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; + }; + posix.sep = "/"; + posix.delimiter = ":"; + if (isWindows) + path$1.exports = win32; + else + path$1.exports = posix; + path$1.exports.posix = posix; + path$1.exports.win32 = win32; + return path$1.exports; +} +var node$1 = {}; +var process$1 = {}; +var hasRequiredProcess; +function requireProcess() { + if (hasRequiredProcess) return process$1; + hasRequiredProcess = 1; + Object.defineProperty(process$1, "__esModule", { value: true }); + process$1.createProcess = void 0; + const maybeReturnProcess = () => { + if (typeof process !== "undefined") { + return process; + } + try { + return requireBrowser$j(); + } catch (_a2) { + return void 0; + } + }; + function createProcess() { + const p = maybeReturnProcess() || {}; + if (!p.cwd) + p.cwd = () => "/"; + if (!p.emitWarning) + p.emitWarning = (message, type2) => { + console.warn(`${type2}${type2 ? ": " : ""}${message}`); + }; + if (!p.env) + p.env = {}; + return p; + } + process$1.createProcess = createProcess; + process$1.default = createProcess(); + return process$1; +} +var events = { exports: {} }; +var hasRequiredEvents; +function requireEvents() { + if (hasRequiredEvents) return events.exports; + hasRequiredEvents = 1; + var R = typeof Reflect === "object" ? Reflect : null; + var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; + var ReflectOwnKeys; + if (R && typeof R.ownKeys === "function") { + ReflectOwnKeys = R.ownKeys; + } else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys2(target) { + return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); + }; + } else { + ReflectOwnKeys = function ReflectOwnKeys2(target) { + return Object.getOwnPropertyNames(target); + }; + } + function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); + } + var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { + return value !== value; + }; + function EventEmitter2() { + EventEmitter2.init.call(this); + } + events.exports = EventEmitter2; + events.exports.once = once2; + EventEmitter2.EventEmitter = EventEmitter2; + EventEmitter2.prototype._events = void 0; + EventEmitter2.prototype._eventsCount = 0; + EventEmitter2.prototype._maxListeners = void 0; + var defaultMaxListeners = 10; + function checkListener2(listener) { + if (typeof listener !== "function") { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } + } + Object.defineProperty(EventEmitter2, "defaultMaxListeners", { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); + } + defaultMaxListeners = arg; + } + }); + EventEmitter2.init = function() { + if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } + this._maxListeners = this._maxListeners || void 0; + }; + EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); + } + this._maxListeners = n; + return this; + }; + function _getMaxListeners(that) { + if (that._maxListeners === void 0) + return EventEmitter2.defaultMaxListeners; + return that._maxListeners; + } + EventEmitter2.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); + }; + EventEmitter2.prototype.emit = function emit(type2) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type2 === "error"; + var events2 = this._events; + if (events2 !== void 0) + doError = doError && events2.error === void 0; + else if (!doError) + return false; + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + throw er; + } + var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); + err.context = er; + throw err; + } + var handler = events2[type2]; + if (handler === void 0) + return false; + if (typeof handler === "function") { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + return true; + }; + function _addListener(target, type2, listener, prepend) { + var m; + var events2; + var existing; + checkListener2(listener); + events2 = target._events; + if (events2 === void 0) { + events2 = target._events = /* @__PURE__ */ Object.create(null); + target._eventsCount = 0; + } else { + if (events2.newListener !== void 0) { + target.emit( + "newListener", + type2, + listener.listener ? listener.listener : listener + ); + events2 = target._events; + } + existing = events2[type2]; + } + if (existing === void 0) { + existing = events2[type2] = listener; + ++target._eventsCount; + } else { + if (typeof existing === "function") { + existing = events2[type2] = prepend ? [listener, existing] : [existing, listener]; + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type2) + " listeners added. Use emitter.setMaxListeners() to increase limit"); + w.name = "MaxListenersExceededWarning"; + w.emitter = target; + w.type = type2; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + return target; + } + EventEmitter2.prototype.addListener = function addListener(type2, listener) { + return _addListener(this, type2, listener, false); + }; + EventEmitter2.prototype.on = EventEmitter2.prototype.addListener; + EventEmitter2.prototype.prependListener = function prependListener(type2, listener) { + return _addListener(this, type2, listener, true); + }; + function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } + } + function _onceWrap(target, type2, listener) { + var state2 = { fired: false, wrapFn: void 0, target, type: type2, listener }; + var wrapped = onceWrapper.bind(state2); + wrapped.listener = listener; + state2.wrapFn = wrapped; + return wrapped; + } + EventEmitter2.prototype.once = function once3(type2, listener) { + checkListener2(listener); + this.on(type2, _onceWrap(this, type2, listener)); + return this; + }; + EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type2, listener) { + checkListener2(listener); + this.prependListener(type2, _onceWrap(this, type2, listener)); + return this; + }; + EventEmitter2.prototype.removeListener = function removeListener(type2, listener) { + var list, events2, position, i, originalListener; + checkListener2(listener); + events2 = this._events; + if (events2 === void 0) + return this; + list = events2[type2]; + if (list === void 0) + return this; + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else { + delete events2[type2]; + if (events2.removeListener) + this.emit("removeListener", type2, list.listener || listener); + } + } else if (typeof list !== "function") { + position = -1; + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + if (position < 0) + return this; + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + if (list.length === 1) + events2[type2] = list[0]; + if (events2.removeListener !== void 0) + this.emit("removeListener", type2, originalListener || listener); + } + return this; + }; + EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener; + EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type2) { + var listeners, events2, i; + events2 = this._events; + if (events2 === void 0) + return this; + if (events2.removeListener === void 0) { + if (arguments.length === 0) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else if (events2[type2] !== void 0) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else + delete events2[type2]; + } + return this; + } + if (arguments.length === 0) { + var keys = Object.keys(events2); + var key2; + for (i = 0; i < keys.length; ++i) { + key2 = keys[i]; + if (key2 === "removeListener") continue; + this.removeAllListeners(key2); + } + this.removeAllListeners("removeListener"); + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + return this; + } + listeners = events2[type2]; + if (typeof listeners === "function") { + this.removeListener(type2, listeners); + } else if (listeners !== void 0) { + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type2, listeners[i]); + } + } + return this; + }; + function _listeners(target, type2, unwrap) { + var events2 = target._events; + if (events2 === void 0) + return []; + var evlistener = events2[type2]; + if (evlistener === void 0) + return []; + if (typeof evlistener === "function") + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + return unwrap ? unwrapListeners2(evlistener) : arrayClone(evlistener, evlistener.length); + } + EventEmitter2.prototype.listeners = function listeners(type2) { + return _listeners(this, type2, true); + }; + EventEmitter2.prototype.rawListeners = function rawListeners(type2) { + return _listeners(this, type2, false); + }; + EventEmitter2.listenerCount = function(emitter, type2) { + if (typeof emitter.listenerCount === "function") { + return emitter.listenerCount(type2); + } else { + return listenerCount.call(emitter, type2); + } + }; + EventEmitter2.prototype.listenerCount = listenerCount; + function listenerCount(type2) { + var events2 = this._events; + if (events2 !== void 0) { + var evlistener = events2[type2]; + if (typeof evlistener === "function") { + return 1; + } else if (evlistener !== void 0) { + return evlistener.length; + } + } + return 0; + } + EventEmitter2.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + }; + function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; + } + function spliceOne(list, index2) { + for (; index2 + 1 < list.length; index2++) + list[index2] = list[index2 + 1]; + list.pop(); + } + function unwrapListeners2(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + function once2(emitter, name) { + return new Promise(function(resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + function resolver() { + if (typeof emitter.removeListener === "function") { + emitter.removeListener("error", errorListener); + } + resolve([].slice.call(arguments)); + } + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== "error") { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); + } + function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === "function") { + eventTargetAgnosticAddListener(emitter, "error", handler, flags); + } + } + function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === "function") { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === "function") { + emitter.addEventListener(name, function wrapListener(arg) { + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } + } + return events.exports; +} +var hasRequiredNode$1; +function requireNode$1() { + if (hasRequiredNode$1) return node$1; + hasRequiredNode$1 = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.File = exports.Link = exports.Node = exports.SEP = void 0; + const process_1 = requireProcess(); + const buffer_1 = requireBuffer$1(); + const constants_1 = requireConstants$7(); + const events_1 = requireEvents(); + const Stats_1 = requireStats(); + const { S_IFMT, S_IFDIR, S_IFREG, S_IFLNK, O_APPEND } = constants_1.constants; + const getuid = () => { + var _a2, _b2; + return (_b2 = (_a2 = process_1.default.getuid) === null || _a2 === void 0 ? void 0 : _a2.call(process_1.default)) !== null && _b2 !== void 0 ? _b2 : 0; + }; + const getgid = () => { + var _a2, _b2; + return (_b2 = (_a2 = process_1.default.getgid) === null || _a2 === void 0 ? void 0 : _a2.call(process_1.default)) !== null && _b2 !== void 0 ? _b2 : 0; + }; + exports.SEP = "/"; + class Node3 extends events_1.EventEmitter { + constructor(ino, perm = 438) { + super(); + this._uid = getuid(); + this._gid = getgid(); + this._atime = /* @__PURE__ */ new Date(); + this._mtime = /* @__PURE__ */ new Date(); + this._ctime = /* @__PURE__ */ new Date(); + this._perm = 438; + this.mode = S_IFREG; + this._nlink = 1; + this._perm = perm; + this.mode |= perm; + this.ino = ino; + } + set ctime(ctime) { + this._ctime = ctime; + } + get ctime() { + return this._ctime; + } + set uid(uid) { + this._uid = uid; + this.ctime = /* @__PURE__ */ new Date(); + } + get uid() { + return this._uid; + } + set gid(gid) { + this._gid = gid; + this.ctime = /* @__PURE__ */ new Date(); + } + get gid() { + return this._gid; + } + set atime(atime) { + this._atime = atime; + this.ctime = /* @__PURE__ */ new Date(); + } + get atime() { + return this._atime; + } + set mtime(mtime) { + this._mtime = mtime; + this.ctime = /* @__PURE__ */ new Date(); + } + get mtime() { + return this._mtime; + } + set perm(perm) { + this._perm = perm; + this.ctime = /* @__PURE__ */ new Date(); + } + get perm() { + return this._perm; + } + set nlink(nlink) { + this._nlink = nlink; + this.ctime = /* @__PURE__ */ new Date(); + } + get nlink() { + return this._nlink; + } + getString(encoding2 = "utf8") { + this.atime = /* @__PURE__ */ new Date(); + return this.getBuffer().toString(encoding2); + } + setString(str) { + this.buf = (0, buffer_1.bufferFrom)(str, "utf8"); + this.touch(); + } + getBuffer() { + this.atime = /* @__PURE__ */ new Date(); + if (!this.buf) + this.setBuffer((0, buffer_1.bufferAllocUnsafe)(0)); + return (0, buffer_1.bufferFrom)(this.buf); + } + setBuffer(buf) { + this.buf = (0, buffer_1.bufferFrom)(buf); + this.touch(); + } + getSize() { + return this.buf ? this.buf.length : 0; + } + setModeProperty(property) { + this.mode = this.mode & ~S_IFMT | property; + } + setIsFile() { + this.setModeProperty(S_IFREG); + } + setIsDirectory() { + this.setModeProperty(S_IFDIR); + } + setIsSymlink() { + this.setModeProperty(S_IFLNK); + } + isFile() { + return (this.mode & S_IFMT) === S_IFREG; + } + isDirectory() { + return (this.mode & S_IFMT) === S_IFDIR; + } + isSymlink() { + return (this.mode & S_IFMT) === S_IFLNK; + } + makeSymlink(steps) { + this.symlink = steps; + this.setIsSymlink(); + } + write(buf, off = 0, len = buf.length, pos = 0) { + if (!this.buf) + this.buf = (0, buffer_1.bufferAllocUnsafe)(0); + if (pos + len > this.buf.length) { + const newBuf = (0, buffer_1.bufferAllocUnsafe)(pos + len); + this.buf.copy(newBuf, 0, 0, this.buf.length); + this.buf = newBuf; + } + buf.copy(this.buf, pos, off, off + len); + this.touch(); + return len; + } + // Returns the number of bytes read. + read(buf, off = 0, len = buf.byteLength, pos = 0) { + this.atime = /* @__PURE__ */ new Date(); + if (!this.buf) + this.buf = (0, buffer_1.bufferAllocUnsafe)(0); + let actualLen = len; + if (actualLen > buf.byteLength) { + actualLen = buf.byteLength; + } + if (actualLen + pos > this.buf.length) { + actualLen = this.buf.length - pos; + } + const buf2 = buf instanceof buffer_1.Buffer ? buf : buffer_1.Buffer.from(buf.buffer); + this.buf.copy(buf2, off, pos, pos + actualLen); + return actualLen; + } + truncate(len = 0) { + if (!len) + this.buf = (0, buffer_1.bufferAllocUnsafe)(0); + else { + if (!this.buf) + this.buf = (0, buffer_1.bufferAllocUnsafe)(0); + if (len <= this.buf.length) { + this.buf = this.buf.slice(0, len); + } else { + const buf = (0, buffer_1.bufferAllocUnsafe)(len); + this.buf.copy(buf); + buf.fill(0, this.buf.length); + this.buf = buf; + } + } + this.touch(); + } + chmod(perm) { + this.perm = perm; + this.mode = this.mode & -512 | perm; + this.touch(); + } + chown(uid, gid) { + this.uid = uid; + this.gid = gid; + this.touch(); + } + touch() { + this.mtime = /* @__PURE__ */ new Date(); + this.emit("change", this); + } + canRead(uid = getuid(), gid = getgid()) { + if (this.perm & 4) { + return true; + } + if (gid === this.gid) { + if (this.perm & 32) { + return true; + } + } + if (uid === this.uid) { + if (this.perm & 256) { + return true; + } + } + return false; + } + canWrite(uid = getuid(), gid = getgid()) { + if (this.perm & 2) { + return true; + } + if (gid === this.gid) { + if (this.perm & 16) { + return true; + } + } + if (uid === this.uid) { + if (this.perm & 128) { + return true; + } + } + return false; + } + del() { + this.emit("delete", this); + } + toJSON() { + return { + ino: this.ino, + uid: this.uid, + gid: this.gid, + atime: this.atime.getTime(), + mtime: this.mtime.getTime(), + ctime: this.ctime.getTime(), + perm: this.perm, + mode: this.mode, + nlink: this.nlink, + symlink: this.symlink, + data: this.getString() + }; + } + } + exports.Node = Node3; + class Link extends events_1.EventEmitter { + get steps() { + return this._steps; + } + // Recursively sync children steps, e.g. in case of dir rename + set steps(val) { + this._steps = val; + for (const [child, link2] of this.children.entries()) { + if (child === "." || child === "..") { + continue; + } + link2 === null || link2 === void 0 ? void 0 : link2.syncSteps(); + } + } + constructor(vol, parent, name) { + super(); + this.children = /* @__PURE__ */ new Map(); + this._steps = []; + this.ino = 0; + this.length = 0; + this.vol = vol; + this.parent = parent; + this.name = name; + this.syncSteps(); + } + setNode(node2) { + this.node = node2; + this.ino = node2.ino; + } + getNode() { + return this.node; + } + createChild(name, node2 = this.vol.createNode()) { + const link2 = new Link(this.vol, this, name); + link2.setNode(node2); + if (node2.isDirectory()) { + link2.children.set(".", link2); + link2.getNode().nlink++; + } + this.setChild(name, link2); + return link2; + } + setChild(name, link2 = new Link(this.vol, this, name)) { + this.children.set(name, link2); + link2.parent = this; + this.length++; + const node2 = link2.getNode(); + if (node2.isDirectory()) { + link2.children.set("..", this); + this.getNode().nlink++; + } + this.getNode().mtime = /* @__PURE__ */ new Date(); + this.emit("child:add", link2, this); + return link2; + } + deleteChild(link2) { + const node2 = link2.getNode(); + if (node2.isDirectory()) { + link2.children.delete(".."); + this.getNode().nlink--; + } + this.children.delete(link2.getName()); + this.length--; + this.getNode().mtime = /* @__PURE__ */ new Date(); + this.emit("child:delete", link2, this); + } + getChild(name) { + this.getNode().mtime = /* @__PURE__ */ new Date(); + return this.children.get(name); + } + getPath() { + return this.steps.join(exports.SEP); + } + getName() { + return this.steps[this.steps.length - 1]; + } + // del() { + // const parent = this.parent; + // if(parent) { + // parent.deleteChild(link); + // } + // this.parent = null; + // this.vol = null; + // } + /** + * Walk the tree path and return the `Link` at that location, if any. + * @param steps {string[]} Desired location. + * @param stop {number} Max steps to go into. + * @param i {number} Current step in the `steps` array. + * + * @return {Link|null} + */ + walk(steps, stop = steps.length, i = 0) { + if (i >= steps.length) + return this; + if (i >= stop) + return this; + const step = steps[i]; + const link2 = this.getChild(step); + if (!link2) + return null; + return link2.walk(steps, stop, i + 1); + } + toJSON() { + return { + steps: this.steps, + ino: this.ino, + children: Array.from(this.children.keys()) + }; + } + syncSteps() { + this.steps = this.parent ? this.parent.steps.concat([this.name]) : [this.name]; + } + } + exports.Link = Link; + class File { + /** + * Open a Link-Node pair. `node` is provided separately as that might be a different node + * rather the one `link` points to, because it might be a symlink. + * @param link + * @param node + * @param flags + * @param fd + */ + constructor(link2, node2, flags, fd) { + this.link = link2; + this.node = node2; + this.flags = flags; + this.fd = fd; + this.position = 0; + if (this.flags & O_APPEND) + this.position = this.getSize(); + } + getString(encoding2 = "utf8") { + return this.node.getString(); + } + setString(str) { + this.node.setString(str); + } + getBuffer() { + return this.node.getBuffer(); + } + setBuffer(buf) { + this.node.setBuffer(buf); + } + getSize() { + return this.node.getSize(); + } + truncate(len) { + this.node.truncate(len); + } + seekTo(position) { + this.position = position; + } + stats() { + return Stats_1.default.build(this.node); + } + write(buf, offset2 = 0, length = buf.length, position) { + if (typeof position !== "number") + position = this.position; + const bytes = this.node.write(buf, offset2, length, position); + this.position = position + bytes; + return bytes; + } + read(buf, offset2 = 0, length = buf.byteLength, position) { + if (typeof position !== "number") + position = this.position; + const bytes = this.node.read(buf, offset2, length, position); + this.position = position + bytes; + return bytes; + } + chmod(perm) { + this.node.chmod(perm); + } + chown(uid, gid) { + this.node.chown(uid, gid); + } + } + exports.File = File; + })(node$1); + return node$1; +} +var setImmediate$1 = {}; +var hasRequiredSetImmediate; +function requireSetImmediate() { + if (hasRequiredSetImmediate) return setImmediate$1; + hasRequiredSetImmediate = 1; + Object.defineProperty(setImmediate$1, "__esModule", { value: true }); + let _setImmediate; + if (typeof setImmediate === "function") + _setImmediate = setImmediate.bind(typeof globalThis !== "undefined" ? globalThis : commonjsGlobal); + else + _setImmediate = setTimeout.bind(typeof globalThis !== "undefined" ? globalThis : commonjsGlobal); + setImmediate$1.default = _setImmediate; + return setImmediate$1; +} +var queueMicrotask$1 = {}; +var hasRequiredQueueMicrotask; +function requireQueueMicrotask() { + if (hasRequiredQueueMicrotask) return queueMicrotask$1; + hasRequiredQueueMicrotask = 1; + Object.defineProperty(queueMicrotask$1, "__esModule", { value: true }); + queueMicrotask$1.default = typeof queueMicrotask === "function" ? queueMicrotask : (cb) => Promise.resolve().then(() => cb()).catch(() => { + }); + return queueMicrotask$1; +} +var setTimeoutUnref = {}; +var hasRequiredSetTimeoutUnref; +function requireSetTimeoutUnref() { + if (hasRequiredSetTimeoutUnref) return setTimeoutUnref; + hasRequiredSetTimeoutUnref = 1; + Object.defineProperty(setTimeoutUnref, "__esModule", { value: true }); + function setTimeoutUnref$1(callback, time, args) { + const ref2 = setTimeout.apply(typeof globalThis !== "undefined" ? globalThis : commonjsGlobal, arguments); + if (ref2 && typeof ref2 === "object" && typeof ref2.unref === "function") + ref2.unref(); + return ref2; + } + setTimeoutUnref.default = setTimeoutUnref$1; + return setTimeoutUnref; +} +var browser$i = { exports: {} }; +var stream$1 = { exports: {} }; +var primordials; +var hasRequiredPrimordials; +function requirePrimordials() { + if (hasRequiredPrimordials) return primordials; + hasRequiredPrimordials = 1; + primordials = { + ArrayIsArray(self2) { + return Array.isArray(self2); + }, + ArrayPrototypeIncludes(self2, el) { + return self2.includes(el); + }, + ArrayPrototypeIndexOf(self2, el) { + return self2.indexOf(el); + }, + ArrayPrototypeJoin(self2, sep) { + return self2.join(sep); + }, + ArrayPrototypeMap(self2, fn) { + return self2.map(fn); + }, + ArrayPrototypePop(self2, el) { + return self2.pop(el); + }, + ArrayPrototypePush(self2, el) { + return self2.push(el); + }, + ArrayPrototypeSlice(self2, start, end) { + return self2.slice(start, end); + }, + Error, + FunctionPrototypeCall(fn, thisArgs, ...args) { + return fn.call(thisArgs, ...args); + }, + FunctionPrototypeSymbolHasInstance(self2, instance) { + return Function.prototype[Symbol.hasInstance].call(self2, instance); + }, + MathFloor: Math.floor, + Number, + NumberIsInteger: Number.isInteger, + NumberIsNaN: Number.isNaN, + NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER, + NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER, + NumberParseInt: Number.parseInt, + ObjectDefineProperties(self2, props) { + return Object.defineProperties(self2, props); + }, + ObjectDefineProperty(self2, name, prop) { + return Object.defineProperty(self2, name, prop); + }, + ObjectGetOwnPropertyDescriptor(self2, name) { + return Object.getOwnPropertyDescriptor(self2, name); + }, + ObjectKeys(obj) { + return Object.keys(obj); + }, + ObjectSetPrototypeOf(target, proto) { + return Object.setPrototypeOf(target, proto); + }, + Promise, + PromisePrototypeCatch(self2, fn) { + return self2.catch(fn); + }, + PromisePrototypeThen(self2, thenFn, catchFn) { + return self2.then(thenFn, catchFn); + }, + PromiseReject(err) { + return Promise.reject(err); + }, + PromiseResolve(val) { + return Promise.resolve(val); + }, + ReflectApply: Reflect.apply, + RegExpPrototypeTest(self2, value) { + return self2.test(value); + }, + SafeSet: Set, + String, + StringPrototypeSlice(self2, start, end) { + return self2.slice(start, end); + }, + StringPrototypeToLowerCase(self2) { + return self2.toLowerCase(); + }, + StringPrototypeToUpperCase(self2) { + return self2.toUpperCase(); + }, + StringPrototypeTrim(self2) { + return self2.trim(); + }, + Symbol, + SymbolFor: Symbol.for, + SymbolAsyncIterator: Symbol.asyncIterator, + SymbolHasInstance: Symbol.hasInstance, + SymbolIterator: Symbol.iterator, + SymbolDispose: Symbol.dispose || Symbol("Symbol.dispose"), + SymbolAsyncDispose: Symbol.asyncDispose || Symbol("Symbol.asyncDispose"), + TypedArrayPrototypeSet(self2, buf, len) { + return self2.set(buf, len); + }, + Boolean, + Uint8Array + }; + return primordials; +} +var util$4 = { exports: {} }; +var browser$h = { exports: {} }; +var hasRequiredBrowser$i; +function requireBrowser$i() { + if (hasRequiredBrowser$i) return browser$h.exports; + hasRequiredBrowser$i = 1; + const { AbortController: AbortController2, AbortSignal } = typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : ( + /* otherwise */ + void 0 + ); + browser$h.exports = AbortController2; + browser$h.exports.AbortSignal = AbortSignal; + browser$h.exports.default = AbortController2; + return browser$h.exports; +} +var hasRequiredUtil$3; +function requireUtil$3() { + if (hasRequiredUtil$3) return util$4.exports; + hasRequiredUtil$3 = 1; + (function(module) { + const bufferModule = requireBuffer$2(); + const { kResistStopPropagation, SymbolDispose } = requirePrimordials(); + const AbortSignal = globalThis.AbortSignal || requireBrowser$i().AbortSignal; + const AbortController2 = globalThis.AbortController || requireBrowser$i().AbortController; + const AsyncFunction = Object.getPrototypeOf(async function() { + }).constructor; + const Blob2 = globalThis.Blob || bufferModule.Blob; + const isBlob = typeof Blob2 !== "undefined" ? function isBlob2(b) { + return b instanceof Blob2; + } : function isBlob2(b) { + return false; + }; + const validateAbortSignal = (signal, name) => { + if (signal !== void 0 && (signal === null || typeof signal !== "object" || !("aborted" in signal))) { + throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal); + } + }; + const validateFunction = (value, name) => { + if (typeof value !== "function") throw new ERR_INVALID_ARG_TYPE(name, "Function", value); + }; + class AggregateError2 extends Error { + constructor(errors2) { + if (!Array.isArray(errors2)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors2}`); + } + let message = ""; + for (let i = 0; i < errors2.length; i++) { + message += ` ${errors2[i].stack} +`; + } + super(message); + this.name = "AggregateError"; + this.errors = errors2; + } + } + module.exports = { + AggregateError: AggregateError2, + kEmptyObject: Object.freeze({}), + once(callback) { + let called = false; + return function(...args) { + if (called) { + return; + } + called = true; + callback.apply(this, args); + }; + }, + createDeferredPromise: function() { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { + promise, + resolve, + reject + }; + }, + promisify(fn) { + return new Promise((resolve, reject) => { + fn((err, ...args) => { + if (err) { + return reject(err); + } + return resolve(...args); + }); + }); + }, + debuglog() { + return function() { + }; + }, + format(format, ...args) { + return format.replace(/%([sdifj])/g, function(...[_unused, type2]) { + const replacement = args.shift(); + if (type2 === "f") { + return replacement.toFixed(6); + } else if (type2 === "j") { + return JSON.stringify(replacement); + } else if (type2 === "s" && typeof replacement === "object") { + const ctor = replacement.constructor !== Object ? replacement.constructor.name : ""; + return `${ctor} {}`.trim(); + } else { + return replacement.toString(); + } + }); + }, + inspect(value) { + switch (typeof value) { + case "string": + if (value.includes("'")) { + if (!value.includes('"')) { + return `"${value}"`; + } else if (!value.includes("`") && !value.includes("${")) { + return `\`${value}\``; + } + } + return `'${value}'`; + case "number": + if (isNaN(value)) { + return "NaN"; + } else if (Object.is(value, -0)) { + return String(value); + } + return value; + case "bigint": + return `${String(value)}n`; + case "boolean": + case "undefined": + return String(value); + case "object": + return "{}"; + } + }, + types: { + isAsyncFunction(fn) { + return fn instanceof AsyncFunction; + }, + isArrayBufferView(arr) { + return ArrayBuffer.isView(arr); + } + }, + isBlob, + deprecate(fn, message) { + return fn; + }, + addAbortListener: requireEvents().addAbortListener || function addAbortListener(signal, listener) { + if (signal === void 0) { + throw new ERR_INVALID_ARG_TYPE("signal", "AbortSignal", signal); + } + validateAbortSignal(signal, "signal"); + validateFunction(listener, "listener"); + let removeEventListener; + if (signal.aborted) { + queueMicrotask(() => listener()); + } else { + signal.addEventListener("abort", listener, { + __proto__: null, + once: true, + [kResistStopPropagation]: true + }); + removeEventListener = () => { + signal.removeEventListener("abort", listener); + }; + } + return { + __proto__: null, + [SymbolDispose]() { + var _removeEventListener; + (_removeEventListener = removeEventListener) === null || _removeEventListener === void 0 ? void 0 : _removeEventListener(); + } + }; + }, + AbortSignalAny: AbortSignal.any || function AbortSignalAny(signals2) { + if (signals2.length === 1) { + return signals2[0]; + } + const ac = new AbortController2(); + const abort = () => ac.abort(); + signals2.forEach((signal) => { + validateAbortSignal(signal, "signals"); + signal.addEventListener("abort", abort, { + once: true + }); + }); + ac.signal.addEventListener( + "abort", + () => { + signals2.forEach((signal) => signal.removeEventListener("abort", abort)); + }, + { + once: true + } + ); + return ac.signal; + } + }; + module.exports.promisify.custom = Symbol.for("nodejs.util.promisify.custom"); + })(util$4); + return util$4.exports; +} +var operators = {}; +var errors$1; +var hasRequiredErrors; +function requireErrors() { + if (hasRequiredErrors) return errors$1; + hasRequiredErrors = 1; + const { format, inspect, AggregateError: CustomAggregateError } = requireUtil$3(); + const AggregateError2 = globalThis.AggregateError || CustomAggregateError; + const kIsNodeError = Symbol("kIsNodeError"); + const kTypes = [ + "string", + "function", + "number", + "object", + // Accept 'Function' and 'Object' as alternative to the lower cased version. + "Function", + "Object", + "boolean", + "bigint", + "symbol" + ]; + const classRegExp = /^([A-Z][a-z0-9]*)+$/; + const nodeInternalPrefix = "__node_internal_"; + const codes = {}; + function assert2(value, message) { + if (!value) { + throw new codes.ERR_INTERNAL_ASSERTION(message); + } + } + function addNumericalSeparator(val) { + let res = ""; + let i = val.length; + const start = val[0] === "-" ? 1 : 0; + for (; i >= start + 4; i -= 3) { + res = `_${val.slice(i - 3, i)}${res}`; + } + return `${val.slice(0, i)}${res}`; + } + function getMessage(key2, msg, args) { + if (typeof msg === "function") { + assert2( + msg.length <= args.length, + // Default options do not count. + `Code: ${key2}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).` + ); + return msg(...args); + } + const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length; + assert2( + expectedLength === args.length, + `Code: ${key2}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).` + ); + if (args.length === 0) { + return msg; + } + return format(msg, ...args); + } + function E(code, message, Base) { + if (!Base) { + Base = Error; + } + class NodeError extends Base { + constructor(...args) { + super(getMessage(code, message, args)); + } + toString() { + return `${this.name} [${code}]: ${this.message}`; + } + } + Object.defineProperties(NodeError.prototype, { + name: { + value: Base.name, + writable: true, + enumerable: false, + configurable: true + }, + toString: { + value() { + return `${this.name} [${code}]: ${this.message}`; + }, + writable: true, + enumerable: false, + configurable: true + } + }); + NodeError.prototype.code = code; + NodeError.prototype[kIsNodeError] = true; + codes[code] = NodeError; + } + function hideStackFrames(fn) { + const hidden = nodeInternalPrefix + fn.name; + Object.defineProperty(fn, "name", { + value: hidden + }); + return fn; + } + function aggregateTwoErrors(innerError, outerError) { + if (innerError && outerError && innerError !== outerError) { + if (Array.isArray(outerError.errors)) { + outerError.errors.push(innerError); + return outerError; + } + const err = new AggregateError2([outerError, innerError], outerError.message); + err.code = outerError.code; + return err; + } + return innerError || outerError; + } + class AbortError extends Error { + constructor(message = "The operation was aborted", options2 = void 0) { + if (options2 !== void 0 && typeof options2 !== "object") { + throw new codes.ERR_INVALID_ARG_TYPE("options", "Object", options2); + } + super(message, options2); + this.code = "ABORT_ERR"; + this.name = "AbortError"; + } + } + E("ERR_ASSERTION", "%s", Error); + E( + "ERR_INVALID_ARG_TYPE", + (name, expected, actual) => { + assert2(typeof name === "string", "'name' must be a string"); + if (!Array.isArray(expected)) { + expected = [expected]; + } + let msg = "The "; + if (name.endsWith(" argument")) { + msg += `${name} `; + } else { + msg += `"${name}" ${name.includes(".") ? "property" : "argument"} `; + } + msg += "must be "; + const types2 = []; + const instances = []; + const other2 = []; + for (const value of expected) { + assert2(typeof value === "string", "All expected entries have to be of type string"); + if (kTypes.includes(value)) { + types2.push(value.toLowerCase()); + } else if (classRegExp.test(value)) { + instances.push(value); + } else { + assert2(value !== "object", 'The value "object" should be written as "Object"'); + other2.push(value); + } + } + if (instances.length > 0) { + const pos = types2.indexOf("object"); + if (pos !== -1) { + types2.splice(types2, pos, 1); + instances.push("Object"); + } + } + if (types2.length > 0) { + switch (types2.length) { + case 1: + msg += `of type ${types2[0]}`; + break; + case 2: + msg += `one of type ${types2[0]} or ${types2[1]}`; + break; + default: { + const last = types2.pop(); + msg += `one of type ${types2.join(", ")}, or ${last}`; + } + } + if (instances.length > 0 || other2.length > 0) { + msg += " or "; + } + } + if (instances.length > 0) { + switch (instances.length) { + case 1: + msg += `an instance of ${instances[0]}`; + break; + case 2: + msg += `an instance of ${instances[0]} or ${instances[1]}`; + break; + default: { + const last = instances.pop(); + msg += `an instance of ${instances.join(", ")}, or ${last}`; + } + } + if (other2.length > 0) { + msg += " or "; + } + } + switch (other2.length) { + case 0: + break; + case 1: + if (other2[0].toLowerCase() !== other2[0]) { + msg += "an "; + } + msg += `${other2[0]}`; + break; + case 2: + msg += `one of ${other2[0]} or ${other2[1]}`; + break; + default: { + const last = other2.pop(); + msg += `one of ${other2.join(", ")}, or ${last}`; + } + } + if (actual == null) { + msg += `. Received ${actual}`; + } else if (typeof actual === "function" && actual.name) { + msg += `. Received function ${actual.name}`; + } else if (typeof actual === "object") { + var _actual$constructor; + if ((_actual$constructor = actual.constructor) !== null && _actual$constructor !== void 0 && _actual$constructor.name) { + msg += `. Received an instance of ${actual.constructor.name}`; + } else { + const inspected = inspect(actual, { + depth: -1 + }); + msg += `. Received ${inspected}`; + } + } else { + let inspected = inspect(actual, { + colors: false + }); + if (inspected.length > 25) { + inspected = `${inspected.slice(0, 25)}...`; + } + msg += `. Received type ${typeof actual} (${inspected})`; + } + return msg; + }, + TypeError + ); + E( + "ERR_INVALID_ARG_VALUE", + (name, value, reason = "is invalid") => { + let inspected = inspect(value); + if (inspected.length > 128) { + inspected = inspected.slice(0, 128) + "..."; + } + const type2 = name.includes(".") ? "property" : "argument"; + return `The ${type2} '${name}' ${reason}. Received ${inspected}`; + }, + TypeError + ); + E( + "ERR_INVALID_RETURN_VALUE", + (input, name, value) => { + var _value$constructor; + const type2 = value !== null && value !== void 0 && (_value$constructor = value.constructor) !== null && _value$constructor !== void 0 && _value$constructor.name ? `instance of ${value.constructor.name}` : `type ${typeof value}`; + return `Expected ${input} to be returned from the "${name}" function but got ${type2}.`; + }, + TypeError + ); + E( + "ERR_MISSING_ARGS", + (...args) => { + assert2(args.length > 0, "At least one arg needs to be specified"); + let msg; + const len = args.length; + args = (Array.isArray(args) ? args : [args]).map((a) => `"${a}"`).join(" or "); + switch (len) { + case 1: + msg += `The ${args[0]} argument`; + break; + case 2: + msg += `The ${args[0]} and ${args[1]} arguments`; + break; + default: + { + const last = args.pop(); + msg += `The ${args.join(", ")}, and ${last} arguments`; + } + break; + } + return `${msg} must be specified`; + }, + TypeError + ); + E( + "ERR_OUT_OF_RANGE", + (str, range2, input) => { + assert2(range2, 'Missing "range" argument'); + let received; + if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { + received = addNumericalSeparator(String(input)); + } else if (typeof input === "bigint") { + received = String(input); + if (input > 2n ** 32n || input < -(2n ** 32n)) { + received = addNumericalSeparator(received); + } + received += "n"; + } else { + received = inspect(input); + } + return `The value of "${str}" is out of range. It must be ${range2}. Received ${received}`; + }, + RangeError + ); + E("ERR_MULTIPLE_CALLBACK", "Callback called multiple times", Error); + E("ERR_METHOD_NOT_IMPLEMENTED", "The %s method is not implemented", Error); + E("ERR_STREAM_ALREADY_FINISHED", "Cannot call %s after a stream was finished", Error); + E("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable", Error); + E("ERR_STREAM_DESTROYED", "Cannot call %s after a stream was destroyed", Error); + E("ERR_STREAM_NULL_VALUES", "May not write null values to stream", TypeError); + E("ERR_STREAM_PREMATURE_CLOSE", "Premature close", Error); + E("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF", Error); + E("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event", Error); + E("ERR_STREAM_WRITE_AFTER_END", "write after end", Error); + E("ERR_UNKNOWN_ENCODING", "Unknown encoding: %s", TypeError); + errors$1 = { + AbortError, + aggregateTwoErrors: hideStackFrames(aggregateTwoErrors), + hideStackFrames, + codes + }; + return errors$1; +} +var validators; +var hasRequiredValidators; +function requireValidators() { + if (hasRequiredValidators) return validators; + hasRequiredValidators = 1; + const { + ArrayIsArray, + ArrayPrototypeIncludes, + ArrayPrototypeJoin, + ArrayPrototypeMap, + NumberIsInteger, + NumberIsNaN, + NumberMAX_SAFE_INTEGER, + NumberMIN_SAFE_INTEGER, + NumberParseInt, + ObjectPrototypeHasOwnProperty, + RegExpPrototypeExec, + String: String2, + StringPrototypeToUpperCase, + StringPrototypeTrim + } = requirePrimordials(); + const { + hideStackFrames, + codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL } + } = requireErrors(); + const { normalizeEncoding } = requireUtil$3(); + const { isAsyncFunction, isArrayBufferView } = requireUtil$3().types; + const signals2 = {}; + function isInt32(value) { + return value === (value | 0); + } + function isUint32(value) { + return value === value >>> 0; + } + const octalReg = /^[0-7]+$/; + const modeDesc = "must be a 32-bit unsigned integer or an octal string"; + function parseFileMode(value, name, def) { + if (typeof value === "undefined") { + value = def; + } + if (typeof value === "string") { + if (RegExpPrototypeExec(octalReg, value) === null) { + throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc); + } + value = NumberParseInt(value, 8); + } + validateUint32(value, name); + return value; + } + const validateInteger = hideStackFrames((value, name, min2 = NumberMIN_SAFE_INTEGER, max2 = NumberMAX_SAFE_INTEGER) => { + if (typeof value !== "number") throw new ERR_INVALID_ARG_TYPE2(name, "number", value); + if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, "an integer", value); + if (value < min2 || value > max2) throw new ERR_OUT_OF_RANGE(name, `>= ${min2} && <= ${max2}`, value); + }); + const validateInt32 = hideStackFrames((value, name, min2 = -2147483648, max2 = 2147483647) => { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE2(name, "number", value); + } + if (!NumberIsInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + if (value < min2 || value > max2) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min2} && <= ${max2}`, value); + } + }); + const validateUint32 = hideStackFrames((value, name, positive = false) => { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE2(name, "number", value); + } + if (!NumberIsInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + const min2 = positive ? 1 : 0; + const max2 = 4294967295; + if (value < min2 || value > max2) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min2} && <= ${max2}`, value); + } + }); + function validateString(value, name) { + if (typeof value !== "string") throw new ERR_INVALID_ARG_TYPE2(name, "string", value); + } + function validateNumber(value, name, min2 = void 0, max2) { + if (typeof value !== "number") throw new ERR_INVALID_ARG_TYPE2(name, "number", value); + if (min2 != null && value < min2 || max2 != null && value > max2 || (min2 != null || max2 != null) && NumberIsNaN(value)) { + throw new ERR_OUT_OF_RANGE( + name, + `${min2 != null ? `>= ${min2}` : ""}${min2 != null && max2 != null ? " && " : ""}${max2 != null ? `<= ${max2}` : ""}`, + value + ); + } + } + const validateOneOf = hideStackFrames((value, name, oneOf) => { + if (!ArrayPrototypeIncludes(oneOf, value)) { + const allowed = ArrayPrototypeJoin( + ArrayPrototypeMap(oneOf, (v) => typeof v === "string" ? `'${v}'` : String2(v)), + ", " + ); + const reason = "must be one of: " + allowed; + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } + }); + function validateBoolean(value, name) { + if (typeof value !== "boolean") throw new ERR_INVALID_ARG_TYPE2(name, "boolean", value); + } + function getOwnPropertyValueOrDefault(options2, key2, defaultValue) { + return options2 == null || !ObjectPrototypeHasOwnProperty(options2, key2) ? defaultValue : options2[key2]; + } + const validateObject = hideStackFrames((value, name, options2 = null) => { + const allowArray = getOwnPropertyValueOrDefault(options2, "allowArray", false); + const allowFunction = getOwnPropertyValueOrDefault(options2, "allowFunction", false); + const nullable = getOwnPropertyValueOrDefault(options2, "nullable", false); + if (!nullable && value === null || !allowArray && ArrayIsArray(value) || typeof value !== "object" && (!allowFunction || typeof value !== "function")) { + throw new ERR_INVALID_ARG_TYPE2(name, "Object", value); + } + }); + const validateDictionary = hideStackFrames((value, name) => { + if (value != null && typeof value !== "object" && typeof value !== "function") { + throw new ERR_INVALID_ARG_TYPE2(name, "a dictionary", value); + } + }); + const validateArray = hideStackFrames((value, name, minLength = 0) => { + if (!ArrayIsArray(value)) { + throw new ERR_INVALID_ARG_TYPE2(name, "Array", value); + } + if (value.length < minLength) { + const reason = `must be longer than ${minLength}`; + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } + }); + function validateStringArray(value, name) { + validateArray(value, name); + for (let i = 0; i < value.length; i++) { + validateString(value[i], `${name}[${i}]`); + } + } + function validateBooleanArray(value, name) { + validateArray(value, name); + for (let i = 0; i < value.length; i++) { + validateBoolean(value[i], `${name}[${i}]`); + } + } + function validateAbortSignalArray(value, name) { + validateArray(value, name); + for (let i = 0; i < value.length; i++) { + const signal = value[i]; + const indexedName = `${name}[${i}]`; + if (signal == null) { + throw new ERR_INVALID_ARG_TYPE2(indexedName, "AbortSignal", signal); + } + validateAbortSignal(signal, indexedName); + } + } + function validateSignalName(signal, name = "signal") { + validateString(signal, name); + if (signals2[signal] === void 0) { + if (signals2[StringPrototypeToUpperCase(signal)] !== void 0) { + throw new ERR_UNKNOWN_SIGNAL(signal + " (signals must use all capital letters)"); + } + throw new ERR_UNKNOWN_SIGNAL(signal); + } + } + const validateBuffer2 = hideStackFrames((buffer2, name = "buffer") => { + if (!isArrayBufferView(buffer2)) { + throw new ERR_INVALID_ARG_TYPE2(name, ["Buffer", "TypedArray", "DataView"], buffer2); + } + }); + function validateEncoding(data2, encoding2) { + const normalizedEncoding = normalizeEncoding(encoding2); + const length = data2.length; + if (normalizedEncoding === "hex" && length % 2 !== 0) { + throw new ERR_INVALID_ARG_VALUE("encoding", encoding2, `is invalid for data of length ${length}`); + } + } + function validatePort(port, name = "Port", allowZero = true) { + if (typeof port !== "number" && typeof port !== "string" || typeof port === "string" && StringPrototypeTrim(port).length === 0 || +port !== +port >>> 0 || port > 65535 || port === 0 && !allowZero) { + throw new ERR_SOCKET_BAD_PORT(name, port, allowZero); + } + return port | 0; + } + const validateAbortSignal = hideStackFrames((signal, name) => { + if (signal !== void 0 && (signal === null || typeof signal !== "object" || !("aborted" in signal))) { + throw new ERR_INVALID_ARG_TYPE2(name, "AbortSignal", signal); + } + }); + const validateFunction = hideStackFrames((value, name) => { + if (typeof value !== "function") throw new ERR_INVALID_ARG_TYPE2(name, "Function", value); + }); + const validatePlainFunction = hideStackFrames((value, name) => { + if (typeof value !== "function" || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE2(name, "Function", value); + }); + const validateUndefined = hideStackFrames((value, name) => { + if (value !== void 0) throw new ERR_INVALID_ARG_TYPE2(name, "undefined", value); + }); + function validateUnion(value, name, union) { + if (!ArrayPrototypeIncludes(union, value)) { + throw new ERR_INVALID_ARG_TYPE2(name, `('${ArrayPrototypeJoin(union, "|")}')`, value); + } + } + const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; + function validateLinkHeaderFormat(value, name) { + if (typeof value === "undefined" || !RegExpPrototypeExec(linkValueRegExp, value)) { + throw new ERR_INVALID_ARG_VALUE( + name, + value, + 'must be an array or string of format "; rel=preload; as=style"' + ); + } + } + function validateLinkHeaderValue(hints) { + if (typeof hints === "string") { + validateLinkHeaderFormat(hints, "hints"); + return hints; + } else if (ArrayIsArray(hints)) { + const hintsLength = hints.length; + let result = ""; + if (hintsLength === 0) { + return result; + } + for (let i = 0; i < hintsLength; i++) { + const link2 = hints[i]; + validateLinkHeaderFormat(link2, "hints"); + result += link2; + if (i !== hintsLength - 1) { + result += ", "; + } + } + return result; + } + throw new ERR_INVALID_ARG_VALUE( + "hints", + hints, + 'must be an array or string of format "; rel=preload; as=style"' + ); + } + validators = { + isInt32, + isUint32, + parseFileMode, + validateArray, + validateStringArray, + validateBooleanArray, + validateAbortSignalArray, + validateBoolean, + validateBuffer: validateBuffer2, + validateDictionary, + validateEncoding, + validateFunction, + validateInt32, + validateInteger, + validateNumber, + validateObject, + validateOneOf, + validatePlainFunction, + validatePort, + validateSignalName, + validateString, + validateUint32, + validateUndefined, + validateUnion, + validateAbortSignal, + validateLinkHeaderValue + }; + return validators; +} +var endOfStream$4 = { exports: {} }; +var utils$6; +var hasRequiredUtils$6; +function requireUtils$6() { + if (hasRequiredUtils$6) return utils$6; + hasRequiredUtils$6 = 1; + const { SymbolAsyncIterator, SymbolIterator, SymbolFor } = requirePrimordials(); + const kIsDestroyed = SymbolFor("nodejs.stream.destroyed"); + const kIsErrored = SymbolFor("nodejs.stream.errored"); + const kIsReadable = SymbolFor("nodejs.stream.readable"); + const kIsWritable = SymbolFor("nodejs.stream.writable"); + const kIsDisturbed = SymbolFor("nodejs.stream.disturbed"); + const kIsClosedPromise = SymbolFor("nodejs.webstream.isClosedPromise"); + const kControllerErrorFunction = SymbolFor("nodejs.webstream.controllerErrorFunction"); + function isReadableNodeStream(obj, strict = false) { + var _obj$_readableState; + return !!(obj && typeof obj.pipe === "function" && typeof obj.on === "function" && (!strict || typeof obj.pause === "function" && typeof obj.resume === "function") && (!obj._writableState || ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === void 0 ? void 0 : _obj$_readableState.readable) !== false) && // Duplex + (!obj._writableState || obj._readableState)); + } + function isWritableNodeStream(obj) { + var _obj$_writableState; + return !!(obj && typeof obj.write === "function" && typeof obj.on === "function" && (!obj._readableState || ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === void 0 ? void 0 : _obj$_writableState.writable) !== false)); + } + function isDuplexNodeStream(obj) { + return !!(obj && typeof obj.pipe === "function" && obj._readableState && typeof obj.on === "function" && typeof obj.write === "function"); + } + function isNodeStream(obj) { + return obj && (obj._readableState || obj._writableState || typeof obj.write === "function" && typeof obj.on === "function" || typeof obj.pipe === "function" && typeof obj.on === "function"); + } + function isReadableStream(obj) { + return !!(obj && !isNodeStream(obj) && typeof obj.pipeThrough === "function" && typeof obj.getReader === "function" && typeof obj.cancel === "function"); + } + function isWritableStream(obj) { + return !!(obj && !isNodeStream(obj) && typeof obj.getWriter === "function" && typeof obj.abort === "function"); + } + function isTransformStream(obj) { + return !!(obj && !isNodeStream(obj) && typeof obj.readable === "object" && typeof obj.writable === "object"); + } + function isWebStream(obj) { + return isReadableStream(obj) || isWritableStream(obj) || isTransformStream(obj); + } + function isIterable(obj, isAsync) { + if (obj == null) return false; + if (isAsync === true) return typeof obj[SymbolAsyncIterator] === "function"; + if (isAsync === false) return typeof obj[SymbolIterator] === "function"; + return typeof obj[SymbolAsyncIterator] === "function" || typeof obj[SymbolIterator] === "function"; + } + function isDestroyed(stream2) { + if (!isNodeStream(stream2)) return null; + const wState = stream2._writableState; + const rState = stream2._readableState; + const state2 = wState || rState; + return !!(stream2.destroyed || stream2[kIsDestroyed] || state2 !== null && state2 !== void 0 && state2.destroyed); + } + function isWritableEnded(stream2) { + if (!isWritableNodeStream(stream2)) return null; + if (stream2.writableEnded === true) return true; + const wState = stream2._writableState; + if (wState !== null && wState !== void 0 && wState.errored) return false; + if (typeof (wState === null || wState === void 0 ? void 0 : wState.ended) !== "boolean") return null; + return wState.ended; + } + function isWritableFinished(stream2, strict) { + if (!isWritableNodeStream(stream2)) return null; + if (stream2.writableFinished === true) return true; + const wState = stream2._writableState; + if (wState !== null && wState !== void 0 && wState.errored) return false; + if (typeof (wState === null || wState === void 0 ? void 0 : wState.finished) !== "boolean") return null; + return !!(wState.finished || strict === false && wState.ended === true && wState.length === 0); + } + function isReadableEnded(stream2) { + if (!isReadableNodeStream(stream2)) return null; + if (stream2.readableEnded === true) return true; + const rState = stream2._readableState; + if (!rState || rState.errored) return false; + if (typeof (rState === null || rState === void 0 ? void 0 : rState.ended) !== "boolean") return null; + return rState.ended; + } + function isReadableFinished(stream2, strict) { + if (!isReadableNodeStream(stream2)) return null; + const rState = stream2._readableState; + if (rState !== null && rState !== void 0 && rState.errored) return false; + if (typeof (rState === null || rState === void 0 ? void 0 : rState.endEmitted) !== "boolean") return null; + return !!(rState.endEmitted || strict === false && rState.ended === true && rState.length === 0); + } + function isReadable(stream2) { + if (stream2 && stream2[kIsReadable] != null) return stream2[kIsReadable]; + if (typeof (stream2 === null || stream2 === void 0 ? void 0 : stream2.readable) !== "boolean") return null; + if (isDestroyed(stream2)) return false; + return isReadableNodeStream(stream2) && stream2.readable && !isReadableFinished(stream2); + } + function isWritable(stream2) { + if (stream2 && stream2[kIsWritable] != null) return stream2[kIsWritable]; + if (typeof (stream2 === null || stream2 === void 0 ? void 0 : stream2.writable) !== "boolean") return null; + if (isDestroyed(stream2)) return false; + return isWritableNodeStream(stream2) && stream2.writable && !isWritableEnded(stream2); + } + function isFinished(stream2, opts) { + if (!isNodeStream(stream2)) { + return null; + } + if (isDestroyed(stream2)) { + return true; + } + if ((opts === null || opts === void 0 ? void 0 : opts.readable) !== false && isReadable(stream2)) { + return false; + } + if ((opts === null || opts === void 0 ? void 0 : opts.writable) !== false && isWritable(stream2)) { + return false; + } + return true; + } + function isWritableErrored(stream2) { + var _stream$_writableStat, _stream$_writableStat2; + if (!isNodeStream(stream2)) { + return null; + } + if (stream2.writableErrored) { + return stream2.writableErrored; + } + return (_stream$_writableStat = (_stream$_writableStat2 = stream2._writableState) === null || _stream$_writableStat2 === void 0 ? void 0 : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== void 0 ? _stream$_writableStat : null; + } + function isReadableErrored(stream2) { + var _stream$_readableStat, _stream$_readableStat2; + if (!isNodeStream(stream2)) { + return null; + } + if (stream2.readableErrored) { + return stream2.readableErrored; + } + return (_stream$_readableStat = (_stream$_readableStat2 = stream2._readableState) === null || _stream$_readableStat2 === void 0 ? void 0 : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== void 0 ? _stream$_readableStat : null; + } + function isClosed(stream2) { + if (!isNodeStream(stream2)) { + return null; + } + if (typeof stream2.closed === "boolean") { + return stream2.closed; + } + const wState = stream2._writableState; + const rState = stream2._readableState; + if (typeof (wState === null || wState === void 0 ? void 0 : wState.closed) === "boolean" || typeof (rState === null || rState === void 0 ? void 0 : rState.closed) === "boolean") { + return (wState === null || wState === void 0 ? void 0 : wState.closed) || (rState === null || rState === void 0 ? void 0 : rState.closed); + } + if (typeof stream2._closed === "boolean" && isOutgoingMessage(stream2)) { + return stream2._closed; + } + return null; + } + function isOutgoingMessage(stream2) { + return typeof stream2._closed === "boolean" && typeof stream2._defaultKeepAlive === "boolean" && typeof stream2._removedConnection === "boolean" && typeof stream2._removedContLen === "boolean"; + } + function isServerResponse(stream2) { + return typeof stream2._sent100 === "boolean" && isOutgoingMessage(stream2); + } + function isServerRequest(stream2) { + var _stream$req; + return typeof stream2._consuming === "boolean" && typeof stream2._dumped === "boolean" && ((_stream$req = stream2.req) === null || _stream$req === void 0 ? void 0 : _stream$req.upgradeOrConnect) === void 0; + } + function willEmitClose(stream2) { + if (!isNodeStream(stream2)) return null; + const wState = stream2._writableState; + const rState = stream2._readableState; + const state2 = wState || rState; + return !state2 && isServerResponse(stream2) || !!(state2 && state2.autoDestroy && state2.emitClose && state2.closed === false); + } + function isDisturbed(stream2) { + var _stream$kIsDisturbed; + return !!(stream2 && ((_stream$kIsDisturbed = stream2[kIsDisturbed]) !== null && _stream$kIsDisturbed !== void 0 ? _stream$kIsDisturbed : stream2.readableDidRead || stream2.readableAborted)); + } + function isErrored(stream2) { + var _ref, _ref2, _ref3, _ref4, _ref5, _stream$kIsErrored, _stream$_readableStat3, _stream$_writableStat3, _stream$_readableStat4, _stream$_writableStat4; + return !!(stream2 && ((_ref = (_ref2 = (_ref3 = (_ref4 = (_ref5 = (_stream$kIsErrored = stream2[kIsErrored]) !== null && _stream$kIsErrored !== void 0 ? _stream$kIsErrored : stream2.readableErrored) !== null && _ref5 !== void 0 ? _ref5 : stream2.writableErrored) !== null && _ref4 !== void 0 ? _ref4 : (_stream$_readableStat3 = stream2._readableState) === null || _stream$_readableStat3 === void 0 ? void 0 : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== void 0 ? _ref3 : (_stream$_writableStat3 = stream2._writableState) === null || _stream$_writableStat3 === void 0 ? void 0 : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== void 0 ? _ref2 : (_stream$_readableStat4 = stream2._readableState) === null || _stream$_readableStat4 === void 0 ? void 0 : _stream$_readableStat4.errored) !== null && _ref !== void 0 ? _ref : (_stream$_writableStat4 = stream2._writableState) === null || _stream$_writableStat4 === void 0 ? void 0 : _stream$_writableStat4.errored)); + } + utils$6 = { + isDestroyed, + kIsDestroyed, + isDisturbed, + kIsDisturbed, + isErrored, + kIsErrored, + isReadable, + kIsReadable, + kIsClosedPromise, + kControllerErrorFunction, + kIsWritable, + isClosed, + isDuplexNodeStream, + isFinished, + isIterable, + isReadableNodeStream, + isReadableStream, + isReadableEnded, + isReadableFinished, + isReadableErrored, + isNodeStream, + isWebStream, + isWritable, + isWritableNodeStream, + isWritableStream, + isWritableEnded, + isWritableFinished, + isWritableErrored, + isServerRequest, + isServerResponse, + willEmitClose, + isTransformStream + }; + return utils$6; +} +var hasRequiredEndOfStream$4; +function requireEndOfStream$4() { + if (hasRequiredEndOfStream$4) return endOfStream$4.exports; + hasRequiredEndOfStream$4 = 1; + const process2 = requireBrowser$j(); + const { AbortError, codes } = requireErrors(); + const { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_STREAM_PREMATURE_CLOSE } = codes; + const { kEmptyObject, once: once2 } = requireUtil$3(); + const { validateAbortSignal, validateFunction, validateObject, validateBoolean } = requireValidators(); + const { Promise: Promise2, PromisePrototypeThen, SymbolDispose } = requirePrimordials(); + const { + isClosed, + isReadable, + isReadableNodeStream, + isReadableStream, + isReadableFinished, + isReadableErrored, + isWritable, + isWritableNodeStream, + isWritableStream, + isWritableFinished, + isWritableErrored, + isNodeStream, + willEmitClose: _willEmitClose, + kIsClosedPromise + } = requireUtils$6(); + let addAbortListener; + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + const nop = () => { + }; + function eos(stream2, options2, callback) { + var _options$readable, _options$writable; + if (arguments.length === 2) { + callback = options2; + options2 = kEmptyObject; + } else if (options2 == null) { + options2 = kEmptyObject; + } else { + validateObject(options2, "options"); + } + validateFunction(callback, "callback"); + validateAbortSignal(options2.signal, "options.signal"); + callback = once2(callback); + if (isReadableStream(stream2) || isWritableStream(stream2)) { + return eosWeb(stream2, options2, callback); + } + if (!isNodeStream(stream2)) { + throw new ERR_INVALID_ARG_TYPE2("stream", ["ReadableStream", "WritableStream", "Stream"], stream2); + } + const readable2 = (_options$readable = options2.readable) !== null && _options$readable !== void 0 ? _options$readable : isReadableNodeStream(stream2); + const writable2 = (_options$writable = options2.writable) !== null && _options$writable !== void 0 ? _options$writable : isWritableNodeStream(stream2); + const wState = stream2._writableState; + const rState = stream2._readableState; + const onlegacyfinish = () => { + if (!stream2.writable) { + onfinish(); + } + }; + let willEmitClose = _willEmitClose(stream2) && isReadableNodeStream(stream2) === readable2 && isWritableNodeStream(stream2) === writable2; + let writableFinished = isWritableFinished(stream2, false); + const onfinish = () => { + writableFinished = true; + if (stream2.destroyed) { + willEmitClose = false; + } + if (willEmitClose && (!stream2.readable || readable2)) { + return; + } + if (!readable2 || readableFinished) { + callback.call(stream2); + } + }; + let readableFinished = isReadableFinished(stream2, false); + const onend = () => { + readableFinished = true; + if (stream2.destroyed) { + willEmitClose = false; + } + if (willEmitClose && (!stream2.writable || writable2)) { + return; + } + if (!writable2 || writableFinished) { + callback.call(stream2); + } + }; + const onerror = (err) => { + callback.call(stream2, err); + }; + let closed = isClosed(stream2); + const onclose = () => { + closed = true; + const errored = isWritableErrored(stream2) || isReadableErrored(stream2); + if (errored && typeof errored !== "boolean") { + return callback.call(stream2, errored); + } + if (readable2 && !readableFinished && isReadableNodeStream(stream2, true)) { + if (!isReadableFinished(stream2, false)) return callback.call(stream2, new ERR_STREAM_PREMATURE_CLOSE()); + } + if (writable2 && !writableFinished) { + if (!isWritableFinished(stream2, false)) return callback.call(stream2, new ERR_STREAM_PREMATURE_CLOSE()); + } + callback.call(stream2); + }; + const onclosed = () => { + closed = true; + const errored = isWritableErrored(stream2) || isReadableErrored(stream2); + if (errored && typeof errored !== "boolean") { + return callback.call(stream2, errored); + } + callback.call(stream2); + }; + const onrequest = () => { + stream2.req.on("finish", onfinish); + }; + if (isRequest(stream2)) { + stream2.on("complete", onfinish); + if (!willEmitClose) { + stream2.on("abort", onclose); + } + if (stream2.req) { + onrequest(); + } else { + stream2.on("request", onrequest); + } + } else if (writable2 && !wState) { + stream2.on("end", onlegacyfinish); + stream2.on("close", onlegacyfinish); + } + if (!willEmitClose && typeof stream2.aborted === "boolean") { + stream2.on("aborted", onclose); + } + stream2.on("end", onend); + stream2.on("finish", onfinish); + if (options2.error !== false) { + stream2.on("error", onerror); + } + stream2.on("close", onclose); + if (closed) { + process2.nextTick(onclose); + } else if (wState !== null && wState !== void 0 && wState.errorEmitted || rState !== null && rState !== void 0 && rState.errorEmitted) { + if (!willEmitClose) { + process2.nextTick(onclosed); + } + } else if (!readable2 && (!willEmitClose || isReadable(stream2)) && (writableFinished || isWritable(stream2) === false)) { + process2.nextTick(onclosed); + } else if (!writable2 && (!willEmitClose || isWritable(stream2)) && (readableFinished || isReadable(stream2) === false)) { + process2.nextTick(onclosed); + } else if (rState && stream2.req && stream2.aborted) { + process2.nextTick(onclosed); + } + const cleanup = () => { + callback = nop; + stream2.removeListener("aborted", onclose); + stream2.removeListener("complete", onfinish); + stream2.removeListener("abort", onclose); + stream2.removeListener("request", onrequest); + if (stream2.req) stream2.req.removeListener("finish", onfinish); + stream2.removeListener("end", onlegacyfinish); + stream2.removeListener("close", onlegacyfinish); + stream2.removeListener("finish", onfinish); + stream2.removeListener("end", onend); + stream2.removeListener("error", onerror); + stream2.removeListener("close", onclose); + }; + if (options2.signal && !closed) { + const abort = () => { + const endCallback = callback; + cleanup(); + endCallback.call( + stream2, + new AbortError(void 0, { + cause: options2.signal.reason + }) + ); + }; + if (options2.signal.aborted) { + process2.nextTick(abort); + } else { + addAbortListener = addAbortListener || requireUtil$3().addAbortListener; + const disposable = addAbortListener(options2.signal, abort); + const originalCallback = callback; + callback = once2((...args) => { + disposable[SymbolDispose](); + originalCallback.apply(stream2, args); + }); + } + } + return cleanup; + } + function eosWeb(stream2, options2, callback) { + let isAborted = false; + let abort = nop; + if (options2.signal) { + abort = () => { + isAborted = true; + callback.call( + stream2, + new AbortError(void 0, { + cause: options2.signal.reason + }) + ); + }; + if (options2.signal.aborted) { + process2.nextTick(abort); + } else { + addAbortListener = addAbortListener || requireUtil$3().addAbortListener; + const disposable = addAbortListener(options2.signal, abort); + const originalCallback = callback; + callback = once2((...args) => { + disposable[SymbolDispose](); + originalCallback.apply(stream2, args); + }); + } + } + const resolverFn = (...args) => { + if (!isAborted) { + process2.nextTick(() => callback.apply(stream2, args)); + } + }; + PromisePrototypeThen(stream2[kIsClosedPromise].promise, resolverFn, resolverFn); + return nop; + } + function finished(stream2, opts) { + var _opts; + let autoCleanup = false; + if (opts === null) { + opts = kEmptyObject; + } + if ((_opts = opts) !== null && _opts !== void 0 && _opts.cleanup) { + validateBoolean(opts.cleanup, "cleanup"); + autoCleanup = opts.cleanup; + } + return new Promise2((resolve, reject) => { + const cleanup = eos(stream2, opts, (err) => { + if (autoCleanup) { + cleanup(); + } + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + endOfStream$4.exports = eos; + endOfStream$4.exports.finished = finished; + return endOfStream$4.exports; +} +var destroy_1$3; +var hasRequiredDestroy$3; +function requireDestroy$3() { + if (hasRequiredDestroy$3) return destroy_1$3; + hasRequiredDestroy$3 = 1; + const process2 = requireBrowser$j(); + const { + aggregateTwoErrors, + codes: { ERR_MULTIPLE_CALLBACK }, + AbortError + } = requireErrors(); + const { Symbol: Symbol2 } = requirePrimordials(); + const { kIsDestroyed, isDestroyed, isFinished, isServerRequest } = requireUtils$6(); + const kDestroy = Symbol2("kDestroy"); + const kConstruct = Symbol2("kConstruct"); + function checkError(err, w, r) { + if (err) { + err.stack; + if (w && !w.errored) { + w.errored = err; + } + if (r && !r.errored) { + r.errored = err; + } + } + } + function destroy(err, cb) { + const r = this._readableState; + const w = this._writableState; + const s = w || r; + if (w !== null && w !== void 0 && w.destroyed || r !== null && r !== void 0 && r.destroyed) { + if (typeof cb === "function") { + cb(); + } + return this; + } + checkError(err, w, r); + if (w) { + w.destroyed = true; + } + if (r) { + r.destroyed = true; + } + if (!s.constructed) { + this.once(kDestroy, function(er) { + _destroy(this, aggregateTwoErrors(er, err), cb); + }); + } else { + _destroy(this, err, cb); + } + return this; + } + function _destroy(self2, err, cb) { + let called = false; + function onDestroy(err2) { + if (called) { + return; + } + called = true; + const r = self2._readableState; + const w = self2._writableState; + checkError(err2, w, r); + if (w) { + w.closed = true; + } + if (r) { + r.closed = true; + } + if (typeof cb === "function") { + cb(err2); + } + if (err2) { + process2.nextTick(emitErrorCloseNT, self2, err2); + } else { + process2.nextTick(emitCloseNT, self2); + } + } + try { + self2._destroy(err || null, onDestroy); + } catch (err2) { + onDestroy(err2); + } + } + function emitErrorCloseNT(self2, err) { + emitErrorNT(self2, err); + emitCloseNT(self2); + } + function emitCloseNT(self2) { + const r = self2._readableState; + const w = self2._writableState; + if (w) { + w.closeEmitted = true; + } + if (r) { + r.closeEmitted = true; + } + if (w !== null && w !== void 0 && w.emitClose || r !== null && r !== void 0 && r.emitClose) { + self2.emit("close"); + } + } + function emitErrorNT(self2, err) { + const r = self2._readableState; + const w = self2._writableState; + if (w !== null && w !== void 0 && w.errorEmitted || r !== null && r !== void 0 && r.errorEmitted) { + return; + } + if (w) { + w.errorEmitted = true; + } + if (r) { + r.errorEmitted = true; + } + self2.emit("error", err); + } + function undestroy() { + const r = this._readableState; + const w = this._writableState; + if (r) { + r.constructed = true; + r.closed = false; + r.closeEmitted = false; + r.destroyed = false; + r.errored = null; + r.errorEmitted = false; + r.reading = false; + r.ended = r.readable === false; + r.endEmitted = r.readable === false; + } + if (w) { + w.constructed = true; + w.destroyed = false; + w.closed = false; + w.closeEmitted = false; + w.errored = null; + w.errorEmitted = false; + w.finalCalled = false; + w.prefinished = false; + w.ended = w.writable === false; + w.ending = w.writable === false; + w.finished = w.writable === false; + } + } + function errorOrDestroy(stream2, err, sync) { + const r = stream2._readableState; + const w = stream2._writableState; + if (w !== null && w !== void 0 && w.destroyed || r !== null && r !== void 0 && r.destroyed) { + return this; + } + if (r !== null && r !== void 0 && r.autoDestroy || w !== null && w !== void 0 && w.autoDestroy) + stream2.destroy(err); + else if (err) { + err.stack; + if (w && !w.errored) { + w.errored = err; + } + if (r && !r.errored) { + r.errored = err; + } + if (sync) { + process2.nextTick(emitErrorNT, stream2, err); + } else { + emitErrorNT(stream2, err); + } + } + } + function construct(stream2, cb) { + if (typeof stream2._construct !== "function") { + return; + } + const r = stream2._readableState; + const w = stream2._writableState; + if (r) { + r.constructed = false; + } + if (w) { + w.constructed = false; + } + stream2.once(kConstruct, cb); + if (stream2.listenerCount(kConstruct) > 1) { + return; + } + process2.nextTick(constructNT, stream2); + } + function constructNT(stream2) { + let called = false; + function onConstruct(err) { + if (called) { + errorOrDestroy(stream2, err !== null && err !== void 0 ? err : new ERR_MULTIPLE_CALLBACK()); + return; + } + called = true; + const r = stream2._readableState; + const w = stream2._writableState; + const s = w || r; + if (r) { + r.constructed = true; + } + if (w) { + w.constructed = true; + } + if (s.destroyed) { + stream2.emit(kDestroy, err); + } else if (err) { + errorOrDestroy(stream2, err, true); + } else { + process2.nextTick(emitConstructNT, stream2); + } + } + try { + stream2._construct((err) => { + process2.nextTick(onConstruct, err); + }); + } catch (err) { + process2.nextTick(onConstruct, err); + } + } + function emitConstructNT(stream2) { + stream2.emit(kConstruct); + } + function isRequest(stream2) { + return (stream2 === null || stream2 === void 0 ? void 0 : stream2.setHeader) && typeof stream2.abort === "function"; + } + function emitCloseLegacy(stream2) { + stream2.emit("close"); + } + function emitErrorCloseLegacy(stream2, err) { + stream2.emit("error", err); + process2.nextTick(emitCloseLegacy, stream2); + } + function destroyer(stream2, err) { + if (!stream2 || isDestroyed(stream2)) { + return; + } + if (!err && !isFinished(stream2)) { + err = new AbortError(); + } + if (isServerRequest(stream2)) { + stream2.socket = null; + stream2.destroy(err); + } else if (isRequest(stream2)) { + stream2.abort(); + } else if (isRequest(stream2.req)) { + stream2.req.abort(); + } else if (typeof stream2.destroy === "function") { + stream2.destroy(err); + } else if (typeof stream2.close === "function") { + stream2.close(); + } else if (err) { + process2.nextTick(emitErrorCloseLegacy, stream2, err); + } else { + process2.nextTick(emitCloseLegacy, stream2); + } + if (!stream2.destroyed) { + stream2[kIsDestroyed] = true; + } + } + destroy_1$3 = { + construct, + destroyer, + destroy, + undestroy, + errorOrDestroy + }; + return destroy_1$3; +} +var legacy$1; +var hasRequiredLegacy$1; +function requireLegacy$1() { + if (hasRequiredLegacy$1) return legacy$1; + hasRequiredLegacy$1 = 1; + const { ArrayIsArray, ObjectSetPrototypeOf } = requirePrimordials(); + const { EventEmitter: EE } = requireEvents(); + function Stream2(opts) { + EE.call(this, opts); + } + ObjectSetPrototypeOf(Stream2.prototype, EE.prototype); + ObjectSetPrototypeOf(Stream2, EE); + Stream2.prototype.pipe = function(dest, options2) { + const source2 = this; + function ondata(chunk) { + if (dest.writable && dest.write(chunk) === false && source2.pause) { + source2.pause(); + } + } + source2.on("data", ondata); + function ondrain() { + if (source2.readable && source2.resume) { + source2.resume(); + } + } + dest.on("drain", ondrain); + if (!dest._isStdio && (!options2 || options2.end !== false)) { + source2.on("end", onend); + source2.on("close", onclose); + } + let didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + dest.end(); + } + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + if (typeof dest.destroy === "function") dest.destroy(); + } + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, "error") === 0) { + this.emit("error", er); + } + } + prependListener(source2, "error", onerror); + prependListener(dest, "error", onerror); + function cleanup() { + source2.removeListener("data", ondata); + dest.removeListener("drain", ondrain); + source2.removeListener("end", onend); + source2.removeListener("close", onclose); + source2.removeListener("error", onerror); + dest.removeListener("error", onerror); + source2.removeListener("end", cleanup); + source2.removeListener("close", cleanup); + dest.removeListener("close", cleanup); + } + source2.on("end", cleanup); + source2.on("close", cleanup); + dest.on("close", cleanup); + dest.emit("pipe", source2); + return dest; + }; + function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === "function") return emitter.prependListener(event, fn); + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn); + else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn); + else emitter._events[event] = [fn, emitter._events[event]]; + } + legacy$1 = { + Stream: Stream2, + prependListener + }; + return legacy$1; +} +var addAbortSignal = { exports: {} }; +var hasRequiredAddAbortSignal; +function requireAddAbortSignal() { + if (hasRequiredAddAbortSignal) return addAbortSignal.exports; + hasRequiredAddAbortSignal = 1; + (function(module) { + const { SymbolDispose } = requirePrimordials(); + const { AbortError, codes } = requireErrors(); + const { isNodeStream, isWebStream, kControllerErrorFunction } = requireUtils$6(); + const eos = requireEndOfStream$4(); + const { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2 } = codes; + let addAbortListener; + const validateAbortSignal = (signal, name) => { + if (typeof signal !== "object" || !("aborted" in signal)) { + throw new ERR_INVALID_ARG_TYPE2(name, "AbortSignal", signal); + } + }; + module.exports.addAbortSignal = function addAbortSignal2(signal, stream2) { + validateAbortSignal(signal, "signal"); + if (!isNodeStream(stream2) && !isWebStream(stream2)) { + throw new ERR_INVALID_ARG_TYPE2("stream", ["ReadableStream", "WritableStream", "Stream"], stream2); + } + return module.exports.addAbortSignalNoValidate(signal, stream2); + }; + module.exports.addAbortSignalNoValidate = function(signal, stream2) { + if (typeof signal !== "object" || !("aborted" in signal)) { + return stream2; + } + const onAbort = isNodeStream(stream2) ? () => { + stream2.destroy( + new AbortError(void 0, { + cause: signal.reason + }) + ); + } : () => { + stream2[kControllerErrorFunction]( + new AbortError(void 0, { + cause: signal.reason + }) + ); + }; + if (signal.aborted) { + onAbort(); + } else { + addAbortListener = addAbortListener || requireUtil$3().addAbortListener; + const disposable = addAbortListener(signal, onAbort); + eos(stream2, disposable[SymbolDispose]); + } + return stream2; + }; + })(addAbortSignal); + return addAbortSignal.exports; +} +var buffer_list$3; +var hasRequiredBuffer_list$3; +function requireBuffer_list$3() { + if (hasRequiredBuffer_list$3) return buffer_list$3; + hasRequiredBuffer_list$3 = 1; + const { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array: Uint8Array2 } = requirePrimordials(); + const { Buffer: Buffer2 } = requireBuffer$2(); + const { inspect } = requireUtil$3(); + buffer_list$3 = class BufferList { + constructor() { + this.head = null; + this.tail = null; + this.length = 0; + } + push(v) { + const entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + } + unshift(v) { + const entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + shift() { + if (this.length === 0) return; + const ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + } + clear() { + this.head = this.tail = null; + this.length = 0; + } + join(s) { + if (this.length === 0) return ""; + let p = this.head; + let ret = "" + p.data; + while ((p = p.next) !== null) ret += s + p.data; + return ret; + } + concat(n) { + if (this.length === 0) return Buffer2.alloc(0); + const ret = Buffer2.allocUnsafe(n >>> 0); + let p = this.head; + let i = 0; + while (p) { + TypedArrayPrototypeSet(ret, p.data, i); + i += p.data.length; + p = p.next; + } + return ret; + } + // Consumes a specified amount of bytes or characters from the buffered data. + consume(n, hasStrings) { + const data2 = this.head.data; + if (n < data2.length) { + const slice = data2.slice(0, n); + this.head.data = data2.slice(n); + return slice; + } + if (n === data2.length) { + return this.shift(); + } + return hasStrings ? this._getString(n) : this._getBuffer(n); + } + first() { + return this.head.data; + } + *[SymbolIterator]() { + for (let p = this.head; p; p = p.next) { + yield p.data; + } + } + // Consumes a specified amount of characters from the buffered data. + _getString(n) { + let ret = ""; + let p = this.head; + let c = 0; + do { + const str = p.data; + if (n > str.length) { + ret += str; + n -= str.length; + } else { + if (n === str.length) { + ret += str; + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + ret += StringPrototypeSlice(str, 0, n); + this.head = p; + p.data = StringPrototypeSlice(str, n); + } + break; + } + ++c; + } while ((p = p.next) !== null); + this.length -= c; + return ret; + } + // Consumes a specified amount of bytes from the buffered data. + _getBuffer(n) { + const ret = Buffer2.allocUnsafe(n); + const retLen = n; + let p = this.head; + let c = 0; + do { + const buf = p.data; + if (n > buf.length) { + TypedArrayPrototypeSet(ret, buf, retLen - n); + n -= buf.length; + } else { + if (n === buf.length) { + TypedArrayPrototypeSet(ret, buf, retLen - n); + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + TypedArrayPrototypeSet(ret, new Uint8Array2(buf.buffer, buf.byteOffset, n), retLen - n); + this.head = p; + p.data = buf.slice(n); + } + break; + } + ++c; + } while ((p = p.next) !== null); + this.length -= c; + return ret; + } + // Make sure the linked list only shows the minimal necessary information. + [Symbol.for("nodejs.util.inspect.custom")](_, options2) { + return inspect(this, { + ...options2, + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + }); + } + }; + return buffer_list$3; +} +var state$3; +var hasRequiredState$3; +function requireState$3() { + if (hasRequiredState$3) return state$3; + hasRequiredState$3 = 1; + const { MathFloor, NumberIsInteger } = requirePrimordials(); + const { validateInteger } = requireValidators(); + const { ERR_INVALID_ARG_VALUE } = requireErrors().codes; + let defaultHighWaterMarkBytes = 16 * 1024; + let defaultHighWaterMarkObjectMode = 16; + function highWaterMarkFrom(options2, isDuplex, duplexKey) { + return options2.highWaterMark != null ? options2.highWaterMark : isDuplex ? options2[duplexKey] : null; + } + function getDefaultHighWaterMark(objectMode) { + return objectMode ? defaultHighWaterMarkObjectMode : defaultHighWaterMarkBytes; + } + function setDefaultHighWaterMark(objectMode, value) { + validateInteger(value, "value", 0); + if (objectMode) { + defaultHighWaterMarkObjectMode = value; + } else { + defaultHighWaterMarkBytes = value; + } + } + function getHighWaterMark(state2, options2, duplexKey, isDuplex) { + const hwm = highWaterMarkFrom(options2, isDuplex, duplexKey); + if (hwm != null) { + if (!NumberIsInteger(hwm) || hwm < 0) { + const name = isDuplex ? `options.${duplexKey}` : "options.highWaterMark"; + throw new ERR_INVALID_ARG_VALUE(name, hwm); + } + return MathFloor(hwm); + } + return getDefaultHighWaterMark(state2.objectMode); + } + state$3 = { + getHighWaterMark, + getDefaultHighWaterMark, + setDefaultHighWaterMark + }; + return state$3; +} +var string_decoder = {}; +var safeBuffer = { exports: {} }; +/*! safe-buffer. MIT License. Feross Aboukhadijeh */ +var hasRequiredSafeBuffer; +function requireSafeBuffer() { + if (hasRequiredSafeBuffer) return safeBuffer.exports; + hasRequiredSafeBuffer = 1; + (function(module, exports) { + var buffer2 = requireBuffer$2(); + var Buffer2 = buffer2.Buffer; + function copyProps(src2, dst) { + for (var key2 in src2) { + dst[key2] = src2[key2]; + } + } + if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { + module.exports = buffer2; + } else { + copyProps(buffer2, exports); + exports.Buffer = SafeBuffer; + } + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer2(arg, encodingOrOffset, length); + } + SafeBuffer.prototype = Object.create(Buffer2.prototype); + copyProps(Buffer2, SafeBuffer); + SafeBuffer.from = function(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + throw new TypeError("Argument must not be a number"); + } + return Buffer2(arg, encodingOrOffset, length); + }; + SafeBuffer.alloc = function(size, fill, encoding2) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + var buf = Buffer2(size); + if (fill !== void 0) { + if (typeof encoding2 === "string") { + buf.fill(fill, encoding2); + } else { + buf.fill(fill); + } + } else { + buf.fill(0); + } + return buf; + }; + SafeBuffer.allocUnsafe = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return Buffer2(size); + }; + SafeBuffer.allocUnsafeSlow = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return buffer2.SlowBuffer(size); + }; + })(safeBuffer, safeBuffer.exports); + return safeBuffer.exports; +} +var hasRequiredString_decoder; +function requireString_decoder() { + if (hasRequiredString_decoder) return string_decoder; + hasRequiredString_decoder = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var isEncoding = Buffer2.isEncoding || function(encoding2) { + encoding2 = "" + encoding2; + switch (encoding2 && encoding2.toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + case "raw": + return true; + default: + return false; + } + }; + function _normalizeEncoding(enc) { + if (!enc) return "utf8"; + var retried; + while (true) { + switch (enc) { + case "utf8": + case "utf-8": + return "utf8"; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return "utf16le"; + case "latin1": + case "binary": + return "latin1"; + case "base64": + case "ascii": + case "hex": + return enc; + default: + if (retried) return; + enc = ("" + enc).toLowerCase(); + retried = true; + } + } + } + function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== "string" && (Buffer2.isEncoding === isEncoding || !isEncoding(enc))) throw new Error("Unknown encoding: " + enc); + return nenc || enc; + } + string_decoder.StringDecoder = StringDecoder; + function StringDecoder(encoding2) { + this.encoding = normalizeEncoding(encoding2); + var nb; + switch (this.encoding) { + case "utf16le": + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case "utf8": + this.fillLast = utf8FillLast; + nb = 4; + break; + case "base64": + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer2.allocUnsafe(nb); + } + StringDecoder.prototype.write = function(buf) { + if (buf.length === 0) return ""; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === void 0) return ""; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ""; + }; + StringDecoder.prototype.end = utf8End; + StringDecoder.prototype.text = utf8Text; + StringDecoder.prototype.fillLast = function(buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; + }; + function utf8CheckByte(byte) { + if (byte <= 127) return 0; + else if (byte >> 5 === 6) return 2; + else if (byte >> 4 === 14) return 3; + else if (byte >> 3 === 30) return 4; + return byte >> 6 === 2 ? -1 : -2; + } + function utf8CheckIncomplete(self2, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self2.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self2.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0; + else self2.lastNeed = nb - 3; + } + return nb; + } + return 0; + } + function utf8CheckExtraBytes(self2, buf, p) { + if ((buf[0] & 192) !== 128) { + self2.lastNeed = 0; + return "�"; + } + if (self2.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 192) !== 128) { + self2.lastNeed = 1; + return "�"; + } + if (self2.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 192) !== 128) { + self2.lastNeed = 2; + return "�"; + } + } + } + } + function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf); + if (r !== void 0) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; + } + function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString("utf8", i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString("utf8", i, end); + } + function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) return r + "�"; + return r; + } + function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString("utf16le", i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 55296 && c <= 56319) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString("utf16le", i, buf.length - 1); + } + function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString("utf16le", 0, end); + } + return r; + } + function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString("base64", i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString("base64", i, buf.length - n); + } + function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) return r + this.lastChar.toString("base64", 0, 3 - this.lastNeed); + return r; + } + function simpleWrite(buf) { + return buf.toString(this.encoding); + } + function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ""; + } + return string_decoder; +} +var from_1; +var hasRequiredFrom; +function requireFrom() { + if (hasRequiredFrom) return from_1; + hasRequiredFrom = 1; + const process2 = requireBrowser$j(); + const { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = requirePrimordials(); + const { Buffer: Buffer2 } = requireBuffer$2(); + const { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_STREAM_NULL_VALUES } = requireErrors().codes; + function from2(Readable, iterable, opts) { + let iterator; + if (typeof iterable === "string" || iterable instanceof Buffer2) { + return new Readable({ + objectMode: true, + ...opts, + read() { + this.push(iterable); + this.push(null); + } + }); + } + let isAsync; + if (iterable && iterable[SymbolAsyncIterator]) { + isAsync = true; + iterator = iterable[SymbolAsyncIterator](); + } else if (iterable && iterable[SymbolIterator]) { + isAsync = false; + iterator = iterable[SymbolIterator](); + } else { + throw new ERR_INVALID_ARG_TYPE2("iterable", ["Iterable"], iterable); + } + const readable2 = new Readable({ + objectMode: true, + highWaterMark: 1, + // TODO(ronag): What options should be allowed? + ...opts + }); + let reading = false; + readable2._read = function() { + if (!reading) { + reading = true; + next(); + } + }; + readable2._destroy = function(error2, cb) { + PromisePrototypeThen( + close2(error2), + () => process2.nextTick(cb, error2), + // nextTick is here in case cb throws + (e) => process2.nextTick(cb, e || error2) + ); + }; + async function close2(error2) { + const hadError = error2 !== void 0 && error2 !== null; + const hasThrow = typeof iterator.throw === "function"; + if (hadError && hasThrow) { + const { value, done } = await iterator.throw(error2); + await value; + if (done) { + return; + } + } + if (typeof iterator.return === "function") { + const { value } = await iterator.return(); + await value; + } + } + async function next() { + for (; ; ) { + try { + const { value, done } = isAsync ? await iterator.next() : iterator.next(); + if (done) { + readable2.push(null); + } else { + const res = value && typeof value.then === "function" ? await value : value; + if (res === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); + } else if (readable2.push(res)) { + continue; + } else { + reading = false; + } + } + } catch (err) { + readable2.destroy(err); + } + break; + } + } + return readable2; + } + from_1 = from2; + return from_1; +} +var readable; +var hasRequiredReadable; +function requireReadable() { + if (hasRequiredReadable) return readable; + hasRequiredReadable = 1; + const process2 = requireBrowser$j(); + const { + ArrayPrototypeIndexOf, + NumberIsInteger, + NumberIsNaN, + NumberParseInt, + ObjectDefineProperties, + ObjectKeys, + ObjectSetPrototypeOf, + Promise: Promise2, + SafeSet, + SymbolAsyncDispose, + SymbolAsyncIterator, + Symbol: Symbol2 + } = requirePrimordials(); + readable = Readable; + Readable.ReadableState = ReadableState; + const { EventEmitter: EE } = requireEvents(); + const { Stream: Stream2, prependListener } = requireLegacy$1(); + const { Buffer: Buffer2 } = requireBuffer$2(); + const { addAbortSignal: addAbortSignal2 } = requireAddAbortSignal(); + const eos = requireEndOfStream$4(); + let debug2 = requireUtil$3().debuglog("stream", (fn) => { + debug2 = fn; + }); + const BufferList = requireBuffer_list$3(); + const destroyImpl = requireDestroy$3(); + const { getHighWaterMark, getDefaultHighWaterMark } = requireState$3(); + const { + aggregateTwoErrors, + codes: { + ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_OUT_OF_RANGE, + ERR_STREAM_PUSH_AFTER_EOF, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT + }, + AbortError + } = requireErrors(); + const { validateObject } = requireValidators(); + const kPaused = Symbol2("kPaused"); + const { StringDecoder } = requireString_decoder(); + const from2 = requireFrom(); + ObjectSetPrototypeOf(Readable.prototype, Stream2.prototype); + ObjectSetPrototypeOf(Readable, Stream2); + const nop = () => { + }; + const { errorOrDestroy } = destroyImpl; + const kObjectMode = 1 << 0; + const kEnded = 1 << 1; + const kEndEmitted = 1 << 2; + const kReading = 1 << 3; + const kConstructed = 1 << 4; + const kSync = 1 << 5; + const kNeedReadable = 1 << 6; + const kEmittedReadable = 1 << 7; + const kReadableListening = 1 << 8; + const kResumeScheduled = 1 << 9; + const kErrorEmitted = 1 << 10; + const kEmitClose = 1 << 11; + const kAutoDestroy = 1 << 12; + const kDestroyed = 1 << 13; + const kClosed = 1 << 14; + const kCloseEmitted = 1 << 15; + const kMultiAwaitDrain = 1 << 16; + const kReadingMore = 1 << 17; + const kDataEmitted = 1 << 18; + function makeBitMapDescriptor(bit) { + return { + enumerable: false, + get() { + return (this.state & bit) !== 0; + }, + set(value) { + if (value) this.state |= bit; + else this.state &= ~bit; + } + }; + } + ObjectDefineProperties(ReadableState.prototype, { + objectMode: makeBitMapDescriptor(kObjectMode), + ended: makeBitMapDescriptor(kEnded), + endEmitted: makeBitMapDescriptor(kEndEmitted), + reading: makeBitMapDescriptor(kReading), + // Stream is still being constructed and cannot be + // destroyed until construction finished or failed. + // Async construction is opt in, therefore we start as + // constructed. + constructed: makeBitMapDescriptor(kConstructed), + // A flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + sync: makeBitMapDescriptor(kSync), + // Whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + needReadable: makeBitMapDescriptor(kNeedReadable), + emittedReadable: makeBitMapDescriptor(kEmittedReadable), + readableListening: makeBitMapDescriptor(kReadableListening), + resumeScheduled: makeBitMapDescriptor(kResumeScheduled), + // True if the error was already emitted and should not be thrown again. + errorEmitted: makeBitMapDescriptor(kErrorEmitted), + emitClose: makeBitMapDescriptor(kEmitClose), + autoDestroy: makeBitMapDescriptor(kAutoDestroy), + // Has it been destroyed. + destroyed: makeBitMapDescriptor(kDestroyed), + // Indicates whether the stream has finished destroying. + closed: makeBitMapDescriptor(kClosed), + // True if close has been emitted or would have been emitted + // depending on emitClose. + closeEmitted: makeBitMapDescriptor(kCloseEmitted), + multiAwaitDrain: makeBitMapDescriptor(kMultiAwaitDrain), + // If true, a maybeReadMore has been scheduled. + readingMore: makeBitMapDescriptor(kReadingMore), + dataEmitted: makeBitMapDescriptor(kDataEmitted) + }); + function ReadableState(options2, stream2, isDuplex) { + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof requireDuplex(); + this.state = kEmitClose | kAutoDestroy | kConstructed | kSync; + if (options2 && options2.objectMode) this.state |= kObjectMode; + if (isDuplex && options2 && options2.readableObjectMode) this.state |= kObjectMode; + this.highWaterMark = options2 ? getHighWaterMark(this, options2, "readableHighWaterMark", isDuplex) : getDefaultHighWaterMark(false); + this.buffer = new BufferList(); + this.length = 0; + this.pipes = []; + this.flowing = null; + this[kPaused] = null; + if (options2 && options2.emitClose === false) this.state &= -2049; + if (options2 && options2.autoDestroy === false) this.state &= -4097; + this.errored = null; + this.defaultEncoding = options2 && options2.defaultEncoding || "utf8"; + this.awaitDrainWriters = null; + this.decoder = null; + this.encoding = null; + if (options2 && options2.encoding) { + this.decoder = new StringDecoder(options2.encoding); + this.encoding = options2.encoding; + } + } + function Readable(options2) { + if (!(this instanceof Readable)) return new Readable(options2); + const isDuplex = this instanceof requireDuplex(); + this._readableState = new ReadableState(options2, this, isDuplex); + if (options2) { + if (typeof options2.read === "function") this._read = options2.read; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + if (typeof options2.construct === "function") this._construct = options2.construct; + if (options2.signal && !isDuplex) addAbortSignal2(options2.signal, this); + } + Stream2.call(this, options2); + destroyImpl.construct(this, () => { + if (this._readableState.needReadable) { + maybeReadMore(this, this._readableState); + } + }); + } + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function(err, cb) { + cb(err); + }; + Readable.prototype[EE.captureRejectionSymbol] = function(err) { + this.destroy(err); + }; + Readable.prototype[SymbolAsyncDispose] = function() { + let error2; + if (!this.destroyed) { + error2 = this.readableEnded ? null : new AbortError(); + this.destroy(error2); + } + return new Promise2((resolve, reject) => eos(this, (err) => err && err !== error2 ? reject(err) : resolve(null))); + }; + Readable.prototype.push = function(chunk, encoding2) { + return readableAddChunk(this, chunk, encoding2, false); + }; + Readable.prototype.unshift = function(chunk, encoding2) { + return readableAddChunk(this, chunk, encoding2, true); + }; + function readableAddChunk(stream2, chunk, encoding2, addToFront) { + debug2("readableAddChunk", chunk); + const state2 = stream2._readableState; + let err; + if ((state2.state & kObjectMode) === 0) { + if (typeof chunk === "string") { + encoding2 = encoding2 || state2.defaultEncoding; + if (state2.encoding !== encoding2) { + if (addToFront && state2.encoding) { + chunk = Buffer2.from(chunk, encoding2).toString(state2.encoding); + } else { + chunk = Buffer2.from(chunk, encoding2); + encoding2 = ""; + } + } + } else if (chunk instanceof Buffer2) { + encoding2 = ""; + } else if (Stream2._isUint8Array(chunk)) { + chunk = Stream2._uint8ArrayToBuffer(chunk); + encoding2 = ""; + } else if (chunk != null) { + err = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + } + if (err) { + errorOrDestroy(stream2, err); + } else if (chunk === null) { + state2.state &= -9; + onEofChunk(stream2, state2); + } else if ((state2.state & kObjectMode) !== 0 || chunk && chunk.length > 0) { + if (addToFront) { + if ((state2.state & kEndEmitted) !== 0) errorOrDestroy(stream2, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else if (state2.destroyed || state2.errored) return false; + else addChunk(stream2, state2, chunk, true); + } else if (state2.ended) { + errorOrDestroy(stream2, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state2.destroyed || state2.errored) { + return false; + } else { + state2.state &= -9; + if (state2.decoder && !encoding2) { + chunk = state2.decoder.write(chunk); + if (state2.objectMode || chunk.length !== 0) addChunk(stream2, state2, chunk, false); + else maybeReadMore(stream2, state2); + } else { + addChunk(stream2, state2, chunk, false); + } + } + } else if (!addToFront) { + state2.state &= -9; + maybeReadMore(stream2, state2); + } + return !state2.ended && (state2.length < state2.highWaterMark || state2.length === 0); + } + function addChunk(stream2, state2, chunk, addToFront) { + if (state2.flowing && state2.length === 0 && !state2.sync && stream2.listenerCount("data") > 0) { + if ((state2.state & kMultiAwaitDrain) !== 0) { + state2.awaitDrainWriters.clear(); + } else { + state2.awaitDrainWriters = null; + } + state2.dataEmitted = true; + stream2.emit("data", chunk); + } else { + state2.length += state2.objectMode ? 1 : chunk.length; + if (addToFront) state2.buffer.unshift(chunk); + else state2.buffer.push(chunk); + if ((state2.state & kNeedReadable) !== 0) emitReadable(stream2); + } + maybeReadMore(stream2, state2); + } + Readable.prototype.isPaused = function() { + const state2 = this._readableState; + return state2[kPaused] === true || state2.flowing === false; + }; + Readable.prototype.setEncoding = function(enc) { + const decoder2 = new StringDecoder(enc); + this._readableState.decoder = decoder2; + this._readableState.encoding = this._readableState.decoder.encoding; + const buffer2 = this._readableState.buffer; + let content = ""; + for (const data2 of buffer2) { + content += decoder2.write(data2); + } + buffer2.clear(); + if (content !== "") buffer2.push(content); + this._readableState.length = content.length; + return this; + }; + const MAX_HWM = 1073741824; + function computeNewHighWaterMark(n) { + if (n > MAX_HWM) { + throw new ERR_OUT_OF_RANGE("size", "<= 1GiB", n); + } else { + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + function howMuchToRead(n, state2) { + if (n <= 0 || state2.length === 0 && state2.ended) return 0; + if ((state2.state & kObjectMode) !== 0) return 1; + if (NumberIsNaN(n)) { + if (state2.flowing && state2.length) return state2.buffer.first().length; + return state2.length; + } + if (n <= state2.length) return n; + return state2.ended ? state2.length : 0; + } + Readable.prototype.read = function(n) { + debug2("read", n); + if (n === void 0) { + n = NaN; + } else if (!NumberIsInteger(n)) { + n = NumberParseInt(n, 10); + } + const state2 = this._readableState; + const nOrig = n; + if (n > state2.highWaterMark) state2.highWaterMark = computeNewHighWaterMark(n); + if (n !== 0) state2.state &= -129; + if (n === 0 && state2.needReadable && ((state2.highWaterMark !== 0 ? state2.length >= state2.highWaterMark : state2.length > 0) || state2.ended)) { + debug2("read: emitReadable", state2.length, state2.ended); + if (state2.length === 0 && state2.ended) endReadable(this); + else emitReadable(this); + return null; + } + n = howMuchToRead(n, state2); + if (n === 0 && state2.ended) { + if (state2.length === 0) endReadable(this); + return null; + } + let doRead = (state2.state & kNeedReadable) !== 0; + debug2("need readable", doRead); + if (state2.length === 0 || state2.length - n < state2.highWaterMark) { + doRead = true; + debug2("length less than watermark", doRead); + } + if (state2.ended || state2.reading || state2.destroyed || state2.errored || !state2.constructed) { + doRead = false; + debug2("reading, ended or constructing", doRead); + } else if (doRead) { + debug2("do read"); + state2.state |= kReading | kSync; + if (state2.length === 0) state2.state |= kNeedReadable; + try { + this._read(state2.highWaterMark); + } catch (err) { + errorOrDestroy(this, err); + } + state2.state &= -33; + if (!state2.reading) n = howMuchToRead(nOrig, state2); + } + let ret; + if (n > 0) ret = fromList(n, state2); + else ret = null; + if (ret === null) { + state2.needReadable = state2.length <= state2.highWaterMark; + n = 0; + } else { + state2.length -= n; + if (state2.multiAwaitDrain) { + state2.awaitDrainWriters.clear(); + } else { + state2.awaitDrainWriters = null; + } + } + if (state2.length === 0) { + if (!state2.ended) state2.needReadable = true; + if (nOrig !== n && state2.ended) endReadable(this); + } + if (ret !== null && !state2.errorEmitted && !state2.closeEmitted) { + state2.dataEmitted = true; + this.emit("data", ret); + } + return ret; + }; + function onEofChunk(stream2, state2) { + debug2("onEofChunk"); + if (state2.ended) return; + if (state2.decoder) { + const chunk = state2.decoder.end(); + if (chunk && chunk.length) { + state2.buffer.push(chunk); + state2.length += state2.objectMode ? 1 : chunk.length; + } + } + state2.ended = true; + if (state2.sync) { + emitReadable(stream2); + } else { + state2.needReadable = false; + state2.emittedReadable = true; + emitReadable_(stream2); + } + } + function emitReadable(stream2) { + const state2 = stream2._readableState; + debug2("emitReadable", state2.needReadable, state2.emittedReadable); + state2.needReadable = false; + if (!state2.emittedReadable) { + debug2("emitReadable", state2.flowing); + state2.emittedReadable = true; + process2.nextTick(emitReadable_, stream2); + } + } + function emitReadable_(stream2) { + const state2 = stream2._readableState; + debug2("emitReadable_", state2.destroyed, state2.length, state2.ended); + if (!state2.destroyed && !state2.errored && (state2.length || state2.ended)) { + stream2.emit("readable"); + state2.emittedReadable = false; + } + state2.needReadable = !state2.flowing && !state2.ended && state2.length <= state2.highWaterMark; + flow(stream2); + } + function maybeReadMore(stream2, state2) { + if (!state2.readingMore && state2.constructed) { + state2.readingMore = true; + process2.nextTick(maybeReadMore_, stream2, state2); + } + } + function maybeReadMore_(stream2, state2) { + while (!state2.reading && !state2.ended && (state2.length < state2.highWaterMark || state2.flowing && state2.length === 0)) { + const len = state2.length; + debug2("maybeReadMore read 0"); + stream2.read(0); + if (len === state2.length) + break; + } + state2.readingMore = false; + } + Readable.prototype._read = function(n) { + throw new ERR_METHOD_NOT_IMPLEMENTED("_read()"); + }; + Readable.prototype.pipe = function(dest, pipeOpts) { + const src2 = this; + const state2 = this._readableState; + if (state2.pipes.length === 1) { + if (!state2.multiAwaitDrain) { + state2.multiAwaitDrain = true; + state2.awaitDrainWriters = new SafeSet(state2.awaitDrainWriters ? [state2.awaitDrainWriters] : []); + } + } + state2.pipes.push(dest); + debug2("pipe count=%d opts=%j", state2.pipes.length, pipeOpts); + const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process2.stdout && dest !== process2.stderr; + const endFn = doEnd ? onend : unpipe; + if (state2.endEmitted) process2.nextTick(endFn); + else src2.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable2, unpipeInfo) { + debug2("onunpipe"); + if (readable2 === src2) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + function onend() { + debug2("onend"); + dest.end(); + } + let ondrain; + let cleanedUp = false; + function cleanup() { + debug2("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + if (ondrain) { + dest.removeListener("drain", ondrain); + } + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src2.removeListener("end", onend); + src2.removeListener("end", unpipe); + src2.removeListener("data", ondata); + cleanedUp = true; + if (ondrain && state2.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + function pause() { + if (!cleanedUp) { + if (state2.pipes.length === 1 && state2.pipes[0] === dest) { + debug2("false write response, pause", 0); + state2.awaitDrainWriters = dest; + state2.multiAwaitDrain = false; + } else if (state2.pipes.length > 1 && state2.pipes.includes(dest)) { + debug2("false write response, pause", state2.awaitDrainWriters.size); + state2.awaitDrainWriters.add(dest); + } + src2.pause(); + } + if (!ondrain) { + ondrain = pipeOnDrain(src2, dest); + dest.on("drain", ondrain); + } + } + src2.on("data", ondata); + function ondata(chunk) { + debug2("ondata"); + const ret = dest.write(chunk); + debug2("dest.write", ret); + if (ret === false) { + pause(); + } + } + function onerror(er) { + debug2("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (dest.listenerCount("error") === 0) { + const s = dest._writableState || dest._readableState; + if (s && !s.errorEmitted) { + errorOrDestroy(dest, er); + } else { + dest.emit("error", er); + } + } + } + prependListener(dest, "error", onerror); + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug2("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + debug2("unpipe"); + src2.unpipe(dest); + } + dest.emit("pipe", src2); + if (dest.writableNeedDrain === true) { + pause(); + } else if (!state2.flowing) { + debug2("pipe resume"); + src2.resume(); + } + return dest; + }; + function pipeOnDrain(src2, dest) { + return function pipeOnDrainFunctionResult() { + const state2 = src2._readableState; + if (state2.awaitDrainWriters === dest) { + debug2("pipeOnDrain", 1); + state2.awaitDrainWriters = null; + } else if (state2.multiAwaitDrain) { + debug2("pipeOnDrain", state2.awaitDrainWriters.size); + state2.awaitDrainWriters.delete(dest); + } + if ((!state2.awaitDrainWriters || state2.awaitDrainWriters.size === 0) && src2.listenerCount("data")) { + src2.resume(); + } + }; + } + Readable.prototype.unpipe = function(dest) { + const state2 = this._readableState; + const unpipeInfo = { + hasUnpiped: false + }; + if (state2.pipes.length === 0) return this; + if (!dest) { + const dests = state2.pipes; + state2.pipes = []; + this.pause(); + for (let i = 0; i < dests.length; i++) + dests[i].emit("unpipe", this, { + hasUnpiped: false + }); + return this; + } + const index2 = ArrayPrototypeIndexOf(state2.pipes, dest); + if (index2 === -1) return this; + state2.pipes.splice(index2, 1); + if (state2.pipes.length === 0) this.pause(); + dest.emit("unpipe", this, unpipeInfo); + return this; + }; + Readable.prototype.on = function(ev, fn) { + const res = Stream2.prototype.on.call(this, ev, fn); + const state2 = this._readableState; + if (ev === "data") { + state2.readableListening = this.listenerCount("readable") > 0; + if (state2.flowing !== false) this.resume(); + } else if (ev === "readable") { + if (!state2.endEmitted && !state2.readableListening) { + state2.readableListening = state2.needReadable = true; + state2.flowing = false; + state2.emittedReadable = false; + debug2("on readable", state2.length, state2.reading); + if (state2.length) { + emitReadable(this); + } else if (!state2.reading) { + process2.nextTick(nReadingNextTick, this); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + Readable.prototype.removeListener = function(ev, fn) { + const res = Stream2.prototype.removeListener.call(this, ev, fn); + if (ev === "readable") { + process2.nextTick(updateReadableListening, this); + } + return res; + }; + Readable.prototype.off = Readable.prototype.removeListener; + Readable.prototype.removeAllListeners = function(ev) { + const res = Stream2.prototype.removeAllListeners.apply(this, arguments); + if (ev === "readable" || ev === void 0) { + process2.nextTick(updateReadableListening, this); + } + return res; + }; + function updateReadableListening(self2) { + const state2 = self2._readableState; + state2.readableListening = self2.listenerCount("readable") > 0; + if (state2.resumeScheduled && state2[kPaused] === false) { + state2.flowing = true; + } else if (self2.listenerCount("data") > 0) { + self2.resume(); + } else if (!state2.readableListening) { + state2.flowing = null; + } + } + function nReadingNextTick(self2) { + debug2("readable nexttick read 0"); + self2.read(0); + } + Readable.prototype.resume = function() { + const state2 = this._readableState; + if (!state2.flowing) { + debug2("resume"); + state2.flowing = !state2.readableListening; + resume(this, state2); + } + state2[kPaused] = false; + return this; + }; + function resume(stream2, state2) { + if (!state2.resumeScheduled) { + state2.resumeScheduled = true; + process2.nextTick(resume_, stream2, state2); + } + } + function resume_(stream2, state2) { + debug2("resume", state2.reading); + if (!state2.reading) { + stream2.read(0); + } + state2.resumeScheduled = false; + stream2.emit("resume"); + flow(stream2); + if (state2.flowing && !state2.reading) stream2.read(0); + } + Readable.prototype.pause = function() { + debug2("call pause flowing=%j", this._readableState.flowing); + if (this._readableState.flowing !== false) { + debug2("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + this._readableState[kPaused] = true; + return this; + }; + function flow(stream2) { + const state2 = stream2._readableState; + debug2("flow", state2.flowing); + while (state2.flowing && stream2.read() !== null) ; + } + Readable.prototype.wrap = function(stream2) { + let paused = false; + stream2.on("data", (chunk) => { + if (!this.push(chunk) && stream2.pause) { + paused = true; + stream2.pause(); + } + }); + stream2.on("end", () => { + this.push(null); + }); + stream2.on("error", (err) => { + errorOrDestroy(this, err); + }); + stream2.on("close", () => { + this.destroy(); + }); + stream2.on("destroy", () => { + this.destroy(); + }); + this._read = () => { + if (paused && stream2.resume) { + paused = false; + stream2.resume(); + } + }; + const streamKeys = ObjectKeys(stream2); + for (let j = 1; j < streamKeys.length; j++) { + const i = streamKeys[j]; + if (this[i] === void 0 && typeof stream2[i] === "function") { + this[i] = stream2[i].bind(stream2); + } + } + return this; + }; + Readable.prototype[SymbolAsyncIterator] = function() { + return streamToAsyncIterator(this); + }; + Readable.prototype.iterator = function(options2) { + if (options2 !== void 0) { + validateObject(options2, "options"); + } + return streamToAsyncIterator(this, options2); + }; + function streamToAsyncIterator(stream2, options2) { + if (typeof stream2.read !== "function") { + stream2 = Readable.wrap(stream2, { + objectMode: true + }); + } + const iter = createAsyncIterator(stream2, options2); + iter.stream = stream2; + return iter; + } + async function* createAsyncIterator(stream2, options2) { + let callback = nop; + function next(resolve) { + if (this === stream2) { + callback(); + callback = nop; + } else { + callback = resolve; + } + } + stream2.on("readable", next); + let error2; + const cleanup = eos( + stream2, + { + writable: false + }, + (err) => { + error2 = err ? aggregateTwoErrors(error2, err) : null; + callback(); + callback = nop; + } + ); + try { + while (true) { + const chunk = stream2.destroyed ? null : stream2.read(); + if (chunk !== null) { + yield chunk; + } else if (error2) { + throw error2; + } else if (error2 === null) { + return; + } else { + await new Promise2(next); + } + } + } catch (err) { + error2 = aggregateTwoErrors(error2, err); + throw error2; + } finally { + if ((error2 || (options2 === null || options2 === void 0 ? void 0 : options2.destroyOnReturn) !== false) && (error2 === void 0 || stream2._readableState.autoDestroy)) { + destroyImpl.destroyer(stream2, null); + } else { + stream2.off("readable", next); + cleanup(); + } + } + } + ObjectDefineProperties(Readable.prototype, { + readable: { + __proto__: null, + get() { + const r = this._readableState; + return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted; + }, + set(val) { + if (this._readableState) { + this._readableState.readable = !!val; + } + } + }, + readableDidRead: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState.dataEmitted; + } + }, + readableAborted: { + __proto__: null, + enumerable: false, + get: function() { + return !!(this._readableState.readable !== false && (this._readableState.destroyed || this._readableState.errored) && !this._readableState.endEmitted); + } + }, + readableHighWaterMark: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState.highWaterMark; + } + }, + readableBuffer: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState && this._readableState.buffer; + } + }, + readableFlowing: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState.flowing; + }, + set: function(state2) { + if (this._readableState) { + this._readableState.flowing = state2; + } + } + }, + readableLength: { + __proto__: null, + enumerable: false, + get() { + return this._readableState.length; + } + }, + readableObjectMode: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.objectMode : false; + } + }, + readableEncoding: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.encoding : null; + } + }, + errored: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.errored : null; + } + }, + closed: { + __proto__: null, + get() { + return this._readableState ? this._readableState.closed : false; + } + }, + destroyed: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.destroyed : false; + }, + set(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + } + }, + readableEnded: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.endEmitted : false; + } + } + }); + ObjectDefineProperties(ReadableState.prototype, { + // Legacy getter for `pipesCount`. + pipesCount: { + __proto__: null, + get() { + return this.pipes.length; + } + }, + // Legacy property for `paused`. + paused: { + __proto__: null, + get() { + return this[kPaused] !== false; + }, + set(value) { + this[kPaused] = !!value; + } + } + }); + Readable._fromList = fromList; + function fromList(n, state2) { + if (state2.length === 0) return null; + let ret; + if (state2.objectMode) ret = state2.buffer.shift(); + else if (!n || n >= state2.length) { + if (state2.decoder) ret = state2.buffer.join(""); + else if (state2.buffer.length === 1) ret = state2.buffer.first(); + else ret = state2.buffer.concat(state2.length); + state2.buffer.clear(); + } else { + ret = state2.buffer.consume(n, state2.decoder); + } + return ret; + } + function endReadable(stream2) { + const state2 = stream2._readableState; + debug2("endReadable", state2.endEmitted); + if (!state2.endEmitted) { + state2.ended = true; + process2.nextTick(endReadableNT, state2, stream2); + } + } + function endReadableNT(state2, stream2) { + debug2("endReadableNT", state2.endEmitted, state2.length); + if (!state2.errored && !state2.closeEmitted && !state2.endEmitted && state2.length === 0) { + state2.endEmitted = true; + stream2.emit("end"); + if (stream2.writable && stream2.allowHalfOpen === false) { + process2.nextTick(endWritableNT, stream2); + } else if (state2.autoDestroy) { + const wState = stream2._writableState; + const autoDestroy = !wState || wState.autoDestroy && // We don't expect the writable to ever 'finish' + // if writable is explicitly set to false. + (wState.finished || wState.writable === false); + if (autoDestroy) { + stream2.destroy(); + } + } + } + } + function endWritableNT(stream2) { + const writable2 = stream2.writable && !stream2.writableEnded && !stream2.destroyed; + if (writable2) { + stream2.end(); + } + } + Readable.from = function(iterable, opts) { + return from2(Readable, iterable, opts); + }; + let webStreamsAdapters; + function lazyWebStreams() { + if (webStreamsAdapters === void 0) webStreamsAdapters = {}; + return webStreamsAdapters; + } + Readable.fromWeb = function(readableStream, options2) { + return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options2); + }; + Readable.toWeb = function(streamReadable, options2) { + return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options2); + }; + Readable.wrap = function(src2, options2) { + var _ref, _src$readableObjectMo; + return new Readable({ + objectMode: (_ref = (_src$readableObjectMo = src2.readableObjectMode) !== null && _src$readableObjectMo !== void 0 ? _src$readableObjectMo : src2.objectMode) !== null && _ref !== void 0 ? _ref : true, + ...options2, + destroy(err, callback) { + destroyImpl.destroyer(src2, err); + callback(err); + } + }).wrap(src2); + }; + return readable; +} +var writable; +var hasRequiredWritable; +function requireWritable() { + if (hasRequiredWritable) return writable; + hasRequiredWritable = 1; + const process2 = requireBrowser$j(); + const { + ArrayPrototypeSlice, + Error: Error2, + FunctionPrototypeSymbolHasInstance, + ObjectDefineProperty, + ObjectDefineProperties, + ObjectSetPrototypeOf, + StringPrototypeToLowerCase, + Symbol: Symbol2, + SymbolHasInstance + } = requirePrimordials(); + writable = Writable; + Writable.WritableState = WritableState; + const { EventEmitter: EE } = requireEvents(); + const Stream2 = requireLegacy$1().Stream; + const { Buffer: Buffer2 } = requireBuffer$2(); + const destroyImpl = requireDestroy$3(); + const { addAbortSignal: addAbortSignal2 } = requireAddAbortSignal(); + const { getHighWaterMark, getDefaultHighWaterMark } = requireState$3(); + const { + ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED, + ERR_STREAM_ALREADY_FINISHED, + ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING + } = requireErrors().codes; + const { errorOrDestroy } = destroyImpl; + ObjectSetPrototypeOf(Writable.prototype, Stream2.prototype); + ObjectSetPrototypeOf(Writable, Stream2); + function nop() { + } + const kOnFinished = Symbol2("kOnFinished"); + function WritableState(options2, stream2, isDuplex) { + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof requireDuplex(); + this.objectMode = !!(options2 && options2.objectMode); + if (isDuplex) this.objectMode = this.objectMode || !!(options2 && options2.writableObjectMode); + this.highWaterMark = options2 ? getHighWaterMark(this, options2, "writableHighWaterMark", isDuplex) : getDefaultHighWaterMark(false); + this.finalCalled = false; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + this.destroyed = false; + const noDecode = !!(options2 && options2.decodeStrings === false); + this.decodeStrings = !noDecode; + this.defaultEncoding = options2 && options2.defaultEncoding || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = onwrite.bind(void 0, stream2); + this.writecb = null; + this.writelen = 0; + this.afterWriteTickInfo = null; + resetBuffer(this); + this.pendingcb = 0; + this.constructed = true; + this.prefinished = false; + this.errorEmitted = false; + this.emitClose = !options2 || options2.emitClose !== false; + this.autoDestroy = !options2 || options2.autoDestroy !== false; + this.errored = null; + this.closed = false; + this.closeEmitted = false; + this[kOnFinished] = []; + } + function resetBuffer(state2) { + state2.buffered = []; + state2.bufferedIndex = 0; + state2.allBuffers = true; + state2.allNoop = true; + } + WritableState.prototype.getBuffer = function getBuffer() { + return ArrayPrototypeSlice(this.buffered, this.bufferedIndex); + }; + ObjectDefineProperty(WritableState.prototype, "bufferedRequestCount", { + __proto__: null, + get() { + return this.buffered.length - this.bufferedIndex; + } + }); + function Writable(options2) { + const isDuplex = this instanceof requireDuplex(); + if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options2); + this._writableState = new WritableState(options2, this, isDuplex); + if (options2) { + if (typeof options2.write === "function") this._write = options2.write; + if (typeof options2.writev === "function") this._writev = options2.writev; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + if (typeof options2.final === "function") this._final = options2.final; + if (typeof options2.construct === "function") this._construct = options2.construct; + if (options2.signal) addAbortSignal2(options2.signal, this); + } + Stream2.call(this, options2); + destroyImpl.construct(this, () => { + const state2 = this._writableState; + if (!state2.writing) { + clearBuffer(this, state2); + } + finishMaybe(this, state2); + }); + } + ObjectDefineProperty(Writable, SymbolHasInstance, { + __proto__: null, + value: function(object) { + if (FunctionPrototypeSymbolHasInstance(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); + Writable.prototype.pipe = function() { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); + }; + function _write(stream2, chunk, encoding2, cb) { + const state2 = stream2._writableState; + if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = state2.defaultEncoding; + } else { + if (!encoding2) encoding2 = state2.defaultEncoding; + else if (encoding2 !== "buffer" && !Buffer2.isEncoding(encoding2)) throw new ERR_UNKNOWN_ENCODING(encoding2); + if (typeof cb !== "function") cb = nop; + } + if (chunk === null) { + throw new ERR_STREAM_NULL_VALUES(); + } else if (!state2.objectMode) { + if (typeof chunk === "string") { + if (state2.decodeStrings !== false) { + chunk = Buffer2.from(chunk, encoding2); + encoding2 = "buffer"; + } + } else if (chunk instanceof Buffer2) { + encoding2 = "buffer"; + } else if (Stream2._isUint8Array(chunk)) { + chunk = Stream2._uint8ArrayToBuffer(chunk); + encoding2 = "buffer"; + } else { + throw new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + } + let err; + if (state2.ending) { + err = new ERR_STREAM_WRITE_AFTER_END(); + } else if (state2.destroyed) { + err = new ERR_STREAM_DESTROYED("write"); + } + if (err) { + process2.nextTick(cb, err); + errorOrDestroy(stream2, err, true); + return err; + } + state2.pendingcb++; + return writeOrBuffer(stream2, state2, chunk, encoding2, cb); + } + Writable.prototype.write = function(chunk, encoding2, cb) { + return _write(this, chunk, encoding2, cb) === true; + }; + Writable.prototype.cork = function() { + this._writableState.corked++; + }; + Writable.prototype.uncork = function() { + const state2 = this._writableState; + if (state2.corked) { + state2.corked--; + if (!state2.writing) clearBuffer(this, state2); + } + }; + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding2) { + if (typeof encoding2 === "string") encoding2 = StringPrototypeToLowerCase(encoding2); + if (!Buffer2.isEncoding(encoding2)) throw new ERR_UNKNOWN_ENCODING(encoding2); + this._writableState.defaultEncoding = encoding2; + return this; + }; + function writeOrBuffer(stream2, state2, chunk, encoding2, callback) { + const len = state2.objectMode ? 1 : chunk.length; + state2.length += len; + const ret = state2.length < state2.highWaterMark; + if (!ret) state2.needDrain = true; + if (state2.writing || state2.corked || state2.errored || !state2.constructed) { + state2.buffered.push({ + chunk, + encoding: encoding2, + callback + }); + if (state2.allBuffers && encoding2 !== "buffer") { + state2.allBuffers = false; + } + if (state2.allNoop && callback !== nop) { + state2.allNoop = false; + } + } else { + state2.writelen = len; + state2.writecb = callback; + state2.writing = true; + state2.sync = true; + stream2._write(chunk, encoding2, state2.onwrite); + state2.sync = false; + } + return ret && !state2.errored && !state2.destroyed; + } + function doWrite(stream2, state2, writev2, len, chunk, encoding2, cb) { + state2.writelen = len; + state2.writecb = cb; + state2.writing = true; + state2.sync = true; + if (state2.destroyed) state2.onwrite(new ERR_STREAM_DESTROYED("write")); + else if (writev2) stream2._writev(chunk, state2.onwrite); + else stream2._write(chunk, encoding2, state2.onwrite); + state2.sync = false; + } + function onwriteError(stream2, state2, er, cb) { + --state2.pendingcb; + cb(er); + errorBuffer(state2); + errorOrDestroy(stream2, er); + } + function onwrite(stream2, er) { + const state2 = stream2._writableState; + const sync = state2.sync; + const cb = state2.writecb; + if (typeof cb !== "function") { + errorOrDestroy(stream2, new ERR_MULTIPLE_CALLBACK()); + return; + } + state2.writing = false; + state2.writecb = null; + state2.length -= state2.writelen; + state2.writelen = 0; + if (er) { + er.stack; + if (!state2.errored) { + state2.errored = er; + } + if (stream2._readableState && !stream2._readableState.errored) { + stream2._readableState.errored = er; + } + if (sync) { + process2.nextTick(onwriteError, stream2, state2, er, cb); + } else { + onwriteError(stream2, state2, er, cb); + } + } else { + if (state2.buffered.length > state2.bufferedIndex) { + clearBuffer(stream2, state2); + } + if (sync) { + if (state2.afterWriteTickInfo !== null && state2.afterWriteTickInfo.cb === cb) { + state2.afterWriteTickInfo.count++; + } else { + state2.afterWriteTickInfo = { + count: 1, + cb, + stream: stream2, + state: state2 + }; + process2.nextTick(afterWriteTick, state2.afterWriteTickInfo); + } + } else { + afterWrite(stream2, state2, 1, cb); + } + } + } + function afterWriteTick({ stream: stream2, state: state2, count, cb }) { + state2.afterWriteTickInfo = null; + return afterWrite(stream2, state2, count, cb); + } + function afterWrite(stream2, state2, count, cb) { + const needDrain = !state2.ending && !stream2.destroyed && state2.length === 0 && state2.needDrain; + if (needDrain) { + state2.needDrain = false; + stream2.emit("drain"); + } + while (count-- > 0) { + state2.pendingcb--; + cb(); + } + if (state2.destroyed) { + errorBuffer(state2); + } + finishMaybe(stream2, state2); + } + function errorBuffer(state2) { + if (state2.writing) { + return; + } + for (let n = state2.bufferedIndex; n < state2.buffered.length; ++n) { + var _state$errored; + const { chunk, callback } = state2.buffered[n]; + const len = state2.objectMode ? 1 : chunk.length; + state2.length -= len; + callback( + (_state$errored = state2.errored) !== null && _state$errored !== void 0 ? _state$errored : new ERR_STREAM_DESTROYED("write") + ); + } + const onfinishCallbacks = state2[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + var _state$errored2; + onfinishCallbacks[i]( + (_state$errored2 = state2.errored) !== null && _state$errored2 !== void 0 ? _state$errored2 : new ERR_STREAM_DESTROYED("end") + ); + } + resetBuffer(state2); + } + function clearBuffer(stream2, state2) { + if (state2.corked || state2.bufferProcessing || state2.destroyed || !state2.constructed) { + return; + } + const { buffered, bufferedIndex, objectMode } = state2; + const bufferedLength = buffered.length - bufferedIndex; + if (!bufferedLength) { + return; + } + let i = bufferedIndex; + state2.bufferProcessing = true; + if (bufferedLength > 1 && stream2._writev) { + state2.pendingcb -= bufferedLength - 1; + const callback = state2.allNoop ? nop : (err) => { + for (let n = i; n < buffered.length; ++n) { + buffered[n].callback(err); + } + }; + const chunks = state2.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i); + chunks.allBuffers = state2.allBuffers; + doWrite(stream2, state2, true, state2.length, chunks, "", callback); + resetBuffer(state2); + } else { + do { + const { chunk, encoding: encoding2, callback } = buffered[i]; + buffered[i++] = null; + const len = objectMode ? 1 : chunk.length; + doWrite(stream2, state2, false, len, chunk, encoding2, callback); + } while (i < buffered.length && !state2.writing); + if (i === buffered.length) { + resetBuffer(state2); + } else if (i > 256) { + buffered.splice(0, i); + state2.bufferedIndex = 0; + } else { + state2.bufferedIndex = i; + } + } + state2.bufferProcessing = false; + } + Writable.prototype._write = function(chunk, encoding2, cb) { + if (this._writev) { + this._writev( + [ + { + chunk, + encoding: encoding2 + } + ], + cb + ); + } else { + throw new ERR_METHOD_NOT_IMPLEMENTED("_write()"); + } + }; + Writable.prototype._writev = null; + Writable.prototype.end = function(chunk, encoding2, cb) { + const state2 = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding2 = null; + } else if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + let err; + if (chunk !== null && chunk !== void 0) { + const ret = _write(this, chunk, encoding2); + if (ret instanceof Error2) { + err = ret; + } + } + if (state2.corked) { + state2.corked = 1; + this.uncork(); + } + if (err) ; + else if (!state2.errored && !state2.ending) { + state2.ending = true; + finishMaybe(this, state2, true); + state2.ended = true; + } else if (state2.finished) { + err = new ERR_STREAM_ALREADY_FINISHED("end"); + } else if (state2.destroyed) { + err = new ERR_STREAM_DESTROYED("end"); + } + if (typeof cb === "function") { + if (err || state2.finished) { + process2.nextTick(cb, err); + } else { + state2[kOnFinished].push(cb); + } + } + return this; + }; + function needFinish(state2) { + return state2.ending && !state2.destroyed && state2.constructed && state2.length === 0 && !state2.errored && state2.buffered.length === 0 && !state2.finished && !state2.writing && !state2.errorEmitted && !state2.closeEmitted; + } + function callFinal(stream2, state2) { + let called = false; + function onFinish(err) { + if (called) { + errorOrDestroy(stream2, err !== null && err !== void 0 ? err : ERR_MULTIPLE_CALLBACK()); + return; + } + called = true; + state2.pendingcb--; + if (err) { + const onfinishCallbacks = state2[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + onfinishCallbacks[i](err); + } + errorOrDestroy(stream2, err, state2.sync); + } else if (needFinish(state2)) { + state2.prefinished = true; + stream2.emit("prefinish"); + state2.pendingcb++; + process2.nextTick(finish, stream2, state2); + } + } + state2.sync = true; + state2.pendingcb++; + try { + stream2._final(onFinish); + } catch (err) { + onFinish(err); + } + state2.sync = false; + } + function prefinish(stream2, state2) { + if (!state2.prefinished && !state2.finalCalled) { + if (typeof stream2._final === "function" && !state2.destroyed) { + state2.finalCalled = true; + callFinal(stream2, state2); + } else { + state2.prefinished = true; + stream2.emit("prefinish"); + } + } + } + function finishMaybe(stream2, state2, sync) { + if (needFinish(state2)) { + prefinish(stream2, state2); + if (state2.pendingcb === 0) { + if (sync) { + state2.pendingcb++; + process2.nextTick( + (stream3, state3) => { + if (needFinish(state3)) { + finish(stream3, state3); + } else { + state3.pendingcb--; + } + }, + stream2, + state2 + ); + } else if (needFinish(state2)) { + state2.pendingcb++; + finish(stream2, state2); + } + } + } + } + function finish(stream2, state2) { + state2.pendingcb--; + state2.finished = true; + const onfinishCallbacks = state2[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + onfinishCallbacks[i](); + } + stream2.emit("finish"); + if (state2.autoDestroy) { + const rState = stream2._readableState; + const autoDestroy = !rState || rState.autoDestroy && // We don't expect the readable to ever 'end' + // if readable is explicitly set to false. + (rState.endEmitted || rState.readable === false); + if (autoDestroy) { + stream2.destroy(); + } + } + } + ObjectDefineProperties(Writable.prototype, { + closed: { + __proto__: null, + get() { + return this._writableState ? this._writableState.closed : false; + } + }, + destroyed: { + __proto__: null, + get() { + return this._writableState ? this._writableState.destroyed : false; + }, + set(value) { + if (this._writableState) { + this._writableState.destroyed = value; + } + } + }, + writable: { + __proto__: null, + get() { + const w = this._writableState; + return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended; + }, + set(val) { + if (this._writableState) { + this._writableState.writable = !!val; + } + } + }, + writableFinished: { + __proto__: null, + get() { + return this._writableState ? this._writableState.finished : false; + } + }, + writableObjectMode: { + __proto__: null, + get() { + return this._writableState ? this._writableState.objectMode : false; + } + }, + writableBuffer: { + __proto__: null, + get() { + return this._writableState && this._writableState.getBuffer(); + } + }, + writableEnded: { + __proto__: null, + get() { + return this._writableState ? this._writableState.ending : false; + } + }, + writableNeedDrain: { + __proto__: null, + get() { + const wState = this._writableState; + if (!wState) return false; + return !wState.destroyed && !wState.ending && wState.needDrain; + } + }, + writableHighWaterMark: { + __proto__: null, + get() { + return this._writableState && this._writableState.highWaterMark; + } + }, + writableCorked: { + __proto__: null, + get() { + return this._writableState ? this._writableState.corked : 0; + } + }, + writableLength: { + __proto__: null, + get() { + return this._writableState && this._writableState.length; + } + }, + errored: { + __proto__: null, + enumerable: false, + get() { + return this._writableState ? this._writableState.errored : null; + } + }, + writableAborted: { + __proto__: null, + enumerable: false, + get: function() { + return !!(this._writableState.writable !== false && (this._writableState.destroyed || this._writableState.errored) && !this._writableState.finished); + } + } + }); + const destroy = destroyImpl.destroy; + Writable.prototype.destroy = function(err, cb) { + const state2 = this._writableState; + if (!state2.destroyed && (state2.bufferedIndex < state2.buffered.length || state2[kOnFinished].length)) { + process2.nextTick(errorBuffer, state2); + } + destroy.call(this, err, cb); + return this; + }; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function(err, cb) { + cb(err); + }; + Writable.prototype[EE.captureRejectionSymbol] = function(err) { + this.destroy(err); + }; + let webStreamsAdapters; + function lazyWebStreams() { + if (webStreamsAdapters === void 0) webStreamsAdapters = {}; + return webStreamsAdapters; + } + Writable.fromWeb = function(writableStream, options2) { + return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options2); + }; + Writable.toWeb = function(streamWritable) { + return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable); + }; + return writable; +} +var duplexify; +var hasRequiredDuplexify; +function requireDuplexify() { + if (hasRequiredDuplexify) return duplexify; + hasRequiredDuplexify = 1; + const process2 = requireBrowser$j(); + const bufferModule = requireBuffer$2(); + const { + isReadable, + isWritable, + isIterable, + isNodeStream, + isReadableNodeStream, + isWritableNodeStream, + isDuplexNodeStream, + isReadableStream, + isWritableStream + } = requireUtils$6(); + const eos = requireEndOfStream$4(); + const { + AbortError, + codes: { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_INVALID_RETURN_VALUE } + } = requireErrors(); + const { destroyer } = requireDestroy$3(); + const Duplex = requireDuplex(); + const Readable = requireReadable(); + const Writable = requireWritable(); + const { createDeferredPromise } = requireUtil$3(); + const from2 = requireFrom(); + const Blob2 = globalThis.Blob || bufferModule.Blob; + const isBlob = typeof Blob2 !== "undefined" ? function isBlob2(b) { + return b instanceof Blob2; + } : function isBlob2(b) { + return false; + }; + const AbortController2 = globalThis.AbortController || requireBrowser$i().AbortController; + const { FunctionPrototypeCall } = requirePrimordials(); + class Duplexify extends Duplex { + constructor(options2) { + super(options2); + if ((options2 === null || options2 === void 0 ? void 0 : options2.readable) === false) { + this._readableState.readable = false; + this._readableState.ended = true; + this._readableState.endEmitted = true; + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.writable) === false) { + this._writableState.writable = false; + this._writableState.ending = true; + this._writableState.ended = true; + this._writableState.finished = true; + } + } + } + duplexify = function duplexify2(body, name) { + if (isDuplexNodeStream(body)) { + return body; + } + if (isReadableNodeStream(body)) { + return _duplexify({ + readable: body + }); + } + if (isWritableNodeStream(body)) { + return _duplexify({ + writable: body + }); + } + if (isNodeStream(body)) { + return _duplexify({ + writable: false, + readable: false + }); + } + if (isReadableStream(body)) { + return _duplexify({ + readable: Readable.fromWeb(body) + }); + } + if (isWritableStream(body)) { + return _duplexify({ + writable: Writable.fromWeb(body) + }); + } + if (typeof body === "function") { + const { value, write: write2, final, destroy } = fromAsyncGen(body); + if (isIterable(value)) { + return from2(Duplexify, value, { + // TODO (ronag): highWaterMark? + objectMode: true, + write: write2, + final, + destroy + }); + } + const then2 = value === null || value === void 0 ? void 0 : value.then; + if (typeof then2 === "function") { + let d; + const promise = FunctionPrototypeCall( + then2, + value, + (val) => { + if (val != null) { + throw new ERR_INVALID_RETURN_VALUE("nully", "body", val); + } + }, + (err) => { + destroyer(d, err); + } + ); + return d = new Duplexify({ + // TODO (ronag): highWaterMark? + objectMode: true, + readable: false, + write: write2, + final(cb) { + final(async () => { + try { + await promise; + process2.nextTick(cb, null); + } catch (err) { + process2.nextTick(cb, err); + } + }); + }, + destroy + }); + } + throw new ERR_INVALID_RETURN_VALUE("Iterable, AsyncIterable or AsyncFunction", name, value); + } + if (isBlob(body)) { + return duplexify2(body.arrayBuffer()); + } + if (isIterable(body)) { + return from2(Duplexify, body, { + // TODO (ronag): highWaterMark? + objectMode: true, + writable: false + }); + } + if (isReadableStream(body === null || body === void 0 ? void 0 : body.readable) && isWritableStream(body === null || body === void 0 ? void 0 : body.writable)) { + return Duplexify.fromWeb(body); + } + if (typeof (body === null || body === void 0 ? void 0 : body.writable) === "object" || typeof (body === null || body === void 0 ? void 0 : body.readable) === "object") { + const readable2 = body !== null && body !== void 0 && body.readable ? isReadableNodeStream(body === null || body === void 0 ? void 0 : body.readable) ? body === null || body === void 0 ? void 0 : body.readable : duplexify2(body.readable) : void 0; + const writable2 = body !== null && body !== void 0 && body.writable ? isWritableNodeStream(body === null || body === void 0 ? void 0 : body.writable) ? body === null || body === void 0 ? void 0 : body.writable : duplexify2(body.writable) : void 0; + return _duplexify({ + readable: readable2, + writable: writable2 + }); + } + const then = body === null || body === void 0 ? void 0 : body.then; + if (typeof then === "function") { + let d; + FunctionPrototypeCall( + then, + body, + (val) => { + if (val != null) { + d.push(val); + } + d.push(null); + }, + (err) => { + destroyer(d, err); + } + ); + return d = new Duplexify({ + objectMode: true, + writable: false, + read() { + } + }); + } + throw new ERR_INVALID_ARG_TYPE2( + name, + [ + "Blob", + "ReadableStream", + "WritableStream", + "Stream", + "Iterable", + "AsyncIterable", + "Function", + "{ readable, writable } pair", + "Promise" + ], + body + ); + }; + function fromAsyncGen(fn) { + let { promise, resolve } = createDeferredPromise(); + const ac = new AbortController2(); + const signal = ac.signal; + const value = fn( + async function* () { + while (true) { + const _promise = promise; + promise = null; + const { chunk, done, cb } = await _promise; + process2.nextTick(cb); + if (done) return; + if (signal.aborted) + throw new AbortError(void 0, { + cause: signal.reason + }); + ({ promise, resolve } = createDeferredPromise()); + yield chunk; + } + }(), + { + signal + } + ); + return { + value, + write(chunk, encoding2, cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + chunk, + done: false, + cb + }); + }, + final(cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + done: true, + cb + }); + }, + destroy(err, cb) { + ac.abort(); + cb(err); + } + }; + } + function _duplexify(pair) { + const r = pair.readable && typeof pair.readable.read !== "function" ? Readable.wrap(pair.readable) : pair.readable; + const w = pair.writable; + let readable2 = !!isReadable(r); + let writable2 = !!isWritable(w); + let ondrain; + let onfinish; + let onreadable; + let onclose; + let d; + function onfinished(err) { + const cb = onclose; + onclose = null; + if (cb) { + cb(err); + } else if (err) { + d.destroy(err); + } + } + d = new Duplexify({ + // TODO (ronag): highWaterMark? + readableObjectMode: !!(r !== null && r !== void 0 && r.readableObjectMode), + writableObjectMode: !!(w !== null && w !== void 0 && w.writableObjectMode), + readable: readable2, + writable: writable2 + }); + if (writable2) { + eos(w, (err) => { + writable2 = false; + if (err) { + destroyer(r, err); + } + onfinished(err); + }); + d._write = function(chunk, encoding2, callback) { + if (w.write(chunk, encoding2)) { + callback(); + } else { + ondrain = callback; + } + }; + d._final = function(callback) { + w.end(); + onfinish = callback; + }; + w.on("drain", function() { + if (ondrain) { + const cb = ondrain; + ondrain = null; + cb(); + } + }); + w.on("finish", function() { + if (onfinish) { + const cb = onfinish; + onfinish = null; + cb(); + } + }); + } + if (readable2) { + eos(r, (err) => { + readable2 = false; + if (err) { + destroyer(r, err); + } + onfinished(err); + }); + r.on("readable", function() { + if (onreadable) { + const cb = onreadable; + onreadable = null; + cb(); + } + }); + r.on("end", function() { + d.push(null); + }); + d._read = function() { + while (true) { + const buf = r.read(); + if (buf === null) { + onreadable = d._read; + return; + } + if (!d.push(buf)) { + return; + } + } + }; + } + d._destroy = function(err, callback) { + if (!err && onclose !== null) { + err = new AbortError(); + } + onreadable = null; + ondrain = null; + onfinish = null; + if (onclose === null) { + callback(err); + } else { + onclose = callback; + destroyer(w, err); + destroyer(r, err); + } + }; + return d; + } + return duplexify; +} +var duplex; +var hasRequiredDuplex; +function requireDuplex() { + if (hasRequiredDuplex) return duplex; + hasRequiredDuplex = 1; + const { + ObjectDefineProperties, + ObjectGetOwnPropertyDescriptor, + ObjectKeys, + ObjectSetPrototypeOf + } = requirePrimordials(); + duplex = Duplex; + const Readable = requireReadable(); + const Writable = requireWritable(); + ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype); + ObjectSetPrototypeOf(Duplex, Readable); + { + const keys = ObjectKeys(Writable.prototype); + for (let i = 0; i < keys.length; i++) { + const method = keys[i]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + } + function Duplex(options2) { + if (!(this instanceof Duplex)) return new Duplex(options2); + Readable.call(this, options2); + Writable.call(this, options2); + if (options2) { + this.allowHalfOpen = options2.allowHalfOpen !== false; + if (options2.readable === false) { + this._readableState.readable = false; + this._readableState.ended = true; + this._readableState.endEmitted = true; + } + if (options2.writable === false) { + this._writableState.writable = false; + this._writableState.ending = true; + this._writableState.ended = true; + this._writableState.finished = true; + } + } else { + this.allowHalfOpen = true; + } + } + ObjectDefineProperties(Duplex.prototype, { + writable: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writable") + }, + writableHighWaterMark: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableHighWaterMark") + }, + writableObjectMode: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableObjectMode") + }, + writableBuffer: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableBuffer") + }, + writableLength: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableLength") + }, + writableFinished: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableFinished") + }, + writableCorked: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableCorked") + }, + writableEnded: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableEnded") + }, + writableNeedDrain: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableNeedDrain") + }, + destroyed: { + __proto__: null, + get() { + if (this._readableState === void 0 || this._writableState === void 0) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set(value) { + if (this._readableState && this._writableState) { + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + } + } + }); + let webStreamsAdapters; + function lazyWebStreams() { + if (webStreamsAdapters === void 0) webStreamsAdapters = {}; + return webStreamsAdapters; + } + Duplex.fromWeb = function(pair, options2) { + return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options2); + }; + Duplex.toWeb = function(duplex2) { + return lazyWebStreams().newReadableWritablePairFromDuplex(duplex2); + }; + let duplexify2; + Duplex.from = function(body) { + if (!duplexify2) { + duplexify2 = requireDuplexify(); + } + return duplexify2(body, "body"); + }; + return duplex; +} +var transform$1; +var hasRequiredTransform; +function requireTransform() { + if (hasRequiredTransform) return transform$1; + hasRequiredTransform = 1; + const { ObjectSetPrototypeOf, Symbol: Symbol2 } = requirePrimordials(); + transform$1 = Transform; + const { ERR_METHOD_NOT_IMPLEMENTED } = requireErrors().codes; + const Duplex = requireDuplex(); + const { getHighWaterMark } = requireState$3(); + ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype); + ObjectSetPrototypeOf(Transform, Duplex); + const kCallback = Symbol2("kCallback"); + function Transform(options2) { + if (!(this instanceof Transform)) return new Transform(options2); + const readableHighWaterMark = options2 ? getHighWaterMark(this, options2, "readableHighWaterMark", true) : null; + if (readableHighWaterMark === 0) { + options2 = { + ...options2, + highWaterMark: null, + readableHighWaterMark, + // TODO (ronag): 0 is not optimal since we have + // a "bug" where we check needDrain before calling _write and not after. + // Refs: https://github.com/nodejs/node/pull/32887 + // Refs: https://github.com/nodejs/node/pull/35941 + writableHighWaterMark: options2.writableHighWaterMark || 0 + }; + } + Duplex.call(this, options2); + this._readableState.sync = false; + this[kCallback] = null; + if (options2) { + if (typeof options2.transform === "function") this._transform = options2.transform; + if (typeof options2.flush === "function") this._flush = options2.flush; + } + this.on("prefinish", prefinish); + } + function final(cb) { + if (typeof this._flush === "function" && !this.destroyed) { + this._flush((er, data2) => { + if (er) { + if (cb) { + cb(er); + } else { + this.destroy(er); + } + return; + } + if (data2 != null) { + this.push(data2); + } + this.push(null); + if (cb) { + cb(); + } + }); + } else { + this.push(null); + if (cb) { + cb(); + } + } + } + function prefinish() { + if (this._final !== final) { + final.call(this); + } + } + Transform.prototype._final = final; + Transform.prototype._transform = function(chunk, encoding2, callback) { + throw new ERR_METHOD_NOT_IMPLEMENTED("_transform()"); + }; + Transform.prototype._write = function(chunk, encoding2, callback) { + const rState = this._readableState; + const wState = this._writableState; + const length = rState.length; + this._transform(chunk, encoding2, (err, val) => { + if (err) { + callback(err); + return; + } + if (val != null) { + this.push(val); + } + if (wState.ended || // Backwards compat. + length === rState.length || // Backwards compat. + rState.length < rState.highWaterMark) { + callback(); + } else { + this[kCallback] = callback; + } + }); + }; + Transform.prototype._read = function() { + if (this[kCallback]) { + const callback = this[kCallback]; + this[kCallback] = null; + callback(); + } + }; + return transform$1; +} +var passthrough; +var hasRequiredPassthrough; +function requirePassthrough() { + if (hasRequiredPassthrough) return passthrough; + hasRequiredPassthrough = 1; + const { ObjectSetPrototypeOf } = requirePrimordials(); + passthrough = PassThrough; + const Transform = requireTransform(); + ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype); + ObjectSetPrototypeOf(PassThrough, Transform); + function PassThrough(options2) { + if (!(this instanceof PassThrough)) return new PassThrough(options2); + Transform.call(this, options2); + } + PassThrough.prototype._transform = function(chunk, encoding2, cb) { + cb(null, chunk); + }; + return passthrough; +} +var pipeline_1$3; +var hasRequiredPipeline$3; +function requirePipeline$3() { + if (hasRequiredPipeline$3) return pipeline_1$3; + hasRequiredPipeline$3 = 1; + const process2 = requireBrowser$j(); + const { ArrayIsArray, Promise: Promise2, SymbolAsyncIterator, SymbolDispose } = requirePrimordials(); + const eos = requireEndOfStream$4(); + const { once: once2 } = requireUtil$3(); + const destroyImpl = requireDestroy$3(); + const Duplex = requireDuplex(); + const { + aggregateTwoErrors, + codes: { + ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, + ERR_INVALID_RETURN_VALUE, + ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED, + ERR_STREAM_PREMATURE_CLOSE + }, + AbortError + } = requireErrors(); + const { validateFunction, validateAbortSignal } = requireValidators(); + const { + isIterable, + isReadable, + isReadableNodeStream, + isNodeStream, + isTransformStream, + isWebStream, + isReadableStream, + isReadableFinished + } = requireUtils$6(); + const AbortController2 = globalThis.AbortController || requireBrowser$i().AbortController; + let PassThrough; + let Readable; + let addAbortListener; + function destroyer(stream2, reading, writing) { + let finished = false; + stream2.on("close", () => { + finished = true; + }); + const cleanup = eos( + stream2, + { + readable: reading, + writable: writing + }, + (err) => { + finished = !err; + } + ); + return { + destroy: (err) => { + if (finished) return; + finished = true; + destroyImpl.destroyer(stream2, err || new ERR_STREAM_DESTROYED("pipe")); + }, + cleanup + }; + } + function popCallback(streams) { + validateFunction(streams[streams.length - 1], "streams[stream.length - 1]"); + return streams.pop(); + } + function makeAsyncIterable(val) { + if (isIterable(val)) { + return val; + } else if (isReadableNodeStream(val)) { + return fromReadable(val); + } + throw new ERR_INVALID_ARG_TYPE2("val", ["Readable", "Iterable", "AsyncIterable"], val); + } + async function* fromReadable(val) { + if (!Readable) { + Readable = requireReadable(); + } + yield* Readable.prototype[SymbolAsyncIterator].call(val); + } + async function pumpToNode(iterable, writable2, finish, { end }) { + let error2; + let onresolve = null; + const resume = (err) => { + if (err) { + error2 = err; + } + if (onresolve) { + const callback = onresolve; + onresolve = null; + callback(); + } + }; + const wait = () => new Promise2((resolve, reject) => { + if (error2) { + reject(error2); + } else { + onresolve = () => { + if (error2) { + reject(error2); + } else { + resolve(); + } + }; + } + }); + writable2.on("drain", resume); + const cleanup = eos( + writable2, + { + readable: false + }, + resume + ); + try { + if (writable2.writableNeedDrain) { + await wait(); + } + for await (const chunk of iterable) { + if (!writable2.write(chunk)) { + await wait(); + } + } + if (end) { + writable2.end(); + await wait(); + } + finish(); + } catch (err) { + finish(error2 !== err ? aggregateTwoErrors(error2, err) : err); + } finally { + cleanup(); + writable2.off("drain", resume); + } + } + async function pumpToWeb(readable2, writable2, finish, { end }) { + if (isTransformStream(writable2)) { + writable2 = writable2.writable; + } + const writer = writable2.getWriter(); + try { + for await (const chunk of readable2) { + await writer.ready; + writer.write(chunk).catch(() => { + }); + } + await writer.ready; + if (end) { + await writer.close(); + } + finish(); + } catch (err) { + try { + await writer.abort(err); + finish(err); + } catch (err2) { + finish(err2); + } + } + } + function pipeline(...streams) { + return pipelineImpl(streams, once2(popCallback(streams))); + } + function pipelineImpl(streams, callback, opts) { + if (streams.length === 1 && ArrayIsArray(streams[0])) { + streams = streams[0]; + } + if (streams.length < 2) { + throw new ERR_MISSING_ARGS("streams"); + } + const ac = new AbortController2(); + const signal = ac.signal; + const outerSignal = opts === null || opts === void 0 ? void 0 : opts.signal; + const lastStreamCleanup = []; + validateAbortSignal(outerSignal, "options.signal"); + function abort() { + finishImpl(new AbortError()); + } + addAbortListener = addAbortListener || requireUtil$3().addAbortListener; + let disposable; + if (outerSignal) { + disposable = addAbortListener(outerSignal, abort); + } + let error2; + let value; + const destroys = []; + let finishCount = 0; + function finish(err) { + finishImpl(err, --finishCount === 0); + } + function finishImpl(err, final) { + var _disposable; + if (err && (!error2 || error2.code === "ERR_STREAM_PREMATURE_CLOSE")) { + error2 = err; + } + if (!error2 && !final) { + return; + } + while (destroys.length) { + destroys.shift()(error2); + } + (_disposable = disposable) === null || _disposable === void 0 ? void 0 : _disposable[SymbolDispose](); + ac.abort(); + if (final) { + if (!error2) { + lastStreamCleanup.forEach((fn) => fn()); + } + process2.nextTick(callback, error2, value); + } + } + let ret; + for (let i = 0; i < streams.length; i++) { + const stream2 = streams[i]; + const reading = i < streams.length - 1; + const writing = i > 0; + const end = reading || (opts === null || opts === void 0 ? void 0 : opts.end) !== false; + const isLastStream = i === streams.length - 1; + if (isNodeStream(stream2)) { + let onError = function(err) { + if (err && err.name !== "AbortError" && err.code !== "ERR_STREAM_PREMATURE_CLOSE") { + finish(err); + } + }; + if (end) { + const { destroy, cleanup } = destroyer(stream2, reading, writing); + destroys.push(destroy); + if (isReadable(stream2) && isLastStream) { + lastStreamCleanup.push(cleanup); + } + } + stream2.on("error", onError); + if (isReadable(stream2) && isLastStream) { + lastStreamCleanup.push(() => { + stream2.removeListener("error", onError); + }); + } + } + if (i === 0) { + if (typeof stream2 === "function") { + ret = stream2({ + signal + }); + if (!isIterable(ret)) { + throw new ERR_INVALID_RETURN_VALUE("Iterable, AsyncIterable or Stream", "source", ret); + } + } else if (isIterable(stream2) || isReadableNodeStream(stream2) || isTransformStream(stream2)) { + ret = stream2; + } else { + ret = Duplex.from(stream2); + } + } else if (typeof stream2 === "function") { + if (isTransformStream(ret)) { + var _ret; + ret = makeAsyncIterable((_ret = ret) === null || _ret === void 0 ? void 0 : _ret.readable); + } else { + ret = makeAsyncIterable(ret); + } + ret = stream2(ret, { + signal + }); + if (reading) { + if (!isIterable(ret, true)) { + throw new ERR_INVALID_RETURN_VALUE("AsyncIterable", `transform[${i - 1}]`, ret); + } + } else { + var _ret2; + if (!PassThrough) { + PassThrough = requirePassthrough(); + } + const pt = new PassThrough({ + objectMode: true + }); + const then = (_ret2 = ret) === null || _ret2 === void 0 ? void 0 : _ret2.then; + if (typeof then === "function") { + finishCount++; + then.call( + ret, + (val) => { + value = val; + if (val != null) { + pt.write(val); + } + if (end) { + pt.end(); + } + process2.nextTick(finish); + }, + (err) => { + pt.destroy(err); + process2.nextTick(finish, err); + } + ); + } else if (isIterable(ret, true)) { + finishCount++; + pumpToNode(ret, pt, finish, { + end + }); + } else if (isReadableStream(ret) || isTransformStream(ret)) { + const toRead = ret.readable || ret; + finishCount++; + pumpToNode(toRead, pt, finish, { + end + }); + } else { + throw new ERR_INVALID_RETURN_VALUE("AsyncIterable or Promise", "destination", ret); + } + ret = pt; + const { destroy, cleanup } = destroyer(ret, false, true); + destroys.push(destroy); + if (isLastStream) { + lastStreamCleanup.push(cleanup); + } + } + } else if (isNodeStream(stream2)) { + if (isReadableNodeStream(ret)) { + finishCount += 2; + const cleanup = pipe(ret, stream2, finish, { + end + }); + if (isReadable(stream2) && isLastStream) { + lastStreamCleanup.push(cleanup); + } + } else if (isTransformStream(ret) || isReadableStream(ret)) { + const toRead = ret.readable || ret; + finishCount++; + pumpToNode(toRead, stream2, finish, { + end + }); + } else if (isIterable(ret)) { + finishCount++; + pumpToNode(ret, stream2, finish, { + end + }); + } else { + throw new ERR_INVALID_ARG_TYPE2( + "val", + ["Readable", "Iterable", "AsyncIterable", "ReadableStream", "TransformStream"], + ret + ); + } + ret = stream2; + } else if (isWebStream(stream2)) { + if (isReadableNodeStream(ret)) { + finishCount++; + pumpToWeb(makeAsyncIterable(ret), stream2, finish, { + end + }); + } else if (isReadableStream(ret) || isIterable(ret)) { + finishCount++; + pumpToWeb(ret, stream2, finish, { + end + }); + } else if (isTransformStream(ret)) { + finishCount++; + pumpToWeb(ret.readable, stream2, finish, { + end + }); + } else { + throw new ERR_INVALID_ARG_TYPE2( + "val", + ["Readable", "Iterable", "AsyncIterable", "ReadableStream", "TransformStream"], + ret + ); + } + ret = stream2; + } else { + ret = Duplex.from(stream2); + } + } + if (signal !== null && signal !== void 0 && signal.aborted || outerSignal !== null && outerSignal !== void 0 && outerSignal.aborted) { + process2.nextTick(abort); + } + return ret; + } + function pipe(src2, dst, finish, { end }) { + let ended = false; + dst.on("close", () => { + if (!ended) { + finish(new ERR_STREAM_PREMATURE_CLOSE()); + } + }); + src2.pipe(dst, { + end: false + }); + if (end) { + let endFn = function() { + ended = true; + dst.end(); + }; + if (isReadableFinished(src2)) { + process2.nextTick(endFn); + } else { + src2.once("end", endFn); + } + } else { + finish(); + } + eos( + src2, + { + readable: true, + writable: false + }, + (err) => { + const rState = src2._readableState; + if (err && err.code === "ERR_STREAM_PREMATURE_CLOSE" && rState && rState.ended && !rState.errored && !rState.errorEmitted) { + src2.once("end", finish).once("error", finish); + } else { + finish(err); + } + } + ); + return eos( + dst, + { + readable: false, + writable: true + }, + finish + ); + } + pipeline_1$3 = { + pipelineImpl, + pipeline + }; + return pipeline_1$3; +} +var compose; +var hasRequiredCompose; +function requireCompose() { + if (hasRequiredCompose) return compose; + hasRequiredCompose = 1; + const { pipeline } = requirePipeline$3(); + const Duplex = requireDuplex(); + const { destroyer } = requireDestroy$3(); + const { + isNodeStream, + isReadable, + isWritable, + isWebStream, + isTransformStream, + isWritableStream, + isReadableStream + } = requireUtils$6(); + const { + AbortError, + codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS } + } = requireErrors(); + const eos = requireEndOfStream$4(); + compose = function compose2(...streams) { + if (streams.length === 0) { + throw new ERR_MISSING_ARGS("streams"); + } + if (streams.length === 1) { + return Duplex.from(streams[0]); + } + const orgStreams = [...streams]; + if (typeof streams[0] === "function") { + streams[0] = Duplex.from(streams[0]); + } + if (typeof streams[streams.length - 1] === "function") { + const idx = streams.length - 1; + streams[idx] = Duplex.from(streams[idx]); + } + for (let n = 0; n < streams.length; ++n) { + if (!isNodeStream(streams[n]) && !isWebStream(streams[n])) { + continue; + } + if (n < streams.length - 1 && !(isReadable(streams[n]) || isReadableStream(streams[n]) || isTransformStream(streams[n]))) { + throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], "must be readable"); + } + if (n > 0 && !(isWritable(streams[n]) || isWritableStream(streams[n]) || isTransformStream(streams[n]))) { + throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], "must be writable"); + } + } + let ondrain; + let onfinish; + let onreadable; + let onclose; + let d; + function onfinished(err) { + const cb = onclose; + onclose = null; + if (cb) { + cb(err); + } else if (err) { + d.destroy(err); + } else if (!readable2 && !writable2) { + d.destroy(); + } + } + const head = streams[0]; + const tail = pipeline(streams, onfinished); + const writable2 = !!(isWritable(head) || isWritableStream(head) || isTransformStream(head)); + const readable2 = !!(isReadable(tail) || isReadableStream(tail) || isTransformStream(tail)); + d = new Duplex({ + // TODO (ronag): highWaterMark? + writableObjectMode: !!(head !== null && head !== void 0 && head.writableObjectMode), + readableObjectMode: !!(tail !== null && tail !== void 0 && tail.readableObjectMode), + writable: writable2, + readable: readable2 + }); + if (writable2) { + if (isNodeStream(head)) { + d._write = function(chunk, encoding2, callback) { + if (head.write(chunk, encoding2)) { + callback(); + } else { + ondrain = callback; + } + }; + d._final = function(callback) { + head.end(); + onfinish = callback; + }; + head.on("drain", function() { + if (ondrain) { + const cb = ondrain; + ondrain = null; + cb(); + } + }); + } else if (isWebStream(head)) { + const writable3 = isTransformStream(head) ? head.writable : head; + const writer = writable3.getWriter(); + d._write = async function(chunk, encoding2, callback) { + try { + await writer.ready; + writer.write(chunk).catch(() => { + }); + callback(); + } catch (err) { + callback(err); + } + }; + d._final = async function(callback) { + try { + await writer.ready; + writer.close().catch(() => { + }); + onfinish = callback; + } catch (err) { + callback(err); + } + }; + } + const toRead = isTransformStream(tail) ? tail.readable : tail; + eos(toRead, () => { + if (onfinish) { + const cb = onfinish; + onfinish = null; + cb(); + } + }); + } + if (readable2) { + if (isNodeStream(tail)) { + tail.on("readable", function() { + if (onreadable) { + const cb = onreadable; + onreadable = null; + cb(); + } + }); + tail.on("end", function() { + d.push(null); + }); + d._read = function() { + while (true) { + const buf = tail.read(); + if (buf === null) { + onreadable = d._read; + return; + } + if (!d.push(buf)) { + return; + } + } + }; + } else if (isWebStream(tail)) { + const readable3 = isTransformStream(tail) ? tail.readable : tail; + const reader = readable3.getReader(); + d._read = async function() { + while (true) { + try { + const { value, done } = await reader.read(); + if (!d.push(value)) { + return; + } + if (done) { + d.push(null); + return; + } + } catch { + return; + } + } + }; + } + } + d._destroy = function(err, callback) { + if (!err && onclose !== null) { + err = new AbortError(); + } + onreadable = null; + ondrain = null; + onfinish = null; + if (onclose === null) { + callback(err); + } else { + onclose = callback; + if (isNodeStream(tail)) { + destroyer(tail, err); + } + } + }; + return d; + }; + return compose; +} +var hasRequiredOperators; +function requireOperators() { + if (hasRequiredOperators) return operators; + hasRequiredOperators = 1; + const AbortController2 = globalThis.AbortController || requireBrowser$i().AbortController; + const { + codes: { ERR_INVALID_ARG_VALUE, ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE }, + AbortError + } = requireErrors(); + const { validateAbortSignal, validateInteger, validateObject } = requireValidators(); + const kWeakHandler = requirePrimordials().Symbol("kWeak"); + const kResistStopPropagation = requirePrimordials().Symbol("kResistStopPropagation"); + const { finished } = requireEndOfStream$4(); + const staticCompose = requireCompose(); + const { addAbortSignalNoValidate } = requireAddAbortSignal(); + const { isWritable, isNodeStream } = requireUtils$6(); + const { deprecate } = requireUtil$3(); + const { + ArrayPrototypePush, + Boolean: Boolean2, + MathFloor, + Number: Number2, + NumberIsNaN, + Promise: Promise2, + PromiseReject, + PromiseResolve, + PromisePrototypeThen, + Symbol: Symbol2 + } = requirePrimordials(); + const kEmpty = Symbol2("kEmpty"); + const kEof = Symbol2("kEof"); + function compose2(stream2, options2) { + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + if (isNodeStream(stream2) && !isWritable(stream2)) { + throw new ERR_INVALID_ARG_VALUE("stream", stream2, "must be writable"); + } + const composedStream = staticCompose(this, stream2); + if (options2 !== null && options2 !== void 0 && options2.signal) { + addAbortSignalNoValidate(options2.signal, composedStream); + } + return composedStream; + } + function map2(fn, options2) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("fn", ["Function", "AsyncFunction"], fn); + } + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + let concurrency = 1; + if ((options2 === null || options2 === void 0 ? void 0 : options2.concurrency) != null) { + concurrency = MathFloor(options2.concurrency); + } + let highWaterMark = concurrency - 1; + if ((options2 === null || options2 === void 0 ? void 0 : options2.highWaterMark) != null) { + highWaterMark = MathFloor(options2.highWaterMark); + } + validateInteger(concurrency, "options.concurrency", 1); + validateInteger(highWaterMark, "options.highWaterMark", 0); + highWaterMark += concurrency; + return (async function* map3() { + const signal = requireUtil$3().AbortSignalAny( + [options2 === null || options2 === void 0 ? void 0 : options2.signal].filter(Boolean2) + ); + const stream2 = this; + const queue = []; + const signalOpt = { + signal + }; + let next; + let resume; + let done = false; + let cnt = 0; + function onCatch() { + done = true; + afterItemProcessed(); + } + function afterItemProcessed() { + cnt -= 1; + maybeResume(); + } + function maybeResume() { + if (resume && !done && cnt < concurrency && queue.length < highWaterMark) { + resume(); + resume = null; + } + } + async function pump() { + try { + for await (let val of stream2) { + if (done) { + return; + } + if (signal.aborted) { + throw new AbortError(); + } + try { + val = fn(val, signalOpt); + if (val === kEmpty) { + continue; + } + val = PromiseResolve(val); + } catch (err) { + val = PromiseReject(err); + } + cnt += 1; + PromisePrototypeThen(val, afterItemProcessed, onCatch); + queue.push(val); + if (next) { + next(); + next = null; + } + if (!done && (queue.length >= highWaterMark || cnt >= concurrency)) { + await new Promise2((resolve) => { + resume = resolve; + }); + } + } + queue.push(kEof); + } catch (err) { + const val = PromiseReject(err); + PromisePrototypeThen(val, afterItemProcessed, onCatch); + queue.push(val); + } finally { + done = true; + if (next) { + next(); + next = null; + } + } + } + pump(); + try { + while (true) { + while (queue.length > 0) { + const val = await queue[0]; + if (val === kEof) { + return; + } + if (signal.aborted) { + throw new AbortError(); + } + if (val !== kEmpty) { + yield val; + } + queue.shift(); + maybeResume(); + } + await new Promise2((resolve) => { + next = resolve; + }); + } + } finally { + done = true; + if (resume) { + resume(); + resume = null; + } + } + }).call(this); + } + function asIndexedPairs(options2 = void 0) { + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + return (async function* asIndexedPairs2() { + let index2 = 0; + for await (const val of this) { + var _options$signal; + if (options2 !== null && options2 !== void 0 && (_options$signal = options2.signal) !== null && _options$signal !== void 0 && _options$signal.aborted) { + throw new AbortError({ + cause: options2.signal.reason + }); + } + yield [index2++, val]; + } + }).call(this); + } + async function some(fn, options2 = void 0) { + for await (const unused of filter.call(this, fn, options2)) { + return true; + } + return false; + } + async function every(fn, options2 = void 0) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("fn", ["Function", "AsyncFunction"], fn); + } + return !await some.call( + this, + async (...args) => { + return !await fn(...args); + }, + options2 + ); + } + async function find(fn, options2) { + for await (const result of filter.call(this, fn, options2)) { + return result; + } + return void 0; + } + async function forEach(fn, options2) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("fn", ["Function", "AsyncFunction"], fn); + } + async function forEachFn(value, options3) { + await fn(value, options3); + return kEmpty; + } + for await (const unused of map2.call(this, forEachFn, options2)) ; + } + function filter(fn, options2) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("fn", ["Function", "AsyncFunction"], fn); + } + async function filterFn(value, options3) { + if (await fn(value, options3)) { + return value; + } + return kEmpty; + } + return map2.call(this, filterFn, options2); + } + class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS { + constructor() { + super("reduce"); + this.message = "Reduce of an empty stream requires an initial value"; + } + } + async function reduce(reducer, initialValue, options2) { + var _options$signal2; + if (typeof reducer !== "function") { + throw new ERR_INVALID_ARG_TYPE2("reducer", ["Function", "AsyncFunction"], reducer); + } + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + let hasInitialValue = arguments.length > 1; + if (options2 !== null && options2 !== void 0 && (_options$signal2 = options2.signal) !== null && _options$signal2 !== void 0 && _options$signal2.aborted) { + const err = new AbortError(void 0, { + cause: options2.signal.reason + }); + this.once("error", () => { + }); + await finished(this.destroy(err)); + throw err; + } + const ac = new AbortController2(); + const signal = ac.signal; + if (options2 !== null && options2 !== void 0 && options2.signal) { + const opts = { + once: true, + [kWeakHandler]: this, + [kResistStopPropagation]: true + }; + options2.signal.addEventListener("abort", () => ac.abort(), opts); + } + let gotAnyItemFromStream = false; + try { + for await (const value of this) { + var _options$signal3; + gotAnyItemFromStream = true; + if (options2 !== null && options2 !== void 0 && (_options$signal3 = options2.signal) !== null && _options$signal3 !== void 0 && _options$signal3.aborted) { + throw new AbortError(); + } + if (!hasInitialValue) { + initialValue = value; + hasInitialValue = true; + } else { + initialValue = await reducer(initialValue, value, { + signal + }); + } + } + if (!gotAnyItemFromStream && !hasInitialValue) { + throw new ReduceAwareErrMissingArgs(); + } + } finally { + ac.abort(); + } + return initialValue; + } + async function toArray(options2) { + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + const result = []; + for await (const val of this) { + var _options$signal4; + if (options2 !== null && options2 !== void 0 && (_options$signal4 = options2.signal) !== null && _options$signal4 !== void 0 && _options$signal4.aborted) { + throw new AbortError(void 0, { + cause: options2.signal.reason + }); + } + ArrayPrototypePush(result, val); + } + return result; + } + function flatMap(fn, options2) { + const values = map2.call(this, fn, options2); + return (async function* flatMap2() { + for await (const val of values) { + yield* val; + } + }).call(this); + } + function toIntegerOrInfinity(number) { + number = Number2(number); + if (NumberIsNaN(number)) { + return 0; + } + if (number < 0) { + throw new ERR_OUT_OF_RANGE("number", ">= 0", number); + } + return number; + } + function drop(number, options2 = void 0) { + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return (async function* drop2() { + var _options$signal5; + if (options2 !== null && options2 !== void 0 && (_options$signal5 = options2.signal) !== null && _options$signal5 !== void 0 && _options$signal5.aborted) { + throw new AbortError(); + } + for await (const val of this) { + var _options$signal6; + if (options2 !== null && options2 !== void 0 && (_options$signal6 = options2.signal) !== null && _options$signal6 !== void 0 && _options$signal6.aborted) { + throw new AbortError(); + } + if (number-- <= 0) { + yield val; + } + } + }).call(this); + } + function take(number, options2 = void 0) { + if (options2 != null) { + validateObject(options2, "options"); + } + if ((options2 === null || options2 === void 0 ? void 0 : options2.signal) != null) { + validateAbortSignal(options2.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return (async function* take2() { + var _options$signal7; + if (options2 !== null && options2 !== void 0 && (_options$signal7 = options2.signal) !== null && _options$signal7 !== void 0 && _options$signal7.aborted) { + throw new AbortError(); + } + for await (const val of this) { + var _options$signal8; + if (options2 !== null && options2 !== void 0 && (_options$signal8 = options2.signal) !== null && _options$signal8 !== void 0 && _options$signal8.aborted) { + throw new AbortError(); + } + if (number-- > 0) { + yield val; + } + if (number <= 0) { + return; + } + } + }).call(this); + } + operators.streamReturningOperators = { + asIndexedPairs: deprecate(asIndexedPairs, "readable.asIndexedPairs will be removed in a future version."), + drop, + filter, + flatMap, + map: map2, + take, + compose: compose2 + }; + operators.promiseReturningOperators = { + every, + forEach, + reduce, + toArray, + some, + find + }; + return operators; +} +var promises$2; +var hasRequiredPromises; +function requirePromises() { + if (hasRequiredPromises) return promises$2; + hasRequiredPromises = 1; + const { ArrayPrototypePop, Promise: Promise2 } = requirePrimordials(); + const { isIterable, isNodeStream, isWebStream } = requireUtils$6(); + const { pipelineImpl: pl } = requirePipeline$3(); + const { finished } = requireEndOfStream$4(); + requireStream(); + function pipeline(...streams) { + return new Promise2((resolve, reject) => { + let signal; + let end; + const lastArg = streams[streams.length - 1]; + if (lastArg && typeof lastArg === "object" && !isNodeStream(lastArg) && !isIterable(lastArg) && !isWebStream(lastArg)) { + const options2 = ArrayPrototypePop(streams); + signal = options2.signal; + end = options2.end; + } + pl( + streams, + (err, value) => { + if (err) { + reject(err); + } else { + resolve(value); + } + }, + { + signal, + end + } + ); + }); + } + promises$2 = { + finished, + pipeline + }; + return promises$2; +} +var hasRequiredStream; +function requireStream() { + if (hasRequiredStream) return stream$1.exports; + hasRequiredStream = 1; + const { Buffer: Buffer2 } = requireBuffer$2(); + const { ObjectDefineProperty, ObjectKeys, ReflectApply } = requirePrimordials(); + const { + promisify: { custom: customPromisify } + } = requireUtil$3(); + const { streamReturningOperators, promiseReturningOperators } = requireOperators(); + const { + codes: { ERR_ILLEGAL_CONSTRUCTOR } + } = requireErrors(); + const compose2 = requireCompose(); + const { setDefaultHighWaterMark, getDefaultHighWaterMark } = requireState$3(); + const { pipeline } = requirePipeline$3(); + const { destroyer } = requireDestroy$3(); + const eos = requireEndOfStream$4(); + const promises2 = requirePromises(); + const utils2 = requireUtils$6(); + const Stream2 = stream$1.exports = requireLegacy$1().Stream; + Stream2.isDestroyed = utils2.isDestroyed; + Stream2.isDisturbed = utils2.isDisturbed; + Stream2.isErrored = utils2.isErrored; + Stream2.isReadable = utils2.isReadable; + Stream2.isWritable = utils2.isWritable; + Stream2.Readable = requireReadable(); + for (const key2 of ObjectKeys(streamReturningOperators)) { + let fn = function(...args) { + if (new.target) { + throw ERR_ILLEGAL_CONSTRUCTOR(); + } + return Stream2.Readable.from(ReflectApply(op, this, args)); + }; + const op = streamReturningOperators[key2]; + ObjectDefineProperty(fn, "name", { + __proto__: null, + value: op.name + }); + ObjectDefineProperty(fn, "length", { + __proto__: null, + value: op.length + }); + ObjectDefineProperty(Stream2.Readable.prototype, key2, { + __proto__: null, + value: fn, + enumerable: false, + configurable: true, + writable: true + }); + } + for (const key2 of ObjectKeys(promiseReturningOperators)) { + let fn = function(...args) { + if (new.target) { + throw ERR_ILLEGAL_CONSTRUCTOR(); + } + return ReflectApply(op, this, args); + }; + const op = promiseReturningOperators[key2]; + ObjectDefineProperty(fn, "name", { + __proto__: null, + value: op.name + }); + ObjectDefineProperty(fn, "length", { + __proto__: null, + value: op.length + }); + ObjectDefineProperty(Stream2.Readable.prototype, key2, { + __proto__: null, + value: fn, + enumerable: false, + configurable: true, + writable: true + }); + } + Stream2.Writable = requireWritable(); + Stream2.Duplex = requireDuplex(); + Stream2.Transform = requireTransform(); + Stream2.PassThrough = requirePassthrough(); + Stream2.pipeline = pipeline; + const { addAbortSignal: addAbortSignal2 } = requireAddAbortSignal(); + Stream2.addAbortSignal = addAbortSignal2; + Stream2.finished = eos; + Stream2.destroy = destroyer; + Stream2.compose = compose2; + Stream2.setDefaultHighWaterMark = setDefaultHighWaterMark; + Stream2.getDefaultHighWaterMark = getDefaultHighWaterMark; + ObjectDefineProperty(Stream2, "promises", { + __proto__: null, + configurable: true, + enumerable: true, + get() { + return promises2; + } + }); + ObjectDefineProperty(pipeline, customPromisify, { + __proto__: null, + enumerable: true, + get() { + return promises2.pipeline; + } + }); + ObjectDefineProperty(eos, customPromisify, { + __proto__: null, + enumerable: true, + get() { + return promises2.finished; + } + }); + Stream2.Stream = Stream2; + Stream2._isUint8Array = function isUint8Array(value) { + return value instanceof Uint8Array; + }; + Stream2._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + }; + return stream$1.exports; +} +var hasRequiredBrowser$h; +function requireBrowser$h() { + if (hasRequiredBrowser$h) return browser$i.exports; + hasRequiredBrowser$h = 1; + (function(module) { + const CustomStream = requireStream(); + const promises2 = requirePromises(); + const originalDestroy = CustomStream.Readable.destroy; + module.exports = CustomStream.Readable; + module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer; + module.exports._isUint8Array = CustomStream._isUint8Array; + module.exports.isDisturbed = CustomStream.isDisturbed; + module.exports.isErrored = CustomStream.isErrored; + module.exports.isReadable = CustomStream.isReadable; + module.exports.Readable = CustomStream.Readable; + module.exports.Writable = CustomStream.Writable; + module.exports.Duplex = CustomStream.Duplex; + module.exports.Transform = CustomStream.Transform; + module.exports.PassThrough = CustomStream.PassThrough; + module.exports.addAbortSignal = CustomStream.addAbortSignal; + module.exports.finished = CustomStream.finished; + module.exports.destroy = CustomStream.destroy; + module.exports.destroy = originalDestroy; + module.exports.pipeline = CustomStream.pipeline; + module.exports.compose = CustomStream.compose; + Object.defineProperty(CustomStream, "promises", { + configurable: true, + enumerable: true, + get() { + return promises2; + } + }); + module.exports.Stream = CustomStream.Stream; + module.exports.default = module.exports; + })(browser$i); + return browser$i.exports; +} +var FileHandle = {}; +var util$3 = {}; +var constants$7 = {}; +var hasRequiredConstants$6; +function requireConstants$6() { + if (hasRequiredConstants$6) return constants$7; + hasRequiredConstants$6 = 1; + Object.defineProperty(constants$7, "__esModule", { value: true }); + constants$7.FLAGS = constants$7.ERRSTR = void 0; + const constants_1 = requireConstants$7(); + constants$7.ERRSTR = { + PATH_STR: "path must be a string or Buffer", + // FD: 'file descriptor must be a unsigned 32-bit integer', + FD: "fd must be a file descriptor", + MODE_INT: "mode must be an int", + CB: "callback must be a function", + UID: "uid must be an unsigned int", + GID: "gid must be an unsigned int", + LEN: "len must be an integer", + ATIME: "atime must be an integer", + MTIME: "mtime must be an integer", + PREFIX: "filename prefix is required", + BUFFER: "buffer must be an instance of Buffer or StaticBuffer", + OFFSET: "offset must be an integer", + LENGTH: "length must be an integer", + POSITION: "position must be an integer" + }; + const { O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_TRUNC, O_APPEND, O_SYNC } = constants_1.constants; + var FLAGS; + (function(FLAGS2) { + FLAGS2[FLAGS2["r"] = O_RDONLY] = "r"; + FLAGS2[FLAGS2["r+"] = O_RDWR] = "r+"; + FLAGS2[FLAGS2["rs"] = O_RDONLY | O_SYNC] = "rs"; + FLAGS2[FLAGS2["sr"] = FLAGS2.rs] = "sr"; + FLAGS2[FLAGS2["rs+"] = O_RDWR | O_SYNC] = "rs+"; + FLAGS2[FLAGS2["sr+"] = FLAGS2["rs+"]] = "sr+"; + FLAGS2[FLAGS2["w"] = O_WRONLY | O_CREAT | O_TRUNC] = "w"; + FLAGS2[FLAGS2["wx"] = O_WRONLY | O_CREAT | O_TRUNC | O_EXCL] = "wx"; + FLAGS2[FLAGS2["xw"] = FLAGS2.wx] = "xw"; + FLAGS2[FLAGS2["w+"] = O_RDWR | O_CREAT | O_TRUNC] = "w+"; + FLAGS2[FLAGS2["wx+"] = O_RDWR | O_CREAT | O_TRUNC | O_EXCL] = "wx+"; + FLAGS2[FLAGS2["xw+"] = FLAGS2["wx+"]] = "xw+"; + FLAGS2[FLAGS2["a"] = O_WRONLY | O_APPEND | O_CREAT] = "a"; + FLAGS2[FLAGS2["ax"] = O_WRONLY | O_APPEND | O_CREAT | O_EXCL] = "ax"; + FLAGS2[FLAGS2["xa"] = FLAGS2.ax] = "xa"; + FLAGS2[FLAGS2["a+"] = O_RDWR | O_APPEND | O_CREAT] = "a+"; + FLAGS2[FLAGS2["ax+"] = O_RDWR | O_APPEND | O_CREAT | O_EXCL] = "ax+"; + FLAGS2[FLAGS2["xa+"] = FLAGS2["ax+"]] = "xa+"; + })(FLAGS || (constants$7.FLAGS = FLAGS = {})); + return constants$7; +} +var url$2 = {}; +var punycode$1 = { exports: {} }; +/*! https://mths.be/punycode v1.4.1 by @mathias */ +var punycode = punycode$1.exports; +var hasRequiredPunycode; +function requirePunycode() { + if (hasRequiredPunycode) return punycode$1.exports; + hasRequiredPunycode = 1; + (function(module, exports) { + (function(root) { + var freeExports = exports && !exports.nodeType && exports; + var freeModule = module && !module.nodeType && module; + var freeGlobal = typeof commonjsGlobal == "object" && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal) { + root = freeGlobal; + } + var punycode2, maxInt = 2147483647, base2 = 36, tMin = 1, tMax = 26, skew = 38, damp = 700, initialBias = 72, initialN = 128, delimiter = "-", regexPunycode = /^xn--/, regexNonASCII = /[^\x20-\x7E]/, regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, errors2 = { + "overflow": "Overflow: input needs wider integers to process", + "not-basic": "Illegal input >= 0x80 (not a basic code point)", + "invalid-input": "Invalid input" + }, baseMinusTMin = base2 - tMin, floor2 = Math.floor, stringFromCharCode = String.fromCharCode, key2; + function error2(type2) { + throw new RangeError(errors2[type2]); + } + function map2(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + function mapDomain(string2, fn) { + var parts = string2.split("@"); + var result = ""; + if (parts.length > 1) { + result = parts[0] + "@"; + string2 = parts[1]; + } + string2 = string2.replace(regexSeparators, "."); + var labels = string2.split("."); + var encoded = map2(labels, fn).join("."); + return result + encoded; + } + function ucs2decode(string2) { + var output = [], counter = 0, length = string2.length, value, extra; + while (counter < length) { + value = string2.charCodeAt(counter++); + if (value >= 55296 && value <= 56319 && counter < length) { + extra = string2.charCodeAt(counter++); + if ((extra & 64512) == 56320) { + output.push(((value & 1023) << 10) + (extra & 1023) + 65536); + } else { + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + function ucs2encode(array) { + return map2(array, function(value) { + var output = ""; + if (value > 65535) { + value -= 65536; + output += stringFromCharCode(value >>> 10 & 1023 | 55296); + value = 56320 | value & 1023; + } + output += stringFromCharCode(value); + return output; + }).join(""); + } + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base2; + } + function digitToBasic(digit2, flag) { + return digit2 + 22 + 75 * (digit2 < 26) - ((flag != 0) << 5); + } + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor2(delta / damp) : delta >> 1; + delta += floor2(delta / numPoints); + for (; delta > baseMinusTMin * tMax >> 1; k += base2) { + delta = floor2(delta / baseMinusTMin); + } + return floor2(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + function decode(input) { + var output = [], inputLength = input.length, out, i = 0, n = initialN, bias = initialBias, basic, j, index2, oldi, w, k, digit2, t, baseMinusT; + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + for (j = 0; j < basic; ++j) { + if (input.charCodeAt(j) >= 128) { + error2("not-basic"); + } + output.push(input.charCodeAt(j)); + } + for (index2 = basic > 0 ? basic + 1 : 0; index2 < inputLength; ) { + for (oldi = i, w = 1, k = base2; ; k += base2) { + if (index2 >= inputLength) { + error2("invalid-input"); + } + digit2 = basicToDigit(input.charCodeAt(index2++)); + if (digit2 >= base2 || digit2 > floor2((maxInt - i) / w)) { + error2("overflow"); + } + i += digit2 * w; + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (digit2 < t) { + break; + } + baseMinusT = base2 - t; + if (w > floor2(maxInt / baseMinusT)) { + error2("overflow"); + } + w *= baseMinusT; + } + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + if (floor2(i / out) > maxInt - n) { + error2("overflow"); + } + n += floor2(i / out); + i %= out; + output.splice(i++, 0, n); + } + return ucs2encode(output); + } + function encode(input) { + var n, delta, handledCPCount, basicLength, bias, j, m, q, k, t, currentValue, output = [], inputLength, handledCPCountPlusOne, baseMinusT, qMinusT; + input = ucs2decode(input); + inputLength = input.length; + n = initialN; + delta = 0; + bias = initialBias; + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 128) { + output.push(stringFromCharCode(currentValue)); + } + } + handledCPCount = basicLength = output.length; + if (basicLength) { + output.push(delimiter); + } + while (handledCPCount < inputLength) { + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor2((maxInt - delta) / handledCPCountPlusOne)) { + error2("overflow"); + } + delta += (m - n) * handledCPCountPlusOne; + n = m; + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < n && ++delta > maxInt) { + error2("overflow"); + } + if (currentValue == n) { + for (q = delta, k = base2; ; k += base2) { + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base2 - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor2(qMinusT / baseMinusT); + } + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + ++delta; + ++n; + } + return output.join(""); + } + function toUnicode(input) { + return mapDomain(input, function(string2) { + return regexPunycode.test(string2) ? decode(string2.slice(4).toLowerCase()) : string2; + }); + } + function toASCII(input) { + return mapDomain(input, function(string2) { + return regexNonASCII.test(string2) ? "xn--" + encode(string2) : string2; + }); + } + punycode2 = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + "version": "1.4.1", + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + "ucs2": { + "decode": ucs2decode, + "encode": ucs2encode + }, + "decode": decode, + "encode": encode, + "toASCII": toASCII, + "toUnicode": toUnicode + }; + if (freeExports && freeModule) { + if (module.exports == freeExports) { + freeModule.exports = punycode2; + } else { + for (key2 in punycode2) { + punycode2.hasOwnProperty(key2) && (freeExports[key2] = punycode2[key2]); + } + } + } else { + root.punycode = punycode2; + } + })(punycode); + })(punycode$1, punycode$1.exports); + return punycode$1.exports; +} +const __viteBrowserExternal = {}; +const __viteBrowserExternal$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + default: __viteBrowserExternal +}, Symbol.toStringTag, { value: "Module" })); +const require$$3 = /* @__PURE__ */ getAugmentedNamespace(__viteBrowserExternal$1); +var objectInspect; +var hasRequiredObjectInspect; +function requireObjectInspect() { + if (hasRequiredObjectInspect) return objectInspect; + hasRequiredObjectInspect = 1; + var hasMap = typeof Map === "function" && Map.prototype; + var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, "size") : null; + var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === "function" ? mapSizeDescriptor.get : null; + var mapForEach = hasMap && Map.prototype.forEach; + var hasSet = typeof Set === "function" && Set.prototype; + var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, "size") : null; + var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === "function" ? setSizeDescriptor.get : null; + var setForEach = hasSet && Set.prototype.forEach; + var hasWeakMap = typeof WeakMap === "function" && WeakMap.prototype; + var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; + var hasWeakSet = typeof WeakSet === "function" && WeakSet.prototype; + var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; + var hasWeakRef = typeof WeakRef === "function" && WeakRef.prototype; + var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; + var booleanValueOf = Boolean.prototype.valueOf; + var objectToString = Object.prototype.toString; + var functionToString = Function.prototype.toString; + var $match = String.prototype.match; + var $slice = String.prototype.slice; + var $replace = String.prototype.replace; + var $toUpperCase = String.prototype.toUpperCase; + var $toLowerCase = String.prototype.toLowerCase; + var $test = RegExp.prototype.test; + var $concat = Array.prototype.concat; + var $join = Array.prototype.join; + var $arrSlice = Array.prototype.slice; + var $floor = Math.floor; + var bigIntValueOf = typeof BigInt === "function" ? BigInt.prototype.valueOf : null; + var gOPS = Object.getOwnPropertySymbols; + var symToString = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? Symbol.prototype.toString : null; + var hasShammedSymbols = typeof Symbol === "function" && typeof Symbol.iterator === "object"; + var toStringTag = typeof Symbol === "function" && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? "object" : "symbol") ? Symbol.toStringTag : null; + var isEnumerable = Object.prototype.propertyIsEnumerable; + var gPO = (typeof Reflect === "function" ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ([].__proto__ === Array.prototype ? function(O) { + return O.__proto__; + } : null); + function addNumericSeparator(num, str) { + if (num === Infinity || num === -Infinity || num !== num || num && num > -1e3 && num < 1e3 || $test.call(/e/, str)) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === "number") { + var int2 = num < 0 ? -$floor(-num) : $floor(num); + if (int2 !== num) { + var intStr = String(int2); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, "$&_") + "." + $replace.call($replace.call(dec, /([0-9]{3})/g, "$&_"), /_$/, ""); + } + } + return $replace.call(str, sepRegex, "$&_"); + } + var utilInspect = require$$3; + var inspectCustom = utilInspect.custom; + var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; + var quotes = { + __proto__: null, + "double": '"', + single: "'" + }; + var quoteREs = { + __proto__: null, + "double": /(["\\])/g, + single: /(['\\])/g + }; + objectInspect = function inspect_(obj, options2, depth, seen) { + var opts = options2 || {}; + if (has(opts, "quoteStyle") && !has(quotes, opts.quoteStyle)) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if (has(opts, "maxStringLength") && (typeof opts.maxStringLength === "number" ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity : opts.maxStringLength !== null)) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has(opts, "customInspect") ? opts.customInspect : true; + if (typeof customInspect !== "boolean" && customInspect !== "symbol") { + throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`"); + } + if (has(opts, "indent") && opts.indent !== null && opts.indent !== " " && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has(opts, "numericSeparator") && typeof opts.numericSeparator !== "boolean") { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + if (typeof obj === "undefined") { + return "undefined"; + } + if (obj === null) { + return "null"; + } + if (typeof obj === "boolean") { + return obj ? "true" : "false"; + } + if (typeof obj === "string") { + return inspectString(obj, opts); + } + if (typeof obj === "number") { + if (obj === 0) { + return Infinity / obj > 0 ? "0" : "-0"; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === "bigint") { + var bigIntStr = String(obj) + "n"; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + var maxDepth = typeof opts.depth === "undefined" ? 5 : opts.depth; + if (typeof depth === "undefined") { + depth = 0; + } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === "object") { + return isArray2(obj) ? "[Array]" : "[Object]"; + } + var indent = getIndent(opts, depth); + if (typeof seen === "undefined") { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return "[Circular]"; + } + function inspect(value, from2, noIndent) { + if (from2) { + seen = $arrSlice.call(seen); + seen.push(from2); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has(opts, "quoteStyle")) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + if (typeof obj === "function" && !isRegExp2(obj)) { + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return "[Function" + (name ? ": " + name : " (anonymous)") + "]" + (keys.length > 0 ? " { " + $join.call(keys, ", ") + " }" : ""); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, "$1") : symToString.call(obj); + return typeof obj === "object" && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement(obj)) { + var s = "<" + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += " " + attrs[i].name + "=" + wrapQuotes(quote2(attrs[i].value), "double", opts); + } + s += ">"; + if (obj.childNodes && obj.childNodes.length) { + s += "..."; + } + s += ""; + return s; + } + if (isArray2(obj)) { + if (obj.length === 0) { + return "[]"; + } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return "[" + indentedJoin(xs, indent) + "]"; + } + return "[ " + $join.call(xs, ", ") + " ]"; + } + if (isError2(obj)) { + var parts = arrObjKeys(obj, inspect); + if (!("cause" in Error.prototype) && "cause" in obj && !isEnumerable.call(obj, "cause")) { + return "{ [" + String(obj) + "] " + $join.call($concat.call("[cause]: " + inspect(obj.cause), parts), ", ") + " }"; + } + if (parts.length === 0) { + return "[" + String(obj) + "]"; + } + return "{ [" + String(obj) + "] " + $join.call(parts, ", ") + " }"; + } + if (typeof obj === "object" && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === "function" && utilInspect) { + return utilInspect(obj, { depth: maxDepth - depth }); + } else if (customInspect !== "symbol" && typeof obj.inspect === "function") { + return obj.inspect(); + } + } + if (isMap2(obj)) { + var mapParts = []; + if (mapForEach) { + mapForEach.call(obj, function(value, key2) { + mapParts.push(inspect(key2, obj, true) + " => " + inspect(value, obj)); + }); + } + return collectionOf("Map", mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + if (setForEach) { + setForEach.call(obj, function(value) { + setParts.push(inspect(value, obj)); + }); + } + return collectionOf("Set", setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf("WeakMap"); + } + if (isWeakSet(obj)) { + return weakCollectionOf("WeakSet"); + } + if (isWeakRef(obj)) { + return weakCollectionOf("WeakRef"); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString2(obj)) { + return markBoxed(inspect(String(obj))); + } + if (typeof window !== "undefined" && obj === window) { + return "{ [object Window] }"; + } + if (typeof globalThis !== "undefined" && obj === globalThis || typeof commonjsGlobal !== "undefined" && obj === commonjsGlobal) { + return "{ [object globalThis] }"; + } + if (!isDate2(obj) && !isRegExp2(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject2 = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? "" : "null prototype"; + var stringTag = !isPlainObject2 && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? "Object" : ""; + var constructorTag = isPlainObject2 || typeof obj.constructor !== "function" ? "" : obj.constructor.name ? obj.constructor.name + " " : ""; + var tag = constructorTag + (stringTag || protoTag ? "[" + $join.call($concat.call([], stringTag || [], protoTag || []), ": ") + "] " : ""); + if (ys.length === 0) { + return tag + "{}"; + } + if (indent) { + return tag + "{" + indentedJoin(ys, indent) + "}"; + } + return tag + "{ " + $join.call(ys, ", ") + " }"; + } + return String(obj); + }; + function wrapQuotes(s, defaultStyle, opts) { + var style = opts.quoteStyle || defaultStyle; + var quoteChar = quotes[style]; + return quoteChar + s + quoteChar; + } + function quote2(s) { + return $replace.call(String(s), /"/g, """); + } + function isArray2(obj) { + return toStr(obj) === "[object Array]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isDate2(obj) { + return toStr(obj) === "[object Date]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isRegExp2(obj) { + return toStr(obj) === "[object RegExp]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isError2(obj) { + return toStr(obj) === "[object Error]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isString2(obj) { + return toStr(obj) === "[object String]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isNumber(obj) { + return toStr(obj) === "[object Number]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isBoolean(obj) { + return toStr(obj) === "[object Boolean]" && (!toStringTag || !(typeof obj === "object" && toStringTag in obj)); + } + function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === "object" && obj instanceof Symbol; + } + if (typeof obj === "symbol") { + return true; + } + if (!obj || typeof obj !== "object" || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) { + } + return false; + } + function isBigInt(obj) { + if (!obj || typeof obj !== "object" || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) { + } + return false; + } + var hasOwn2 = Object.prototype.hasOwnProperty || function(key2) { + return key2 in this; + }; + function has(obj, key2) { + return hasOwn2.call(obj, key2); + } + function toStr(obj) { + return objectToString.call(obj); + } + function nameOf(f) { + if (f.name) { + return f.name; + } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { + return m[1]; + } + return null; + } + function indexOf(xs, x) { + if (xs.indexOf) { + return xs.indexOf(x); + } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { + return i; + } + } + return -1; + } + function isMap2(x) { + if (!mapSize || !x || typeof x !== "object") { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; + } catch (e) { + } + return false; + } + function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== "object") { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; + } catch (e) { + } + return false; + } + function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== "object") { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) { + } + return false; + } + function isSet(x) { + if (!setSize || !x || typeof x !== "object") { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; + } catch (e) { + } + return false; + } + function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== "object") { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; + } catch (e) { + } + return false; + } + function isElement(x) { + if (!x || typeof x !== "object") { + return false; + } + if (typeof HTMLElement !== "undefined" && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === "string" && typeof x.getAttribute === "function"; + } + function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = "... " + remaining + " more character" + (remaining > 1 ? "s" : ""); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + var quoteRE = quoteREs[opts.quoteStyle || "single"]; + quoteRE.lastIndex = 0; + var s = $replace.call($replace.call(str, quoteRE, "\\$1"), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, "single", opts); + } + function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: "b", + 9: "t", + 10: "n", + 12: "f", + 13: "r" + }[n]; + if (x) { + return "\\" + x; + } + return "\\x" + (n < 16 ? "0" : "") + $toUpperCase.call(n.toString(16)); + } + function markBoxed(str) { + return "Object(" + str + ")"; + } + function weakCollectionOf(type2) { + return type2 + " { ? }"; + } + function collectionOf(type2, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ", "); + return type2 + " (" + size + ") {" + joinedEntries + "}"; + } + function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], "\n") >= 0) { + return false; + } + } + return true; + } + function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === " ") { + baseIndent = " "; + } else if (typeof opts.indent === "number" && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), " "); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; + } + function indentedJoin(xs, indent) { + if (xs.length === 0) { + return ""; + } + var lineJoiner = "\n" + indent.prev + indent.base; + return lineJoiner + $join.call(xs, "," + lineJoiner) + "\n" + indent.prev; + } + function arrObjKeys(obj, inspect) { + var isArr = isArray2(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has(obj, i) ? inspect(obj[i], obj) : ""; + } + } + var syms = typeof gOPS === "function" ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap["$" + syms[k]] = syms[k]; + } + } + for (var key2 in obj) { + if (!has(obj, key2)) { + continue; + } + if (isArr && String(Number(key2)) === key2 && key2 < obj.length) { + continue; + } + if (hasShammedSymbols && symMap["$" + key2] instanceof Symbol) { + continue; + } else if ($test.call(/[^\w$]/, key2)) { + xs.push(inspect(key2, obj) + ": " + inspect(obj[key2], obj)); + } else { + xs.push(key2 + ": " + inspect(obj[key2], obj)); + } + } + if (typeof gOPS === "function") { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push("[" + inspect(syms[j]) + "]: " + inspect(obj[syms[j]], obj)); + } + } + } + return xs; + } + return objectInspect; +} +var sideChannelList; +var hasRequiredSideChannelList; +function requireSideChannelList() { + if (hasRequiredSideChannelList) return sideChannelList; + hasRequiredSideChannelList = 1; + var inspect = /* @__PURE__ */ requireObjectInspect(); + var $TypeError = /* @__PURE__ */ requireType(); + var listGetNode = function(list, key2, isDelete) { + var prev = list; + var curr; + for (; (curr = prev.next) != null; prev = curr) { + if (curr.key === key2) { + prev.next = curr.next; + if (!isDelete) { + curr.next = /** @type {NonNullable} */ + list.next; + list.next = curr; + } + return curr; + } + } + }; + var listGet = function(objects, key2) { + if (!objects) { + return void 0; + } + var node2 = listGetNode(objects, key2); + return node2 && node2.value; + }; + var listSet = function(objects, key2, value) { + var node2 = listGetNode(objects, key2); + if (node2) { + node2.value = value; + } else { + objects.next = /** @type {import('./list.d.ts').ListNode} */ + { + // eslint-disable-line no-param-reassign, no-extra-parens + key: key2, + next: objects.next, + value + }; + } + }; + var listHas = function(objects, key2) { + if (!objects) { + return false; + } + return !!listGetNode(objects, key2); + }; + var listDelete = function(objects, key2) { + if (objects) { + return listGetNode(objects, key2, true); + } + }; + sideChannelList = function getSideChannelList() { + var $o; + var channel = { + assert: function(key2) { + if (!channel.has(key2)) { + throw new $TypeError("Side channel does not contain " + inspect(key2)); + } + }, + "delete": function(key2) { + var root = $o && $o.next; + var deletedNode = listDelete($o, key2); + if (deletedNode && root && root === deletedNode) { + $o = void 0; + } + return !!deletedNode; + }, + get: function(key2) { + return listGet($o, key2); + }, + has: function(key2) { + return listHas($o, key2); + }, + set: function(key2, value) { + if (!$o) { + $o = { + next: void 0 + }; + } + listSet( + /** @type {NonNullable} */ + $o, + key2, + value + ); + } + }; + return channel; + }; + return sideChannelList; +} +var sideChannelMap; +var hasRequiredSideChannelMap; +function requireSideChannelMap() { + if (hasRequiredSideChannelMap) return sideChannelMap; + hasRequiredSideChannelMap = 1; + var GetIntrinsic = /* @__PURE__ */ requireGetIntrinsic(); + var callBound2 = /* @__PURE__ */ requireCallBound(); + var inspect = /* @__PURE__ */ requireObjectInspect(); + var $TypeError = /* @__PURE__ */ requireType(); + var $Map = GetIntrinsic("%Map%", true); + var $mapGet = callBound2("Map.prototype.get", true); + var $mapSet = callBound2("Map.prototype.set", true); + var $mapHas = callBound2("Map.prototype.has", true); + var $mapDelete = callBound2("Map.prototype.delete", true); + var $mapSize = callBound2("Map.prototype.size", true); + sideChannelMap = !!$Map && /** @type {Exclude} */ + function getSideChannelMap() { + var $m; + var channel = { + assert: function(key2) { + if (!channel.has(key2)) { + throw new $TypeError("Side channel does not contain " + inspect(key2)); + } + }, + "delete": function(key2) { + if ($m) { + var result = $mapDelete($m, key2); + if ($mapSize($m) === 0) { + $m = void 0; + } + return result; + } + return false; + }, + get: function(key2) { + if ($m) { + return $mapGet($m, key2); + } + }, + has: function(key2) { + if ($m) { + return $mapHas($m, key2); + } + return false; + }, + set: function(key2, value) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key2, value); + } + }; + return channel; + }; + return sideChannelMap; +} +var sideChannelWeakmap; +var hasRequiredSideChannelWeakmap; +function requireSideChannelWeakmap() { + if (hasRequiredSideChannelWeakmap) return sideChannelWeakmap; + hasRequiredSideChannelWeakmap = 1; + var GetIntrinsic = /* @__PURE__ */ requireGetIntrinsic(); + var callBound2 = /* @__PURE__ */ requireCallBound(); + var inspect = /* @__PURE__ */ requireObjectInspect(); + var getSideChannelMap = requireSideChannelMap(); + var $TypeError = /* @__PURE__ */ requireType(); + var $WeakMap = GetIntrinsic("%WeakMap%", true); + var $weakMapGet = callBound2("WeakMap.prototype.get", true); + var $weakMapSet = callBound2("WeakMap.prototype.set", true); + var $weakMapHas = callBound2("WeakMap.prototype.has", true); + var $weakMapDelete = callBound2("WeakMap.prototype.delete", true); + sideChannelWeakmap = $WeakMap ? ( + /** @type {Exclude} */ + function getSideChannelWeakMap() { + var $wm; + var $m; + var channel = { + assert: function(key2) { + if (!channel.has(key2)) { + throw new $TypeError("Side channel does not contain " + inspect(key2)); + } + }, + "delete": function(key2) { + if ($WeakMap && key2 && (typeof key2 === "object" || typeof key2 === "function")) { + if ($wm) { + return $weakMapDelete($wm, key2); + } + } else if (getSideChannelMap) { + if ($m) { + return $m["delete"](key2); + } + } + return false; + }, + get: function(key2) { + if ($WeakMap && key2 && (typeof key2 === "object" || typeof key2 === "function")) { + if ($wm) { + return $weakMapGet($wm, key2); + } + } + return $m && $m.get(key2); + }, + has: function(key2) { + if ($WeakMap && key2 && (typeof key2 === "object" || typeof key2 === "function")) { + if ($wm) { + return $weakMapHas($wm, key2); + } + } + return !!$m && $m.has(key2); + }, + set: function(key2, value) { + if ($WeakMap && key2 && (typeof key2 === "object" || typeof key2 === "function")) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key2, value); + } else if (getSideChannelMap) { + if (!$m) { + $m = getSideChannelMap(); + } + $m.set(key2, value); + } + } + }; + return channel; + } + ) : getSideChannelMap; + return sideChannelWeakmap; +} +var sideChannel; +var hasRequiredSideChannel; +function requireSideChannel() { + if (hasRequiredSideChannel) return sideChannel; + hasRequiredSideChannel = 1; + var $TypeError = /* @__PURE__ */ requireType(); + var inspect = /* @__PURE__ */ requireObjectInspect(); + var getSideChannelList = requireSideChannelList(); + var getSideChannelMap = requireSideChannelMap(); + var getSideChannelWeakMap = requireSideChannelWeakmap(); + var makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList; + sideChannel = function getSideChannel() { + var $channelData; + var channel = { + assert: function(key2) { + if (!channel.has(key2)) { + throw new $TypeError("Side channel does not contain " + inspect(key2)); + } + }, + "delete": function(key2) { + return !!$channelData && $channelData["delete"](key2); + }, + get: function(key2) { + return $channelData && $channelData.get(key2); + }, + has: function(key2) { + return !!$channelData && $channelData.has(key2); + }, + set: function(key2, value) { + if (!$channelData) { + $channelData = makeChannel(); + } + $channelData.set(key2, value); + } + }; + return channel; + }; + return sideChannel; +} +var formats; +var hasRequiredFormats; +function requireFormats() { + if (hasRequiredFormats) return formats; + hasRequiredFormats = 1; + var replace = String.prototype.replace; + var percentTwenties = /%20/g; + var Format = { + RFC1738: "RFC1738", + RFC3986: "RFC3986" + }; + formats = { + "default": Format.RFC3986, + formatters: { + RFC1738: function(value) { + return replace.call(value, percentTwenties, "+"); + }, + RFC3986: function(value) { + return String(value); + } + }, + RFC1738: Format.RFC1738, + RFC3986: Format.RFC3986 + }; + return formats; +} +var utils$5; +var hasRequiredUtils$5; +function requireUtils$5() { + if (hasRequiredUtils$5) return utils$5; + hasRequiredUtils$5 = 1; + var formats2 = requireFormats(); + var has = Object.prototype.hasOwnProperty; + var isArray2 = Array.isArray; + var hexTable = function() { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push("%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase()); + } + return array; + }(); + var compactQueue = function compactQueue2(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + if (isArray2(obj)) { + var compacted = []; + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== "undefined") { + compacted.push(obj[j]); + } + } + item.obj[item.prop] = compacted; + } + } + }; + var arrayToObject = function arrayToObject2(source2, options2) { + var obj = options2 && options2.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; + for (var i = 0; i < source2.length; ++i) { + if (typeof source2[i] !== "undefined") { + obj[i] = source2[i]; + } + } + return obj; + }; + var merge2 = function merge3(target, source2, options2) { + if (!source2) { + return target; + } + if (typeof source2 !== "object") { + if (isArray2(target)) { + target.push(source2); + } else if (target && typeof target === "object") { + if (options2 && (options2.plainObjects || options2.allowPrototypes) || !has.call(Object.prototype, source2)) { + target[source2] = true; + } + } else { + return [target, source2]; + } + return target; + } + if (!target || typeof target !== "object") { + return [target].concat(source2); + } + var mergeTarget = target; + if (isArray2(target) && !isArray2(source2)) { + mergeTarget = arrayToObject(target, options2); + } + if (isArray2(target) && isArray2(source2)) { + source2.forEach(function(item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === "object" && item && typeof item === "object") { + target[i] = merge3(targetItem, item, options2); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + return Object.keys(source2).reduce(function(acc, key2) { + var value = source2[key2]; + if (has.call(acc, key2)) { + acc[key2] = merge3(acc[key2], value, options2); + } else { + acc[key2] = value; + } + return acc; + }, mergeTarget); + }; + var assign = function assignSingleSource(target, source2) { + return Object.keys(source2).reduce(function(acc, key2) { + acc[key2] = source2[key2]; + return acc; + }, target); + }; + var decode = function(str, decoder2, charset) { + var strWithoutPlus = str.replace(/\+/g, " "); + if (charset === "iso-8859-1") { + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } + }; + var encode = function encode2(str, defaultEncoder, charset, kind, format) { + if (str.length === 0) { + return str; + } + var string2 = str; + if (typeof str === "symbol") { + string2 = Symbol.prototype.toString.call(str); + } else if (typeof str !== "string") { + string2 = String(str); + } + if (charset === "iso-8859-1") { + return escape(string2).replace(/%u[0-9a-f]{4}/gi, function($0) { + return "%26%23" + parseInt($0.slice(2), 16) + "%3B"; + }); + } + var out = ""; + for (var i = 0; i < string2.length; ++i) { + var c = string2.charCodeAt(i); + if (c === 45 || c === 46 || c === 95 || c === 126 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 || format === formats2.RFC1738 && (c === 40 || c === 41)) { + out += string2.charAt(i); + continue; + } + if (c < 128) { + out = out + hexTable[c]; + continue; + } + if (c < 2048) { + out = out + (hexTable[192 | c >> 6] + hexTable[128 | c & 63]); + continue; + } + if (c < 55296 || c >= 57344) { + out = out + (hexTable[224 | c >> 12] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63]); + continue; + } + i += 1; + c = 65536 + ((c & 1023) << 10 | string2.charCodeAt(i) & 1023); + out += hexTable[240 | c >> 18] + hexTable[128 | c >> 12 & 63] + hexTable[128 | c >> 6 & 63] + hexTable[128 | c & 63]; + } + return out; + }; + var compact = function compact2(value) { + var queue = [{ obj: { o: value }, prop: "o" }]; + var refs = []; + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key2 = keys[j]; + var val = obj[key2]; + if (typeof val === "object" && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj, prop: key2 }); + refs.push(val); + } + } + } + compactQueue(queue); + return value; + }; + var isRegExp2 = function isRegExp3(obj) { + return Object.prototype.toString.call(obj) === "[object RegExp]"; + }; + var isBuffer = function isBuffer2(obj) { + if (!obj || typeof obj !== "object") { + return false; + } + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); + }; + var combine = function combine2(a, b) { + return [].concat(a, b); + }; + var maybeMap = function maybeMap2(val, fn) { + if (isArray2(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); + }; + utils$5 = { + arrayToObject, + assign, + combine, + compact, + decode, + encode, + isBuffer, + isRegExp: isRegExp2, + maybeMap, + merge: merge2 + }; + return utils$5; +} +var stringify_1; +var hasRequiredStringify; +function requireStringify() { + if (hasRequiredStringify) return stringify_1; + hasRequiredStringify = 1; + var getSideChannel = requireSideChannel(); + var utils2 = requireUtils$5(); + var formats2 = requireFormats(); + var has = Object.prototype.hasOwnProperty; + var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + "[]"; + }, + comma: "comma", + indices: function indices(prefix, key2) { + return prefix + "[" + key2 + "]"; + }, + repeat: function repeat(prefix) { + return prefix; + } + }; + var isArray2 = Array.isArray; + var push = Array.prototype.push; + var pushToArray = function(arr, valueOrArray) { + push.apply(arr, isArray2(valueOrArray) ? valueOrArray : [valueOrArray]); + }; + var toISO = Date.prototype.toISOString; + var defaultFormat = formats2["default"]; + var defaults = { + addQueryPrefix: false, + allowDots: false, + charset: "utf-8", + charsetSentinel: false, + delimiter: "&", + encode: true, + encoder: utils2.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats2.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false + }; + var isNonNullishPrimitive = function isNonNullishPrimitive2(v) { + return typeof v === "string" || typeof v === "number" || typeof v === "boolean" || typeof v === "symbol" || typeof v === "bigint"; + }; + var sentinel = {}; + var stringify2 = function stringify3(object, prefix, generateArrayPrefix, commaRoundTrip, strictNullHandling, skipNulls, encoder2, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, sideChannel2) { + var obj = object; + var tmpSc = sideChannel2; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void 0 && !findFlag) { + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== "undefined") { + if (pos === step) { + throw new RangeError("Cyclic object value"); + } else { + findFlag = true; + } + } + if (typeof tmpSc.get(sentinel) === "undefined") { + step = 0; + } + } + if (typeof filter === "function") { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === "comma" && isArray2(obj)) { + obj = utils2.maybeMap(obj, function(value2) { + if (value2 instanceof Date) { + return serializeDate(value2); + } + return value2; + }); + } + if (obj === null) { + if (strictNullHandling) { + return encoder2 && !encodeValuesOnly ? encoder2(prefix, defaults.encoder, charset, "key", format) : prefix; + } + obj = ""; + } + if (isNonNullishPrimitive(obj) || utils2.isBuffer(obj)) { + if (encoder2) { + var keyValue = encodeValuesOnly ? prefix : encoder2(prefix, defaults.encoder, charset, "key", format); + return [formatter(keyValue) + "=" + formatter(encoder2(obj, defaults.encoder, charset, "value", format))]; + } + return [formatter(prefix) + "=" + formatter(String(obj))]; + } + var values = []; + if (typeof obj === "undefined") { + return values; + } + var objKeys; + if (generateArrayPrefix === "comma" && isArray2(obj)) { + if (encodeValuesOnly && encoder2) { + obj = utils2.maybeMap(obj, encoder2); + } + objKeys = [{ value: obj.length > 0 ? obj.join(",") || null : void 0 }]; + } else if (isArray2(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + var adjustedPrefix = commaRoundTrip && isArray2(obj) && obj.length === 1 ? prefix + "[]" : prefix; + for (var j = 0; j < objKeys.length; ++j) { + var key2 = objKeys[j]; + var value = typeof key2 === "object" && typeof key2.value !== "undefined" ? key2.value : obj[key2]; + if (skipNulls && value === null) { + continue; + } + var keyPrefix = isArray2(obj) ? typeof generateArrayPrefix === "function" ? generateArrayPrefix(adjustedPrefix, key2) : adjustedPrefix : adjustedPrefix + (allowDots ? "." + key2 : "[" + key2 + "]"); + sideChannel2.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel2); + pushToArray(values, stringify3( + value, + keyPrefix, + generateArrayPrefix, + commaRoundTrip, + strictNullHandling, + skipNulls, + generateArrayPrefix === "comma" && encodeValuesOnly && isArray2(obj) ? null : encoder2, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + valueSideChannel + )); + } + return values; + }; + var normalizeStringifyOptions = function normalizeStringifyOptions2(opts) { + if (!opts) { + return defaults; + } + if (opts.encoder !== null && typeof opts.encoder !== "undefined" && typeof opts.encoder !== "function") { + throw new TypeError("Encoder has to be a function."); + } + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== "undefined" && opts.charset !== "utf-8" && opts.charset !== "iso-8859-1") { + throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined"); + } + var format = formats2["default"]; + if (typeof opts.format !== "undefined") { + if (!has.call(formats2.formatters, opts.format)) { + throw new TypeError("Unknown format option provided."); + } + format = opts.format; + } + var formatter = formats2.formatters[format]; + var filter = defaults.filter; + if (typeof opts.filter === "function" || isArray2(opts.filter)) { + filter = opts.filter; + } + return { + addQueryPrefix: typeof opts.addQueryPrefix === "boolean" ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: typeof opts.allowDots === "undefined" ? defaults.allowDots : !!opts.allowDots, + charset, + charsetSentinel: typeof opts.charsetSentinel === "boolean" ? opts.charsetSentinel : defaults.charsetSentinel, + delimiter: typeof opts.delimiter === "undefined" ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === "boolean" ? opts.encode : defaults.encode, + encoder: typeof opts.encoder === "function" ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === "boolean" ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter, + format, + formatter, + serializeDate: typeof opts.serializeDate === "function" ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === "boolean" ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === "function" ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === "boolean" ? opts.strictNullHandling : defaults.strictNullHandling + }; + }; + stringify_1 = function(object, opts) { + var obj = object; + var options2 = normalizeStringifyOptions(opts); + var objKeys; + var filter; + if (typeof options2.filter === "function") { + filter = options2.filter; + obj = filter("", obj); + } else if (isArray2(options2.filter)) { + filter = options2.filter; + objKeys = filter; + } + var keys = []; + if (typeof obj !== "object" || obj === null) { + return ""; + } + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && "indices" in opts) { + arrayFormat = opts.indices ? "indices" : "repeat"; + } else { + arrayFormat = "indices"; + } + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + if (opts && "commaRoundTrip" in opts && typeof opts.commaRoundTrip !== "boolean") { + throw new TypeError("`commaRoundTrip` must be a boolean, or absent"); + } + var commaRoundTrip = generateArrayPrefix === "comma" && opts && opts.commaRoundTrip; + if (!objKeys) { + objKeys = Object.keys(obj); + } + if (options2.sort) { + objKeys.sort(options2.sort); + } + var sideChannel2 = getSideChannel(); + for (var i = 0; i < objKeys.length; ++i) { + var key2 = objKeys[i]; + if (options2.skipNulls && obj[key2] === null) { + continue; + } + pushToArray(keys, stringify2( + obj[key2], + key2, + generateArrayPrefix, + commaRoundTrip, + options2.strictNullHandling, + options2.skipNulls, + options2.encode ? options2.encoder : null, + options2.filter, + options2.sort, + options2.allowDots, + options2.serializeDate, + options2.format, + options2.formatter, + options2.encodeValuesOnly, + options2.charset, + sideChannel2 + )); + } + var joined = keys.join(options2.delimiter); + var prefix = options2.addQueryPrefix === true ? "?" : ""; + if (options2.charsetSentinel) { + if (options2.charset === "iso-8859-1") { + prefix += "utf8=%26%2310003%3B&"; + } else { + prefix += "utf8=%E2%9C%93&"; + } + } + return joined.length > 0 ? prefix + joined : ""; + }; + return stringify_1; +} +var parse$3; +var hasRequiredParse; +function requireParse() { + if (hasRequiredParse) return parse$3; + hasRequiredParse = 1; + var utils2 = requireUtils$5(); + var has = Object.prototype.hasOwnProperty; + var isArray2 = Array.isArray; + var defaults = { + allowDots: false, + allowPrototypes: false, + allowSparse: false, + arrayLimit: 20, + charset: "utf-8", + charsetSentinel: false, + comma: false, + decoder: utils2.decode, + delimiter: "&", + depth: 5, + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1e3, + parseArrays: true, + plainObjects: false, + strictNullHandling: false + }; + var interpretNumericEntities = function(str) { + return str.replace(/&#(\d+);/g, function($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); + }; + var parseArrayValue = function(val, options2) { + if (val && typeof val === "string" && options2.comma && val.indexOf(",") > -1) { + return val.split(","); + } + return val; + }; + var isoSentinel = "utf8=%26%2310003%3B"; + var charsetSentinel = "utf8=%E2%9C%93"; + var parseValues = function parseQueryStringValues(str, options2) { + var obj = { __proto__: null }; + var cleanStr = options2.ignoreQueryPrefix ? str.replace(/^\?/, "") : str; + var limit = options2.parameterLimit === Infinity ? void 0 : options2.parameterLimit; + var parts = cleanStr.split(options2.delimiter, limit); + var skipIndex = -1; + var i; + var charset = options2.charset; + if (options2.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf("utf8=") === 0) { + if (parts[i] === charsetSentinel) { + charset = "utf-8"; + } else if (parts[i] === isoSentinel) { + charset = "iso-8859-1"; + } + skipIndex = i; + i = parts.length; + } + } + } + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + var bracketEqualsPos = part.indexOf("]="); + var pos = bracketEqualsPos === -1 ? part.indexOf("=") : bracketEqualsPos + 1; + var key2, val; + if (pos === -1) { + key2 = options2.decoder(part, defaults.decoder, charset, "key"); + val = options2.strictNullHandling ? null : ""; + } else { + key2 = options2.decoder(part.slice(0, pos), defaults.decoder, charset, "key"); + val = utils2.maybeMap( + parseArrayValue(part.slice(pos + 1), options2), + function(encodedVal) { + return options2.decoder(encodedVal, defaults.decoder, charset, "value"); + } + ); + } + if (val && options2.interpretNumericEntities && charset === "iso-8859-1") { + val = interpretNumericEntities(val); + } + if (part.indexOf("[]=") > -1) { + val = isArray2(val) ? [val] : val; + } + if (has.call(obj, key2)) { + obj[key2] = utils2.combine(obj[key2], val); + } else { + obj[key2] = val; + } + } + return obj; + }; + var parseObject = function(chain, val, options2, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options2); + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + if (root === "[]" && options2.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options2.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; + var cleanRoot = root.charAt(0) === "[" && root.charAt(root.length - 1) === "]" ? root.slice(1, -1) : root; + var index2 = parseInt(cleanRoot, 10); + if (!options2.parseArrays && cleanRoot === "") { + obj = { 0: leaf }; + } else if (!isNaN(index2) && root !== cleanRoot && String(index2) === cleanRoot && index2 >= 0 && (options2.parseArrays && index2 <= options2.arrayLimit)) { + obj = []; + obj[index2] = leaf; + } else if (cleanRoot !== "__proto__") { + obj[cleanRoot] = leaf; + } + } + leaf = obj; + } + return leaf; + }; + var parseKeys = function parseQueryStringKeys(givenKey, val, options2, valuesParsed) { + if (!givenKey) { + return; + } + var key2 = options2.allowDots ? givenKey.replace(/\.([^.[]+)/g, "[$1]") : givenKey; + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + var segment = options2.depth > 0 && brackets.exec(key2); + var parent = segment ? key2.slice(0, segment.index) : key2; + var keys = []; + if (parent) { + if (!options2.plainObjects && has.call(Object.prototype, parent)) { + if (!options2.allowPrototypes) { + return; + } + } + keys.push(parent); + } + var i = 0; + while (options2.depth > 0 && (segment = child.exec(key2)) !== null && i < options2.depth) { + i += 1; + if (!options2.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options2.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + if (segment) { + keys.push("[" + key2.slice(segment.index) + "]"); + } + return parseObject(keys, val, options2, valuesParsed); + }; + var normalizeParseOptions = function normalizeParseOptions2(opts) { + if (!opts) { + return defaults; + } + if (opts.decoder !== null && opts.decoder !== void 0 && typeof opts.decoder !== "function") { + throw new TypeError("Decoder has to be a function."); + } + if (typeof opts.charset !== "undefined" && opts.charset !== "utf-8" && opts.charset !== "iso-8859-1") { + throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined"); + } + var charset = typeof opts.charset === "undefined" ? defaults.charset : opts.charset; + return { + allowDots: typeof opts.allowDots === "undefined" ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === "boolean" ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === "boolean" ? opts.allowSparse : defaults.allowSparse, + arrayLimit: typeof opts.arrayLimit === "number" ? opts.arrayLimit : defaults.arrayLimit, + charset, + charsetSentinel: typeof opts.charsetSentinel === "boolean" ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === "boolean" ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === "function" ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === "string" || utils2.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: typeof opts.depth === "number" || opts.depth === false ? +opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === "boolean" ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === "number" ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === "boolean" ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === "boolean" ? opts.strictNullHandling : defaults.strictNullHandling + }; + }; + parse$3 = function(str, opts) { + var options2 = normalizeParseOptions(opts); + if (str === "" || str === null || typeof str === "undefined") { + return options2.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; + } + var tempObj = typeof str === "string" ? parseValues(str, options2) : str; + var obj = options2.plainObjects ? /* @__PURE__ */ Object.create(null) : {}; + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key2 = keys[i]; + var newObj = parseKeys(key2, tempObj[key2], options2, typeof str === "string"); + obj = utils2.merge(obj, newObj, options2); + } + if (options2.allowSparse === true) { + return obj; + } + return utils2.compact(obj); + }; + return parse$3; +} +var lib$1; +var hasRequiredLib$2; +function requireLib$2() { + if (hasRequiredLib$2) return lib$1; + hasRequiredLib$2 = 1; + var stringify2 = requireStringify(); + var parse4 = requireParse(); + var formats2 = requireFormats(); + lib$1 = { + formats: formats2, + parse: parse4, + stringify: stringify2 + }; + return lib$1; +} +var hasRequiredUrl; +function requireUrl() { + if (hasRequiredUrl) return url$2; + hasRequiredUrl = 1; + var punycode2 = requirePunycode(); + function Url() { + this.protocol = null; + this.slashes = null; + this.auth = null; + this.host = null; + this.port = null; + this.hostname = null; + this.hash = null; + this.search = null; + this.query = null; + this.pathname = null; + this.path = null; + this.href = null; + } + var protocolPattern = /^([a-z0-9.+-]+:)/i, portPattern = /:[0-9]*$/, simplePathPattern = /^(\/\/?(?!\/)[^?\s]*)(\?[^\s]*)?$/, delims = [ + "<", + ">", + '"', + "`", + " ", + "\r", + "\n", + " " + ], unwise = [ + "{", + "}", + "|", + "\\", + "^", + "`" + ].concat(delims), autoEscape = ["'"].concat(unwise), nonHostChars = [ + "%", + "/", + "?", + ";", + "#" + ].concat(autoEscape), hostEndingChars = [ + "/", + "?", + "#" + ], hostnameMaxLen = 255, hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, unsafeProtocol = { + javascript: true, + "javascript:": true + }, hostlessProtocol = { + javascript: true, + "javascript:": true + }, slashedProtocol = { + http: true, + https: true, + ftp: true, + gopher: true, + file: true, + "http:": true, + "https:": true, + "ftp:": true, + "gopher:": true, + "file:": true + }, querystring = requireLib$2(); + function urlParse(url2, parseQueryString, slashesDenoteHost) { + if (url2 && typeof url2 === "object" && url2 instanceof Url) { + return url2; + } + var u = new Url(); + u.parse(url2, parseQueryString, slashesDenoteHost); + return u; + } + Url.prototype.parse = function(url2, parseQueryString, slashesDenoteHost) { + if (typeof url2 !== "string") { + throw new TypeError("Parameter 'url' must be a string, not " + typeof url2); + } + var queryIndex = url2.indexOf("?"), splitter = queryIndex !== -1 && queryIndex < url2.indexOf("#") ? "?" : "#", uSplit = url2.split(splitter), slashRegex = /\\/g; + uSplit[0] = uSplit[0].replace(slashRegex, "/"); + url2 = uSplit.join(splitter); + var rest = url2; + rest = rest.trim(); + if (!slashesDenoteHost && url2.split("#").length === 1) { + var simplePath = simplePathPattern.exec(rest); + if (simplePath) { + this.path = rest; + this.href = rest; + this.pathname = simplePath[1]; + if (simplePath[2]) { + this.search = simplePath[2]; + if (parseQueryString) { + this.query = querystring.parse(this.search.substr(1)); + } else { + this.query = this.search.substr(1); + } + } else if (parseQueryString) { + this.search = ""; + this.query = {}; + } + return this; + } + } + var proto = protocolPattern.exec(rest); + if (proto) { + proto = proto[0]; + var lowerProto = proto.toLowerCase(); + this.protocol = lowerProto; + rest = rest.substr(proto.length); + } + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@/]+@[^@/]+/)) { + var slashes = rest.substr(0, 2) === "//"; + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + this.slashes = true; + } + } + if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) { + var hostEnd = -1; + for (var i = 0; i < hostEndingChars.length; i++) { + var hec = rest.indexOf(hostEndingChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { + hostEnd = hec; + } + } + var auth, atSign; + if (hostEnd === -1) { + atSign = rest.lastIndexOf("@"); + } else { + atSign = rest.lastIndexOf("@", hostEnd); + } + if (atSign !== -1) { + auth = rest.slice(0, atSign); + rest = rest.slice(atSign + 1); + this.auth = decodeURIComponent(auth); + } + hostEnd = -1; + for (var i = 0; i < nonHostChars.length; i++) { + var hec = rest.indexOf(nonHostChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { + hostEnd = hec; + } + } + if (hostEnd === -1) { + hostEnd = rest.length; + } + this.host = rest.slice(0, hostEnd); + rest = rest.slice(hostEnd); + this.parseHost(); + this.hostname = this.hostname || ""; + var ipv6Hostname = this.hostname[0] === "[" && this.hostname[this.hostname.length - 1] === "]"; + if (!ipv6Hostname) { + var hostparts = this.hostname.split(/\./); + for (var i = 0, l = hostparts.length; i < l; i++) { + var part = hostparts[i]; + if (!part) { + continue; + } + if (!part.match(hostnamePartPattern)) { + var newpart = ""; + for (var j = 0, k = part.length; j < k; j++) { + if (part.charCodeAt(j) > 127) { + newpart += "x"; + } else { + newpart += part[j]; + } + } + if (!newpart.match(hostnamePartPattern)) { + var validParts = hostparts.slice(0, i); + var notHost = hostparts.slice(i + 1); + var bit = part.match(hostnamePartStart); + if (bit) { + validParts.push(bit[1]); + notHost.unshift(bit[2]); + } + if (notHost.length) { + rest = "/" + notHost.join(".") + rest; + } + this.hostname = validParts.join("."); + break; + } + } + } + } + if (this.hostname.length > hostnameMaxLen) { + this.hostname = ""; + } else { + this.hostname = this.hostname.toLowerCase(); + } + if (!ipv6Hostname) { + this.hostname = punycode2.toASCII(this.hostname); + } + var p = this.port ? ":" + this.port : ""; + var h = this.hostname || ""; + this.host = h + p; + this.href += this.host; + if (ipv6Hostname) { + this.hostname = this.hostname.substr(1, this.hostname.length - 2); + if (rest[0] !== "/") { + rest = "/" + rest; + } + } + } + if (!unsafeProtocol[lowerProto]) { + for (var i = 0, l = autoEscape.length; i < l; i++) { + var ae = autoEscape[i]; + if (rest.indexOf(ae) === -1) { + continue; + } + var esc = encodeURIComponent(ae); + if (esc === ae) { + esc = escape(ae); + } + rest = rest.split(ae).join(esc); + } + } + var hash2 = rest.indexOf("#"); + if (hash2 !== -1) { + this.hash = rest.substr(hash2); + rest = rest.slice(0, hash2); + } + var qm = rest.indexOf("?"); + if (qm !== -1) { + this.search = rest.substr(qm); + this.query = rest.substr(qm + 1); + if (parseQueryString) { + this.query = querystring.parse(this.query); + } + rest = rest.slice(0, qm); + } else if (parseQueryString) { + this.search = ""; + this.query = {}; + } + if (rest) { + this.pathname = rest; + } + if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { + this.pathname = "/"; + } + if (this.pathname || this.search) { + var p = this.pathname || ""; + var s = this.search || ""; + this.path = p + s; + } + this.href = this.format(); + return this; + }; + function urlFormat(obj) { + if (typeof obj === "string") { + obj = urlParse(obj); + } + if (!(obj instanceof Url)) { + return Url.prototype.format.call(obj); + } + return obj.format(); + } + Url.prototype.format = function() { + var auth = this.auth || ""; + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ":"); + auth += "@"; + } + var protocol = this.protocol || "", pathname = this.pathname || "", hash2 = this.hash || "", host = false, query = ""; + if (this.host) { + host = auth + this.host; + } else if (this.hostname) { + host = auth + (this.hostname.indexOf(":") === -1 ? this.hostname : "[" + this.hostname + "]"); + if (this.port) { + host += ":" + this.port; + } + } + if (this.query && typeof this.query === "object" && Object.keys(this.query).length) { + query = querystring.stringify(this.query, { + arrayFormat: "repeat", + addQueryPrefix: false + }); + } + var search = this.search || query && "?" + query || ""; + if (protocol && protocol.substr(-1) !== ":") { + protocol += ":"; + } + if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) { + host = "//" + (host || ""); + if (pathname && pathname.charAt(0) !== "/") { + pathname = "/" + pathname; + } + } else if (!host) { + host = ""; + } + if (hash2 && hash2.charAt(0) !== "#") { + hash2 = "#" + hash2; + } + if (search && search.charAt(0) !== "?") { + search = "?" + search; + } + pathname = pathname.replace(/[?#]/g, function(match) { + return encodeURIComponent(match); + }); + search = search.replace("#", "%23"); + return protocol + host + pathname + search + hash2; + }; + function urlResolve(source2, relative) { + return urlParse(source2, false, true).resolve(relative); + } + Url.prototype.resolve = function(relative) { + return this.resolveObject(urlParse(relative, false, true)).format(); + }; + function urlResolveObject(source2, relative) { + if (!source2) { + return relative; + } + return urlParse(source2, false, true).resolveObject(relative); + } + Url.prototype.resolveObject = function(relative) { + if (typeof relative === "string") { + var rel = new Url(); + rel.parse(relative, false, true); + relative = rel; + } + var result = new Url(); + var tkeys = Object.keys(this); + for (var tk = 0; tk < tkeys.length; tk++) { + var tkey = tkeys[tk]; + result[tkey] = this[tkey]; + } + result.hash = relative.hash; + if (relative.href === "") { + result.href = result.format(); + return result; + } + if (relative.slashes && !relative.protocol) { + var rkeys = Object.keys(relative); + for (var rk = 0; rk < rkeys.length; rk++) { + var rkey = rkeys[rk]; + if (rkey !== "protocol") { + result[rkey] = relative[rkey]; + } + } + if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) { + result.pathname = "/"; + result.path = result.pathname; + } + result.href = result.format(); + return result; + } + if (relative.protocol && relative.protocol !== result.protocol) { + if (!slashedProtocol[relative.protocol]) { + var keys = Object.keys(relative); + for (var v = 0; v < keys.length; v++) { + var k = keys[v]; + result[k] = relative[k]; + } + result.href = result.format(); + return result; + } + result.protocol = relative.protocol; + if (!relative.host && !hostlessProtocol[relative.protocol]) { + var relPath = (relative.pathname || "").split("/"); + while (relPath.length && !(relative.host = relPath.shift())) { + } + if (!relative.host) { + relative.host = ""; + } + if (!relative.hostname) { + relative.hostname = ""; + } + if (relPath[0] !== "") { + relPath.unshift(""); + } + if (relPath.length < 2) { + relPath.unshift(""); + } + result.pathname = relPath.join("/"); + } else { + result.pathname = relative.pathname; + } + result.search = relative.search; + result.query = relative.query; + result.host = relative.host || ""; + result.auth = relative.auth; + result.hostname = relative.hostname || relative.host; + result.port = relative.port; + if (result.pathname || result.search) { + var p = result.pathname || ""; + var s = result.search || ""; + result.path = p + s; + } + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + } + var isSourceAbs = result.pathname && result.pathname.charAt(0) === "/", isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === "/", mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname, removeAllDots = mustEndAbs, srcPath = result.pathname && result.pathname.split("/") || [], relPath = relative.pathname && relative.pathname.split("/") || [], psychotic = result.protocol && !slashedProtocol[result.protocol]; + if (psychotic) { + result.hostname = ""; + result.port = null; + if (result.host) { + if (srcPath[0] === "") { + srcPath[0] = result.host; + } else { + srcPath.unshift(result.host); + } + } + result.host = ""; + if (relative.protocol) { + relative.hostname = null; + relative.port = null; + if (relative.host) { + if (relPath[0] === "") { + relPath[0] = relative.host; + } else { + relPath.unshift(relative.host); + } + } + relative.host = null; + } + mustEndAbs = mustEndAbs && (relPath[0] === "" || srcPath[0] === ""); + } + if (isRelAbs) { + result.host = relative.host || relative.host === "" ? relative.host : result.host; + result.hostname = relative.hostname || relative.hostname === "" ? relative.hostname : result.hostname; + result.search = relative.search; + result.query = relative.query; + srcPath = relPath; + } else if (relPath.length) { + if (!srcPath) { + srcPath = []; + } + srcPath.pop(); + srcPath = srcPath.concat(relPath); + result.search = relative.search; + result.query = relative.query; + } else if (relative.search != null) { + if (psychotic) { + result.host = srcPath.shift(); + result.hostname = result.host; + var authInHost = result.host && result.host.indexOf("@") > 0 ? result.host.split("@") : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.hostname = authInHost.shift(); + result.host = result.hostname; + } + } + result.search = relative.search; + result.query = relative.query; + if (result.pathname !== null || result.search !== null) { + result.path = (result.pathname ? result.pathname : "") + (result.search ? result.search : ""); + } + result.href = result.format(); + return result; + } + if (!srcPath.length) { + result.pathname = null; + if (result.search) { + result.path = "/" + result.search; + } else { + result.path = null; + } + result.href = result.format(); + return result; + } + var last = srcPath.slice(-1)[0]; + var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === "." || last === "..") || last === ""; + var up = 0; + for (var i = srcPath.length; i >= 0; i--) { + last = srcPath[i]; + if (last === ".") { + srcPath.splice(i, 1); + } else if (last === "..") { + srcPath.splice(i, 1); + up++; + } else if (up) { + srcPath.splice(i, 1); + up--; + } + } + if (!mustEndAbs && !removeAllDots) { + for (; up--; up) { + srcPath.unshift(".."); + } + } + if (mustEndAbs && srcPath[0] !== "" && (!srcPath[0] || srcPath[0].charAt(0) !== "/")) { + srcPath.unshift(""); + } + if (hasTrailingSlash && srcPath.join("/").substr(-1) !== "/") { + srcPath.push(""); + } + var isAbsolute = srcPath[0] === "" || srcPath[0] && srcPath[0].charAt(0) === "/"; + if (psychotic) { + result.hostname = isAbsolute ? "" : srcPath.length ? srcPath.shift() : ""; + result.host = result.hostname; + var authInHost = result.host && result.host.indexOf("@") > 0 ? result.host.split("@") : false; + if (authInHost) { + result.auth = authInHost.shift(); + result.hostname = authInHost.shift(); + result.host = result.hostname; + } + } + mustEndAbs = mustEndAbs || result.host && srcPath.length; + if (mustEndAbs && !isAbsolute) { + srcPath.unshift(""); + } + if (srcPath.length > 0) { + result.pathname = srcPath.join("/"); + } else { + result.pathname = null; + result.path = null; + } + if (result.pathname !== null || result.search !== null) { + result.path = (result.pathname ? result.pathname : "") + (result.search ? result.search : ""); + } + result.auth = relative.auth || result.auth; + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + }; + Url.prototype.parseHost = function() { + var host = this.host; + var port = portPattern.exec(host); + if (port) { + port = port[0]; + if (port !== ":") { + this.port = port.substr(1); + } + host = host.substr(0, host.length - port.length); + } + if (host) { + this.hostname = host; + } + }; + url$2.parse = urlParse; + url$2.resolve = urlResolve; + url$2.resolveObject = urlResolveObject; + url$2.format = urlFormat; + url$2.Url = Url; + return url$2; +} +var urlExports = requireUrl(); +const _url = /* @__PURE__ */ getDefaultExportFromCjs(urlExports); +function pathToFileURL(s) { + return s; +} +const url = { ..._url, pathToFileURL }; +const url$1 = /* @__PURE__ */ _mergeNamespaces({ + __proto__: null, + default: url, + pathToFileURL +}, [urlExports]); +const require$$1$5 = /* @__PURE__ */ getAugmentedNamespace(url$1); +var hasRequiredUtil$2; +function requireUtil$2() { + if (hasRequiredUtil$2) return util$3; + hasRequiredUtil$2 = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.unixify = exports.bufferToEncoding = exports.getWriteSyncArgs = exports.getWriteArgs = exports.bufToUint8 = exports.dataToBuffer = exports.validateFd = exports.isFd = exports.flagsToNumber = exports.genRndStr6 = exports.createError = exports.pathToFilename = exports.nullCheck = exports.modeToNumber = exports.validateCallback = exports.promisify = exports.isWin = void 0; + const constants_1 = requireConstants$6(); + const errors2 = requireErrors$1(); + const buffer_1 = requireBuffer$1(); + const encoding_1 = requireEncoding(); + const buffer_2 = requireBuffer$1(); + const queueMicrotask_1 = requireQueueMicrotask(); + exports.isWin = process.platform === "win32"; + function promisify2(fs2, fn, getResult = (input) => input) { + return (...args) => new Promise((resolve, reject) => { + fs2[fn].bind(fs2)(...args, (error2, result) => { + if (error2) + return reject(error2); + return resolve(getResult(result)); + }); + }); + } + exports.promisify = promisify2; + function validateCallback(callback) { + if (typeof callback !== "function") + throw TypeError(constants_1.ERRSTR.CB); + return callback; + } + exports.validateCallback = validateCallback; + function _modeToNumber(mode, def) { + if (typeof mode === "number") + return mode; + if (typeof mode === "string") + return parseInt(mode, 8); + if (def) + return modeToNumber(def); + return void 0; + } + function modeToNumber(mode, def) { + const result = _modeToNumber(mode, def); + if (typeof result !== "number" || isNaN(result)) + throw new TypeError(constants_1.ERRSTR.MODE_INT); + return result; + } + exports.modeToNumber = modeToNumber; + function nullCheck(path2, callback) { + if (("" + path2).indexOf("\0") !== -1) { + const er = new Error("Path must be a string without null bytes"); + er.code = "ENOENT"; + if (typeof callback !== "function") + throw er; + (0, queueMicrotask_1.default)(() => { + callback(er); + }); + return false; + } + return true; + } + exports.nullCheck = nullCheck; + function getPathFromURLPosix(url2) { + if (url2.hostname !== "") { + throw new errors2.TypeError("ERR_INVALID_FILE_URL_HOST", process.platform); + } + const pathname = url2.pathname; + for (let n = 0; n < pathname.length; n++) { + if (pathname[n] === "%") { + const third = pathname.codePointAt(n + 2) | 32; + if (pathname[n + 1] === "2" && third === 102) { + throw new errors2.TypeError("ERR_INVALID_FILE_URL_PATH", "must not include encoded / characters"); + } + } + } + return decodeURIComponent(pathname); + } + function pathToFilename(path2) { + if (typeof path2 !== "string" && !buffer_1.Buffer.isBuffer(path2)) { + try { + if (!(path2 instanceof require$$1$5.URL)) + throw new TypeError(constants_1.ERRSTR.PATH_STR); + } catch (err) { + throw new TypeError(constants_1.ERRSTR.PATH_STR); + } + path2 = getPathFromURLPosix(path2); + } + const pathString = String(path2); + nullCheck(pathString); + return pathString; + } + exports.pathToFilename = pathToFilename; + const ENOENT = "ENOENT"; + const EBADF = "EBADF"; + const EINVAL = "EINVAL"; + const EPERM = "EPERM"; + const EPROTO = "EPROTO"; + const EEXIST = "EEXIST"; + const ENOTDIR = "ENOTDIR"; + const EMFILE = "EMFILE"; + const EACCES = "EACCES"; + const EISDIR = "EISDIR"; + const ENOTEMPTY = "ENOTEMPTY"; + const ENOSYS = "ENOSYS"; + const ERR_FS_EISDIR = "ERR_FS_EISDIR"; + const ERR_OUT_OF_RANGE = "ERR_OUT_OF_RANGE"; + function formatError(errorCode, func = "", path2 = "", path22 = "") { + let pathFormatted = ""; + if (path2) + pathFormatted = ` '${path2}'`; + if (path22) + pathFormatted += ` -> '${path22}'`; + switch (errorCode) { + case ENOENT: + return `ENOENT: no such file or directory, ${func}${pathFormatted}`; + case EBADF: + return `EBADF: bad file descriptor, ${func}${pathFormatted}`; + case EINVAL: + return `EINVAL: invalid argument, ${func}${pathFormatted}`; + case EPERM: + return `EPERM: operation not permitted, ${func}${pathFormatted}`; + case EPROTO: + return `EPROTO: protocol error, ${func}${pathFormatted}`; + case EEXIST: + return `EEXIST: file already exists, ${func}${pathFormatted}`; + case ENOTDIR: + return `ENOTDIR: not a directory, ${func}${pathFormatted}`; + case EISDIR: + return `EISDIR: illegal operation on a directory, ${func}${pathFormatted}`; + case EACCES: + return `EACCES: permission denied, ${func}${pathFormatted}`; + case ENOTEMPTY: + return `ENOTEMPTY: directory not empty, ${func}${pathFormatted}`; + case EMFILE: + return `EMFILE: too many open files, ${func}${pathFormatted}`; + case ENOSYS: + return `ENOSYS: function not implemented, ${func}${pathFormatted}`; + case ERR_FS_EISDIR: + return `[ERR_FS_EISDIR]: Path is a directory: ${func} returned EISDIR (is a directory) ${path2}`; + case ERR_OUT_OF_RANGE: + return `[ERR_OUT_OF_RANGE]: value out of range, ${func}${pathFormatted}`; + default: + return `${errorCode}: error occurred, ${func}${pathFormatted}`; + } + } + function createError(errorCode, func = "", path2 = "", path22 = "", Constructor = Error) { + const error2 = new Constructor(formatError(errorCode, func, path2, path22)); + error2.code = errorCode; + if (path2) { + error2.path = path2; + } + return error2; + } + exports.createError = createError; + function genRndStr6() { + const str = (Math.random() + 1).toString(36).substring(2, 8); + if (str.length === 6) + return str; + else + return genRndStr6(); + } + exports.genRndStr6 = genRndStr6; + function flagsToNumber(flags) { + if (typeof flags === "number") + return flags; + if (typeof flags === "string") { + const flagsNum = constants_1.FLAGS[flags]; + if (typeof flagsNum !== "undefined") + return flagsNum; + } + throw new errors2.TypeError("ERR_INVALID_OPT_VALUE", "flags", flags); + } + exports.flagsToNumber = flagsToNumber; + function isFd(path2) { + return path2 >>> 0 === path2; + } + exports.isFd = isFd; + function validateFd(fd) { + if (!isFd(fd)) + throw TypeError(constants_1.ERRSTR.FD); + } + exports.validateFd = validateFd; + function dataToBuffer(data2, encoding2 = encoding_1.ENCODING_UTF8) { + if (buffer_1.Buffer.isBuffer(data2)) + return data2; + else if (data2 instanceof Uint8Array) + return (0, buffer_2.bufferFrom)(data2); + else + return (0, buffer_2.bufferFrom)(String(data2), encoding2); + } + exports.dataToBuffer = dataToBuffer; + const bufToUint8 = (buf) => new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + exports.bufToUint8 = bufToUint8; + const getWriteArgs = (fd, a, b, c, d, e) => { + validateFd(fd); + let offset2 = 0; + let length; + let position = null; + let encoding2; + let callback; + const tipa = typeof a; + const tipb = typeof b; + const tipc = typeof c; + const tipd = typeof d; + if (tipa !== "string") { + if (tipb === "function") { + callback = b; + } else if (tipc === "function") { + offset2 = b | 0; + callback = c; + } else if (tipd === "function") { + offset2 = b | 0; + length = c; + callback = d; + } else { + offset2 = b | 0; + length = c; + position = d; + callback = e; + } + } else { + if (tipb === "function") { + callback = b; + } else if (tipc === "function") { + position = b; + callback = c; + } else if (tipd === "function") { + position = b; + encoding2 = c; + callback = d; + } + } + const buf = dataToBuffer(a, encoding2); + if (tipa !== "string") { + if (typeof length === "undefined") + length = buf.length; + } else { + offset2 = 0; + length = buf.length; + } + const cb = validateCallback(callback); + return [fd, tipa === "string", buf, offset2, length, position, cb]; + }; + exports.getWriteArgs = getWriteArgs; + const getWriteSyncArgs = (fd, a, b, c, d) => { + validateFd(fd); + let encoding2; + let offset2; + let length; + let position; + const isBuffer = typeof a !== "string"; + if (isBuffer) { + offset2 = (b || 0) | 0; + length = c; + position = d; + } else { + position = b; + encoding2 = c; + } + const buf = dataToBuffer(a, encoding2); + if (isBuffer) { + if (typeof length === "undefined") { + length = buf.length; + } + } else { + offset2 = 0; + length = buf.length; + } + return [fd, buf, offset2 || 0, length, position]; + }; + exports.getWriteSyncArgs = getWriteSyncArgs; + function bufferToEncoding(buffer2, encoding2) { + if (!encoding2 || encoding2 === "buffer") + return buffer2; + else + return buffer2.toString(encoding2); + } + exports.bufferToEncoding = bufferToEncoding; + const isSeparator = (str, i) => { + let char = str[i]; + return i > 0 && (char === "/" || exports.isWin && char === "\\"); + }; + const removeTrailingSeparator = (str) => { + let i = str.length - 1; + if (i < 2) + return str; + while (isSeparator(str, i)) + i--; + return str.substr(0, i + 1); + }; + const normalizePath = (str, stripTrailing) => { + if (typeof str !== "string") + throw new TypeError("expected a string"); + str = str.replace(/[\\\/]+/g, "/"); + if (stripTrailing !== false) + str = removeTrailingSeparator(str); + return str; + }; + const unixify = (filepath, stripTrailing = true) => { + if (exports.isWin) { + filepath = normalizePath(filepath, stripTrailing); + return filepath.replace(/^([a-zA-Z]+:|\.\/)/, ""); + } + return filepath; + }; + exports.unixify = unixify; + })(util$3); + return util$3; +} +var hasRequiredFileHandle; +function requireFileHandle() { + if (hasRequiredFileHandle) return FileHandle; + hasRequiredFileHandle = 1; + Object.defineProperty(FileHandle, "__esModule", { value: true }); + FileHandle.FileHandle = void 0; + const util_1 = requireUtil$2(); + let FileHandle$1 = class FileHandle { + constructor(fs2, fd) { + this.fs = fs2; + this.fd = fd; + } + appendFile(data2, options2) { + return (0, util_1.promisify)(this.fs, "appendFile")(this.fd, data2, options2); + } + chmod(mode) { + return (0, util_1.promisify)(this.fs, "fchmod")(this.fd, mode); + } + chown(uid, gid) { + return (0, util_1.promisify)(this.fs, "fchown")(this.fd, uid, gid); + } + close() { + return (0, util_1.promisify)(this.fs, "close")(this.fd); + } + datasync() { + return (0, util_1.promisify)(this.fs, "fdatasync")(this.fd); + } + read(buffer2, offset2, length, position) { + return (0, util_1.promisify)(this.fs, "read", (bytesRead) => ({ bytesRead, buffer: buffer2 }))(this.fd, buffer2, offset2, length, position); + } + readv(buffers, position) { + return (0, util_1.promisify)(this.fs, "readv", (bytesRead) => ({ bytesRead, buffers }))(this.fd, buffers, position); + } + readFile(options2) { + return (0, util_1.promisify)(this.fs, "readFile")(this.fd, options2); + } + stat(options2) { + return (0, util_1.promisify)(this.fs, "fstat")(this.fd, options2); + } + sync() { + return (0, util_1.promisify)(this.fs, "fsync")(this.fd); + } + truncate(len) { + return (0, util_1.promisify)(this.fs, "ftruncate")(this.fd, len); + } + utimes(atime, mtime) { + return (0, util_1.promisify)(this.fs, "futimes")(this.fd, atime, mtime); + } + write(buffer2, offset2, length, position) { + return (0, util_1.promisify)(this.fs, "write", (bytesWritten) => ({ bytesWritten, buffer: buffer2 }))(this.fd, buffer2, offset2, length, position); + } + writev(buffers, position) { + return (0, util_1.promisify)(this.fs, "writev", (bytesWritten) => ({ bytesWritten, buffers }))(this.fd, buffers, position); + } + writeFile(data2, options2) { + return (0, util_1.promisify)(this.fs, "writeFile")(this.fd, data2, options2); + } + }; + FileHandle.FileHandle = FileHandle$1; + return FileHandle; +} +var FsPromises = {}; +var hasRequiredFsPromises; +function requireFsPromises() { + if (hasRequiredFsPromises) return FsPromises; + hasRequiredFsPromises = 1; + Object.defineProperty(FsPromises, "__esModule", { value: true }); + FsPromises.FsPromises = void 0; + const util_1 = requireUtil$2(); + const constants_1 = requireConstants$7(); + let FsPromises$1 = class FsPromises { + constructor(fs2, FileHandle2) { + this.fs = fs2; + this.FileHandle = FileHandle2; + this.constants = constants_1.constants; + this.cp = (0, util_1.promisify)(this.fs, "cp"); + this.opendir = (0, util_1.promisify)(this.fs, "opendir"); + this.statfs = (0, util_1.promisify)(this.fs, "statfs"); + this.lutimes = (0, util_1.promisify)(this.fs, "lutimes"); + this.access = (0, util_1.promisify)(this.fs, "access"); + this.chmod = (0, util_1.promisify)(this.fs, "chmod"); + this.chown = (0, util_1.promisify)(this.fs, "chown"); + this.copyFile = (0, util_1.promisify)(this.fs, "copyFile"); + this.lchmod = (0, util_1.promisify)(this.fs, "lchmod"); + this.lchown = (0, util_1.promisify)(this.fs, "lchown"); + this.link = (0, util_1.promisify)(this.fs, "link"); + this.lstat = (0, util_1.promisify)(this.fs, "lstat"); + this.mkdir = (0, util_1.promisify)(this.fs, "mkdir"); + this.mkdtemp = (0, util_1.promisify)(this.fs, "mkdtemp"); + this.readdir = (0, util_1.promisify)(this.fs, "readdir"); + this.readlink = (0, util_1.promisify)(this.fs, "readlink"); + this.realpath = (0, util_1.promisify)(this.fs, "realpath"); + this.rename = (0, util_1.promisify)(this.fs, "rename"); + this.rmdir = (0, util_1.promisify)(this.fs, "rmdir"); + this.rm = (0, util_1.promisify)(this.fs, "rm"); + this.stat = (0, util_1.promisify)(this.fs, "stat"); + this.symlink = (0, util_1.promisify)(this.fs, "symlink"); + this.truncate = (0, util_1.promisify)(this.fs, "truncate"); + this.unlink = (0, util_1.promisify)(this.fs, "unlink"); + this.utimes = (0, util_1.promisify)(this.fs, "utimes"); + this.readFile = (id, options2) => { + return (0, util_1.promisify)(this.fs, "readFile")(id instanceof this.FileHandle ? id.fd : id, options2); + }; + this.appendFile = (path2, data2, options2) => { + return (0, util_1.promisify)(this.fs, "appendFile")(path2 instanceof this.FileHandle ? path2.fd : path2, data2, options2); + }; + this.open = (path2, flags = "r", mode) => { + return (0, util_1.promisify)(this.fs, "open", (fd) => new this.FileHandle(this.fs, fd))(path2, flags, mode); + }; + this.writeFile = (id, data2, options2) => { + return (0, util_1.promisify)(this.fs, "writeFile")(id instanceof this.FileHandle ? id.fd : id, data2, options2); + }; + this.watch = () => { + throw new Error("Not implemented"); + }; + } + }; + FsPromises.FsPromises = FsPromises$1; + return FsPromises; +} +var print = {}; +var printTree = {}; +var hasRequiredPrintTree; +function requirePrintTree() { + if (hasRequiredPrintTree) return printTree; + hasRequiredPrintTree = 1; + Object.defineProperty(printTree, "__esModule", { value: true }); + printTree.printTree = void 0; + const printTree$1 = (tab = "", children) => { + children = children.filter(Boolean); + let str = ""; + for (let i = 0; i < children.length; i++) { + const isLast = i >= children.length - 1; + const fn = children[i]; + if (!fn) + continue; + const child = fn(tab + `${isLast ? " " : "│"} `); + const branch = child ? isLast ? "└─" : "├─" : "│ "; + str += ` +${tab}${branch} ${child}`; + } + return str; + }; + printTree.printTree = printTree$1; + return printTree; +} +var util$2 = {}; +var hasRequiredUtil$1; +function requireUtil$1() { + if (hasRequiredUtil$1) return util$2; + hasRequiredUtil$1 = 1; + Object.defineProperty(util$2, "__esModule", { value: true }); + util$2.newNotAllowedError = util$2.newTypeMismatchError = util$2.newNotFoundError = util$2.assertCanWrite = util$2.assertName = util$2.basename = util$2.ctx = void 0; + const ctx = (partial = {}) => { + return Object.assign({ separator: "/", syncHandleAllowed: false, mode: "read" }, partial); + }; + util$2.ctx = ctx; + const basename = (path2, separator) => { + if (path2[path2.length - 1] === separator) + path2 = path2.slice(0, -1); + const lastSlashIndex = path2.lastIndexOf(separator); + return lastSlashIndex === -1 ? path2 : path2.slice(lastSlashIndex + 1); + }; + util$2.basename = basename; + const nameRegex = /^(\.{1,2})$|^(.*([\/\\]).*)$/; + const assertName = (name, method, klass) => { + const isInvalid = !name || nameRegex.test(name); + if (isInvalid) + throw new TypeError(`Failed to execute '${method}' on '${klass}': Name is not allowed.`); + }; + util$2.assertName = assertName; + const assertCanWrite = (mode) => { + if (mode !== "readwrite") + throw new DOMException("The request is not allowed by the user agent or the platform in the current context.", "NotAllowedError"); + }; + util$2.assertCanWrite = assertCanWrite; + const newNotFoundError = () => new DOMException("A requested file or directory could not be found at the time an operation was processed.", "NotFoundError"); + util$2.newNotFoundError = newNotFoundError; + const newTypeMismatchError = () => new DOMException("The path supplied exists, but was not an entry of requested type.", "TypeMismatchError"); + util$2.newTypeMismatchError = newTypeMismatchError; + const newNotAllowedError = () => new DOMException("Permission not granted.", "NotAllowedError"); + util$2.newNotAllowedError = newNotAllowedError; + return util$2; +} +var hasRequiredPrint; +function requirePrint() { + if (hasRequiredPrint) return print; + hasRequiredPrint = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.toTreeSync = void 0; + const printTree_1 = requirePrintTree(); + const util_1 = requireUtil$1(); + const toTreeSync = (fs2, opts = {}) => { + var _a2; + const separator = opts.separator || "/"; + let dir = opts.dir || separator; + if (dir[dir.length - 1] !== separator) + dir += separator; + const tab = opts.tab || ""; + const depth = (_a2 = opts.depth) !== null && _a2 !== void 0 ? _a2 : 10; + let subtree = " (...)"; + if (depth > 0) { + const list = fs2.readdirSync(dir, { withFileTypes: true }); + subtree = (0, printTree_1.printTree)(tab, list.map((entry) => (tab2) => { + if (entry.isDirectory()) { + return (0, exports.toTreeSync)(fs2, { dir: dir + entry.name, depth: depth - 1, tab: tab2 }); + } else if (entry.isSymbolicLink()) { + return "" + entry.name + " → " + fs2.readlinkSync(dir + entry.name); + } else { + return "" + entry.name; + } + })); + } + const base2 = (0, util_1.basename)(dir, separator) + separator; + return base2 + subtree; + }; + exports.toTreeSync = toTreeSync; + })(print); + return print; +} +var options$1 = {}; +var hasRequiredOptions; +function requireOptions() { + if (hasRequiredOptions) return options$1; + hasRequiredOptions = 1; + (function(exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getWriteFileOptions = exports.writeFileDefaults = exports.getRealpathOptsAndCb = exports.getRealpathOptions = exports.getStatOptsAndCb = exports.getStatOptions = exports.getAppendFileOptsAndCb = exports.getAppendFileOpts = exports.getReaddirOptsAndCb = exports.getReaddirOptions = exports.getReadFileOptions = exports.getRmOptsAndCb = exports.getRmdirOptions = exports.getDefaultOptsAndCb = exports.getDefaultOpts = exports.optsDefaults = exports.optsAndCbGenerator = exports.optsGenerator = exports.getOptions = exports.getMkdirOptions = void 0; + const constants_1 = requireConstants$6(); + const encoding_1 = requireEncoding(); + const util_1 = requireUtil$2(); + const mkdirDefaults = { + mode: 511, + recursive: false + }; + const getMkdirOptions = (options2) => { + if (typeof options2 === "number") + return Object.assign({}, mkdirDefaults, { mode: options2 }); + return Object.assign({}, mkdirDefaults, options2); + }; + exports.getMkdirOptions = getMkdirOptions; + const ERRSTR_OPTS = (tipeof) => `Expected options to be either an object or a string, but got ${tipeof} instead`; + function getOptions2(defaults, options2) { + let opts; + if (!options2) + return defaults; + else { + const tipeof = typeof options2; + switch (tipeof) { + case "string": + opts = Object.assign({}, defaults, { encoding: options2 }); + break; + case "object": + opts = Object.assign({}, defaults, options2); + break; + default: + throw TypeError(ERRSTR_OPTS(tipeof)); + } + } + if (opts.encoding !== "buffer") + (0, encoding_1.assertEncoding)(opts.encoding); + return opts; + } + exports.getOptions = getOptions2; + function optsGenerator(defaults) { + return (options2) => getOptions2(defaults, options2); + } + exports.optsGenerator = optsGenerator; + function optsAndCbGenerator(getOpts) { + return (options2, callback) => typeof options2 === "function" ? [getOpts(), options2] : [getOpts(options2), (0, util_1.validateCallback)(callback)]; + } + exports.optsAndCbGenerator = optsAndCbGenerator; + exports.optsDefaults = { + encoding: "utf8" + }; + exports.getDefaultOpts = optsGenerator(exports.optsDefaults); + exports.getDefaultOptsAndCb = optsAndCbGenerator(exports.getDefaultOpts); + const rmdirDefaults = { + recursive: false + }; + const getRmdirOptions = (options2) => { + return Object.assign({}, rmdirDefaults, options2); + }; + exports.getRmdirOptions = getRmdirOptions; + const getRmOpts = optsGenerator(exports.optsDefaults); + exports.getRmOptsAndCb = optsAndCbGenerator(getRmOpts); + const readFileOptsDefaults = { + flag: "r" + }; + exports.getReadFileOptions = optsGenerator(readFileOptsDefaults); + const readdirDefaults = { + encoding: "utf8", + recursive: false, + withFileTypes: false + }; + exports.getReaddirOptions = optsGenerator(readdirDefaults); + exports.getReaddirOptsAndCb = optsAndCbGenerator(exports.getReaddirOptions); + const appendFileDefaults = { + encoding: "utf8", + mode: 438, + flag: constants_1.FLAGS[constants_1.FLAGS.a] + }; + exports.getAppendFileOpts = optsGenerator(appendFileDefaults); + exports.getAppendFileOptsAndCb = optsAndCbGenerator(exports.getAppendFileOpts); + const statDefaults = { + bigint: false + }; + const getStatOptions = (options2 = {}) => Object.assign({}, statDefaults, options2); + exports.getStatOptions = getStatOptions; + const getStatOptsAndCb = (options2, callback) => typeof options2 === "function" ? [(0, exports.getStatOptions)(), options2] : [(0, exports.getStatOptions)(options2), (0, util_1.validateCallback)(callback)]; + exports.getStatOptsAndCb = getStatOptsAndCb; + const realpathDefaults = exports.optsDefaults; + exports.getRealpathOptions = optsGenerator(realpathDefaults); + exports.getRealpathOptsAndCb = optsAndCbGenerator(exports.getRealpathOptions); + exports.writeFileDefaults = { + encoding: "utf8", + mode: 438, + flag: constants_1.FLAGS[constants_1.FLAGS.w] + }; + exports.getWriteFileOptions = optsGenerator(exports.writeFileDefaults); + })(options$1); + return options$1; +} +var hasRequiredVolume; +function requireVolume() { + if (hasRequiredVolume) return volume; + hasRequiredVolume = 1; + Object.defineProperty(volume, "__esModule", { value: true }); + volume.FSWatcher = volume.StatWatcher = volume.Volume = volume.toUnixTimestamp = volume.dataToStr = volume.pathToSteps = volume.filenameToSteps = void 0; + const pathModule = requirePath(); + const node_1 = requireNode$1(); + const Stats_1 = requireStats(); + const Dirent_1 = requireDirent(); + const buffer_1 = requireBuffer$1(); + const setImmediate_1 = requireSetImmediate(); + const queueMicrotask_1 = requireQueueMicrotask(); + const process_1 = requireProcess(); + const setTimeoutUnref_1 = requireSetTimeoutUnref(); + const stream_1 = requireBrowser$h(); + const constants_1 = requireConstants$7(); + const events_1 = requireEvents(); + const encoding_1 = requireEncoding(); + const FileHandle_1 = requireFileHandle(); + const util2 = requireUtil$5(); + const FsPromises_1 = requireFsPromises(); + const print_1 = requirePrint(); + const constants_2 = requireConstants$6(); + const options_1 = requireOptions(); + const util_1 = requireUtil$2(); + const resolveCrossPlatform = pathModule.resolve; + const { O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_TRUNC, O_APPEND, O_DIRECTORY, O_SYMLINK, F_OK, COPYFILE_EXCL, COPYFILE_FICLONE_FORCE } = constants_1.constants; + const { sep, relative, join: join2, dirname } = pathModule.posix ? pathModule.posix : pathModule; + const kMinPoolSpace = 128; + const EPERM = "EPERM"; + const ENOENT = "ENOENT"; + const EBADF = "EBADF"; + const EINVAL = "EINVAL"; + const EEXIST = "EEXIST"; + const ENOTDIR = "ENOTDIR"; + const EMFILE = "EMFILE"; + const EACCES = "EACCES"; + const EISDIR = "EISDIR"; + const ENOTEMPTY = "ENOTEMPTY"; + const ENOSYS = "ENOSYS"; + const ERR_FS_EISDIR = "ERR_FS_EISDIR"; + const ERR_OUT_OF_RANGE = "ERR_OUT_OF_RANGE"; + let resolve = (filename, base2 = process_1.default.cwd()) => resolveCrossPlatform(base2, filename); + if (util_1.isWin) { + const _resolve = resolve; + resolve = (filename, base2) => (0, util_1.unixify)(_resolve(filename, base2)); + } + function filenameToSteps(filename, base2) { + const fullPath = resolve(filename, base2); + const fullPathSansSlash = fullPath.substring(1); + if (!fullPathSansSlash) + return []; + return fullPathSansSlash.split(sep); + } + volume.filenameToSteps = filenameToSteps; + function pathToSteps(path2) { + return filenameToSteps((0, util_1.pathToFilename)(path2)); + } + volume.pathToSteps = pathToSteps; + function dataToStr(data2, encoding2 = encoding_1.ENCODING_UTF8) { + if (buffer_1.Buffer.isBuffer(data2)) + return data2.toString(encoding2); + else if (data2 instanceof Uint8Array) + return (0, buffer_1.bufferFrom)(data2).toString(encoding2); + else + return String(data2); + } + volume.dataToStr = dataToStr; + function toUnixTimestamp(time) { + if (typeof time === "string" && +time == time) { + return +time; + } + if (time instanceof Date) { + return time.getTime() / 1e3; + } + if (isFinite(time)) { + if (time < 0) { + return Date.now() / 1e3; + } + return time; + } + throw new Error("Cannot parse time: " + time); + } + volume.toUnixTimestamp = toUnixTimestamp; + function validateUid(uid) { + if (typeof uid !== "number") + throw TypeError(constants_2.ERRSTR.UID); + } + function validateGid(gid) { + if (typeof gid !== "number") + throw TypeError(constants_2.ERRSTR.GID); + } + function flattenJSON(nestedJSON) { + const flatJSON = {}; + function flatten(pathPrefix, node2) { + for (const path2 in node2) { + const contentOrNode = node2[path2]; + const joinedPath = join2(pathPrefix, path2); + if (typeof contentOrNode === "string" || contentOrNode instanceof buffer_1.Buffer) { + flatJSON[joinedPath] = contentOrNode; + } else if (typeof contentOrNode === "object" && contentOrNode !== null && Object.keys(contentOrNode).length > 0) { + flatten(joinedPath, contentOrNode); + } else { + flatJSON[joinedPath] = null; + } + } + } + flatten("", nestedJSON); + return flatJSON; + } + const notImplemented = () => { + throw new Error("Not implemented"); + }; + class Volume { + static fromJSON(json, cwd) { + const vol = new Volume(); + vol.fromJSON(json, cwd); + return vol; + } + static fromNestedJSON(json, cwd) { + const vol = new Volume(); + vol.fromNestedJSON(json, cwd); + return vol; + } + get promises() { + if (this.promisesApi === null) + throw new Error("Promise is not supported in this environment."); + return this.promisesApi; + } + constructor(props = {}) { + this.ino = 0; + this.inodes = {}; + this.releasedInos = []; + this.fds = {}; + this.releasedFds = []; + this.maxFiles = 1e4; + this.openFiles = 0; + this.promisesApi = new FsPromises_1.FsPromises(this, FileHandle_1.FileHandle); + this.statWatchers = {}; + this.cpSync = notImplemented; + this.lutimesSync = notImplemented; + this.statfsSync = notImplemented; + this.opendirSync = notImplemented; + this.cp = notImplemented; + this.lutimes = notImplemented; + this.statfs = notImplemented; + this.openAsBlob = notImplemented; + this.opendir = notImplemented; + this.props = Object.assign({ Node: node_1.Node, Link: node_1.Link, File: node_1.File }, props); + const root = this.createLink(); + root.setNode(this.createNode(true)); + const self2 = this; + this.StatWatcher = class extends StatWatcher { + constructor() { + super(self2); + } + }; + const _ReadStream = FsReadStream; + this.ReadStream = class extends _ReadStream { + constructor(...args) { + super(self2, ...args); + } + }; + const _WriteStream = FsWriteStream; + this.WriteStream = class extends _WriteStream { + constructor(...args) { + super(self2, ...args); + } + }; + this.FSWatcher = class extends FSWatcher { + constructor() { + super(self2); + } + }; + root.setChild(".", root); + root.getNode().nlink++; + root.setChild("..", root); + root.getNode().nlink++; + this.root = root; + } + createLink(parent, name, isDirectory = false, perm) { + if (!parent) { + return new this.props.Link(this, null, ""); + } + if (!name) { + throw new Error("createLink: name cannot be empty"); + } + return parent.createChild(name, this.createNode(isDirectory, perm)); + } + deleteLink(link2) { + const parent = link2.parent; + if (parent) { + parent.deleteChild(link2); + return true; + } + return false; + } + newInoNumber() { + const releasedFd = this.releasedInos.pop(); + if (releasedFd) + return releasedFd; + else { + this.ino = (this.ino + 1) % 4294967295; + return this.ino; + } + } + newFdNumber() { + const releasedFd = this.releasedFds.pop(); + return typeof releasedFd === "number" ? releasedFd : Volume.fd--; + } + createNode(isDirectory = false, perm) { + const node2 = new this.props.Node(this.newInoNumber(), perm); + if (isDirectory) + node2.setIsDirectory(); + this.inodes[node2.ino] = node2; + return node2; + } + deleteNode(node2) { + node2.del(); + delete this.inodes[node2.ino]; + this.releasedInos.push(node2.ino); + } + // Returns a `Link` (hard link) referenced by path "split" into steps. + getLink(steps) { + return this.root.walk(steps); + } + // Just link `getLink`, but throws a correct user error, if link to found. + getLinkOrThrow(filename, funcName) { + const steps = filenameToSteps(filename); + const link2 = this.getLink(steps); + if (!link2) + throw (0, util_1.createError)(ENOENT, funcName, filename); + return link2; + } + // Just like `getLink`, but also dereference/resolves symbolic links. + getResolvedLink(filenameOrSteps) { + let steps = typeof filenameOrSteps === "string" ? filenameToSteps(filenameOrSteps) : filenameOrSteps; + let link2 = this.root; + let i = 0; + while (i < steps.length) { + const step = steps[i]; + link2 = link2.getChild(step); + if (!link2) + return null; + const node2 = link2.getNode(); + if (node2.isSymlink()) { + steps = node2.symlink.concat(steps.slice(i + 1)); + link2 = this.root; + i = 0; + continue; + } + i++; + } + return link2; + } + // Just like `getLinkOrThrow`, but also dereference/resolves symbolic links. + getResolvedLinkOrThrow(filename, funcName) { + const link2 = this.getResolvedLink(filename); + if (!link2) + throw (0, util_1.createError)(ENOENT, funcName, filename); + return link2; + } + resolveSymlinks(link2) { + return this.getResolvedLink(link2.steps.slice(1)); + } + // Just like `getLinkOrThrow`, but also verifies that the link is a directory. + getLinkAsDirOrThrow(filename, funcName) { + const link2 = this.getLinkOrThrow(filename, funcName); + if (!link2.getNode().isDirectory()) + throw (0, util_1.createError)(ENOTDIR, funcName, filename); + return link2; + } + // Get the immediate parent directory of the link. + getLinkParent(steps) { + return this.root.walk(steps, steps.length - 1); + } + getLinkParentAsDirOrThrow(filenameOrSteps, funcName) { + const steps = filenameOrSteps instanceof Array ? filenameOrSteps : filenameToSteps(filenameOrSteps); + const link2 = this.getLinkParent(steps); + if (!link2) + throw (0, util_1.createError)(ENOENT, funcName, sep + steps.join(sep)); + if (!link2.getNode().isDirectory()) + throw (0, util_1.createError)(ENOTDIR, funcName, sep + steps.join(sep)); + return link2; + } + getFileByFd(fd) { + return this.fds[String(fd)]; + } + getFileByFdOrThrow(fd, funcName) { + if (!(0, util_1.isFd)(fd)) + throw TypeError(constants_2.ERRSTR.FD); + const file = this.getFileByFd(fd); + if (!file) + throw (0, util_1.createError)(EBADF, funcName); + return file; + } + /** + * @todo This is not used anymore. Remove. + */ + /* + private getNodeByIdOrCreate(id: TFileId, flags: number, perm: number): Node { + if (typeof id === 'number') { + const file = this.getFileByFd(id); + if (!file) throw Error('File nto found'); + return file.node; + } else { + const steps = pathToSteps(id as PathLike); + let link = this.getLink(steps); + if (link) return link.getNode(); + + // Try creating a node if not found. + if (flags & O_CREAT) { + const dirLink = this.getLinkParent(steps); + if (dirLink) { + const name = steps[steps.length - 1]; + link = this.createLink(dirLink, name, false, perm); + return link.getNode(); + } + } + + throw createError(ENOENT, 'getNodeByIdOrCreate', pathToFilename(id)); + } + } + */ + wrapAsync(method, args, callback) { + (0, util_1.validateCallback)(callback); + (0, setImmediate_1.default)(() => { + let result; + try { + result = method.apply(this, args); + } catch (err) { + callback(err); + return; + } + callback(null, result); + }); + } + _toJSON(link2 = this.root, json = {}, path2, asBuffer) { + let isEmpty2 = true; + let children = link2.children; + if (link2.getNode().isFile()) { + children = /* @__PURE__ */ new Map([[link2.getName(), link2.parent.getChild(link2.getName())]]); + link2 = link2.parent; + } + for (const name of children.keys()) { + if (name === "." || name === "..") { + continue; + } + isEmpty2 = false; + const child = link2.getChild(name); + if (!child) { + throw new Error("_toJSON: unexpected undefined"); + } + const node2 = child.getNode(); + if (node2.isFile()) { + let filename = child.getPath(); + if (path2) + filename = relative(path2, filename); + json[filename] = asBuffer ? node2.getBuffer() : node2.getString(); + } else if (node2.isDirectory()) { + this._toJSON(child, json, path2); + } + } + let dirPath = link2.getPath(); + if (path2) + dirPath = relative(path2, dirPath); + if (dirPath && isEmpty2) { + json[dirPath] = null; + } + return json; + } + toJSON(paths, json = {}, isRelative = false, asBuffer = false) { + const links = []; + if (paths) { + if (!Array.isArray(paths)) + paths = [paths]; + for (const path2 of paths) { + const filename = (0, util_1.pathToFilename)(path2); + const link2 = this.getResolvedLink(filename); + if (!link2) + continue; + links.push(link2); + } + } else { + links.push(this.root); + } + if (!links.length) + return json; + for (const link2 of links) + this._toJSON(link2, json, isRelative ? link2.getPath() : "", asBuffer); + return json; + } + // TODO: `cwd` should probably not invoke `process.cwd()`. + fromJSON(json, cwd = process_1.default.cwd()) { + for (let filename in json) { + const data2 = json[filename]; + filename = resolve(filename, cwd); + if (typeof data2 === "string" || data2 instanceof buffer_1.Buffer) { + const dir = dirname(filename); + this.mkdirpBase( + dir, + 511 + /* MODE.DIR */ + ); + this.writeFileSync(filename, data2); + } else { + this.mkdirpBase( + filename, + 511 + /* MODE.DIR */ + ); + } + } + } + fromNestedJSON(json, cwd) { + this.fromJSON(flattenJSON(json), cwd); + } + toTree(opts = { separator: sep }) { + return (0, print_1.toTreeSync)(this, opts); + } + reset() { + this.ino = 0; + this.inodes = {}; + this.releasedInos = []; + this.fds = {}; + this.releasedFds = []; + this.openFiles = 0; + this.root = this.createLink(); + this.root.setNode(this.createNode(true)); + } + // Legacy interface + mountSync(mountpoint, json) { + this.fromJSON(json, mountpoint); + } + openLink(link2, flagsNum, resolveSymlinks = true) { + if (this.openFiles >= this.maxFiles) { + throw (0, util_1.createError)(EMFILE, "open", link2.getPath()); + } + let realLink = link2; + if (resolveSymlinks) + realLink = this.resolveSymlinks(link2); + if (!realLink) + throw (0, util_1.createError)(ENOENT, "open", link2.getPath()); + const node2 = realLink.getNode(); + if (node2.isDirectory()) { + if ((flagsNum & (O_RDONLY | O_RDWR | O_WRONLY)) !== O_RDONLY) + throw (0, util_1.createError)(EISDIR, "open", link2.getPath()); + } else { + if (flagsNum & O_DIRECTORY) + throw (0, util_1.createError)(ENOTDIR, "open", link2.getPath()); + } + if (!(flagsNum & O_WRONLY)) { + if (!node2.canRead()) { + throw (0, util_1.createError)(EACCES, "open", link2.getPath()); + } + } + const file = new this.props.File(link2, node2, flagsNum, this.newFdNumber()); + this.fds[file.fd] = file; + this.openFiles++; + if (flagsNum & O_TRUNC) + file.truncate(); + return file; + } + openFile(filename, flagsNum, modeNum, resolveSymlinks = true) { + const steps = filenameToSteps(filename); + let link2 = resolveSymlinks ? this.getResolvedLink(steps) : this.getLink(steps); + if (link2 && flagsNum & O_EXCL) + throw (0, util_1.createError)(EEXIST, "open", filename); + if (!link2 && flagsNum & O_CREAT) { + const dirLink = this.getResolvedLink(steps.slice(0, steps.length - 1)); + if (!dirLink) + throw (0, util_1.createError)(ENOENT, "open", sep + steps.join(sep)); + if (flagsNum & O_CREAT && typeof modeNum === "number") { + link2 = this.createLink(dirLink, steps[steps.length - 1], false, modeNum); + } + } + if (link2) + return this.openLink(link2, flagsNum, resolveSymlinks); + throw (0, util_1.createError)(ENOENT, "open", filename); + } + openBase(filename, flagsNum, modeNum, resolveSymlinks = true) { + const file = this.openFile(filename, flagsNum, modeNum, resolveSymlinks); + if (!file) + throw (0, util_1.createError)(ENOENT, "open", filename); + return file.fd; + } + openSync(path2, flags, mode = 438) { + const modeNum = (0, util_1.modeToNumber)(mode); + const fileName = (0, util_1.pathToFilename)(path2); + const flagsNum = (0, util_1.flagsToNumber)(flags); + return this.openBase(fileName, flagsNum, modeNum, !(flagsNum & O_SYMLINK)); + } + open(path2, flags, a, b) { + let mode = a; + let callback = b; + if (typeof a === "function") { + mode = 438; + callback = a; + } + mode = mode || 438; + const modeNum = (0, util_1.modeToNumber)(mode); + const fileName = (0, util_1.pathToFilename)(path2); + const flagsNum = (0, util_1.flagsToNumber)(flags); + this.wrapAsync(this.openBase, [fileName, flagsNum, modeNum, !(flagsNum & O_SYMLINK)], callback); + } + closeFile(file) { + if (!this.fds[file.fd]) + return; + this.openFiles--; + delete this.fds[file.fd]; + this.releasedFds.push(file.fd); + } + closeSync(fd) { + (0, util_1.validateFd)(fd); + const file = this.getFileByFdOrThrow(fd, "close"); + this.closeFile(file); + } + close(fd, callback) { + (0, util_1.validateFd)(fd); + this.wrapAsync(this.closeSync, [fd], callback); + } + openFileOrGetById(id, flagsNum, modeNum) { + if (typeof id === "number") { + const file = this.fds[id]; + if (!file) + throw (0, util_1.createError)(ENOENT); + return file; + } else { + return this.openFile((0, util_1.pathToFilename)(id), flagsNum, modeNum); + } + } + readBase(fd, buffer2, offset2, length, position) { + if (buffer2.byteLength < length) { + throw (0, util_1.createError)(ERR_OUT_OF_RANGE, "read", void 0, void 0, RangeError); + } + const file = this.getFileByFdOrThrow(fd); + if (file.node.isSymlink()) { + throw (0, util_1.createError)(EPERM, "read", file.link.getPath()); + } + return file.read(buffer2, Number(offset2), Number(length), position === -1 || typeof position !== "number" ? void 0 : position); + } + readSync(fd, buffer2, offset2, length, position) { + (0, util_1.validateFd)(fd); + return this.readBase(fd, buffer2, offset2, length, position); + } + read(fd, buffer2, offset2, length, position, callback) { + (0, util_1.validateCallback)(callback); + if (length === 0) { + return (0, queueMicrotask_1.default)(() => { + if (callback) + callback(null, 0, buffer2); + }); + } + (0, setImmediate_1.default)(() => { + try { + const bytes = this.readBase(fd, buffer2, offset2, length, position); + callback(null, bytes, buffer2); + } catch (err) { + callback(err); + } + }); + } + readvBase(fd, buffers, position) { + const file = this.getFileByFdOrThrow(fd); + let p = position !== null && position !== void 0 ? position : void 0; + if (p === -1) { + p = void 0; + } + let bytesRead = 0; + for (const buffer2 of buffers) { + const bytes = file.read(buffer2, 0, buffer2.byteLength, p); + p = void 0; + bytesRead += bytes; + if (bytes < buffer2.byteLength) + break; + } + return bytesRead; + } + readv(fd, buffers, a, b) { + let position = a; + let callback = b; + if (typeof a === "function") { + position = null; + callback = a; + } + (0, util_1.validateCallback)(callback); + (0, setImmediate_1.default)(() => { + try { + const bytes = this.readvBase(fd, buffers, position); + callback(null, bytes, buffers); + } catch (err) { + callback(err); + } + }); + } + readvSync(fd, buffers, position) { + (0, util_1.validateFd)(fd); + return this.readvBase(fd, buffers, position); + } + readFileBase(id, flagsNum, encoding2) { + let result; + const isUserFd = typeof id === "number"; + const userOwnsFd = isUserFd && (0, util_1.isFd)(id); + let fd; + if (userOwnsFd) + fd = id; + else { + const filename = (0, util_1.pathToFilename)(id); + const steps = filenameToSteps(filename); + const link2 = this.getResolvedLink(steps); + if (link2) { + const node2 = link2.getNode(); + if (node2.isDirectory()) + throw (0, util_1.createError)(EISDIR, "open", link2.getPath()); + } + fd = this.openSync(id, flagsNum); + } + try { + result = (0, util_1.bufferToEncoding)(this.getFileByFdOrThrow(fd).getBuffer(), encoding2); + } finally { + if (!userOwnsFd) { + this.closeSync(fd); + } + } + return result; + } + readFileSync(file, options2) { + const opts = (0, options_1.getReadFileOptions)(options2); + const flagsNum = (0, util_1.flagsToNumber)(opts.flag); + return this.readFileBase(file, flagsNum, opts.encoding); + } + readFile(id, a, b) { + const [opts, callback] = (0, options_1.optsAndCbGenerator)(options_1.getReadFileOptions)(a, b); + const flagsNum = (0, util_1.flagsToNumber)(opts.flag); + this.wrapAsync(this.readFileBase, [id, flagsNum, opts.encoding], callback); + } + writeBase(fd, buf, offset2, length, position) { + const file = this.getFileByFdOrThrow(fd, "write"); + if (file.node.isSymlink()) { + throw (0, util_1.createError)(EBADF, "write", file.link.getPath()); + } + return file.write(buf, offset2, length, position === -1 || typeof position !== "number" ? void 0 : position); + } + writeSync(fd, a, b, c, d) { + const [, buf, offset2, length, position] = (0, util_1.getWriteSyncArgs)(fd, a, b, c, d); + return this.writeBase(fd, buf, offset2, length, position); + } + write(fd, a, b, c, d, e) { + const [, asStr, buf, offset2, length, position, cb] = (0, util_1.getWriteArgs)(fd, a, b, c, d, e); + (0, setImmediate_1.default)(() => { + try { + const bytes = this.writeBase(fd, buf, offset2, length, position); + if (!asStr) { + cb(null, bytes, buf); + } else { + cb(null, bytes, a); + } + } catch (err) { + cb(err); + } + }); + } + writevBase(fd, buffers, position) { + const file = this.getFileByFdOrThrow(fd); + let p = position !== null && position !== void 0 ? position : void 0; + if (p === -1) { + p = void 0; + } + let bytesWritten = 0; + for (const buffer2 of buffers) { + const nodeBuf = buffer_1.Buffer.from(buffer2.buffer, buffer2.byteOffset, buffer2.byteLength); + const bytes = file.write(nodeBuf, 0, nodeBuf.byteLength, p); + p = void 0; + bytesWritten += bytes; + if (bytes < nodeBuf.byteLength) + break; + } + return bytesWritten; + } + writev(fd, buffers, a, b) { + let position = a; + let callback = b; + if (typeof a === "function") { + position = null; + callback = a; + } + (0, util_1.validateCallback)(callback); + (0, setImmediate_1.default)(() => { + try { + const bytes = this.writevBase(fd, buffers, position); + callback(null, bytes, buffers); + } catch (err) { + callback(err); + } + }); + } + writevSync(fd, buffers, position) { + (0, util_1.validateFd)(fd); + return this.writevBase(fd, buffers, position); + } + writeFileBase(id, buf, flagsNum, modeNum) { + const isUserFd = typeof id === "number"; + let fd; + if (isUserFd) + fd = id; + else { + fd = this.openBase((0, util_1.pathToFilename)(id), flagsNum, modeNum); + } + let offset2 = 0; + let length = buf.length; + let position = flagsNum & O_APPEND ? void 0 : 0; + try { + while (length > 0) { + const written = this.writeSync(fd, buf, offset2, length, position); + offset2 += written; + length -= written; + if (position !== void 0) + position += written; + } + } finally { + if (!isUserFd) + this.closeSync(fd); + } + } + writeFileSync(id, data2, options2) { + const opts = (0, options_1.getWriteFileOptions)(options2); + const flagsNum = (0, util_1.flagsToNumber)(opts.flag); + const modeNum = (0, util_1.modeToNumber)(opts.mode); + const buf = (0, util_1.dataToBuffer)(data2, opts.encoding); + this.writeFileBase(id, buf, flagsNum, modeNum); + } + writeFile(id, data2, a, b) { + let options2 = a; + let callback = b; + if (typeof a === "function") { + options2 = options_1.writeFileDefaults; + callback = a; + } + const cb = (0, util_1.validateCallback)(callback); + const opts = (0, options_1.getWriteFileOptions)(options2); + const flagsNum = (0, util_1.flagsToNumber)(opts.flag); + const modeNum = (0, util_1.modeToNumber)(opts.mode); + const buf = (0, util_1.dataToBuffer)(data2, opts.encoding); + this.wrapAsync(this.writeFileBase, [id, buf, flagsNum, modeNum], cb); + } + linkBase(filename1, filename2) { + const steps1 = filenameToSteps(filename1); + const link1 = this.getLink(steps1); + if (!link1) + throw (0, util_1.createError)(ENOENT, "link", filename1, filename2); + const steps2 = filenameToSteps(filename2); + const dir2 = this.getLinkParent(steps2); + if (!dir2) + throw (0, util_1.createError)(ENOENT, "link", filename1, filename2); + const name = steps2[steps2.length - 1]; + if (dir2.getChild(name)) + throw (0, util_1.createError)(EEXIST, "link", filename1, filename2); + const node2 = link1.getNode(); + node2.nlink++; + dir2.createChild(name, node2); + } + copyFileBase(src2, dest, flags) { + const buf = this.readFileSync(src2); + if (flags & COPYFILE_EXCL) { + if (this.existsSync(dest)) { + throw (0, util_1.createError)(EEXIST, "copyFile", src2, dest); + } + } + if (flags & COPYFILE_FICLONE_FORCE) { + throw (0, util_1.createError)(ENOSYS, "copyFile", src2, dest); + } + this.writeFileBase( + dest, + buf, + constants_2.FLAGS.w, + 438 + /* MODE.DEFAULT */ + ); + } + copyFileSync(src2, dest, flags) { + const srcFilename = (0, util_1.pathToFilename)(src2); + const destFilename = (0, util_1.pathToFilename)(dest); + return this.copyFileBase(srcFilename, destFilename, (flags || 0) | 0); + } + copyFile(src2, dest, a, b) { + const srcFilename = (0, util_1.pathToFilename)(src2); + const destFilename = (0, util_1.pathToFilename)(dest); + let flags; + let callback; + if (typeof a === "function") { + flags = 0; + callback = a; + } else { + flags = a; + callback = b; + } + (0, util_1.validateCallback)(callback); + this.wrapAsync(this.copyFileBase, [srcFilename, destFilename, flags], callback); + } + linkSync(existingPath, newPath) { + const existingPathFilename = (0, util_1.pathToFilename)(existingPath); + const newPathFilename = (0, util_1.pathToFilename)(newPath); + this.linkBase(existingPathFilename, newPathFilename); + } + link(existingPath, newPath, callback) { + const existingPathFilename = (0, util_1.pathToFilename)(existingPath); + const newPathFilename = (0, util_1.pathToFilename)(newPath); + this.wrapAsync(this.linkBase, [existingPathFilename, newPathFilename], callback); + } + unlinkBase(filename) { + const steps = filenameToSteps(filename); + const link2 = this.getLink(steps); + if (!link2) + throw (0, util_1.createError)(ENOENT, "unlink", filename); + if (link2.length) + throw Error("Dir not empty..."); + this.deleteLink(link2); + const node2 = link2.getNode(); + node2.nlink--; + if (node2.nlink <= 0) { + this.deleteNode(node2); + } + } + unlinkSync(path2) { + const filename = (0, util_1.pathToFilename)(path2); + this.unlinkBase(filename); + } + unlink(path2, callback) { + const filename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.unlinkBase, [filename], callback); + } + symlinkBase(targetFilename, pathFilename) { + const pathSteps = filenameToSteps(pathFilename); + const dirLink = this.getLinkParent(pathSteps); + if (!dirLink) + throw (0, util_1.createError)(ENOENT, "symlink", targetFilename, pathFilename); + const name = pathSteps[pathSteps.length - 1]; + if (dirLink.getChild(name)) + throw (0, util_1.createError)(EEXIST, "symlink", targetFilename, pathFilename); + const symlink2 = dirLink.createChild(name); + symlink2.getNode().makeSymlink(filenameToSteps(targetFilename)); + return symlink2; + } + // `type` argument works only on Windows. + symlinkSync(target, path2, type2) { + const targetFilename = (0, util_1.pathToFilename)(target); + const pathFilename = (0, util_1.pathToFilename)(path2); + this.symlinkBase(targetFilename, pathFilename); + } + symlink(target, path2, a, b) { + const callback = (0, util_1.validateCallback)(typeof a === "function" ? a : b); + const targetFilename = (0, util_1.pathToFilename)(target); + const pathFilename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.symlinkBase, [targetFilename, pathFilename], callback); + } + realpathBase(filename, encoding2) { + const steps = filenameToSteps(filename); + const realLink = this.getResolvedLink(steps); + if (!realLink) + throw (0, util_1.createError)(ENOENT, "realpath", filename); + return (0, encoding_1.strToEncoding)(realLink.getPath() || "/", encoding2); + } + realpathSync(path2, options2) { + return this.realpathBase((0, util_1.pathToFilename)(path2), (0, options_1.getRealpathOptions)(options2).encoding); + } + realpath(path2, a, b) { + const [opts, callback] = (0, options_1.getRealpathOptsAndCb)(a, b); + const pathFilename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.realpathBase, [pathFilename, opts.encoding], callback); + } + lstatBase(filename, bigint = false, throwIfNoEntry = false) { + const link2 = this.getLink(filenameToSteps(filename)); + if (link2) { + return Stats_1.default.build(link2.getNode(), bigint); + } else if (!throwIfNoEntry) { + return void 0; + } else { + throw (0, util_1.createError)(ENOENT, "lstat", filename); + } + } + lstatSync(path2, options2) { + const { throwIfNoEntry = true, bigint = false } = (0, options_1.getStatOptions)(options2); + return this.lstatBase((0, util_1.pathToFilename)(path2), bigint, throwIfNoEntry); + } + lstat(path2, a, b) { + const [{ throwIfNoEntry = true, bigint = false }, callback] = (0, options_1.getStatOptsAndCb)(a, b); + this.wrapAsync(this.lstatBase, [(0, util_1.pathToFilename)(path2), bigint, throwIfNoEntry], callback); + } + statBase(filename, bigint = false, throwIfNoEntry = true) { + const link2 = this.getResolvedLink(filenameToSteps(filename)); + if (link2) { + return Stats_1.default.build(link2.getNode(), bigint); + } else if (!throwIfNoEntry) { + return void 0; + } else { + throw (0, util_1.createError)(ENOENT, "stat", filename); + } + } + statSync(path2, options2) { + const { bigint = true, throwIfNoEntry = true } = (0, options_1.getStatOptions)(options2); + return this.statBase((0, util_1.pathToFilename)(path2), bigint, throwIfNoEntry); + } + stat(path2, a, b) { + const [{ bigint = false, throwIfNoEntry = true }, callback] = (0, options_1.getStatOptsAndCb)(a, b); + this.wrapAsync(this.statBase, [(0, util_1.pathToFilename)(path2), bigint, throwIfNoEntry], callback); + } + fstatBase(fd, bigint = false) { + const file = this.getFileByFd(fd); + if (!file) + throw (0, util_1.createError)(EBADF, "fstat"); + return Stats_1.default.build(file.node, bigint); + } + fstatSync(fd, options2) { + return this.fstatBase(fd, (0, options_1.getStatOptions)(options2).bigint); + } + fstat(fd, a, b) { + const [opts, callback] = (0, options_1.getStatOptsAndCb)(a, b); + this.wrapAsync(this.fstatBase, [fd, opts.bigint], callback); + } + renameBase(oldPathFilename, newPathFilename) { + const link2 = this.getLink(filenameToSteps(oldPathFilename)); + if (!link2) + throw (0, util_1.createError)(ENOENT, "rename", oldPathFilename, newPathFilename); + const newPathSteps = filenameToSteps(newPathFilename); + const newPathDirLink = this.getLinkParent(newPathSteps); + if (!newPathDirLink) + throw (0, util_1.createError)(ENOENT, "rename", oldPathFilename, newPathFilename); + const oldLinkParent = link2.parent; + if (oldLinkParent) { + oldLinkParent.deleteChild(link2); + } + const name = newPathSteps[newPathSteps.length - 1]; + link2.name = name; + link2.steps = [...newPathDirLink.steps, name]; + newPathDirLink.setChild(link2.getName(), link2); + } + renameSync(oldPath, newPath) { + const oldPathFilename = (0, util_1.pathToFilename)(oldPath); + const newPathFilename = (0, util_1.pathToFilename)(newPath); + this.renameBase(oldPathFilename, newPathFilename); + } + rename(oldPath, newPath, callback) { + const oldPathFilename = (0, util_1.pathToFilename)(oldPath); + const newPathFilename = (0, util_1.pathToFilename)(newPath); + this.wrapAsync(this.renameBase, [oldPathFilename, newPathFilename], callback); + } + existsBase(filename) { + return !!this.statBase(filename); + } + existsSync(path2) { + try { + return this.existsBase((0, util_1.pathToFilename)(path2)); + } catch (err) { + return false; + } + } + exists(path2, callback) { + const filename = (0, util_1.pathToFilename)(path2); + if (typeof callback !== "function") + throw Error(constants_2.ERRSTR.CB); + (0, setImmediate_1.default)(() => { + try { + callback(this.existsBase(filename)); + } catch (err) { + callback(false); + } + }); + } + accessBase(filename, mode) { + this.getLinkOrThrow(filename, "access"); + } + accessSync(path2, mode = F_OK) { + const filename = (0, util_1.pathToFilename)(path2); + mode = mode | 0; + this.accessBase(filename, mode); + } + access(path2, a, b) { + let mode = F_OK; + let callback; + if (typeof a !== "function") { + mode = a | 0; + callback = (0, util_1.validateCallback)(b); + } else { + callback = a; + } + const filename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.accessBase, [filename, mode], callback); + } + appendFileSync(id, data2, options2) { + const opts = (0, options_1.getAppendFileOpts)(options2); + if (!opts.flag || (0, util_1.isFd)(id)) + opts.flag = "a"; + this.writeFileSync(id, data2, opts); + } + appendFile(id, data2, a, b) { + const [opts, callback] = (0, options_1.getAppendFileOptsAndCb)(a, b); + if (!opts.flag || (0, util_1.isFd)(id)) + opts.flag = "a"; + this.writeFile(id, data2, opts, callback); + } + readdirBase(filename, options2) { + const steps = filenameToSteps(filename); + const link2 = this.getResolvedLink(steps); + if (!link2) + throw (0, util_1.createError)(ENOENT, "readdir", filename); + const node2 = link2.getNode(); + if (!node2.isDirectory()) + throw (0, util_1.createError)(ENOTDIR, "scandir", filename); + const list = []; + for (const name of link2.children.keys()) { + const child = link2.getChild(name); + if (!child || name === "." || name === "..") + continue; + list.push(Dirent_1.default.build(child, options2.encoding)); + if (options2.recursive && child.children.size) { + const recurseOptions = Object.assign(Object.assign({}, options2), { recursive: true, withFileTypes: true }); + const childList = this.readdirBase(child.getPath(), recurseOptions); + list.push(...childList); + } + } + if (!util_1.isWin && options2.encoding !== "buffer") + list.sort((a, b) => { + if (a.name < b.name) + return -1; + if (a.name > b.name) + return 1; + return 0; + }); + if (options2.withFileTypes) + return list; + let filename2 = filename; + if (util_1.isWin) { + filename2 = filename2.replace(/\\/g, "/"); + } + return list.map((dirent) => { + if (options2.recursive) { + return dirent.path.replace(filename2 + pathModule.posix.sep, ""); + } + return dirent.name; + }); + } + readdirSync(path2, options2) { + const opts = (0, options_1.getReaddirOptions)(options2); + const filename = (0, util_1.pathToFilename)(path2); + return this.readdirBase(filename, opts); + } + readdir(path2, a, b) { + const [options2, callback] = (0, options_1.getReaddirOptsAndCb)(a, b); + const filename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.readdirBase, [filename, options2], callback); + } + readlinkBase(filename, encoding2) { + const link2 = this.getLinkOrThrow(filename, "readlink"); + const node2 = link2.getNode(); + if (!node2.isSymlink()) + throw (0, util_1.createError)(EINVAL, "readlink", filename); + const str = sep + node2.symlink.join(sep); + return (0, encoding_1.strToEncoding)(str, encoding2); + } + readlinkSync(path2, options2) { + const opts = (0, options_1.getDefaultOpts)(options2); + const filename = (0, util_1.pathToFilename)(path2); + return this.readlinkBase(filename, opts.encoding); + } + readlink(path2, a, b) { + const [opts, callback] = (0, options_1.getDefaultOptsAndCb)(a, b); + const filename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.readlinkBase, [filename, opts.encoding], callback); + } + fsyncBase(fd) { + this.getFileByFdOrThrow(fd, "fsync"); + } + fsyncSync(fd) { + this.fsyncBase(fd); + } + fsync(fd, callback) { + this.wrapAsync(this.fsyncBase, [fd], callback); + } + fdatasyncBase(fd) { + this.getFileByFdOrThrow(fd, "fdatasync"); + } + fdatasyncSync(fd) { + this.fdatasyncBase(fd); + } + fdatasync(fd, callback) { + this.wrapAsync(this.fdatasyncBase, [fd], callback); + } + ftruncateBase(fd, len) { + const file = this.getFileByFdOrThrow(fd, "ftruncate"); + file.truncate(len); + } + ftruncateSync(fd, len) { + this.ftruncateBase(fd, len); + } + ftruncate(fd, a, b) { + const len = typeof a === "number" ? a : 0; + const callback = (0, util_1.validateCallback)(typeof a === "number" ? b : a); + this.wrapAsync(this.ftruncateBase, [fd, len], callback); + } + truncateBase(path2, len) { + const fd = this.openSync(path2, "r+"); + try { + this.ftruncateSync(fd, len); + } finally { + this.closeSync(fd); + } + } + /** + * `id` should be a file descriptor or a path. `id` as file descriptor will + * not be supported soon. + */ + truncateSync(id, len) { + if ((0, util_1.isFd)(id)) + return this.ftruncateSync(id, len); + this.truncateBase(id, len); + } + truncate(id, a, b) { + const len = typeof a === "number" ? a : 0; + const callback = (0, util_1.validateCallback)(typeof a === "number" ? b : a); + if ((0, util_1.isFd)(id)) + return this.ftruncate(id, len, callback); + this.wrapAsync(this.truncateBase, [id, len], callback); + } + futimesBase(fd, atime, mtime) { + const file = this.getFileByFdOrThrow(fd, "futimes"); + const node2 = file.node; + node2.atime = new Date(atime * 1e3); + node2.mtime = new Date(mtime * 1e3); + } + futimesSync(fd, atime, mtime) { + this.futimesBase(fd, toUnixTimestamp(atime), toUnixTimestamp(mtime)); + } + futimes(fd, atime, mtime, callback) { + this.wrapAsync(this.futimesBase, [fd, toUnixTimestamp(atime), toUnixTimestamp(mtime)], callback); + } + utimesBase(filename, atime, mtime) { + const fd = this.openSync(filename, "r"); + try { + this.futimesBase(fd, atime, mtime); + } finally { + this.closeSync(fd); + } + } + utimesSync(path2, atime, mtime) { + this.utimesBase((0, util_1.pathToFilename)(path2), toUnixTimestamp(atime), toUnixTimestamp(mtime)); + } + utimes(path2, atime, mtime, callback) { + this.wrapAsync(this.utimesBase, [(0, util_1.pathToFilename)(path2), toUnixTimestamp(atime), toUnixTimestamp(mtime)], callback); + } + mkdirBase(filename, modeNum) { + const steps = filenameToSteps(filename); + if (!steps.length) { + throw (0, util_1.createError)(EEXIST, "mkdir", filename); + } + const dir = this.getLinkParentAsDirOrThrow(filename, "mkdir"); + const name = steps[steps.length - 1]; + if (dir.getChild(name)) + throw (0, util_1.createError)(EEXIST, "mkdir", filename); + dir.createChild(name, this.createNode(true, modeNum)); + } + /** + * Creates directory tree recursively. + * @param filename + * @param modeNum + */ + mkdirpBase(filename, modeNum) { + const fullPath = resolve(filename); + const fullPathSansSlash = fullPath.substring(1); + const steps = !fullPathSansSlash ? [] : fullPathSansSlash.split(sep); + let link2 = this.root; + let created = false; + for (let i = 0; i < steps.length; i++) { + const step = steps[i]; + if (!link2.getNode().isDirectory()) + throw (0, util_1.createError)(ENOTDIR, "mkdir", link2.getPath()); + const child = link2.getChild(step); + if (child) { + if (child.getNode().isDirectory()) + link2 = child; + else + throw (0, util_1.createError)(ENOTDIR, "mkdir", child.getPath()); + } else { + link2 = link2.createChild(step, this.createNode(true, modeNum)); + created = true; + } + } + return created ? fullPath : void 0; + } + mkdirSync(path2, options2) { + const opts = (0, options_1.getMkdirOptions)(options2); + const modeNum = (0, util_1.modeToNumber)(opts.mode, 511); + const filename = (0, util_1.pathToFilename)(path2); + if (opts.recursive) + return this.mkdirpBase(filename, modeNum); + this.mkdirBase(filename, modeNum); + } + mkdir(path2, a, b) { + const opts = (0, options_1.getMkdirOptions)(a); + const callback = (0, util_1.validateCallback)(typeof a === "function" ? a : b); + const modeNum = (0, util_1.modeToNumber)(opts.mode, 511); + const filename = (0, util_1.pathToFilename)(path2); + if (opts.recursive) + this.wrapAsync(this.mkdirpBase, [filename, modeNum], callback); + else + this.wrapAsync(this.mkdirBase, [filename, modeNum], callback); + } + mkdtempBase(prefix, encoding2, retry2 = 5) { + const filename = prefix + (0, util_1.genRndStr6)(); + try { + this.mkdirBase( + filename, + 511 + /* MODE.DIR */ + ); + return (0, encoding_1.strToEncoding)(filename, encoding2); + } catch (err) { + if (err.code === EEXIST) { + if (retry2 > 1) + return this.mkdtempBase(prefix, encoding2, retry2 - 1); + else + throw Error("Could not create temp dir."); + } else + throw err; + } + } + mkdtempSync(prefix, options2) { + const { encoding: encoding2 } = (0, options_1.getDefaultOpts)(options2); + if (!prefix || typeof prefix !== "string") + throw new TypeError("filename prefix is required"); + (0, util_1.nullCheck)(prefix); + return this.mkdtempBase(prefix, encoding2); + } + mkdtemp(prefix, a, b) { + const [{ encoding: encoding2 }, callback] = (0, options_1.getDefaultOptsAndCb)(a, b); + if (!prefix || typeof prefix !== "string") + throw new TypeError("filename prefix is required"); + if (!(0, util_1.nullCheck)(prefix)) + return; + this.wrapAsync(this.mkdtempBase, [prefix, encoding2], callback); + } + rmdirBase(filename, options2) { + const opts = (0, options_1.getRmdirOptions)(options2); + const link2 = this.getLinkAsDirOrThrow(filename, "rmdir"); + if (link2.length && !opts.recursive) + throw (0, util_1.createError)(ENOTEMPTY, "rmdir", filename); + this.deleteLink(link2); + } + rmdirSync(path2, options2) { + this.rmdirBase((0, util_1.pathToFilename)(path2), options2); + } + rmdir(path2, a, b) { + const opts = (0, options_1.getRmdirOptions)(a); + const callback = (0, util_1.validateCallback)(typeof a === "function" ? a : b); + this.wrapAsync(this.rmdirBase, [(0, util_1.pathToFilename)(path2), opts], callback); + } + rmBase(filename, options2 = {}) { + const link2 = this.getResolvedLink(filename); + if (!link2) { + if (!options2.force) + throw (0, util_1.createError)(ENOENT, "stat", filename); + return; + } + if (link2.getNode().isDirectory()) { + if (!options2.recursive) { + throw (0, util_1.createError)(ERR_FS_EISDIR, "rm", filename); + } + } + this.deleteLink(link2); + } + rmSync(path2, options2) { + this.rmBase((0, util_1.pathToFilename)(path2), options2); + } + rm(path2, a, b) { + const [opts, callback] = (0, options_1.getRmOptsAndCb)(a, b); + this.wrapAsync(this.rmBase, [(0, util_1.pathToFilename)(path2), opts], callback); + } + fchmodBase(fd, modeNum) { + const file = this.getFileByFdOrThrow(fd, "fchmod"); + file.chmod(modeNum); + } + fchmodSync(fd, mode) { + this.fchmodBase(fd, (0, util_1.modeToNumber)(mode)); + } + fchmod(fd, mode, callback) { + this.wrapAsync(this.fchmodBase, [fd, (0, util_1.modeToNumber)(mode)], callback); + } + chmodBase(filename, modeNum) { + const fd = this.openSync(filename, "r"); + try { + this.fchmodBase(fd, modeNum); + } finally { + this.closeSync(fd); + } + } + chmodSync(path2, mode) { + const modeNum = (0, util_1.modeToNumber)(mode); + const filename = (0, util_1.pathToFilename)(path2); + this.chmodBase(filename, modeNum); + } + chmod(path2, mode, callback) { + const modeNum = (0, util_1.modeToNumber)(mode); + const filename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.chmodBase, [filename, modeNum], callback); + } + lchmodBase(filename, modeNum) { + const fd = this.openBase(filename, O_RDWR, 0, false); + try { + this.fchmodBase(fd, modeNum); + } finally { + this.closeSync(fd); + } + } + lchmodSync(path2, mode) { + const modeNum = (0, util_1.modeToNumber)(mode); + const filename = (0, util_1.pathToFilename)(path2); + this.lchmodBase(filename, modeNum); + } + lchmod(path2, mode, callback) { + const modeNum = (0, util_1.modeToNumber)(mode); + const filename = (0, util_1.pathToFilename)(path2); + this.wrapAsync(this.lchmodBase, [filename, modeNum], callback); + } + fchownBase(fd, uid, gid) { + this.getFileByFdOrThrow(fd, "fchown").chown(uid, gid); + } + fchownSync(fd, uid, gid) { + validateUid(uid); + validateGid(gid); + this.fchownBase(fd, uid, gid); + } + fchown(fd, uid, gid, callback) { + validateUid(uid); + validateGid(gid); + this.wrapAsync(this.fchownBase, [fd, uid, gid], callback); + } + chownBase(filename, uid, gid) { + const link2 = this.getResolvedLinkOrThrow(filename, "chown"); + const node2 = link2.getNode(); + node2.chown(uid, gid); + } + chownSync(path2, uid, gid) { + validateUid(uid); + validateGid(gid); + this.chownBase((0, util_1.pathToFilename)(path2), uid, gid); + } + chown(path2, uid, gid, callback) { + validateUid(uid); + validateGid(gid); + this.wrapAsync(this.chownBase, [(0, util_1.pathToFilename)(path2), uid, gid], callback); + } + lchownBase(filename, uid, gid) { + this.getLinkOrThrow(filename, "lchown").getNode().chown(uid, gid); + } + lchownSync(path2, uid, gid) { + validateUid(uid); + validateGid(gid); + this.lchownBase((0, util_1.pathToFilename)(path2), uid, gid); + } + lchown(path2, uid, gid, callback) { + validateUid(uid); + validateGid(gid); + this.wrapAsync(this.lchownBase, [(0, util_1.pathToFilename)(path2), uid, gid], callback); + } + watchFile(path2, a, b) { + const filename = (0, util_1.pathToFilename)(path2); + let options2 = a; + let listener = b; + if (typeof options2 === "function") { + listener = a; + options2 = null; + } + if (typeof listener !== "function") { + throw Error('"watchFile()" requires a listener function'); + } + let interval = 5007; + let persistent = true; + if (options2 && typeof options2 === "object") { + if (typeof options2.interval === "number") + interval = options2.interval; + if (typeof options2.persistent === "boolean") + persistent = options2.persistent; + } + let watcher = this.statWatchers[filename]; + if (!watcher) { + watcher = new this.StatWatcher(); + watcher.start(filename, persistent, interval); + this.statWatchers[filename] = watcher; + } + watcher.addListener("change", listener); + return watcher; + } + unwatchFile(path2, listener) { + const filename = (0, util_1.pathToFilename)(path2); + const watcher = this.statWatchers[filename]; + if (!watcher) + return; + if (typeof listener === "function") { + watcher.removeListener("change", listener); + } else { + watcher.removeAllListeners("change"); + } + if (watcher.listenerCount("change") === 0) { + watcher.stop(); + delete this.statWatchers[filename]; + } + } + createReadStream(path2, options2) { + return new this.ReadStream(path2, options2); + } + createWriteStream(path2, options2) { + return new this.WriteStream(path2, options2); + } + // watch(path: PathLike): FSWatcher; + // watch(path: PathLike, options?: IWatchOptions | string): FSWatcher; + watch(path2, options2, listener) { + const filename = (0, util_1.pathToFilename)(path2); + let givenOptions = options2; + if (typeof options2 === "function") { + listener = options2; + givenOptions = null; + } + let { persistent, recursive, encoding: encoding2 } = (0, options_1.getDefaultOpts)(givenOptions); + if (persistent === void 0) + persistent = true; + if (recursive === void 0) + recursive = false; + const watcher = new this.FSWatcher(); + watcher.start(filename, persistent, recursive, encoding2); + if (listener) { + watcher.addListener("change", listener); + } + return watcher; + } + } + volume.Volume = Volume; + Volume.fd = 2147483647; + function emitStop(self2) { + self2.emit("stop"); + } + class StatWatcher extends events_1.EventEmitter { + constructor(vol) { + super(); + this.onInterval = () => { + try { + const stats = this.vol.statSync(this.filename); + if (this.hasChanged(stats)) { + this.emit("change", stats, this.prev); + this.prev = stats; + } + } finally { + this.loop(); + } + }; + this.vol = vol; + } + loop() { + this.timeoutRef = this.setTimeout(this.onInterval, this.interval); + } + hasChanged(stats) { + if (stats.mtimeMs > this.prev.mtimeMs) + return true; + if (stats.nlink !== this.prev.nlink) + return true; + return false; + } + start(path2, persistent = true, interval = 5007) { + this.filename = (0, util_1.pathToFilename)(path2); + this.setTimeout = persistent ? setTimeout.bind(typeof globalThis !== "undefined" ? globalThis : commonjsGlobal) : setTimeoutUnref_1.default; + this.interval = interval; + this.prev = this.vol.statSync(this.filename); + this.loop(); + } + stop() { + clearTimeout(this.timeoutRef); + (0, queueMicrotask_1.default)(() => { + emitStop.call(this, this); + }); + } + } + volume.StatWatcher = StatWatcher; + var pool; + function allocNewPool(poolSize) { + pool = (0, buffer_1.bufferAllocUnsafe)(poolSize); + pool.used = 0; + } + util2.inherits(FsReadStream, stream_1.Readable); + volume.ReadStream = FsReadStream; + function FsReadStream(vol, path2, options2) { + if (!(this instanceof FsReadStream)) + return new FsReadStream(vol, path2, options2); + this._vol = vol; + options2 = Object.assign({}, (0, options_1.getOptions)(options2, {})); + if (options2.highWaterMark === void 0) + options2.highWaterMark = 64 * 1024; + stream_1.Readable.call(this, options2); + this.path = (0, util_1.pathToFilename)(path2); + this.fd = options2.fd === void 0 ? null : options2.fd; + this.flags = options2.flags === void 0 ? "r" : options2.flags; + this.mode = options2.mode === void 0 ? 438 : options2.mode; + this.start = options2.start; + this.end = options2.end; + this.autoClose = options2.autoClose === void 0 ? true : options2.autoClose; + this.pos = void 0; + this.bytesRead = 0; + if (this.start !== void 0) { + if (typeof this.start !== "number") { + throw new TypeError('"start" option must be a Number'); + } + if (this.end === void 0) { + this.end = Infinity; + } else if (typeof this.end !== "number") { + throw new TypeError('"end" option must be a Number'); + } + if (this.start > this.end) { + throw new Error('"start" option must be <= "end" option'); + } + this.pos = this.start; + } + if (typeof this.fd !== "number") + this.open(); + this.on("end", function() { + if (this.autoClose) { + if (this.destroy) + this.destroy(); + } + }); + } + FsReadStream.prototype.open = function() { + var self2 = this; + this._vol.open(this.path, this.flags, this.mode, (er, fd) => { + if (er) { + if (self2.autoClose) { + if (self2.destroy) + self2.destroy(); + } + self2.emit("error", er); + return; + } + self2.fd = fd; + self2.emit("open", fd); + self2.read(); + }); + }; + FsReadStream.prototype._read = function(n) { + if (typeof this.fd !== "number") { + return this.once("open", function() { + this._read(n); + }); + } + if (this.destroyed) + return; + if (!pool || pool.length - pool.used < kMinPoolSpace) { + allocNewPool(this._readableState.highWaterMark); + } + var thisPool = pool; + var toRead = Math.min(pool.length - pool.used, n); + var start = pool.used; + if (this.pos !== void 0) + toRead = Math.min(this.end - this.pos + 1, toRead); + if (toRead <= 0) + return this.push(null); + var self2 = this; + this._vol.read(this.fd, pool, pool.used, toRead, this.pos, onread); + if (this.pos !== void 0) + this.pos += toRead; + pool.used += toRead; + function onread(er, bytesRead) { + if (er) { + if (self2.autoClose && self2.destroy) { + self2.destroy(); + } + self2.emit("error", er); + } else { + var b = null; + if (bytesRead > 0) { + self2.bytesRead += bytesRead; + b = thisPool.slice(start, start + bytesRead); + } + self2.push(b); + } + } + }; + FsReadStream.prototype._destroy = function(err, cb) { + this.close((err2) => { + cb(err || err2); + }); + }; + FsReadStream.prototype.close = function(cb) { + var _a2; + if (cb) + this.once("close", cb); + if (this.closed || typeof this.fd !== "number") { + if (typeof this.fd !== "number") { + this.once("open", closeOnOpen); + return; + } + return (0, queueMicrotask_1.default)(() => this.emit("close")); + } + if (typeof ((_a2 = this._readableState) === null || _a2 === void 0 ? void 0 : _a2.closed) === "boolean") { + this._readableState.closed = true; + } else { + this.closed = true; + } + this._vol.close(this.fd, (er) => { + if (er) + this.emit("error", er); + else + this.emit("close"); + }); + this.fd = null; + }; + function closeOnOpen(fd) { + this.close(); + } + util2.inherits(FsWriteStream, stream_1.Writable); + volume.WriteStream = FsWriteStream; + function FsWriteStream(vol, path2, options2) { + if (!(this instanceof FsWriteStream)) + return new FsWriteStream(vol, path2, options2); + this._vol = vol; + options2 = Object.assign({}, (0, options_1.getOptions)(options2, {})); + stream_1.Writable.call(this, options2); + this.path = (0, util_1.pathToFilename)(path2); + this.fd = options2.fd === void 0 ? null : options2.fd; + this.flags = options2.flags === void 0 ? "w" : options2.flags; + this.mode = options2.mode === void 0 ? 438 : options2.mode; + this.start = options2.start; + this.autoClose = options2.autoClose === void 0 ? true : !!options2.autoClose; + this.pos = void 0; + this.bytesWritten = 0; + this.pending = true; + if (this.start !== void 0) { + if (typeof this.start !== "number") { + throw new TypeError('"start" option must be a Number'); + } + if (this.start < 0) { + throw new Error('"start" must be >= zero'); + } + this.pos = this.start; + } + if (options2.encoding) + this.setDefaultEncoding(options2.encoding); + if (typeof this.fd !== "number") + this.open(); + this.once("finish", function() { + if (this.autoClose) { + this.close(); + } + }); + } + FsWriteStream.prototype.open = function() { + this._vol.open(this.path, this.flags, this.mode, (function(er, fd) { + if (er) { + if (this.autoClose && this.destroy) { + this.destroy(); + } + this.emit("error", er); + return; + } + this.fd = fd; + this.pending = false; + this.emit("open", fd); + }).bind(this)); + }; + FsWriteStream.prototype._write = function(data2, encoding2, cb) { + if (!(data2 instanceof buffer_1.Buffer || data2 instanceof Uint8Array)) + return this.emit("error", new Error("Invalid data")); + if (typeof this.fd !== "number") { + return this.once("open", function() { + this._write(data2, encoding2, cb); + }); + } + var self2 = this; + this._vol.write(this.fd, data2, 0, data2.length, this.pos, (er, bytes) => { + if (er) { + if (self2.autoClose && self2.destroy) { + self2.destroy(); + } + return cb(er); + } + self2.bytesWritten += bytes; + cb(); + }); + if (this.pos !== void 0) + this.pos += data2.length; + }; + FsWriteStream.prototype._writev = function(data2, cb) { + if (typeof this.fd !== "number") { + return this.once("open", function() { + this._writev(data2, cb); + }); + } + const self2 = this; + const len = data2.length; + const chunks = new Array(len); + var size = 0; + for (var i = 0; i < len; i++) { + var chunk = data2[i].chunk; + chunks[i] = chunk; + size += chunk.length; + } + const buf = buffer_1.Buffer.concat(chunks); + this._vol.write(this.fd, buf, 0, buf.length, this.pos, (er, bytes) => { + if (er) { + if (self2.destroy) + self2.destroy(); + return cb(er); + } + self2.bytesWritten += bytes; + cb(); + }); + if (this.pos !== void 0) + this.pos += size; + }; + FsWriteStream.prototype.close = function(cb) { + var _a2; + if (cb) + this.once("close", cb); + if (this.closed || typeof this.fd !== "number") { + if (typeof this.fd !== "number") { + this.once("open", closeOnOpen); + return; + } + return (0, queueMicrotask_1.default)(() => this.emit("close")); + } + if (typeof ((_a2 = this._writableState) === null || _a2 === void 0 ? void 0 : _a2.closed) === "boolean") { + this._writableState.closed = true; + } else { + this.closed = true; + } + this._vol.close(this.fd, (er) => { + if (er) + this.emit("error", er); + else + this.emit("close"); + }); + this.fd = null; + }; + FsWriteStream.prototype._destroy = FsReadStream.prototype._destroy; + FsWriteStream.prototype.destroySoon = FsWriteStream.prototype.end; + class FSWatcher extends events_1.EventEmitter { + constructor(vol) { + super(); + this._filename = ""; + this._filenameEncoded = ""; + this._recursive = false; + this._encoding = encoding_1.ENCODING_UTF8; + this._listenerRemovers = /* @__PURE__ */ new Map(); + this._onParentChild = (link2) => { + if (link2.getName() === this._getName()) { + this._emit("rename"); + } + }; + this._emit = (type2) => { + this.emit("change", type2, this._filenameEncoded); + }; + this._persist = () => { + this._timer = setTimeout(this._persist, 1e6); + }; + this._vol = vol; + } + _getName() { + return this._steps[this._steps.length - 1]; + } + start(path2, persistent = true, recursive = false, encoding2 = encoding_1.ENCODING_UTF8) { + this._filename = (0, util_1.pathToFilename)(path2); + this._steps = filenameToSteps(this._filename); + this._filenameEncoded = (0, encoding_1.strToEncoding)(this._filename); + this._recursive = recursive; + this._encoding = encoding2; + try { + this._link = this._vol.getLinkOrThrow(this._filename, "FSWatcher"); + } catch (err) { + const error2 = new Error(`watch ${this._filename} ${err.code}`); + error2.code = err.code; + error2.errno = err.code; + throw error2; + } + const watchLinkNodeChanged = (link2) => { + var _a2; + const filepath = link2.getPath(); + const node2 = link2.getNode(); + const onNodeChange = () => { + let filename = relative(this._filename, filepath); + if (!filename) { + filename = this._getName(); + } + return this.emit("change", "change", filename); + }; + node2.on("change", onNodeChange); + const removers = (_a2 = this._listenerRemovers.get(node2.ino)) !== null && _a2 !== void 0 ? _a2 : []; + removers.push(() => node2.removeListener("change", onNodeChange)); + this._listenerRemovers.set(node2.ino, removers); + }; + const watchLinkChildrenChanged = (link2) => { + var _a2; + const node2 = link2.getNode(); + const onLinkChildAdd = (l) => { + this.emit("change", "rename", relative(this._filename, l.getPath())); + setTimeout(() => { + watchLinkNodeChanged(l); + watchLinkChildrenChanged(l); + }); + }; + const onLinkChildDelete = (l) => { + const removeLinkNodeListeners = (curLink) => { + const ino = curLink.getNode().ino; + const removers2 = this._listenerRemovers.get(ino); + if (removers2) { + removers2.forEach((r) => r()); + this._listenerRemovers.delete(ino); + } + for (const [name, childLink] of curLink.children.entries()) { + if (childLink && name !== "." && name !== "..") { + removeLinkNodeListeners(childLink); + } + } + }; + removeLinkNodeListeners(l); + this.emit("change", "rename", relative(this._filename, l.getPath())); + }; + for (const [name, childLink] of link2.children.entries()) { + if (childLink && name !== "." && name !== "..") { + watchLinkNodeChanged(childLink); + } + } + link2.on("child:add", onLinkChildAdd); + link2.on("child:delete", onLinkChildDelete); + const removers = (_a2 = this._listenerRemovers.get(node2.ino)) !== null && _a2 !== void 0 ? _a2 : []; + removers.push(() => { + link2.removeListener("child:add", onLinkChildAdd); + link2.removeListener("child:delete", onLinkChildDelete); + }); + if (recursive) { + for (const [name, childLink] of link2.children.entries()) { + if (childLink && name !== "." && name !== "..") { + watchLinkChildrenChanged(childLink); + } + } + } + }; + watchLinkNodeChanged(this._link); + watchLinkChildrenChanged(this._link); + const parent = this._link.parent; + if (parent) { + parent.setMaxListeners(parent.getMaxListeners() + 1); + parent.on("child:delete", this._onParentChild); + } + if (persistent) + this._persist(); + } + close() { + clearTimeout(this._timer); + this._listenerRemovers.forEach((removers) => { + removers.forEach((r) => r()); + }); + this._listenerRemovers.clear(); + const parent = this._link.parent; + if (parent) { + parent.removeListener("child:delete", this._onParentChild); + } + } + } + volume.FSWatcher = FSWatcher; + return volume; +} +var fsSynchronousApiList = {}; +var hasRequiredFsSynchronousApiList; +function requireFsSynchronousApiList() { + if (hasRequiredFsSynchronousApiList) return fsSynchronousApiList; + hasRequiredFsSynchronousApiList = 1; + Object.defineProperty(fsSynchronousApiList, "__esModule", { value: true }); + fsSynchronousApiList.fsSynchronousApiList = void 0; + fsSynchronousApiList.fsSynchronousApiList = [ + "accessSync", + "appendFileSync", + "chmodSync", + "chownSync", + "closeSync", + "copyFileSync", + "existsSync", + "fchmodSync", + "fchownSync", + "fdatasyncSync", + "fstatSync", + "fsyncSync", + "ftruncateSync", + "futimesSync", + "lchmodSync", + "lchownSync", + "linkSync", + "lstatSync", + "mkdirSync", + "mkdtempSync", + "openSync", + "readdirSync", + "readFileSync", + "readlinkSync", + "readSync", + "readvSync", + "realpathSync", + "renameSync", + "rmdirSync", + "rmSync", + "statSync", + "symlinkSync", + "truncateSync", + "unlinkSync", + "utimesSync", + "writeFileSync", + "writeSync", + "writevSync" + // 'cpSync', + // 'lutimesSync', + // 'statfsSync', + ]; + return fsSynchronousApiList; +} +var fsCallbackApiList = {}; +var hasRequiredFsCallbackApiList; +function requireFsCallbackApiList() { + if (hasRequiredFsCallbackApiList) return fsCallbackApiList; + hasRequiredFsCallbackApiList = 1; + Object.defineProperty(fsCallbackApiList, "__esModule", { value: true }); + fsCallbackApiList.fsCallbackApiList = void 0; + fsCallbackApiList.fsCallbackApiList = [ + "access", + "appendFile", + "chmod", + "chown", + "close", + "copyFile", + "createReadStream", + "createWriteStream", + "exists", + "fchmod", + "fchown", + "fdatasync", + "fstat", + "fsync", + "ftruncate", + "futimes", + "lchmod", + "lchown", + "link", + "lstat", + "mkdir", + "mkdtemp", + "open", + "read", + "readv", + "readdir", + "readFile", + "readlink", + "realpath", + "rename", + "rm", + "rmdir", + "stat", + "symlink", + "truncate", + "unlink", + "unwatchFile", + "utimes", + "watch", + "watchFile", + "write", + "writev", + "writeFile" + ]; + return fsCallbackApiList; +} +var hasRequiredLib$1; +function requireLib$1() { + if (hasRequiredLib$1) return lib$2.exports; + hasRequiredLib$1 = 1; + (function(module, exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.memfs = exports.fs = exports.createFsFromVolume = exports.vol = exports.Volume = void 0; + const Stats_1 = requireStats(); + const Dirent_1 = requireDirent(); + const volume_1 = requireVolume(); + const constants_1 = requireConstants$7(); + const fsSynchronousApiList_1 = requireFsSynchronousApiList(); + const fsCallbackApiList_1 = requireFsCallbackApiList(); + const { F_OK, R_OK, W_OK, X_OK } = constants_1.constants; + exports.Volume = volume_1.Volume; + exports.vol = new volume_1.Volume(); + function createFsFromVolume(vol) { + const fs2 = { F_OK, R_OK, W_OK, X_OK, constants: constants_1.constants, Stats: Stats_1.default, Dirent: Dirent_1.default }; + for (const method of fsSynchronousApiList_1.fsSynchronousApiList) + if (typeof vol[method] === "function") + fs2[method] = vol[method].bind(vol); + for (const method of fsCallbackApiList_1.fsCallbackApiList) + if (typeof vol[method] === "function") + fs2[method] = vol[method].bind(vol); + fs2.StatWatcher = vol.StatWatcher; + fs2.FSWatcher = vol.FSWatcher; + fs2.WriteStream = vol.WriteStream; + fs2.ReadStream = vol.ReadStream; + fs2.promises = vol.promises; + fs2._toUnixTimestamp = volume_1.toUnixTimestamp; + fs2.__vol = vol; + return fs2; + } + exports.createFsFromVolume = createFsFromVolume; + exports.fs = createFsFromVolume(exports.vol); + const memfs = (json = {}, cwd = "/") => { + const vol = exports.Volume.fromNestedJSON(json, cwd); + const fs2 = createFsFromVolume(vol); + return { fs: fs2, vol }; + }; + exports.memfs = memfs; + module.exports = Object.assign(Object.assign({}, module.exports), exports.fs); + module.exports.semantic = true; + })(lib$2, lib$2.exports); + return lib$2.exports; +} +var libExports$1 = requireLib$1(); +const { fs } = libExports$1.memfs({ "/tmp": null }); +const { + appendFile, + appendFileSync, + access, + accessSync, + chown, + chownSync, + chmod, + chmodSync, + close, + closeSync, + copyFile, + copyFileSync, + cp, + cpSync, + createReadStream, + createWriteStream, + exists, + existsSync, + fchown, + fchownSync, + fchmod, + fchmodSync, + fdatasync, + fdatasyncSync, + fstat, + fstatSync, + fsync, + fsyncSync, + ftruncate, + ftruncateSync, + futimes, + futimesSync, + lchown, + lchownSync, + lchmod, + lchmodSync, + link, + linkSync, + lstat, + lstatSync, + lutimes, + lutimesSync, + mkdir, + mkdirSync, + mkdtemp, + mkdtempSync, + open: open$2, + openSync, + opendir, + opendirSync, + readdir, + readdirSync, + read, + readSync, + readv, + readvSync, + readFile, + readFileSync, + readlink, + readlinkSync, + realpath, + realpathSync, + rename, + renameSync, + rm, + rmSync, + rmdir, + rmdirSync, + stat, + statfs, + statSync, + statfsSync, + symlink, + symlinkSync, + truncate, + truncateSync, + unwatchFile, + unlink, + unlinkSync, + utimes, + utimesSync, + watch, + watchFile, + writeFile, + writeFileSync, + write, + writeSync, + writev, + writevSync, + Dirent, + Stats, + ReadStream, + WriteStream, + constants: constants$6, + promises: promises$1 +} = fs; +const fs$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + Dirent, + ReadStream, + Stats, + WriteStream, + access, + accessSync, + appendFile, + appendFileSync, + chmod, + chmodSync, + chown, + chownSync, + close, + closeSync, + constants: constants$6, + copyFile, + copyFileSync, + cp, + cpSync, + createReadStream, + createWriteStream, + default: fs, + exists, + existsSync, + fchmod, + fchmodSync, + fchown, + fchownSync, + fdatasync, + fdatasyncSync, + fstat, + fstatSync, + fsync, + fsyncSync, + ftruncate, + ftruncateSync, + futimes, + futimesSync, + lchmod, + lchmodSync, + lchown, + lchownSync, + link, + linkSync, + lstat, + lstatSync, + lutimes, + lutimesSync, + mkdir, + mkdirSync, + mkdtemp, + mkdtempSync, + open: open$2, + openSync, + opendir, + opendirSync, + promises: promises$1, + read, + readFile, + readFileSync, + readSync, + readdir, + readdirSync, + readlink, + readlinkSync, + readv, + readvSync, + realpath, + realpathSync, + rename, + renameSync, + rm, + rmSync, + rmdir, + rmdirSync, + stat, + statSync, + statfs, + statfsSync, + symlink, + symlinkSync, + truncate, + truncateSync, + unlink, + unlinkSync, + unwatchFile, + utimes, + utimesSync, + watch, + watchFile, + write, + writeFile, + writeFileSync, + writeSync, + writev, + writevSync +}, Symbol.toStringTag, { value: "Module" })); +self.global = self; +self.__dirname = "/"; +class ValidationError extends Error { +} +const scheme = {}; +function findValidator(type2, method, kind) { + const validator = maybeFindValidator(type2, method, kind); + if (!validator) + throw new ValidationError(`Unknown scheme for ${kind}: ${type2}.${method}`); + return validator; +} +function maybeFindValidator(type2, method, kind) { + const schemeName = type2 + (kind === "Initializer" ? "" : method[0].toUpperCase() + method.substring(1)) + kind; + return scheme[schemeName]; +} +function createMetadataValidator() { + return tOptional(scheme["Metadata"]); +} +const tNumber = (arg, path2, context) => { + if (arg instanceof Number) + return arg.valueOf(); + if (typeof arg === "number") + return arg; + throw new ValidationError(`${path2}: expected number, got ${typeof arg}`); +}; +const tBoolean = (arg, path2, context) => { + if (arg instanceof Boolean) + return arg.valueOf(); + if (typeof arg === "boolean") + return arg; + throw new ValidationError(`${path2}: expected boolean, got ${typeof arg}`); +}; +const tString = (arg, path2, context) => { + if (arg instanceof String) + return arg.valueOf(); + if (typeof arg === "string") + return arg; + throw new ValidationError(`${path2}: expected string, got ${typeof arg}`); +}; +const tBinary = (arg, path2, context) => { + if (context.binary === "fromBase64") { + if (arg instanceof String) + return Buffer.from(arg.valueOf(), "base64"); + if (typeof arg === "string") + return Buffer.from(arg, "base64"); + throw new ValidationError(`${path2}: expected base64-encoded buffer, got ${typeof arg}`); + } + if (context.binary === "toBase64") { + if (!(arg instanceof Buffer)) + throw new ValidationError(`${path2}: expected Buffer, got ${typeof arg}`); + return arg.toString("base64"); + } + if (context.binary === "buffer") { + if (!(arg instanceof Buffer)) + throw new ValidationError(`${path2}: expected Buffer, got ${typeof arg}`); + return arg; + } + throw new ValidationError(`Unsupported binary behavior "${context.binary}"`); +}; +const tAny = (arg, path2, context) => { + return arg; +}; +const tOptional = (v) => { + return (arg, path2, context) => { + if (Object.is(arg, void 0)) + return arg; + return v(arg, path2, context); + }; +}; +const tArray = (v) => { + return (arg, path2, context) => { + if (!Array.isArray(arg)) + throw new ValidationError(`${path2}: expected array, got ${typeof arg}`); + return arg.map((x, index2) => v(x, path2 + "[" + index2 + "]", context)); + }; +}; +const tObject = (s) => { + return (arg, path2, context) => { + if (Object.is(arg, null)) + throw new ValidationError(`${path2}: expected object, got null`); + if (typeof arg !== "object") + throw new ValidationError(`${path2}: expected object, got ${typeof arg}`); + const result = {}; + for (const [key2, v] of Object.entries(s)) { + const value = v(arg[key2], path2 ? path2 + "." + key2 : key2, context); + if (!Object.is(value, void 0)) + result[key2] = value; + } + if (context.isUnderTest()) { + for (const [key2, value] of Object.entries(arg)) { + if (key2.startsWith("__testHook")) + result[key2] = value; + } + } + return result; + }; +}; +const tEnum = (e) => { + return (arg, path2, context) => { + if (!e.includes(arg)) + throw new ValidationError(`${path2}: expected one of (${e.join("|")})`); + return arg; + }; +}; +const tChannel = (names) => { + return (arg, path2, context) => { + return context.tChannelImpl(names, arg, path2, context); + }; +}; +const tType = (name) => { + return (arg, path2, context) => { + const v = scheme[name]; + if (!v) + throw new ValidationError(path2 + ': unknown type "' + name + '"'); + return v(arg, path2, context); + }; +}; +scheme.StackFrame = tObject({ + file: tString, + line: tNumber, + column: tNumber, + function: tOptional(tString) +}); +scheme.Metadata = tObject({ + location: tOptional(tObject({ + file: tString, + line: tOptional(tNumber), + column: tOptional(tNumber) + })), + title: tOptional(tString), + internal: tOptional(tBoolean), + stepId: tOptional(tString) +}); +scheme.ClientSideCallMetadata = tObject({ + id: tNumber, + stack: tOptional(tArray(tType("StackFrame"))) +}); +scheme.Point = tObject({ + x: tNumber, + y: tNumber +}); +scheme.Rect = tObject({ + x: tNumber, + y: tNumber, + width: tNumber, + height: tNumber +}); +scheme.SerializedValue = tObject({ + n: tOptional(tNumber), + b: tOptional(tBoolean), + s: tOptional(tString), + v: tOptional(tEnum(["null", "undefined", "NaN", "Infinity", "-Infinity", "-0"])), + d: tOptional(tString), + u: tOptional(tString), + bi: tOptional(tString), + ta: tOptional(tObject({ + b: tBinary, + k: tEnum(["i8", "ui8", "ui8c", "i16", "ui16", "i32", "ui32", "f32", "f64", "bi64", "bui64"]) + })), + e: tOptional(tObject({ + m: tString, + n: tString, + s: tString + })), + r: tOptional(tObject({ + p: tString, + f: tString + })), + a: tOptional(tArray(tType("SerializedValue"))), + o: tOptional(tArray(tObject({ + k: tString, + v: tType("SerializedValue") + }))), + h: tOptional(tNumber), + id: tOptional(tNumber), + ref: tOptional(tNumber) +}); +scheme.SerializedArgument = tObject({ + value: tType("SerializedValue"), + handles: tArray(tChannel("*")) +}); +scheme.ExpectedTextValue = tObject({ + string: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + matchSubstring: tOptional(tBoolean), + ignoreCase: tOptional(tBoolean), + normalizeWhiteSpace: tOptional(tBoolean) +}); +scheme.SelectorEngine = tObject({ + name: tString, + source: tString, + contentScript: tOptional(tBoolean) +}); +scheme.AXNode = tObject({ + role: tString, + name: tString, + valueString: tOptional(tString), + valueNumber: tOptional(tNumber), + description: tOptional(tString), + keyshortcuts: tOptional(tString), + roledescription: tOptional(tString), + valuetext: tOptional(tString), + disabled: tOptional(tBoolean), + expanded: tOptional(tBoolean), + focused: tOptional(tBoolean), + modal: tOptional(tBoolean), + multiline: tOptional(tBoolean), + multiselectable: tOptional(tBoolean), + readonly: tOptional(tBoolean), + required: tOptional(tBoolean), + selected: tOptional(tBoolean), + checked: tOptional(tEnum(["checked", "unchecked", "mixed"])), + pressed: tOptional(tEnum(["pressed", "released", "mixed"])), + level: tOptional(tNumber), + valuemin: tOptional(tNumber), + valuemax: tOptional(tNumber), + autocomplete: tOptional(tString), + haspopup: tOptional(tString), + invalid: tOptional(tString), + orientation: tOptional(tString), + children: tOptional(tArray(tType("AXNode"))) +}); +scheme.SetNetworkCookie = tObject({ + name: tString, + value: tString, + url: tOptional(tString), + domain: tOptional(tString), + path: tOptional(tString), + expires: tOptional(tNumber), + httpOnly: tOptional(tBoolean), + secure: tOptional(tBoolean), + sameSite: tOptional(tEnum(["Strict", "Lax", "None"])) +}); +scheme.NetworkCookie = tObject({ + name: tString, + value: tString, + domain: tString, + path: tString, + expires: tNumber, + httpOnly: tBoolean, + secure: tBoolean, + sameSite: tEnum(["Strict", "Lax", "None"]) +}); +scheme.NameValue = tObject({ + name: tString, + value: tString +}); +scheme.IndexedDBDatabase = tObject({ + name: tString, + version: tNumber, + stores: tArray(tObject({ + name: tString, + autoIncrement: tBoolean, + keyPath: tOptional(tString), + keyPathArray: tOptional(tArray(tString)), + records: tArray(tObject({ + key: tOptional(tAny), + keyEncoded: tOptional(tAny), + value: tOptional(tAny), + valueEncoded: tOptional(tAny) + })), + indexes: tArray(tObject({ + name: tString, + keyPath: tOptional(tString), + keyPathArray: tOptional(tArray(tString)), + multiEntry: tBoolean, + unique: tBoolean + })) + })) +}); +scheme.SetOriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType("NameValue")), + indexedDB: tOptional(tArray(tType("IndexedDBDatabase"))) +}); +scheme.OriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType("NameValue")), + indexedDB: tOptional(tArray(tType("IndexedDBDatabase"))) +}); +scheme.SerializedError = tObject({ + error: tOptional(tObject({ + message: tString, + name: tString, + stack: tOptional(tString) + })), + value: tOptional(tType("SerializedValue")) +}); +scheme.RecordHarOptions = tObject({ + zip: tOptional(tBoolean), + content: tOptional(tEnum(["embed", "attach", "omit"])), + mode: tOptional(tEnum(["full", "minimal"])), + urlGlob: tOptional(tString), + urlRegexSource: tOptional(tString), + urlRegexFlags: tOptional(tString) +}); +scheme.FormField = tObject({ + name: tString, + value: tOptional(tString), + file: tOptional(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + })) +}); +scheme.APIRequestContextInitializer = tObject({ + tracing: tChannel(["Tracing"]) +}); +scheme.APIRequestContextFetchParams = tObject({ + url: tString, + encodedParams: tOptional(tString), + params: tOptional(tArray(tType("NameValue"))), + method: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + postData: tOptional(tBinary), + jsonData: tOptional(tString), + formData: tOptional(tArray(tType("NameValue"))), + multipartData: tOptional(tArray(tType("FormField"))), + timeout: tNumber, + failOnStatusCode: tOptional(tBoolean), + ignoreHTTPSErrors: tOptional(tBoolean), + maxRedirects: tOptional(tNumber), + maxRetries: tOptional(tNumber) +}); +scheme.APIRequestContextFetchResult = tObject({ + response: tType("APIResponse") +}); +scheme.APIRequestContextFetchResponseBodyParams = tObject({ + fetchUid: tString +}); +scheme.APIRequestContextFetchResponseBodyResult = tObject({ + binary: tOptional(tBinary) +}); +scheme.APIRequestContextFetchLogParams = tObject({ + fetchUid: tString +}); +scheme.APIRequestContextFetchLogResult = tObject({ + log: tArray(tString) +}); +scheme.APIRequestContextStorageStateParams = tObject({ + indexedDB: tOptional(tBoolean) +}); +scheme.APIRequestContextStorageStateResult = tObject({ + cookies: tArray(tType("NetworkCookie")), + origins: tArray(tType("OriginStorage")) +}); +scheme.APIRequestContextDisposeAPIResponseParams = tObject({ + fetchUid: tString +}); +scheme.APIRequestContextDisposeAPIResponseResult = tOptional(tObject({})); +scheme.APIRequestContextDisposeParams = tObject({ + reason: tOptional(tString) +}); +scheme.APIRequestContextDisposeResult = tOptional(tObject({})); +scheme.APIResponse = tObject({ + fetchUid: tString, + url: tString, + status: tNumber, + statusText: tString, + headers: tArray(tType("NameValue")) +}); +scheme.LifecycleEvent = tEnum(["load", "domcontentloaded", "networkidle", "commit"]); +scheme.LocalUtilsInitializer = tObject({ + deviceDescriptors: tArray(tObject({ + name: tString, + descriptor: tObject({ + userAgent: tString, + viewport: tObject({ + width: tNumber, + height: tNumber + }), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + deviceScaleFactor: tNumber, + isMobile: tBoolean, + hasTouch: tBoolean, + defaultBrowserType: tEnum(["chromium", "firefox", "webkit"]) + }) + })) +}); +scheme.LocalUtilsZipParams = tObject({ + zipFile: tString, + entries: tArray(tType("NameValue")), + stacksId: tOptional(tString), + mode: tEnum(["write", "append"]), + includeSources: tBoolean +}); +scheme.LocalUtilsZipResult = tOptional(tObject({})); +scheme.LocalUtilsHarOpenParams = tObject({ + file: tString +}); +scheme.LocalUtilsHarOpenResult = tObject({ + harId: tOptional(tString), + error: tOptional(tString) +}); +scheme.LocalUtilsHarLookupParams = tObject({ + harId: tString, + url: tString, + method: tString, + headers: tArray(tType("NameValue")), + postData: tOptional(tBinary), + isNavigationRequest: tBoolean +}); +scheme.LocalUtilsHarLookupResult = tObject({ + action: tEnum(["error", "redirect", "fulfill", "noentry"]), + message: tOptional(tString), + redirectURL: tOptional(tString), + status: tOptional(tNumber), + headers: tOptional(tArray(tType("NameValue"))), + body: tOptional(tBinary) +}); +scheme.LocalUtilsHarCloseParams = tObject({ + harId: tString +}); +scheme.LocalUtilsHarCloseResult = tOptional(tObject({})); +scheme.LocalUtilsHarUnzipParams = tObject({ + zipFile: tString, + harFile: tString +}); +scheme.LocalUtilsHarUnzipResult = tOptional(tObject({})); +scheme.LocalUtilsConnectParams = tObject({ + wsEndpoint: tString, + headers: tOptional(tAny), + exposeNetwork: tOptional(tString), + slowMo: tOptional(tNumber), + timeout: tNumber, + socksProxyRedirectPortForTest: tOptional(tNumber) +}); +scheme.LocalUtilsConnectResult = tObject({ + pipe: tChannel(["JsonPipe"]), + headers: tArray(tType("NameValue")) +}); +scheme.LocalUtilsTracingStartedParams = tObject({ + tracesDir: tOptional(tString), + traceName: tString +}); +scheme.LocalUtilsTracingStartedResult = tObject({ + stacksId: tString +}); +scheme.LocalUtilsAddStackToTracingNoReplyParams = tObject({ + callData: tType("ClientSideCallMetadata") +}); +scheme.LocalUtilsAddStackToTracingNoReplyResult = tOptional(tObject({})); +scheme.LocalUtilsTraceDiscardedParams = tObject({ + stacksId: tString +}); +scheme.LocalUtilsTraceDiscardedResult = tOptional(tObject({})); +scheme.LocalUtilsGlobToRegexParams = tObject({ + glob: tString, + baseURL: tOptional(tString), + webSocketUrl: tOptional(tBoolean) +}); +scheme.LocalUtilsGlobToRegexResult = tObject({ + regex: tString +}); +scheme.RootInitializer = tOptional(tObject({})); +scheme.RootInitializeParams = tObject({ + sdkLanguage: tEnum(["javascript", "python", "java", "csharp"]) +}); +scheme.RootInitializeResult = tObject({ + playwright: tChannel(["Playwright"]) +}); +scheme.PlaywrightInitializer = tObject({ + chromium: tChannel(["BrowserType"]), + firefox: tChannel(["BrowserType"]), + webkit: tChannel(["BrowserType"]), + bidiChromium: tChannel(["BrowserType"]), + bidiFirefox: tChannel(["BrowserType"]), + android: tChannel(["Android"]), + electron: tChannel(["Electron"]), + utils: tOptional(tChannel(["LocalUtils"])), + preLaunchedBrowser: tOptional(tChannel(["Browser"])), + preConnectedAndroidDevice: tOptional(tChannel(["AndroidDevice"])), + socksSupport: tOptional(tChannel(["SocksSupport"])) +}); +scheme.PlaywrightNewRequestParams = tObject({ + baseURL: tOptional(tString), + userAgent: tOptional(tString), + ignoreHTTPSErrors: tOptional(tBoolean), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + failOnStatusCode: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + maxRedirects: tOptional(tNumber), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("NetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })), + tracesDir: tOptional(tString) +}); +scheme.PlaywrightNewRequestResult = tObject({ + request: tChannel(["APIRequestContext"]) +}); +scheme.RecorderSource = tObject({ + isRecorded: tBoolean, + id: tString, + label: tString, + text: tString, + language: tString, + highlight: tArray(tObject({ + line: tNumber, + type: tString + })), + revealLine: tOptional(tNumber), + group: tOptional(tString) +}); +scheme.DebugControllerInitializer = tOptional(tObject({})); +scheme.DebugControllerInspectRequestedEvent = tObject({ + selector: tString, + locator: tString, + ariaSnapshot: tString +}); +scheme.DebugControllerSetModeRequestedEvent = tObject({ + mode: tString +}); +scheme.DebugControllerStateChangedEvent = tObject({ + pageCount: tNumber +}); +scheme.DebugControllerSourceChangedEvent = tObject({ + text: tString, + header: tOptional(tString), + footer: tOptional(tString), + actions: tOptional(tArray(tString)) +}); +scheme.DebugControllerPausedEvent = tObject({ + paused: tBoolean +}); +scheme.DebugControllerInitializeParams = tObject({ + codegenId: tString, + sdkLanguage: tEnum(["javascript", "python", "java", "csharp"]) +}); +scheme.DebugControllerInitializeResult = tOptional(tObject({})); +scheme.DebugControllerSetReportStateChangedParams = tObject({ + enabled: tBoolean +}); +scheme.DebugControllerSetReportStateChangedResult = tOptional(tObject({})); +scheme.DebugControllerResetForReuseParams = tOptional(tObject({})); +scheme.DebugControllerResetForReuseResult = tOptional(tObject({})); +scheme.DebugControllerNavigateParams = tObject({ + url: tString +}); +scheme.DebugControllerNavigateResult = tOptional(tObject({})); +scheme.DebugControllerSetRecorderModeParams = tObject({ + mode: tEnum(["inspecting", "recording", "none"]), + testIdAttributeName: tOptional(tString) +}); +scheme.DebugControllerSetRecorderModeResult = tOptional(tObject({})); +scheme.DebugControllerHighlightParams = tObject({ + selector: tOptional(tString), + ariaTemplate: tOptional(tString) +}); +scheme.DebugControllerHighlightResult = tOptional(tObject({})); +scheme.DebugControllerHideHighlightParams = tOptional(tObject({})); +scheme.DebugControllerHideHighlightResult = tOptional(tObject({})); +scheme.DebugControllerResumeParams = tOptional(tObject({})); +scheme.DebugControllerResumeResult = tOptional(tObject({})); +scheme.DebugControllerKillParams = tOptional(tObject({})); +scheme.DebugControllerKillResult = tOptional(tObject({})); +scheme.DebugControllerCloseAllBrowsersParams = tOptional(tObject({})); +scheme.DebugControllerCloseAllBrowsersResult = tOptional(tObject({})); +scheme.SocksSupportInitializer = tOptional(tObject({})); +scheme.SocksSupportSocksRequestedEvent = tObject({ + uid: tString, + host: tString, + port: tNumber +}); +scheme.SocksSupportSocksDataEvent = tObject({ + uid: tString, + data: tBinary +}); +scheme.SocksSupportSocksClosedEvent = tObject({ + uid: tString +}); +scheme.SocksSupportSocksConnectedParams = tObject({ + uid: tString, + host: tString, + port: tNumber +}); +scheme.SocksSupportSocksConnectedResult = tOptional(tObject({})); +scheme.SocksSupportSocksFailedParams = tObject({ + uid: tString, + errorCode: tString +}); +scheme.SocksSupportSocksFailedResult = tOptional(tObject({})); +scheme.SocksSupportSocksDataParams = tObject({ + uid: tString, + data: tBinary +}); +scheme.SocksSupportSocksDataResult = tOptional(tObject({})); +scheme.SocksSupportSocksErrorParams = tObject({ + uid: tString, + error: tString +}); +scheme.SocksSupportSocksErrorResult = tOptional(tObject({})); +scheme.SocksSupportSocksEndParams = tObject({ + uid: tString +}); +scheme.SocksSupportSocksEndResult = tOptional(tObject({})); +scheme.BrowserTypeInitializer = tObject({ + executablePath: tString, + name: tString +}); +scheme.BrowserTypeLaunchParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + assistantMode: tOptional(tBoolean), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + timeout: tNumber, + env: tOptional(tArray(tType("NameValue"))), + headless: tOptional(tBoolean), + devtools: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + cdpPort: tOptional(tNumber), + slowMo: tOptional(tNumber) +}); +scheme.BrowserTypeLaunchResult = tObject({ + browser: tChannel(["Browser"]) +}); +scheme.BrowserTypeLaunchPersistentContextParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + assistantMode: tOptional(tBoolean), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + timeout: tNumber, + env: tOptional(tArray(tType("NameValue"))), + headless: tOptional(tBoolean), + devtools: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + cdpPort: tOptional(tNumber), + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + userDataDir: tString, + slowMo: tOptional(tNumber) +}); +scheme.BrowserTypeLaunchPersistentContextResult = tObject({ + browser: tChannel(["Browser"]), + context: tChannel(["BrowserContext"]) +}); +scheme.BrowserTypeConnectOverCDPParams = tObject({ + endpointURL: tString, + headers: tOptional(tArray(tType("NameValue"))), + slowMo: tOptional(tNumber), + timeout: tNumber +}); +scheme.BrowserTypeConnectOverCDPResult = tObject({ + browser: tChannel(["Browser"]), + defaultContext: tOptional(tChannel(["BrowserContext"])) +}); +scheme.BrowserInitializer = tObject({ + version: tString, + name: tString +}); +scheme.BrowserContextEvent = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.BrowserCloseEvent = tOptional(tObject({})); +scheme.BrowserCloseParams = tObject({ + reason: tOptional(tString) +}); +scheme.BrowserCloseResult = tOptional(tObject({})); +scheme.BrowserKillForTestsParams = tOptional(tObject({})); +scheme.BrowserKillForTestsResult = tOptional(tObject({})); +scheme.BrowserDefaultUserAgentForTestParams = tOptional(tObject({})); +scheme.BrowserDefaultUserAgentForTestResult = tObject({ + userAgent: tString +}); +scheme.BrowserNewContextParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })) +}); +scheme.BrowserNewContextResult = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.BrowserNewContextForReuseParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })) +}); +scheme.BrowserNewContextForReuseResult = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.BrowserStopPendingOperationsParams = tObject({ + reason: tString +}); +scheme.BrowserStopPendingOperationsResult = tOptional(tObject({})); +scheme.BrowserNewBrowserCDPSessionParams = tOptional(tObject({})); +scheme.BrowserNewBrowserCDPSessionResult = tObject({ + session: tChannel(["CDPSession"]) +}); +scheme.BrowserStartTracingParams = tObject({ + page: tOptional(tChannel(["Page"])), + screenshots: tOptional(tBoolean), + categories: tOptional(tArray(tString)) +}); +scheme.BrowserStartTracingResult = tOptional(tObject({})); +scheme.BrowserStopTracingParams = tOptional(tObject({})); +scheme.BrowserStopTracingResult = tObject({ + artifact: tChannel(["Artifact"]) +}); +scheme.EventTargetInitializer = tOptional(tObject({})); +scheme.EventTargetWaitForEventInfoParams = tObject({ + info: tObject({ + waitId: tString, + phase: tEnum(["before", "after", "log"]), + event: tOptional(tString), + message: tOptional(tString), + error: tOptional(tString) + }) +}); +scheme.BrowserContextWaitForEventInfoParams = tType("EventTargetWaitForEventInfoParams"); +scheme.PageWaitForEventInfoParams = tType("EventTargetWaitForEventInfoParams"); +scheme.WebSocketWaitForEventInfoParams = tType("EventTargetWaitForEventInfoParams"); +scheme.ElectronApplicationWaitForEventInfoParams = tType("EventTargetWaitForEventInfoParams"); +scheme.AndroidDeviceWaitForEventInfoParams = tType("EventTargetWaitForEventInfoParams"); +scheme.EventTargetWaitForEventInfoResult = tOptional(tObject({})); +scheme.BrowserContextWaitForEventInfoResult = tType("EventTargetWaitForEventInfoResult"); +scheme.PageWaitForEventInfoResult = tType("EventTargetWaitForEventInfoResult"); +scheme.WebSocketWaitForEventInfoResult = tType("EventTargetWaitForEventInfoResult"); +scheme.ElectronApplicationWaitForEventInfoResult = tType("EventTargetWaitForEventInfoResult"); +scheme.AndroidDeviceWaitForEventInfoResult = tType("EventTargetWaitForEventInfoResult"); +scheme.BrowserContextInitializer = tObject({ + isChromium: tBoolean, + requestContext: tChannel(["APIRequestContext"]), + tracing: tChannel(["Tracing"]), + options: tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString) + }) +}); +scheme.BrowserContextBindingCallEvent = tObject({ + binding: tChannel(["BindingCall"]) +}); +scheme.BrowserContextConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tNumber, + columnNumber: tNumber + }), + page: tChannel(["Page"]) +}); +scheme.BrowserContextCloseEvent = tOptional(tObject({})); +scheme.BrowserContextDialogEvent = tObject({ + dialog: tChannel(["Dialog"]) +}); +scheme.BrowserContextPageEvent = tObject({ + page: tChannel(["Page"]) +}); +scheme.BrowserContextPageErrorEvent = tObject({ + error: tType("SerializedError"), + page: tChannel(["Page"]) +}); +scheme.BrowserContextRouteEvent = tObject({ + route: tChannel(["Route"]) +}); +scheme.BrowserContextWebSocketRouteEvent = tObject({ + webSocketRoute: tChannel(["WebSocketRoute"]) +}); +scheme.BrowserContextVideoEvent = tObject({ + artifact: tChannel(["Artifact"]) +}); +scheme.BrowserContextBackgroundPageEvent = tObject({ + page: tChannel(["Page"]) +}); +scheme.BrowserContextServiceWorkerEvent = tObject({ + worker: tChannel(["Worker"]) +}); +scheme.BrowserContextRequestEvent = tObject({ + request: tChannel(["Request"]), + page: tOptional(tChannel(["Page"])) +}); +scheme.BrowserContextRequestFailedEvent = tObject({ + request: tChannel(["Request"]), + failureText: tOptional(tString), + responseEndTiming: tNumber, + page: tOptional(tChannel(["Page"])) +}); +scheme.BrowserContextRequestFinishedEvent = tObject({ + request: tChannel(["Request"]), + response: tOptional(tChannel(["Response"])), + responseEndTiming: tNumber, + page: tOptional(tChannel(["Page"])) +}); +scheme.BrowserContextResponseEvent = tObject({ + response: tChannel(["Response"]), + page: tOptional(tChannel(["Page"])) +}); +scheme.BrowserContextAddCookiesParams = tObject({ + cookies: tArray(tType("SetNetworkCookie")) +}); +scheme.BrowserContextAddCookiesResult = tOptional(tObject({})); +scheme.BrowserContextAddInitScriptParams = tObject({ + source: tString +}); +scheme.BrowserContextAddInitScriptResult = tOptional(tObject({})); +scheme.BrowserContextClearCookiesParams = tObject({ + name: tOptional(tString), + nameRegexSource: tOptional(tString), + nameRegexFlags: tOptional(tString), + domain: tOptional(tString), + domainRegexSource: tOptional(tString), + domainRegexFlags: tOptional(tString), + path: tOptional(tString), + pathRegexSource: tOptional(tString), + pathRegexFlags: tOptional(tString) +}); +scheme.BrowserContextClearCookiesResult = tOptional(tObject({})); +scheme.BrowserContextClearPermissionsParams = tOptional(tObject({})); +scheme.BrowserContextClearPermissionsResult = tOptional(tObject({})); +scheme.BrowserContextCloseParams = tObject({ + reason: tOptional(tString) +}); +scheme.BrowserContextCloseResult = tOptional(tObject({})); +scheme.BrowserContextCookiesParams = tObject({ + urls: tArray(tString) +}); +scheme.BrowserContextCookiesResult = tObject({ + cookies: tArray(tType("NetworkCookie")) +}); +scheme.BrowserContextExposeBindingParams = tObject({ + name: tString, + needsHandle: tOptional(tBoolean) +}); +scheme.BrowserContextExposeBindingResult = tOptional(tObject({})); +scheme.BrowserContextGrantPermissionsParams = tObject({ + permissions: tArray(tString), + origin: tOptional(tString) +}); +scheme.BrowserContextGrantPermissionsResult = tOptional(tObject({})); +scheme.BrowserContextNewPageParams = tOptional(tObject({})); +scheme.BrowserContextNewPageResult = tObject({ + page: tChannel(["Page"]) +}); +scheme.BrowserContextRegisterSelectorEngineParams = tObject({ + selectorEngine: tType("SelectorEngine") +}); +scheme.BrowserContextRegisterSelectorEngineResult = tOptional(tObject({})); +scheme.BrowserContextSetTestIdAttributeNameParams = tObject({ + testIdAttributeName: tString +}); +scheme.BrowserContextSetTestIdAttributeNameResult = tOptional(tObject({})); +scheme.BrowserContextSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType("NameValue")) +}); +scheme.BrowserContextSetExtraHTTPHeadersResult = tOptional(tObject({})); +scheme.BrowserContextSetGeolocationParams = tObject({ + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })) +}); +scheme.BrowserContextSetGeolocationResult = tOptional(tObject({})); +scheme.BrowserContextSetHTTPCredentialsParams = tObject({ + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString) + })) +}); +scheme.BrowserContextSetHTTPCredentialsResult = tOptional(tObject({})); +scheme.BrowserContextSetNetworkInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString) + })) +}); +scheme.BrowserContextSetNetworkInterceptionPatternsResult = tOptional(tObject({})); +scheme.BrowserContextSetWebSocketInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString) + })) +}); +scheme.BrowserContextSetWebSocketInterceptionPatternsResult = tOptional(tObject({})); +scheme.BrowserContextSetOfflineParams = tObject({ + offline: tBoolean +}); +scheme.BrowserContextSetOfflineResult = tOptional(tObject({})); +scheme.BrowserContextStorageStateParams = tObject({ + indexedDB: tOptional(tBoolean) +}); +scheme.BrowserContextStorageStateResult = tObject({ + cookies: tArray(tType("NetworkCookie")), + origins: tArray(tType("OriginStorage")) +}); +scheme.BrowserContextPauseParams = tOptional(tObject({})); +scheme.BrowserContextPauseResult = tOptional(tObject({})); +scheme.BrowserContextEnableRecorderParams = tObject({ + language: tOptional(tString), + mode: tOptional(tEnum(["inspecting", "recording"])), + pauseOnNextStatement: tOptional(tBoolean), + testIdAttributeName: tOptional(tString), + launchOptions: tOptional(tAny), + contextOptions: tOptional(tAny), + device: tOptional(tString), + saveStorage: tOptional(tString), + outputFile: tOptional(tString), + handleSIGINT: tOptional(tBoolean), + omitCallTracking: tOptional(tBoolean) +}); +scheme.BrowserContextEnableRecorderResult = tOptional(tObject({})); +scheme.BrowserContextNewCDPSessionParams = tObject({ + page: tOptional(tChannel(["Page"])), + frame: tOptional(tChannel(["Frame"])) +}); +scheme.BrowserContextNewCDPSessionResult = tObject({ + session: tChannel(["CDPSession"]) +}); +scheme.BrowserContextHarStartParams = tObject({ + page: tOptional(tChannel(["Page"])), + options: tType("RecordHarOptions") +}); +scheme.BrowserContextHarStartResult = tObject({ + harId: tString +}); +scheme.BrowserContextHarExportParams = tObject({ + harId: tOptional(tString) +}); +scheme.BrowserContextHarExportResult = tObject({ + artifact: tChannel(["Artifact"]) +}); +scheme.BrowserContextCreateTempFilesParams = tObject({ + rootDirName: tOptional(tString), + items: tArray(tObject({ + name: tString, + lastModifiedMs: tOptional(tNumber) + })) +}); +scheme.BrowserContextCreateTempFilesResult = tObject({ + rootDir: tOptional(tChannel(["WritableStream"])), + writableStreams: tArray(tChannel(["WritableStream"])) +}); +scheme.BrowserContextUpdateSubscriptionParams = tObject({ + event: tEnum(["console", "dialog", "request", "response", "requestFinished", "requestFailed"]), + enabled: tBoolean +}); +scheme.BrowserContextUpdateSubscriptionResult = tOptional(tObject({})); +scheme.BrowserContextClockFastForwardParams = tObject({ + ticksNumber: tOptional(tNumber), + ticksString: tOptional(tString) +}); +scheme.BrowserContextClockFastForwardResult = tOptional(tObject({})); +scheme.BrowserContextClockInstallParams = tObject({ + timeNumber: tOptional(tNumber), + timeString: tOptional(tString) +}); +scheme.BrowserContextClockInstallResult = tOptional(tObject({})); +scheme.BrowserContextClockPauseAtParams = tObject({ + timeNumber: tOptional(tNumber), + timeString: tOptional(tString) +}); +scheme.BrowserContextClockPauseAtResult = tOptional(tObject({})); +scheme.BrowserContextClockResumeParams = tOptional(tObject({})); +scheme.BrowserContextClockResumeResult = tOptional(tObject({})); +scheme.BrowserContextClockRunForParams = tObject({ + ticksNumber: tOptional(tNumber), + ticksString: tOptional(tString) +}); +scheme.BrowserContextClockRunForResult = tOptional(tObject({})); +scheme.BrowserContextClockSetFixedTimeParams = tObject({ + timeNumber: tOptional(tNumber), + timeString: tOptional(tString) +}); +scheme.BrowserContextClockSetFixedTimeResult = tOptional(tObject({})); +scheme.BrowserContextClockSetSystemTimeParams = tObject({ + timeNumber: tOptional(tNumber), + timeString: tOptional(tString) +}); +scheme.BrowserContextClockSetSystemTimeResult = tOptional(tObject({})); +scheme.PageInitializer = tObject({ + mainFrame: tChannel(["Frame"]), + viewportSize: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + isClosed: tBoolean, + opener: tOptional(tChannel(["Page"])) +}); +scheme.PageBindingCallEvent = tObject({ + binding: tChannel(["BindingCall"]) +}); +scheme.PageCloseEvent = tOptional(tObject({})); +scheme.PageCrashEvent = tOptional(tObject({})); +scheme.PageDownloadEvent = tObject({ + url: tString, + suggestedFilename: tString, + artifact: tChannel(["Artifact"]) +}); +scheme.PageViewportSizeChangedEvent = tObject({ + viewportSize: tOptional(tObject({ + width: tNumber, + height: tNumber + })) +}); +scheme.PageFileChooserEvent = tObject({ + element: tChannel(["ElementHandle"]), + isMultiple: tBoolean +}); +scheme.PageFrameAttachedEvent = tObject({ + frame: tChannel(["Frame"]) +}); +scheme.PageFrameDetachedEvent = tObject({ + frame: tChannel(["Frame"]) +}); +scheme.PageLocatorHandlerTriggeredEvent = tObject({ + uid: tNumber +}); +scheme.PageRouteEvent = tObject({ + route: tChannel(["Route"]) +}); +scheme.PageWebSocketRouteEvent = tObject({ + webSocketRoute: tChannel(["WebSocketRoute"]) +}); +scheme.PageVideoEvent = tObject({ + artifact: tChannel(["Artifact"]) +}); +scheme.PageWebSocketEvent = tObject({ + webSocket: tChannel(["WebSocket"]) +}); +scheme.PageWorkerEvent = tObject({ + worker: tChannel(["Worker"]) +}); +scheme.PageAddInitScriptParams = tObject({ + source: tString +}); +scheme.PageAddInitScriptResult = tOptional(tObject({})); +scheme.PageCloseParams = tObject({ + runBeforeUnload: tOptional(tBoolean), + reason: tOptional(tString) +}); +scheme.PageCloseResult = tOptional(tObject({})); +scheme.PageEmulateMediaParams = tObject({ + media: tOptional(tEnum(["screen", "print", "no-override"])), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])) +}); +scheme.PageEmulateMediaResult = tOptional(tObject({})); +scheme.PageExposeBindingParams = tObject({ + name: tString, + needsHandle: tOptional(tBoolean) +}); +scheme.PageExposeBindingResult = tOptional(tObject({})); +scheme.PageGoBackParams = tObject({ + timeout: tNumber, + waitUntil: tOptional(tType("LifecycleEvent")) +}); +scheme.PageGoBackResult = tObject({ + response: tOptional(tChannel(["Response"])) +}); +scheme.PageGoForwardParams = tObject({ + timeout: tNumber, + waitUntil: tOptional(tType("LifecycleEvent")) +}); +scheme.PageGoForwardResult = tObject({ + response: tOptional(tChannel(["Response"])) +}); +scheme.PageRequestGCParams = tOptional(tObject({})); +scheme.PageRequestGCResult = tOptional(tObject({})); +scheme.PageRegisterLocatorHandlerParams = tObject({ + selector: tString, + noWaitAfter: tOptional(tBoolean) +}); +scheme.PageRegisterLocatorHandlerResult = tObject({ + uid: tNumber +}); +scheme.PageResolveLocatorHandlerNoReplyParams = tObject({ + uid: tNumber, + remove: tOptional(tBoolean) +}); +scheme.PageResolveLocatorHandlerNoReplyResult = tOptional(tObject({})); +scheme.PageUnregisterLocatorHandlerParams = tObject({ + uid: tNumber +}); +scheme.PageUnregisterLocatorHandlerResult = tOptional(tObject({})); +scheme.PageReloadParams = tObject({ + timeout: tNumber, + waitUntil: tOptional(tType("LifecycleEvent")) +}); +scheme.PageReloadResult = tObject({ + response: tOptional(tChannel(["Response"])) +}); +scheme.PageExpectScreenshotParams = tObject({ + expected: tOptional(tBinary), + timeout: tNumber, + isNot: tBoolean, + locator: tOptional(tObject({ + frame: tChannel(["Frame"]), + selector: tString + })), + comparator: tOptional(tString), + maxDiffPixels: tOptional(tNumber), + maxDiffPixelRatio: tOptional(tNumber), + threshold: tOptional(tNumber), + fullPage: tOptional(tBoolean), + clip: tOptional(tType("Rect")), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) +}); +scheme.PageExpectScreenshotResult = tObject({ + diff: tOptional(tBinary), + errorMessage: tOptional(tString), + actual: tOptional(tBinary), + previous: tOptional(tBinary), + timedOut: tOptional(tBoolean), + log: tOptional(tArray(tString)) +}); +scheme.PageScreenshotParams = tObject({ + timeout: tNumber, + type: tOptional(tEnum(["png", "jpeg"])), + quality: tOptional(tNumber), + fullPage: tOptional(tBoolean), + clip: tOptional(tType("Rect")), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) +}); +scheme.PageScreenshotResult = tObject({ + binary: tBinary +}); +scheme.PageSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType("NameValue")) +}); +scheme.PageSetExtraHTTPHeadersResult = tOptional(tObject({})); +scheme.PageSetNetworkInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString) + })) +}); +scheme.PageSetNetworkInterceptionPatternsResult = tOptional(tObject({})); +scheme.PageSetWebSocketInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString) + })) +}); +scheme.PageSetWebSocketInterceptionPatternsResult = tOptional(tObject({})); +scheme.PageSetViewportSizeParams = tObject({ + viewportSize: tObject({ + width: tNumber, + height: tNumber + }) +}); +scheme.PageSetViewportSizeResult = tOptional(tObject({})); +scheme.PageKeyboardDownParams = tObject({ + key: tString +}); +scheme.PageKeyboardDownResult = tOptional(tObject({})); +scheme.PageKeyboardUpParams = tObject({ + key: tString +}); +scheme.PageKeyboardUpResult = tOptional(tObject({})); +scheme.PageKeyboardInsertTextParams = tObject({ + text: tString +}); +scheme.PageKeyboardInsertTextResult = tOptional(tObject({})); +scheme.PageKeyboardTypeParams = tObject({ + text: tString, + delay: tOptional(tNumber) +}); +scheme.PageKeyboardTypeResult = tOptional(tObject({})); +scheme.PageKeyboardPressParams = tObject({ + key: tString, + delay: tOptional(tNumber) +}); +scheme.PageKeyboardPressResult = tOptional(tObject({})); +scheme.PageMouseMoveParams = tObject({ + x: tNumber, + y: tNumber, + steps: tOptional(tNumber) +}); +scheme.PageMouseMoveResult = tOptional(tObject({})); +scheme.PageMouseDownParams = tObject({ + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tNumber) +}); +scheme.PageMouseDownResult = tOptional(tObject({})); +scheme.PageMouseUpParams = tObject({ + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tNumber) +}); +scheme.PageMouseUpResult = tOptional(tObject({})); +scheme.PageMouseClickParams = tObject({ + x: tNumber, + y: tNumber, + delay: tOptional(tNumber), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tNumber) +}); +scheme.PageMouseClickResult = tOptional(tObject({})); +scheme.PageMouseWheelParams = tObject({ + deltaX: tNumber, + deltaY: tNumber +}); +scheme.PageMouseWheelResult = tOptional(tObject({})); +scheme.PageTouchscreenTapParams = tObject({ + x: tNumber, + y: tNumber +}); +scheme.PageTouchscreenTapResult = tOptional(tObject({})); +scheme.PageAccessibilitySnapshotParams = tObject({ + interestingOnly: tOptional(tBoolean), + root: tOptional(tChannel(["ElementHandle"])) +}); +scheme.PageAccessibilitySnapshotResult = tObject({ + rootAXNode: tOptional(tType("AXNode")) +}); +scheme.PagePdfParams = tObject({ + scale: tOptional(tNumber), + displayHeaderFooter: tOptional(tBoolean), + headerTemplate: tOptional(tString), + footerTemplate: tOptional(tString), + printBackground: tOptional(tBoolean), + landscape: tOptional(tBoolean), + pageRanges: tOptional(tString), + format: tOptional(tString), + width: tOptional(tString), + height: tOptional(tString), + preferCSSPageSize: tOptional(tBoolean), + margin: tOptional(tObject({ + top: tOptional(tString), + bottom: tOptional(tString), + left: tOptional(tString), + right: tOptional(tString) + })), + tagged: tOptional(tBoolean), + outline: tOptional(tBoolean) +}); +scheme.PagePdfResult = tObject({ + pdf: tBinary +}); +scheme.PageSnapshotForAIParams = tOptional(tObject({})); +scheme.PageSnapshotForAIResult = tObject({ + snapshot: tString +}); +scheme.PageStartJSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean), + reportAnonymousScripts: tOptional(tBoolean) +}); +scheme.PageStartJSCoverageResult = tOptional(tObject({})); +scheme.PageStopJSCoverageParams = tOptional(tObject({})); +scheme.PageStopJSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, + scriptId: tString, + source: tOptional(tString), + functions: tArray(tObject({ + functionName: tString, + isBlockCoverage: tBoolean, + ranges: tArray(tObject({ + startOffset: tNumber, + endOffset: tNumber, + count: tNumber + })) + })) + })) +}); +scheme.PageStartCSSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean) +}); +scheme.PageStartCSSCoverageResult = tOptional(tObject({})); +scheme.PageStopCSSCoverageParams = tOptional(tObject({})); +scheme.PageStopCSSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, + text: tOptional(tString), + ranges: tArray(tObject({ + start: tNumber, + end: tNumber + })) + })) +}); +scheme.PageBringToFrontParams = tOptional(tObject({})); +scheme.PageBringToFrontResult = tOptional(tObject({})); +scheme.PageUpdateSubscriptionParams = tObject({ + event: tEnum(["console", "dialog", "fileChooser", "request", "response", "requestFinished", "requestFailed"]), + enabled: tBoolean +}); +scheme.PageUpdateSubscriptionResult = tOptional(tObject({})); +scheme.FrameInitializer = tObject({ + url: tString, + name: tString, + parentFrame: tOptional(tChannel(["Frame"])), + loadStates: tArray(tType("LifecycleEvent")) +}); +scheme.FrameLoadstateEvent = tObject({ + add: tOptional(tType("LifecycleEvent")), + remove: tOptional(tType("LifecycleEvent")) +}); +scheme.FrameNavigatedEvent = tObject({ + url: tString, + name: tString, + newDocument: tOptional(tObject({ + request: tOptional(tChannel(["Request"])) + })), + error: tOptional(tString) +}); +scheme.FrameEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.FrameEvalOnSelectorResult = tObject({ + value: tType("SerializedValue") +}); +scheme.FrameEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.FrameEvalOnSelectorAllResult = tObject({ + value: tType("SerializedValue") +}); +scheme.FrameAddScriptTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString), + type: tOptional(tString) +}); +scheme.FrameAddScriptTagResult = tObject({ + element: tChannel(["ElementHandle"]) +}); +scheme.FrameAddStyleTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString) +}); +scheme.FrameAddStyleTagResult = tObject({ + element: tChannel(["ElementHandle"]) +}); +scheme.FrameAriaSnapshotParams = tObject({ + selector: tString, + forAI: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameAriaSnapshotResult = tObject({ + snapshot: tString +}); +scheme.FrameBlurParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameBlurResult = tOptional(tObject({})); +scheme.FrameCheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.FrameCheckResult = tOptional(tObject({})); +scheme.FrameClickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tNumber), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tNumber), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.FrameClickResult = tOptional(tObject({})); +scheme.FrameContentParams = tOptional(tObject({})); +scheme.FrameContentResult = tObject({ + value: tString +}); +scheme.FrameDragAndDropParams = tObject({ + source: tString, + target: tString, + force: tOptional(tBoolean), + timeout: tNumber, + trial: tOptional(tBoolean), + sourcePosition: tOptional(tType("Point")), + targetPosition: tOptional(tType("Point")), + strict: tOptional(tBoolean) +}); +scheme.FrameDragAndDropResult = tOptional(tObject({})); +scheme.FrameDblclickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tNumber), + button: tOptional(tEnum(["left", "right", "middle"])), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.FrameDblclickResult = tOptional(tObject({})); +scheme.FrameDispatchEventParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + type: tString, + eventInit: tType("SerializedArgument"), + timeout: tNumber +}); +scheme.FrameDispatchEventResult = tOptional(tObject({})); +scheme.FrameEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.FrameEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") +}); +scheme.FrameEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.FrameEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.FrameFillParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + value: tString, + force: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameFillResult = tOptional(tObject({})); +scheme.FrameFocusParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameFocusResult = tOptional(tObject({})); +scheme.FrameFrameElementParams = tOptional(tObject({})); +scheme.FrameFrameElementResult = tObject({ + element: tChannel(["ElementHandle"]) +}); +scheme.FrameHighlightParams = tObject({ + selector: tString +}); +scheme.FrameHighlightResult = tOptional(tObject({})); +scheme.FrameGetAttributeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + name: tString, + timeout: tNumber +}); +scheme.FrameGetAttributeResult = tObject({ + value: tOptional(tString) +}); +scheme.FrameGotoParams = tObject({ + url: tString, + timeout: tNumber, + waitUntil: tOptional(tType("LifecycleEvent")), + referer: tOptional(tString) +}); +scheme.FrameGotoResult = tObject({ + response: tOptional(tChannel(["Response"])) +}); +scheme.FrameHoverParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.FrameHoverResult = tOptional(tObject({})); +scheme.FrameInnerHTMLParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameInnerHTMLResult = tObject({ + value: tString +}); +scheme.FrameInnerTextParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameInnerTextResult = tObject({ + value: tString +}); +scheme.FrameInputValueParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameInputValueResult = tObject({ + value: tString +}); +scheme.FrameIsCheckedParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameIsCheckedResult = tObject({ + value: tBoolean +}); +scheme.FrameIsDisabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameIsDisabledResult = tObject({ + value: tBoolean +}); +scheme.FrameIsEnabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameIsEnabledResult = tObject({ + value: tBoolean +}); +scheme.FrameIsHiddenParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) +}); +scheme.FrameIsHiddenResult = tObject({ + value: tBoolean +}); +scheme.FrameIsVisibleParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) +}); +scheme.FrameIsVisibleResult = tObject({ + value: tBoolean +}); +scheme.FrameIsEditableParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameIsEditableResult = tObject({ + value: tBoolean +}); +scheme.FramePressParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + key: tString, + delay: tOptional(tNumber), + noWaitAfter: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FramePressResult = tOptional(tObject({})); +scheme.FrameQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) +}); +scheme.FrameQuerySelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) +}); +scheme.FrameQuerySelectorAllParams = tObject({ + selector: tString +}); +scheme.FrameQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(["ElementHandle"])) +}); +scheme.FrameQueryCountParams = tObject({ + selector: tString +}); +scheme.FrameQueryCountResult = tObject({ + value: tNumber +}); +scheme.FrameSelectOptionParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + elements: tOptional(tArray(tChannel(["ElementHandle"]))), + options: tOptional(tArray(tObject({ + valueOrLabel: tOptional(tString), + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tNumber) + }))), + force: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameSelectOptionResult = tObject({ + values: tArray(tString) +}); +scheme.FrameSetContentParams = tObject({ + html: tString, + timeout: tNumber, + waitUntil: tOptional(tType("LifecycleEvent")) +}); +scheme.FrameSetContentResult = tOptional(tObject({})); +scheme.FrameSetInputFilesParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localDirectory: tOptional(tString), + directoryStream: tOptional(tChannel(["WritableStream"])), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))), + timeout: tNumber +}); +scheme.FrameSetInputFilesResult = tOptional(tObject({})); +scheme.FrameTapParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.FrameTapResult = tOptional(tObject({})); +scheme.FrameTextContentParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber +}); +scheme.FrameTextContentResult = tObject({ + value: tOptional(tString) +}); +scheme.FrameTitleParams = tOptional(tObject({})); +scheme.FrameTitleResult = tObject({ + value: tString +}); +scheme.FrameTypeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + text: tString, + delay: tOptional(tNumber), + timeout: tNumber +}); +scheme.FrameTypeResult = tOptional(tObject({})); +scheme.FrameUncheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.FrameUncheckResult = tOptional(tObject({})); +scheme.FrameWaitForTimeoutParams = tObject({ + timeout: tNumber +}); +scheme.FrameWaitForTimeoutResult = tOptional(tObject({})); +scheme.FrameWaitForFunctionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument"), + timeout: tNumber, + pollingInterval: tOptional(tNumber) +}); +scheme.FrameWaitForFunctionResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.FrameWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber, + state: tOptional(tEnum(["attached", "detached", "visible", "hidden"])), + omitReturnValue: tOptional(tBoolean) +}); +scheme.FrameWaitForSelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) +}); +scheme.FrameExpectParams = tObject({ + selector: tString, + expression: tString, + expressionArg: tOptional(tAny), + expectedText: tOptional(tArray(tType("ExpectedTextValue"))), + expectedNumber: tOptional(tNumber), + expectedValue: tOptional(tType("SerializedArgument")), + useInnerText: tOptional(tBoolean), + isNot: tBoolean, + timeout: tNumber +}); +scheme.FrameExpectResult = tObject({ + matches: tBoolean, + received: tOptional(tType("SerializedValue")), + timedOut: tOptional(tBoolean), + log: tOptional(tArray(tString)) +}); +scheme.WorkerInitializer = tObject({ + url: tString +}); +scheme.WorkerCloseEvent = tOptional(tObject({})); +scheme.WorkerEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.WorkerEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") +}); +scheme.WorkerEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.WorkerEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.JSHandleInitializer = tObject({ + preview: tString +}); +scheme.JSHandlePreviewUpdatedEvent = tObject({ + preview: tString +}); +scheme.ElementHandlePreviewUpdatedEvent = tType("JSHandlePreviewUpdatedEvent"); +scheme.JSHandleDisposeParams = tOptional(tObject({})); +scheme.ElementHandleDisposeParams = tType("JSHandleDisposeParams"); +scheme.JSHandleDisposeResult = tOptional(tObject({})); +scheme.ElementHandleDisposeResult = tType("JSHandleDisposeResult"); +scheme.JSHandleEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.ElementHandleEvaluateExpressionParams = tType("JSHandleEvaluateExpressionParams"); +scheme.JSHandleEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") +}); +scheme.ElementHandleEvaluateExpressionResult = tType("JSHandleEvaluateExpressionResult"); +scheme.JSHandleEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.ElementHandleEvaluateExpressionHandleParams = tType("JSHandleEvaluateExpressionHandleParams"); +scheme.JSHandleEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.ElementHandleEvaluateExpressionHandleResult = tType("JSHandleEvaluateExpressionHandleResult"); +scheme.JSHandleGetPropertyListParams = tOptional(tObject({})); +scheme.ElementHandleGetPropertyListParams = tType("JSHandleGetPropertyListParams"); +scheme.JSHandleGetPropertyListResult = tObject({ + properties: tArray(tObject({ + name: tString, + value: tChannel(["ElementHandle", "JSHandle"]) + })) +}); +scheme.ElementHandleGetPropertyListResult = tType("JSHandleGetPropertyListResult"); +scheme.JSHandleGetPropertyParams = tObject({ + name: tString +}); +scheme.ElementHandleGetPropertyParams = tType("JSHandleGetPropertyParams"); +scheme.JSHandleGetPropertyResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.ElementHandleGetPropertyResult = tType("JSHandleGetPropertyResult"); +scheme.JSHandleJsonValueParams = tOptional(tObject({})); +scheme.ElementHandleJsonValueParams = tType("JSHandleJsonValueParams"); +scheme.JSHandleJsonValueResult = tObject({ + value: tType("SerializedValue") +}); +scheme.ElementHandleJsonValueResult = tType("JSHandleJsonValueResult"); +scheme.ElementHandleInitializer = tObject({ + preview: tString +}); +scheme.ElementHandleEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.ElementHandleEvalOnSelectorResult = tObject({ + value: tType("SerializedValue") +}); +scheme.ElementHandleEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.ElementHandleEvalOnSelectorAllResult = tObject({ + value: tType("SerializedValue") +}); +scheme.ElementHandleBoundingBoxParams = tOptional(tObject({})); +scheme.ElementHandleBoundingBoxResult = tObject({ + value: tOptional(tType("Rect")) +}); +scheme.ElementHandleCheckParams = tObject({ + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.ElementHandleCheckResult = tOptional(tObject({})); +scheme.ElementHandleClickParams = tObject({ + force: tOptional(tBoolean), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tNumber), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tNumber), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.ElementHandleClickResult = tOptional(tObject({})); +scheme.ElementHandleContentFrameParams = tOptional(tObject({})); +scheme.ElementHandleContentFrameResult = tObject({ + frame: tOptional(tChannel(["Frame"])) +}); +scheme.ElementHandleDblclickParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tNumber), + button: tOptional(tEnum(["left", "right", "middle"])), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.ElementHandleDblclickResult = tOptional(tObject({})); +scheme.ElementHandleDispatchEventParams = tObject({ + type: tString, + eventInit: tType("SerializedArgument") +}); +scheme.ElementHandleDispatchEventResult = tOptional(tObject({})); +scheme.ElementHandleFillParams = tObject({ + value: tString, + force: tOptional(tBoolean), + timeout: tNumber +}); +scheme.ElementHandleFillResult = tOptional(tObject({})); +scheme.ElementHandleFocusParams = tOptional(tObject({})); +scheme.ElementHandleFocusResult = tOptional(tObject({})); +scheme.ElementHandleGenerateLocatorStringParams = tOptional(tObject({})); +scheme.ElementHandleGenerateLocatorStringResult = tObject({ + value: tOptional(tString) +}); +scheme.ElementHandleGetAttributeParams = tObject({ + name: tString +}); +scheme.ElementHandleGetAttributeResult = tObject({ + value: tOptional(tString) +}); +scheme.ElementHandleHoverParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.ElementHandleHoverResult = tOptional(tObject({})); +scheme.ElementHandleInnerHTMLParams = tOptional(tObject({})); +scheme.ElementHandleInnerHTMLResult = tObject({ + value: tString +}); +scheme.ElementHandleInnerTextParams = tOptional(tObject({})); +scheme.ElementHandleInnerTextResult = tObject({ + value: tString +}); +scheme.ElementHandleInputValueParams = tOptional(tObject({})); +scheme.ElementHandleInputValueResult = tObject({ + value: tString +}); +scheme.ElementHandleIsCheckedParams = tOptional(tObject({})); +scheme.ElementHandleIsCheckedResult = tObject({ + value: tBoolean +}); +scheme.ElementHandleIsDisabledParams = tOptional(tObject({})); +scheme.ElementHandleIsDisabledResult = tObject({ + value: tBoolean +}); +scheme.ElementHandleIsEditableParams = tOptional(tObject({})); +scheme.ElementHandleIsEditableResult = tObject({ + value: tBoolean +}); +scheme.ElementHandleIsEnabledParams = tOptional(tObject({})); +scheme.ElementHandleIsEnabledResult = tObject({ + value: tBoolean +}); +scheme.ElementHandleIsHiddenParams = tOptional(tObject({})); +scheme.ElementHandleIsHiddenResult = tObject({ + value: tBoolean +}); +scheme.ElementHandleIsVisibleParams = tOptional(tObject({})); +scheme.ElementHandleIsVisibleResult = tObject({ + value: tBoolean +}); +scheme.ElementHandleOwnerFrameParams = tOptional(tObject({})); +scheme.ElementHandleOwnerFrameResult = tObject({ + frame: tOptional(tChannel(["Frame"])) +}); +scheme.ElementHandlePressParams = tObject({ + key: tString, + delay: tOptional(tNumber), + timeout: tNumber, + noWaitAfter: tOptional(tBoolean) +}); +scheme.ElementHandlePressResult = tOptional(tObject({})); +scheme.ElementHandleQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) +}); +scheme.ElementHandleQuerySelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) +}); +scheme.ElementHandleQuerySelectorAllParams = tObject({ + selector: tString +}); +scheme.ElementHandleQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(["ElementHandle"])) +}); +scheme.ElementHandleScreenshotParams = tObject({ + timeout: tNumber, + type: tOptional(tEnum(["png", "jpeg"])), + quality: tOptional(tNumber), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) +}); +scheme.ElementHandleScreenshotResult = tObject({ + binary: tBinary +}); +scheme.ElementHandleScrollIntoViewIfNeededParams = tObject({ + timeout: tNumber +}); +scheme.ElementHandleScrollIntoViewIfNeededResult = tOptional(tObject({})); +scheme.ElementHandleSelectOptionParams = tObject({ + elements: tOptional(tArray(tChannel(["ElementHandle"]))), + options: tOptional(tArray(tObject({ + valueOrLabel: tOptional(tString), + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tNumber) + }))), + force: tOptional(tBoolean), + timeout: tNumber +}); +scheme.ElementHandleSelectOptionResult = tObject({ + values: tArray(tString) +}); +scheme.ElementHandleSelectTextParams = tObject({ + force: tOptional(tBoolean), + timeout: tNumber +}); +scheme.ElementHandleSelectTextResult = tOptional(tObject({})); +scheme.ElementHandleSetInputFilesParams = tObject({ + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localDirectory: tOptional(tString), + directoryStream: tOptional(tChannel(["WritableStream"])), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))), + timeout: tNumber +}); +scheme.ElementHandleSetInputFilesResult = tOptional(tObject({})); +scheme.ElementHandleTapParams = tObject({ + force: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.ElementHandleTapResult = tOptional(tObject({})); +scheme.ElementHandleTextContentParams = tOptional(tObject({})); +scheme.ElementHandleTextContentResult = tObject({ + value: tOptional(tString) +}); +scheme.ElementHandleTypeParams = tObject({ + text: tString, + delay: tOptional(tNumber), + timeout: tNumber +}); +scheme.ElementHandleTypeResult = tOptional(tObject({})); +scheme.ElementHandleUncheckParams = tObject({ + force: tOptional(tBoolean), + position: tOptional(tType("Point")), + timeout: tNumber, + trial: tOptional(tBoolean) +}); +scheme.ElementHandleUncheckResult = tOptional(tObject({})); +scheme.ElementHandleWaitForElementStateParams = tObject({ + state: tEnum(["visible", "hidden", "stable", "enabled", "disabled", "editable"]), + timeout: tNumber +}); +scheme.ElementHandleWaitForElementStateResult = tOptional(tObject({})); +scheme.ElementHandleWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + timeout: tNumber, + state: tOptional(tEnum(["attached", "detached", "visible", "hidden"])) +}); +scheme.ElementHandleWaitForSelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) +}); +scheme.RequestInitializer = tObject({ + frame: tOptional(tChannel(["Frame"])), + serviceWorker: tOptional(tChannel(["Worker"])), + url: tString, + resourceType: tString, + method: tString, + postData: tOptional(tBinary), + headers: tArray(tType("NameValue")), + isNavigationRequest: tBoolean, + redirectedFrom: tOptional(tChannel(["Request"])) +}); +scheme.RequestResponseParams = tOptional(tObject({})); +scheme.RequestResponseResult = tObject({ + response: tOptional(tChannel(["Response"])) +}); +scheme.RequestRawRequestHeadersParams = tOptional(tObject({})); +scheme.RequestRawRequestHeadersResult = tObject({ + headers: tArray(tType("NameValue")) +}); +scheme.RouteInitializer = tObject({ + request: tChannel(["Request"]) +}); +scheme.RouteRedirectNavigationRequestParams = tObject({ + url: tString +}); +scheme.RouteRedirectNavigationRequestResult = tOptional(tObject({})); +scheme.RouteAbortParams = tObject({ + errorCode: tOptional(tString) +}); +scheme.RouteAbortResult = tOptional(tObject({})); +scheme.RouteContinueParams = tObject({ + url: tOptional(tString), + method: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + postData: tOptional(tBinary), + isFallback: tBoolean +}); +scheme.RouteContinueResult = tOptional(tObject({})); +scheme.RouteFulfillParams = tObject({ + status: tOptional(tNumber), + headers: tOptional(tArray(tType("NameValue"))), + body: tOptional(tString), + isBase64: tOptional(tBoolean), + fetchResponseUid: tOptional(tString) +}); +scheme.RouteFulfillResult = tOptional(tObject({})); +scheme.WebSocketRouteInitializer = tObject({ + url: tString +}); +scheme.WebSocketRouteMessageFromPageEvent = tObject({ + message: tString, + isBase64: tBoolean +}); +scheme.WebSocketRouteMessageFromServerEvent = tObject({ + message: tString, + isBase64: tBoolean +}); +scheme.WebSocketRouteClosePageEvent = tObject({ + code: tOptional(tNumber), + reason: tOptional(tString), + wasClean: tBoolean +}); +scheme.WebSocketRouteCloseServerEvent = tObject({ + code: tOptional(tNumber), + reason: tOptional(tString), + wasClean: tBoolean +}); +scheme.WebSocketRouteConnectParams = tOptional(tObject({})); +scheme.WebSocketRouteConnectResult = tOptional(tObject({})); +scheme.WebSocketRouteEnsureOpenedParams = tOptional(tObject({})); +scheme.WebSocketRouteEnsureOpenedResult = tOptional(tObject({})); +scheme.WebSocketRouteSendToPageParams = tObject({ + message: tString, + isBase64: tBoolean +}); +scheme.WebSocketRouteSendToPageResult = tOptional(tObject({})); +scheme.WebSocketRouteSendToServerParams = tObject({ + message: tString, + isBase64: tBoolean +}); +scheme.WebSocketRouteSendToServerResult = tOptional(tObject({})); +scheme.WebSocketRouteClosePageParams = tObject({ + code: tOptional(tNumber), + reason: tOptional(tString), + wasClean: tBoolean +}); +scheme.WebSocketRouteClosePageResult = tOptional(tObject({})); +scheme.WebSocketRouteCloseServerParams = tObject({ + code: tOptional(tNumber), + reason: tOptional(tString), + wasClean: tBoolean +}); +scheme.WebSocketRouteCloseServerResult = tOptional(tObject({})); +scheme.ResourceTiming = tObject({ + startTime: tNumber, + domainLookupStart: tNumber, + domainLookupEnd: tNumber, + connectStart: tNumber, + secureConnectionStart: tNumber, + connectEnd: tNumber, + requestStart: tNumber, + responseStart: tNumber +}); +scheme.ResponseInitializer = tObject({ + request: tChannel(["Request"]), + url: tString, + status: tNumber, + statusText: tString, + headers: tArray(tType("NameValue")), + timing: tType("ResourceTiming"), + fromServiceWorker: tBoolean +}); +scheme.ResponseBodyParams = tOptional(tObject({})); +scheme.ResponseBodyResult = tObject({ + binary: tBinary +}); +scheme.ResponseSecurityDetailsParams = tOptional(tObject({})); +scheme.ResponseSecurityDetailsResult = tObject({ + value: tOptional(tType("SecurityDetails")) +}); +scheme.ResponseServerAddrParams = tOptional(tObject({})); +scheme.ResponseServerAddrResult = tObject({ + value: tOptional(tType("RemoteAddr")) +}); +scheme.ResponseRawResponseHeadersParams = tOptional(tObject({})); +scheme.ResponseRawResponseHeadersResult = tObject({ + headers: tArray(tType("NameValue")) +}); +scheme.ResponseSizesParams = tOptional(tObject({})); +scheme.ResponseSizesResult = tObject({ + sizes: tType("RequestSizes") +}); +scheme.SecurityDetails = tObject({ + issuer: tOptional(tString), + protocol: tOptional(tString), + subjectName: tOptional(tString), + validFrom: tOptional(tNumber), + validTo: tOptional(tNumber) +}); +scheme.RequestSizes = tObject({ + requestBodySize: tNumber, + requestHeadersSize: tNumber, + responseBodySize: tNumber, + responseHeadersSize: tNumber +}); +scheme.RemoteAddr = tObject({ + ipAddress: tString, + port: tNumber +}); +scheme.WebSocketInitializer = tObject({ + url: tString +}); +scheme.WebSocketOpenEvent = tOptional(tObject({})); +scheme.WebSocketFrameSentEvent = tObject({ + opcode: tNumber, + data: tString +}); +scheme.WebSocketFrameReceivedEvent = tObject({ + opcode: tNumber, + data: tString +}); +scheme.WebSocketSocketErrorEvent = tObject({ + error: tString +}); +scheme.WebSocketCloseEvent = tOptional(tObject({})); +scheme.BindingCallInitializer = tObject({ + frame: tChannel(["Frame"]), + name: tString, + args: tOptional(tArray(tType("SerializedValue"))), + handle: tOptional(tChannel(["ElementHandle", "JSHandle"])) +}); +scheme.BindingCallRejectParams = tObject({ + error: tType("SerializedError") +}); +scheme.BindingCallRejectResult = tOptional(tObject({})); +scheme.BindingCallResolveParams = tObject({ + result: tType("SerializedArgument") +}); +scheme.BindingCallResolveResult = tOptional(tObject({})); +scheme.DialogInitializer = tObject({ + page: tOptional(tChannel(["Page"])), + type: tString, + message: tString, + defaultValue: tString +}); +scheme.DialogAcceptParams = tObject({ + promptText: tOptional(tString) +}); +scheme.DialogAcceptResult = tOptional(tObject({})); +scheme.DialogDismissParams = tOptional(tObject({})); +scheme.DialogDismissResult = tOptional(tObject({})); +scheme.TracingInitializer = tOptional(tObject({})); +scheme.TracingTracingStartParams = tObject({ + name: tOptional(tString), + snapshots: tOptional(tBoolean), + screenshots: tOptional(tBoolean), + live: tOptional(tBoolean) +}); +scheme.TracingTracingStartResult = tOptional(tObject({})); +scheme.TracingTracingStartChunkParams = tObject({ + name: tOptional(tString), + title: tOptional(tString) +}); +scheme.TracingTracingStartChunkResult = tObject({ + traceName: tString +}); +scheme.TracingTracingGroupParams = tObject({ + name: tString, + location: tOptional(tObject({ + file: tString, + line: tOptional(tNumber), + column: tOptional(tNumber) + })) +}); +scheme.TracingTracingGroupResult = tOptional(tObject({})); +scheme.TracingTracingGroupEndParams = tOptional(tObject({})); +scheme.TracingTracingGroupEndResult = tOptional(tObject({})); +scheme.TracingTracingStopChunkParams = tObject({ + mode: tEnum(["archive", "discard", "entries"]) +}); +scheme.TracingTracingStopChunkResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])), + entries: tOptional(tArray(tType("NameValue"))) +}); +scheme.TracingTracingStopParams = tOptional(tObject({})); +scheme.TracingTracingStopResult = tOptional(tObject({})); +scheme.ArtifactInitializer = tObject({ + absolutePath: tString +}); +scheme.ArtifactPathAfterFinishedParams = tOptional(tObject({})); +scheme.ArtifactPathAfterFinishedResult = tObject({ + value: tString +}); +scheme.ArtifactSaveAsParams = tObject({ + path: tString +}); +scheme.ArtifactSaveAsResult = tOptional(tObject({})); +scheme.ArtifactSaveAsStreamParams = tOptional(tObject({})); +scheme.ArtifactSaveAsStreamResult = tObject({ + stream: tChannel(["Stream"]) +}); +scheme.ArtifactFailureParams = tOptional(tObject({})); +scheme.ArtifactFailureResult = tObject({ + error: tOptional(tString) +}); +scheme.ArtifactStreamParams = tOptional(tObject({})); +scheme.ArtifactStreamResult = tObject({ + stream: tChannel(["Stream"]) +}); +scheme.ArtifactCancelParams = tOptional(tObject({})); +scheme.ArtifactCancelResult = tOptional(tObject({})); +scheme.ArtifactDeleteParams = tOptional(tObject({})); +scheme.ArtifactDeleteResult = tOptional(tObject({})); +scheme.StreamInitializer = tOptional(tObject({})); +scheme.StreamReadParams = tObject({ + size: tOptional(tNumber) +}); +scheme.StreamReadResult = tObject({ + binary: tBinary +}); +scheme.StreamCloseParams = tOptional(tObject({})); +scheme.StreamCloseResult = tOptional(tObject({})); +scheme.WritableStreamInitializer = tOptional(tObject({})); +scheme.WritableStreamWriteParams = tObject({ + binary: tBinary +}); +scheme.WritableStreamWriteResult = tOptional(tObject({})); +scheme.WritableStreamCloseParams = tOptional(tObject({})); +scheme.WritableStreamCloseResult = tOptional(tObject({})); +scheme.CDPSessionInitializer = tOptional(tObject({})); +scheme.CDPSessionEventEvent = tObject({ + method: tString, + params: tOptional(tAny) +}); +scheme.CDPSessionSendParams = tObject({ + method: tString, + params: tOptional(tAny) +}); +scheme.CDPSessionSendResult = tObject({ + result: tAny +}); +scheme.CDPSessionDetachParams = tOptional(tObject({})); +scheme.CDPSessionDetachResult = tOptional(tObject({})); +scheme.ElectronInitializer = tOptional(tObject({})); +scheme.ElectronLaunchParams = tObject({ + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + cwd: tOptional(tString), + env: tOptional(tArray(tType("NameValue"))), + timeout: tNumber, + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + bypassCSP: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString) + })), + ignoreHTTPSErrors: tOptional(tBoolean), + locale: tOptional(tString), + offline: tOptional(tBoolean), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber + })) + })), + strictSelectors: tOptional(tBoolean), + timezoneId: tOptional(tString), + tracesDir: tOptional(tString), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString) +}); +scheme.ElectronLaunchResult = tObject({ + electronApplication: tChannel(["ElectronApplication"]) +}); +scheme.ElectronApplicationInitializer = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.ElectronApplicationCloseEvent = tOptional(tObject({})); +scheme.ElectronApplicationConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tNumber, + columnNumber: tNumber + }) +}); +scheme.ElectronApplicationBrowserWindowParams = tObject({ + page: tChannel(["Page"]) +}); +scheme.ElectronApplicationBrowserWindowResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.ElectronApplicationEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.ElectronApplicationEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") +}); +scheme.ElectronApplicationEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") +}); +scheme.ElectronApplicationEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) +}); +scheme.ElectronApplicationUpdateSubscriptionParams = tObject({ + event: tEnum(["console"]), + enabled: tBoolean +}); +scheme.ElectronApplicationUpdateSubscriptionResult = tOptional(tObject({})); +scheme.AndroidInitializer = tOptional(tObject({})); +scheme.AndroidDevicesParams = tObject({ + host: tOptional(tString), + port: tOptional(tNumber), + omitDriverInstall: tOptional(tBoolean) +}); +scheme.AndroidDevicesResult = tObject({ + devices: tArray(tChannel(["AndroidDevice"])) +}); +scheme.AndroidSocketInitializer = tOptional(tObject({})); +scheme.AndroidSocketDataEvent = tObject({ + data: tBinary +}); +scheme.AndroidSocketCloseEvent = tOptional(tObject({})); +scheme.AndroidSocketWriteParams = tObject({ + data: tBinary +}); +scheme.AndroidSocketWriteResult = tOptional(tObject({})); +scheme.AndroidSocketCloseParams = tOptional(tObject({})); +scheme.AndroidSocketCloseResult = tOptional(tObject({})); +scheme.AndroidDeviceInitializer = tObject({ + model: tString, + serial: tString +}); +scheme.AndroidDeviceCloseEvent = tOptional(tObject({})); +scheme.AndroidDeviceWebViewAddedEvent = tObject({ + webView: tType("AndroidWebView") +}); +scheme.AndroidDeviceWebViewRemovedEvent = tObject({ + socketName: tString +}); +scheme.AndroidDeviceWaitParams = tObject({ + androidSelector: tType("AndroidSelector"), + state: tOptional(tEnum(["gone"])), + timeout: tNumber +}); +scheme.AndroidDeviceWaitResult = tOptional(tObject({})); +scheme.AndroidDeviceFillParams = tObject({ + androidSelector: tType("AndroidSelector"), + text: tString, + timeout: tNumber +}); +scheme.AndroidDeviceFillResult = tOptional(tObject({})); +scheme.AndroidDeviceTapParams = tObject({ + androidSelector: tType("AndroidSelector"), + duration: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDeviceTapResult = tOptional(tObject({})); +scheme.AndroidDeviceDragParams = tObject({ + androidSelector: tType("AndroidSelector"), + dest: tType("Point"), + speed: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDeviceDragResult = tOptional(tObject({})); +scheme.AndroidDeviceFlingParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + speed: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDeviceFlingResult = tOptional(tObject({})); +scheme.AndroidDeviceLongTapParams = tObject({ + androidSelector: tType("AndroidSelector"), + timeout: tNumber +}); +scheme.AndroidDeviceLongTapResult = tOptional(tObject({})); +scheme.AndroidDevicePinchCloseParams = tObject({ + androidSelector: tType("AndroidSelector"), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDevicePinchCloseResult = tOptional(tObject({})); +scheme.AndroidDevicePinchOpenParams = tObject({ + androidSelector: tType("AndroidSelector"), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDevicePinchOpenResult = tOptional(tObject({})); +scheme.AndroidDeviceScrollParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDeviceScrollResult = tOptional(tObject({})); +scheme.AndroidDeviceSwipeParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + percent: tNumber, + speed: tOptional(tNumber), + timeout: tNumber +}); +scheme.AndroidDeviceSwipeResult = tOptional(tObject({})); +scheme.AndroidDeviceInfoParams = tObject({ + androidSelector: tType("AndroidSelector") +}); +scheme.AndroidDeviceInfoResult = tObject({ + info: tType("AndroidElementInfo") +}); +scheme.AndroidDeviceScreenshotParams = tOptional(tObject({})); +scheme.AndroidDeviceScreenshotResult = tObject({ + binary: tBinary +}); +scheme.AndroidDeviceInputTypeParams = tObject({ + text: tString +}); +scheme.AndroidDeviceInputTypeResult = tOptional(tObject({})); +scheme.AndroidDeviceInputPressParams = tObject({ + key: tString +}); +scheme.AndroidDeviceInputPressResult = tOptional(tObject({})); +scheme.AndroidDeviceInputTapParams = tObject({ + point: tType("Point") +}); +scheme.AndroidDeviceInputTapResult = tOptional(tObject({})); +scheme.AndroidDeviceInputSwipeParams = tObject({ + segments: tArray(tType("Point")), + steps: tNumber +}); +scheme.AndroidDeviceInputSwipeResult = tOptional(tObject({})); +scheme.AndroidDeviceInputDragParams = tObject({ + from: tType("Point"), + to: tType("Point"), + steps: tNumber +}); +scheme.AndroidDeviceInputDragResult = tOptional(tObject({})); +scheme.AndroidDeviceLaunchBrowserParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + screen: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tNumber, + latitude: tNumber, + accuracy: tOptional(tNumber) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tNumber), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tString, + size: tOptional(tObject({ + width: tNumber, + height: tNumber + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + pkg: tOptional(tString), + args: tOptional(tArray(tString)), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })) +}); +scheme.AndroidDeviceLaunchBrowserResult = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.AndroidDeviceOpenParams = tObject({ + command: tString +}); +scheme.AndroidDeviceOpenResult = tObject({ + socket: tChannel(["AndroidSocket"]) +}); +scheme.AndroidDeviceShellParams = tObject({ + command: tString +}); +scheme.AndroidDeviceShellResult = tObject({ + result: tBinary +}); +scheme.AndroidDeviceInstallApkParams = tObject({ + file: tBinary, + args: tOptional(tArray(tString)) +}); +scheme.AndroidDeviceInstallApkResult = tOptional(tObject({})); +scheme.AndroidDevicePushParams = tObject({ + file: tBinary, + path: tString, + mode: tOptional(tNumber) +}); +scheme.AndroidDevicePushResult = tOptional(tObject({})); +scheme.AndroidDeviceConnectToWebViewParams = tObject({ + socketName: tString +}); +scheme.AndroidDeviceConnectToWebViewResult = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.AndroidDeviceCloseParams = tOptional(tObject({})); +scheme.AndroidDeviceCloseResult = tOptional(tObject({})); +scheme.AndroidWebView = tObject({ + pid: tNumber, + pkg: tString, + socketName: tString +}); +scheme.AndroidSelector = tObject({ + checkable: tOptional(tBoolean), + checked: tOptional(tBoolean), + clazz: tOptional(tString), + clickable: tOptional(tBoolean), + depth: tOptional(tNumber), + desc: tOptional(tString), + enabled: tOptional(tBoolean), + focusable: tOptional(tBoolean), + focused: tOptional(tBoolean), + hasChild: tOptional(tObject({ + androidSelector: tType("AndroidSelector") + })), + hasDescendant: tOptional(tObject({ + androidSelector: tType("AndroidSelector"), + maxDepth: tOptional(tNumber) + })), + longClickable: tOptional(tBoolean), + pkg: tOptional(tString), + res: tOptional(tString), + scrollable: tOptional(tBoolean), + selected: tOptional(tBoolean), + text: tOptional(tString) +}); +scheme.AndroidElementInfo = tObject({ + children: tOptional(tArray(tType("AndroidElementInfo"))), + clazz: tString, + desc: tString, + res: tString, + pkg: tString, + text: tString, + bounds: tType("Rect"), + checkable: tBoolean, + checked: tBoolean, + clickable: tBoolean, + enabled: tBoolean, + focusable: tBoolean, + focused: tBoolean, + longClickable: tBoolean, + scrollable: tBoolean, + selected: tBoolean +}); +scheme.JsonPipeInitializer = tOptional(tObject({})); +scheme.JsonPipeMessageEvent = tObject({ + message: tAny +}); +scheme.JsonPipeClosedEvent = tObject({ + reason: tOptional(tString) +}); +scheme.JsonPipeSendParams = tObject({ + message: tAny +}); +scheme.JsonPipeSendResult = tOptional(tObject({})); +scheme.JsonPipeCloseParams = tOptional(tObject({})); +scheme.JsonPipeCloseResult = tOptional(tObject({})); +const tBrowserContextOptions = () => tObject({ + colorScheme: tOptional(tEnum(["dark", "light", "no-preference"])), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + latitude: tNumber, + longitude: tNumber + })), + viewport: tOptional(tObject({ + width: tNumber, + height: tNumber + })), + permissions: tOptional(tArray(tString)), + serviceWorkers: tOptional(tEnum(["allow", "block"])) +}); +scheme.PlaywrightInitializer = tObject({ + chromium: tChannel(["BrowserType"]), + firefox: tChannel(["BrowserType"]), + webkit: tChannel(["BrowserType"]), + bidiChromium: tChannel(["BrowserType"]), + bidiFirefox: tChannel(["BrowserType"]), + android: tChannel(["Android"]), + electron: tChannel(["Electron"]), + utils: tOptional(tChannel(["LocalUtils"])), + preLaunchedBrowser: tOptional(tChannel(["Browser"])), + preConnectedAndroidDevice: tOptional(tChannel(["AndroidDevice"])), + socksSupport: tOptional(tChannel(["SocksSupport"])), + _crx: tChannel(["Crx"]) +}); +scheme.CrxInitializer = tOptional(tObject({})); +scheme.CrxStartParams = tObject({ + slowMo: tOptional(tNumber), + artifactsDir: tOptional(tString), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + incognito: tOptional(tBoolean), + deviceName: tOptional(tString), + contextOptions: tOptional(tBrowserContextOptions()) +}); +scheme.CrxStartResult = tObject({ + crxApplication: tChannel(["CrxApplication"]) +}); +scheme.CrxApplicationInitializer = tObject({ + context: tChannel(["BrowserContext"]) +}); +scheme.CrxApplicationHideEvent = tOptional(tObject({})); +scheme.CrxApplicationShowEvent = tOptional(tObject({})); +scheme.CrxApplicationAttachedEvent = tObject({ + page: tChannel(["Page"]), + tabId: tNumber +}); +scheme.CrxApplicationDetachedEvent = tObject({ + tabId: tNumber +}); +scheme.CrxApplicationModeChangedEvent = tObject({ + mode: tEnum(["none", "recording", "inspecting", "assertingText", "recording-inspecting", "standby", "assertingVisibility", "assertingValue"]) +}); +scheme.CrxApplicationAttachParams = tObject({ + tabId: tNumber +}); +scheme.CrxApplicationAttachResult = tObject({ + page: tChannel(["Page"]) +}); +scheme.CrxApplicationAttachAllParams = tObject({ + status: tOptional(tEnum(["loading", "complete"])), + lastFocusedWindow: tOptional(tBoolean), + windowId: tOptional(tNumber), + windowType: tOptional(tEnum(["normal", "popup", "panel", "app", "devtools"])), + active: tOptional(tBoolean), + index: tOptional(tNumber), + title: tOptional(tString), + url: tOptional(tArray(tString)), + currentWindow: tOptional(tBoolean), + highlighted: tOptional(tBoolean), + discarded: tOptional(tBoolean), + autoDiscardable: tOptional(tBoolean), + pinned: tOptional(tBoolean), + audible: tOptional(tBoolean), + muted: tOptional(tBoolean), + groupId: tOptional(tNumber) +}); +scheme.CrxApplicationAttachAllResult = tObject({ + pages: tArray(tChannel(["Page"])) +}); +scheme.CrxApplicationDetachParams = tObject({ + tabId: tOptional(tNumber), + page: tOptional(tChannel(["Page"])) +}); +scheme.CrxApplicationDetachResult = tOptional(tObject({})); +scheme.CrxApplicationDetachAllParams = tOptional(tObject({})); +scheme.CrxApplicationDetachAllResult = tOptional(tObject({})); +scheme.CrxApplicationNewPageParams = tObject({ + index: tOptional(tNumber), + openerTabId: tOptional(tNumber), + url: tOptional(tString), + pinned: tOptional(tBoolean), + windowId: tOptional(tNumber), + active: tOptional(tBoolean), + selected: tOptional(tBoolean) +}); +scheme.CrxApplicationNewPageResult = tObject({ + page: tChannel(["Page"]) +}); +scheme.CrxApplicationShowRecorderParams = tObject({ + mode: tOptional(tEnum(["none", "recording", "inspecting", "assertingText", "recording-inspecting", "standby", "assertingVisibility", "assertingValue"])), + language: tOptional(tString), + testIdAttributeName: tOptional(tString), + playInIncognito: tOptional(tBoolean), + window: tOptional(tObject({ + type: tOptional(tEnum(["popup", "sidepanel"])), + url: tOptional(tString) + })) +}); +scheme.CrxApplicationShowRecorderResult = tOptional(tObject({})); +scheme.CrxApplicationHideRecorderParams = tOptional(tObject({})); +scheme.CrxApplicationHideRecorderResult = tOptional(tObject({})); +scheme.CrxApplicationSetModeParams = tObject({ + mode: tEnum(["none", "recording", "inspecting", "assertingText", "recording-inspecting", "standby", "assertingVisibility", "assertingValue"]) +}); +scheme.CrxApplicationSetModeResult = tOptional(tObject({})); +scheme.CrxApplicationCloseParams = tOptional(tObject({})); +scheme.CrxApplicationCloseResult = tOptional(tObject({})); +scheme.CrxApplicationListParams = tObject({ + code: tString +}); +scheme.CrxApplicationListResult = tObject({ + tests: tArray(tObject({ + title: tString, + options: tOptional(tObject({ + deviceName: tOptional(tString), + contextOptions: tOptional(tBrowserContextOptions()) + })), + location: tOptional(tObject({ + file: tString, + line: tOptional(tNumber), + column: tOptional(tNumber) + })) + })) +}); +scheme.CrxApplicationLoadParams = tObject({ + code: tString +}); +scheme.CrxApplicationLoadResult = tOptional(tObject({})); +scheme.CrxApplicationRunParams = tObject({ + page: tOptional(tChannel(["Page"])), + code: tString +}); +scheme.CrxApplicationRunResult = tOptional(tObject({})); +function commonjsRequire(path2) { + throw new Error('Could not dynamically require "' + path2 + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); +} +const comment = "Do not edit this file, use utils/roll_browser.js"; +const browsers = [{ "name": "chromium", "revision": "1178", "installByDefault": true, "browserVersion": "138.0.7204.15" }, { "name": "chromium-headless-shell", "revision": "1178", "installByDefault": true, "browserVersion": "138.0.7204.15" }, { "name": "chromium-tip-of-tree", "revision": "1337", "installByDefault": false, "browserVersion": "139.0.7216.0" }, { "name": "chromium-tip-of-tree-headless-shell", "revision": "1337", "installByDefault": false, "browserVersion": "139.0.7216.0" }, { "name": "firefox", "revision": "1487", "installByDefault": true, "browserVersion": "139.0" }, { "name": "firefox-beta", "revision": "1482", "installByDefault": false, "browserVersion": "138.0b10" }, { "name": "webkit", "revision": "2182", "installByDefault": true, "revisionOverrides": { "debian11-x64": "2105", "debian11-arm64": "2105", "mac10.14": "1446", "mac10.15": "1616", "mac11": "1816", "mac11-arm64": "1816", "mac12": "2009", "mac12-arm64": "2009", "mac13": "2140", "mac13-arm64": "2140", "ubuntu20.04-x64": "2092", "ubuntu20.04-arm64": "2092" }, "browserVersion": "18.5" }, { "name": "ffmpeg", "revision": "1011", "installByDefault": true, "revisionOverrides": { "mac12": "1010", "mac12-arm64": "1010" } }, { "name": "winldd", "revision": "1007", "installByDefault": false }, { "name": "android", "revision": "1001", "installByDefault": false }]; +const require$$0$5 = { + comment, + browsers +}; +var browser$g = {}; +var hasRequiredBrowser$g; +function requireBrowser$g() { + if (hasRequiredBrowser$g) return browser$g; + hasRequiredBrowser$g = 1; + browser$g.endianness = function() { + return "LE"; + }; + browser$g.hostname = function() { + if (typeof location !== "undefined") { + return location.hostname; + } else return ""; + }; + browser$g.loadavg = function() { + return []; + }; + browser$g.uptime = function() { + return 0; + }; + browser$g.freemem = function() { + return Number.MAX_VALUE; + }; + browser$g.totalmem = function() { + return Number.MAX_VALUE; + }; + browser$g.cpus = function() { + return []; + }; + browser$g.type = function() { + return "Browser"; + }; + browser$g.release = function() { + if (typeof navigator !== "undefined") { + return navigator.appVersion; + } + return ""; + }; + browser$g.networkInterfaces = browser$g.getNetworkInterfaces = function() { + return {}; + }; + browser$g.arch = function() { + return "javascript"; + }; + browser$g.platform = function() { + return "browser"; + }; + browser$g.tmpdir = browser$g.tmpDir = function() { + return "/tmp"; + }; + browser$g.EOL = "\n"; + browser$g.homedir = function() { + return "/"; + }; + return browser$g; +} +var browserExports$3 = requireBrowser$g(); +const os = /* @__PURE__ */ getDefaultExportFromCjs(browserExports$3); +var pathExports = requirePath(); +const path = /* @__PURE__ */ getDefaultExportFromCjs(pathExports); +var utilExports = requireUtil$5(); +function noop$4() { +} +const spawn = noop$4; +const spawnSync = noop$4; +const execSync = noop$4; +const fork = noop$4; +const child_process = { + spawn, + spawnSync, + execSync, + fork +}; +const child_process$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + default: child_process, + execSync, + fork, + spawn, + spawnSync +}, Symbol.toStringTag, { value: "Module" })); +var lockfile$2 = {}; +const require$$2$1 = /* @__PURE__ */ getAugmentedNamespace(fs$1); +var retry$1 = {}; +var retry_operation; +var hasRequiredRetry_operation; +function requireRetry_operation() { + if (hasRequiredRetry_operation) return retry_operation; + hasRequiredRetry_operation = 1; + function RetryOperation(timeouts, options2) { + if (typeof options2 === "boolean") { + options2 = { forever: options2 }; + } + this._originalTimeouts = JSON.parse(JSON.stringify(timeouts)); + this._timeouts = timeouts; + this._options = options2 || {}; + this._maxRetryTime = options2 && options2.maxRetryTime || Infinity; + this._fn = null; + this._errors = []; + this._attempts = 1; + this._operationTimeout = null; + this._operationTimeoutCb = null; + this._timeout = null; + this._operationStart = null; + if (this._options.forever) { + this._cachedTimeouts = this._timeouts.slice(0); + } + } + retry_operation = RetryOperation; + RetryOperation.prototype.reset = function() { + this._attempts = 1; + this._timeouts = this._originalTimeouts; + }; + RetryOperation.prototype.stop = function() { + if (this._timeout) { + clearTimeout(this._timeout); + } + this._timeouts = []; + this._cachedTimeouts = null; + }; + RetryOperation.prototype.retry = function(err) { + if (this._timeout) { + clearTimeout(this._timeout); + } + if (!err) { + return false; + } + var currentTime = (/* @__PURE__ */ new Date()).getTime(); + if (err && currentTime - this._operationStart >= this._maxRetryTime) { + this._errors.unshift(new Error("RetryOperation timeout occurred")); + return false; + } + this._errors.push(err); + var timeout = this._timeouts.shift(); + if (timeout === void 0) { + if (this._cachedTimeouts) { + this._errors.splice(this._errors.length - 1, this._errors.length); + this._timeouts = this._cachedTimeouts.slice(0); + timeout = this._timeouts.shift(); + } else { + return false; + } + } + var self2 = this; + var timer = setTimeout(function() { + self2._attempts++; + if (self2._operationTimeoutCb) { + self2._timeout = setTimeout(function() { + self2._operationTimeoutCb(self2._attempts); + }, self2._operationTimeout); + if (self2._options.unref) { + self2._timeout.unref(); + } + } + self2._fn(self2._attempts); + }, timeout); + if (this._options.unref) { + timer.unref(); + } + return true; + }; + RetryOperation.prototype.attempt = function(fn, timeoutOps) { + this._fn = fn; + if (timeoutOps) { + if (timeoutOps.timeout) { + this._operationTimeout = timeoutOps.timeout; + } + if (timeoutOps.cb) { + this._operationTimeoutCb = timeoutOps.cb; + } + } + var self2 = this; + if (this._operationTimeoutCb) { + this._timeout = setTimeout(function() { + self2._operationTimeoutCb(); + }, self2._operationTimeout); + } + this._operationStart = (/* @__PURE__ */ new Date()).getTime(); + this._fn(this._attempts); + }; + RetryOperation.prototype.try = function(fn) { + console.log("Using RetryOperation.try() is deprecated"); + this.attempt(fn); + }; + RetryOperation.prototype.start = function(fn) { + console.log("Using RetryOperation.start() is deprecated"); + this.attempt(fn); + }; + RetryOperation.prototype.start = RetryOperation.prototype.try; + RetryOperation.prototype.errors = function() { + return this._errors; + }; + RetryOperation.prototype.attempts = function() { + return this._attempts; + }; + RetryOperation.prototype.mainError = function() { + if (this._errors.length === 0) { + return null; + } + var counts = {}; + var mainError = null; + var mainErrorCount = 0; + for (var i = 0; i < this._errors.length; i++) { + var error2 = this._errors[i]; + var message = error2.message; + var count = (counts[message] || 0) + 1; + counts[message] = count; + if (count >= mainErrorCount) { + mainError = error2; + mainErrorCount = count; + } + } + return mainError; + }; + return retry_operation; +} +var hasRequiredRetry$1; +function requireRetry$1() { + if (hasRequiredRetry$1) return retry$1; + hasRequiredRetry$1 = 1; + (function(exports) { + var RetryOperation = requireRetry_operation(); + exports.operation = function(options2) { + var timeouts = exports.timeouts(options2); + return new RetryOperation(timeouts, { + forever: options2 && options2.forever, + unref: options2 && options2.unref, + maxRetryTime: options2 && options2.maxRetryTime + }); + }; + exports.timeouts = function(options2) { + if (options2 instanceof Array) { + return [].concat(options2); + } + var opts = { + retries: 10, + factor: 2, + minTimeout: 1 * 1e3, + maxTimeout: Infinity, + randomize: false + }; + for (var key2 in options2) { + opts[key2] = options2[key2]; + } + if (opts.minTimeout > opts.maxTimeout) { + throw new Error("minTimeout is greater than maxTimeout"); + } + var timeouts = []; + for (var i = 0; i < opts.retries; i++) { + timeouts.push(this.createTimeout(i, opts)); + } + if (options2 && options2.forever && !timeouts.length) { + timeouts.push(this.createTimeout(i, opts)); + } + timeouts.sort(function(a, b) { + return a - b; + }); + return timeouts; + }; + exports.createTimeout = function(attempt, opts) { + var random2 = opts.randomize ? Math.random() + 1 : 1; + var timeout = Math.round(random2 * opts.minTimeout * Math.pow(opts.factor, attempt)); + timeout = Math.min(timeout, opts.maxTimeout); + return timeout; + }; + exports.wrap = function(obj, options2, methods) { + if (options2 instanceof Array) { + methods = options2; + options2 = null; + } + if (!methods) { + methods = []; + for (var key2 in obj) { + if (typeof obj[key2] === "function") { + methods.push(key2); + } + } + } + for (var i = 0; i < methods.length; i++) { + var method = methods[i]; + var original = obj[method]; + obj[method] = (function retryWrapper(original2) { + var op = exports.operation(options2); + var args = Array.prototype.slice.call(arguments, 1); + var callback = args.pop(); + args.push(function(err) { + if (op.retry(err)) { + return; + } + if (err) { + arguments[0] = op.mainError(); + } + callback.apply(this, arguments); + }); + op.attempt(function() { + original2.apply(obj, args); + }); + }).bind(obj, original); + obj[method].options = options2; + } + }; + })(retry$1); + return retry$1; +} +var retry; +var hasRequiredRetry; +function requireRetry() { + if (hasRequiredRetry) return retry; + hasRequiredRetry = 1; + retry = requireRetry$1(); + return retry; +} +var signalExit = { exports: {} }; +var signals = { exports: {} }; +var hasRequiredSignals; +function requireSignals() { + if (hasRequiredSignals) return signals.exports; + hasRequiredSignals = 1; + (function(module) { + module.exports = [ + "SIGABRT", + "SIGALRM", + "SIGHUP", + "SIGINT", + "SIGTERM" + ]; + if (process.platform !== "win32") { + module.exports.push( + "SIGVTALRM", + "SIGXCPU", + "SIGXFSZ", + "SIGUSR2", + "SIGTRAP", + "SIGSYS", + "SIGQUIT", + "SIGIOT" + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ); + } + if (process.platform === "linux") { + module.exports.push( + "SIGIO", + "SIGPOLL", + "SIGPWR", + "SIGSTKFLT", + "SIGUNUSED" + ); + } + })(signals); + return signals.exports; +} +var hasRequiredSignalExit; +function requireSignalExit() { + if (hasRequiredSignalExit) return signalExit.exports; + hasRequiredSignalExit = 1; + var process2 = commonjsGlobal.process; + const processOk = function(process3) { + return process3 && typeof process3 === "object" && typeof process3.removeListener === "function" && typeof process3.emit === "function" && typeof process3.reallyExit === "function" && typeof process3.listeners === "function" && typeof process3.kill === "function" && typeof process3.pid === "number" && typeof process3.on === "function"; + }; + if (!processOk(process2)) { + signalExit.exports = function() { + return function() { + }; + }; + } else { + var assert2 = requireAssert(); + var signals2 = requireSignals(); + var isWin2 = /^win/i.test(process2.platform); + var EE = requireEvents(); + if (typeof EE !== "function") { + EE = EE.EventEmitter; + } + var emitter; + if (process2.__signal_exit_emitter__) { + emitter = process2.__signal_exit_emitter__; + } else { + emitter = process2.__signal_exit_emitter__ = new EE(); + emitter.count = 0; + emitter.emitted = {}; + } + if (!emitter.infinite) { + emitter.setMaxListeners(Infinity); + emitter.infinite = true; + } + signalExit.exports = function(cb, opts) { + if (!processOk(commonjsGlobal.process)) { + return function() { + }; + } + assert2.equal(typeof cb, "function", "a callback must be provided for exit handler"); + if (loaded === false) { + load(); + } + var ev = "exit"; + if (opts && opts.alwaysLast) { + ev = "afterexit"; + } + var remove = function() { + emitter.removeListener(ev, cb); + if (emitter.listeners("exit").length === 0 && emitter.listeners("afterexit").length === 0) { + unload(); + } + }; + emitter.on(ev, cb); + return remove; + }; + var unload = function unload2() { + if (!loaded || !processOk(commonjsGlobal.process)) { + return; + } + loaded = false; + signals2.forEach(function(sig) { + try { + process2.removeListener(sig, sigListeners[sig]); + } catch (er) { + } + }); + process2.emit = originalProcessEmit; + process2.reallyExit = originalProcessReallyExit; + emitter.count -= 1; + }; + signalExit.exports.unload = unload; + var emit = function emit2(event, code, signal) { + if (emitter.emitted[event]) { + return; + } + emitter.emitted[event] = true; + emitter.emit(event, code, signal); + }; + var sigListeners = {}; + signals2.forEach(function(sig) { + sigListeners[sig] = function listener() { + if (!processOk(commonjsGlobal.process)) { + return; + } + var listeners = process2.listeners(sig); + if (listeners.length === emitter.count) { + unload(); + emit("exit", null, sig); + emit("afterexit", null, sig); + if (isWin2 && sig === "SIGHUP") { + sig = "SIGINT"; + } + process2.kill(process2.pid, sig); + } + }; + }); + signalExit.exports.signals = function() { + return signals2; + }; + var loaded = false; + var load = function load2() { + if (loaded || !processOk(commonjsGlobal.process)) { + return; + } + loaded = true; + emitter.count += 1; + signals2 = signals2.filter(function(sig) { + try { + process2.on(sig, sigListeners[sig]); + return true; + } catch (er) { + return false; + } + }); + process2.emit = processEmit; + process2.reallyExit = processReallyExit; + }; + signalExit.exports.load = load; + var originalProcessReallyExit = process2.reallyExit; + var processReallyExit = function processReallyExit2(code) { + if (!processOk(commonjsGlobal.process)) { + return; + } + process2.exitCode = code || /* istanbul ignore next */ + 0; + emit("exit", process2.exitCode, null); + emit("afterexit", process2.exitCode, null); + originalProcessReallyExit.call(process2, process2.exitCode); + }; + var originalProcessEmit = process2.emit; + var processEmit = function processEmit2(ev, arg) { + if (ev === "exit" && processOk(commonjsGlobal.process)) { + if (arg !== void 0) { + process2.exitCode = arg; + } + var ret = originalProcessEmit.apply(this, arguments); + emit("exit", process2.exitCode, null); + emit("afterexit", process2.exitCode, null); + return ret; + } else { + return originalProcessEmit.apply(this, arguments); + } + }; + } + return signalExit.exports; +} +var hasRequiredLockfile; +function requireLockfile() { + if (hasRequiredLockfile) return lockfile$2; + hasRequiredLockfile = 1; + const path2 = requirePath(); + const fs2 = require$$2$1; + const retry2 = requireRetry(); + const onExit = requireSignalExit(); + const locks = {}; + const cacheSymbol = Symbol(); + function probe(file, fs3, callback) { + const cachedPrecision = fs3[cacheSymbol]; + if (cachedPrecision) { + return fs3.stat(file, (err, stat2) => { + if (err) { + return callback(err); + } + callback(null, stat2.mtime, cachedPrecision); + }); + } + const mtime = new Date(Math.ceil(Date.now() / 1e3) * 1e3 + 5); + fs3.utimes(file, mtime, mtime, (err) => { + if (err) { + return callback(err); + } + fs3.stat(file, (err2, stat2) => { + if (err2) { + return callback(err2); + } + const precision = stat2.mtime.getTime() % 1e3 === 0 ? "s" : "ms"; + Object.defineProperty(fs3, cacheSymbol, { value: precision }); + callback(null, stat2.mtime, precision); + }); + }); + } + function getMtime(precision) { + let now = Date.now(); + if (precision === "s") { + now = Math.ceil(now / 1e3) * 1e3; + } + return new Date(now); + } + function getLockFile(file, options2) { + return options2.lockfilePath || `${file}.lock`; + } + function resolveCanonicalPath(file, options2, callback) { + if (!options2.realpath) { + return callback(null, path2.resolve(file)); + } + options2.fs.realpath(file, callback); + } + function acquireLock(file, options2, callback) { + const lockfilePath = getLockFile(file, options2); + options2.fs.mkdir(lockfilePath, (err) => { + if (!err) { + return probe(lockfilePath, options2.fs, (err2, mtime, mtimePrecision) => { + if (err2) { + options2.fs.rmdir(lockfilePath, () => { + }); + return callback(err2); + } + callback(null, mtime, mtimePrecision); + }); + } + if (err.code !== "EEXIST") { + return callback(err); + } + if (options2.stale <= 0) { + return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file })); + } + options2.fs.stat(lockfilePath, (err2, stat2) => { + if (err2) { + if (err2.code === "ENOENT") { + return acquireLock(file, { ...options2, stale: 0 }, callback); + } + return callback(err2); + } + if (!isLockStale(stat2, options2)) { + return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file })); + } + removeLock(file, options2, (err3) => { + if (err3) { + return callback(err3); + } + acquireLock(file, { ...options2, stale: 0 }, callback); + }); + }); + }); + } + function isLockStale(stat2, options2) { + return stat2.mtime.getTime() < Date.now() - options2.stale; + } + function removeLock(file, options2, callback) { + options2.fs.rmdir(getLockFile(file, options2), (err) => { + if (err && err.code !== "ENOENT") { + return callback(err); + } + callback(); + }); + } + function updateLock(file, options2) { + const lock2 = locks[file]; + if (lock2.updateTimeout) { + return; + } + lock2.updateDelay = lock2.updateDelay || options2.update; + lock2.updateTimeout = setTimeout(() => { + lock2.updateTimeout = null; + options2.fs.stat(lock2.lockfilePath, (err, stat2) => { + const isOverThreshold = lock2.lastUpdate + options2.stale < Date.now(); + if (err) { + if (err.code === "ENOENT" || isOverThreshold) { + return setLockAsCompromised(file, lock2, Object.assign(err, { code: "ECOMPROMISED" })); + } + lock2.updateDelay = 1e3; + return updateLock(file, options2); + } + const isMtimeOurs = lock2.mtime.getTime() === stat2.mtime.getTime(); + if (!isMtimeOurs) { + return setLockAsCompromised( + file, + lock2, + Object.assign( + new Error("Unable to update lock within the stale threshold"), + { code: "ECOMPROMISED" } + ) + ); + } + const mtime = getMtime(lock2.mtimePrecision); + options2.fs.utimes(lock2.lockfilePath, mtime, mtime, (err2) => { + const isOverThreshold2 = lock2.lastUpdate + options2.stale < Date.now(); + if (lock2.released) { + return; + } + if (err2) { + if (err2.code === "ENOENT" || isOverThreshold2) { + return setLockAsCompromised(file, lock2, Object.assign(err2, { code: "ECOMPROMISED" })); + } + lock2.updateDelay = 1e3; + return updateLock(file, options2); + } + lock2.mtime = mtime; + lock2.lastUpdate = Date.now(); + lock2.updateDelay = null; + updateLock(file, options2); + }); + }); + }, lock2.updateDelay); + if (lock2.updateTimeout.unref) { + lock2.updateTimeout.unref(); + } + } + function setLockAsCompromised(file, lock2, err) { + lock2.released = true; + if (lock2.updateTimeout) { + clearTimeout(lock2.updateTimeout); + } + if (locks[file] === lock2) { + delete locks[file]; + } + lock2.options.onCompromised(err); + } + function lock(file, options2, callback) { + options2 = { + stale: 1e4, + update: null, + realpath: true, + retries: 0, + fs: fs2, + onCompromised: (err) => { + throw err; + }, + ...options2 + }; + options2.retries = options2.retries || 0; + options2.retries = typeof options2.retries === "number" ? { retries: options2.retries } : options2.retries; + options2.stale = Math.max(options2.stale || 0, 2e3); + options2.update = options2.update == null ? options2.stale / 2 : options2.update || 0; + options2.update = Math.max(Math.min(options2.update, options2.stale / 2), 1e3); + resolveCanonicalPath(file, options2, (err, file2) => { + if (err) { + return callback(err); + } + const operation = retry2.operation(options2.retries); + operation.attempt(() => { + acquireLock(file2, options2, (err2, mtime, mtimePrecision) => { + if (operation.retry(err2)) { + return; + } + if (err2) { + return callback(operation.mainError()); + } + const lock2 = locks[file2] = { + lockfilePath: getLockFile(file2, options2), + mtime, + mtimePrecision, + options: options2, + lastUpdate: Date.now() + }; + updateLock(file2, options2); + callback(null, (releasedCallback) => { + if (lock2.released) { + return releasedCallback && releasedCallback(Object.assign(new Error("Lock is already released"), { code: "ERELEASED" })); + } + unlock(file2, { ...options2, realpath: false }, releasedCallback); + }); + }); + }); + }); + } + function unlock(file, options2, callback) { + options2 = { + fs: fs2, + realpath: true, + ...options2 + }; + resolveCanonicalPath(file, options2, (err, file2) => { + if (err) { + return callback(err); + } + const lock2 = locks[file2]; + if (!lock2) { + return callback(Object.assign(new Error("Lock is not acquired/owned by you"), { code: "ENOTACQUIRED" })); + } + lock2.updateTimeout && clearTimeout(lock2.updateTimeout); + lock2.released = true; + delete locks[file2]; + removeLock(file2, options2, callback); + }); + } + function toPromise(method) { + return (...args) => new Promise((resolve, reject) => { + args.push((err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + method(...args); + }); + } + let cleanupInitialized = false; + function ensureCleanup() { + if (cleanupInitialized) { + return; + } + cleanupInitialized = true; + onExit(() => { + for (const file in locks) { + const options2 = locks[file].options; + try { + options2.fs.rmdirSync(getLockFile(file, options2)); + } catch (e) { + } + } + }); + } + lockfile$2.lock = async (file, options2) => { + ensureCleanup(); + const release = await toPromise(lock)(file, options2); + return toPromise(release); + }; + return lockfile$2; +} +var safe = { exports: {} }; +var colors$2 = { exports: {} }; +var styles = { exports: {} }; +var hasRequiredStyles; +function requireStyles() { + if (hasRequiredStyles) return styles.exports; + hasRequiredStyles = 1; + (function(module) { + var styles2 = {}; + module["exports"] = styles2; + var codes = { + reset: [0, 0], + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + grey: [90, 39], + brightRed: [91, 39], + brightGreen: [92, 39], + brightYellow: [93, 39], + brightBlue: [94, 39], + brightMagenta: [95, 39], + brightCyan: [96, 39], + brightWhite: [97, 39], + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + bgGray: [100, 49], + bgGrey: [100, 49], + bgBrightRed: [101, 49], + bgBrightGreen: [102, 49], + bgBrightYellow: [103, 49], + bgBrightBlue: [104, 49], + bgBrightMagenta: [105, 49], + bgBrightCyan: [106, 49], + bgBrightWhite: [107, 49], + // legacy styles for colors pre v1.0.0 + blackBG: [40, 49], + redBG: [41, 49], + greenBG: [42, 49], + yellowBG: [43, 49], + blueBG: [44, 49], + magentaBG: [45, 49], + cyanBG: [46, 49], + whiteBG: [47, 49] + }; + Object.keys(codes).forEach(function(key2) { + var val = codes[key2]; + var style = styles2[key2] = []; + style.open = "\x1B[" + val[0] + "m"; + style.close = "\x1B[" + val[1] + "m"; + }); + })(styles); + return styles.exports; +} +var hasFlag; +var hasRequiredHasFlag; +function requireHasFlag() { + if (hasRequiredHasFlag) return hasFlag; + hasRequiredHasFlag = 1; + hasFlag = function(flag, argv) { + argv = argv || process.argv; + var terminatorPos = argv.indexOf("--"); + var prefix = /^-{1,2}/.test(flag) ? "" : "--"; + var pos = argv.indexOf(prefix + flag); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); + }; + return hasFlag; +} +var supportsColors; +var hasRequiredSupportsColors; +function requireSupportsColors() { + if (hasRequiredSupportsColors) return supportsColors; + hasRequiredSupportsColors = 1; + var os2 = requireBrowser$g(); + var hasFlag2 = requireHasFlag(); + var env = define_process_env_default; + var forceColor = void 0; + if (hasFlag2("no-color") || hasFlag2("no-colors") || hasFlag2("color=false")) { + forceColor = false; + } else if (hasFlag2("color") || hasFlag2("colors") || hasFlag2("color=true") || hasFlag2("color=always")) { + forceColor = true; + } + if ("FORCE_COLOR" in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; + } + function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + } + function supportsColor(stream2) { + if (forceColor === false) { + return 0; + } + if (hasFlag2("color=16m") || hasFlag2("color=full") || hasFlag2("color=truecolor")) { + return 3; + } + if (hasFlag2("color=256")) { + return 2; + } + if (stream2 && !stream2.isTTY && forceColor !== true) { + return 0; + } + var min2 = forceColor ? 1 : 0; + if (process.platform === "win32") { + var osRelease2 = os2.release().split("."); + if (Number(process.versions.node.split(".")[0]) >= 8 && Number(osRelease2[0]) >= 10 && Number(osRelease2[2]) >= 10586) { + return Number(osRelease2[2]) >= 14931 ? 3 : 2; + } + return 1; + } + if ("CI" in env) { + if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI"].some(function(sign2) { + return sign2 in env; + }) || env.CI_NAME === "codeship") { + return 1; + } + return min2; + } + if ("TEAMCITY_VERSION" in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + if ("TERM_PROGRAM" in env) { + var version2 = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (env.TERM_PROGRAM) { + case "iTerm.app": + return version2 >= 3 ? 3 : 2; + case "Hyper": + return 3; + case "Apple_Terminal": + return 2; + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ("COLORTERM" in env) { + return 1; + } + if (env.TERM === "dumb") { + return min2; + } + return min2; + } + function getSupportLevel(stream2) { + var level = supportsColor(stream2); + return translateLevel(level); + } + supportsColors = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) + }; + return supportsColors; +} +var trap = { exports: {} }; +var hasRequiredTrap; +function requireTrap() { + if (hasRequiredTrap) return trap.exports; + hasRequiredTrap = 1; + (function(module) { + module["exports"] = function runTheTrap(text, options2) { + var result = ""; + text = text || "Run the trap, drop the bass"; + text = text.split(""); + var trap2 = { + a: ["@", "Ą", "Ⱥ", "Ʌ", "Δ", "Λ", "Д"], + b: ["ß", "Ɓ", "Ƀ", "ɮ", "β", "฿"], + c: ["©", "Ȼ", "Ͼ"], + d: ["Ð", "Ɗ", "Ԁ", "ԁ", "Ԃ", "ԃ"], + e: [ + "Ë", + "ĕ", + "Ǝ", + "ɘ", + "Σ", + "ξ", + "Ҽ", + "੬" + ], + f: ["Ӻ"], + g: ["ɢ"], + h: ["Ħ", "ƕ", "Ң", "Һ", "Ӈ", "Ԋ"], + i: ["༏"], + j: ["Ĵ"], + k: ["ĸ", "Ҡ", "Ӄ", "Ԟ"], + l: ["Ĺ"], + m: ["ʍ", "Ӎ", "ӎ", "Ԡ", "ԡ", "൩"], + n: ["Ñ", "ŋ", "Ɲ", "Ͷ", "Π", "Ҋ"], + o: [ + "Ø", + "õ", + "ø", + "Ǿ", + "ʘ", + "Ѻ", + "ם", + "۝", + "๏" + ], + p: ["Ƿ", "Ҏ"], + q: ["্"], + r: ["®", "Ʀ", "Ȑ", "Ɍ", "ʀ", "Я"], + s: ["§", "Ϟ", "ϟ", "Ϩ"], + t: ["Ł", "Ŧ", "ͳ"], + u: ["Ʊ", "Ս"], + v: ["ט"], + w: ["Ш", "Ѡ", "Ѽ", "൰"], + x: ["Ҳ", "Ӿ", "Ӽ", "ӽ"], + y: ["¥", "Ұ", "Ӌ"], + z: ["Ƶ", "ɀ"] + }; + text.forEach(function(c) { + c = c.toLowerCase(); + var chars = trap2[c] || [" "]; + var rand = Math.floor(Math.random() * chars.length); + if (typeof trap2[c] !== "undefined") { + result += trap2[c][rand]; + } else { + result += c; + } + }); + return result; + }; + })(trap); + return trap.exports; +} +var zalgo = { exports: {} }; +var hasRequiredZalgo; +function requireZalgo() { + if (hasRequiredZalgo) return zalgo.exports; + hasRequiredZalgo = 1; + (function(module) { + module["exports"] = function zalgo2(text, options2) { + text = text || " he is here "; + var soul = { + "up": [ + "̍", + "̎", + "̄", + "̅", + "̿", + "̑", + "̆", + "̐", + "͒", + "͗", + "͑", + "̇", + "̈", + "̊", + "͂", + "̓", + "̈", + "͊", + "͋", + "͌", + "̃", + "̂", + "̌", + "͐", + "̀", + "́", + "̋", + "̏", + "̒", + "̓", + "̔", + "̽", + "̉", + "ͣ", + "ͤ", + "ͥ", + "ͦ", + "ͧ", + "ͨ", + "ͩ", + "ͪ", + "ͫ", + "ͬ", + "ͭ", + "ͮ", + "ͯ", + "̾", + "͛", + "͆", + "̚" + ], + "down": [ + "̖", + "̗", + "̘", + "̙", + "̜", + "̝", + "̞", + "̟", + "̠", + "̤", + "̥", + "̦", + "̩", + "̪", + "̫", + "̬", + "̭", + "̮", + "̯", + "̰", + "̱", + "̲", + "̳", + "̹", + "̺", + "̻", + "̼", + "ͅ", + "͇", + "͈", + "͉", + "͍", + "͎", + "͓", + "͔", + "͕", + "͖", + "͙", + "͚", + "̣" + ], + "mid": [ + "̕", + "̛", + "̀", + "́", + "͘", + "̡", + "̢", + "̧", + "̨", + "̴", + "̵", + "̶", + "͜", + "͝", + "͞", + "͟", + "͠", + "͢", + "̸", + "̷", + "͡", + " ҉" + ] + }; + var all = [].concat(soul.up, soul.down, soul.mid); + function randomNumber(range2) { + var r = Math.floor(Math.random() * range2); + return r; + } + function isChar(character) { + var bool = false; + all.filter(function(i) { + bool = i === character; + }); + return bool; + } + function heComes(text2, options3) { + var result = ""; + var counts; + var l; + options3 = options3 || {}; + options3["up"] = typeof options3["up"] !== "undefined" ? options3["up"] : true; + options3["mid"] = typeof options3["mid"] !== "undefined" ? options3["mid"] : true; + options3["down"] = typeof options3["down"] !== "undefined" ? options3["down"] : true; + options3["size"] = typeof options3["size"] !== "undefined" ? options3["size"] : "maxi"; + text2 = text2.split(""); + for (l in text2) { + if (isChar(l)) { + continue; + } + result = result + text2[l]; + counts = { "up": 0, "down": 0, "mid": 0 }; + switch (options3.size) { + case "mini": + counts.up = randomNumber(8); + counts.mid = randomNumber(2); + counts.down = randomNumber(8); + break; + case "maxi": + counts.up = randomNumber(16) + 3; + counts.mid = randomNumber(4) + 1; + counts.down = randomNumber(64) + 3; + break; + default: + counts.up = randomNumber(8) + 1; + counts.mid = randomNumber(6) / 2; + counts.down = randomNumber(8) + 1; + break; + } + var arr = ["up", "mid", "down"]; + for (var d in arr) { + var index2 = arr[d]; + for (var i = 0; i <= counts[index2]; i++) { + if (options3[index2]) { + result = result + soul[index2][randomNumber(soul[index2].length)]; + } + } + } + } + return result; + } + return heComes(text, options2); + }; + })(zalgo); + return zalgo.exports; +} +var america = { exports: {} }; +var hasRequiredAmerica; +function requireAmerica() { + if (hasRequiredAmerica) return america.exports; + hasRequiredAmerica = 1; + (function(module) { + module["exports"] = function(colors2) { + return function(letter2, i, exploded) { + if (letter2 === " ") return letter2; + switch (i % 3) { + case 0: + return colors2.red(letter2); + case 1: + return colors2.white(letter2); + case 2: + return colors2.blue(letter2); + } + }; + }; + })(america); + return america.exports; +} +var zebra = { exports: {} }; +var hasRequiredZebra; +function requireZebra() { + if (hasRequiredZebra) return zebra.exports; + hasRequiredZebra = 1; + (function(module) { + module["exports"] = function(colors2) { + return function(letter2, i, exploded) { + return i % 2 === 0 ? letter2 : colors2.inverse(letter2); + }; + }; + })(zebra); + return zebra.exports; +} +var rainbow = { exports: {} }; +var hasRequiredRainbow; +function requireRainbow() { + if (hasRequiredRainbow) return rainbow.exports; + hasRequiredRainbow = 1; + (function(module) { + module["exports"] = function(colors2) { + var rainbowColors = ["red", "yellow", "green", "blue", "magenta"]; + return function(letter2, i, exploded) { + if (letter2 === " ") { + return letter2; + } else { + return colors2[rainbowColors[i++ % rainbowColors.length]](letter2); + } + }; + }; + })(rainbow); + return rainbow.exports; +} +var random = { exports: {} }; +var hasRequiredRandom; +function requireRandom() { + if (hasRequiredRandom) return random.exports; + hasRequiredRandom = 1; + (function(module) { + module["exports"] = function(colors2) { + var available = [ + "underline", + "inverse", + "grey", + "yellow", + "red", + "green", + "blue", + "white", + "cyan", + "magenta", + "brightYellow", + "brightRed", + "brightGreen", + "brightBlue", + "brightWhite", + "brightCyan", + "brightMagenta" + ]; + return function(letter2, i, exploded) { + return letter2 === " " ? letter2 : colors2[available[Math.round(Math.random() * (available.length - 2))]](letter2); + }; + }; + })(random); + return random.exports; +} +var hasRequiredColors; +function requireColors() { + if (hasRequiredColors) return colors$2.exports; + hasRequiredColors = 1; + (function(module) { + var colors2 = {}; + module["exports"] = colors2; + colors2.themes = {}; + var util2 = requireUtil$5(); + var ansiStyles = colors2.styles = requireStyles(); + var defineProps = Object.defineProperties; + var newLineRegex = new RegExp(/[\r\n]+/g); + colors2.supportsColor = requireSupportsColors().supportsColor; + if (typeof colors2.enabled === "undefined") { + colors2.enabled = colors2.supportsColor() !== false; + } + colors2.enable = function() { + colors2.enabled = true; + }; + colors2.disable = function() { + colors2.enabled = false; + }; + colors2.stripColors = colors2.strip = function(str) { + return ("" + str).replace(/\x1B\[\d+m/g, ""); + }; + colors2.stylize = function stylize(str, style) { + if (!colors2.enabled) { + return str + ""; + } + var styleMap = ansiStyles[style]; + if (!styleMap && style in colors2) { + return colors2[style](str); + } + return styleMap.open + str + styleMap.close; + }; + var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + var escapeStringRegexp = function(str) { + if (typeof str !== "string") { + throw new TypeError("Expected a string"); + } + return str.replace(matchOperatorsRe, "\\$&"); + }; + function build2(_styles) { + var builder = function builder2() { + return applyStyle.apply(builder2, arguments); + }; + builder._styles = _styles; + builder.__proto__ = proto; + return builder; + } + var styles2 = function() { + var ret = {}; + ansiStyles.grey = ansiStyles.gray; + Object.keys(ansiStyles).forEach(function(key2) { + ansiStyles[key2].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key2].close), "g"); + ret[key2] = { + get: function() { + return build2(this._styles.concat(key2)); + } + }; + }); + return ret; + }(); + var proto = defineProps(function colors3() { + }, styles2); + function applyStyle() { + var args = Array.prototype.slice.call(arguments); + var str = args.map(function(arg) { + if (arg != null && arg.constructor === String) { + return arg; + } else { + return util2.inspect(arg); + } + }).join(" "); + if (!colors2.enabled || !str) { + return str; + } + var newLinesPresent = str.indexOf("\n") != -1; + var nestedStyles = this._styles; + var i = nestedStyles.length; + while (i--) { + var code = ansiStyles[nestedStyles[i]]; + str = code.open + str.replace(code.closeRe, code.open) + code.close; + if (newLinesPresent) { + str = str.replace(newLineRegex, function(match) { + return code.close + match + code.open; + }); + } + } + return str; + } + colors2.setTheme = function(theme) { + if (typeof theme === "string") { + console.log("colors.setTheme now only accepts an object, not a string. If you are trying to set a theme from a file, it is now your (the caller's) responsibility to require the file. The old syntax looked like colors.setTheme(__dirname + '/../themes/generic-logging.js'); The new syntax looks like colors.setTheme(require(__dirname + '/../themes/generic-logging.js'));"); + return; + } + for (var style in theme) { + (function(style2) { + colors2[style2] = function(str) { + if (typeof theme[style2] === "object") { + var out = str; + for (var i in theme[style2]) { + out = colors2[theme[style2][i]](out); + } + return out; + } + return colors2[theme[style2]](str); + }; + })(style); + } + }; + function init() { + var ret = {}; + Object.keys(styles2).forEach(function(name) { + ret[name] = { + get: function() { + return build2([name]); + } + }; + }); + return ret; + } + var sequencer = function sequencer2(map3, str) { + var exploded = str.split(""); + exploded = exploded.map(map3); + return exploded.join(""); + }; + colors2.trap = requireTrap(); + colors2.zalgo = requireZalgo(); + colors2.maps = {}; + colors2.maps.america = requireAmerica()(colors2); + colors2.maps.zebra = requireZebra()(colors2); + colors2.maps.rainbow = requireRainbow()(colors2); + colors2.maps.random = requireRandom()(colors2); + for (var map2 in colors2.maps) { + (function(map3) { + colors2[map3] = function(str) { + return sequencer(colors2.maps[map3], str); + }; + })(map2); + } + defineProps(colors2, init()); + })(colors$2); + return colors$2.exports; +} +var hasRequiredSafe; +function requireSafe() { + if (hasRequiredSafe) return safe.exports; + hasRequiredSafe = 1; + (function(module) { + var colors2 = requireColors(); + module["exports"] = colors2; + })(safe); + return safe.exports; +} +var safeExports = requireSafe(); +const colorsLibrary = /* @__PURE__ */ getDefaultExportFromCjs(safeExports); +var browser$f = { exports: {} }; +var ms; +var hasRequiredMs; +function requireMs() { + if (hasRequiredMs) return ms; + hasRequiredMs = 1; + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + ms = function(val, options2) { + options2 = options2 || {}; + var type2 = typeof val; + if (type2 === "string" && val.length > 0) { + return parse4(val); + } else if (type2 === "number" && isFinite(val)) { + return options2.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse4(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type2 = (match[2] || "ms").toLowerCase(); + switch (type2) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "weeks": + case "week": + case "w": + return n * w; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms2) { + var msAbs = Math.abs(ms2); + if (msAbs >= d) { + return Math.round(ms2 / d) + "d"; + } + if (msAbs >= h) { + return Math.round(ms2 / h) + "h"; + } + if (msAbs >= m) { + return Math.round(ms2 / m) + "m"; + } + if (msAbs >= s) { + return Math.round(ms2 / s) + "s"; + } + return ms2 + "ms"; + } + function fmtLong(ms2) { + var msAbs = Math.abs(ms2); + if (msAbs >= d) { + return plural(ms2, msAbs, d, "day"); + } + if (msAbs >= h) { + return plural(ms2, msAbs, h, "hour"); + } + if (msAbs >= m) { + return plural(ms2, msAbs, m, "minute"); + } + if (msAbs >= s) { + return plural(ms2, msAbs, s, "second"); + } + return ms2 + " ms"; + } + function plural(ms2, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms2 / n) + " " + name + (isPlural ? "s" : ""); + } + return ms; +} +var common$4; +var hasRequiredCommon$4; +function requireCommon$4() { + if (hasRequiredCommon$4) return common$4; + hasRequiredCommon$4 = 1; + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = requireMs(); + createDebug.destroy = destroy; + Object.keys(env).forEach((key2) => { + createDebug[key2] = env[key2]; + }); + createDebug.names = []; + createDebug.skips = []; + createDebug.formatters = {}; + function selectColor(namespace) { + let hash2 = 0; + for (let i = 0; i < namespace.length; i++) { + hash2 = (hash2 << 5) - hash2 + namespace.charCodeAt(i); + hash2 |= 0; + } + return createDebug.colors[Math.abs(hash2) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + function debug2(...args) { + if (!debug2.enabled) { + return; + } + const self2 = debug2; + const curr = Number(/* @__PURE__ */ new Date()); + const ms2 = curr - (prevTime || curr); + self2.diff = ms2; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + if (typeof args[0] !== "string") { + args.unshift("%O"); + } + let index2 = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + if (match === "%%") { + return "%"; + } + index2++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === "function") { + const val = args[index2]; + match = formatter.call(self2, val); + args.splice(index2, 1); + index2--; + } + return match; + }); + createDebug.formatArgs.call(self2, args); + const logFn = self2.log || createDebug.log; + logFn.apply(self2, args); + } + debug2.namespace = namespace; + debug2.useColors = createDebug.useColors(); + debug2.color = createDebug.selectColor(namespace); + debug2.extend = extend2; + debug2.destroy = createDebug.destroy; + Object.defineProperty(debug2, "enabled", { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + return enabledCache; + }, + set: (v) => { + enableOverride = v; + } + }); + if (typeof createDebug.init === "function") { + createDebug.init(debug2); + } + return debug2; + } + function extend2(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + createDebug.names = []; + createDebug.skips = []; + let i; + const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + const len = split.length; + for (i = 0; i < len; i++) { + if (!split[i]) { + continue; + } + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); + } else { + createDebug.names.push(new RegExp("^" + namespaces + "$")); + } + } + } + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) + ].join(","); + createDebug.enable(""); + return namespaces; + } + function enabled(name) { + if (name[name.length - 1] === "*") { + return true; + } + let i; + let len; + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + return false; + } + function toNamespace(regexp) { + return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); + } + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + function destroy() { + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + createDebug.enable(createDebug.load()); + return createDebug; + } + common$4 = setup; + return common$4; +} +var hasRequiredBrowser$f; +function requireBrowser$f() { + if (hasRequiredBrowser$f) return browser$f.exports; + hasRequiredBrowser$f = 1; + (function(module, exports) { + exports.formatArgs = formatArgs; + exports.save = save; + exports.load = load; + exports.useColors = useColors; + exports.storage = localstorage(); + exports.destroy = /* @__PURE__ */ (() => { + let warned = false; + return () => { + if (!warned) { + warned = true; + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + }; + })(); + exports.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 + typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + function formatArgs(args) { + args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module.exports.humanize(this.diff); + if (!this.useColors) { + return; + } + const c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + let index2 = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, (match) => { + if (match === "%%") { + return; + } + index2++; + if (match === "%c") { + lastC = index2; + } + }); + args.splice(lastC, 0, c); + } + exports.log = console.debug || console.log || (() => { + }); + function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem("debug", namespaces); + } else { + exports.storage.removeItem("debug"); + } + } catch (error2) { + } + } + function load() { + let r; + try { + r = exports.storage.getItem("debug"); + } catch (error2) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = define_process_env_default.DEBUG; + } + return r; + } + function localstorage() { + try { + return localStorage; + } catch (error2) { + } + } + module.exports = requireCommon$4()(exports); + const { formatters } = module.exports; + formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (error2) { + return "[UnexpectedJSONParseError]: " + error2.message; + } + }; + })(browser$f, browser$f.exports); + return browser$f.exports; +} +var browserExports$2 = requireBrowser$f(); +const debugLibrary = /* @__PURE__ */ getDefaultExportFromCjs(browserExports$2); +function Diff() { +} +Diff.prototype = { + diff: function diff(oldString, newString) { + var _options$timeout; + var options2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; + var callback = options2.callback; + if (typeof options2 === "function") { + callback = options2; + options2 = {}; + } + var self2 = this; + function done(value) { + value = self2.postProcess(value, options2); + if (callback) { + setTimeout(function() { + callback(value); + }, 0); + return true; + } else { + return value; + } + } + oldString = this.castInput(oldString, options2); + newString = this.castInput(newString, options2); + oldString = this.removeEmpty(this.tokenize(oldString, options2)); + newString = this.removeEmpty(this.tokenize(newString, options2)); + var newLen = newString.length, oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + if (options2.maxEditLength != null) { + maxEditLength = Math.min(maxEditLength, options2.maxEditLength); + } + var maxExecutionTime = (_options$timeout = options2.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : Infinity; + var abortAfterTimestamp = Date.now() + maxExecutionTime; + var bestPath = [{ + oldPos: -1, + lastComponent: void 0 + }]; + var newPos = this.extractCommon(bestPath[0], newString, oldString, 0, options2); + if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) { + return done(buildValues(self2, bestPath[0].lastComponent, newString, oldString, self2.useLongestToken)); + } + var minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity; + function execEditLength() { + for (var diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) { + var basePath = void 0; + var removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1]; + if (removePath) { + bestPath[diagonalPath - 1] = void 0; + } + var canAdd = false; + if (addPath) { + var addPathNewPos = addPath.oldPos - diagonalPath; + canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen; + } + var canRemove = removePath && removePath.oldPos + 1 < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = void 0; + continue; + } + if (!canRemove || canAdd && removePath.oldPos < addPath.oldPos) { + basePath = self2.addToPath(addPath, true, false, 0, options2); + } else { + basePath = self2.addToPath(removePath, false, true, 1, options2); + } + newPos = self2.extractCommon(basePath, newString, oldString, diagonalPath, options2); + if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) { + return done(buildValues(self2, basePath.lastComponent, newString, oldString, self2.useLongestToken)); + } else { + bestPath[diagonalPath] = basePath; + if (basePath.oldPos + 1 >= oldLen) { + maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1); + } + if (newPos + 1 >= newLen) { + minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1); + } + } + } + editLength++; + } + if (callback) { + (function exec() { + setTimeout(function() { + if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) { + return callback(); + } + if (!execEditLength()) { + exec(); + } + }, 0); + })(); + } else { + while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + }, + addToPath: function addToPath(path2, added, removed, oldPosInc, options2) { + var last = path2.lastComponent; + if (last && !options2.oneChangePerToken && last.added === added && last.removed === removed) { + return { + oldPos: path2.oldPos + oldPosInc, + lastComponent: { + count: last.count + 1, + added, + removed, + previousComponent: last.previousComponent + } + }; + } else { + return { + oldPos: path2.oldPos + oldPosInc, + lastComponent: { + count: 1, + added, + removed, + previousComponent: last + } + }; + } + }, + extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath, options2) { + var newLen = newString.length, oldLen = oldString.length, oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldString[oldPos + 1], newString[newPos + 1], options2)) { + newPos++; + oldPos++; + commonCount++; + if (options2.oneChangePerToken) { + basePath.lastComponent = { + count: 1, + previousComponent: basePath.lastComponent, + added: false, + removed: false + }; + } + } + if (commonCount && !options2.oneChangePerToken) { + basePath.lastComponent = { + count: commonCount, + previousComponent: basePath.lastComponent, + added: false, + removed: false + }; + } + basePath.oldPos = oldPos; + return newPos; + }, + equals: function equals(left, right, options2) { + if (options2.comparator) { + return options2.comparator(left, right); + } else { + return left === right || options2.ignoreCase && left.toLowerCase() === right.toLowerCase(); + } + }, + removeEmpty: function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + }, + castInput: function castInput(value) { + return value; + }, + tokenize: function tokenize(value) { + return Array.from(value); + }, + join: function join(chars) { + return chars.join(""); + }, + postProcess: function postProcess(changeObjects) { + return changeObjects; + } +}; +function buildValues(diff3, lastComponent, newString, oldString, useLongestToken) { + var components = []; + var nextComponent; + while (lastComponent) { + components.push(lastComponent); + nextComponent = lastComponent.previousComponent; + delete lastComponent.previousComponent; + lastComponent = nextComponent; + } + components.reverse(); + var componentPos = 0, componentLen = components.length, newPos = 0, oldPos = 0; + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = value.map(function(value2, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value2.length ? oldValue : value2; + }); + component.value = diff3.join(value); + } else { + component.value = diff3.join(newString.slice(newPos, newPos + component.count)); + } + newPos += component.count; + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = diff3.join(oldString.slice(oldPos, oldPos + component.count)); + oldPos += component.count; + } + } + return components; +} +var characterDiff = new Diff(); +function diffChars(oldStr, newStr, options2) { + return characterDiff.diff(oldStr, newStr, options2); +} +function longestCommonPrefix(str1, str2) { + var i; + for (i = 0; i < str1.length && i < str2.length; i++) { + if (str1[i] != str2[i]) { + return str1.slice(0, i); + } + } + return str1.slice(0, i); +} +function longestCommonSuffix(str1, str2) { + var i; + if (!str1 || !str2 || str1[str1.length - 1] != str2[str2.length - 1]) { + return ""; + } + for (i = 0; i < str1.length && i < str2.length; i++) { + if (str1[str1.length - (i + 1)] != str2[str2.length - (i + 1)]) { + return str1.slice(-i); + } + } + return str1.slice(-i); +} +function replacePrefix(string2, oldPrefix, newPrefix) { + if (string2.slice(0, oldPrefix.length) != oldPrefix) { + throw Error("string ".concat(JSON.stringify(string2), " doesn't start with prefix ").concat(JSON.stringify(oldPrefix), "; this is a bug")); + } + return newPrefix + string2.slice(oldPrefix.length); +} +function replaceSuffix(string2, oldSuffix, newSuffix) { + if (!oldSuffix) { + return string2 + newSuffix; + } + if (string2.slice(-oldSuffix.length) != oldSuffix) { + throw Error("string ".concat(JSON.stringify(string2), " doesn't end with suffix ").concat(JSON.stringify(oldSuffix), "; this is a bug")); + } + return string2.slice(0, -oldSuffix.length) + newSuffix; +} +function removePrefix(string2, oldPrefix) { + return replacePrefix(string2, oldPrefix, ""); +} +function removeSuffix(string2, oldSuffix) { + return replaceSuffix(string2, oldSuffix, ""); +} +function maximumOverlap(string1, string2) { + return string2.slice(0, overlapCount(string1, string2)); +} +function overlapCount(a, b) { + var startA = 0; + if (a.length > b.length) { + startA = a.length - b.length; + } + var endB = b.length; + if (a.length < b.length) { + endB = a.length; + } + var map2 = Array(endB); + var k = 0; + map2[0] = 0; + for (var j = 1; j < endB; j++) { + if (b[j] == b[k]) { + map2[j] = map2[k]; + } else { + map2[j] = k; + } + while (k > 0 && b[j] != b[k]) { + k = map2[k]; + } + if (b[j] == b[k]) { + k++; + } + } + k = 0; + for (var i = startA; i < a.length; i++) { + while (k > 0 && a[i] != b[k]) { + k = map2[k]; + } + if (a[i] == b[k]) { + k++; + } + } + return k; +} +function hasOnlyWinLineEndings(string2) { + return string2.includes("\r\n") && !string2.startsWith("\n") && !string2.match(/[^\r]\n/); +} +function hasOnlyUnixLineEndings(string2) { + return !string2.includes("\r\n") && string2.includes("\n"); +} +var extendedWordChars = "a-zA-Z0-9_\\u{C0}-\\u{FF}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}"; +var tokenizeIncludingWhitespace = new RegExp("[".concat(extendedWordChars, "]+|\\s+|[^").concat(extendedWordChars, "]"), "ug"); +var wordDiff = new Diff(); +wordDiff.equals = function(left, right, options2) { + if (options2.ignoreCase) { + left = left.toLowerCase(); + right = right.toLowerCase(); + } + return left.trim() === right.trim(); +}; +wordDiff.tokenize = function(value) { + var options2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var parts; + if (options2.intlSegmenter) { + if (options2.intlSegmenter.resolvedOptions().granularity != "word") { + throw new Error('The segmenter passed must have a granularity of "word"'); + } + parts = Array.from(options2.intlSegmenter.segment(value), function(segment) { + return segment.segment; + }); + } else { + parts = value.match(tokenizeIncludingWhitespace) || []; + } + var tokens = []; + var prevPart = null; + parts.forEach(function(part) { + if (/\s/.test(part)) { + if (prevPart == null) { + tokens.push(part); + } else { + tokens.push(tokens.pop() + part); + } + } else if (/\s/.test(prevPart)) { + if (tokens[tokens.length - 1] == prevPart) { + tokens.push(tokens.pop() + part); + } else { + tokens.push(prevPart + part); + } + } else { + tokens.push(part); + } + prevPart = part; + }); + return tokens; +}; +wordDiff.join = function(tokens) { + return tokens.map(function(token, i) { + if (i == 0) { + return token; + } else { + return token.replace(/^\s+/, ""); + } + }).join(""); +}; +wordDiff.postProcess = function(changes, options2) { + if (!changes || options2.oneChangePerToken) { + return changes; + } + var lastKeep = null; + var insertion = null; + var deletion = null; + changes.forEach(function(change) { + if (change.added) { + insertion = change; + } else if (change.removed) { + deletion = change; + } else { + if (insertion || deletion) { + dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, change); + } + lastKeep = change; + insertion = null; + deletion = null; + } + }); + if (insertion || deletion) { + dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, null); + } + return changes; +}; +function diffWords(oldStr, newStr, options2) { + if ((options2 === null || options2 === void 0 ? void 0 : options2.ignoreWhitespace) != null && !options2.ignoreWhitespace) { + return diffWordsWithSpace(oldStr, newStr, options2); + } + return wordDiff.diff(oldStr, newStr, options2); +} +function dedupeWhitespaceInChangeObjects(startKeep, deletion, insertion, endKeep) { + if (deletion && insertion) { + var oldWsPrefix = deletion.value.match(/^\s*/)[0]; + var oldWsSuffix = deletion.value.match(/\s*$/)[0]; + var newWsPrefix = insertion.value.match(/^\s*/)[0]; + var newWsSuffix = insertion.value.match(/\s*$/)[0]; + if (startKeep) { + var commonWsPrefix = longestCommonPrefix(oldWsPrefix, newWsPrefix); + startKeep.value = replaceSuffix(startKeep.value, newWsPrefix, commonWsPrefix); + deletion.value = removePrefix(deletion.value, commonWsPrefix); + insertion.value = removePrefix(insertion.value, commonWsPrefix); + } + if (endKeep) { + var commonWsSuffix = longestCommonSuffix(oldWsSuffix, newWsSuffix); + endKeep.value = replacePrefix(endKeep.value, newWsSuffix, commonWsSuffix); + deletion.value = removeSuffix(deletion.value, commonWsSuffix); + insertion.value = removeSuffix(insertion.value, commonWsSuffix); + } + } else if (insertion) { + if (startKeep) { + insertion.value = insertion.value.replace(/^\s*/, ""); + } + if (endKeep) { + endKeep.value = endKeep.value.replace(/^\s*/, ""); + } + } else if (startKeep && endKeep) { + var newWsFull = endKeep.value.match(/^\s*/)[0], delWsStart = deletion.value.match(/^\s*/)[0], delWsEnd = deletion.value.match(/\s*$/)[0]; + var newWsStart = longestCommonPrefix(newWsFull, delWsStart); + deletion.value = removePrefix(deletion.value, newWsStart); + var newWsEnd = longestCommonSuffix(removePrefix(newWsFull, newWsStart), delWsEnd); + deletion.value = removeSuffix(deletion.value, newWsEnd); + endKeep.value = replacePrefix(endKeep.value, newWsFull, newWsEnd); + startKeep.value = replaceSuffix(startKeep.value, newWsFull, newWsFull.slice(0, newWsFull.length - newWsEnd.length)); + } else if (endKeep) { + var endKeepWsPrefix = endKeep.value.match(/^\s*/)[0]; + var deletionWsSuffix = deletion.value.match(/\s*$/)[0]; + var overlap = maximumOverlap(deletionWsSuffix, endKeepWsPrefix); + deletion.value = removeSuffix(deletion.value, overlap); + } else if (startKeep) { + var startKeepWsSuffix = startKeep.value.match(/\s*$/)[0]; + var deletionWsPrefix = deletion.value.match(/^\s*/)[0]; + var _overlap = maximumOverlap(startKeepWsSuffix, deletionWsPrefix); + deletion.value = removePrefix(deletion.value, _overlap); + } +} +var wordWithSpaceDiff = new Diff(); +wordWithSpaceDiff.tokenize = function(value) { + var regex = new RegExp("(\\r?\\n)|[".concat(extendedWordChars, "]+|[^\\S\\n\\r]+|[^").concat(extendedWordChars, "]"), "ug"); + return value.match(regex) || []; +}; +function diffWordsWithSpace(oldStr, newStr, options2) { + return wordWithSpaceDiff.diff(oldStr, newStr, options2); +} +function generateOptions(options2, defaults) { + if (typeof options2 === "function") { + defaults.callback = options2; + } else if (options2) { + for (var name in options2) { + if (options2.hasOwnProperty(name)) { + defaults[name] = options2[name]; + } + } + } + return defaults; +} +var lineDiff = new Diff(); +lineDiff.tokenize = function(value, options2) { + if (options2.stripTrailingCr) { + value = value.replace(/\r\n/g, "\n"); + } + var retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/); + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + if (i % 2 && !options2.newlineIsToken) { + retLines[retLines.length - 1] += line; + } else { + retLines.push(line); + } + } + return retLines; +}; +lineDiff.equals = function(left, right, options2) { + if (options2.ignoreWhitespace) { + if (!options2.newlineIsToken || !left.includes("\n")) { + left = left.trim(); + } + if (!options2.newlineIsToken || !right.includes("\n")) { + right = right.trim(); + } + } else if (options2.ignoreNewlineAtEof && !options2.newlineIsToken) { + if (left.endsWith("\n")) { + left = left.slice(0, -1); + } + if (right.endsWith("\n")) { + right = right.slice(0, -1); + } + } + return Diff.prototype.equals.call(this, left, right, options2); +}; +function diffLines(oldStr, newStr, callback) { + return lineDiff.diff(oldStr, newStr, callback); +} +function diffTrimmedLines(oldStr, newStr, callback) { + var options2 = generateOptions(callback, { + ignoreWhitespace: true + }); + return lineDiff.diff(oldStr, newStr, options2); +} +var sentenceDiff = new Diff(); +sentenceDiff.tokenize = function(value) { + return value.split(/(\S.+?[.!?])(?=\s+|$)/); +}; +function diffSentences(oldStr, newStr, callback) { + return sentenceDiff.diff(oldStr, newStr, callback); +} +var cssDiff = new Diff(); +cssDiff.tokenize = function(value) { + return value.split(/([{}:;,]|\s+)/); +}; +function diffCss(oldStr, newStr, callback) { + return cssDiff.diff(oldStr, newStr, callback); +} +function ownKeys(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function(r2) { + return Object.getOwnPropertyDescriptor(e, r2).enumerable; + })), t.push.apply(t, o); + } + return t; +} +function _objectSpread2(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys(Object(t), true).forEach(function(r2) { + _defineProperty(e, r2, t[r2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r2) { + Object.defineProperty(e, r2, Object.getOwnPropertyDescriptor(t, r2)); + }); + } + return e; +} +function _toPrimitive(t, r) { + if ("object" != typeof t || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r); + if ("object" != typeof i) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); +} +function _toPropertyKey(t) { + var i = _toPrimitive(t, "string"); + return "symbol" == typeof i ? i : i + ""; +} +function _typeof(o) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o2) { + return typeof o2; + } : function(o2) { + return o2 && "function" == typeof Symbol && o2.constructor === Symbol && o2 !== Symbol.prototype ? "symbol" : typeof o2; + }, _typeof(o); +} +function _defineProperty(obj, key2, value) { + key2 = _toPropertyKey(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { + value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key2] = value; + } + return obj; +} +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); +} +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); +} +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); +} +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; +} +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} +var jsonDiff = new Diff(); +jsonDiff.useLongestToken = true; +jsonDiff.tokenize = lineDiff.tokenize; +jsonDiff.castInput = function(value, options2) { + var undefinedReplacement = options2.undefinedReplacement, _options$stringifyRep = options2.stringifyReplacer, stringifyReplacer = _options$stringifyRep === void 0 ? function(k, v) { + return typeof v === "undefined" ? undefinedReplacement : v; + } : _options$stringifyRep; + return typeof value === "string" ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, " "); +}; +jsonDiff.equals = function(left, right, options2) { + return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, "$1"), right.replace(/,([\r\n])/g, "$1"), options2); +}; +function diffJson(oldObj, newObj, options2) { + return jsonDiff.diff(oldObj, newObj, options2); +} +function canonicalize(obj, stack, replacementStack, replacer, key2) { + stack = stack || []; + replacementStack = replacementStack || []; + if (replacer) { + obj = replacer(key2, obj); + } + var i; + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + var canonicalizedObj; + if ("[object Array]" === Object.prototype.toString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key2); + } + stack.pop(); + replacementStack.pop(); + return canonicalizedObj; + } + if (obj && obj.toJSON) { + obj = obj.toJSON(); + } + if (_typeof(obj) === "object" && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], _key; + for (_key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, _key)) { + sortedKeys.push(_key); + } + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + _key = sortedKeys[i]; + canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + return canonicalizedObj; +} +var arrayDiff = new Diff(); +arrayDiff.tokenize = function(value) { + return value.slice(); +}; +arrayDiff.join = arrayDiff.removeEmpty = function(value) { + return value; +}; +function diffArrays(oldArr, newArr, callback) { + return arrayDiff.diff(oldArr, newArr, callback); +} +function unixToWin(patch) { + if (Array.isArray(patch)) { + return patch.map(unixToWin); + } + return _objectSpread2(_objectSpread2({}, patch), {}, { + hunks: patch.hunks.map(function(hunk) { + return _objectSpread2(_objectSpread2({}, hunk), {}, { + lines: hunk.lines.map(function(line, i) { + var _hunk$lines; + return line.startsWith("\\") || line.endsWith("\r") || (_hunk$lines = hunk.lines[i + 1]) !== null && _hunk$lines !== void 0 && _hunk$lines.startsWith("\\") ? line : line + "\r"; + }) + }); + }) + }); +} +function winToUnix(patch) { + if (Array.isArray(patch)) { + return patch.map(winToUnix); + } + return _objectSpread2(_objectSpread2({}, patch), {}, { + hunks: patch.hunks.map(function(hunk) { + return _objectSpread2(_objectSpread2({}, hunk), {}, { + lines: hunk.lines.map(function(line) { + return line.endsWith("\r") ? line.substring(0, line.length - 1) : line; + }) + }); + }) + }); +} +function isUnix(patch) { + if (!Array.isArray(patch)) { + patch = [patch]; + } + return !patch.some(function(index2) { + return index2.hunks.some(function(hunk) { + return hunk.lines.some(function(line) { + return !line.startsWith("\\") && line.endsWith("\r"); + }); + }); + }); +} +function isWin(patch) { + if (!Array.isArray(patch)) { + patch = [patch]; + } + return patch.some(function(index2) { + return index2.hunks.some(function(hunk) { + return hunk.lines.some(function(line) { + return line.endsWith("\r"); + }); + }); + }) && patch.every(function(index2) { + return index2.hunks.every(function(hunk) { + return hunk.lines.every(function(line, i) { + var _hunk$lines2; + return line.startsWith("\\") || line.endsWith("\r") || ((_hunk$lines2 = hunk.lines[i + 1]) === null || _hunk$lines2 === void 0 ? void 0 : _hunk$lines2.startsWith("\\")); + }); + }); + }); +} +function parsePatch(uniDiff) { + var diffstr = uniDiff.split(/\n/), list = [], i = 0; + function parseIndex() { + var index2 = {}; + list.push(index2); + while (i < diffstr.length) { + var line = diffstr[i]; + if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { + break; + } + var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); + if (header) { + index2.index = header[1]; + } + i++; + } + parseFileHeader(index2); + parseFileHeader(index2); + index2.hunks = []; + while (i < diffstr.length) { + var _line = diffstr[i]; + if (/^(Index:\s|diff\s|\-\-\-\s|\+\+\+\s|===================================================================)/.test(_line)) { + break; + } else if (/^@@/.test(_line)) { + index2.hunks.push(parseHunk()); + } else if (_line) { + throw new Error("Unknown line " + (i + 1) + " " + JSON.stringify(_line)); + } else { + i++; + } + } + } + function parseFileHeader(index2) { + var fileHeader = /^(---|\+\+\+)\s+(.*)\r?$/.exec(diffstr[i]); + if (fileHeader) { + var keyPrefix = fileHeader[1] === "---" ? "old" : "new"; + var data2 = fileHeader[2].split(" ", 2); + var fileName = data2[0].replace(/\\\\/g, "\\"); + if (/^".*"$/.test(fileName)) { + fileName = fileName.substr(1, fileName.length - 2); + } + index2[keyPrefix + "FileName"] = fileName; + index2[keyPrefix + "Header"] = (data2[1] || "").trim(); + i++; + } + } + function parseHunk() { + var chunkHeaderIndex = i, chunkHeaderLine = diffstr[i++], chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); + var hunk = { + oldStart: +chunkHeader[1], + oldLines: typeof chunkHeader[2] === "undefined" ? 1 : +chunkHeader[2], + newStart: +chunkHeader[3], + newLines: typeof chunkHeader[4] === "undefined" ? 1 : +chunkHeader[4], + lines: [] + }; + if (hunk.oldLines === 0) { + hunk.oldStart += 1; + } + if (hunk.newLines === 0) { + hunk.newStart += 1; + } + var addCount = 0, removeCount = 0; + for (; i < diffstr.length && (removeCount < hunk.oldLines || addCount < hunk.newLines || (_diffstr$i = diffstr[i]) !== null && _diffstr$i !== void 0 && _diffstr$i.startsWith("\\")); i++) { + var _diffstr$i; + var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? " " : diffstr[i][0]; + if (operation === "+" || operation === "-" || operation === " " || operation === "\\") { + hunk.lines.push(diffstr[i]); + if (operation === "+") { + addCount++; + } else if (operation === "-") { + removeCount++; + } else if (operation === " ") { + addCount++; + removeCount++; + } + } else { + throw new Error("Hunk at line ".concat(chunkHeaderIndex + 1, " contained invalid line ").concat(diffstr[i])); + } + } + if (!addCount && hunk.newLines === 1) { + hunk.newLines = 0; + } + if (!removeCount && hunk.oldLines === 1) { + hunk.oldLines = 0; + } + if (addCount !== hunk.newLines) { + throw new Error("Added line count did not match for hunk at line " + (chunkHeaderIndex + 1)); + } + if (removeCount !== hunk.oldLines) { + throw new Error("Removed line count did not match for hunk at line " + (chunkHeaderIndex + 1)); + } + return hunk; + } + while (i < diffstr.length) { + parseIndex(); + } + return list; +} +function distanceIterator(start, minLine, maxLine) { + var wantForward = true, backwardExhausted = false, forwardExhausted = false, localOffset = 1; + return function iterator() { + if (wantForward && !forwardExhausted) { + if (backwardExhausted) { + localOffset++; + } else { + wantForward = false; + } + if (start + localOffset <= maxLine) { + return start + localOffset; + } + forwardExhausted = true; + } + if (!backwardExhausted) { + if (!forwardExhausted) { + wantForward = true; + } + if (minLine <= start - localOffset) { + return start - localOffset++; + } + backwardExhausted = true; + return iterator(); + } + }; +} +function applyPatch(source2, uniDiff) { + var options2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; + if (typeof uniDiff === "string") { + uniDiff = parsePatch(uniDiff); + } + if (Array.isArray(uniDiff)) { + if (uniDiff.length > 1) { + throw new Error("applyPatch only works with a single input."); + } + uniDiff = uniDiff[0]; + } + if (options2.autoConvertLineEndings || options2.autoConvertLineEndings == null) { + if (hasOnlyWinLineEndings(source2) && isUnix(uniDiff)) { + uniDiff = unixToWin(uniDiff); + } else if (hasOnlyUnixLineEndings(source2) && isWin(uniDiff)) { + uniDiff = winToUnix(uniDiff); + } + } + var lines = source2.split("\n"), hunks = uniDiff.hunks, compareLine = options2.compareLine || function(lineNumber, line2, operation, patchContent) { + return line2 === patchContent; + }, fuzzFactor = options2.fuzzFactor || 0, minLine = 0; + if (fuzzFactor < 0 || !Number.isInteger(fuzzFactor)) { + throw new Error("fuzzFactor must be a non-negative integer"); + } + if (!hunks.length) { + return source2; + } + var prevLine = "", removeEOFNL = false, addEOFNL = false; + for (var i = 0; i < hunks[hunks.length - 1].lines.length; i++) { + var line = hunks[hunks.length - 1].lines[i]; + if (line[0] == "\\") { + if (prevLine[0] == "+") { + removeEOFNL = true; + } else if (prevLine[0] == "-") { + addEOFNL = true; + } + } + prevLine = line; + } + if (removeEOFNL) { + if (addEOFNL) { + if (!fuzzFactor && lines[lines.length - 1] == "") { + return false; + } + } else if (lines[lines.length - 1] == "") { + lines.pop(); + } else if (!fuzzFactor) { + return false; + } + } else if (addEOFNL) { + if (lines[lines.length - 1] != "") { + lines.push(""); + } else if (!fuzzFactor) { + return false; + } + } + function applyHunk(hunkLines, toPos2, maxErrors2) { + var hunkLinesI = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 0; + var lastContextLineMatched = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : true; + var patchedLines = arguments.length > 5 && arguments[5] !== void 0 ? arguments[5] : []; + var patchedLinesLength = arguments.length > 6 && arguments[6] !== void 0 ? arguments[6] : 0; + var nConsecutiveOldContextLines = 0; + var nextContextLineMustMatch = false; + for (; hunkLinesI < hunkLines.length; hunkLinesI++) { + var hunkLine = hunkLines[hunkLinesI], operation = hunkLine.length > 0 ? hunkLine[0] : " ", content = hunkLine.length > 0 ? hunkLine.substr(1) : hunkLine; + if (operation === "-") { + if (compareLine(toPos2 + 1, lines[toPos2], operation, content)) { + toPos2++; + nConsecutiveOldContextLines = 0; + } else { + if (!maxErrors2 || lines[toPos2] == null) { + return null; + } + patchedLines[patchedLinesLength] = lines[toPos2]; + return applyHunk(hunkLines, toPos2 + 1, maxErrors2 - 1, hunkLinesI, false, patchedLines, patchedLinesLength + 1); + } + } + if (operation === "+") { + if (!lastContextLineMatched) { + return null; + } + patchedLines[patchedLinesLength] = content; + patchedLinesLength++; + nConsecutiveOldContextLines = 0; + nextContextLineMustMatch = true; + } + if (operation === " ") { + nConsecutiveOldContextLines++; + patchedLines[patchedLinesLength] = lines[toPos2]; + if (compareLine(toPos2 + 1, lines[toPos2], operation, content)) { + patchedLinesLength++; + lastContextLineMatched = true; + nextContextLineMustMatch = false; + toPos2++; + } else { + if (nextContextLineMustMatch || !maxErrors2) { + return null; + } + return lines[toPos2] && (applyHunk(hunkLines, toPos2 + 1, maxErrors2 - 1, hunkLinesI + 1, false, patchedLines, patchedLinesLength + 1) || applyHunk(hunkLines, toPos2 + 1, maxErrors2 - 1, hunkLinesI, false, patchedLines, patchedLinesLength + 1)) || applyHunk(hunkLines, toPos2, maxErrors2 - 1, hunkLinesI + 1, false, patchedLines, patchedLinesLength); + } + } + } + patchedLinesLength -= nConsecutiveOldContextLines; + toPos2 -= nConsecutiveOldContextLines; + patchedLines.length = patchedLinesLength; + return { + patchedLines, + oldLineLastI: toPos2 - 1 + }; + } + var resultLines = []; + var prevHunkOffset = 0; + for (var _i2 = 0; _i2 < hunks.length; _i2++) { + var hunk = hunks[_i2]; + var hunkResult = void 0; + var maxLine = lines.length - hunk.oldLines + fuzzFactor; + var toPos = void 0; + for (var maxErrors = 0; maxErrors <= fuzzFactor; maxErrors++) { + toPos = hunk.oldStart + prevHunkOffset - 1; + var iterator = distanceIterator(toPos, minLine, maxLine); + for (; toPos !== void 0; toPos = iterator()) { + hunkResult = applyHunk(hunk.lines, toPos, maxErrors); + if (hunkResult) { + break; + } + } + if (hunkResult) { + break; + } + } + if (!hunkResult) { + return false; + } + for (var _i22 = minLine; _i22 < toPos; _i22++) { + resultLines.push(lines[_i22]); + } + for (var _i3 = 0; _i3 < hunkResult.patchedLines.length; _i3++) { + var _line = hunkResult.patchedLines[_i3]; + resultLines.push(_line); + } + minLine = hunkResult.oldLineLastI + 1; + prevHunkOffset = toPos + 1 - hunk.oldStart; + } + for (var _i4 = minLine; _i4 < lines.length; _i4++) { + resultLines.push(lines[_i4]); + } + return resultLines.join("\n"); +} +function applyPatches(uniDiff, options2) { + if (typeof uniDiff === "string") { + uniDiff = parsePatch(uniDiff); + } + var currentIndex = 0; + function processIndex() { + var index2 = uniDiff[currentIndex++]; + if (!index2) { + return options2.complete(); + } + options2.loadFile(index2, function(err, data2) { + if (err) { + return options2.complete(err); + } + var updatedContent = applyPatch(data2, index2, options2); + options2.patched(index2, updatedContent, function(err2) { + if (err2) { + return options2.complete(err2); + } + processIndex(); + }); + }); + } + processIndex(); +} +function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options2) { + if (!options2) { + options2 = {}; + } + if (typeof options2 === "function") { + options2 = { + callback: options2 + }; + } + if (typeof options2.context === "undefined") { + options2.context = 4; + } + if (options2.newlineIsToken) { + throw new Error("newlineIsToken may not be used with patch-generation functions, only with diffing functions"); + } + if (!options2.callback) { + return diffLinesResultToPatch(diffLines(oldStr, newStr, options2)); + } else { + var _options = options2, _callback = _options.callback; + diffLines(oldStr, newStr, _objectSpread2(_objectSpread2({}, options2), {}, { + callback: function callback(diff3) { + var patch = diffLinesResultToPatch(diff3); + _callback(patch); + } + })); + } + function diffLinesResultToPatch(diff3) { + if (!diff3) { + return; + } + diff3.push({ + value: "", + lines: [] + }); + function contextLines(lines) { + return lines.map(function(entry) { + return " " + entry; + }); + } + var hunks = []; + var oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1; + var _loop = function _loop2() { + var current2 = diff3[i], lines = current2.lines || splitLines$1(current2.value); + current2.lines = lines; + if (current2.added || current2.removed) { + var _curRange; + if (!oldRangeStart) { + var prev = diff3[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + if (prev) { + curRange = options2.context > 0 ? contextLines(prev.lines.slice(-options2.context)) : []; + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function(entry) { + return (current2.added ? "+" : "-") + entry; + }))); + if (current2.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + if (lines.length <= options2.context * 2 && i < diff3.length - 2) { + var _curRange2; + (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines))); + } else { + var _curRange3; + var contextSize = Math.min(lines.length, options2.context); + (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize)))); + var _hunk = { + oldStart: oldRangeStart, + oldLines: oldLine - oldRangeStart + contextSize, + newStart: newRangeStart, + newLines: newLine - newRangeStart + contextSize, + lines: curRange + }; + hunks.push(_hunk); + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + }; + for (var i = 0; i < diff3.length; i++) { + _loop(); + } + for (var _i2 = 0, _hunks = hunks; _i2 < _hunks.length; _i2++) { + var hunk = _hunks[_i2]; + for (var _i22 = 0; _i22 < hunk.lines.length; _i22++) { + if (hunk.lines[_i22].endsWith("\n")) { + hunk.lines[_i22] = hunk.lines[_i22].slice(0, -1); + } else { + hunk.lines.splice(_i22 + 1, 0, "\\ No newline at end of file"); + _i22++; + } + } + } + return { + oldFileName, + newFileName, + oldHeader, + newHeader, + hunks + }; + } +} +function formatPatch(diff3) { + if (Array.isArray(diff3)) { + return diff3.map(formatPatch).join("\n"); + } + var ret = []; + if (diff3.oldFileName == diff3.newFileName) { + ret.push("Index: " + diff3.oldFileName); + } + ret.push("==================================================================="); + ret.push("--- " + diff3.oldFileName + (typeof diff3.oldHeader === "undefined" ? "" : " " + diff3.oldHeader)); + ret.push("+++ " + diff3.newFileName + (typeof diff3.newHeader === "undefined" ? "" : " " + diff3.newHeader)); + for (var i = 0; i < diff3.hunks.length; i++) { + var hunk = diff3.hunks[i]; + if (hunk.oldLines === 0) { + hunk.oldStart -= 1; + } + if (hunk.newLines === 0) { + hunk.newStart -= 1; + } + ret.push("@@ -" + hunk.oldStart + "," + hunk.oldLines + " +" + hunk.newStart + "," + hunk.newLines + " @@"); + ret.push.apply(ret, hunk.lines); + } + return ret.join("\n") + "\n"; +} +function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options2) { + var _options2; + if (typeof options2 === "function") { + options2 = { + callback: options2 + }; + } + if (!((_options2 = options2) !== null && _options2 !== void 0 && _options2.callback)) { + var patchObj = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options2); + if (!patchObj) { + return; + } + return formatPatch(patchObj); + } else { + var _options3 = options2, _callback2 = _options3.callback; + structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, _objectSpread2(_objectSpread2({}, options2), {}, { + callback: function callback(patchObj2) { + if (!patchObj2) { + _callback2(); + } else { + _callback2(formatPatch(patchObj2)); + } + } + })); + } +} +function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options2) { + return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options2); +} +function splitLines$1(text) { + var hasTrailingNl = text.endsWith("\n"); + var result = text.split("\n").map(function(line) { + return line + "\n"; + }); + if (hasTrailingNl) { + result.pop(); + } else { + result.push(result.pop().slice(0, -1)); + } + return result; +} +function arrayEqual(a, b) { + if (a.length !== b.length) { + return false; + } + return arrayStartsWith(a, b); +} +function arrayStartsWith(array, start) { + if (start.length > array.length) { + return false; + } + for (var i = 0; i < start.length; i++) { + if (start[i] !== array[i]) { + return false; + } + } + return true; +} +function calcLineCount(hunk) { + var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines), oldLines = _calcOldNewLineCount.oldLines, newLines = _calcOldNewLineCount.newLines; + if (oldLines !== void 0) { + hunk.oldLines = oldLines; + } else { + delete hunk.oldLines; + } + if (newLines !== void 0) { + hunk.newLines = newLines; + } else { + delete hunk.newLines; + } +} +function merge$1(mine, theirs, base2) { + mine = loadPatch(mine, base2); + theirs = loadPatch(theirs, base2); + var ret = {}; + if (mine.index || theirs.index) { + ret.index = mine.index || theirs.index; + } + if (mine.newFileName || theirs.newFileName) { + if (!fileNameChanged(mine)) { + ret.oldFileName = theirs.oldFileName || mine.oldFileName; + ret.newFileName = theirs.newFileName || mine.newFileName; + ret.oldHeader = theirs.oldHeader || mine.oldHeader; + ret.newHeader = theirs.newHeader || mine.newHeader; + } else if (!fileNameChanged(theirs)) { + ret.oldFileName = mine.oldFileName; + ret.newFileName = mine.newFileName; + ret.oldHeader = mine.oldHeader; + ret.newHeader = mine.newHeader; + } else { + ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); + ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); + ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); + ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); + } + } + ret.hunks = []; + var mineIndex = 0, theirsIndex = 0, mineOffset = 0, theirsOffset = 0; + while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { + var mineCurrent = mine.hunks[mineIndex] || { + oldStart: Infinity + }, theirsCurrent = theirs.hunks[theirsIndex] || { + oldStart: Infinity + }; + if (hunkBefore(mineCurrent, theirsCurrent)) { + ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); + mineIndex++; + theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; + } else if (hunkBefore(theirsCurrent, mineCurrent)) { + ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); + theirsIndex++; + mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; + } else { + var mergedHunk = { + oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), + oldLines: 0, + newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), + newLines: 0, + lines: [] + }; + mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); + theirsIndex++; + mineIndex++; + ret.hunks.push(mergedHunk); + } + } + return ret; +} +function loadPatch(param, base2) { + if (typeof param === "string") { + if (/^@@/m.test(param) || /^Index:/m.test(param)) { + return parsePatch(param)[0]; + } + if (!base2) { + throw new Error("Must provide a base reference or pass in a patch"); + } + return structuredPatch(void 0, void 0, base2, param); + } + return param; +} +function fileNameChanged(patch) { + return patch.newFileName && patch.newFileName !== patch.oldFileName; +} +function selectField(index2, mine, theirs) { + if (mine === theirs) { + return mine; + } else { + index2.conflict = true; + return { + mine, + theirs + }; + } +} +function hunkBefore(test, check) { + return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; +} +function cloneHunk(hunk, offset2) { + return { + oldStart: hunk.oldStart, + oldLines: hunk.oldLines, + newStart: hunk.newStart + offset2, + newLines: hunk.newLines, + lines: hunk.lines + }; +} +function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { + var mine = { + offset: mineOffset, + lines: mineLines, + index: 0 + }, their = { + offset: theirOffset, + lines: theirLines, + index: 0 + }; + insertLeading(hunk, mine, their); + insertLeading(hunk, their, mine); + while (mine.index < mine.lines.length && their.index < their.lines.length) { + var mineCurrent = mine.lines[mine.index], theirCurrent = their.lines[their.index]; + if ((mineCurrent[0] === "-" || mineCurrent[0] === "+") && (theirCurrent[0] === "-" || theirCurrent[0] === "+")) { + mutualChange(hunk, mine, their); + } else if (mineCurrent[0] === "+" && theirCurrent[0] === " ") { + var _hunk$lines; + (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine))); + } else if (theirCurrent[0] === "+" && mineCurrent[0] === " ") { + var _hunk$lines2; + (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their))); + } else if (mineCurrent[0] === "-" && theirCurrent[0] === " ") { + removal(hunk, mine, their); + } else if (theirCurrent[0] === "-" && mineCurrent[0] === " ") { + removal(hunk, their, mine, true); + } else if (mineCurrent === theirCurrent) { + hunk.lines.push(mineCurrent); + mine.index++; + their.index++; + } else { + conflict(hunk, collectChange(mine), collectChange(their)); + } + } + insertTrailing(hunk, mine); + insertTrailing(hunk, their); + calcLineCount(hunk); +} +function mutualChange(hunk, mine, their) { + var myChanges = collectChange(mine), theirChanges = collectChange(their); + if (allRemoves(myChanges) && allRemoves(theirChanges)) { + if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { + var _hunk$lines3; + (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges)); + return; + } else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { + var _hunk$lines4; + (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges)); + return; + } + } else if (arrayEqual(myChanges, theirChanges)) { + var _hunk$lines5; + (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges)); + return; + } + conflict(hunk, myChanges, theirChanges); +} +function removal(hunk, mine, their, swap) { + var myChanges = collectChange(mine), theirChanges = collectContext(their, myChanges); + if (theirChanges.merged) { + var _hunk$lines6; + (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged)); + } else { + conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); + } +} +function conflict(hunk, mine, their) { + hunk.conflict = true; + hunk.lines.push({ + conflict: true, + mine, + theirs: their + }); +} +function insertLeading(hunk, insert, their) { + while (insert.offset < their.offset && insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + insert.offset++; + } +} +function insertTrailing(hunk, insert) { + while (insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + } +} +function collectChange(state2) { + var ret = [], operation = state2.lines[state2.index][0]; + while (state2.index < state2.lines.length) { + var line = state2.lines[state2.index]; + if (operation === "-" && line[0] === "+") { + operation = "+"; + } + if (operation === line[0]) { + ret.push(line); + state2.index++; + } else { + break; + } + } + return ret; +} +function collectContext(state2, matchChanges) { + var changes = [], merged = [], matchIndex = 0, contextChanges = false, conflicted = false; + while (matchIndex < matchChanges.length && state2.index < state2.lines.length) { + var change = state2.lines[state2.index], match = matchChanges[matchIndex]; + if (match[0] === "+") { + break; + } + contextChanges = contextChanges || change[0] !== " "; + merged.push(match); + matchIndex++; + if (change[0] === "+") { + conflicted = true; + while (change[0] === "+") { + changes.push(change); + change = state2.lines[++state2.index]; + } + } + if (match.substr(1) === change.substr(1)) { + changes.push(change); + state2.index++; + } else { + conflicted = true; + } + } + if ((matchChanges[matchIndex] || "")[0] === "+" && contextChanges) { + conflicted = true; + } + if (conflicted) { + return changes; + } + while (matchIndex < matchChanges.length) { + merged.push(matchChanges[matchIndex++]); + } + return { + merged, + changes + }; +} +function allRemoves(changes) { + return changes.reduce(function(prev, change) { + return prev && change[0] === "-"; + }, true); +} +function skipRemoveSuperset(state2, removeChanges, delta) { + for (var i = 0; i < delta; i++) { + var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); + if (state2.lines[state2.index + i] !== " " + changeContent) { + return false; + } + } + state2.index += delta; + return true; +} +function calcOldNewLineCount(lines) { + var oldLines = 0; + var newLines = 0; + lines.forEach(function(line) { + if (typeof line !== "string") { + var myCount = calcOldNewLineCount(line.mine); + var theirCount = calcOldNewLineCount(line.theirs); + if (oldLines !== void 0) { + if (myCount.oldLines === theirCount.oldLines) { + oldLines += myCount.oldLines; + } else { + oldLines = void 0; + } + } + if (newLines !== void 0) { + if (myCount.newLines === theirCount.newLines) { + newLines += myCount.newLines; + } else { + newLines = void 0; + } + } + } else { + if (newLines !== void 0 && (line[0] === "+" || line[0] === " ")) { + newLines++; + } + if (oldLines !== void 0 && (line[0] === "-" || line[0] === " ")) { + oldLines++; + } + } + }); + return { + oldLines, + newLines + }; +} +function reversePatch(structuredPatch2) { + if (Array.isArray(structuredPatch2)) { + return structuredPatch2.map(reversePatch).reverse(); + } + return _objectSpread2(_objectSpread2({}, structuredPatch2), {}, { + oldFileName: structuredPatch2.newFileName, + oldHeader: structuredPatch2.newHeader, + newFileName: structuredPatch2.oldFileName, + newHeader: structuredPatch2.oldHeader, + hunks: structuredPatch2.hunks.map(function(hunk) { + return { + oldLines: hunk.newLines, + oldStart: hunk.newStart, + newLines: hunk.oldLines, + newStart: hunk.oldStart, + lines: hunk.lines.map(function(l) { + if (l.startsWith("-")) { + return "+".concat(l.slice(1)); + } + if (l.startsWith("+")) { + return "-".concat(l.slice(1)); + } + return l; + }) + }; + }) + }); +} +function convertChangesToDMP(changes) { + var ret = [], change, operation; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + ret.push([operation, change.value]); + } + return ret; +} +function convertChangesToXML(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(""); + } else if (change.removed) { + ret.push(""); + } + ret.push(escapeHTML$1(change.value)); + if (change.added) { + ret.push(""); + } else if (change.removed) { + ret.push(""); + } + } + return ret.join(""); +} +function escapeHTML$1(s) { + var n = s; + n = n.replace(/&/g, "&"); + n = n.replace(//g, ">"); + n = n.replace(/"/g, """); + return n; +} +const diffLibrary = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + Diff, + applyPatch, + applyPatches, + canonicalize, + convertChangesToDMP, + convertChangesToXML, + createPatch, + createTwoFilesPatch, + diffArrays, + diffChars, + diffCss, + diffJson, + diffLines, + diffSentences, + diffTrimmedLines, + diffWords, + diffWordsWithSpace, + formatPatch, + merge: merge$1, + parsePatch, + reversePatch, + structuredPatch +}, Symbol.toStringTag, { value: "Module" })); +var main = { exports: {} }; +var cryptoBrowserify = {}; +var browser$e = { exports: {} }; +var hasRequiredBrowser$e; +function requireBrowser$e() { + if (hasRequiredBrowser$e) return browser$e.exports; + hasRequiredBrowser$e = 1; + var MAX_BYTES = 65536; + var MAX_UINT32 = 4294967295; + function oldBrowser() { + throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11"); + } + var Buffer2 = requireSafeBuffer().Buffer; + var crypto2 = commonjsGlobal.crypto || commonjsGlobal.msCrypto; + if (crypto2 && crypto2.getRandomValues) { + browser$e.exports = randomBytes; + } else { + browser$e.exports = oldBrowser; + } + function randomBytes(size, cb) { + if (size > MAX_UINT32) throw new RangeError("requested too many random bytes"); + var bytes = Buffer2.allocUnsafe(size); + if (size > 0) { + if (size > MAX_BYTES) { + for (var generated = 0; generated < size; generated += MAX_BYTES) { + crypto2.getRandomValues(bytes.slice(generated, generated + MAX_BYTES)); + } + } else { + crypto2.getRandomValues(bytes); + } + } + if (typeof cb === "function") { + return process.nextTick(function() { + cb(null, bytes); + }); + } + return bytes; + } + return browser$e.exports; +} +var readableBrowser$2 = { exports: {} }; +var streamBrowser$2; +var hasRequiredStreamBrowser$2; +function requireStreamBrowser$2() { + if (hasRequiredStreamBrowser$2) return streamBrowser$2; + hasRequiredStreamBrowser$2 = 1; + streamBrowser$2 = requireEvents().EventEmitter; + return streamBrowser$2; +} +var buffer_list$2; +var hasRequiredBuffer_list$2; +function requireBuffer_list$2() { + if (hasRequiredBuffer_list$2) return buffer_list$2; + hasRequiredBuffer_list$2 = 1; + function ownKeys2(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function(sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source2 = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys2(Object(source2), true).forEach(function(key2) { + _defineProperty2(target, key2, source2[key2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source2)) : ownKeys2(Object(source2)).forEach(function(key2) { + Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source2, key2)); + }); + } + return target; + } + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey2(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + Object.defineProperty(Constructor, "prototype", { writable: false }); + return Constructor; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return typeof key2 === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return String(input); + } + var _require = requireBuffer$2(), Buffer2 = _require.Buffer; + var _require2 = require$$3, inspect = _require2.inspect; + var custom = inspect && inspect.custom || "inspect"; + function copyBuffer(src2, target, offset2) { + Buffer2.prototype.copy.call(src2, target, offset2); + } + buffer_list$2 = /* @__PURE__ */ function() { + function BufferList() { + _classCallCheck(this, BufferList); + this.head = null; + this.tail = null; + this.length = 0; + } + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join2(s) { + if (this.length === 0) return ""; + var p = this.head; + var ret = "" + p.data; + while (p = p.next) ret += s + p.data; + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer2.alloc(0); + var ret = Buffer2.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + } + // Consumes a specified amount of bytes or characters from the buffered data. + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + if (n < this.head.data.length) { + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + ret = this.shift(); + } else { + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } + // Consumes a specified amount of characters from the buffered data. + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str; + else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + this.length -= c; + return ret; + } + // Consumes a specified amount of bytes from the buffered data. + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer2.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + this.length -= c; + return ret; + } + // Make sure the linked list only shows the minimal necessary information. + }, { + key: custom, + value: function value(_, options2) { + return inspect(this, _objectSpread(_objectSpread({}, options2), {}, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + return BufferList; + }(); + return buffer_list$2; +} +var destroy_1$2; +var hasRequiredDestroy$2; +function requireDestroy$2() { + if (hasRequiredDestroy$2) return destroy_1$2; + hasRequiredDestroy$2 = 1; + function destroy(err, cb) { + var _this = this; + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + return this; + } + if (this._readableState) { + this._readableState.destroyed = true; + } + if (this._writableState) { + this._writableState.destroyed = true; + } + this._destroy(err || null, function(err2) { + if (!cb && err2) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err2); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err2); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err2); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + return this; + } + function emitErrorAndCloseNT(self2, err) { + emitErrorNT(self2, err); + emitCloseNT(self2); + } + function emitCloseNT(self2) { + if (self2._writableState && !self2._writableState.emitClose) return; + if (self2._readableState && !self2._readableState.emitClose) return; + self2.emit("close"); + } + function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } + } + function emitErrorNT(self2, err) { + self2.emit("error", err); + } + function errorOrDestroy(stream2, err) { + var rState = stream2._readableState; + var wState = stream2._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream2.destroy(err); + else stream2.emit("error", err); + } + destroy_1$2 = { + destroy, + undestroy, + errorOrDestroy + }; + return destroy_1$2; +} +var errorsBrowser$2 = {}; +var hasRequiredErrorsBrowser$2; +function requireErrorsBrowser$2() { + if (hasRequiredErrorsBrowser$2) return errorsBrowser$2; + hasRequiredErrorsBrowser$2 = 1; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + var codes = {}; + function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + function getMessage(arg1, arg2, arg3) { + if (typeof message === "string") { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + var NodeError = /* @__PURE__ */ function(_Base) { + _inheritsLoose(NodeError2, _Base); + function NodeError2(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + return NodeError2; + }(Base); + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; + } + function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function(i) { + return String(i); + }); + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(", "), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } + } + function startsWith(str, search, pos) { + return str.substr(0, search.length) === search; + } + function endsWith(str, search, this_len) { + if (this_len === void 0 || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; + } + function includes(str, search, start) { + if (typeof start !== "number") { + start = 0; + } + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } + } + createErrorType("ERR_INVALID_OPT_VALUE", function(name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; + }, TypeError); + createErrorType("ERR_INVALID_ARG_TYPE", function(name, expected, actual) { + var determiner; + if (typeof expected === "string" && startsWith(expected, "not ")) { + determiner = "must not be"; + expected = expected.replace(/^not /, ""); + } else { + determiner = "must be"; + } + var msg; + if (endsWith(name, " argument")) { + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } else { + var type2 = includes(name, ".") ? "property" : "argument"; + msg = 'The "'.concat(name, '" ').concat(type2, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } + msg += ". Received type ".concat(typeof actual); + return msg; + }, TypeError); + createErrorType("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF"); + createErrorType("ERR_METHOD_NOT_IMPLEMENTED", function(name) { + return "The " + name + " method is not implemented"; + }); + createErrorType("ERR_STREAM_PREMATURE_CLOSE", "Premature close"); + createErrorType("ERR_STREAM_DESTROYED", function(name) { + return "Cannot call " + name + " after a stream was destroyed"; + }); + createErrorType("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"); + createErrorType("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable"); + createErrorType("ERR_STREAM_WRITE_AFTER_END", "write after end"); + createErrorType("ERR_STREAM_NULL_VALUES", "May not write null values to stream", TypeError); + createErrorType("ERR_UNKNOWN_ENCODING", function(arg) { + return "Unknown encoding: " + arg; + }, TypeError); + createErrorType("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event"); + errorsBrowser$2.codes = codes; + return errorsBrowser$2; +} +var state$2; +var hasRequiredState$2; +function requireState$2() { + if (hasRequiredState$2) return state$2; + hasRequiredState$2 = 1; + var ERR_INVALID_OPT_VALUE = requireErrorsBrowser$2().codes.ERR_INVALID_OPT_VALUE; + function highWaterMarkFrom(options2, isDuplex, duplexKey) { + return options2.highWaterMark != null ? options2.highWaterMark : isDuplex ? options2[duplexKey] : null; + } + function getHighWaterMark(state2, options2, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options2, isDuplex, duplexKey); + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : "highWaterMark"; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + return Math.floor(hwm); + } + return state2.objectMode ? 16 : 16 * 1024; + } + state$2 = { + getHighWaterMark + }; + return state$2; +} +var browser$d; +var hasRequiredBrowser$d; +function requireBrowser$d() { + if (hasRequiredBrowser$d) return browser$d; + hasRequiredBrowser$d = 1; + browser$d = deprecate; + function deprecate(fn, msg) { + if (config("noDeprecation")) { + return fn; + } + var warned = false; + function deprecated() { + if (!warned) { + if (config("throwDeprecation")) { + throw new Error(msg); + } else if (config("traceDeprecation")) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + return deprecated; + } + function config(name) { + try { + if (!commonjsGlobal.localStorage) return false; + } catch (_) { + return false; + } + var val = commonjsGlobal.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === "true"; + } + return browser$d; +} +var _stream_writable$2; +var hasRequired_stream_writable$2; +function require_stream_writable$2() { + if (hasRequired_stream_writable$2) return _stream_writable$2; + hasRequired_stream_writable$2 = 1; + _stream_writable$2 = Writable; + function CorkedRequest(state2) { + var _this = this; + this.next = null; + this.entry = null; + this.finish = function() { + onCorkedFinish(_this, state2); + }; + } + var Duplex; + Writable.WritableState = WritableState; + var internalUtil = { + deprecate: requireBrowser$d() + }; + var Stream2 = requireStreamBrowser$2(); + var Buffer2 = requireBuffer$2().Buffer; + var OurUint8Array = (typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var destroyImpl = requireDestroy$2(); + var _require = requireState$2(), getHighWaterMark = _require.getHighWaterMark; + var _require$codes = requireErrorsBrowser$2().codes, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + var errorOrDestroy = destroyImpl.errorOrDestroy; + requireInherits_browser$1()(Writable, Stream2); + function nop() { + } + function WritableState(options2, stream2, isDuplex) { + Duplex = Duplex || require_stream_duplex$2(); + options2 = options2 || {}; + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof Duplex; + this.objectMode = !!options2.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options2.writableObjectMode; + this.highWaterMark = getHighWaterMark(this, options2, "writableHighWaterMark", isDuplex); + this.finalCalled = false; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + this.destroyed = false; + var noDecode = options2.decodeStrings === false; + this.decodeStrings = !noDecode; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = function(er) { + onwrite(stream2, er); + }; + this.writecb = null; + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; + this.pendingcb = 0; + this.prefinished = false; + this.errorEmitted = false; + this.emitClose = options2.emitClose !== false; + this.autoDestroy = !!options2.autoDestroy; + this.bufferedRequestCount = 0; + this.corkedRequestsFree = new CorkedRequest(this); + } + WritableState.prototype.getBuffer = function getBuffer() { + var current2 = this.bufferedRequest; + var out = []; + while (current2) { + out.push(current2); + current2 = current2.next; + } + return out; + }; + (function() { + try { + Object.defineProperty(WritableState.prototype, "buffer", { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") + }); + } catch (_) { + } + })(); + var realHasInstance; + if (typeof Symbol === "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === "function") { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); + } else { + realHasInstance = function realHasInstance2(object) { + return object instanceof this; + }; + } + function Writable(options2) { + Duplex = Duplex || require_stream_duplex$2(); + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options2); + this._writableState = new WritableState(options2, this, isDuplex); + this.writable = true; + if (options2) { + if (typeof options2.write === "function") this._write = options2.write; + if (typeof options2.writev === "function") this._writev = options2.writev; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + if (typeof options2.final === "function") this._final = options2.final; + } + Stream2.call(this); + } + Writable.prototype.pipe = function() { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); + }; + function writeAfterEnd(stream2, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); + errorOrDestroy(stream2, er); + process.nextTick(cb, er); + } + function validChunk(stream2, state2, chunk, cb) { + var er; + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== "string" && !state2.objectMode) { + er = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer"], chunk); + } + if (er) { + errorOrDestroy(stream2, er); + process.nextTick(cb, er); + return false; + } + return true; + } + Writable.prototype.write = function(chunk, encoding2, cb) { + var state2 = this._writableState; + var ret = false; + var isBuf = !state2.objectMode && _isUint8Array(chunk); + if (isBuf && !Buffer2.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + if (isBuf) encoding2 = "buffer"; + else if (!encoding2) encoding2 = state2.defaultEncoding; + if (typeof cb !== "function") cb = nop; + if (state2.ending) writeAfterEnd(this, cb); + else if (isBuf || validChunk(this, state2, chunk, cb)) { + state2.pendingcb++; + ret = writeOrBuffer(this, state2, isBuf, chunk, encoding2, cb); + } + return ret; + }; + Writable.prototype.cork = function() { + this._writableState.corked++; + }; + Writable.prototype.uncork = function() { + var state2 = this._writableState; + if (state2.corked) { + state2.corked--; + if (!state2.writing && !state2.corked && !state2.bufferProcessing && state2.bufferedRequest) clearBuffer(this, state2); + } + }; + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding2) { + if (typeof encoding2 === "string") encoding2 = encoding2.toLowerCase(); + if (!(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((encoding2 + "").toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding2); + this._writableState.defaultEncoding = encoding2; + return this; + }; + Object.defineProperty(Writable.prototype, "writableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState && this._writableState.getBuffer(); + } + }); + function decodeChunk(state2, chunk, encoding2) { + if (!state2.objectMode && state2.decodeStrings !== false && typeof chunk === "string") { + chunk = Buffer2.from(chunk, encoding2); + } + return chunk; + } + Object.defineProperty(Writable.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.highWaterMark; + } + }); + function writeOrBuffer(stream2, state2, isBuf, chunk, encoding2, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state2, chunk, encoding2); + if (chunk !== newChunk) { + isBuf = true; + encoding2 = "buffer"; + chunk = newChunk; + } + } + var len = state2.objectMode ? 1 : chunk.length; + state2.length += len; + var ret = state2.length < state2.highWaterMark; + if (!ret) state2.needDrain = true; + if (state2.writing || state2.corked) { + var last = state2.lastBufferedRequest; + state2.lastBufferedRequest = { + chunk, + encoding: encoding2, + isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state2.lastBufferedRequest; + } else { + state2.bufferedRequest = state2.lastBufferedRequest; + } + state2.bufferedRequestCount += 1; + } else { + doWrite(stream2, state2, false, len, chunk, encoding2, cb); + } + return ret; + } + function doWrite(stream2, state2, writev2, len, chunk, encoding2, cb) { + state2.writelen = len; + state2.writecb = cb; + state2.writing = true; + state2.sync = true; + if (state2.destroyed) state2.onwrite(new ERR_STREAM_DESTROYED("write")); + else if (writev2) stream2._writev(chunk, state2.onwrite); + else stream2._write(chunk, encoding2, state2.onwrite); + state2.sync = false; + } + function onwriteError(stream2, state2, sync, er, cb) { + --state2.pendingcb; + if (sync) { + process.nextTick(cb, er); + process.nextTick(finishMaybe, stream2, state2); + stream2._writableState.errorEmitted = true; + errorOrDestroy(stream2, er); + } else { + cb(er); + stream2._writableState.errorEmitted = true; + errorOrDestroy(stream2, er); + finishMaybe(stream2, state2); + } + } + function onwriteStateUpdate(state2) { + state2.writing = false; + state2.writecb = null; + state2.length -= state2.writelen; + state2.writelen = 0; + } + function onwrite(stream2, er) { + var state2 = stream2._writableState; + var sync = state2.sync; + var cb = state2.writecb; + if (typeof cb !== "function") throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state2); + if (er) onwriteError(stream2, state2, sync, er, cb); + else { + var finished = needFinish(state2) || stream2.destroyed; + if (!finished && !state2.corked && !state2.bufferProcessing && state2.bufferedRequest) { + clearBuffer(stream2, state2); + } + if (sync) { + process.nextTick(afterWrite, stream2, state2, finished, cb); + } else { + afterWrite(stream2, state2, finished, cb); + } + } + } + function afterWrite(stream2, state2, finished, cb) { + if (!finished) onwriteDrain(stream2, state2); + state2.pendingcb--; + cb(); + finishMaybe(stream2, state2); + } + function onwriteDrain(stream2, state2) { + if (state2.length === 0 && state2.needDrain) { + state2.needDrain = false; + stream2.emit("drain"); + } + } + function clearBuffer(stream2, state2) { + state2.bufferProcessing = true; + var entry = state2.bufferedRequest; + if (stream2._writev && entry && entry.next) { + var l = state2.bufferedRequestCount; + var buffer2 = new Array(l); + var holder = state2.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + while (entry) { + buffer2[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer2.allBuffers = allBuffers; + doWrite(stream2, state2, true, state2.length, buffer2, "", holder.finish); + state2.pendingcb++; + state2.lastBufferedRequest = null; + if (holder.next) { + state2.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state2.corkedRequestsFree = new CorkedRequest(state2); + } + state2.bufferedRequestCount = 0; + } else { + while (entry) { + var chunk = entry.chunk; + var encoding2 = entry.encoding; + var cb = entry.callback; + var len = state2.objectMode ? 1 : chunk.length; + doWrite(stream2, state2, false, len, chunk, encoding2, cb); + entry = entry.next; + state2.bufferedRequestCount--; + if (state2.writing) { + break; + } + } + if (entry === null) state2.lastBufferedRequest = null; + } + state2.bufferedRequest = entry; + state2.bufferProcessing = false; + } + Writable.prototype._write = function(chunk, encoding2, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED("_write()")); + }; + Writable.prototype._writev = null; + Writable.prototype.end = function(chunk, encoding2, cb) { + var state2 = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding2 = null; + } else if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + if (chunk !== null && chunk !== void 0) this.write(chunk, encoding2); + if (state2.corked) { + state2.corked = 1; + this.uncork(); + } + if (!state2.ending) endWritable(this, state2, cb); + return this; + }; + Object.defineProperty(Writable.prototype, "writableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.length; + } + }); + function needFinish(state2) { + return state2.ending && state2.length === 0 && state2.bufferedRequest === null && !state2.finished && !state2.writing; + } + function callFinal(stream2, state2) { + stream2._final(function(err) { + state2.pendingcb--; + if (err) { + errorOrDestroy(stream2, err); + } + state2.prefinished = true; + stream2.emit("prefinish"); + finishMaybe(stream2, state2); + }); + } + function prefinish(stream2, state2) { + if (!state2.prefinished && !state2.finalCalled) { + if (typeof stream2._final === "function" && !state2.destroyed) { + state2.pendingcb++; + state2.finalCalled = true; + process.nextTick(callFinal, stream2, state2); + } else { + state2.prefinished = true; + stream2.emit("prefinish"); + } + } + } + function finishMaybe(stream2, state2) { + var need = needFinish(state2); + if (need) { + prefinish(stream2, state2); + if (state2.pendingcb === 0) { + state2.finished = true; + stream2.emit("finish"); + if (state2.autoDestroy) { + var rState = stream2._readableState; + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream2.destroy(); + } + } + } + } + return need; + } + function endWritable(stream2, state2, cb) { + state2.ending = true; + finishMaybe(stream2, state2); + if (cb) { + if (state2.finished) process.nextTick(cb); + else stream2.once("finish", cb); + } + state2.ended = true; + stream2.writable = false; + } + function onCorkedFinish(corkReq, state2, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state2.pendingcb--; + cb(err); + entry = entry.next; + } + state2.corkedRequestsFree.next = corkReq; + } + Object.defineProperty(Writable.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._writableState === void 0) { + return false; + } + return this._writableState.destroyed; + }, + set: function set2(value) { + if (!this._writableState) { + return; + } + this._writableState.destroyed = value; + } + }); + Writable.prototype.destroy = destroyImpl.destroy; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function(err, cb) { + cb(err); + }; + return _stream_writable$2; +} +var _stream_duplex$2; +var hasRequired_stream_duplex$2; +function require_stream_duplex$2() { + if (hasRequired_stream_duplex$2) return _stream_duplex$2; + hasRequired_stream_duplex$2 = 1; + var objectKeys2 = Object.keys || function(obj) { + var keys2 = []; + for (var key2 in obj) keys2.push(key2); + return keys2; + }; + _stream_duplex$2 = Duplex; + var Readable = require_stream_readable$2(); + var Writable = require_stream_writable$2(); + requireInherits_browser$1()(Duplex, Readable); + { + var keys = objectKeys2(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + } + function Duplex(options2) { + if (!(this instanceof Duplex)) return new Duplex(options2); + Readable.call(this, options2); + Writable.call(this, options2); + this.allowHalfOpen = true; + if (options2) { + if (options2.readable === false) this.readable = false; + if (options2.writable === false) this.writable = false; + if (options2.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once("end", onend); + } + } + } + Object.defineProperty(Duplex.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.highWaterMark; + } + }); + Object.defineProperty(Duplex.prototype, "writableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState && this._writableState.getBuffer(); + } + }); + Object.defineProperty(Duplex.prototype, "writableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.length; + } + }); + function onend() { + if (this._writableState.ended) return; + process.nextTick(onEndNT, this); + } + function onEndNT(self2) { + self2.end(); + } + Object.defineProperty(Duplex.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._readableState === void 0 || this._writableState === void 0) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set2(value) { + if (this._readableState === void 0 || this._writableState === void 0) { + return; + } + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }); + return _stream_duplex$2; +} +var endOfStream$3; +var hasRequiredEndOfStream$3; +function requireEndOfStream$3() { + if (hasRequiredEndOfStream$3) return endOfStream$3; + hasRequiredEndOfStream$3 = 1; + var ERR_STREAM_PREMATURE_CLOSE = requireErrorsBrowser$2().codes.ERR_STREAM_PREMATURE_CLOSE; + function once2(callback) { + var called = false; + return function() { + if (called) return; + called = true; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + callback.apply(this, args); + }; + } + function noop2() { + } + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + function eos(stream2, opts, callback) { + if (typeof opts === "function") return eos(stream2, null, opts); + if (!opts) opts = {}; + callback = once2(callback || noop2); + var readable2 = opts.readable || opts.readable !== false && stream2.readable; + var writable2 = opts.writable || opts.writable !== false && stream2.writable; + var onlegacyfinish = function onlegacyfinish2() { + if (!stream2.writable) onfinish(); + }; + var writableEnded = stream2._writableState && stream2._writableState.finished; + var onfinish = function onfinish2() { + writable2 = false; + writableEnded = true; + if (!readable2) callback.call(stream2); + }; + var readableEnded = stream2._readableState && stream2._readableState.endEmitted; + var onend = function onend2() { + readable2 = false; + readableEnded = true; + if (!writable2) callback.call(stream2); + }; + var onerror = function onerror2(err) { + callback.call(stream2, err); + }; + var onclose = function onclose2() { + var err; + if (readable2 && !readableEnded) { + if (!stream2._readableState || !stream2._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream2, err); + } + if (writable2 && !writableEnded) { + if (!stream2._writableState || !stream2._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream2, err); + } + }; + var onrequest = function onrequest2() { + stream2.req.on("finish", onfinish); + }; + if (isRequest(stream2)) { + stream2.on("complete", onfinish); + stream2.on("abort", onclose); + if (stream2.req) onrequest(); + else stream2.on("request", onrequest); + } else if (writable2 && !stream2._writableState) { + stream2.on("end", onlegacyfinish); + stream2.on("close", onlegacyfinish); + } + stream2.on("end", onend); + stream2.on("finish", onfinish); + if (opts.error !== false) stream2.on("error", onerror); + stream2.on("close", onclose); + return function() { + stream2.removeListener("complete", onfinish); + stream2.removeListener("abort", onclose); + stream2.removeListener("request", onrequest); + if (stream2.req) stream2.req.removeListener("finish", onfinish); + stream2.removeListener("end", onlegacyfinish); + stream2.removeListener("close", onlegacyfinish); + stream2.removeListener("finish", onfinish); + stream2.removeListener("end", onend); + stream2.removeListener("error", onerror); + stream2.removeListener("close", onclose); + }; + } + endOfStream$3 = eos; + return endOfStream$3; +} +var async_iterator$2; +var hasRequiredAsync_iterator$2; +function requireAsync_iterator$2() { + if (hasRequiredAsync_iterator$2) return async_iterator$2; + hasRequiredAsync_iterator$2 = 1; + var _Object$setPrototypeO; + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return typeof key2 === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + var finished = requireEndOfStream$3(); + var kLastResolve = Symbol("lastResolve"); + var kLastReject = Symbol("lastReject"); + var kError = Symbol("error"); + var kEnded = Symbol("ended"); + var kLastPromise = Symbol("lastPromise"); + var kHandlePromise = Symbol("handlePromise"); + var kStream = Symbol("stream"); + function createIterResult(value, done) { + return { + value, + done + }; + } + function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + if (resolve !== null) { + var data2 = iter[kStream].read(); + if (data2 !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data2, false)); + } + } + } + function onReadable(iter) { + process.nextTick(readAndResolve, iter); + } + function wrapForNext(lastPromise, iter) { + return function(resolve, reject) { + lastPromise.then(function() { + if (iter[kEnded]) { + resolve(createIterResult(void 0, true)); + return; + } + iter[kHandlePromise](resolve, reject); + }, reject); + }; + } + var AsyncIteratorPrototype = Object.getPrototypeOf(function() { + }); + var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + next: function next() { + var _this = this; + var error2 = this[kError]; + if (error2 !== null) { + return Promise.reject(error2); + } + if (this[kEnded]) { + return Promise.resolve(createIterResult(void 0, true)); + } + if (this[kStream].destroyed) { + return new Promise(function(resolve, reject) { + process.nextTick(function() { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(void 0, true)); + } + }); + }); + } + var lastPromise = this[kLastPromise]; + var promise; + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + var data2 = this[kStream].read(); + if (data2 !== null) { + return Promise.resolve(createIterResult(data2, false)); + } + promise = new Promise(this[kHandlePromise]); + } + this[kLastPromise] = promise; + return promise; + } + }, _defineProperty2(_Object$setPrototypeO, Symbol.asyncIterator, function() { + return this; + }), _defineProperty2(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + return new Promise(function(resolve, reject) { + _this2[kStream].destroy(null, function(err) { + if (err) { + reject(err); + return; + } + resolve(createIterResult(void 0, true)); + }); + }); + }), _Object$setPrototypeO), AsyncIteratorPrototype); + var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator2(stream2) { + var _Object$create; + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty2(_Object$create, kStream, { + value: stream2, + writable: true + }), _defineProperty2(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kEnded, { + value: stream2._readableState.endEmitted, + writable: true + }), _defineProperty2(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data2 = iterator[kStream].read(); + if (data2) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data2, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream2, function(err) { + if (err && err.code !== "ERR_STREAM_PREMATURE_CLOSE") { + var reject = iterator[kLastReject]; + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + iterator[kError] = err; + return; + } + var resolve = iterator[kLastResolve]; + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(void 0, true)); + } + iterator[kEnded] = true; + }); + stream2.on("readable", onReadable.bind(null, iterator)); + return iterator; + }; + async_iterator$2 = createReadableStreamAsyncIterator; + return async_iterator$2; +} +var fromBrowser$2; +var hasRequiredFromBrowser$2; +function requireFromBrowser$2() { + if (hasRequiredFromBrowser$2) return fromBrowser$2; + hasRequiredFromBrowser$2 = 1; + fromBrowser$2 = function() { + throw new Error("Readable.from is not available in the browser"); + }; + return fromBrowser$2; +} +var _stream_readable$2; +var hasRequired_stream_readable$2; +function require_stream_readable$2() { + if (hasRequired_stream_readable$2) return _stream_readable$2; + hasRequired_stream_readable$2 = 1; + _stream_readable$2 = Readable; + var Duplex; + Readable.ReadableState = ReadableState; + requireEvents().EventEmitter; + var EElistenerCount = function EElistenerCount2(emitter, type2) { + return emitter.listeners(type2).length; + }; + var Stream2 = requireStreamBrowser$2(); + var Buffer2 = requireBuffer$2().Buffer; + var OurUint8Array = (typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var debugUtil = require$$3; + var debug2; + if (debugUtil && debugUtil.debuglog) { + debug2 = debugUtil.debuglog("stream"); + } else { + debug2 = function debug3() { + }; + } + var BufferList = requireBuffer_list$2(); + var destroyImpl = requireDestroy$2(); + var _require = requireState$2(), getHighWaterMark = _require.getHighWaterMark; + var _require$codes = requireErrorsBrowser$2().codes, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; + var StringDecoder; + var createReadableStreamAsyncIterator; + var from2; + requireInherits_browser$1()(Readable, Stream2); + var errorOrDestroy = destroyImpl.errorOrDestroy; + var kProxyEvents = ["error", "close", "destroy", "pause", "resume"]; + function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === "function") return emitter.prependListener(event, fn); + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn); + else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn); + else emitter._events[event] = [fn, emitter._events[event]]; + } + function ReadableState(options2, stream2, isDuplex) { + Duplex = Duplex || require_stream_duplex$2(); + options2 = options2 || {}; + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof Duplex; + this.objectMode = !!options2.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options2.readableObjectMode; + this.highWaterMark = getHighWaterMark(this, options2, "readableHighWaterMark", isDuplex); + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + this.sync = true; + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; + this.emitClose = options2.emitClose !== false; + this.autoDestroy = !!options2.autoDestroy; + this.destroyed = false; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.awaitDrain = 0; + this.readingMore = false; + this.decoder = null; + this.encoding = null; + if (options2.encoding) { + if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder; + this.decoder = new StringDecoder(options2.encoding); + this.encoding = options2.encoding; + } + } + function Readable(options2) { + Duplex = Duplex || require_stream_duplex$2(); + if (!(this instanceof Readable)) return new Readable(options2); + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options2, this, isDuplex); + this.readable = true; + if (options2) { + if (typeof options2.read === "function") this._read = options2.read; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + } + Stream2.call(this); + } + Object.defineProperty(Readable.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._readableState === void 0) { + return false; + } + return this._readableState.destroyed; + }, + set: function set2(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + } + }); + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function(err, cb) { + cb(err); + }; + Readable.prototype.push = function(chunk, encoding2) { + var state2 = this._readableState; + var skipChunkCheck; + if (!state2.objectMode) { + if (typeof chunk === "string") { + encoding2 = encoding2 || state2.defaultEncoding; + if (encoding2 !== state2.encoding) { + chunk = Buffer2.from(chunk, encoding2); + encoding2 = ""; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + return readableAddChunk(this, chunk, encoding2, false, skipChunkCheck); + }; + Readable.prototype.unshift = function(chunk) { + return readableAddChunk(this, chunk, null, true, false); + }; + function readableAddChunk(stream2, chunk, encoding2, addToFront, skipChunkCheck) { + debug2("readableAddChunk", chunk); + var state2 = stream2._readableState; + if (chunk === null) { + state2.reading = false; + onEofChunk(stream2, state2); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state2, chunk); + if (er) { + errorOrDestroy(stream2, er); + } else if (state2.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== "string" && !state2.objectMode && Object.getPrototypeOf(chunk) !== Buffer2.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (addToFront) { + if (state2.endEmitted) errorOrDestroy(stream2, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else addChunk(stream2, state2, chunk, true); + } else if (state2.ended) { + errorOrDestroy(stream2, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state2.destroyed) { + return false; + } else { + state2.reading = false; + if (state2.decoder && !encoding2) { + chunk = state2.decoder.write(chunk); + if (state2.objectMode || chunk.length !== 0) addChunk(stream2, state2, chunk, false); + else maybeReadMore(stream2, state2); + } else { + addChunk(stream2, state2, chunk, false); + } + } + } else if (!addToFront) { + state2.reading = false; + maybeReadMore(stream2, state2); + } + } + return !state2.ended && (state2.length < state2.highWaterMark || state2.length === 0); + } + function addChunk(stream2, state2, chunk, addToFront) { + if (state2.flowing && state2.length === 0 && !state2.sync) { + state2.awaitDrain = 0; + stream2.emit("data", chunk); + } else { + state2.length += state2.objectMode ? 1 : chunk.length; + if (addToFront) state2.buffer.unshift(chunk); + else state2.buffer.push(chunk); + if (state2.needReadable) emitReadable(stream2); + } + maybeReadMore(stream2, state2); + } + function chunkInvalid(state2, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== "string" && chunk !== void 0 && !state2.objectMode) { + er = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + return er; + } + Readable.prototype.isPaused = function() { + return this._readableState.flowing === false; + }; + Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder; + var decoder2 = new StringDecoder(enc); + this._readableState.decoder = decoder2; + this._readableState.encoding = this._readableState.decoder.encoding; + var p = this._readableState.buffer.head; + var content = ""; + while (p !== null) { + content += decoder2.write(p.data); + p = p.next; + } + this._readableState.buffer.clear(); + if (content !== "") this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; + }; + var MAX_HWM = 1073741824; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + function howMuchToRead(n, state2) { + if (n <= 0 || state2.length === 0 && state2.ended) return 0; + if (state2.objectMode) return 1; + if (n !== n) { + if (state2.flowing && state2.length) return state2.buffer.head.data.length; + else return state2.length; + } + if (n > state2.highWaterMark) state2.highWaterMark = computeNewHighWaterMark(n); + if (n <= state2.length) return n; + if (!state2.ended) { + state2.needReadable = true; + return 0; + } + return state2.length; + } + Readable.prototype.read = function(n) { + debug2("read", n); + n = parseInt(n, 10); + var state2 = this._readableState; + var nOrig = n; + if (n !== 0) state2.emittedReadable = false; + if (n === 0 && state2.needReadable && ((state2.highWaterMark !== 0 ? state2.length >= state2.highWaterMark : state2.length > 0) || state2.ended)) { + debug2("read: emitReadable", state2.length, state2.ended); + if (state2.length === 0 && state2.ended) endReadable(this); + else emitReadable(this); + return null; + } + n = howMuchToRead(n, state2); + if (n === 0 && state2.ended) { + if (state2.length === 0) endReadable(this); + return null; + } + var doRead = state2.needReadable; + debug2("need readable", doRead); + if (state2.length === 0 || state2.length - n < state2.highWaterMark) { + doRead = true; + debug2("length less than watermark", doRead); + } + if (state2.ended || state2.reading) { + doRead = false; + debug2("reading or ended", doRead); + } else if (doRead) { + debug2("do read"); + state2.reading = true; + state2.sync = true; + if (state2.length === 0) state2.needReadable = true; + this._read(state2.highWaterMark); + state2.sync = false; + if (!state2.reading) n = howMuchToRead(nOrig, state2); + } + var ret; + if (n > 0) ret = fromList(n, state2); + else ret = null; + if (ret === null) { + state2.needReadable = state2.length <= state2.highWaterMark; + n = 0; + } else { + state2.length -= n; + state2.awaitDrain = 0; + } + if (state2.length === 0) { + if (!state2.ended) state2.needReadable = true; + if (nOrig !== n && state2.ended) endReadable(this); + } + if (ret !== null) this.emit("data", ret); + return ret; + }; + function onEofChunk(stream2, state2) { + debug2("onEofChunk"); + if (state2.ended) return; + if (state2.decoder) { + var chunk = state2.decoder.end(); + if (chunk && chunk.length) { + state2.buffer.push(chunk); + state2.length += state2.objectMode ? 1 : chunk.length; + } + } + state2.ended = true; + if (state2.sync) { + emitReadable(stream2); + } else { + state2.needReadable = false; + if (!state2.emittedReadable) { + state2.emittedReadable = true; + emitReadable_(stream2); + } + } + } + function emitReadable(stream2) { + var state2 = stream2._readableState; + debug2("emitReadable", state2.needReadable, state2.emittedReadable); + state2.needReadable = false; + if (!state2.emittedReadable) { + debug2("emitReadable", state2.flowing); + state2.emittedReadable = true; + process.nextTick(emitReadable_, stream2); + } + } + function emitReadable_(stream2) { + var state2 = stream2._readableState; + debug2("emitReadable_", state2.destroyed, state2.length, state2.ended); + if (!state2.destroyed && (state2.length || state2.ended)) { + stream2.emit("readable"); + state2.emittedReadable = false; + } + state2.needReadable = !state2.flowing && !state2.ended && state2.length <= state2.highWaterMark; + flow(stream2); + } + function maybeReadMore(stream2, state2) { + if (!state2.readingMore) { + state2.readingMore = true; + process.nextTick(maybeReadMore_, stream2, state2); + } + } + function maybeReadMore_(stream2, state2) { + while (!state2.reading && !state2.ended && (state2.length < state2.highWaterMark || state2.flowing && state2.length === 0)) { + var len = state2.length; + debug2("maybeReadMore read 0"); + stream2.read(0); + if (len === state2.length) + break; + } + state2.readingMore = false; + } + Readable.prototype._read = function(n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED("_read()")); + }; + Readable.prototype.pipe = function(dest, pipeOpts) { + var src2 = this; + var state2 = this._readableState; + switch (state2.pipesCount) { + case 0: + state2.pipes = dest; + break; + case 1: + state2.pipes = [state2.pipes, dest]; + break; + default: + state2.pipes.push(dest); + break; + } + state2.pipesCount += 1; + debug2("pipe count=%d opts=%j", state2.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state2.endEmitted) process.nextTick(endFn); + else src2.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable2, unpipeInfo) { + debug2("onunpipe"); + if (readable2 === src2) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + function onend() { + debug2("onend"); + dest.end(); + } + var ondrain = pipeOnDrain(src2); + dest.on("drain", ondrain); + var cleanedUp = false; + function cleanup() { + debug2("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + dest.removeListener("drain", ondrain); + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src2.removeListener("end", onend); + src2.removeListener("end", unpipe); + src2.removeListener("data", ondata); + cleanedUp = true; + if (state2.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + src2.on("data", ondata); + function ondata(chunk) { + debug2("ondata"); + var ret = dest.write(chunk); + debug2("dest.write", ret); + if (ret === false) { + if ((state2.pipesCount === 1 && state2.pipes === dest || state2.pipesCount > 1 && indexOf(state2.pipes, dest) !== -1) && !cleanedUp) { + debug2("false write response, pause", state2.awaitDrain); + state2.awaitDrain++; + } + src2.pause(); + } + } + function onerror(er) { + debug2("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (EElistenerCount(dest, "error") === 0) errorOrDestroy(dest, er); + } + prependListener(dest, "error", onerror); + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug2("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + debug2("unpipe"); + src2.unpipe(dest); + } + dest.emit("pipe", src2); + if (!state2.flowing) { + debug2("pipe resume"); + src2.resume(); + } + return dest; + }; + function pipeOnDrain(src2) { + return function pipeOnDrainFunctionResult() { + var state2 = src2._readableState; + debug2("pipeOnDrain", state2.awaitDrain); + if (state2.awaitDrain) state2.awaitDrain--; + if (state2.awaitDrain === 0 && EElistenerCount(src2, "data")) { + state2.flowing = true; + flow(src2); + } + }; + } + Readable.prototype.unpipe = function(dest) { + var state2 = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; + if (state2.pipesCount === 0) return this; + if (state2.pipesCount === 1) { + if (dest && dest !== state2.pipes) return this; + if (!dest) dest = state2.pipes; + state2.pipes = null; + state2.pipesCount = 0; + state2.flowing = false; + if (dest) dest.emit("unpipe", this, unpipeInfo); + return this; + } + if (!dest) { + var dests = state2.pipes; + var len = state2.pipesCount; + state2.pipes = null; + state2.pipesCount = 0; + state2.flowing = false; + for (var i = 0; i < len; i++) dests[i].emit("unpipe", this, { + hasUnpiped: false + }); + return this; + } + var index2 = indexOf(state2.pipes, dest); + if (index2 === -1) return this; + state2.pipes.splice(index2, 1); + state2.pipesCount -= 1; + if (state2.pipesCount === 1) state2.pipes = state2.pipes[0]; + dest.emit("unpipe", this, unpipeInfo); + return this; + }; + Readable.prototype.on = function(ev, fn) { + var res = Stream2.prototype.on.call(this, ev, fn); + var state2 = this._readableState; + if (ev === "data") { + state2.readableListening = this.listenerCount("readable") > 0; + if (state2.flowing !== false) this.resume(); + } else if (ev === "readable") { + if (!state2.endEmitted && !state2.readableListening) { + state2.readableListening = state2.needReadable = true; + state2.flowing = false; + state2.emittedReadable = false; + debug2("on readable", state2.length, state2.reading); + if (state2.length) { + emitReadable(this); + } else if (!state2.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + Readable.prototype.removeListener = function(ev, fn) { + var res = Stream2.prototype.removeListener.call(this, ev, fn); + if (ev === "readable") { + process.nextTick(updateReadableListening, this); + } + return res; + }; + Readable.prototype.removeAllListeners = function(ev) { + var res = Stream2.prototype.removeAllListeners.apply(this, arguments); + if (ev === "readable" || ev === void 0) { + process.nextTick(updateReadableListening, this); + } + return res; + }; + function updateReadableListening(self2) { + var state2 = self2._readableState; + state2.readableListening = self2.listenerCount("readable") > 0; + if (state2.resumeScheduled && !state2.paused) { + state2.flowing = true; + } else if (self2.listenerCount("data") > 0) { + self2.resume(); + } + } + function nReadingNextTick(self2) { + debug2("readable nexttick read 0"); + self2.read(0); + } + Readable.prototype.resume = function() { + var state2 = this._readableState; + if (!state2.flowing) { + debug2("resume"); + state2.flowing = !state2.readableListening; + resume(this, state2); + } + state2.paused = false; + return this; + }; + function resume(stream2, state2) { + if (!state2.resumeScheduled) { + state2.resumeScheduled = true; + process.nextTick(resume_, stream2, state2); + } + } + function resume_(stream2, state2) { + debug2("resume", state2.reading); + if (!state2.reading) { + stream2.read(0); + } + state2.resumeScheduled = false; + stream2.emit("resume"); + flow(stream2); + if (state2.flowing && !state2.reading) stream2.read(0); + } + Readable.prototype.pause = function() { + debug2("call pause flowing=%j", this._readableState.flowing); + if (this._readableState.flowing !== false) { + debug2("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + this._readableState.paused = true; + return this; + }; + function flow(stream2) { + var state2 = stream2._readableState; + debug2("flow", state2.flowing); + while (state2.flowing && stream2.read() !== null) ; + } + Readable.prototype.wrap = function(stream2) { + var _this = this; + var state2 = this._readableState; + var paused = false; + stream2.on("end", function() { + debug2("wrapped end"); + if (state2.decoder && !state2.ended) { + var chunk = state2.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + _this.push(null); + }); + stream2.on("data", function(chunk) { + debug2("wrapped data"); + if (state2.decoder) chunk = state2.decoder.write(chunk); + if (state2.objectMode && (chunk === null || chunk === void 0)) return; + else if (!state2.objectMode && (!chunk || !chunk.length)) return; + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream2.pause(); + } + }); + for (var i in stream2) { + if (this[i] === void 0 && typeof stream2[i] === "function") { + this[i] = /* @__PURE__ */ function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream2[method].apply(stream2, arguments); + }; + }(i); + } + } + for (var n = 0; n < kProxyEvents.length; n++) { + stream2.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + this._read = function(n2) { + debug2("wrapped _read", n2); + if (paused) { + paused = false; + stream2.resume(); + } + }; + return this; + }; + if (typeof Symbol === "function") { + Readable.prototype[Symbol.asyncIterator] = function() { + if (createReadableStreamAsyncIterator === void 0) { + createReadableStreamAsyncIterator = requireAsync_iterator$2(); + } + return createReadableStreamAsyncIterator(this); + }; + } + Object.defineProperty(Readable.prototype, "readableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.highWaterMark; + } + }); + Object.defineProperty(Readable.prototype, "readableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState && this._readableState.buffer; + } + }); + Object.defineProperty(Readable.prototype, "readableFlowing", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.flowing; + }, + set: function set2(state2) { + if (this._readableState) { + this._readableState.flowing = state2; + } + } + }); + Readable._fromList = fromList; + Object.defineProperty(Readable.prototype, "readableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.length; + } + }); + function fromList(n, state2) { + if (state2.length === 0) return null; + var ret; + if (state2.objectMode) ret = state2.buffer.shift(); + else if (!n || n >= state2.length) { + if (state2.decoder) ret = state2.buffer.join(""); + else if (state2.buffer.length === 1) ret = state2.buffer.first(); + else ret = state2.buffer.concat(state2.length); + state2.buffer.clear(); + } else { + ret = state2.buffer.consume(n, state2.decoder); + } + return ret; + } + function endReadable(stream2) { + var state2 = stream2._readableState; + debug2("endReadable", state2.endEmitted); + if (!state2.endEmitted) { + state2.ended = true; + process.nextTick(endReadableNT, state2, stream2); + } + } + function endReadableNT(state2, stream2) { + debug2("endReadableNT", state2.endEmitted, state2.length); + if (!state2.endEmitted && state2.length === 0) { + state2.endEmitted = true; + stream2.readable = false; + stream2.emit("end"); + if (state2.autoDestroy) { + var wState = stream2._writableState; + if (!wState || wState.autoDestroy && wState.finished) { + stream2.destroy(); + } + } + } + } + if (typeof Symbol === "function") { + Readable.from = function(iterable, opts) { + if (from2 === void 0) { + from2 = requireFromBrowser$2(); + } + return from2(Readable, iterable, opts); + }; + } + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; + } + return _stream_readable$2; +} +var _stream_transform$2; +var hasRequired_stream_transform$2; +function require_stream_transform$2() { + if (hasRequired_stream_transform$2) return _stream_transform$2; + hasRequired_stream_transform$2 = 1; + _stream_transform$2 = Transform; + var _require$codes = requireErrorsBrowser$2().codes, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + var Duplex = require_stream_duplex$2(); + requireInherits_browser$1()(Transform, Duplex); + function afterTransform(er, data2) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + if (cb === null) { + return this.emit("error", new ERR_MULTIPLE_CALLBACK()); + } + ts.writechunk = null; + ts.writecb = null; + if (data2 != null) + this.push(data2); + cb(er); + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } + } + function Transform(options2) { + if (!(this instanceof Transform)) return new Transform(options2); + Duplex.call(this, options2); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + this._readableState.needReadable = true; + this._readableState.sync = false; + if (options2) { + if (typeof options2.transform === "function") this._transform = options2.transform; + if (typeof options2.flush === "function") this._flush = options2.flush; + } + this.on("prefinish", prefinish); + } + function prefinish() { + var _this = this; + if (typeof this._flush === "function" && !this._readableState.destroyed) { + this._flush(function(er, data2) { + done(_this, er, data2); + }); + } else { + done(this, null, null); + } + } + Transform.prototype.push = function(chunk, encoding2) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding2); + }; + Transform.prototype._transform = function(chunk, encoding2, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED("_transform()")); + }; + Transform.prototype._write = function(chunk, encoding2, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding2; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } + }; + Transform.prototype._read = function(n) { + var ts = this._transformState; + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + ts.needTransform = true; + } + }; + Transform.prototype._destroy = function(err, cb) { + Duplex.prototype._destroy.call(this, err, function(err2) { + cb(err2); + }); + }; + function done(stream2, er, data2) { + if (er) return stream2.emit("error", er); + if (data2 != null) + stream2.push(data2); + if (stream2._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream2._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream2.push(null); + } + return _stream_transform$2; +} +var _stream_passthrough$2; +var hasRequired_stream_passthrough$2; +function require_stream_passthrough$2() { + if (hasRequired_stream_passthrough$2) return _stream_passthrough$2; + hasRequired_stream_passthrough$2 = 1; + _stream_passthrough$2 = PassThrough; + var Transform = require_stream_transform$2(); + requireInherits_browser$1()(PassThrough, Transform); + function PassThrough(options2) { + if (!(this instanceof PassThrough)) return new PassThrough(options2); + Transform.call(this, options2); + } + PassThrough.prototype._transform = function(chunk, encoding2, cb) { + cb(null, chunk); + }; + return _stream_passthrough$2; +} +var pipeline_1$2; +var hasRequiredPipeline$2; +function requirePipeline$2() { + if (hasRequiredPipeline$2) return pipeline_1$2; + hasRequiredPipeline$2 = 1; + var eos; + function once2(callback) { + var called = false; + return function() { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; + } + var _require$codes = requireErrorsBrowser$2().codes, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + function noop2(err) { + if (err) throw err; + } + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + function destroyer(stream2, reading, writing, callback) { + callback = once2(callback); + var closed = false; + stream2.on("close", function() { + closed = true; + }); + if (eos === void 0) eos = requireEndOfStream$3(); + eos(stream2, { + readable: reading, + writable: writing + }, function(err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function(err) { + if (closed) return; + if (destroyed) return; + destroyed = true; + if (isRequest(stream2)) return stream2.abort(); + if (typeof stream2.destroy === "function") return stream2.destroy(); + callback(err || new ERR_STREAM_DESTROYED("pipe")); + }; + } + function call(fn) { + fn(); + } + function pipe(from2, to) { + return from2.pipe(to); + } + function popCallback(streams) { + if (!streams.length) return noop2; + if (typeof streams[streams.length - 1] !== "function") return noop2; + return streams.pop(); + } + function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + if (streams.length < 2) { + throw new ERR_MISSING_ARGS("streams"); + } + var error2; + var destroys = streams.map(function(stream2, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream2, reading, writing, function(err) { + if (!error2) error2 = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error2); + }); + }); + return streams.reduce(pipe); + } + pipeline_1$2 = pipeline; + return pipeline_1$2; +} +var hasRequiredReadableBrowser$2; +function requireReadableBrowser$2() { + if (hasRequiredReadableBrowser$2) return readableBrowser$2.exports; + hasRequiredReadableBrowser$2 = 1; + (function(module, exports) { + exports = module.exports = require_stream_readable$2(); + exports.Stream = exports; + exports.Readable = exports; + exports.Writable = require_stream_writable$2(); + exports.Duplex = require_stream_duplex$2(); + exports.Transform = require_stream_transform$2(); + exports.PassThrough = require_stream_passthrough$2(); + exports.finished = requireEndOfStream$3(); + exports.pipeline = requirePipeline$2(); + })(readableBrowser$2, readableBrowser$2.exports); + return readableBrowser$2.exports; +} +var hashBase; +var hasRequiredHashBase; +function requireHashBase() { + if (hasRequiredHashBase) return hashBase; + hasRequiredHashBase = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var Transform = requireReadableBrowser$2().Transform; + var inherits = requireInherits_browser$1(); + function throwIfNotStringOrBuffer(val, prefix) { + if (!Buffer2.isBuffer(val) && typeof val !== "string") { + throw new TypeError(prefix + " must be a string or a buffer"); + } + } + function HashBase(blockSize) { + Transform.call(this); + this._block = Buffer2.allocUnsafe(blockSize); + this._blockSize = blockSize; + this._blockOffset = 0; + this._length = [0, 0, 0, 0]; + this._finalized = false; + } + inherits(HashBase, Transform); + HashBase.prototype._transform = function(chunk, encoding2, callback) { + var error2 = null; + try { + this.update(chunk, encoding2); + } catch (err) { + error2 = err; + } + callback(error2); + }; + HashBase.prototype._flush = function(callback) { + var error2 = null; + try { + this.push(this.digest()); + } catch (err) { + error2 = err; + } + callback(error2); + }; + HashBase.prototype.update = function(data2, encoding2) { + throwIfNotStringOrBuffer(data2, "Data"); + if (this._finalized) throw new Error("Digest already called"); + if (!Buffer2.isBuffer(data2)) data2 = Buffer2.from(data2, encoding2); + var block = this._block; + var offset2 = 0; + while (this._blockOffset + data2.length - offset2 >= this._blockSize) { + for (var i = this._blockOffset; i < this._blockSize; ) block[i++] = data2[offset2++]; + this._update(); + this._blockOffset = 0; + } + while (offset2 < data2.length) block[this._blockOffset++] = data2[offset2++]; + for (var j = 0, carry = data2.length * 8; carry > 0; ++j) { + this._length[j] += carry; + carry = this._length[j] / 4294967296 | 0; + if (carry > 0) this._length[j] -= 4294967296 * carry; + } + return this; + }; + HashBase.prototype._update = function() { + throw new Error("_update is not implemented"); + }; + HashBase.prototype.digest = function(encoding2) { + if (this._finalized) throw new Error("Digest already called"); + this._finalized = true; + var digest = this._digest(); + if (encoding2 !== void 0) digest = digest.toString(encoding2); + this._block.fill(0); + this._blockOffset = 0; + for (var i = 0; i < 4; ++i) this._length[i] = 0; + return digest; + }; + HashBase.prototype._digest = function() { + throw new Error("_digest is not implemented"); + }; + hashBase = HashBase; + return hashBase; +} +var md5_js; +var hasRequiredMd5_js; +function requireMd5_js() { + if (hasRequiredMd5_js) return md5_js; + hasRequiredMd5_js = 1; + var inherits = requireInherits_browser$1(); + var HashBase = requireHashBase(); + var Buffer2 = requireSafeBuffer().Buffer; + var ARRAY16 = new Array(16); + function MD5() { + HashBase.call(this, 64); + this._a = 1732584193; + this._b = 4023233417; + this._c = 2562383102; + this._d = 271733878; + } + inherits(MD5, HashBase); + MD5.prototype._update = function() { + var M = ARRAY16; + for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4); + var a = this._a; + var b = this._b; + var c = this._c; + var d = this._d; + a = fnF(a, b, c, d, M[0], 3614090360, 7); + d = fnF(d, a, b, c, M[1], 3905402710, 12); + c = fnF(c, d, a, b, M[2], 606105819, 17); + b = fnF(b, c, d, a, M[3], 3250441966, 22); + a = fnF(a, b, c, d, M[4], 4118548399, 7); + d = fnF(d, a, b, c, M[5], 1200080426, 12); + c = fnF(c, d, a, b, M[6], 2821735955, 17); + b = fnF(b, c, d, a, M[7], 4249261313, 22); + a = fnF(a, b, c, d, M[8], 1770035416, 7); + d = fnF(d, a, b, c, M[9], 2336552879, 12); + c = fnF(c, d, a, b, M[10], 4294925233, 17); + b = fnF(b, c, d, a, M[11], 2304563134, 22); + a = fnF(a, b, c, d, M[12], 1804603682, 7); + d = fnF(d, a, b, c, M[13], 4254626195, 12); + c = fnF(c, d, a, b, M[14], 2792965006, 17); + b = fnF(b, c, d, a, M[15], 1236535329, 22); + a = fnG(a, b, c, d, M[1], 4129170786, 5); + d = fnG(d, a, b, c, M[6], 3225465664, 9); + c = fnG(c, d, a, b, M[11], 643717713, 14); + b = fnG(b, c, d, a, M[0], 3921069994, 20); + a = fnG(a, b, c, d, M[5], 3593408605, 5); + d = fnG(d, a, b, c, M[10], 38016083, 9); + c = fnG(c, d, a, b, M[15], 3634488961, 14); + b = fnG(b, c, d, a, M[4], 3889429448, 20); + a = fnG(a, b, c, d, M[9], 568446438, 5); + d = fnG(d, a, b, c, M[14], 3275163606, 9); + c = fnG(c, d, a, b, M[3], 4107603335, 14); + b = fnG(b, c, d, a, M[8], 1163531501, 20); + a = fnG(a, b, c, d, M[13], 2850285829, 5); + d = fnG(d, a, b, c, M[2], 4243563512, 9); + c = fnG(c, d, a, b, M[7], 1735328473, 14); + b = fnG(b, c, d, a, M[12], 2368359562, 20); + a = fnH(a, b, c, d, M[5], 4294588738, 4); + d = fnH(d, a, b, c, M[8], 2272392833, 11); + c = fnH(c, d, a, b, M[11], 1839030562, 16); + b = fnH(b, c, d, a, M[14], 4259657740, 23); + a = fnH(a, b, c, d, M[1], 2763975236, 4); + d = fnH(d, a, b, c, M[4], 1272893353, 11); + c = fnH(c, d, a, b, M[7], 4139469664, 16); + b = fnH(b, c, d, a, M[10], 3200236656, 23); + a = fnH(a, b, c, d, M[13], 681279174, 4); + d = fnH(d, a, b, c, M[0], 3936430074, 11); + c = fnH(c, d, a, b, M[3], 3572445317, 16); + b = fnH(b, c, d, a, M[6], 76029189, 23); + a = fnH(a, b, c, d, M[9], 3654602809, 4); + d = fnH(d, a, b, c, M[12], 3873151461, 11); + c = fnH(c, d, a, b, M[15], 530742520, 16); + b = fnH(b, c, d, a, M[2], 3299628645, 23); + a = fnI(a, b, c, d, M[0], 4096336452, 6); + d = fnI(d, a, b, c, M[7], 1126891415, 10); + c = fnI(c, d, a, b, M[14], 2878612391, 15); + b = fnI(b, c, d, a, M[5], 4237533241, 21); + a = fnI(a, b, c, d, M[12], 1700485571, 6); + d = fnI(d, a, b, c, M[3], 2399980690, 10); + c = fnI(c, d, a, b, M[10], 4293915773, 15); + b = fnI(b, c, d, a, M[1], 2240044497, 21); + a = fnI(a, b, c, d, M[8], 1873313359, 6); + d = fnI(d, a, b, c, M[15], 4264355552, 10); + c = fnI(c, d, a, b, M[6], 2734768916, 15); + b = fnI(b, c, d, a, M[13], 1309151649, 21); + a = fnI(a, b, c, d, M[4], 4149444226, 6); + d = fnI(d, a, b, c, M[11], 3174756917, 10); + c = fnI(c, d, a, b, M[2], 718787259, 15); + b = fnI(b, c, d, a, M[9], 3951481745, 21); + this._a = this._a + a | 0; + this._b = this._b + b | 0; + this._c = this._c + c | 0; + this._d = this._d + d | 0; + }; + MD5.prototype._digest = function() { + this._block[this._blockOffset++] = 128; + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64); + this._update(); + this._blockOffset = 0; + } + this._block.fill(0, this._blockOffset, 56); + this._block.writeUInt32LE(this._length[0], 56); + this._block.writeUInt32LE(this._length[1], 60); + this._update(); + var buffer2 = Buffer2.allocUnsafe(16); + buffer2.writeInt32LE(this._a, 0); + buffer2.writeInt32LE(this._b, 4); + buffer2.writeInt32LE(this._c, 8); + buffer2.writeInt32LE(this._d, 12); + return buffer2; + }; + function rotl(x, n) { + return x << n | x >>> 32 - n; + } + function fnF(a, b, c, d, m, k, s) { + return rotl(a + (b & c | ~b & d) + m + k | 0, s) + b | 0; + } + function fnG(a, b, c, d, m, k, s) { + return rotl(a + (b & d | c & ~d) + m + k | 0, s) + b | 0; + } + function fnH(a, b, c, d, m, k, s) { + return rotl(a + (b ^ c ^ d) + m + k | 0, s) + b | 0; + } + function fnI(a, b, c, d, m, k, s) { + return rotl(a + (c ^ (b | ~d)) + m + k | 0, s) + b | 0; + } + md5_js = MD5; + return md5_js; +} +var ripemd160; +var hasRequiredRipemd160; +function requireRipemd160() { + if (hasRequiredRipemd160) return ripemd160; + hasRequiredRipemd160 = 1; + var Buffer2 = requireBuffer$2().Buffer; + var inherits = requireInherits_browser$1(); + var HashBase = requireHashBase(); + var ARRAY16 = new Array(16); + var zl = [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 7, + 4, + 13, + 1, + 10, + 6, + 15, + 3, + 12, + 0, + 9, + 5, + 2, + 14, + 11, + 8, + 3, + 10, + 14, + 4, + 9, + 15, + 8, + 1, + 2, + 7, + 0, + 6, + 13, + 11, + 5, + 12, + 1, + 9, + 11, + 10, + 0, + 8, + 12, + 4, + 13, + 3, + 7, + 15, + 14, + 5, + 6, + 2, + 4, + 0, + 5, + 9, + 7, + 12, + 2, + 10, + 14, + 1, + 3, + 8, + 11, + 6, + 15, + 13 + ]; + var zr = [ + 5, + 14, + 7, + 0, + 9, + 2, + 11, + 4, + 13, + 6, + 15, + 8, + 1, + 10, + 3, + 12, + 6, + 11, + 3, + 7, + 0, + 13, + 5, + 10, + 14, + 15, + 8, + 12, + 4, + 9, + 1, + 2, + 15, + 5, + 1, + 3, + 7, + 14, + 6, + 9, + 11, + 8, + 12, + 2, + 10, + 0, + 4, + 13, + 8, + 6, + 4, + 1, + 3, + 11, + 15, + 0, + 5, + 12, + 2, + 13, + 9, + 7, + 10, + 14, + 12, + 15, + 10, + 4, + 1, + 5, + 8, + 7, + 6, + 2, + 13, + 14, + 0, + 3, + 9, + 11 + ]; + var sl = [ + 11, + 14, + 15, + 12, + 5, + 8, + 7, + 9, + 11, + 13, + 14, + 15, + 6, + 7, + 9, + 8, + 7, + 6, + 8, + 13, + 11, + 9, + 7, + 15, + 7, + 12, + 15, + 9, + 11, + 7, + 13, + 12, + 11, + 13, + 6, + 7, + 14, + 9, + 13, + 15, + 14, + 8, + 13, + 6, + 5, + 12, + 7, + 5, + 11, + 12, + 14, + 15, + 14, + 15, + 9, + 8, + 9, + 14, + 5, + 6, + 8, + 6, + 5, + 12, + 9, + 15, + 5, + 11, + 6, + 8, + 13, + 12, + 5, + 12, + 13, + 14, + 11, + 8, + 5, + 6 + ]; + var sr = [ + 8, + 9, + 9, + 11, + 13, + 15, + 15, + 5, + 7, + 7, + 8, + 11, + 14, + 14, + 12, + 6, + 9, + 13, + 15, + 7, + 12, + 8, + 9, + 11, + 7, + 7, + 12, + 7, + 6, + 15, + 13, + 11, + 9, + 7, + 15, + 11, + 8, + 6, + 6, + 14, + 12, + 13, + 5, + 14, + 13, + 13, + 7, + 5, + 15, + 5, + 8, + 11, + 14, + 14, + 6, + 14, + 6, + 9, + 12, + 9, + 12, + 5, + 15, + 8, + 8, + 5, + 12, + 9, + 12, + 5, + 14, + 6, + 8, + 13, + 6, + 5, + 15, + 13, + 11, + 11 + ]; + var hl = [0, 1518500249, 1859775393, 2400959708, 2840853838]; + var hr = [1352829926, 1548603684, 1836072691, 2053994217, 0]; + function RIPEMD160() { + HashBase.call(this, 64); + this._a = 1732584193; + this._b = 4023233417; + this._c = 2562383102; + this._d = 271733878; + this._e = 3285377520; + } + inherits(RIPEMD160, HashBase); + RIPEMD160.prototype._update = function() { + var words = ARRAY16; + for (var j = 0; j < 16; ++j) words[j] = this._block.readInt32LE(j * 4); + var al = this._a | 0; + var bl = this._b | 0; + var cl = this._c | 0; + var dl = this._d | 0; + var el = this._e | 0; + var ar = this._a | 0; + var br = this._b | 0; + var cr = this._c | 0; + var dr = this._d | 0; + var er = this._e | 0; + for (var i = 0; i < 80; i += 1) { + var tl; + var tr; + if (i < 16) { + tl = fn1(al, bl, cl, dl, el, words[zl[i]], hl[0], sl[i]); + tr = fn5(ar, br, cr, dr, er, words[zr[i]], hr[0], sr[i]); + } else if (i < 32) { + tl = fn2(al, bl, cl, dl, el, words[zl[i]], hl[1], sl[i]); + tr = fn4(ar, br, cr, dr, er, words[zr[i]], hr[1], sr[i]); + } else if (i < 48) { + tl = fn3(al, bl, cl, dl, el, words[zl[i]], hl[2], sl[i]); + tr = fn3(ar, br, cr, dr, er, words[zr[i]], hr[2], sr[i]); + } else if (i < 64) { + tl = fn4(al, bl, cl, dl, el, words[zl[i]], hl[3], sl[i]); + tr = fn2(ar, br, cr, dr, er, words[zr[i]], hr[3], sr[i]); + } else { + tl = fn5(al, bl, cl, dl, el, words[zl[i]], hl[4], sl[i]); + tr = fn1(ar, br, cr, dr, er, words[zr[i]], hr[4], sr[i]); + } + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = tl; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = tr; + } + var t = this._b + cl + dr | 0; + this._b = this._c + dl + er | 0; + this._c = this._d + el + ar | 0; + this._d = this._e + al + br | 0; + this._e = this._a + bl + cr | 0; + this._a = t; + }; + RIPEMD160.prototype._digest = function() { + this._block[this._blockOffset++] = 128; + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64); + this._update(); + this._blockOffset = 0; + } + this._block.fill(0, this._blockOffset, 56); + this._block.writeUInt32LE(this._length[0], 56); + this._block.writeUInt32LE(this._length[1], 60); + this._update(); + var buffer2 = Buffer2.alloc ? Buffer2.alloc(20) : new Buffer2(20); + buffer2.writeInt32LE(this._a, 0); + buffer2.writeInt32LE(this._b, 4); + buffer2.writeInt32LE(this._c, 8); + buffer2.writeInt32LE(this._d, 12); + buffer2.writeInt32LE(this._e, 16); + return buffer2; + }; + function rotl(x, n) { + return x << n | x >>> 32 - n; + } + function fn1(a, b, c, d, e, m, k, s) { + return rotl(a + (b ^ c ^ d) + m + k | 0, s) + e | 0; + } + function fn2(a, b, c, d, e, m, k, s) { + return rotl(a + (b & c | ~b & d) + m + k | 0, s) + e | 0; + } + function fn3(a, b, c, d, e, m, k, s) { + return rotl(a + ((b | ~c) ^ d) + m + k | 0, s) + e | 0; + } + function fn4(a, b, c, d, e, m, k, s) { + return rotl(a + (b & d | c & ~d) + m + k | 0, s) + e | 0; + } + function fn5(a, b, c, d, e, m, k, s) { + return rotl(a + (b ^ (c | ~d)) + m + k | 0, s) + e | 0; + } + ripemd160 = RIPEMD160; + return ripemd160; +} +var sha_js = { exports: {} }; +var hash$1; +var hasRequiredHash$1; +function requireHash$1() { + if (hasRequiredHash$1) return hash$1; + hasRequiredHash$1 = 1; + var Buffer2 = requireSafeBuffer().Buffer; + function Hash(blockSize, finalSize) { + this._block = Buffer2.alloc(blockSize); + this._finalSize = finalSize; + this._blockSize = blockSize; + this._len = 0; + } + Hash.prototype.update = function(data2, enc) { + if (typeof data2 === "string") { + enc = enc || "utf8"; + data2 = Buffer2.from(data2, enc); + } + var block = this._block; + var blockSize = this._blockSize; + var length = data2.length; + var accum = this._len; + for (var offset2 = 0; offset2 < length; ) { + var assigned = accum % blockSize; + var remainder = Math.min(length - offset2, blockSize - assigned); + for (var i = 0; i < remainder; i++) { + block[assigned + i] = data2[offset2 + i]; + } + accum += remainder; + offset2 += remainder; + if (accum % blockSize === 0) { + this._update(block); + } + } + this._len += length; + return this; + }; + Hash.prototype.digest = function(enc) { + var rem = this._len % this._blockSize; + this._block[rem] = 128; + this._block.fill(0, rem + 1); + if (rem >= this._finalSize) { + this._update(this._block); + this._block.fill(0); + } + var bits = this._len * 8; + if (bits <= 4294967295) { + this._block.writeUInt32BE(bits, this._blockSize - 4); + } else { + var lowBits = (bits & 4294967295) >>> 0; + var highBits = (bits - lowBits) / 4294967296; + this._block.writeUInt32BE(highBits, this._blockSize - 8); + this._block.writeUInt32BE(lowBits, this._blockSize - 4); + } + this._update(this._block); + var hash2 = this._hash(); + return enc ? hash2.toString(enc) : hash2; + }; + Hash.prototype._update = function() { + throw new Error("_update must be implemented by subclass"); + }; + hash$1 = Hash; + return hash$1; +} +var sha$1; +var hasRequiredSha$1; +function requireSha$1() { + if (hasRequiredSha$1) return sha$1; + hasRequiredSha$1 = 1; + var inherits = requireInherits_browser$1(); + var Hash = requireHash$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var K = [ + 1518500249, + 1859775393, + 2400959708 | 0, + 3395469782 | 0 + ]; + var W = new Array(80); + function Sha() { + this.init(); + this._w = W; + Hash.call(this, 64, 56); + } + inherits(Sha, Hash); + Sha.prototype.init = function() { + this._a = 1732584193; + this._b = 4023233417; + this._c = 2562383102; + this._d = 271733878; + this._e = 3285377520; + return this; + }; + function rotl5(num) { + return num << 5 | num >>> 27; + } + function rotl30(num) { + return num << 30 | num >>> 2; + } + function ft(s, b, c, d) { + if (s === 0) return b & c | ~b & d; + if (s === 2) return b & c | b & d | c & d; + return b ^ c ^ d; + } + Sha.prototype._update = function(M) { + var W2 = this._w; + var a = this._a | 0; + var b = this._b | 0; + var c = this._c | 0; + var d = this._d | 0; + var e = this._e | 0; + for (var i = 0; i < 16; ++i) W2[i] = M.readInt32BE(i * 4); + for (; i < 80; ++i) W2[i] = W2[i - 3] ^ W2[i - 8] ^ W2[i - 14] ^ W2[i - 16]; + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20); + var t = rotl5(a) + ft(s, b, c, d) + e + W2[j] + K[s] | 0; + e = d; + d = c; + c = rotl30(b); + b = a; + a = t; + } + this._a = a + this._a | 0; + this._b = b + this._b | 0; + this._c = c + this._c | 0; + this._d = d + this._d | 0; + this._e = e + this._e | 0; + }; + Sha.prototype._hash = function() { + var H = Buffer2.allocUnsafe(20); + H.writeInt32BE(this._a | 0, 0); + H.writeInt32BE(this._b | 0, 4); + H.writeInt32BE(this._c | 0, 8); + H.writeInt32BE(this._d | 0, 12); + H.writeInt32BE(this._e | 0, 16); + return H; + }; + sha$1 = Sha; + return sha$1; +} +var sha1; +var hasRequiredSha1; +function requireSha1() { + if (hasRequiredSha1) return sha1; + hasRequiredSha1 = 1; + var inherits = requireInherits_browser$1(); + var Hash = requireHash$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var K = [ + 1518500249, + 1859775393, + 2400959708 | 0, + 3395469782 | 0 + ]; + var W = new Array(80); + function Sha1() { + this.init(); + this._w = W; + Hash.call(this, 64, 56); + } + inherits(Sha1, Hash); + Sha1.prototype.init = function() { + this._a = 1732584193; + this._b = 4023233417; + this._c = 2562383102; + this._d = 271733878; + this._e = 3285377520; + return this; + }; + function rotl1(num) { + return num << 1 | num >>> 31; + } + function rotl5(num) { + return num << 5 | num >>> 27; + } + function rotl30(num) { + return num << 30 | num >>> 2; + } + function ft(s, b, c, d) { + if (s === 0) return b & c | ~b & d; + if (s === 2) return b & c | b & d | c & d; + return b ^ c ^ d; + } + Sha1.prototype._update = function(M) { + var W2 = this._w; + var a = this._a | 0; + var b = this._b | 0; + var c = this._c | 0; + var d = this._d | 0; + var e = this._e | 0; + for (var i = 0; i < 16; ++i) W2[i] = M.readInt32BE(i * 4); + for (; i < 80; ++i) W2[i] = rotl1(W2[i - 3] ^ W2[i - 8] ^ W2[i - 14] ^ W2[i - 16]); + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20); + var t = rotl5(a) + ft(s, b, c, d) + e + W2[j] + K[s] | 0; + e = d; + d = c; + c = rotl30(b); + b = a; + a = t; + } + this._a = a + this._a | 0; + this._b = b + this._b | 0; + this._c = c + this._c | 0; + this._d = d + this._d | 0; + this._e = e + this._e | 0; + }; + Sha1.prototype._hash = function() { + var H = Buffer2.allocUnsafe(20); + H.writeInt32BE(this._a | 0, 0); + H.writeInt32BE(this._b | 0, 4); + H.writeInt32BE(this._c | 0, 8); + H.writeInt32BE(this._d | 0, 12); + H.writeInt32BE(this._e | 0, 16); + return H; + }; + sha1 = Sha1; + return sha1; +} +var sha256$1; +var hasRequiredSha256; +function requireSha256() { + if (hasRequiredSha256) return sha256$1; + hasRequiredSha256 = 1; + var inherits = requireInherits_browser$1(); + var Hash = requireHash$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var K = [ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]; + var W = new Array(64); + function Sha256() { + this.init(); + this._w = W; + Hash.call(this, 64, 56); + } + inherits(Sha256, Hash); + Sha256.prototype.init = function() { + this._a = 1779033703; + this._b = 3144134277; + this._c = 1013904242; + this._d = 2773480762; + this._e = 1359893119; + this._f = 2600822924; + this._g = 528734635; + this._h = 1541459225; + return this; + }; + function ch(x, y, z) { + return z ^ x & (y ^ z); + } + function maj(x, y, z) { + return x & y | z & (x | y); + } + function sigma0(x) { + return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10); + } + function sigma1(x) { + return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7); + } + function gamma0(x) { + return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ x >>> 3; + } + function gamma1(x) { + return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ x >>> 10; + } + Sha256.prototype._update = function(M) { + var W2 = this._w; + var a = this._a | 0; + var b = this._b | 0; + var c = this._c | 0; + var d = this._d | 0; + var e = this._e | 0; + var f = this._f | 0; + var g = this._g | 0; + var h = this._h | 0; + for (var i = 0; i < 16; ++i) W2[i] = M.readInt32BE(i * 4); + for (; i < 64; ++i) W2[i] = gamma1(W2[i - 2]) + W2[i - 7] + gamma0(W2[i - 15]) + W2[i - 16] | 0; + for (var j = 0; j < 64; ++j) { + var T1 = h + sigma1(e) + ch(e, f, g) + K[j] + W2[j] | 0; + var T2 = sigma0(a) + maj(a, b, c) | 0; + h = g; + g = f; + f = e; + e = d + T1 | 0; + d = c; + c = b; + b = a; + a = T1 + T2 | 0; + } + this._a = a + this._a | 0; + this._b = b + this._b | 0; + this._c = c + this._c | 0; + this._d = d + this._d | 0; + this._e = e + this._e | 0; + this._f = f + this._f | 0; + this._g = g + this._g | 0; + this._h = h + this._h | 0; + }; + Sha256.prototype._hash = function() { + var H = Buffer2.allocUnsafe(32); + H.writeInt32BE(this._a, 0); + H.writeInt32BE(this._b, 4); + H.writeInt32BE(this._c, 8); + H.writeInt32BE(this._d, 12); + H.writeInt32BE(this._e, 16); + H.writeInt32BE(this._f, 20); + H.writeInt32BE(this._g, 24); + H.writeInt32BE(this._h, 28); + return H; + }; + sha256$1 = Sha256; + return sha256$1; +} +var sha224$1; +var hasRequiredSha224; +function requireSha224() { + if (hasRequiredSha224) return sha224$1; + hasRequiredSha224 = 1; + var inherits = requireInherits_browser$1(); + var Sha256 = requireSha256(); + var Hash = requireHash$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var W = new Array(64); + function Sha224() { + this.init(); + this._w = W; + Hash.call(this, 64, 56); + } + inherits(Sha224, Sha256); + Sha224.prototype.init = function() { + this._a = 3238371032; + this._b = 914150663; + this._c = 812702999; + this._d = 4144912697; + this._e = 4290775857; + this._f = 1750603025; + this._g = 1694076839; + this._h = 3204075428; + return this; + }; + Sha224.prototype._hash = function() { + var H = Buffer2.allocUnsafe(28); + H.writeInt32BE(this._a, 0); + H.writeInt32BE(this._b, 4); + H.writeInt32BE(this._c, 8); + H.writeInt32BE(this._d, 12); + H.writeInt32BE(this._e, 16); + H.writeInt32BE(this._f, 20); + H.writeInt32BE(this._g, 24); + return H; + }; + sha224$1 = Sha224; + return sha224$1; +} +var sha512$1; +var hasRequiredSha512; +function requireSha512() { + if (hasRequiredSha512) return sha512$1; + hasRequiredSha512 = 1; + var inherits = requireInherits_browser$1(); + var Hash = requireHash$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var K = [ + 1116352408, + 3609767458, + 1899447441, + 602891725, + 3049323471, + 3964484399, + 3921009573, + 2173295548, + 961987163, + 4081628472, + 1508970993, + 3053834265, + 2453635748, + 2937671579, + 2870763221, + 3664609560, + 3624381080, + 2734883394, + 310598401, + 1164996542, + 607225278, + 1323610764, + 1426881987, + 3590304994, + 1925078388, + 4068182383, + 2162078206, + 991336113, + 2614888103, + 633803317, + 3248222580, + 3479774868, + 3835390401, + 2666613458, + 4022224774, + 944711139, + 264347078, + 2341262773, + 604807628, + 2007800933, + 770255983, + 1495990901, + 1249150122, + 1856431235, + 1555081692, + 3175218132, + 1996064986, + 2198950837, + 2554220882, + 3999719339, + 2821834349, + 766784016, + 2952996808, + 2566594879, + 3210313671, + 3203337956, + 3336571891, + 1034457026, + 3584528711, + 2466948901, + 113926993, + 3758326383, + 338241895, + 168717936, + 666307205, + 1188179964, + 773529912, + 1546045734, + 1294757372, + 1522805485, + 1396182291, + 2643833823, + 1695183700, + 2343527390, + 1986661051, + 1014477480, + 2177026350, + 1206759142, + 2456956037, + 344077627, + 2730485921, + 1290863460, + 2820302411, + 3158454273, + 3259730800, + 3505952657, + 3345764771, + 106217008, + 3516065817, + 3606008344, + 3600352804, + 1432725776, + 4094571909, + 1467031594, + 275423344, + 851169720, + 430227734, + 3100823752, + 506948616, + 1363258195, + 659060556, + 3750685593, + 883997877, + 3785050280, + 958139571, + 3318307427, + 1322822218, + 3812723403, + 1537002063, + 2003034995, + 1747873779, + 3602036899, + 1955562222, + 1575990012, + 2024104815, + 1125592928, + 2227730452, + 2716904306, + 2361852424, + 442776044, + 2428436474, + 593698344, + 2756734187, + 3733110249, + 3204031479, + 2999351573, + 3329325298, + 3815920427, + 3391569614, + 3928383900, + 3515267271, + 566280711, + 3940187606, + 3454069534, + 4118630271, + 4000239992, + 116418474, + 1914138554, + 174292421, + 2731055270, + 289380356, + 3203993006, + 460393269, + 320620315, + 685471733, + 587496836, + 852142971, + 1086792851, + 1017036298, + 365543100, + 1126000580, + 2618297676, + 1288033470, + 3409855158, + 1501505948, + 4234509866, + 1607167915, + 987167468, + 1816402316, + 1246189591 + ]; + var W = new Array(160); + function Sha512() { + this.init(); + this._w = W; + Hash.call(this, 128, 112); + } + inherits(Sha512, Hash); + Sha512.prototype.init = function() { + this._ah = 1779033703; + this._bh = 3144134277; + this._ch = 1013904242; + this._dh = 2773480762; + this._eh = 1359893119; + this._fh = 2600822924; + this._gh = 528734635; + this._hh = 1541459225; + this._al = 4089235720; + this._bl = 2227873595; + this._cl = 4271175723; + this._dl = 1595750129; + this._el = 2917565137; + this._fl = 725511199; + this._gl = 4215389547; + this._hl = 327033209; + return this; + }; + function Ch(x, y, z) { + return z ^ x & (y ^ z); + } + function maj(x, y, z) { + return x & y | z & (x | y); + } + function sigma0(x, xl) { + return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25); + } + function sigma1(x, xl) { + return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23); + } + function Gamma0(x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ x >>> 7; + } + function Gamma0l(x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25); + } + function Gamma1(x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ x >>> 6; + } + function Gamma1l(x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26); + } + function getCarry(a, b) { + return a >>> 0 < b >>> 0 ? 1 : 0; + } + Sha512.prototype._update = function(M) { + var W2 = this._w; + var ah = this._ah | 0; + var bh = this._bh | 0; + var ch = this._ch | 0; + var dh2 = this._dh | 0; + var eh = this._eh | 0; + var fh = this._fh | 0; + var gh = this._gh | 0; + var hh = this._hh | 0; + var al = this._al | 0; + var bl = this._bl | 0; + var cl = this._cl | 0; + var dl = this._dl | 0; + var el = this._el | 0; + var fl = this._fl | 0; + var gl = this._gl | 0; + var hl = this._hl | 0; + for (var i = 0; i < 32; i += 2) { + W2[i] = M.readInt32BE(i * 4); + W2[i + 1] = M.readInt32BE(i * 4 + 4); + } + for (; i < 160; i += 2) { + var xh = W2[i - 15 * 2]; + var xl = W2[i - 15 * 2 + 1]; + var gamma0 = Gamma0(xh, xl); + var gamma0l = Gamma0l(xl, xh); + xh = W2[i - 2 * 2]; + xl = W2[i - 2 * 2 + 1]; + var gamma1 = Gamma1(xh, xl); + var gamma1l = Gamma1l(xl, xh); + var Wi7h = W2[i - 7 * 2]; + var Wi7l = W2[i - 7 * 2 + 1]; + var Wi16h = W2[i - 16 * 2]; + var Wi16l = W2[i - 16 * 2 + 1]; + var Wil = gamma0l + Wi7l | 0; + var Wih = gamma0 + Wi7h + getCarry(Wil, gamma0l) | 0; + Wil = Wil + gamma1l | 0; + Wih = Wih + gamma1 + getCarry(Wil, gamma1l) | 0; + Wil = Wil + Wi16l | 0; + Wih = Wih + Wi16h + getCarry(Wil, Wi16l) | 0; + W2[i] = Wih; + W2[i + 1] = Wil; + } + for (var j = 0; j < 160; j += 2) { + Wih = W2[j]; + Wil = W2[j + 1]; + var majh = maj(ah, bh, ch); + var majl = maj(al, bl, cl); + var sigma0h = sigma0(ah, al); + var sigma0l = sigma0(al, ah); + var sigma1h = sigma1(eh, el); + var sigma1l = sigma1(el, eh); + var Kih = K[j]; + var Kil = K[j + 1]; + var chh = Ch(eh, fh, gh); + var chl = Ch(el, fl, gl); + var t1l = hl + sigma1l | 0; + var t1h = hh + sigma1h + getCarry(t1l, hl) | 0; + t1l = t1l + chl | 0; + t1h = t1h + chh + getCarry(t1l, chl) | 0; + t1l = t1l + Kil | 0; + t1h = t1h + Kih + getCarry(t1l, Kil) | 0; + t1l = t1l + Wil | 0; + t1h = t1h + Wih + getCarry(t1l, Wil) | 0; + var t2l = sigma0l + majl | 0; + var t2h = sigma0h + majh + getCarry(t2l, sigma0l) | 0; + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = dl + t1l | 0; + eh = dh2 + t1h + getCarry(el, dl) | 0; + dh2 = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = t1l + t2l | 0; + ah = t1h + t2h + getCarry(al, t1l) | 0; + } + this._al = this._al + al | 0; + this._bl = this._bl + bl | 0; + this._cl = this._cl + cl | 0; + this._dl = this._dl + dl | 0; + this._el = this._el + el | 0; + this._fl = this._fl + fl | 0; + this._gl = this._gl + gl | 0; + this._hl = this._hl + hl | 0; + this._ah = this._ah + ah + getCarry(this._al, al) | 0; + this._bh = this._bh + bh + getCarry(this._bl, bl) | 0; + this._ch = this._ch + ch + getCarry(this._cl, cl) | 0; + this._dh = this._dh + dh2 + getCarry(this._dl, dl) | 0; + this._eh = this._eh + eh + getCarry(this._el, el) | 0; + this._fh = this._fh + fh + getCarry(this._fl, fl) | 0; + this._gh = this._gh + gh + getCarry(this._gl, gl) | 0; + this._hh = this._hh + hh + getCarry(this._hl, hl) | 0; + }; + Sha512.prototype._hash = function() { + var H = Buffer2.allocUnsafe(64); + function writeInt64BE(h, l, offset2) { + H.writeInt32BE(h, offset2); + H.writeInt32BE(l, offset2 + 4); + } + writeInt64BE(this._ah, this._al, 0); + writeInt64BE(this._bh, this._bl, 8); + writeInt64BE(this._ch, this._cl, 16); + writeInt64BE(this._dh, this._dl, 24); + writeInt64BE(this._eh, this._el, 32); + writeInt64BE(this._fh, this._fl, 40); + writeInt64BE(this._gh, this._gl, 48); + writeInt64BE(this._hh, this._hl, 56); + return H; + }; + sha512$1 = Sha512; + return sha512$1; +} +var sha384$1; +var hasRequiredSha384; +function requireSha384() { + if (hasRequiredSha384) return sha384$1; + hasRequiredSha384 = 1; + var inherits = requireInherits_browser$1(); + var SHA512 = requireSha512(); + var Hash = requireHash$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var W = new Array(160); + function Sha384() { + this.init(); + this._w = W; + Hash.call(this, 128, 112); + } + inherits(Sha384, SHA512); + Sha384.prototype.init = function() { + this._ah = 3418070365; + this._bh = 1654270250; + this._ch = 2438529370; + this._dh = 355462360; + this._eh = 1731405415; + this._fh = 2394180231; + this._gh = 3675008525; + this._hh = 1203062813; + this._al = 3238371032; + this._bl = 914150663; + this._cl = 812702999; + this._dl = 4144912697; + this._el = 4290775857; + this._fl = 1750603025; + this._gl = 1694076839; + this._hl = 3204075428; + return this; + }; + Sha384.prototype._hash = function() { + var H = Buffer2.allocUnsafe(48); + function writeInt64BE(h, l, offset2) { + H.writeInt32BE(h, offset2); + H.writeInt32BE(l, offset2 + 4); + } + writeInt64BE(this._ah, this._al, 0); + writeInt64BE(this._bh, this._bl, 8); + writeInt64BE(this._ch, this._cl, 16); + writeInt64BE(this._dh, this._dl, 24); + writeInt64BE(this._eh, this._el, 32); + writeInt64BE(this._fh, this._fl, 40); + return H; + }; + sha384$1 = Sha384; + return sha384$1; +} +var hasRequiredSha_js; +function requireSha_js() { + if (hasRequiredSha_js) return sha_js.exports; + hasRequiredSha_js = 1; + var exports = sha_js.exports = function SHA(algorithm) { + algorithm = algorithm.toLowerCase(); + var Algorithm = exports[algorithm]; + if (!Algorithm) throw new Error(algorithm + " is not supported (we accept pull requests)"); + return new Algorithm(); + }; + exports.sha = requireSha$1(); + exports.sha1 = requireSha1(); + exports.sha224 = requireSha224(); + exports.sha256 = requireSha256(); + exports.sha384 = requireSha384(); + exports.sha512 = requireSha512(); + return sha_js.exports; +} +var cipherBase; +var hasRequiredCipherBase; +function requireCipherBase() { + if (hasRequiredCipherBase) return cipherBase; + hasRequiredCipherBase = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var Transform = requireBrowser$h().Transform; + var StringDecoder = requireString_decoder().StringDecoder; + var inherits = requireInherits_browser$1(); + function CipherBase(hashMode) { + Transform.call(this); + this.hashMode = typeof hashMode === "string"; + if (this.hashMode) { + this[hashMode] = this._finalOrDigest; + } else { + this.final = this._finalOrDigest; + } + if (this._final) { + this.__final = this._final; + this._final = null; + } + this._decoder = null; + this._encoding = null; + } + inherits(CipherBase, Transform); + CipherBase.prototype.update = function(data2, inputEnc, outputEnc) { + if (typeof data2 === "string") { + data2 = Buffer2.from(data2, inputEnc); + } + var outData = this._update(data2); + if (this.hashMode) return this; + if (outputEnc) { + outData = this._toString(outData, outputEnc); + } + return outData; + }; + CipherBase.prototype.setAutoPadding = function() { + }; + CipherBase.prototype.getAuthTag = function() { + throw new Error("trying to get auth tag in unsupported state"); + }; + CipherBase.prototype.setAuthTag = function() { + throw new Error("trying to set auth tag in unsupported state"); + }; + CipherBase.prototype.setAAD = function() { + throw new Error("trying to set aad in unsupported state"); + }; + CipherBase.prototype._transform = function(data2, _, next) { + var err; + try { + if (this.hashMode) { + this._update(data2); + } else { + this.push(this._update(data2)); + } + } catch (e) { + err = e; + } finally { + next(err); + } + }; + CipherBase.prototype._flush = function(done) { + var err; + try { + this.push(this.__final()); + } catch (e) { + err = e; + } + done(err); + }; + CipherBase.prototype._finalOrDigest = function(outputEnc) { + var outData = this.__final() || Buffer2.alloc(0); + if (outputEnc) { + outData = this._toString(outData, outputEnc, true); + } + return outData; + }; + CipherBase.prototype._toString = function(value, enc, fin) { + if (!this._decoder) { + this._decoder = new StringDecoder(enc); + this._encoding = enc; + } + if (this._encoding !== enc) throw new Error("can't switch encodings"); + var out = this._decoder.write(value); + if (fin) { + out += this._decoder.end(); + } + return out; + }; + cipherBase = CipherBase; + return cipherBase; +} +var browser$c; +var hasRequiredBrowser$c; +function requireBrowser$c() { + if (hasRequiredBrowser$c) return browser$c; + hasRequiredBrowser$c = 1; + var inherits = requireInherits_browser$1(); + var MD5 = requireMd5_js(); + var RIPEMD160 = requireRipemd160(); + var sha2 = requireSha_js(); + var Base = requireCipherBase(); + function Hash(hash2) { + Base.call(this, "digest"); + this._hash = hash2; + } + inherits(Hash, Base); + Hash.prototype._update = function(data2) { + this._hash.update(data2); + }; + Hash.prototype._final = function() { + return this._hash.digest(); + }; + browser$c = function createHash(alg) { + alg = alg.toLowerCase(); + if (alg === "md5") return new MD5(); + if (alg === "rmd160" || alg === "ripemd160") return new RIPEMD160(); + return new Hash(sha2(alg)); + }; + return browser$c; +} +var legacy; +var hasRequiredLegacy; +function requireLegacy() { + if (hasRequiredLegacy) return legacy; + hasRequiredLegacy = 1; + var inherits = requireInherits_browser$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var Base = requireCipherBase(); + var ZEROS = Buffer2.alloc(128); + var blocksize = 64; + function Hmac(alg, key2) { + Base.call(this, "digest"); + if (typeof key2 === "string") { + key2 = Buffer2.from(key2); + } + this._alg = alg; + this._key = key2; + if (key2.length > blocksize) { + key2 = alg(key2); + } else if (key2.length < blocksize) { + key2 = Buffer2.concat([key2, ZEROS], blocksize); + } + var ipad = this._ipad = Buffer2.allocUnsafe(blocksize); + var opad = this._opad = Buffer2.allocUnsafe(blocksize); + for (var i = 0; i < blocksize; i++) { + ipad[i] = key2[i] ^ 54; + opad[i] = key2[i] ^ 92; + } + this._hash = [ipad]; + } + inherits(Hmac, Base); + Hmac.prototype._update = function(data2) { + this._hash.push(data2); + }; + Hmac.prototype._final = function() { + var h = this._alg(Buffer2.concat(this._hash)); + return this._alg(Buffer2.concat([this._opad, h])); + }; + legacy = Hmac; + return legacy; +} +var md5; +var hasRequiredMd5; +function requireMd5() { + if (hasRequiredMd5) return md5; + hasRequiredMd5 = 1; + var MD5 = requireMd5_js(); + md5 = function(buffer2) { + return new MD5().update(buffer2).digest(); + }; + return md5; +} +var browser$b; +var hasRequiredBrowser$b; +function requireBrowser$b() { + if (hasRequiredBrowser$b) return browser$b; + hasRequiredBrowser$b = 1; + var inherits = requireInherits_browser$1(); + var Legacy = requireLegacy(); + var Base = requireCipherBase(); + var Buffer2 = requireSafeBuffer().Buffer; + var md52 = requireMd5(); + var RIPEMD160 = requireRipemd160(); + var sha2 = requireSha_js(); + var ZEROS = Buffer2.alloc(128); + function Hmac(alg, key2) { + Base.call(this, "digest"); + if (typeof key2 === "string") { + key2 = Buffer2.from(key2); + } + var blocksize = alg === "sha512" || alg === "sha384" ? 128 : 64; + this._alg = alg; + this._key = key2; + if (key2.length > blocksize) { + var hash2 = alg === "rmd160" ? new RIPEMD160() : sha2(alg); + key2 = hash2.update(key2).digest(); + } else if (key2.length < blocksize) { + key2 = Buffer2.concat([key2, ZEROS], blocksize); + } + var ipad = this._ipad = Buffer2.allocUnsafe(blocksize); + var opad = this._opad = Buffer2.allocUnsafe(blocksize); + for (var i = 0; i < blocksize; i++) { + ipad[i] = key2[i] ^ 54; + opad[i] = key2[i] ^ 92; + } + this._hash = alg === "rmd160" ? new RIPEMD160() : sha2(alg); + this._hash.update(ipad); + } + inherits(Hmac, Base); + Hmac.prototype._update = function(data2) { + this._hash.update(data2); + }; + Hmac.prototype._final = function() { + var h = this._hash.digest(); + var hash2 = this._alg === "rmd160" ? new RIPEMD160() : sha2(this._alg); + return hash2.update(this._opad).update(h).digest(); + }; + browser$b = function createHmac(alg, key2) { + alg = alg.toLowerCase(); + if (alg === "rmd160" || alg === "ripemd160") { + return new Hmac("rmd160", key2); + } + if (alg === "md5") { + return new Legacy(md52, key2); + } + return new Hmac(alg, key2); + }; + return browser$b; +} +const sha224WithRSAEncryption = { "sign": "rsa", "hash": "sha224", "id": "302d300d06096086480165030402040500041c" }; +const sha256WithRSAEncryption = { "sign": "rsa", "hash": "sha256", "id": "3031300d060960864801650304020105000420" }; +const sha384WithRSAEncryption = { "sign": "rsa", "hash": "sha384", "id": "3041300d060960864801650304020205000430" }; +const sha512WithRSAEncryption = { "sign": "rsa", "hash": "sha512", "id": "3051300d060960864801650304020305000440" }; +const sha256 = { "sign": "ecdsa", "hash": "sha256", "id": "" }; +const sha224 = { "sign": "ecdsa", "hash": "sha224", "id": "" }; +const sha384 = { "sign": "ecdsa", "hash": "sha384", "id": "" }; +const sha512 = { "sign": "ecdsa", "hash": "sha512", "id": "" }; +const DSA = { "sign": "dsa", "hash": "sha1", "id": "" }; +const ripemd160WithRSA = { "sign": "rsa", "hash": "rmd160", "id": "3021300906052b2403020105000414" }; +const md5WithRSAEncryption = { "sign": "rsa", "hash": "md5", "id": "3020300c06082a864886f70d020505000410" }; +const require$$6 = { + sha224WithRSAEncryption, + "RSA-SHA224": { "sign": "ecdsa/rsa", "hash": "sha224", "id": "302d300d06096086480165030402040500041c" }, + sha256WithRSAEncryption, + "RSA-SHA256": { "sign": "ecdsa/rsa", "hash": "sha256", "id": "3031300d060960864801650304020105000420" }, + sha384WithRSAEncryption, + "RSA-SHA384": { "sign": "ecdsa/rsa", "hash": "sha384", "id": "3041300d060960864801650304020205000430" }, + sha512WithRSAEncryption, + "RSA-SHA512": { "sign": "ecdsa/rsa", "hash": "sha512", "id": "3051300d060960864801650304020305000440" }, + "RSA-SHA1": { "sign": "rsa", "hash": "sha1", "id": "3021300906052b0e03021a05000414" }, + "ecdsa-with-SHA1": { "sign": "ecdsa", "hash": "sha1", "id": "" }, + sha256, + sha224, + sha384, + sha512, + "DSA-SHA": { "sign": "dsa", "hash": "sha1", "id": "" }, + "DSA-SHA1": { "sign": "dsa", "hash": "sha1", "id": "" }, + DSA, + "DSA-WITH-SHA224": { "sign": "dsa", "hash": "sha224", "id": "" }, + "DSA-SHA224": { "sign": "dsa", "hash": "sha224", "id": "" }, + "DSA-WITH-SHA256": { "sign": "dsa", "hash": "sha256", "id": "" }, + "DSA-SHA256": { "sign": "dsa", "hash": "sha256", "id": "" }, + "DSA-WITH-SHA384": { "sign": "dsa", "hash": "sha384", "id": "" }, + "DSA-SHA384": { "sign": "dsa", "hash": "sha384", "id": "" }, + "DSA-WITH-SHA512": { "sign": "dsa", "hash": "sha512", "id": "" }, + "DSA-SHA512": { "sign": "dsa", "hash": "sha512", "id": "" }, + "DSA-RIPEMD160": { "sign": "dsa", "hash": "rmd160", "id": "" }, + ripemd160WithRSA, + "RSA-RIPEMD160": { "sign": "rsa", "hash": "rmd160", "id": "3021300906052b2403020105000414" }, + md5WithRSAEncryption, + "RSA-MD5": { "sign": "rsa", "hash": "md5", "id": "3020300c06082a864886f70d020505000410" } +}; +var algos; +var hasRequiredAlgos; +function requireAlgos() { + if (hasRequiredAlgos) return algos; + hasRequiredAlgos = 1; + algos = require$$6; + return algos; +} +var browser$a = {}; +var precondition; +var hasRequiredPrecondition; +function requirePrecondition() { + if (hasRequiredPrecondition) return precondition; + hasRequiredPrecondition = 1; + var MAX_ALLOC = Math.pow(2, 30) - 1; + precondition = function(iterations, keylen) { + if (typeof iterations !== "number") { + throw new TypeError("Iterations not a number"); + } + if (iterations < 0) { + throw new TypeError("Bad iterations"); + } + if (typeof keylen !== "number") { + throw new TypeError("Key length not a number"); + } + if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { + throw new TypeError("Bad key length"); + } + }; + return precondition; +} +var defaultEncoding_1; +var hasRequiredDefaultEncoding; +function requireDefaultEncoding() { + if (hasRequiredDefaultEncoding) return defaultEncoding_1; + hasRequiredDefaultEncoding = 1; + var defaultEncoding; + if (commonjsGlobal.process && commonjsGlobal.process.browser) { + defaultEncoding = "utf-8"; + } else if (commonjsGlobal.process && commonjsGlobal.process.version) { + var pVersionMajor = parseInt(process.version.split(".")[0].slice(1), 10); + defaultEncoding = pVersionMajor >= 6 ? "utf-8" : "binary"; + } else { + defaultEncoding = "utf-8"; + } + defaultEncoding_1 = defaultEncoding; + return defaultEncoding_1; +} +var toBuffer; +var hasRequiredToBuffer; +function requireToBuffer() { + if (hasRequiredToBuffer) return toBuffer; + hasRequiredToBuffer = 1; + var Buffer2 = requireSafeBuffer().Buffer; + toBuffer = function(thing, encoding2, name) { + if (Buffer2.isBuffer(thing)) { + return thing; + } else if (typeof thing === "string") { + return Buffer2.from(thing, encoding2); + } else if (ArrayBuffer.isView(thing)) { + return Buffer2.from(thing.buffer); + } else { + throw new TypeError(name + " must be a string, a Buffer, a typed array or a DataView"); + } + }; + return toBuffer; +} +var syncBrowser; +var hasRequiredSyncBrowser; +function requireSyncBrowser() { + if (hasRequiredSyncBrowser) return syncBrowser; + hasRequiredSyncBrowser = 1; + var md52 = requireMd5(); + var RIPEMD160 = requireRipemd160(); + var sha2 = requireSha_js(); + var Buffer2 = requireSafeBuffer().Buffer; + var checkParameters = requirePrecondition(); + var defaultEncoding = requireDefaultEncoding(); + var toBuffer2 = requireToBuffer(); + var ZEROS = Buffer2.alloc(128); + var sizes = { + md5: 16, + sha1: 20, + sha224: 28, + sha256: 32, + sha384: 48, + sha512: 64, + rmd160: 20, + ripemd160: 20 + }; + function Hmac(alg, key2, saltLen) { + var hash2 = getDigest(alg); + var blocksize = alg === "sha512" || alg === "sha384" ? 128 : 64; + if (key2.length > blocksize) { + key2 = hash2(key2); + } else if (key2.length < blocksize) { + key2 = Buffer2.concat([key2, ZEROS], blocksize); + } + var ipad = Buffer2.allocUnsafe(blocksize + sizes[alg]); + var opad = Buffer2.allocUnsafe(blocksize + sizes[alg]); + for (var i = 0; i < blocksize; i++) { + ipad[i] = key2[i] ^ 54; + opad[i] = key2[i] ^ 92; + } + var ipad1 = Buffer2.allocUnsafe(blocksize + saltLen + 4); + ipad.copy(ipad1, 0, 0, blocksize); + this.ipad1 = ipad1; + this.ipad2 = ipad; + this.opad = opad; + this.alg = alg; + this.blocksize = blocksize; + this.hash = hash2; + this.size = sizes[alg]; + } + Hmac.prototype.run = function(data2, ipad) { + data2.copy(ipad, this.blocksize); + var h = this.hash(ipad); + h.copy(this.opad, this.blocksize); + return this.hash(this.opad); + }; + function getDigest(alg) { + function shaFunc(data2) { + return sha2(alg).update(data2).digest(); + } + function rmd160Func(data2) { + return new RIPEMD160().update(data2).digest(); + } + if (alg === "rmd160" || alg === "ripemd160") return rmd160Func; + if (alg === "md5") return md52; + return shaFunc; + } + function pbkdf2(password, salt, iterations, keylen, digest) { + checkParameters(iterations, keylen); + password = toBuffer2(password, defaultEncoding, "Password"); + salt = toBuffer2(salt, defaultEncoding, "Salt"); + digest = digest || "sha1"; + var hmac2 = new Hmac(digest, password, salt.length); + var DK = Buffer2.allocUnsafe(keylen); + var block1 = Buffer2.allocUnsafe(salt.length + 4); + salt.copy(block1, 0, 0, salt.length); + var destPos = 0; + var hLen = sizes[digest]; + var l = Math.ceil(keylen / hLen); + for (var i = 1; i <= l; i++) { + block1.writeUInt32BE(i, salt.length); + var T = hmac2.run(block1, hmac2.ipad1); + var U = T; + for (var j = 1; j < iterations; j++) { + U = hmac2.run(U, hmac2.ipad2); + for (var k = 0; k < hLen; k++) T[k] ^= U[k]; + } + T.copy(DK, destPos); + destPos += hLen; + } + return DK; + } + syncBrowser = pbkdf2; + return syncBrowser; +} +var async; +var hasRequiredAsync; +function requireAsync() { + if (hasRequiredAsync) return async; + hasRequiredAsync = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var checkParameters = requirePrecondition(); + var defaultEncoding = requireDefaultEncoding(); + var sync = requireSyncBrowser(); + var toBuffer2 = requireToBuffer(); + var ZERO_BUF; + var subtle = commonjsGlobal.crypto && commonjsGlobal.crypto.subtle; + var toBrowser = { + sha: "SHA-1", + "sha-1": "SHA-1", + sha1: "SHA-1", + sha256: "SHA-256", + "sha-256": "SHA-256", + sha384: "SHA-384", + "sha-384": "SHA-384", + "sha-512": "SHA-512", + sha512: "SHA-512" + }; + var checks = []; + function checkNative(algo) { + if (commonjsGlobal.process && !commonjsGlobal.process.browser) { + return Promise.resolve(false); + } + if (!subtle || !subtle.importKey || !subtle.deriveBits) { + return Promise.resolve(false); + } + if (checks[algo] !== void 0) { + return checks[algo]; + } + ZERO_BUF = ZERO_BUF || Buffer2.alloc(8); + var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo).then(function() { + return true; + }).catch(function() { + return false; + }); + checks[algo] = prom; + return prom; + } + var nextTick; + function getNextTick() { + if (nextTick) { + return nextTick; + } + if (commonjsGlobal.process && commonjsGlobal.process.nextTick) { + nextTick = commonjsGlobal.process.nextTick; + } else if (commonjsGlobal.queueMicrotask) { + nextTick = commonjsGlobal.queueMicrotask; + } else if (commonjsGlobal.setImmediate) { + nextTick = commonjsGlobal.setImmediate; + } else { + nextTick = commonjsGlobal.setTimeout; + } + return nextTick; + } + function browserPbkdf2(password, salt, iterations, length, algo) { + return subtle.importKey( + "raw", + password, + { name: "PBKDF2" }, + false, + ["deriveBits"] + ).then(function(key2) { + return subtle.deriveBits({ + name: "PBKDF2", + salt, + iterations, + hash: { + name: algo + } + }, key2, length << 3); + }).then(function(res) { + return Buffer2.from(res); + }); + } + function resolvePromise(promise, callback) { + promise.then(function(out) { + getNextTick()(function() { + callback(null, out); + }); + }, function(e) { + getNextTick()(function() { + callback(e); + }); + }); + } + async = function(password, salt, iterations, keylen, digest, callback) { + if (typeof digest === "function") { + callback = digest; + digest = void 0; + } + digest = digest || "sha1"; + var algo = toBrowser[digest.toLowerCase()]; + if (!algo || typeof commonjsGlobal.Promise !== "function") { + getNextTick()(function() { + var out; + try { + out = sync(password, salt, iterations, keylen, digest); + } catch (e) { + return callback(e); + } + callback(null, out); + }); + return; + } + checkParameters(iterations, keylen); + password = toBuffer2(password, defaultEncoding, "Password"); + salt = toBuffer2(salt, defaultEncoding, "Salt"); + if (typeof callback !== "function") throw new Error("No callback provided to pbkdf2"); + resolvePromise(checkNative(algo).then(function(resp) { + if (resp) return browserPbkdf2(password, salt, iterations, keylen, algo); + return sync(password, salt, iterations, keylen, digest); + }), callback); + }; + return async; +} +var hasRequiredBrowser$a; +function requireBrowser$a() { + if (hasRequiredBrowser$a) return browser$a; + hasRequiredBrowser$a = 1; + browser$a.pbkdf2 = requireAsync(); + browser$a.pbkdf2Sync = requireSyncBrowser(); + return browser$a; +} +var browser$9 = {}; +var des$1 = {}; +var utils$4 = {}; +var hasRequiredUtils$4; +function requireUtils$4() { + if (hasRequiredUtils$4) return utils$4; + hasRequiredUtils$4 = 1; + utils$4.readUInt32BE = function readUInt32BE(bytes, off) { + var res = bytes[0 + off] << 24 | bytes[1 + off] << 16 | bytes[2 + off] << 8 | bytes[3 + off]; + return res >>> 0; + }; + utils$4.writeUInt32BE = function writeUInt32BE(bytes, value, off) { + bytes[0 + off] = value >>> 24; + bytes[1 + off] = value >>> 16 & 255; + bytes[2 + off] = value >>> 8 & 255; + bytes[3 + off] = value & 255; + }; + utils$4.ip = function ip(inL, inR, out, off) { + var outL = 0; + var outR = 0; + for (var i = 6; i >= 0; i -= 2) { + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= inR >>> j + i & 1; + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= inL >>> j + i & 1; + } + } + for (var i = 6; i >= 0; i -= 2) { + for (var j = 1; j <= 25; j += 8) { + outR <<= 1; + outR |= inR >>> j + i & 1; + } + for (var j = 1; j <= 25; j += 8) { + outR <<= 1; + outR |= inL >>> j + i & 1; + } + } + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; + }; + utils$4.rip = function rip(inL, inR, out, off) { + var outL = 0; + var outR = 0; + for (var i = 0; i < 4; i++) { + for (var j = 24; j >= 0; j -= 8) { + outL <<= 1; + outL |= inR >>> j + i & 1; + outL <<= 1; + outL |= inL >>> j + i & 1; + } + } + for (var i = 4; i < 8; i++) { + for (var j = 24; j >= 0; j -= 8) { + outR <<= 1; + outR |= inR >>> j + i & 1; + outR <<= 1; + outR |= inL >>> j + i & 1; + } + } + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; + }; + utils$4.pc1 = function pc1(inL, inR, out, off) { + var outL = 0; + var outR = 0; + for (var i = 7; i >= 5; i--) { + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= inR >> j + i & 1; + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= inL >> j + i & 1; + } + } + for (var j = 0; j <= 24; j += 8) { + outL <<= 1; + outL |= inR >> j + i & 1; + } + for (var i = 1; i <= 3; i++) { + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= inR >> j + i & 1; + } + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= inL >> j + i & 1; + } + } + for (var j = 0; j <= 24; j += 8) { + outR <<= 1; + outR |= inL >> j + i & 1; + } + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; + }; + utils$4.r28shl = function r28shl(num, shift) { + return num << shift & 268435455 | num >>> 28 - shift; + }; + var pc2table = [ + // inL => outL + 14, + 11, + 17, + 4, + 27, + 23, + 25, + 0, + 13, + 22, + 7, + 18, + 5, + 9, + 16, + 24, + 2, + 20, + 12, + 21, + 1, + 8, + 15, + 26, + // inR => outR + 15, + 4, + 25, + 19, + 9, + 1, + 26, + 16, + 5, + 11, + 23, + 8, + 12, + 7, + 17, + 0, + 22, + 3, + 10, + 14, + 6, + 20, + 27, + 24 + ]; + utils$4.pc2 = function pc2(inL, inR, out, off) { + var outL = 0; + var outR = 0; + var len = pc2table.length >>> 1; + for (var i = 0; i < len; i++) { + outL <<= 1; + outL |= inL >>> pc2table[i] & 1; + } + for (var i = len; i < pc2table.length; i++) { + outR <<= 1; + outR |= inR >>> pc2table[i] & 1; + } + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; + }; + utils$4.expand = function expand(r, out, off) { + var outL = 0; + var outR = 0; + outL = (r & 1) << 5 | r >>> 27; + for (var i = 23; i >= 15; i -= 4) { + outL <<= 6; + outL |= r >>> i & 63; + } + for (var i = 11; i >= 3; i -= 4) { + outR |= r >>> i & 63; + outR <<= 6; + } + outR |= (r & 31) << 1 | r >>> 31; + out[off + 0] = outL >>> 0; + out[off + 1] = outR >>> 0; + }; + var sTable = [ + 14, + 0, + 4, + 15, + 13, + 7, + 1, + 4, + 2, + 14, + 15, + 2, + 11, + 13, + 8, + 1, + 3, + 10, + 10, + 6, + 6, + 12, + 12, + 11, + 5, + 9, + 9, + 5, + 0, + 3, + 7, + 8, + 4, + 15, + 1, + 12, + 14, + 8, + 8, + 2, + 13, + 4, + 6, + 9, + 2, + 1, + 11, + 7, + 15, + 5, + 12, + 11, + 9, + 3, + 7, + 14, + 3, + 10, + 10, + 0, + 5, + 6, + 0, + 13, + 15, + 3, + 1, + 13, + 8, + 4, + 14, + 7, + 6, + 15, + 11, + 2, + 3, + 8, + 4, + 14, + 9, + 12, + 7, + 0, + 2, + 1, + 13, + 10, + 12, + 6, + 0, + 9, + 5, + 11, + 10, + 5, + 0, + 13, + 14, + 8, + 7, + 10, + 11, + 1, + 10, + 3, + 4, + 15, + 13, + 4, + 1, + 2, + 5, + 11, + 8, + 6, + 12, + 7, + 6, + 12, + 9, + 0, + 3, + 5, + 2, + 14, + 15, + 9, + 10, + 13, + 0, + 7, + 9, + 0, + 14, + 9, + 6, + 3, + 3, + 4, + 15, + 6, + 5, + 10, + 1, + 2, + 13, + 8, + 12, + 5, + 7, + 14, + 11, + 12, + 4, + 11, + 2, + 15, + 8, + 1, + 13, + 1, + 6, + 10, + 4, + 13, + 9, + 0, + 8, + 6, + 15, + 9, + 3, + 8, + 0, + 7, + 11, + 4, + 1, + 15, + 2, + 14, + 12, + 3, + 5, + 11, + 10, + 5, + 14, + 2, + 7, + 12, + 7, + 13, + 13, + 8, + 14, + 11, + 3, + 5, + 0, + 6, + 6, + 15, + 9, + 0, + 10, + 3, + 1, + 4, + 2, + 7, + 8, + 2, + 5, + 12, + 11, + 1, + 12, + 10, + 4, + 14, + 15, + 9, + 10, + 3, + 6, + 15, + 9, + 0, + 0, + 6, + 12, + 10, + 11, + 1, + 7, + 13, + 13, + 8, + 15, + 9, + 1, + 4, + 3, + 5, + 14, + 11, + 5, + 12, + 2, + 7, + 8, + 2, + 4, + 14, + 2, + 14, + 12, + 11, + 4, + 2, + 1, + 12, + 7, + 4, + 10, + 7, + 11, + 13, + 6, + 1, + 8, + 5, + 5, + 0, + 3, + 15, + 15, + 10, + 13, + 3, + 0, + 9, + 14, + 8, + 9, + 6, + 4, + 11, + 2, + 8, + 1, + 12, + 11, + 7, + 10, + 1, + 13, + 14, + 7, + 2, + 8, + 13, + 15, + 6, + 9, + 15, + 12, + 0, + 5, + 9, + 6, + 10, + 3, + 4, + 0, + 5, + 14, + 3, + 12, + 10, + 1, + 15, + 10, + 4, + 15, + 2, + 9, + 7, + 2, + 12, + 6, + 9, + 8, + 5, + 0, + 6, + 13, + 1, + 3, + 13, + 4, + 14, + 14, + 0, + 7, + 11, + 5, + 3, + 11, + 8, + 9, + 4, + 14, + 3, + 15, + 2, + 5, + 12, + 2, + 9, + 8, + 5, + 12, + 15, + 3, + 10, + 7, + 11, + 0, + 14, + 4, + 1, + 10, + 7, + 1, + 6, + 13, + 0, + 11, + 8, + 6, + 13, + 4, + 13, + 11, + 0, + 2, + 11, + 14, + 7, + 15, + 4, + 0, + 9, + 8, + 1, + 13, + 10, + 3, + 14, + 12, + 3, + 9, + 5, + 7, + 12, + 5, + 2, + 10, + 15, + 6, + 8, + 1, + 6, + 1, + 6, + 4, + 11, + 11, + 13, + 13, + 8, + 12, + 1, + 3, + 4, + 7, + 10, + 14, + 7, + 10, + 9, + 15, + 5, + 6, + 0, + 8, + 15, + 0, + 14, + 5, + 2, + 9, + 3, + 2, + 12, + 13, + 1, + 2, + 15, + 8, + 13, + 4, + 8, + 6, + 10, + 15, + 3, + 11, + 7, + 1, + 4, + 10, + 12, + 9, + 5, + 3, + 6, + 14, + 11, + 5, + 0, + 0, + 14, + 12, + 9, + 7, + 2, + 7, + 2, + 11, + 1, + 4, + 14, + 1, + 7, + 9, + 4, + 12, + 10, + 14, + 8, + 2, + 13, + 0, + 15, + 6, + 12, + 10, + 9, + 13, + 0, + 15, + 3, + 3, + 5, + 5, + 6, + 8, + 11 + ]; + utils$4.substitute = function substitute(inL, inR) { + var out = 0; + for (var i = 0; i < 4; i++) { + var b = inL >>> 18 - i * 6 & 63; + var sb = sTable[i * 64 + b]; + out <<= 4; + out |= sb; + } + for (var i = 0; i < 4; i++) { + var b = inR >>> 18 - i * 6 & 63; + var sb = sTable[4 * 64 + i * 64 + b]; + out <<= 4; + out |= sb; + } + return out >>> 0; + }; + var permuteTable = [ + 16, + 25, + 12, + 11, + 3, + 20, + 4, + 15, + 31, + 17, + 9, + 6, + 27, + 14, + 1, + 22, + 30, + 24, + 8, + 18, + 0, + 5, + 29, + 23, + 13, + 19, + 2, + 26, + 10, + 21, + 28, + 7 + ]; + utils$4.permute = function permute(num) { + var out = 0; + for (var i = 0; i < permuteTable.length; i++) { + out <<= 1; + out |= num >>> permuteTable[i] & 1; + } + return out >>> 0; + }; + utils$4.padSplit = function padSplit(num, size, group) { + var str = num.toString(2); + while (str.length < size) + str = "0" + str; + var out = []; + for (var i = 0; i < size; i += group) + out.push(str.slice(i, i + group)); + return out.join(" "); + }; + return utils$4; +} +var minimalisticAssert; +var hasRequiredMinimalisticAssert; +function requireMinimalisticAssert() { + if (hasRequiredMinimalisticAssert) return minimalisticAssert; + hasRequiredMinimalisticAssert = 1; + minimalisticAssert = assert2; + function assert2(val, msg) { + if (!val) + throw new Error(msg || "Assertion failed"); + } + assert2.equal = function assertEqual(l, r, msg) { + if (l != r) + throw new Error(msg || "Assertion failed: " + l + " != " + r); + }; + return minimalisticAssert; +} +var cipher; +var hasRequiredCipher; +function requireCipher() { + if (hasRequiredCipher) return cipher; + hasRequiredCipher = 1; + var assert2 = requireMinimalisticAssert(); + function Cipher(options2) { + this.options = options2; + this.type = this.options.type; + this.blockSize = 8; + this._init(); + this.buffer = new Array(this.blockSize); + this.bufferOff = 0; + this.padding = options2.padding !== false; + } + cipher = Cipher; + Cipher.prototype._init = function _init() { + }; + Cipher.prototype.update = function update(data2) { + if (data2.length === 0) + return []; + if (this.type === "decrypt") + return this._updateDecrypt(data2); + else + return this._updateEncrypt(data2); + }; + Cipher.prototype._buffer = function _buffer(data2, off) { + var min2 = Math.min(this.buffer.length - this.bufferOff, data2.length - off); + for (var i = 0; i < min2; i++) + this.buffer[this.bufferOff + i] = data2[off + i]; + this.bufferOff += min2; + return min2; + }; + Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { + this._update(this.buffer, 0, out, off); + this.bufferOff = 0; + return this.blockSize; + }; + Cipher.prototype._updateEncrypt = function _updateEncrypt(data2) { + var inputOff = 0; + var outputOff = 0; + var count = (this.bufferOff + data2.length) / this.blockSize | 0; + var out = new Array(count * this.blockSize); + if (this.bufferOff !== 0) { + inputOff += this._buffer(data2, inputOff); + if (this.bufferOff === this.buffer.length) + outputOff += this._flushBuffer(out, outputOff); + } + var max2 = data2.length - (data2.length - inputOff) % this.blockSize; + for (; inputOff < max2; inputOff += this.blockSize) { + this._update(data2, inputOff, out, outputOff); + outputOff += this.blockSize; + } + for (; inputOff < data2.length; inputOff++, this.bufferOff++) + this.buffer[this.bufferOff] = data2[inputOff]; + return out; + }; + Cipher.prototype._updateDecrypt = function _updateDecrypt(data2) { + var inputOff = 0; + var outputOff = 0; + var count = Math.ceil((this.bufferOff + data2.length) / this.blockSize) - 1; + var out = new Array(count * this.blockSize); + for (; count > 0; count--) { + inputOff += this._buffer(data2, inputOff); + outputOff += this._flushBuffer(out, outputOff); + } + inputOff += this._buffer(data2, inputOff); + return out; + }; + Cipher.prototype.final = function final(buffer2) { + var first; + if (buffer2) + first = this.update(buffer2); + var last; + if (this.type === "encrypt") + last = this._finalEncrypt(); + else + last = this._finalDecrypt(); + if (first) + return first.concat(last); + else + return last; + }; + Cipher.prototype._pad = function _pad(buffer2, off) { + if (off === 0) + return false; + while (off < buffer2.length) + buffer2[off++] = 0; + return true; + }; + Cipher.prototype._finalEncrypt = function _finalEncrypt() { + if (!this._pad(this.buffer, this.bufferOff)) + return []; + var out = new Array(this.blockSize); + this._update(this.buffer, 0, out, 0); + return out; + }; + Cipher.prototype._unpad = function _unpad(buffer2) { + return buffer2; + }; + Cipher.prototype._finalDecrypt = function _finalDecrypt() { + assert2.equal(this.bufferOff, this.blockSize, "Not enough data to decrypt"); + var out = new Array(this.blockSize); + this._flushBuffer(out, 0); + return this._unpad(out); + }; + return cipher; +} +var des; +var hasRequiredDes$1; +function requireDes$1() { + if (hasRequiredDes$1) return des; + hasRequiredDes$1 = 1; + var assert2 = requireMinimalisticAssert(); + var inherits = requireInherits_browser$1(); + var utils2 = requireUtils$4(); + var Cipher = requireCipher(); + function DESState() { + this.tmp = new Array(2); + this.keys = null; + } + function DES(options2) { + Cipher.call(this, options2); + var state2 = new DESState(); + this._desState = state2; + this.deriveKeys(state2, options2.key); + } + inherits(DES, Cipher); + des = DES; + DES.create = function create(options2) { + return new DES(options2); + }; + var shiftTable = [ + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 1 + ]; + DES.prototype.deriveKeys = function deriveKeys(state2, key2) { + state2.keys = new Array(16 * 2); + assert2.equal(key2.length, this.blockSize, "Invalid key length"); + var kL = utils2.readUInt32BE(key2, 0); + var kR = utils2.readUInt32BE(key2, 4); + utils2.pc1(kL, kR, state2.tmp, 0); + kL = state2.tmp[0]; + kR = state2.tmp[1]; + for (var i = 0; i < state2.keys.length; i += 2) { + var shift = shiftTable[i >>> 1]; + kL = utils2.r28shl(kL, shift); + kR = utils2.r28shl(kR, shift); + utils2.pc2(kL, kR, state2.keys, i); + } + }; + DES.prototype._update = function _update(inp, inOff, out, outOff) { + var state2 = this._desState; + var l = utils2.readUInt32BE(inp, inOff); + var r = utils2.readUInt32BE(inp, inOff + 4); + utils2.ip(l, r, state2.tmp, 0); + l = state2.tmp[0]; + r = state2.tmp[1]; + if (this.type === "encrypt") + this._encrypt(state2, l, r, state2.tmp, 0); + else + this._decrypt(state2, l, r, state2.tmp, 0); + l = state2.tmp[0]; + r = state2.tmp[1]; + utils2.writeUInt32BE(out, l, outOff); + utils2.writeUInt32BE(out, r, outOff + 4); + }; + DES.prototype._pad = function _pad(buffer2, off) { + if (this.padding === false) { + return false; + } + var value = buffer2.length - off; + for (var i = off; i < buffer2.length; i++) + buffer2[i] = value; + return true; + }; + DES.prototype._unpad = function _unpad(buffer2) { + if (this.padding === false) { + return buffer2; + } + var pad = buffer2[buffer2.length - 1]; + for (var i = buffer2.length - pad; i < buffer2.length; i++) + assert2.equal(buffer2[i], pad); + return buffer2.slice(0, buffer2.length - pad); + }; + DES.prototype._encrypt = function _encrypt(state2, lStart, rStart, out, off) { + var l = lStart; + var r = rStart; + for (var i = 0; i < state2.keys.length; i += 2) { + var keyL = state2.keys[i]; + var keyR = state2.keys[i + 1]; + utils2.expand(r, state2.tmp, 0); + keyL ^= state2.tmp[0]; + keyR ^= state2.tmp[1]; + var s = utils2.substitute(keyL, keyR); + var f = utils2.permute(s); + var t = r; + r = (l ^ f) >>> 0; + l = t; + } + utils2.rip(r, l, out, off); + }; + DES.prototype._decrypt = function _decrypt(state2, lStart, rStart, out, off) { + var l = rStart; + var r = lStart; + for (var i = state2.keys.length - 2; i >= 0; i -= 2) { + var keyL = state2.keys[i]; + var keyR = state2.keys[i + 1]; + utils2.expand(l, state2.tmp, 0); + keyL ^= state2.tmp[0]; + keyR ^= state2.tmp[1]; + var s = utils2.substitute(keyL, keyR); + var f = utils2.permute(s); + var t = l; + l = (r ^ f) >>> 0; + r = t; + } + utils2.rip(l, r, out, off); + }; + return des; +} +var cbc$1 = {}; +var hasRequiredCbc$1; +function requireCbc$1() { + if (hasRequiredCbc$1) return cbc$1; + hasRequiredCbc$1 = 1; + var assert2 = requireMinimalisticAssert(); + var inherits = requireInherits_browser$1(); + var proto = {}; + function CBCState(iv) { + assert2.equal(iv.length, 8, "Invalid IV length"); + this.iv = new Array(8); + for (var i = 0; i < this.iv.length; i++) + this.iv[i] = iv[i]; + } + function instantiate(Base) { + function CBC(options2) { + Base.call(this, options2); + this._cbcInit(); + } + inherits(CBC, Base); + var keys = Object.keys(proto); + for (var i = 0; i < keys.length; i++) { + var key2 = keys[i]; + CBC.prototype[key2] = proto[key2]; + } + CBC.create = function create(options2) { + return new CBC(options2); + }; + return CBC; + } + cbc$1.instantiate = instantiate; + proto._cbcInit = function _cbcInit() { + var state2 = new CBCState(this.options.iv); + this._cbcState = state2; + }; + proto._update = function _update(inp, inOff, out, outOff) { + var state2 = this._cbcState; + var superProto = this.constructor.super_.prototype; + var iv = state2.iv; + if (this.type === "encrypt") { + for (var i = 0; i < this.blockSize; i++) + iv[i] ^= inp[inOff + i]; + superProto._update.call(this, iv, 0, out, outOff); + for (var i = 0; i < this.blockSize; i++) + iv[i] = out[outOff + i]; + } else { + superProto._update.call(this, inp, inOff, out, outOff); + for (var i = 0; i < this.blockSize; i++) + out[outOff + i] ^= iv[i]; + for (var i = 0; i < this.blockSize; i++) + iv[i] = inp[inOff + i]; + } + }; + return cbc$1; +} +var ede; +var hasRequiredEde; +function requireEde() { + if (hasRequiredEde) return ede; + hasRequiredEde = 1; + var assert2 = requireMinimalisticAssert(); + var inherits = requireInherits_browser$1(); + var Cipher = requireCipher(); + var DES = requireDes$1(); + function EDEState(type2, key2) { + assert2.equal(key2.length, 24, "Invalid key length"); + var k1 = key2.slice(0, 8); + var k2 = key2.slice(8, 16); + var k3 = key2.slice(16, 24); + if (type2 === "encrypt") { + this.ciphers = [ + DES.create({ type: "encrypt", key: k1 }), + DES.create({ type: "decrypt", key: k2 }), + DES.create({ type: "encrypt", key: k3 }) + ]; + } else { + this.ciphers = [ + DES.create({ type: "decrypt", key: k3 }), + DES.create({ type: "encrypt", key: k2 }), + DES.create({ type: "decrypt", key: k1 }) + ]; + } + } + function EDE(options2) { + Cipher.call(this, options2); + var state2 = new EDEState(this.type, this.options.key); + this._edeState = state2; + } + inherits(EDE, Cipher); + ede = EDE; + EDE.create = function create(options2) { + return new EDE(options2); + }; + EDE.prototype._update = function _update(inp, inOff, out, outOff) { + var state2 = this._edeState; + state2.ciphers[0]._update(inp, inOff, out, outOff); + state2.ciphers[1]._update(out, outOff, out, outOff); + state2.ciphers[2]._update(out, outOff, out, outOff); + }; + EDE.prototype._pad = DES.prototype._pad; + EDE.prototype._unpad = DES.prototype._unpad; + return ede; +} +var hasRequiredDes; +function requireDes() { + if (hasRequiredDes) return des$1; + hasRequiredDes = 1; + des$1.utils = requireUtils$4(); + des$1.Cipher = requireCipher(); + des$1.DES = requireDes$1(); + des$1.CBC = requireCbc$1(); + des$1.EDE = requireEde(); + return des$1; +} +var browserifyDes; +var hasRequiredBrowserifyDes; +function requireBrowserifyDes() { + if (hasRequiredBrowserifyDes) return browserifyDes; + hasRequiredBrowserifyDes = 1; + var CipherBase = requireCipherBase(); + var des2 = requireDes(); + var inherits = requireInherits_browser$1(); + var Buffer2 = requireSafeBuffer().Buffer; + var modes2 = { + "des-ede3-cbc": des2.CBC.instantiate(des2.EDE), + "des-ede3": des2.EDE, + "des-ede-cbc": des2.CBC.instantiate(des2.EDE), + "des-ede": des2.EDE, + "des-cbc": des2.CBC.instantiate(des2.DES), + "des-ecb": des2.DES + }; + modes2.des = modes2["des-cbc"]; + modes2.des3 = modes2["des-ede3-cbc"]; + browserifyDes = DES; + inherits(DES, CipherBase); + function DES(opts) { + CipherBase.call(this); + var modeName = opts.mode.toLowerCase(); + var mode = modes2[modeName]; + var type2; + if (opts.decrypt) { + type2 = "decrypt"; + } else { + type2 = "encrypt"; + } + var key2 = opts.key; + if (!Buffer2.isBuffer(key2)) { + key2 = Buffer2.from(key2); + } + if (modeName === "des-ede" || modeName === "des-ede-cbc") { + key2 = Buffer2.concat([key2, key2.slice(0, 8)]); + } + var iv = opts.iv; + if (!Buffer2.isBuffer(iv)) { + iv = Buffer2.from(iv); + } + this._des = mode.create({ + key: key2, + iv, + type: type2 + }); + } + DES.prototype._update = function(data2) { + return Buffer2.from(this._des.update(data2)); + }; + DES.prototype._final = function() { + return Buffer2.from(this._des.final()); + }; + return browserifyDes; +} +var browser$8 = {}; +var encrypter = {}; +var ecb = {}; +var hasRequiredEcb; +function requireEcb() { + if (hasRequiredEcb) return ecb; + hasRequiredEcb = 1; + ecb.encrypt = function(self2, block) { + return self2._cipher.encryptBlock(block); + }; + ecb.decrypt = function(self2, block) { + return self2._cipher.decryptBlock(block); + }; + return ecb; +} +var cbc = {}; +var bufferXor; +var hasRequiredBufferXor; +function requireBufferXor() { + if (hasRequiredBufferXor) return bufferXor; + hasRequiredBufferXor = 1; + bufferXor = function xor2(a, b) { + var length = Math.min(a.length, b.length); + var buffer2 = new Buffer(length); + for (var i = 0; i < length; ++i) { + buffer2[i] = a[i] ^ b[i]; + } + return buffer2; + }; + return bufferXor; +} +var hasRequiredCbc; +function requireCbc() { + if (hasRequiredCbc) return cbc; + hasRequiredCbc = 1; + var xor2 = requireBufferXor(); + cbc.encrypt = function(self2, block) { + var data2 = xor2(block, self2._prev); + self2._prev = self2._cipher.encryptBlock(data2); + return self2._prev; + }; + cbc.decrypt = function(self2, block) { + var pad = self2._prev; + self2._prev = block; + var out = self2._cipher.decryptBlock(block); + return xor2(out, pad); + }; + return cbc; +} +var cfb = {}; +var hasRequiredCfb; +function requireCfb() { + if (hasRequiredCfb) return cfb; + hasRequiredCfb = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var xor2 = requireBufferXor(); + function encryptStart(self2, data2, decrypt) { + var len = data2.length; + var out = xor2(data2, self2._cache); + self2._cache = self2._cache.slice(len); + self2._prev = Buffer2.concat([self2._prev, decrypt ? data2 : out]); + return out; + } + cfb.encrypt = function(self2, data2, decrypt) { + var out = Buffer2.allocUnsafe(0); + var len; + while (data2.length) { + if (self2._cache.length === 0) { + self2._cache = self2._cipher.encryptBlock(self2._prev); + self2._prev = Buffer2.allocUnsafe(0); + } + if (self2._cache.length <= data2.length) { + len = self2._cache.length; + out = Buffer2.concat([out, encryptStart(self2, data2.slice(0, len), decrypt)]); + data2 = data2.slice(len); + } else { + out = Buffer2.concat([out, encryptStart(self2, data2, decrypt)]); + break; + } + } + return out; + }; + return cfb; +} +var cfb8 = {}; +var hasRequiredCfb8; +function requireCfb8() { + if (hasRequiredCfb8) return cfb8; + hasRequiredCfb8 = 1; + var Buffer2 = requireSafeBuffer().Buffer; + function encryptByte(self2, byteParam, decrypt) { + var pad = self2._cipher.encryptBlock(self2._prev); + var out = pad[0] ^ byteParam; + self2._prev = Buffer2.concat([ + self2._prev.slice(1), + Buffer2.from([decrypt ? byteParam : out]) + ]); + return out; + } + cfb8.encrypt = function(self2, chunk, decrypt) { + var len = chunk.length; + var out = Buffer2.allocUnsafe(len); + var i = -1; + while (++i < len) { + out[i] = encryptByte(self2, chunk[i], decrypt); + } + return out; + }; + return cfb8; +} +var cfb1 = {}; +var hasRequiredCfb1; +function requireCfb1() { + if (hasRequiredCfb1) return cfb1; + hasRequiredCfb1 = 1; + var Buffer2 = requireSafeBuffer().Buffer; + function encryptByte(self2, byteParam, decrypt) { + var pad; + var i = -1; + var len = 8; + var out = 0; + var bit, value; + while (++i < len) { + pad = self2._cipher.encryptBlock(self2._prev); + bit = byteParam & 1 << 7 - i ? 128 : 0; + value = pad[0] ^ bit; + out += (value & 128) >> i % 8; + self2._prev = shiftIn(self2._prev, decrypt ? bit : value); + } + return out; + } + function shiftIn(buffer2, value) { + var len = buffer2.length; + var i = -1; + var out = Buffer2.allocUnsafe(buffer2.length); + buffer2 = Buffer2.concat([buffer2, Buffer2.from([value])]); + while (++i < len) { + out[i] = buffer2[i] << 1 | buffer2[i + 1] >> 7; + } + return out; + } + cfb1.encrypt = function(self2, chunk, decrypt) { + var len = chunk.length; + var out = Buffer2.allocUnsafe(len); + var i = -1; + while (++i < len) { + out[i] = encryptByte(self2, chunk[i], decrypt); + } + return out; + }; + return cfb1; +} +var ofb = {}; +var hasRequiredOfb; +function requireOfb() { + if (hasRequiredOfb) return ofb; + hasRequiredOfb = 1; + var xor2 = requireBufferXor(); + function getBlock(self2) { + self2._prev = self2._cipher.encryptBlock(self2._prev); + return self2._prev; + } + ofb.encrypt = function(self2, chunk) { + while (self2._cache.length < chunk.length) { + self2._cache = Buffer.concat([self2._cache, getBlock(self2)]); + } + var pad = self2._cache.slice(0, chunk.length); + self2._cache = self2._cache.slice(chunk.length); + return xor2(chunk, pad); + }; + return ofb; +} +var ctr = {}; +var incr32_1; +var hasRequiredIncr32; +function requireIncr32() { + if (hasRequiredIncr32) return incr32_1; + hasRequiredIncr32 = 1; + function incr32(iv) { + var len = iv.length; + var item; + while (len--) { + item = iv.readUInt8(len); + if (item === 255) { + iv.writeUInt8(0, len); + } else { + item++; + iv.writeUInt8(item, len); + break; + } + } + } + incr32_1 = incr32; + return incr32_1; +} +var hasRequiredCtr; +function requireCtr() { + if (hasRequiredCtr) return ctr; + hasRequiredCtr = 1; + var xor2 = requireBufferXor(); + var Buffer2 = requireSafeBuffer().Buffer; + var incr32 = requireIncr32(); + function getBlock(self2) { + var out = self2._cipher.encryptBlockRaw(self2._prev); + incr32(self2._prev); + return out; + } + var blockSize = 16; + ctr.encrypt = function(self2, chunk) { + var chunkNum = Math.ceil(chunk.length / blockSize); + var start = self2._cache.length; + self2._cache = Buffer2.concat([ + self2._cache, + Buffer2.allocUnsafe(chunkNum * blockSize) + ]); + for (var i = 0; i < chunkNum; i++) { + var out = getBlock(self2); + var offset2 = start + i * blockSize; + self2._cache.writeUInt32BE(out[0], offset2 + 0); + self2._cache.writeUInt32BE(out[1], offset2 + 4); + self2._cache.writeUInt32BE(out[2], offset2 + 8); + self2._cache.writeUInt32BE(out[3], offset2 + 12); + } + var pad = self2._cache.slice(0, chunk.length); + self2._cache = self2._cache.slice(chunk.length); + return xor2(chunk, pad); + }; + return ctr; +} +const aes128 = { "cipher": "AES", "key": 128, "iv": 16, "mode": "CBC", "type": "block" }; +const aes192 = { "cipher": "AES", "key": 192, "iv": 16, "mode": "CBC", "type": "block" }; +const aes256 = { "cipher": "AES", "key": 256, "iv": 16, "mode": "CBC", "type": "block" }; +const require$$2 = { + "aes-128-ecb": { "cipher": "AES", "key": 128, "iv": 0, "mode": "ECB", "type": "block" }, + "aes-192-ecb": { "cipher": "AES", "key": 192, "iv": 0, "mode": "ECB", "type": "block" }, + "aes-256-ecb": { "cipher": "AES", "key": 256, "iv": 0, "mode": "ECB", "type": "block" }, + "aes-128-cbc": { "cipher": "AES", "key": 128, "iv": 16, "mode": "CBC", "type": "block" }, + "aes-192-cbc": { "cipher": "AES", "key": 192, "iv": 16, "mode": "CBC", "type": "block" }, + "aes-256-cbc": { "cipher": "AES", "key": 256, "iv": 16, "mode": "CBC", "type": "block" }, + aes128, + aes192, + aes256, + "aes-128-cfb": { "cipher": "AES", "key": 128, "iv": 16, "mode": "CFB", "type": "stream" }, + "aes-192-cfb": { "cipher": "AES", "key": 192, "iv": 16, "mode": "CFB", "type": "stream" }, + "aes-256-cfb": { "cipher": "AES", "key": 256, "iv": 16, "mode": "CFB", "type": "stream" }, + "aes-128-cfb8": { "cipher": "AES", "key": 128, "iv": 16, "mode": "CFB8", "type": "stream" }, + "aes-192-cfb8": { "cipher": "AES", "key": 192, "iv": 16, "mode": "CFB8", "type": "stream" }, + "aes-256-cfb8": { "cipher": "AES", "key": 256, "iv": 16, "mode": "CFB8", "type": "stream" }, + "aes-128-cfb1": { "cipher": "AES", "key": 128, "iv": 16, "mode": "CFB1", "type": "stream" }, + "aes-192-cfb1": { "cipher": "AES", "key": 192, "iv": 16, "mode": "CFB1", "type": "stream" }, + "aes-256-cfb1": { "cipher": "AES", "key": 256, "iv": 16, "mode": "CFB1", "type": "stream" }, + "aes-128-ofb": { "cipher": "AES", "key": 128, "iv": 16, "mode": "OFB", "type": "stream" }, + "aes-192-ofb": { "cipher": "AES", "key": 192, "iv": 16, "mode": "OFB", "type": "stream" }, + "aes-256-ofb": { "cipher": "AES", "key": 256, "iv": 16, "mode": "OFB", "type": "stream" }, + "aes-128-ctr": { "cipher": "AES", "key": 128, "iv": 16, "mode": "CTR", "type": "stream" }, + "aes-192-ctr": { "cipher": "AES", "key": 192, "iv": 16, "mode": "CTR", "type": "stream" }, + "aes-256-ctr": { "cipher": "AES", "key": 256, "iv": 16, "mode": "CTR", "type": "stream" }, + "aes-128-gcm": { "cipher": "AES", "key": 128, "iv": 12, "mode": "GCM", "type": "auth" }, + "aes-192-gcm": { "cipher": "AES", "key": 192, "iv": 12, "mode": "GCM", "type": "auth" }, + "aes-256-gcm": { "cipher": "AES", "key": 256, "iv": 12, "mode": "GCM", "type": "auth" } +}; +var modes_1; +var hasRequiredModes$1; +function requireModes$1() { + if (hasRequiredModes$1) return modes_1; + hasRequiredModes$1 = 1; + var modeModules = { + ECB: requireEcb(), + CBC: requireCbc(), + CFB: requireCfb(), + CFB8: requireCfb8(), + CFB1: requireCfb1(), + OFB: requireOfb(), + CTR: requireCtr(), + GCM: requireCtr() + }; + var modes2 = require$$2; + for (var key2 in modes2) { + modes2[key2].module = modeModules[modes2[key2].mode]; + } + modes_1 = modes2; + return modes_1; +} +var aes = {}; +var hasRequiredAes; +function requireAes() { + if (hasRequiredAes) return aes; + hasRequiredAes = 1; + var Buffer2 = requireSafeBuffer().Buffer; + function asUInt32Array(buf) { + if (!Buffer2.isBuffer(buf)) buf = Buffer2.from(buf); + var len = buf.length / 4 | 0; + var out = new Array(len); + for (var i = 0; i < len; i++) { + out[i] = buf.readUInt32BE(i * 4); + } + return out; + } + function scrubVec(v) { + for (var i = 0; i < v.length; v++) { + v[i] = 0; + } + } + function cryptBlock(M, keySchedule, SUB_MIX, SBOX, nRounds) { + var SUB_MIX0 = SUB_MIX[0]; + var SUB_MIX1 = SUB_MIX[1]; + var SUB_MIX2 = SUB_MIX[2]; + var SUB_MIX3 = SUB_MIX[3]; + var s0 = M[0] ^ keySchedule[0]; + var s1 = M[1] ^ keySchedule[1]; + var s2 = M[2] ^ keySchedule[2]; + var s3 = M[3] ^ keySchedule[3]; + var t0, t1, t2, t3; + var ksRow = 4; + for (var round2 = 1; round2 < nRounds; round2++) { + t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[s1 >>> 16 & 255] ^ SUB_MIX2[s2 >>> 8 & 255] ^ SUB_MIX3[s3 & 255] ^ keySchedule[ksRow++]; + t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[s2 >>> 16 & 255] ^ SUB_MIX2[s3 >>> 8 & 255] ^ SUB_MIX3[s0 & 255] ^ keySchedule[ksRow++]; + t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[s3 >>> 16 & 255] ^ SUB_MIX2[s0 >>> 8 & 255] ^ SUB_MIX3[s1 & 255] ^ keySchedule[ksRow++]; + t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[s0 >>> 16 & 255] ^ SUB_MIX2[s1 >>> 8 & 255] ^ SUB_MIX3[s2 & 255] ^ keySchedule[ksRow++]; + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + t0 = (SBOX[s0 >>> 24] << 24 | SBOX[s1 >>> 16 & 255] << 16 | SBOX[s2 >>> 8 & 255] << 8 | SBOX[s3 & 255]) ^ keySchedule[ksRow++]; + t1 = (SBOX[s1 >>> 24] << 24 | SBOX[s2 >>> 16 & 255] << 16 | SBOX[s3 >>> 8 & 255] << 8 | SBOX[s0 & 255]) ^ keySchedule[ksRow++]; + t2 = (SBOX[s2 >>> 24] << 24 | SBOX[s3 >>> 16 & 255] << 16 | SBOX[s0 >>> 8 & 255] << 8 | SBOX[s1 & 255]) ^ keySchedule[ksRow++]; + t3 = (SBOX[s3 >>> 24] << 24 | SBOX[s0 >>> 16 & 255] << 16 | SBOX[s1 >>> 8 & 255] << 8 | SBOX[s2 & 255]) ^ keySchedule[ksRow++]; + t0 = t0 >>> 0; + t1 = t1 >>> 0; + t2 = t2 >>> 0; + t3 = t3 >>> 0; + return [t0, t1, t2, t3]; + } + var RCON = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]; + var G = function() { + var d = new Array(256); + for (var j = 0; j < 256; j++) { + if (j < 128) { + d[j] = j << 1; + } else { + d[j] = j << 1 ^ 283; + } + } + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX = [[], [], [], []]; + var INV_SUB_MIX = [[], [], [], []]; + var x = 0; + var xi = 0; + for (var i = 0; i < 256; ++i) { + var sx = xi ^ xi << 1 ^ xi << 2 ^ xi << 3 ^ xi << 4; + sx = sx >>> 8 ^ sx & 255 ^ 99; + SBOX[x] = sx; + INV_SBOX[sx] = x; + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + var t = d[sx] * 257 ^ sx * 16843008; + SUB_MIX[0][x] = t << 24 | t >>> 8; + SUB_MIX[1][x] = t << 16 | t >>> 16; + SUB_MIX[2][x] = t << 8 | t >>> 24; + SUB_MIX[3][x] = t; + t = x8 * 16843009 ^ x4 * 65537 ^ x2 * 257 ^ x * 16843008; + INV_SUB_MIX[0][sx] = t << 24 | t >>> 8; + INV_SUB_MIX[1][sx] = t << 16 | t >>> 16; + INV_SUB_MIX[2][sx] = t << 8 | t >>> 24; + INV_SUB_MIX[3][sx] = t; + if (x === 0) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + return { + SBOX, + INV_SBOX, + SUB_MIX, + INV_SUB_MIX + }; + }(); + function AES(key2) { + this._key = asUInt32Array(key2); + this._reset(); + } + AES.blockSize = 4 * 4; + AES.keySize = 256 / 8; + AES.prototype.blockSize = AES.blockSize; + AES.prototype.keySize = AES.keySize; + AES.prototype._reset = function() { + var keyWords = this._key; + var keySize = keyWords.length; + var nRounds = keySize + 6; + var ksRows = (nRounds + 1) * 4; + var keySchedule = []; + for (var k = 0; k < keySize; k++) { + keySchedule[k] = keyWords[k]; + } + for (k = keySize; k < ksRows; k++) { + var t = keySchedule[k - 1]; + if (k % keySize === 0) { + t = t << 8 | t >>> 24; + t = G.SBOX[t >>> 24] << 24 | G.SBOX[t >>> 16 & 255] << 16 | G.SBOX[t >>> 8 & 255] << 8 | G.SBOX[t & 255]; + t ^= RCON[k / keySize | 0] << 24; + } else if (keySize > 6 && k % keySize === 4) { + t = G.SBOX[t >>> 24] << 24 | G.SBOX[t >>> 16 & 255] << 16 | G.SBOX[t >>> 8 & 255] << 8 | G.SBOX[t & 255]; + } + keySchedule[k] = keySchedule[k - keySize] ^ t; + } + var invKeySchedule = []; + for (var ik = 0; ik < ksRows; ik++) { + var ksR = ksRows - ik; + var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)]; + if (ik < 4 || ksR <= 4) { + invKeySchedule[ik] = tt; + } else { + invKeySchedule[ik] = G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^ G.INV_SUB_MIX[1][G.SBOX[tt >>> 16 & 255]] ^ G.INV_SUB_MIX[2][G.SBOX[tt >>> 8 & 255]] ^ G.INV_SUB_MIX[3][G.SBOX[tt & 255]]; + } + } + this._nRounds = nRounds; + this._keySchedule = keySchedule; + this._invKeySchedule = invKeySchedule; + }; + AES.prototype.encryptBlockRaw = function(M) { + M = asUInt32Array(M); + return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds); + }; + AES.prototype.encryptBlock = function(M) { + var out = this.encryptBlockRaw(M); + var buf = Buffer2.allocUnsafe(16); + buf.writeUInt32BE(out[0], 0); + buf.writeUInt32BE(out[1], 4); + buf.writeUInt32BE(out[2], 8); + buf.writeUInt32BE(out[3], 12); + return buf; + }; + AES.prototype.decryptBlock = function(M) { + M = asUInt32Array(M); + var m1 = M[1]; + M[1] = M[3]; + M[3] = m1; + var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds); + var buf = Buffer2.allocUnsafe(16); + buf.writeUInt32BE(out[0], 0); + buf.writeUInt32BE(out[3], 4); + buf.writeUInt32BE(out[2], 8); + buf.writeUInt32BE(out[1], 12); + return buf; + }; + AES.prototype.scrub = function() { + scrubVec(this._keySchedule); + scrubVec(this._invKeySchedule); + scrubVec(this._key); + }; + aes.AES = AES; + return aes; +} +var ghash; +var hasRequiredGhash; +function requireGhash() { + if (hasRequiredGhash) return ghash; + hasRequiredGhash = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var ZEROES = Buffer2.alloc(16, 0); + function toArray(buf) { + return [ + buf.readUInt32BE(0), + buf.readUInt32BE(4), + buf.readUInt32BE(8), + buf.readUInt32BE(12) + ]; + } + function fromArray(out) { + var buf = Buffer2.allocUnsafe(16); + buf.writeUInt32BE(out[0] >>> 0, 0); + buf.writeUInt32BE(out[1] >>> 0, 4); + buf.writeUInt32BE(out[2] >>> 0, 8); + buf.writeUInt32BE(out[3] >>> 0, 12); + return buf; + } + function GHASH(key2) { + this.h = key2; + this.state = Buffer2.alloc(16, 0); + this.cache = Buffer2.allocUnsafe(0); + } + GHASH.prototype.ghash = function(block) { + var i = -1; + while (++i < block.length) { + this.state[i] ^= block[i]; + } + this._multiply(); + }; + GHASH.prototype._multiply = function() { + var Vi = toArray(this.h); + var Zi = [0, 0, 0, 0]; + var j, xi, lsbVi; + var i = -1; + while (++i < 128) { + xi = (this.state[~~(i / 8)] & 1 << 7 - i % 8) !== 0; + if (xi) { + Zi[0] ^= Vi[0]; + Zi[1] ^= Vi[1]; + Zi[2] ^= Vi[2]; + Zi[3] ^= Vi[3]; + } + lsbVi = (Vi[3] & 1) !== 0; + for (j = 3; j > 0; j--) { + Vi[j] = Vi[j] >>> 1 | (Vi[j - 1] & 1) << 31; + } + Vi[0] = Vi[0] >>> 1; + if (lsbVi) { + Vi[0] = Vi[0] ^ 225 << 24; + } + } + this.state = fromArray(Zi); + }; + GHASH.prototype.update = function(buf) { + this.cache = Buffer2.concat([this.cache, buf]); + var chunk; + while (this.cache.length >= 16) { + chunk = this.cache.slice(0, 16); + this.cache = this.cache.slice(16); + this.ghash(chunk); + } + }; + GHASH.prototype.final = function(abl, bl) { + if (this.cache.length) { + this.ghash(Buffer2.concat([this.cache, ZEROES], 16)); + } + this.ghash(fromArray([0, abl, 0, bl])); + return this.state; + }; + ghash = GHASH; + return ghash; +} +var authCipher; +var hasRequiredAuthCipher; +function requireAuthCipher() { + if (hasRequiredAuthCipher) return authCipher; + hasRequiredAuthCipher = 1; + var aes2 = requireAes(); + var Buffer2 = requireSafeBuffer().Buffer; + var Transform = requireCipherBase(); + var inherits = requireInherits_browser$1(); + var GHASH = requireGhash(); + var xor2 = requireBufferXor(); + var incr32 = requireIncr32(); + function xorTest(a, b) { + var out = 0; + if (a.length !== b.length) out++; + var len = Math.min(a.length, b.length); + for (var i = 0; i < len; ++i) { + out += a[i] ^ b[i]; + } + return out; + } + function calcIv(self2, iv, ck) { + if (iv.length === 12) { + self2._finID = Buffer2.concat([iv, Buffer2.from([0, 0, 0, 1])]); + return Buffer2.concat([iv, Buffer2.from([0, 0, 0, 2])]); + } + var ghash2 = new GHASH(ck); + var len = iv.length; + var toPad = len % 16; + ghash2.update(iv); + if (toPad) { + toPad = 16 - toPad; + ghash2.update(Buffer2.alloc(toPad, 0)); + } + ghash2.update(Buffer2.alloc(8, 0)); + var ivBits = len * 8; + var tail = Buffer2.alloc(8); + tail.writeUIntBE(ivBits, 0, 8); + ghash2.update(tail); + self2._finID = ghash2.state; + var out = Buffer2.from(self2._finID); + incr32(out); + return out; + } + function StreamCipher(mode, key2, iv, decrypt) { + Transform.call(this); + var h = Buffer2.alloc(4, 0); + this._cipher = new aes2.AES(key2); + var ck = this._cipher.encryptBlock(h); + this._ghash = new GHASH(ck); + iv = calcIv(this, iv, ck); + this._prev = Buffer2.from(iv); + this._cache = Buffer2.allocUnsafe(0); + this._secCache = Buffer2.allocUnsafe(0); + this._decrypt = decrypt; + this._alen = 0; + this._len = 0; + this._mode = mode; + this._authTag = null; + this._called = false; + } + inherits(StreamCipher, Transform); + StreamCipher.prototype._update = function(chunk) { + if (!this._called && this._alen) { + var rump = 16 - this._alen % 16; + if (rump < 16) { + rump = Buffer2.alloc(rump, 0); + this._ghash.update(rump); + } + } + this._called = true; + var out = this._mode.encrypt(this, chunk); + if (this._decrypt) { + this._ghash.update(chunk); + } else { + this._ghash.update(out); + } + this._len += chunk.length; + return out; + }; + StreamCipher.prototype._final = function() { + if (this._decrypt && !this._authTag) throw new Error("Unsupported state or unable to authenticate data"); + var tag = xor2(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)); + if (this._decrypt && xorTest(tag, this._authTag)) throw new Error("Unsupported state or unable to authenticate data"); + this._authTag = tag; + this._cipher.scrub(); + }; + StreamCipher.prototype.getAuthTag = function getAuthTag() { + if (this._decrypt || !Buffer2.isBuffer(this._authTag)) throw new Error("Attempting to get auth tag in unsupported state"); + return this._authTag; + }; + StreamCipher.prototype.setAuthTag = function setAuthTag(tag) { + if (!this._decrypt) throw new Error("Attempting to set auth tag in unsupported state"); + this._authTag = tag; + }; + StreamCipher.prototype.setAAD = function setAAD(buf) { + if (this._called) throw new Error("Attempting to set AAD in unsupported state"); + this._ghash.update(buf); + this._alen += buf.length; + }; + authCipher = StreamCipher; + return authCipher; +} +var streamCipher; +var hasRequiredStreamCipher; +function requireStreamCipher() { + if (hasRequiredStreamCipher) return streamCipher; + hasRequiredStreamCipher = 1; + var aes2 = requireAes(); + var Buffer2 = requireSafeBuffer().Buffer; + var Transform = requireCipherBase(); + var inherits = requireInherits_browser$1(); + function StreamCipher(mode, key2, iv, decrypt) { + Transform.call(this); + this._cipher = new aes2.AES(key2); + this._prev = Buffer2.from(iv); + this._cache = Buffer2.allocUnsafe(0); + this._secCache = Buffer2.allocUnsafe(0); + this._decrypt = decrypt; + this._mode = mode; + } + inherits(StreamCipher, Transform); + StreamCipher.prototype._update = function(chunk) { + return this._mode.encrypt(this, chunk, this._decrypt); + }; + StreamCipher.prototype._final = function() { + this._cipher.scrub(); + }; + streamCipher = StreamCipher; + return streamCipher; +} +var evp_bytestokey; +var hasRequiredEvp_bytestokey; +function requireEvp_bytestokey() { + if (hasRequiredEvp_bytestokey) return evp_bytestokey; + hasRequiredEvp_bytestokey = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var MD5 = requireMd5_js(); + function EVP_BytesToKey(password, salt, keyBits, ivLen) { + if (!Buffer2.isBuffer(password)) password = Buffer2.from(password, "binary"); + if (salt) { + if (!Buffer2.isBuffer(salt)) salt = Buffer2.from(salt, "binary"); + if (salt.length !== 8) throw new RangeError("salt should be Buffer with 8 byte length"); + } + var keyLen = keyBits / 8; + var key2 = Buffer2.alloc(keyLen); + var iv = Buffer2.alloc(ivLen || 0); + var tmp = Buffer2.alloc(0); + while (keyLen > 0 || ivLen > 0) { + var hash2 = new MD5(); + hash2.update(tmp); + hash2.update(password); + if (salt) hash2.update(salt); + tmp = hash2.digest(); + var used = 0; + if (keyLen > 0) { + var keyStart = key2.length - keyLen; + used = Math.min(keyLen, tmp.length); + tmp.copy(key2, keyStart, 0, used); + keyLen -= used; + } + if (used < tmp.length && ivLen > 0) { + var ivStart = iv.length - ivLen; + var length = Math.min(ivLen, tmp.length - used); + tmp.copy(iv, ivStart, used, used + length); + ivLen -= length; + } + } + tmp.fill(0); + return { key: key2, iv }; + } + evp_bytestokey = EVP_BytesToKey; + return evp_bytestokey; +} +var hasRequiredEncrypter; +function requireEncrypter() { + if (hasRequiredEncrypter) return encrypter; + hasRequiredEncrypter = 1; + var MODES = requireModes$1(); + var AuthCipher = requireAuthCipher(); + var Buffer2 = requireSafeBuffer().Buffer; + var StreamCipher = requireStreamCipher(); + var Transform = requireCipherBase(); + var aes2 = requireAes(); + var ebtk = requireEvp_bytestokey(); + var inherits = requireInherits_browser$1(); + function Cipher(mode, key2, iv) { + Transform.call(this); + this._cache = new Splitter(); + this._cipher = new aes2.AES(key2); + this._prev = Buffer2.from(iv); + this._mode = mode; + this._autopadding = true; + } + inherits(Cipher, Transform); + Cipher.prototype._update = function(data2) { + this._cache.add(data2); + var chunk; + var thing; + var out = []; + while (chunk = this._cache.get()) { + thing = this._mode.encrypt(this, chunk); + out.push(thing); + } + return Buffer2.concat(out); + }; + var PADDING = Buffer2.alloc(16, 16); + Cipher.prototype._final = function() { + var chunk = this._cache.flush(); + if (this._autopadding) { + chunk = this._mode.encrypt(this, chunk); + this._cipher.scrub(); + return chunk; + } + if (!chunk.equals(PADDING)) { + this._cipher.scrub(); + throw new Error("data not multiple of block length"); + } + }; + Cipher.prototype.setAutoPadding = function(setTo) { + this._autopadding = !!setTo; + return this; + }; + function Splitter() { + this.cache = Buffer2.allocUnsafe(0); + } + Splitter.prototype.add = function(data2) { + this.cache = Buffer2.concat([this.cache, data2]); + }; + Splitter.prototype.get = function() { + if (this.cache.length > 15) { + var out = this.cache.slice(0, 16); + this.cache = this.cache.slice(16); + return out; + } + return null; + }; + Splitter.prototype.flush = function() { + var len = 16 - this.cache.length; + var padBuff = Buffer2.allocUnsafe(len); + var i = -1; + while (++i < len) { + padBuff.writeUInt8(len, i); + } + return Buffer2.concat([this.cache, padBuff]); + }; + function createCipheriv(suite, password, iv) { + var config = MODES[suite.toLowerCase()]; + if (!config) throw new TypeError("invalid suite type"); + if (typeof password === "string") password = Buffer2.from(password); + if (password.length !== config.key / 8) throw new TypeError("invalid key length " + password.length); + if (typeof iv === "string") iv = Buffer2.from(iv); + if (config.mode !== "GCM" && iv.length !== config.iv) throw new TypeError("invalid iv length " + iv.length); + if (config.type === "stream") { + return new StreamCipher(config.module, password, iv); + } else if (config.type === "auth") { + return new AuthCipher(config.module, password, iv); + } + return new Cipher(config.module, password, iv); + } + function createCipher(suite, password) { + var config = MODES[suite.toLowerCase()]; + if (!config) throw new TypeError("invalid suite type"); + var keys = ebtk(password, false, config.key, config.iv); + return createCipheriv(suite, keys.key, keys.iv); + } + encrypter.createCipheriv = createCipheriv; + encrypter.createCipher = createCipher; + return encrypter; +} +var decrypter = {}; +var hasRequiredDecrypter; +function requireDecrypter() { + if (hasRequiredDecrypter) return decrypter; + hasRequiredDecrypter = 1; + var AuthCipher = requireAuthCipher(); + var Buffer2 = requireSafeBuffer().Buffer; + var MODES = requireModes$1(); + var StreamCipher = requireStreamCipher(); + var Transform = requireCipherBase(); + var aes2 = requireAes(); + var ebtk = requireEvp_bytestokey(); + var inherits = requireInherits_browser$1(); + function Decipher(mode, key2, iv) { + Transform.call(this); + this._cache = new Splitter(); + this._last = void 0; + this._cipher = new aes2.AES(key2); + this._prev = Buffer2.from(iv); + this._mode = mode; + this._autopadding = true; + } + inherits(Decipher, Transform); + Decipher.prototype._update = function(data2) { + this._cache.add(data2); + var chunk; + var thing; + var out = []; + while (chunk = this._cache.get(this._autopadding)) { + thing = this._mode.decrypt(this, chunk); + out.push(thing); + } + return Buffer2.concat(out); + }; + Decipher.prototype._final = function() { + var chunk = this._cache.flush(); + if (this._autopadding) { + return unpad(this._mode.decrypt(this, chunk)); + } else if (chunk) { + throw new Error("data not multiple of block length"); + } + }; + Decipher.prototype.setAutoPadding = function(setTo) { + this._autopadding = !!setTo; + return this; + }; + function Splitter() { + this.cache = Buffer2.allocUnsafe(0); + } + Splitter.prototype.add = function(data2) { + this.cache = Buffer2.concat([this.cache, data2]); + }; + Splitter.prototype.get = function(autoPadding) { + var out; + if (autoPadding) { + if (this.cache.length > 16) { + out = this.cache.slice(0, 16); + this.cache = this.cache.slice(16); + return out; + } + } else { + if (this.cache.length >= 16) { + out = this.cache.slice(0, 16); + this.cache = this.cache.slice(16); + return out; + } + } + return null; + }; + Splitter.prototype.flush = function() { + if (this.cache.length) return this.cache; + }; + function unpad(last) { + var padded = last[15]; + if (padded < 1 || padded > 16) { + throw new Error("unable to decrypt data"); + } + var i = -1; + while (++i < padded) { + if (last[i + (16 - padded)] !== padded) { + throw new Error("unable to decrypt data"); + } + } + if (padded === 16) return; + return last.slice(0, 16 - padded); + } + function createDecipheriv(suite, password, iv) { + var config = MODES[suite.toLowerCase()]; + if (!config) throw new TypeError("invalid suite type"); + if (typeof iv === "string") iv = Buffer2.from(iv); + if (config.mode !== "GCM" && iv.length !== config.iv) throw new TypeError("invalid iv length " + iv.length); + if (typeof password === "string") password = Buffer2.from(password); + if (password.length !== config.key / 8) throw new TypeError("invalid key length " + password.length); + if (config.type === "stream") { + return new StreamCipher(config.module, password, iv, true); + } else if (config.type === "auth") { + return new AuthCipher(config.module, password, iv, true); + } + return new Decipher(config.module, password, iv); + } + function createDecipher(suite, password) { + var config = MODES[suite.toLowerCase()]; + if (!config) throw new TypeError("invalid suite type"); + var keys = ebtk(password, false, config.key, config.iv); + return createDecipheriv(suite, keys.key, keys.iv); + } + decrypter.createDecipher = createDecipher; + decrypter.createDecipheriv = createDecipheriv; + return decrypter; +} +var hasRequiredBrowser$9; +function requireBrowser$9() { + if (hasRequiredBrowser$9) return browser$8; + hasRequiredBrowser$9 = 1; + var ciphers = requireEncrypter(); + var deciphers = requireDecrypter(); + var modes2 = require$$2; + function getCiphers() { + return Object.keys(modes2); + } + browser$8.createCipher = browser$8.Cipher = ciphers.createCipher; + browser$8.createCipheriv = browser$8.Cipheriv = ciphers.createCipheriv; + browser$8.createDecipher = browser$8.Decipher = deciphers.createDecipher; + browser$8.createDecipheriv = browser$8.Decipheriv = deciphers.createDecipheriv; + browser$8.listCiphers = browser$8.getCiphers = getCiphers; + return browser$8; +} +var modes = {}; +var hasRequiredModes; +function requireModes() { + if (hasRequiredModes) return modes; + hasRequiredModes = 1; + (function(exports) { + exports["des-ecb"] = { + key: 8, + iv: 0 + }; + exports["des-cbc"] = exports.des = { + key: 8, + iv: 8 + }; + exports["des-ede3-cbc"] = exports.des3 = { + key: 24, + iv: 8 + }; + exports["des-ede3"] = { + key: 24, + iv: 0 + }; + exports["des-ede-cbc"] = { + key: 16, + iv: 8 + }; + exports["des-ede"] = { + key: 16, + iv: 0 + }; + })(modes); + return modes; +} +var hasRequiredBrowser$8; +function requireBrowser$8() { + if (hasRequiredBrowser$8) return browser$9; + hasRequiredBrowser$8 = 1; + var DES = requireBrowserifyDes(); + var aes2 = requireBrowser$9(); + var aesModes = requireModes$1(); + var desModes = requireModes(); + var ebtk = requireEvp_bytestokey(); + function createCipher(suite, password) { + suite = suite.toLowerCase(); + var keyLen, ivLen; + if (aesModes[suite]) { + keyLen = aesModes[suite].key; + ivLen = aesModes[suite].iv; + } else if (desModes[suite]) { + keyLen = desModes[suite].key * 8; + ivLen = desModes[suite].iv; + } else { + throw new TypeError("invalid suite type"); + } + var keys = ebtk(password, false, keyLen, ivLen); + return createCipheriv(suite, keys.key, keys.iv); + } + function createDecipher(suite, password) { + suite = suite.toLowerCase(); + var keyLen, ivLen; + if (aesModes[suite]) { + keyLen = aesModes[suite].key; + ivLen = aesModes[suite].iv; + } else if (desModes[suite]) { + keyLen = desModes[suite].key * 8; + ivLen = desModes[suite].iv; + } else { + throw new TypeError("invalid suite type"); + } + var keys = ebtk(password, false, keyLen, ivLen); + return createDecipheriv(suite, keys.key, keys.iv); + } + function createCipheriv(suite, key2, iv) { + suite = suite.toLowerCase(); + if (aesModes[suite]) return aes2.createCipheriv(suite, key2, iv); + if (desModes[suite]) return new DES({ key: key2, iv, mode: suite }); + throw new TypeError("invalid suite type"); + } + function createDecipheriv(suite, key2, iv) { + suite = suite.toLowerCase(); + if (aesModes[suite]) return aes2.createDecipheriv(suite, key2, iv); + if (desModes[suite]) return new DES({ key: key2, iv, mode: suite, decrypt: true }); + throw new TypeError("invalid suite type"); + } + function getCiphers() { + return Object.keys(desModes).concat(aes2.getCiphers()); + } + browser$9.createCipher = browser$9.Cipher = createCipher; + browser$9.createCipheriv = browser$9.Cipheriv = createCipheriv; + browser$9.createDecipher = browser$9.Decipher = createDecipher; + browser$9.createDecipheriv = browser$9.Decipheriv = createDecipheriv; + browser$9.listCiphers = browser$9.getCiphers = getCiphers; + return browser$9; +} +var browser$7 = {}; +var bn$d = { exports: {} }; +var bn$c = bn$d.exports; +var hasRequiredBn$6; +function requireBn$6() { + if (hasRequiredBn$6) return bn$d.exports; + hasRequiredBn$6 = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + return c - 48 & 15; + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this.strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + r += c - 49 + 10; + } else if (c >= 17) { + r += c - 17 + 10; + } else { + r += c; + } + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this.strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype.strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + BN.prototype.inspect = function inspect() { + return (this.red ? ""; + }; + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16); + }; + BN.prototype.toBuffer = function toBuffer2(endian, length) { + assert2(typeof Buffer2 !== "undefined"); + return this.toArrayLike(Buffer2, endian, length); + }; + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + this.strip(); + var littleEndian = endian === "le"; + var res = new ArrayType(reqLength); + var b, i; + var q = this.clone(); + if (!littleEndian) { + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[i] = b; + } + for (; i < reqLength; i++) { + res[i] = 0; + } + } + return res; + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = (num.words[off] & 1 << wbit) >>> wbit; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this.strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this.strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this.strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this.strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this.strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this.strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out.strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out.strip(); + } + function jumboMulTo(self2, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + function FFTM(x, y) { + this.x = x; + this.y = y; + } + FFTM.prototype.makeRBT = function makeRBT(N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + return t; + }; + FFTM.prototype.revBin = function revBin(x, l, N) { + if (x === 0 || x === N - 1) return x; + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << l - i - 1; + x >>= 1; + } + return rb; + }; + FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + FFTM.prototype.transform = function transform2(rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + for (var j = 0; j < s; j++) { + var re2 = rtws[p + j]; + var ie = itws[p + j]; + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + var rx = rtwdf_ * ro - itwdf_ * io; + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + rtws[p + j] = re2 + ro; + itws[p + j] = ie + io; + rtws[p + j + s] = re2 - ro; + itws[p + j + s] = ie - io; + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + FFTM.prototype.guessLen13b = function guessLen13b(n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + return 1 << i + 1 + odd; + }; + FFTM.prototype.conjugate = function conjugate(rws, iws, N) { + if (N <= 1) return; + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + t = iws[i]; + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + FFTM.prototype.normalize13b = function normalize13b(ws2, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws2[2 * i + 1] / N) * 8192 + Math.round(ws2[2 * i] / N) + carry; + ws2[i] = w & 67108863; + if (w < 67108864) { + carry = 0; + } else { + carry = w / 67108864 | 0; + } + } + return ws2; + }; + FFTM.prototype.convert13b = function convert13b(ws2, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws2[i] | 0); + rws[2 * i] = carry & 8191; + carry = carry >>> 13; + rws[2 * i + 1] = carry & 8191; + carry = carry >>> 13; + } + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + assert2(carry === 0); + assert2((carry & -8192) === 0); + }; + FFTM.prototype.stub = function stub(N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + return ph; + }; + FFTM.prototype.mulp = function mulp(x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + var rbt = this.makeRBT(N); + var _ = this.stub(N); + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + var rmws = out.words; + rmws.length = N; + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this.strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this.strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this.strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this.strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this.strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this.strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modn = function modn(num) { + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return acc; + }; + BN.prototype.idivn = function idivn(num) { + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + return this.strip(); + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this.strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn$c); + })(bn$d); + return bn$d.exports; +} +var bn$b = { exports: {} }; +var bn$a = bn$b.exports; +var hasRequiredBn$5; +function requireBn$5() { + if (hasRequiredBn$5) return bn$b.exports; + hasRequiredBn$5 = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + return c - 48 & 15; + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this.strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + r += c - 49 + 10; + } else if (c >= 17) { + r += c - 17 + 10; + } else { + r += c; + } + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this.strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype.strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + BN.prototype.inspect = function inspect() { + return (this.red ? ""; + }; + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16); + }; + BN.prototype.toBuffer = function toBuffer2(endian, length) { + assert2(typeof Buffer2 !== "undefined"); + return this.toArrayLike(Buffer2, endian, length); + }; + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + this.strip(); + var littleEndian = endian === "le"; + var res = new ArrayType(reqLength); + var b, i; + var q = this.clone(); + if (!littleEndian) { + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[i] = b; + } + for (; i < reqLength; i++) { + res[i] = 0; + } + } + return res; + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = (num.words[off] & 1 << wbit) >>> wbit; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this.strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this.strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this.strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this.strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this.strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this.strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out.strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out.strip(); + } + function jumboMulTo(self2, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + function FFTM(x, y) { + this.x = x; + this.y = y; + } + FFTM.prototype.makeRBT = function makeRBT(N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + return t; + }; + FFTM.prototype.revBin = function revBin(x, l, N) { + if (x === 0 || x === N - 1) return x; + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << l - i - 1; + x >>= 1; + } + return rb; + }; + FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + FFTM.prototype.transform = function transform2(rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + for (var j = 0; j < s; j++) { + var re2 = rtws[p + j]; + var ie = itws[p + j]; + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + var rx = rtwdf_ * ro - itwdf_ * io; + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + rtws[p + j] = re2 + ro; + itws[p + j] = ie + io; + rtws[p + j + s] = re2 - ro; + itws[p + j + s] = ie - io; + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + FFTM.prototype.guessLen13b = function guessLen13b(n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + return 1 << i + 1 + odd; + }; + FFTM.prototype.conjugate = function conjugate(rws, iws, N) { + if (N <= 1) return; + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + t = iws[i]; + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + FFTM.prototype.normalize13b = function normalize13b(ws2, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws2[2 * i + 1] / N) * 8192 + Math.round(ws2[2 * i] / N) + carry; + ws2[i] = w & 67108863; + if (w < 67108864) { + carry = 0; + } else { + carry = w / 67108864 | 0; + } + } + return ws2; + }; + FFTM.prototype.convert13b = function convert13b(ws2, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws2[i] | 0); + rws[2 * i] = carry & 8191; + carry = carry >>> 13; + rws[2 * i + 1] = carry & 8191; + carry = carry >>> 13; + } + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + assert2(carry === 0); + assert2((carry & -8192) === 0); + }; + FFTM.prototype.stub = function stub(N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + return ph; + }; + FFTM.prototype.mulp = function mulp(x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + var rbt = this.makeRBT(N); + var _ = this.stub(N); + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + var rmws = out.words; + rmws.length = N; + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this.strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this.strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this.strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this.strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this.strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this.strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modn = function modn(num) { + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return acc; + }; + BN.prototype.idivn = function idivn(num) { + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + return this.strip(); + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this.strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn$a); + })(bn$b); + return bn$b.exports; +} +var brorand = { exports: {} }; +var hasRequiredBrorand; +function requireBrorand() { + if (hasRequiredBrorand) return brorand.exports; + hasRequiredBrorand = 1; + var r; + brorand.exports = function rand(len) { + if (!r) + r = new Rand(null); + return r.generate(len); + }; + function Rand(rand) { + this.rand = rand; + } + brorand.exports.Rand = Rand; + Rand.prototype.generate = function generate(len) { + return this._rand(len); + }; + Rand.prototype._rand = function _rand(n) { + if (this.rand.getBytes) + return this.rand.getBytes(n); + var res = new Uint8Array(n); + for (var i = 0; i < res.length; i++) + res[i] = this.rand.getByte(); + return res; + }; + if (typeof self === "object") { + if (self.crypto && self.crypto.getRandomValues) { + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.crypto.getRandomValues(arr); + return arr; + }; + } else if (self.msCrypto && self.msCrypto.getRandomValues) { + Rand.prototype._rand = function _rand(n) { + var arr = new Uint8Array(n); + self.msCrypto.getRandomValues(arr); + return arr; + }; + } else if (typeof window === "object") { + Rand.prototype._rand = function() { + throw new Error("Not implemented yet"); + }; + } + } else { + try { + var crypto2 = requireCryptoBrowserify(); + if (typeof crypto2.randomBytes !== "function") + throw new Error("Not supported"); + Rand.prototype._rand = function _rand(n) { + return crypto2.randomBytes(n); + }; + } catch (e) { + } + } + return brorand.exports; +} +var mr; +var hasRequiredMr; +function requireMr() { + if (hasRequiredMr) return mr; + hasRequiredMr = 1; + var bn2 = requireBn$5(); + var brorand2 = requireBrorand(); + function MillerRabin(rand) { + this.rand = rand || new brorand2.Rand(); + } + mr = MillerRabin; + MillerRabin.create = function create(rand) { + return new MillerRabin(rand); + }; + MillerRabin.prototype._randbelow = function _randbelow(n) { + var len = n.bitLength(); + var min_bytes = Math.ceil(len / 8); + do + var a = new bn2(this.rand.generate(min_bytes)); + while (a.cmp(n) >= 0); + return a; + }; + MillerRabin.prototype._randrange = function _randrange(start, stop) { + var size = stop.sub(start); + return start.add(this._randbelow(size)); + }; + MillerRabin.prototype.test = function test(n, k, cb) { + var len = n.bitLength(); + var red = bn2.mont(n); + var rone = new bn2(1).toRed(red); + if (!k) + k = Math.max(1, len / 48 | 0); + var n1 = n.subn(1); + for (var s = 0; !n1.testn(s); s++) { + } + var d = n.shrn(s); + var rn1 = n1.toRed(red); + var prime = true; + for (; k > 0; k--) { + var a = this._randrange(new bn2(2), n1); + if (cb) + cb(a); + var x = a.toRed(red).redPow(d); + if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) + continue; + for (var i = 1; i < s; i++) { + x = x.redSqr(); + if (x.cmp(rone) === 0) + return false; + if (x.cmp(rn1) === 0) + break; + } + if (i === s) + return false; + } + return prime; + }; + MillerRabin.prototype.getDivisor = function getDivisor(n, k) { + var len = n.bitLength(); + var red = bn2.mont(n); + var rone = new bn2(1).toRed(red); + if (!k) + k = Math.max(1, len / 48 | 0); + var n1 = n.subn(1); + for (var s = 0; !n1.testn(s); s++) { + } + var d = n.shrn(s); + var rn1 = n1.toRed(red); + for (; k > 0; k--) { + var a = this._randrange(new bn2(2), n1); + var g = n.gcd(a); + if (g.cmpn(1) !== 0) + return g; + var x = a.toRed(red).redPow(d); + if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) + continue; + for (var i = 1; i < s; i++) { + x = x.redSqr(); + if (x.cmp(rone) === 0) + return x.fromRed().subn(1).gcd(n); + if (x.cmp(rn1) === 0) + break; + } + if (i === s) { + x = x.redSqr(); + return x.fromRed().subn(1).gcd(n); + } + } + return false; + }; + return mr; +} +var generatePrime; +var hasRequiredGeneratePrime; +function requireGeneratePrime() { + if (hasRequiredGeneratePrime) return generatePrime; + hasRequiredGeneratePrime = 1; + var randomBytes = requireBrowser$e(); + generatePrime = findPrime; + findPrime.simpleSieve = simpleSieve; + findPrime.fermatTest = fermatTest; + var BN = requireBn$6(); + var TWENTYFOUR = new BN(24); + var MillerRabin = requireMr(); + var millerRabin = new MillerRabin(); + var ONE = new BN(1); + var TWO = new BN(2); + var FIVE = new BN(5); + new BN(16); + new BN(8); + var TEN = new BN(10); + var THREE = new BN(3); + new BN(7); + var ELEVEN = new BN(11); + var FOUR = new BN(4); + new BN(12); + var primes = null; + function _getPrimes() { + if (primes !== null) + return primes; + var limit = 1048576; + var res = []; + res[0] = 2; + for (var i = 1, k = 3; k < limit; k += 2) { + var sqrt = Math.ceil(Math.sqrt(k)); + for (var j = 0; j < i && res[j] <= sqrt; j++) + if (k % res[j] === 0) + break; + if (i !== j && res[j] <= sqrt) + continue; + res[i++] = k; + } + primes = res; + return res; + } + function simpleSieve(p) { + var primes2 = _getPrimes(); + for (var i = 0; i < primes2.length; i++) + if (p.modn(primes2[i]) === 0) { + if (p.cmpn(primes2[i]) === 0) { + return true; + } else { + return false; + } + } + return true; + } + function fermatTest(p) { + var red = BN.mont(p); + return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0; + } + function findPrime(bits, gen) { + if (bits < 16) { + if (gen === 2 || gen === 5) { + return new BN([140, 123]); + } else { + return new BN([140, 39]); + } + } + gen = new BN(gen); + var num, n2; + while (true) { + num = new BN(randomBytes(Math.ceil(bits / 8))); + while (num.bitLength() > bits) { + num.ishrn(1); + } + if (num.isEven()) { + num.iadd(ONE); + } + if (!num.testn(1)) { + num.iadd(TWO); + } + if (!gen.cmp(TWO)) { + while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { + num.iadd(FOUR); + } + } else if (!gen.cmp(FIVE)) { + while (num.mod(TEN).cmp(THREE)) { + num.iadd(FOUR); + } + } + n2 = num.shrn(1); + if (simpleSieve(n2) && simpleSieve(num) && fermatTest(n2) && fermatTest(num) && millerRabin.test(n2) && millerRabin.test(num)) { + return num; + } + } + } + return generatePrime; +} +const modp1 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" }; +const modp2 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" }; +const modp5 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" }; +const modp14 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" }; +const modp15 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" }; +const modp16 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" }; +const modp17 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" }; +const modp18 = { "gen": "02", "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" }; +const require$$1$4 = { + modp1, + modp2, + modp5, + modp14, + modp15, + modp16, + modp17, + modp18 +}; +var dh; +var hasRequiredDh; +function requireDh() { + if (hasRequiredDh) return dh; + hasRequiredDh = 1; + var BN = requireBn$6(); + var MillerRabin = requireMr(); + var millerRabin = new MillerRabin(); + var TWENTYFOUR = new BN(24); + var ELEVEN = new BN(11); + var TEN = new BN(10); + var THREE = new BN(3); + var SEVEN = new BN(7); + var primes = requireGeneratePrime(); + var randomBytes = requireBrowser$e(); + dh = DH; + function setPublicKey(pub, enc) { + enc = enc || "utf8"; + if (!Buffer.isBuffer(pub)) { + pub = new Buffer(pub, enc); + } + this._pub = new BN(pub); + return this; + } + function setPrivateKey(priv, enc) { + enc = enc || "utf8"; + if (!Buffer.isBuffer(priv)) { + priv = new Buffer(priv, enc); + } + this._priv = new BN(priv); + return this; + } + var primeCache = {}; + function checkPrime(prime, generator) { + var gen = generator.toString("hex"); + var hex = [gen, prime.toString(16)].join("_"); + if (hex in primeCache) { + return primeCache[hex]; + } + var error2 = 0; + if (prime.isEven() || !primes.simpleSieve || !primes.fermatTest(prime) || !millerRabin.test(prime)) { + error2 += 1; + if (gen === "02" || gen === "05") { + error2 += 8; + } else { + error2 += 4; + } + primeCache[hex] = error2; + return error2; + } + if (!millerRabin.test(prime.shrn(1))) { + error2 += 2; + } + var rem; + switch (gen) { + case "02": + if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { + error2 += 8; + } + break; + case "05": + rem = prime.mod(TEN); + if (rem.cmp(THREE) && rem.cmp(SEVEN)) { + error2 += 8; + } + break; + default: + error2 += 4; + } + primeCache[hex] = error2; + return error2; + } + function DH(prime, generator, malleable) { + this.setGenerator(generator); + this.__prime = new BN(prime); + this._prime = BN.mont(this.__prime); + this._primeLen = prime.length; + this._pub = void 0; + this._priv = void 0; + this._primeCode = void 0; + if (malleable) { + this.setPublicKey = setPublicKey; + this.setPrivateKey = setPrivateKey; + } else { + this._primeCode = 8; + } + } + Object.defineProperty(DH.prototype, "verifyError", { + enumerable: true, + get: function() { + if (typeof this._primeCode !== "number") { + this._primeCode = checkPrime(this.__prime, this.__gen); + } + return this._primeCode; + } + }); + DH.prototype.generateKeys = function() { + if (!this._priv) { + this._priv = new BN(randomBytes(this._primeLen)); + } + this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); + return this.getPublicKey(); + }; + DH.prototype.computeSecret = function(other2) { + other2 = new BN(other2); + other2 = other2.toRed(this._prime); + var secret = other2.redPow(this._priv).fromRed(); + var out = new Buffer(secret.toArray()); + var prime = this.getPrime(); + if (out.length < prime.length) { + var front = new Buffer(prime.length - out.length); + front.fill(0); + out = Buffer.concat([front, out]); + } + return out; + }; + DH.prototype.getPublicKey = function getPublicKey(enc) { + return formatReturnValue(this._pub, enc); + }; + DH.prototype.getPrivateKey = function getPrivateKey(enc) { + return formatReturnValue(this._priv, enc); + }; + DH.prototype.getPrime = function(enc) { + return formatReturnValue(this.__prime, enc); + }; + DH.prototype.getGenerator = function(enc) { + return formatReturnValue(this._gen, enc); + }; + DH.prototype.setGenerator = function(gen, enc) { + enc = enc || "utf8"; + if (!Buffer.isBuffer(gen)) { + gen = new Buffer(gen, enc); + } + this.__gen = gen; + this._gen = new BN(gen); + return this; + }; + function formatReturnValue(bn2, enc) { + var buf = new Buffer(bn2.toArray()); + if (!enc) { + return buf; + } else { + return buf.toString(enc); + } + } + return dh; +} +var hasRequiredBrowser$7; +function requireBrowser$7() { + if (hasRequiredBrowser$7) return browser$7; + hasRequiredBrowser$7 = 1; + var generatePrime2 = requireGeneratePrime(); + var primes = require$$1$4; + var DH = requireDh(); + function getDiffieHellman(mod) { + var prime = new Buffer(primes[mod].prime, "hex"); + var gen = new Buffer(primes[mod].gen, "hex"); + return new DH(prime, gen); + } + var ENCODINGS = { + "binary": true, + "hex": true, + "base64": true + }; + function createDiffieHellman(prime, enc, generator, genc) { + if (Buffer.isBuffer(enc) || ENCODINGS[enc] === void 0) { + return createDiffieHellman(prime, "binary", enc, generator); + } + enc = enc || "binary"; + genc = genc || "binary"; + generator = generator || new Buffer([2]); + if (!Buffer.isBuffer(generator)) { + generator = new Buffer(generator, genc); + } + if (typeof prime === "number") { + return new DH(generatePrime2(prime, generator), generator, true); + } + if (!Buffer.isBuffer(prime)) { + prime = new Buffer(prime, enc); + } + return new DH(prime, generator, true); + } + browser$7.DiffieHellmanGroup = browser$7.createDiffieHellmanGroup = browser$7.getDiffieHellman = getDiffieHellman; + browser$7.createDiffieHellman = browser$7.DiffieHellman = createDiffieHellman; + return browser$7; +} +var readableBrowser$1 = { exports: {} }; +var streamBrowser$1; +var hasRequiredStreamBrowser$1; +function requireStreamBrowser$1() { + if (hasRequiredStreamBrowser$1) return streamBrowser$1; + hasRequiredStreamBrowser$1 = 1; + streamBrowser$1 = requireEvents().EventEmitter; + return streamBrowser$1; +} +var buffer_list$1; +var hasRequiredBuffer_list$1; +function requireBuffer_list$1() { + if (hasRequiredBuffer_list$1) return buffer_list$1; + hasRequiredBuffer_list$1 = 1; + function ownKeys2(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function(sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source2 = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys2(Object(source2), true).forEach(function(key2) { + _defineProperty2(target, key2, source2[key2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source2)) : ownKeys2(Object(source2)).forEach(function(key2) { + Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source2, key2)); + }); + } + return target; + } + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey2(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + Object.defineProperty(Constructor, "prototype", { writable: false }); + return Constructor; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return typeof key2 === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return String(input); + } + var _require = requireBuffer$2(), Buffer2 = _require.Buffer; + var _require2 = require$$3, inspect = _require2.inspect; + var custom = inspect && inspect.custom || "inspect"; + function copyBuffer(src2, target, offset2) { + Buffer2.prototype.copy.call(src2, target, offset2); + } + buffer_list$1 = /* @__PURE__ */ function() { + function BufferList() { + _classCallCheck(this, BufferList); + this.head = null; + this.tail = null; + this.length = 0; + } + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join2(s) { + if (this.length === 0) return ""; + var p = this.head; + var ret = "" + p.data; + while (p = p.next) ret += s + p.data; + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer2.alloc(0); + var ret = Buffer2.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + } + // Consumes a specified amount of bytes or characters from the buffered data. + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + if (n < this.head.data.length) { + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + ret = this.shift(); + } else { + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } + // Consumes a specified amount of characters from the buffered data. + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str; + else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + this.length -= c; + return ret; + } + // Consumes a specified amount of bytes from the buffered data. + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer2.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + this.length -= c; + return ret; + } + // Make sure the linked list only shows the minimal necessary information. + }, { + key: custom, + value: function value(_, options2) { + return inspect(this, _objectSpread(_objectSpread({}, options2), {}, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + return BufferList; + }(); + return buffer_list$1; +} +var destroy_1$1; +var hasRequiredDestroy$1; +function requireDestroy$1() { + if (hasRequiredDestroy$1) return destroy_1$1; + hasRequiredDestroy$1 = 1; + function destroy(err, cb) { + var _this = this; + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + return this; + } + if (this._readableState) { + this._readableState.destroyed = true; + } + if (this._writableState) { + this._writableState.destroyed = true; + } + this._destroy(err || null, function(err2) { + if (!cb && err2) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err2); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err2); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err2); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + return this; + } + function emitErrorAndCloseNT(self2, err) { + emitErrorNT(self2, err); + emitCloseNT(self2); + } + function emitCloseNT(self2) { + if (self2._writableState && !self2._writableState.emitClose) return; + if (self2._readableState && !self2._readableState.emitClose) return; + self2.emit("close"); + } + function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } + } + function emitErrorNT(self2, err) { + self2.emit("error", err); + } + function errorOrDestroy(stream2, err) { + var rState = stream2._readableState; + var wState = stream2._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream2.destroy(err); + else stream2.emit("error", err); + } + destroy_1$1 = { + destroy, + undestroy, + errorOrDestroy + }; + return destroy_1$1; +} +var errorsBrowser$1 = {}; +var hasRequiredErrorsBrowser$1; +function requireErrorsBrowser$1() { + if (hasRequiredErrorsBrowser$1) return errorsBrowser$1; + hasRequiredErrorsBrowser$1 = 1; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + var codes = {}; + function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + function getMessage(arg1, arg2, arg3) { + if (typeof message === "string") { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + var NodeError = /* @__PURE__ */ function(_Base) { + _inheritsLoose(NodeError2, _Base); + function NodeError2(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + return NodeError2; + }(Base); + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; + } + function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function(i) { + return String(i); + }); + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(", "), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } + } + function startsWith(str, search, pos) { + return str.substr(0, search.length) === search; + } + function endsWith(str, search, this_len) { + if (this_len === void 0 || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; + } + function includes(str, search, start) { + if (typeof start !== "number") { + start = 0; + } + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } + } + createErrorType("ERR_INVALID_OPT_VALUE", function(name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; + }, TypeError); + createErrorType("ERR_INVALID_ARG_TYPE", function(name, expected, actual) { + var determiner; + if (typeof expected === "string" && startsWith(expected, "not ")) { + determiner = "must not be"; + expected = expected.replace(/^not /, ""); + } else { + determiner = "must be"; + } + var msg; + if (endsWith(name, " argument")) { + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } else { + var type2 = includes(name, ".") ? "property" : "argument"; + msg = 'The "'.concat(name, '" ').concat(type2, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } + msg += ". Received type ".concat(typeof actual); + return msg; + }, TypeError); + createErrorType("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF"); + createErrorType("ERR_METHOD_NOT_IMPLEMENTED", function(name) { + return "The " + name + " method is not implemented"; + }); + createErrorType("ERR_STREAM_PREMATURE_CLOSE", "Premature close"); + createErrorType("ERR_STREAM_DESTROYED", function(name) { + return "Cannot call " + name + " after a stream was destroyed"; + }); + createErrorType("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"); + createErrorType("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable"); + createErrorType("ERR_STREAM_WRITE_AFTER_END", "write after end"); + createErrorType("ERR_STREAM_NULL_VALUES", "May not write null values to stream", TypeError); + createErrorType("ERR_UNKNOWN_ENCODING", function(arg) { + return "Unknown encoding: " + arg; + }, TypeError); + createErrorType("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event"); + errorsBrowser$1.codes = codes; + return errorsBrowser$1; +} +var state$1; +var hasRequiredState$1; +function requireState$1() { + if (hasRequiredState$1) return state$1; + hasRequiredState$1 = 1; + var ERR_INVALID_OPT_VALUE = requireErrorsBrowser$1().codes.ERR_INVALID_OPT_VALUE; + function highWaterMarkFrom(options2, isDuplex, duplexKey) { + return options2.highWaterMark != null ? options2.highWaterMark : isDuplex ? options2[duplexKey] : null; + } + function getHighWaterMark(state2, options2, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options2, isDuplex, duplexKey); + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : "highWaterMark"; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + return Math.floor(hwm); + } + return state2.objectMode ? 16 : 16 * 1024; + } + state$1 = { + getHighWaterMark + }; + return state$1; +} +var _stream_writable$1; +var hasRequired_stream_writable$1; +function require_stream_writable$1() { + if (hasRequired_stream_writable$1) return _stream_writable$1; + hasRequired_stream_writable$1 = 1; + _stream_writable$1 = Writable; + function CorkedRequest(state2) { + var _this = this; + this.next = null; + this.entry = null; + this.finish = function() { + onCorkedFinish(_this, state2); + }; + } + var Duplex; + Writable.WritableState = WritableState; + var internalUtil = { + deprecate: requireBrowser$d() + }; + var Stream2 = requireStreamBrowser$1(); + var Buffer2 = requireBuffer$2().Buffer; + var OurUint8Array = (typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var destroyImpl = requireDestroy$1(); + var _require = requireState$1(), getHighWaterMark = _require.getHighWaterMark; + var _require$codes = requireErrorsBrowser$1().codes, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + var errorOrDestroy = destroyImpl.errorOrDestroy; + requireInherits_browser$1()(Writable, Stream2); + function nop() { + } + function WritableState(options2, stream2, isDuplex) { + Duplex = Duplex || require_stream_duplex$1(); + options2 = options2 || {}; + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof Duplex; + this.objectMode = !!options2.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options2.writableObjectMode; + this.highWaterMark = getHighWaterMark(this, options2, "writableHighWaterMark", isDuplex); + this.finalCalled = false; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + this.destroyed = false; + var noDecode = options2.decodeStrings === false; + this.decodeStrings = !noDecode; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = function(er) { + onwrite(stream2, er); + }; + this.writecb = null; + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; + this.pendingcb = 0; + this.prefinished = false; + this.errorEmitted = false; + this.emitClose = options2.emitClose !== false; + this.autoDestroy = !!options2.autoDestroy; + this.bufferedRequestCount = 0; + this.corkedRequestsFree = new CorkedRequest(this); + } + WritableState.prototype.getBuffer = function getBuffer() { + var current2 = this.bufferedRequest; + var out = []; + while (current2) { + out.push(current2); + current2 = current2.next; + } + return out; + }; + (function() { + try { + Object.defineProperty(WritableState.prototype, "buffer", { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") + }); + } catch (_) { + } + })(); + var realHasInstance; + if (typeof Symbol === "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === "function") { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); + } else { + realHasInstance = function realHasInstance2(object) { + return object instanceof this; + }; + } + function Writable(options2) { + Duplex = Duplex || require_stream_duplex$1(); + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options2); + this._writableState = new WritableState(options2, this, isDuplex); + this.writable = true; + if (options2) { + if (typeof options2.write === "function") this._write = options2.write; + if (typeof options2.writev === "function") this._writev = options2.writev; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + if (typeof options2.final === "function") this._final = options2.final; + } + Stream2.call(this); + } + Writable.prototype.pipe = function() { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); + }; + function writeAfterEnd(stream2, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); + errorOrDestroy(stream2, er); + process.nextTick(cb, er); + } + function validChunk(stream2, state2, chunk, cb) { + var er; + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== "string" && !state2.objectMode) { + er = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer"], chunk); + } + if (er) { + errorOrDestroy(stream2, er); + process.nextTick(cb, er); + return false; + } + return true; + } + Writable.prototype.write = function(chunk, encoding2, cb) { + var state2 = this._writableState; + var ret = false; + var isBuf = !state2.objectMode && _isUint8Array(chunk); + if (isBuf && !Buffer2.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + if (isBuf) encoding2 = "buffer"; + else if (!encoding2) encoding2 = state2.defaultEncoding; + if (typeof cb !== "function") cb = nop; + if (state2.ending) writeAfterEnd(this, cb); + else if (isBuf || validChunk(this, state2, chunk, cb)) { + state2.pendingcb++; + ret = writeOrBuffer(this, state2, isBuf, chunk, encoding2, cb); + } + return ret; + }; + Writable.prototype.cork = function() { + this._writableState.corked++; + }; + Writable.prototype.uncork = function() { + var state2 = this._writableState; + if (state2.corked) { + state2.corked--; + if (!state2.writing && !state2.corked && !state2.bufferProcessing && state2.bufferedRequest) clearBuffer(this, state2); + } + }; + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding2) { + if (typeof encoding2 === "string") encoding2 = encoding2.toLowerCase(); + if (!(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((encoding2 + "").toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding2); + this._writableState.defaultEncoding = encoding2; + return this; + }; + Object.defineProperty(Writable.prototype, "writableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState && this._writableState.getBuffer(); + } + }); + function decodeChunk(state2, chunk, encoding2) { + if (!state2.objectMode && state2.decodeStrings !== false && typeof chunk === "string") { + chunk = Buffer2.from(chunk, encoding2); + } + return chunk; + } + Object.defineProperty(Writable.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.highWaterMark; + } + }); + function writeOrBuffer(stream2, state2, isBuf, chunk, encoding2, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state2, chunk, encoding2); + if (chunk !== newChunk) { + isBuf = true; + encoding2 = "buffer"; + chunk = newChunk; + } + } + var len = state2.objectMode ? 1 : chunk.length; + state2.length += len; + var ret = state2.length < state2.highWaterMark; + if (!ret) state2.needDrain = true; + if (state2.writing || state2.corked) { + var last = state2.lastBufferedRequest; + state2.lastBufferedRequest = { + chunk, + encoding: encoding2, + isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state2.lastBufferedRequest; + } else { + state2.bufferedRequest = state2.lastBufferedRequest; + } + state2.bufferedRequestCount += 1; + } else { + doWrite(stream2, state2, false, len, chunk, encoding2, cb); + } + return ret; + } + function doWrite(stream2, state2, writev2, len, chunk, encoding2, cb) { + state2.writelen = len; + state2.writecb = cb; + state2.writing = true; + state2.sync = true; + if (state2.destroyed) state2.onwrite(new ERR_STREAM_DESTROYED("write")); + else if (writev2) stream2._writev(chunk, state2.onwrite); + else stream2._write(chunk, encoding2, state2.onwrite); + state2.sync = false; + } + function onwriteError(stream2, state2, sync, er, cb) { + --state2.pendingcb; + if (sync) { + process.nextTick(cb, er); + process.nextTick(finishMaybe, stream2, state2); + stream2._writableState.errorEmitted = true; + errorOrDestroy(stream2, er); + } else { + cb(er); + stream2._writableState.errorEmitted = true; + errorOrDestroy(stream2, er); + finishMaybe(stream2, state2); + } + } + function onwriteStateUpdate(state2) { + state2.writing = false; + state2.writecb = null; + state2.length -= state2.writelen; + state2.writelen = 0; + } + function onwrite(stream2, er) { + var state2 = stream2._writableState; + var sync = state2.sync; + var cb = state2.writecb; + if (typeof cb !== "function") throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state2); + if (er) onwriteError(stream2, state2, sync, er, cb); + else { + var finished = needFinish(state2) || stream2.destroyed; + if (!finished && !state2.corked && !state2.bufferProcessing && state2.bufferedRequest) { + clearBuffer(stream2, state2); + } + if (sync) { + process.nextTick(afterWrite, stream2, state2, finished, cb); + } else { + afterWrite(stream2, state2, finished, cb); + } + } + } + function afterWrite(stream2, state2, finished, cb) { + if (!finished) onwriteDrain(stream2, state2); + state2.pendingcb--; + cb(); + finishMaybe(stream2, state2); + } + function onwriteDrain(stream2, state2) { + if (state2.length === 0 && state2.needDrain) { + state2.needDrain = false; + stream2.emit("drain"); + } + } + function clearBuffer(stream2, state2) { + state2.bufferProcessing = true; + var entry = state2.bufferedRequest; + if (stream2._writev && entry && entry.next) { + var l = state2.bufferedRequestCount; + var buffer2 = new Array(l); + var holder = state2.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + while (entry) { + buffer2[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer2.allBuffers = allBuffers; + doWrite(stream2, state2, true, state2.length, buffer2, "", holder.finish); + state2.pendingcb++; + state2.lastBufferedRequest = null; + if (holder.next) { + state2.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state2.corkedRequestsFree = new CorkedRequest(state2); + } + state2.bufferedRequestCount = 0; + } else { + while (entry) { + var chunk = entry.chunk; + var encoding2 = entry.encoding; + var cb = entry.callback; + var len = state2.objectMode ? 1 : chunk.length; + doWrite(stream2, state2, false, len, chunk, encoding2, cb); + entry = entry.next; + state2.bufferedRequestCount--; + if (state2.writing) { + break; + } + } + if (entry === null) state2.lastBufferedRequest = null; + } + state2.bufferedRequest = entry; + state2.bufferProcessing = false; + } + Writable.prototype._write = function(chunk, encoding2, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED("_write()")); + }; + Writable.prototype._writev = null; + Writable.prototype.end = function(chunk, encoding2, cb) { + var state2 = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding2 = null; + } else if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + if (chunk !== null && chunk !== void 0) this.write(chunk, encoding2); + if (state2.corked) { + state2.corked = 1; + this.uncork(); + } + if (!state2.ending) endWritable(this, state2, cb); + return this; + }; + Object.defineProperty(Writable.prototype, "writableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.length; + } + }); + function needFinish(state2) { + return state2.ending && state2.length === 0 && state2.bufferedRequest === null && !state2.finished && !state2.writing; + } + function callFinal(stream2, state2) { + stream2._final(function(err) { + state2.pendingcb--; + if (err) { + errorOrDestroy(stream2, err); + } + state2.prefinished = true; + stream2.emit("prefinish"); + finishMaybe(stream2, state2); + }); + } + function prefinish(stream2, state2) { + if (!state2.prefinished && !state2.finalCalled) { + if (typeof stream2._final === "function" && !state2.destroyed) { + state2.pendingcb++; + state2.finalCalled = true; + process.nextTick(callFinal, stream2, state2); + } else { + state2.prefinished = true; + stream2.emit("prefinish"); + } + } + } + function finishMaybe(stream2, state2) { + var need = needFinish(state2); + if (need) { + prefinish(stream2, state2); + if (state2.pendingcb === 0) { + state2.finished = true; + stream2.emit("finish"); + if (state2.autoDestroy) { + var rState = stream2._readableState; + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream2.destroy(); + } + } + } + } + return need; + } + function endWritable(stream2, state2, cb) { + state2.ending = true; + finishMaybe(stream2, state2); + if (cb) { + if (state2.finished) process.nextTick(cb); + else stream2.once("finish", cb); + } + state2.ended = true; + stream2.writable = false; + } + function onCorkedFinish(corkReq, state2, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state2.pendingcb--; + cb(err); + entry = entry.next; + } + state2.corkedRequestsFree.next = corkReq; + } + Object.defineProperty(Writable.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._writableState === void 0) { + return false; + } + return this._writableState.destroyed; + }, + set: function set2(value) { + if (!this._writableState) { + return; + } + this._writableState.destroyed = value; + } + }); + Writable.prototype.destroy = destroyImpl.destroy; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function(err, cb) { + cb(err); + }; + return _stream_writable$1; +} +var _stream_duplex$1; +var hasRequired_stream_duplex$1; +function require_stream_duplex$1() { + if (hasRequired_stream_duplex$1) return _stream_duplex$1; + hasRequired_stream_duplex$1 = 1; + var objectKeys2 = Object.keys || function(obj) { + var keys2 = []; + for (var key2 in obj) keys2.push(key2); + return keys2; + }; + _stream_duplex$1 = Duplex; + var Readable = require_stream_readable$1(); + var Writable = require_stream_writable$1(); + requireInherits_browser$1()(Duplex, Readable); + { + var keys = objectKeys2(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + } + function Duplex(options2) { + if (!(this instanceof Duplex)) return new Duplex(options2); + Readable.call(this, options2); + Writable.call(this, options2); + this.allowHalfOpen = true; + if (options2) { + if (options2.readable === false) this.readable = false; + if (options2.writable === false) this.writable = false; + if (options2.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once("end", onend); + } + } + } + Object.defineProperty(Duplex.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.highWaterMark; + } + }); + Object.defineProperty(Duplex.prototype, "writableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState && this._writableState.getBuffer(); + } + }); + Object.defineProperty(Duplex.prototype, "writableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.length; + } + }); + function onend() { + if (this._writableState.ended) return; + process.nextTick(onEndNT, this); + } + function onEndNT(self2) { + self2.end(); + } + Object.defineProperty(Duplex.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._readableState === void 0 || this._writableState === void 0) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set2(value) { + if (this._readableState === void 0 || this._writableState === void 0) { + return; + } + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }); + return _stream_duplex$1; +} +var endOfStream$2; +var hasRequiredEndOfStream$2; +function requireEndOfStream$2() { + if (hasRequiredEndOfStream$2) return endOfStream$2; + hasRequiredEndOfStream$2 = 1; + var ERR_STREAM_PREMATURE_CLOSE = requireErrorsBrowser$1().codes.ERR_STREAM_PREMATURE_CLOSE; + function once2(callback) { + var called = false; + return function() { + if (called) return; + called = true; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + callback.apply(this, args); + }; + } + function noop2() { + } + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + function eos(stream2, opts, callback) { + if (typeof opts === "function") return eos(stream2, null, opts); + if (!opts) opts = {}; + callback = once2(callback || noop2); + var readable2 = opts.readable || opts.readable !== false && stream2.readable; + var writable2 = opts.writable || opts.writable !== false && stream2.writable; + var onlegacyfinish = function onlegacyfinish2() { + if (!stream2.writable) onfinish(); + }; + var writableEnded = stream2._writableState && stream2._writableState.finished; + var onfinish = function onfinish2() { + writable2 = false; + writableEnded = true; + if (!readable2) callback.call(stream2); + }; + var readableEnded = stream2._readableState && stream2._readableState.endEmitted; + var onend = function onend2() { + readable2 = false; + readableEnded = true; + if (!writable2) callback.call(stream2); + }; + var onerror = function onerror2(err) { + callback.call(stream2, err); + }; + var onclose = function onclose2() { + var err; + if (readable2 && !readableEnded) { + if (!stream2._readableState || !stream2._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream2, err); + } + if (writable2 && !writableEnded) { + if (!stream2._writableState || !stream2._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream2, err); + } + }; + var onrequest = function onrequest2() { + stream2.req.on("finish", onfinish); + }; + if (isRequest(stream2)) { + stream2.on("complete", onfinish); + stream2.on("abort", onclose); + if (stream2.req) onrequest(); + else stream2.on("request", onrequest); + } else if (writable2 && !stream2._writableState) { + stream2.on("end", onlegacyfinish); + stream2.on("close", onlegacyfinish); + } + stream2.on("end", onend); + stream2.on("finish", onfinish); + if (opts.error !== false) stream2.on("error", onerror); + stream2.on("close", onclose); + return function() { + stream2.removeListener("complete", onfinish); + stream2.removeListener("abort", onclose); + stream2.removeListener("request", onrequest); + if (stream2.req) stream2.req.removeListener("finish", onfinish); + stream2.removeListener("end", onlegacyfinish); + stream2.removeListener("close", onlegacyfinish); + stream2.removeListener("finish", onfinish); + stream2.removeListener("end", onend); + stream2.removeListener("error", onerror); + stream2.removeListener("close", onclose); + }; + } + endOfStream$2 = eos; + return endOfStream$2; +} +var async_iterator$1; +var hasRequiredAsync_iterator$1; +function requireAsync_iterator$1() { + if (hasRequiredAsync_iterator$1) return async_iterator$1; + hasRequiredAsync_iterator$1 = 1; + var _Object$setPrototypeO; + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return typeof key2 === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + var finished = requireEndOfStream$2(); + var kLastResolve = Symbol("lastResolve"); + var kLastReject = Symbol("lastReject"); + var kError = Symbol("error"); + var kEnded = Symbol("ended"); + var kLastPromise = Symbol("lastPromise"); + var kHandlePromise = Symbol("handlePromise"); + var kStream = Symbol("stream"); + function createIterResult(value, done) { + return { + value, + done + }; + } + function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + if (resolve !== null) { + var data2 = iter[kStream].read(); + if (data2 !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data2, false)); + } + } + } + function onReadable(iter) { + process.nextTick(readAndResolve, iter); + } + function wrapForNext(lastPromise, iter) { + return function(resolve, reject) { + lastPromise.then(function() { + if (iter[kEnded]) { + resolve(createIterResult(void 0, true)); + return; + } + iter[kHandlePromise](resolve, reject); + }, reject); + }; + } + var AsyncIteratorPrototype = Object.getPrototypeOf(function() { + }); + var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + next: function next() { + var _this = this; + var error2 = this[kError]; + if (error2 !== null) { + return Promise.reject(error2); + } + if (this[kEnded]) { + return Promise.resolve(createIterResult(void 0, true)); + } + if (this[kStream].destroyed) { + return new Promise(function(resolve, reject) { + process.nextTick(function() { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(void 0, true)); + } + }); + }); + } + var lastPromise = this[kLastPromise]; + var promise; + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + var data2 = this[kStream].read(); + if (data2 !== null) { + return Promise.resolve(createIterResult(data2, false)); + } + promise = new Promise(this[kHandlePromise]); + } + this[kLastPromise] = promise; + return promise; + } + }, _defineProperty2(_Object$setPrototypeO, Symbol.asyncIterator, function() { + return this; + }), _defineProperty2(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + return new Promise(function(resolve, reject) { + _this2[kStream].destroy(null, function(err) { + if (err) { + reject(err); + return; + } + resolve(createIterResult(void 0, true)); + }); + }); + }), _Object$setPrototypeO), AsyncIteratorPrototype); + var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator2(stream2) { + var _Object$create; + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty2(_Object$create, kStream, { + value: stream2, + writable: true + }), _defineProperty2(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kEnded, { + value: stream2._readableState.endEmitted, + writable: true + }), _defineProperty2(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data2 = iterator[kStream].read(); + if (data2) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data2, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream2, function(err) { + if (err && err.code !== "ERR_STREAM_PREMATURE_CLOSE") { + var reject = iterator[kLastReject]; + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + iterator[kError] = err; + return; + } + var resolve = iterator[kLastResolve]; + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(void 0, true)); + } + iterator[kEnded] = true; + }); + stream2.on("readable", onReadable.bind(null, iterator)); + return iterator; + }; + async_iterator$1 = createReadableStreamAsyncIterator; + return async_iterator$1; +} +var fromBrowser$1; +var hasRequiredFromBrowser$1; +function requireFromBrowser$1() { + if (hasRequiredFromBrowser$1) return fromBrowser$1; + hasRequiredFromBrowser$1 = 1; + fromBrowser$1 = function() { + throw new Error("Readable.from is not available in the browser"); + }; + return fromBrowser$1; +} +var _stream_readable$1; +var hasRequired_stream_readable$1; +function require_stream_readable$1() { + if (hasRequired_stream_readable$1) return _stream_readable$1; + hasRequired_stream_readable$1 = 1; + _stream_readable$1 = Readable; + var Duplex; + Readable.ReadableState = ReadableState; + requireEvents().EventEmitter; + var EElistenerCount = function EElistenerCount2(emitter, type2) { + return emitter.listeners(type2).length; + }; + var Stream2 = requireStreamBrowser$1(); + var Buffer2 = requireBuffer$2().Buffer; + var OurUint8Array = (typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var debugUtil = require$$3; + var debug2; + if (debugUtil && debugUtil.debuglog) { + debug2 = debugUtil.debuglog("stream"); + } else { + debug2 = function debug3() { + }; + } + var BufferList = requireBuffer_list$1(); + var destroyImpl = requireDestroy$1(); + var _require = requireState$1(), getHighWaterMark = _require.getHighWaterMark; + var _require$codes = requireErrorsBrowser$1().codes, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; + var StringDecoder; + var createReadableStreamAsyncIterator; + var from2; + requireInherits_browser$1()(Readable, Stream2); + var errorOrDestroy = destroyImpl.errorOrDestroy; + var kProxyEvents = ["error", "close", "destroy", "pause", "resume"]; + function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === "function") return emitter.prependListener(event, fn); + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn); + else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn); + else emitter._events[event] = [fn, emitter._events[event]]; + } + function ReadableState(options2, stream2, isDuplex) { + Duplex = Duplex || require_stream_duplex$1(); + options2 = options2 || {}; + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof Duplex; + this.objectMode = !!options2.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options2.readableObjectMode; + this.highWaterMark = getHighWaterMark(this, options2, "readableHighWaterMark", isDuplex); + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + this.sync = true; + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; + this.emitClose = options2.emitClose !== false; + this.autoDestroy = !!options2.autoDestroy; + this.destroyed = false; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.awaitDrain = 0; + this.readingMore = false; + this.decoder = null; + this.encoding = null; + if (options2.encoding) { + if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder; + this.decoder = new StringDecoder(options2.encoding); + this.encoding = options2.encoding; + } + } + function Readable(options2) { + Duplex = Duplex || require_stream_duplex$1(); + if (!(this instanceof Readable)) return new Readable(options2); + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options2, this, isDuplex); + this.readable = true; + if (options2) { + if (typeof options2.read === "function") this._read = options2.read; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + } + Stream2.call(this); + } + Object.defineProperty(Readable.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._readableState === void 0) { + return false; + } + return this._readableState.destroyed; + }, + set: function set2(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + } + }); + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function(err, cb) { + cb(err); + }; + Readable.prototype.push = function(chunk, encoding2) { + var state2 = this._readableState; + var skipChunkCheck; + if (!state2.objectMode) { + if (typeof chunk === "string") { + encoding2 = encoding2 || state2.defaultEncoding; + if (encoding2 !== state2.encoding) { + chunk = Buffer2.from(chunk, encoding2); + encoding2 = ""; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + return readableAddChunk(this, chunk, encoding2, false, skipChunkCheck); + }; + Readable.prototype.unshift = function(chunk) { + return readableAddChunk(this, chunk, null, true, false); + }; + function readableAddChunk(stream2, chunk, encoding2, addToFront, skipChunkCheck) { + debug2("readableAddChunk", chunk); + var state2 = stream2._readableState; + if (chunk === null) { + state2.reading = false; + onEofChunk(stream2, state2); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state2, chunk); + if (er) { + errorOrDestroy(stream2, er); + } else if (state2.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== "string" && !state2.objectMode && Object.getPrototypeOf(chunk) !== Buffer2.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (addToFront) { + if (state2.endEmitted) errorOrDestroy(stream2, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else addChunk(stream2, state2, chunk, true); + } else if (state2.ended) { + errorOrDestroy(stream2, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state2.destroyed) { + return false; + } else { + state2.reading = false; + if (state2.decoder && !encoding2) { + chunk = state2.decoder.write(chunk); + if (state2.objectMode || chunk.length !== 0) addChunk(stream2, state2, chunk, false); + else maybeReadMore(stream2, state2); + } else { + addChunk(stream2, state2, chunk, false); + } + } + } else if (!addToFront) { + state2.reading = false; + maybeReadMore(stream2, state2); + } + } + return !state2.ended && (state2.length < state2.highWaterMark || state2.length === 0); + } + function addChunk(stream2, state2, chunk, addToFront) { + if (state2.flowing && state2.length === 0 && !state2.sync) { + state2.awaitDrain = 0; + stream2.emit("data", chunk); + } else { + state2.length += state2.objectMode ? 1 : chunk.length; + if (addToFront) state2.buffer.unshift(chunk); + else state2.buffer.push(chunk); + if (state2.needReadable) emitReadable(stream2); + } + maybeReadMore(stream2, state2); + } + function chunkInvalid(state2, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== "string" && chunk !== void 0 && !state2.objectMode) { + er = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + return er; + } + Readable.prototype.isPaused = function() { + return this._readableState.flowing === false; + }; + Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder; + var decoder2 = new StringDecoder(enc); + this._readableState.decoder = decoder2; + this._readableState.encoding = this._readableState.decoder.encoding; + var p = this._readableState.buffer.head; + var content = ""; + while (p !== null) { + content += decoder2.write(p.data); + p = p.next; + } + this._readableState.buffer.clear(); + if (content !== "") this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; + }; + var MAX_HWM = 1073741824; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + function howMuchToRead(n, state2) { + if (n <= 0 || state2.length === 0 && state2.ended) return 0; + if (state2.objectMode) return 1; + if (n !== n) { + if (state2.flowing && state2.length) return state2.buffer.head.data.length; + else return state2.length; + } + if (n > state2.highWaterMark) state2.highWaterMark = computeNewHighWaterMark(n); + if (n <= state2.length) return n; + if (!state2.ended) { + state2.needReadable = true; + return 0; + } + return state2.length; + } + Readable.prototype.read = function(n) { + debug2("read", n); + n = parseInt(n, 10); + var state2 = this._readableState; + var nOrig = n; + if (n !== 0) state2.emittedReadable = false; + if (n === 0 && state2.needReadable && ((state2.highWaterMark !== 0 ? state2.length >= state2.highWaterMark : state2.length > 0) || state2.ended)) { + debug2("read: emitReadable", state2.length, state2.ended); + if (state2.length === 0 && state2.ended) endReadable(this); + else emitReadable(this); + return null; + } + n = howMuchToRead(n, state2); + if (n === 0 && state2.ended) { + if (state2.length === 0) endReadable(this); + return null; + } + var doRead = state2.needReadable; + debug2("need readable", doRead); + if (state2.length === 0 || state2.length - n < state2.highWaterMark) { + doRead = true; + debug2("length less than watermark", doRead); + } + if (state2.ended || state2.reading) { + doRead = false; + debug2("reading or ended", doRead); + } else if (doRead) { + debug2("do read"); + state2.reading = true; + state2.sync = true; + if (state2.length === 0) state2.needReadable = true; + this._read(state2.highWaterMark); + state2.sync = false; + if (!state2.reading) n = howMuchToRead(nOrig, state2); + } + var ret; + if (n > 0) ret = fromList(n, state2); + else ret = null; + if (ret === null) { + state2.needReadable = state2.length <= state2.highWaterMark; + n = 0; + } else { + state2.length -= n; + state2.awaitDrain = 0; + } + if (state2.length === 0) { + if (!state2.ended) state2.needReadable = true; + if (nOrig !== n && state2.ended) endReadable(this); + } + if (ret !== null) this.emit("data", ret); + return ret; + }; + function onEofChunk(stream2, state2) { + debug2("onEofChunk"); + if (state2.ended) return; + if (state2.decoder) { + var chunk = state2.decoder.end(); + if (chunk && chunk.length) { + state2.buffer.push(chunk); + state2.length += state2.objectMode ? 1 : chunk.length; + } + } + state2.ended = true; + if (state2.sync) { + emitReadable(stream2); + } else { + state2.needReadable = false; + if (!state2.emittedReadable) { + state2.emittedReadable = true; + emitReadable_(stream2); + } + } + } + function emitReadable(stream2) { + var state2 = stream2._readableState; + debug2("emitReadable", state2.needReadable, state2.emittedReadable); + state2.needReadable = false; + if (!state2.emittedReadable) { + debug2("emitReadable", state2.flowing); + state2.emittedReadable = true; + process.nextTick(emitReadable_, stream2); + } + } + function emitReadable_(stream2) { + var state2 = stream2._readableState; + debug2("emitReadable_", state2.destroyed, state2.length, state2.ended); + if (!state2.destroyed && (state2.length || state2.ended)) { + stream2.emit("readable"); + state2.emittedReadable = false; + } + state2.needReadable = !state2.flowing && !state2.ended && state2.length <= state2.highWaterMark; + flow(stream2); + } + function maybeReadMore(stream2, state2) { + if (!state2.readingMore) { + state2.readingMore = true; + process.nextTick(maybeReadMore_, stream2, state2); + } + } + function maybeReadMore_(stream2, state2) { + while (!state2.reading && !state2.ended && (state2.length < state2.highWaterMark || state2.flowing && state2.length === 0)) { + var len = state2.length; + debug2("maybeReadMore read 0"); + stream2.read(0); + if (len === state2.length) + break; + } + state2.readingMore = false; + } + Readable.prototype._read = function(n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED("_read()")); + }; + Readable.prototype.pipe = function(dest, pipeOpts) { + var src2 = this; + var state2 = this._readableState; + switch (state2.pipesCount) { + case 0: + state2.pipes = dest; + break; + case 1: + state2.pipes = [state2.pipes, dest]; + break; + default: + state2.pipes.push(dest); + break; + } + state2.pipesCount += 1; + debug2("pipe count=%d opts=%j", state2.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state2.endEmitted) process.nextTick(endFn); + else src2.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable2, unpipeInfo) { + debug2("onunpipe"); + if (readable2 === src2) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + function onend() { + debug2("onend"); + dest.end(); + } + var ondrain = pipeOnDrain(src2); + dest.on("drain", ondrain); + var cleanedUp = false; + function cleanup() { + debug2("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + dest.removeListener("drain", ondrain); + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src2.removeListener("end", onend); + src2.removeListener("end", unpipe); + src2.removeListener("data", ondata); + cleanedUp = true; + if (state2.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + src2.on("data", ondata); + function ondata(chunk) { + debug2("ondata"); + var ret = dest.write(chunk); + debug2("dest.write", ret); + if (ret === false) { + if ((state2.pipesCount === 1 && state2.pipes === dest || state2.pipesCount > 1 && indexOf(state2.pipes, dest) !== -1) && !cleanedUp) { + debug2("false write response, pause", state2.awaitDrain); + state2.awaitDrain++; + } + src2.pause(); + } + } + function onerror(er) { + debug2("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (EElistenerCount(dest, "error") === 0) errorOrDestroy(dest, er); + } + prependListener(dest, "error", onerror); + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug2("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + debug2("unpipe"); + src2.unpipe(dest); + } + dest.emit("pipe", src2); + if (!state2.flowing) { + debug2("pipe resume"); + src2.resume(); + } + return dest; + }; + function pipeOnDrain(src2) { + return function pipeOnDrainFunctionResult() { + var state2 = src2._readableState; + debug2("pipeOnDrain", state2.awaitDrain); + if (state2.awaitDrain) state2.awaitDrain--; + if (state2.awaitDrain === 0 && EElistenerCount(src2, "data")) { + state2.flowing = true; + flow(src2); + } + }; + } + Readable.prototype.unpipe = function(dest) { + var state2 = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; + if (state2.pipesCount === 0) return this; + if (state2.pipesCount === 1) { + if (dest && dest !== state2.pipes) return this; + if (!dest) dest = state2.pipes; + state2.pipes = null; + state2.pipesCount = 0; + state2.flowing = false; + if (dest) dest.emit("unpipe", this, unpipeInfo); + return this; + } + if (!dest) { + var dests = state2.pipes; + var len = state2.pipesCount; + state2.pipes = null; + state2.pipesCount = 0; + state2.flowing = false; + for (var i = 0; i < len; i++) dests[i].emit("unpipe", this, { + hasUnpiped: false + }); + return this; + } + var index2 = indexOf(state2.pipes, dest); + if (index2 === -1) return this; + state2.pipes.splice(index2, 1); + state2.pipesCount -= 1; + if (state2.pipesCount === 1) state2.pipes = state2.pipes[0]; + dest.emit("unpipe", this, unpipeInfo); + return this; + }; + Readable.prototype.on = function(ev, fn) { + var res = Stream2.prototype.on.call(this, ev, fn); + var state2 = this._readableState; + if (ev === "data") { + state2.readableListening = this.listenerCount("readable") > 0; + if (state2.flowing !== false) this.resume(); + } else if (ev === "readable") { + if (!state2.endEmitted && !state2.readableListening) { + state2.readableListening = state2.needReadable = true; + state2.flowing = false; + state2.emittedReadable = false; + debug2("on readable", state2.length, state2.reading); + if (state2.length) { + emitReadable(this); + } else if (!state2.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + Readable.prototype.removeListener = function(ev, fn) { + var res = Stream2.prototype.removeListener.call(this, ev, fn); + if (ev === "readable") { + process.nextTick(updateReadableListening, this); + } + return res; + }; + Readable.prototype.removeAllListeners = function(ev) { + var res = Stream2.prototype.removeAllListeners.apply(this, arguments); + if (ev === "readable" || ev === void 0) { + process.nextTick(updateReadableListening, this); + } + return res; + }; + function updateReadableListening(self2) { + var state2 = self2._readableState; + state2.readableListening = self2.listenerCount("readable") > 0; + if (state2.resumeScheduled && !state2.paused) { + state2.flowing = true; + } else if (self2.listenerCount("data") > 0) { + self2.resume(); + } + } + function nReadingNextTick(self2) { + debug2("readable nexttick read 0"); + self2.read(0); + } + Readable.prototype.resume = function() { + var state2 = this._readableState; + if (!state2.flowing) { + debug2("resume"); + state2.flowing = !state2.readableListening; + resume(this, state2); + } + state2.paused = false; + return this; + }; + function resume(stream2, state2) { + if (!state2.resumeScheduled) { + state2.resumeScheduled = true; + process.nextTick(resume_, stream2, state2); + } + } + function resume_(stream2, state2) { + debug2("resume", state2.reading); + if (!state2.reading) { + stream2.read(0); + } + state2.resumeScheduled = false; + stream2.emit("resume"); + flow(stream2); + if (state2.flowing && !state2.reading) stream2.read(0); + } + Readable.prototype.pause = function() { + debug2("call pause flowing=%j", this._readableState.flowing); + if (this._readableState.flowing !== false) { + debug2("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + this._readableState.paused = true; + return this; + }; + function flow(stream2) { + var state2 = stream2._readableState; + debug2("flow", state2.flowing); + while (state2.flowing && stream2.read() !== null) ; + } + Readable.prototype.wrap = function(stream2) { + var _this = this; + var state2 = this._readableState; + var paused = false; + stream2.on("end", function() { + debug2("wrapped end"); + if (state2.decoder && !state2.ended) { + var chunk = state2.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + _this.push(null); + }); + stream2.on("data", function(chunk) { + debug2("wrapped data"); + if (state2.decoder) chunk = state2.decoder.write(chunk); + if (state2.objectMode && (chunk === null || chunk === void 0)) return; + else if (!state2.objectMode && (!chunk || !chunk.length)) return; + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream2.pause(); + } + }); + for (var i in stream2) { + if (this[i] === void 0 && typeof stream2[i] === "function") { + this[i] = /* @__PURE__ */ function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream2[method].apply(stream2, arguments); + }; + }(i); + } + } + for (var n = 0; n < kProxyEvents.length; n++) { + stream2.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + this._read = function(n2) { + debug2("wrapped _read", n2); + if (paused) { + paused = false; + stream2.resume(); + } + }; + return this; + }; + if (typeof Symbol === "function") { + Readable.prototype[Symbol.asyncIterator] = function() { + if (createReadableStreamAsyncIterator === void 0) { + createReadableStreamAsyncIterator = requireAsync_iterator$1(); + } + return createReadableStreamAsyncIterator(this); + }; + } + Object.defineProperty(Readable.prototype, "readableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.highWaterMark; + } + }); + Object.defineProperty(Readable.prototype, "readableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState && this._readableState.buffer; + } + }); + Object.defineProperty(Readable.prototype, "readableFlowing", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.flowing; + }, + set: function set2(state2) { + if (this._readableState) { + this._readableState.flowing = state2; + } + } + }); + Readable._fromList = fromList; + Object.defineProperty(Readable.prototype, "readableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.length; + } + }); + function fromList(n, state2) { + if (state2.length === 0) return null; + var ret; + if (state2.objectMode) ret = state2.buffer.shift(); + else if (!n || n >= state2.length) { + if (state2.decoder) ret = state2.buffer.join(""); + else if (state2.buffer.length === 1) ret = state2.buffer.first(); + else ret = state2.buffer.concat(state2.length); + state2.buffer.clear(); + } else { + ret = state2.buffer.consume(n, state2.decoder); + } + return ret; + } + function endReadable(stream2) { + var state2 = stream2._readableState; + debug2("endReadable", state2.endEmitted); + if (!state2.endEmitted) { + state2.ended = true; + process.nextTick(endReadableNT, state2, stream2); + } + } + function endReadableNT(state2, stream2) { + debug2("endReadableNT", state2.endEmitted, state2.length); + if (!state2.endEmitted && state2.length === 0) { + state2.endEmitted = true; + stream2.readable = false; + stream2.emit("end"); + if (state2.autoDestroy) { + var wState = stream2._writableState; + if (!wState || wState.autoDestroy && wState.finished) { + stream2.destroy(); + } + } + } + } + if (typeof Symbol === "function") { + Readable.from = function(iterable, opts) { + if (from2 === void 0) { + from2 = requireFromBrowser$1(); + } + return from2(Readable, iterable, opts); + }; + } + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; + } + return _stream_readable$1; +} +var _stream_transform$1; +var hasRequired_stream_transform$1; +function require_stream_transform$1() { + if (hasRequired_stream_transform$1) return _stream_transform$1; + hasRequired_stream_transform$1 = 1; + _stream_transform$1 = Transform; + var _require$codes = requireErrorsBrowser$1().codes, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + var Duplex = require_stream_duplex$1(); + requireInherits_browser$1()(Transform, Duplex); + function afterTransform(er, data2) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + if (cb === null) { + return this.emit("error", new ERR_MULTIPLE_CALLBACK()); + } + ts.writechunk = null; + ts.writecb = null; + if (data2 != null) + this.push(data2); + cb(er); + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } + } + function Transform(options2) { + if (!(this instanceof Transform)) return new Transform(options2); + Duplex.call(this, options2); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + this._readableState.needReadable = true; + this._readableState.sync = false; + if (options2) { + if (typeof options2.transform === "function") this._transform = options2.transform; + if (typeof options2.flush === "function") this._flush = options2.flush; + } + this.on("prefinish", prefinish); + } + function prefinish() { + var _this = this; + if (typeof this._flush === "function" && !this._readableState.destroyed) { + this._flush(function(er, data2) { + done(_this, er, data2); + }); + } else { + done(this, null, null); + } + } + Transform.prototype.push = function(chunk, encoding2) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding2); + }; + Transform.prototype._transform = function(chunk, encoding2, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED("_transform()")); + }; + Transform.prototype._write = function(chunk, encoding2, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding2; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } + }; + Transform.prototype._read = function(n) { + var ts = this._transformState; + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + ts.needTransform = true; + } + }; + Transform.prototype._destroy = function(err, cb) { + Duplex.prototype._destroy.call(this, err, function(err2) { + cb(err2); + }); + }; + function done(stream2, er, data2) { + if (er) return stream2.emit("error", er); + if (data2 != null) + stream2.push(data2); + if (stream2._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream2._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream2.push(null); + } + return _stream_transform$1; +} +var _stream_passthrough$1; +var hasRequired_stream_passthrough$1; +function require_stream_passthrough$1() { + if (hasRequired_stream_passthrough$1) return _stream_passthrough$1; + hasRequired_stream_passthrough$1 = 1; + _stream_passthrough$1 = PassThrough; + var Transform = require_stream_transform$1(); + requireInherits_browser$1()(PassThrough, Transform); + function PassThrough(options2) { + if (!(this instanceof PassThrough)) return new PassThrough(options2); + Transform.call(this, options2); + } + PassThrough.prototype._transform = function(chunk, encoding2, cb) { + cb(null, chunk); + }; + return _stream_passthrough$1; +} +var pipeline_1$1; +var hasRequiredPipeline$1; +function requirePipeline$1() { + if (hasRequiredPipeline$1) return pipeline_1$1; + hasRequiredPipeline$1 = 1; + var eos; + function once2(callback) { + var called = false; + return function() { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; + } + var _require$codes = requireErrorsBrowser$1().codes, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + function noop2(err) { + if (err) throw err; + } + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + function destroyer(stream2, reading, writing, callback) { + callback = once2(callback); + var closed = false; + stream2.on("close", function() { + closed = true; + }); + if (eos === void 0) eos = requireEndOfStream$2(); + eos(stream2, { + readable: reading, + writable: writing + }, function(err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function(err) { + if (closed) return; + if (destroyed) return; + destroyed = true; + if (isRequest(stream2)) return stream2.abort(); + if (typeof stream2.destroy === "function") return stream2.destroy(); + callback(err || new ERR_STREAM_DESTROYED("pipe")); + }; + } + function call(fn) { + fn(); + } + function pipe(from2, to) { + return from2.pipe(to); + } + function popCallback(streams) { + if (!streams.length) return noop2; + if (typeof streams[streams.length - 1] !== "function") return noop2; + return streams.pop(); + } + function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + if (streams.length < 2) { + throw new ERR_MISSING_ARGS("streams"); + } + var error2; + var destroys = streams.map(function(stream2, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream2, reading, writing, function(err) { + if (!error2) error2 = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error2); + }); + }); + return streams.reduce(pipe); + } + pipeline_1$1 = pipeline; + return pipeline_1$1; +} +var hasRequiredReadableBrowser$1; +function requireReadableBrowser$1() { + if (hasRequiredReadableBrowser$1) return readableBrowser$1.exports; + hasRequiredReadableBrowser$1 = 1; + (function(module, exports) { + exports = module.exports = require_stream_readable$1(); + exports.Stream = exports; + exports.Readable = exports; + exports.Writable = require_stream_writable$1(); + exports.Duplex = require_stream_duplex$1(); + exports.Transform = require_stream_transform$1(); + exports.PassThrough = require_stream_passthrough$1(); + exports.finished = requireEndOfStream$2(); + exports.pipeline = requirePipeline$1(); + })(readableBrowser$1, readableBrowser$1.exports); + return readableBrowser$1.exports; +} +var sign = { exports: {} }; +var bn$9 = { exports: {} }; +var bn$8 = bn$9.exports; +var hasRequiredBn$4; +function requireBn$4() { + if (hasRequiredBn$4) return bn$9.exports; + hasRequiredBn$4 = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this._strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 48 && c <= 57) { + return c - 48; + } else if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + assert2(false, "Invalid character in " + string2); + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this._strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var b = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + b = c - 49 + 10; + } else if (c >= 17) { + b = c - 17 + 10; + } else { + b = c; + } + assert2(c >= 0 && b < mul, "Invalid character"); + r += b; + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this._strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + function move(dest, src2) { + dest.words = src2.words; + dest.length = src2.length; + dest.negative = src2.negative; + dest.red = src2.red; + } + BN.prototype._move = function _move(dest) { + move(dest, this); + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype._strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + if (typeof Symbol !== "undefined" && typeof Symbol.for === "function") { + try { + BN.prototype[Symbol.for("nodejs.util.inspect.custom")] = inspect; + } catch (e) { + BN.prototype.inspect = inspect; + } + } else { + BN.prototype.inspect = inspect; + } + function inspect() { + return (this.red ? ""; + } + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modrn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16, 2); + }; + if (Buffer2) { + BN.prototype.toBuffer = function toBuffer2(endian, length) { + return this.toArrayLike(Buffer2, endian, length); + }; + } + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + var allocate = function allocate2(ArrayType, size) { + if (ArrayType.allocUnsafe) { + return ArrayType.allocUnsafe(size); + } + return new ArrayType(size); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + this._strip(); + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + var res = allocate(ArrayType, reqLength); + var postfix = endian === "le" ? "LE" : "BE"; + this["_toArrayLike" + postfix](res, byteLength); + return res; + }; + BN.prototype._toArrayLikeLE = function _toArrayLikeLE(res, byteLength) { + var position = 0; + var carry = 0; + for (var i = 0, shift = 0; i < this.length; i++) { + var word = this.words[i] << shift | carry; + res[position++] = word & 255; + if (position < res.length) { + res[position++] = word >> 8 & 255; + } + if (position < res.length) { + res[position++] = word >> 16 & 255; + } + if (shift === 6) { + if (position < res.length) { + res[position++] = word >> 24 & 255; + } + carry = 0; + shift = 0; + } else { + carry = word >>> 24; + shift += 2; + } + } + if (position < res.length) { + res[position++] = carry; + while (position < res.length) { + res[position++] = 0; + } + } + }; + BN.prototype._toArrayLikeBE = function _toArrayLikeBE(res, byteLength) { + var position = res.length - 1; + var carry = 0; + for (var i = 0, shift = 0; i < this.length; i++) { + var word = this.words[i] << shift | carry; + res[position--] = word & 255; + if (position >= 0) { + res[position--] = word >> 8 & 255; + } + if (position >= 0) { + res[position--] = word >> 16 & 255; + } + if (shift === 6) { + if (position >= 0) { + res[position--] = word >> 24 & 255; + } + carry = 0; + shift = 0; + } else { + carry = word >>> 24; + shift += 2; + } + } + if (position >= 0) { + res[position--] = carry; + while (position >= 0) { + res[position--] = 0; + } + } + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = num.words[off] >>> wbit & 1; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this._strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this._strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this._strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this._strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this._strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this._strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out._strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out._strip(); + } + function jumboMulTo(self2, num, out) { + return bigMulTo(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + var isNegNum = num < 0; + if (isNegNum) num = -num; + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return isNegNum ? this.ineg() : this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this._strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this._strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this._strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) <= num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this._strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this._strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this._strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q._strip(); + } + a._strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modrn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modrn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modrn = function modrn(num) { + var isNegNum = num < 0; + if (isNegNum) num = -num; + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return isNegNum ? -acc : acc; + }; + BN.prototype.modn = function modn(num) { + return this.modrn(num); + }; + BN.prototype.idivn = function idivn(num) { + var isNegNum = num < 0; + if (isNegNum) num = -num; + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + this._strip(); + return isNegNum ? this.ineg() : this; + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this._strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + move(a, a.umod(this.m)._forceRed(this)); + return a; + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn$8); + })(bn$9); + return bn$9.exports; +} +var browserifyRsa; +var hasRequiredBrowserifyRsa; +function requireBrowserifyRsa() { + if (hasRequiredBrowserifyRsa) return browserifyRsa; + hasRequiredBrowserifyRsa = 1; + var BN = requireBn$4(); + var randomBytes = requireBrowser$e(); + function blind(priv) { + var r = getr(priv); + var blinder = r.toRed(BN.mont(priv.modulus)).redPow(new BN(priv.publicExponent)).fromRed(); + return { blinder, unblinder: r.invm(priv.modulus) }; + } + function getr(priv) { + var len = priv.modulus.byteLength(); + var r; + do { + r = new BN(randomBytes(len)); + } while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)); + return r; + } + function crt(msg, priv) { + var blinds = blind(priv); + var len = priv.modulus.byteLength(); + var blinded = new BN(msg).mul(blinds.blinder).umod(priv.modulus); + var c1 = blinded.toRed(BN.mont(priv.prime1)); + var c2 = blinded.toRed(BN.mont(priv.prime2)); + var qinv = priv.coefficient; + var p = priv.prime1; + var q = priv.prime2; + var m1 = c1.redPow(priv.exponent1).fromRed(); + var m2 = c2.redPow(priv.exponent2).fromRed(); + var h = m1.isub(m2).imul(qinv).umod(p).imul(q); + return m2.iadd(h).imul(blinds.unblinder).umod(priv.modulus).toArrayLike(Buffer, "be", len); + } + crt.getr = getr; + browserifyRsa = crt; + return browserifyRsa; +} +var elliptic = {}; +const version$4 = "6.5.4"; +const require$$0$4 = { + version: version$4 +}; +var utils$3 = {}; +var bn$7 = { exports: {} }; +var bn$6 = bn$7.exports; +var hasRequiredBn$3; +function requireBn$3() { + if (hasRequiredBn$3) return bn$7.exports; + hasRequiredBn$3 = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + return c - 48 & 15; + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this.strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + r += c - 49 + 10; + } else if (c >= 17) { + r += c - 17 + 10; + } else { + r += c; + } + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this.strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype.strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + BN.prototype.inspect = function inspect() { + return (this.red ? ""; + }; + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16); + }; + BN.prototype.toBuffer = function toBuffer2(endian, length) { + assert2(typeof Buffer2 !== "undefined"); + return this.toArrayLike(Buffer2, endian, length); + }; + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + this.strip(); + var littleEndian = endian === "le"; + var res = new ArrayType(reqLength); + var b, i; + var q = this.clone(); + if (!littleEndian) { + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[i] = b; + } + for (; i < reqLength; i++) { + res[i] = 0; + } + } + return res; + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = (num.words[off] & 1 << wbit) >>> wbit; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this.strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this.strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this.strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this.strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this.strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this.strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out.strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out.strip(); + } + function jumboMulTo(self2, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + function FFTM(x, y) { + this.x = x; + this.y = y; + } + FFTM.prototype.makeRBT = function makeRBT(N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + return t; + }; + FFTM.prototype.revBin = function revBin(x, l, N) { + if (x === 0 || x === N - 1) return x; + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << l - i - 1; + x >>= 1; + } + return rb; + }; + FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + FFTM.prototype.transform = function transform2(rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + for (var j = 0; j < s; j++) { + var re2 = rtws[p + j]; + var ie = itws[p + j]; + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + var rx = rtwdf_ * ro - itwdf_ * io; + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + rtws[p + j] = re2 + ro; + itws[p + j] = ie + io; + rtws[p + j + s] = re2 - ro; + itws[p + j + s] = ie - io; + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + FFTM.prototype.guessLen13b = function guessLen13b(n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + return 1 << i + 1 + odd; + }; + FFTM.prototype.conjugate = function conjugate(rws, iws, N) { + if (N <= 1) return; + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + t = iws[i]; + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + FFTM.prototype.normalize13b = function normalize13b(ws2, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws2[2 * i + 1] / N) * 8192 + Math.round(ws2[2 * i] / N) + carry; + ws2[i] = w & 67108863; + if (w < 67108864) { + carry = 0; + } else { + carry = w / 67108864 | 0; + } + } + return ws2; + }; + FFTM.prototype.convert13b = function convert13b(ws2, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws2[i] | 0); + rws[2 * i] = carry & 8191; + carry = carry >>> 13; + rws[2 * i + 1] = carry & 8191; + carry = carry >>> 13; + } + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + assert2(carry === 0); + assert2((carry & -8192) === 0); + }; + FFTM.prototype.stub = function stub(N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + return ph; + }; + FFTM.prototype.mulp = function mulp(x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + var rbt = this.makeRBT(N); + var _ = this.stub(N); + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + var rmws = out.words; + rmws.length = N; + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this.strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this.strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this.strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this.strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this.strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this.strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modn = function modn(num) { + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return acc; + }; + BN.prototype.idivn = function idivn(num) { + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + return this.strip(); + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this.strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn$6); + })(bn$7); + return bn$7.exports; +} +var utils$2 = {}; +var hasRequiredUtils$3; +function requireUtils$3() { + if (hasRequiredUtils$3) return utils$2; + hasRequiredUtils$3 = 1; + (function(exports) { + var utils2 = exports; + function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg !== "string") { + for (var i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + return res; + } + if (enc === "hex") { + msg = msg.replace(/[^a-z0-9]+/ig, ""); + if (msg.length % 2 !== 0) + msg = "0" + msg; + for (var i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } else { + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + var hi = c >> 8; + var lo = c & 255; + if (hi) + res.push(hi, lo); + else + res.push(lo); + } + } + return res; + } + utils2.toArray = toArray; + function zero2(word) { + if (word.length === 1) + return "0" + word; + else + return word; + } + utils2.zero2 = zero2; + function toHex(msg) { + var res = ""; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; + } + utils2.toHex = toHex; + utils2.encode = function encode(arr, enc) { + if (enc === "hex") + return toHex(arr); + else + return arr; + }; + })(utils$2); + return utils$2; +} +var hasRequiredUtils$2; +function requireUtils$2() { + if (hasRequiredUtils$2) return utils$3; + hasRequiredUtils$2 = 1; + (function(exports) { + var utils2 = exports; + var BN = requireBn$3(); + var minAssert = requireMinimalisticAssert(); + var minUtils = requireUtils$3(); + utils2.assert = minAssert; + utils2.toArray = minUtils.toArray; + utils2.zero2 = minUtils.zero2; + utils2.toHex = minUtils.toHex; + utils2.encode = minUtils.encode; + function getNAF(num, w, bits) { + var naf = new Array(Math.max(num.bitLength(), bits) + 1); + naf.fill(0); + var ws2 = 1 << w + 1; + var k = num.clone(); + for (var i = 0; i < naf.length; i++) { + var z; + var mod = k.andln(ws2 - 1); + if (k.isOdd()) { + if (mod > (ws2 >> 1) - 1) + z = (ws2 >> 1) - mod; + else + z = mod; + k.isubn(z); + } else { + z = 0; + } + naf[i] = z; + k.iushrn(1); + } + return naf; + } + utils2.getNAF = getNAF; + function getJSF(k1, k2) { + var jsf = [ + [], + [] + ]; + k1 = k1.clone(); + k2 = k2.clone(); + var d1 = 0; + var d2 = 0; + var m8; + while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { + var m14 = k1.andln(3) + d1 & 3; + var m24 = k2.andln(3) + d2 & 3; + if (m14 === 3) + m14 = -1; + if (m24 === 3) + m24 = -1; + var u1; + if ((m14 & 1) === 0) { + u1 = 0; + } else { + m8 = k1.andln(7) + d1 & 7; + if ((m8 === 3 || m8 === 5) && m24 === 2) + u1 = -m14; + else + u1 = m14; + } + jsf[0].push(u1); + var u2; + if ((m24 & 1) === 0) { + u2 = 0; + } else { + m8 = k2.andln(7) + d2 & 7; + if ((m8 === 3 || m8 === 5) && m14 === 2) + u2 = -m24; + else + u2 = m24; + } + jsf[1].push(u2); + if (2 * d1 === u1 + 1) + d1 = 1 - d1; + if (2 * d2 === u2 + 1) + d2 = 1 - d2; + k1.iushrn(1); + k2.iushrn(1); + } + return jsf; + } + utils2.getJSF = getJSF; + function cachedProperty(obj, name, computer) { + var key2 = "_" + name; + obj.prototype[name] = function cachedProperty2() { + return this[key2] !== void 0 ? this[key2] : this[key2] = computer.call(this); + }; + } + utils2.cachedProperty = cachedProperty; + function parseBytes(bytes) { + return typeof bytes === "string" ? utils2.toArray(bytes, "hex") : bytes; + } + utils2.parseBytes = parseBytes; + function intFromLE(bytes) { + return new BN(bytes, "hex", "le"); + } + utils2.intFromLE = intFromLE; + })(utils$3); + return utils$3; +} +var curve = {}; +var base$2; +var hasRequiredBase$1; +function requireBase$1() { + if (hasRequiredBase$1) return base$2; + hasRequiredBase$1 = 1; + var BN = requireBn$3(); + var utils2 = requireUtils$2(); + var getNAF = utils2.getNAF; + var getJSF = utils2.getJSF; + var assert2 = utils2.assert; + function BaseCurve(type2, conf) { + this.type = type2; + this.p = new BN(conf.p, 16); + this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); + this.zero = new BN(0).toRed(this.red); + this.one = new BN(1).toRed(this.red); + this.two = new BN(2).toRed(this.red); + this.n = conf.n && new BN(conf.n, 16); + this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); + this._wnafT1 = new Array(4); + this._wnafT2 = new Array(4); + this._wnafT3 = new Array(4); + this._wnafT4 = new Array(4); + this._bitLength = this.n ? this.n.bitLength() : 0; + var adjustCount = this.n && this.p.div(this.n); + if (!adjustCount || adjustCount.cmpn(100) > 0) { + this.redN = null; + } else { + this._maxwellTrick = true; + this.redN = this.n.toRed(this.red); + } + } + base$2 = BaseCurve; + BaseCurve.prototype.point = function point() { + throw new Error("Not implemented"); + }; + BaseCurve.prototype.validate = function validate() { + throw new Error("Not implemented"); + }; + BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { + assert2(p.precomputed); + var doubles = p._getDoubles(); + var naf = getNAF(k, 1, this._bitLength); + var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1); + I /= 3; + var repr = []; + var j; + var nafW; + for (j = 0; j < naf.length; j += doubles.step) { + nafW = 0; + for (var l = j + doubles.step - 1; l >= j; l--) + nafW = (nafW << 1) + naf[l]; + repr.push(nafW); + } + var a = this.jpoint(null, null, null); + var b = this.jpoint(null, null, null); + for (var i = I; i > 0; i--) { + for (j = 0; j < repr.length; j++) { + nafW = repr[j]; + if (nafW === i) + b = b.mixedAdd(doubles.points[j]); + else if (nafW === -i) + b = b.mixedAdd(doubles.points[j].neg()); + } + a = a.add(b); + } + return a.toP(); + }; + BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { + var w = 4; + var nafPoints = p._getNAFPoints(w); + w = nafPoints.wnd; + var wnd = nafPoints.points; + var naf = getNAF(k, w, this._bitLength); + var acc = this.jpoint(null, null, null); + for (var i = naf.length - 1; i >= 0; i--) { + for (var l = 0; i >= 0 && naf[i] === 0; i--) + l++; + if (i >= 0) + l++; + acc = acc.dblp(l); + if (i < 0) + break; + var z = naf[i]; + assert2(z !== 0); + if (p.type === "affine") { + if (z > 0) + acc = acc.mixedAdd(wnd[z - 1 >> 1]); + else + acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg()); + } else { + if (z > 0) + acc = acc.add(wnd[z - 1 >> 1]); + else + acc = acc.add(wnd[-z - 1 >> 1].neg()); + } + } + return p.type === "affine" ? acc.toP() : acc; + }; + BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) { + var wndWidth = this._wnafT1; + var wnd = this._wnafT2; + var naf = this._wnafT3; + var max2 = 0; + var i; + var j; + var p; + for (i = 0; i < len; i++) { + p = points[i]; + var nafPoints = p._getNAFPoints(defW); + wndWidth[i] = nafPoints.wnd; + wnd[i] = nafPoints.points; + } + for (i = len - 1; i >= 1; i -= 2) { + var a = i - 1; + var b = i; + if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { + naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength); + naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength); + max2 = Math.max(naf[a].length, max2); + max2 = Math.max(naf[b].length, max2); + continue; + } + var comb = [ + points[a], + /* 1 */ + null, + /* 3 */ + null, + /* 5 */ + points[b] + /* 7 */ + ]; + if (points[a].y.cmp(points[b].y) === 0) { + comb[1] = points[a].add(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].add(points[b].neg()); + } else { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } + var index2 = [ + -3, + /* -1 -1 */ + -1, + /* -1 0 */ + -5, + /* -1 1 */ + -7, + /* 0 -1 */ + 0, + /* 0 0 */ + 7, + /* 0 1 */ + 5, + /* 1 -1 */ + 1, + /* 1 0 */ + 3 + /* 1 1 */ + ]; + var jsf = getJSF(coeffs[a], coeffs[b]); + max2 = Math.max(jsf[0].length, max2); + naf[a] = new Array(max2); + naf[b] = new Array(max2); + for (j = 0; j < max2; j++) { + var ja = jsf[0][j] | 0; + var jb = jsf[1][j] | 0; + naf[a][j] = index2[(ja + 1) * 3 + (jb + 1)]; + naf[b][j] = 0; + wnd[a] = comb; + } + } + var acc = this.jpoint(null, null, null); + var tmp = this._wnafT4; + for (i = max2; i >= 0; i--) { + var k = 0; + while (i >= 0) { + var zero = true; + for (j = 0; j < len; j++) { + tmp[j] = naf[j][i] | 0; + if (tmp[j] !== 0) + zero = false; + } + if (!zero) + break; + k++; + i--; + } + if (i >= 0) + k++; + acc = acc.dblp(k); + if (i < 0) + break; + for (j = 0; j < len; j++) { + var z = tmp[j]; + if (z === 0) + continue; + else if (z > 0) + p = wnd[j][z - 1 >> 1]; + else if (z < 0) + p = wnd[j][-z - 1 >> 1].neg(); + if (p.type === "affine") + acc = acc.mixedAdd(p); + else + acc = acc.add(p); + } + } + for (i = 0; i < len; i++) + wnd[i] = null; + if (jacobianResult) + return acc; + else + return acc.toP(); + }; + function BasePoint(curve2, type2) { + this.curve = curve2; + this.type = type2; + this.precomputed = null; + } + BaseCurve.BasePoint = BasePoint; + BasePoint.prototype.eq = function eq() { + throw new Error("Not implemented"); + }; + BasePoint.prototype.validate = function validate() { + return this.curve.validate(this); + }; + BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + bytes = utils2.toArray(bytes, enc); + var len = this.p.byteLength(); + if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) { + if (bytes[0] === 6) + assert2(bytes[bytes.length - 1] % 2 === 0); + else if (bytes[0] === 7) + assert2(bytes[bytes.length - 1] % 2 === 1); + var res = this.point( + bytes.slice(1, 1 + len), + bytes.slice(1 + len, 1 + 2 * len) + ); + return res; + } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) { + return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3); + } + throw new Error("Unknown point format"); + }; + BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { + return this.encode(enc, true); + }; + BasePoint.prototype._encode = function _encode(compact) { + var len = this.curve.p.byteLength(); + var x = this.getX().toArray("be", len); + if (compact) + return [this.getY().isEven() ? 2 : 3].concat(x); + return [4].concat(x, this.getY().toArray("be", len)); + }; + BasePoint.prototype.encode = function encode(enc, compact) { + return utils2.encode(this._encode(compact), enc); + }; + BasePoint.prototype.precompute = function precompute(power) { + if (this.precomputed) + return this; + var precomputed = { + doubles: null, + naf: null, + beta: null + }; + precomputed.naf = this._getNAFPoints(8); + precomputed.doubles = this._getDoubles(4, power); + precomputed.beta = this._getBeta(); + this.precomputed = precomputed; + return this; + }; + BasePoint.prototype._hasDoubles = function _hasDoubles(k) { + if (!this.precomputed) + return false; + var doubles = this.precomputed.doubles; + if (!doubles) + return false; + return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); + }; + BasePoint.prototype._getDoubles = function _getDoubles(step, power) { + if (this.precomputed && this.precomputed.doubles) + return this.precomputed.doubles; + var doubles = [this]; + var acc = this; + for (var i = 0; i < power; i += step) { + for (var j = 0; j < step; j++) + acc = acc.dbl(); + doubles.push(acc); + } + return { + step, + points: doubles + }; + }; + BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { + if (this.precomputed && this.precomputed.naf) + return this.precomputed.naf; + var res = [this]; + var max2 = (1 << wnd) - 1; + var dbl = max2 === 1 ? null : this.dbl(); + for (var i = 1; i < max2; i++) + res[i] = res[i - 1].add(dbl); + return { + wnd, + points: res + }; + }; + BasePoint.prototype._getBeta = function _getBeta() { + return null; + }; + BasePoint.prototype.dblp = function dblp(k) { + var r = this; + for (var i = 0; i < k; i++) + r = r.dbl(); + return r; + }; + return base$2; +} +var short; +var hasRequiredShort; +function requireShort() { + if (hasRequiredShort) return short; + hasRequiredShort = 1; + var utils2 = requireUtils$2(); + var BN = requireBn$3(); + var inherits = requireInherits_browser$1(); + var Base = requireBase$1(); + var assert2 = utils2.assert; + function ShortCurve(conf) { + Base.call(this, "short", conf); + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.tinv = this.two.redInvm(); + this.zeroA = this.a.fromRed().cmpn(0) === 0; + this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; + this.endo = this._getEndomorphism(conf); + this._endoWnafT1 = new Array(4); + this._endoWnafT2 = new Array(4); + } + inherits(ShortCurve, Base); + short = ShortCurve; + ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { + if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) + return; + var beta; + var lambda; + if (conf.beta) { + beta = new BN(conf.beta, 16).toRed(this.red); + } else { + var betas = this._getEndoRoots(this.p); + beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; + beta = beta.toRed(this.red); + } + if (conf.lambda) { + lambda = new BN(conf.lambda, 16); + } else { + var lambdas = this._getEndoRoots(this.n); + if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { + lambda = lambdas[0]; + } else { + lambda = lambdas[1]; + assert2(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); + } + } + var basis; + if (conf.basis) { + basis = conf.basis.map(function(vec) { + return { + a: new BN(vec.a, 16), + b: new BN(vec.b, 16) + }; + }); + } else { + basis = this._getEndoBasis(lambda); + } + return { + beta, + lambda, + basis + }; + }; + ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { + var red = num === this.p ? this.red : BN.mont(num); + var tinv = new BN(2).toRed(red).redInvm(); + var ntinv = tinv.redNeg(); + var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); + var l1 = ntinv.redAdd(s).fromRed(); + var l2 = ntinv.redSub(s).fromRed(); + return [l1, l2]; + }; + ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { + var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); + var u = lambda; + var v = this.n.clone(); + var x1 = new BN(1); + var y1 = new BN(0); + var x2 = new BN(0); + var y2 = new BN(1); + var a0; + var b0; + var a1; + var b1; + var a2; + var b2; + var prevR; + var i = 0; + var r; + var x; + while (u.cmpn(0) !== 0) { + var q = v.div(u); + r = v.sub(q.mul(u)); + x = x2.sub(q.mul(x1)); + var y = y2.sub(q.mul(y1)); + if (!a1 && r.cmp(aprxSqrt) < 0) { + a0 = prevR.neg(); + b0 = x1; + a1 = r.neg(); + b1 = x; + } else if (a1 && ++i === 2) { + break; + } + prevR = r; + v = u; + u = r; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + a2 = r.neg(); + b2 = x; + var len1 = a1.sqr().add(b1.sqr()); + var len2 = a2.sqr().add(b2.sqr()); + if (len2.cmp(len1) >= 0) { + a2 = a0; + b2 = b0; + } + if (a1.negative) { + a1 = a1.neg(); + b1 = b1.neg(); + } + if (a2.negative) { + a2 = a2.neg(); + b2 = b2.neg(); + } + return [ + { a: a1, b: b1 }, + { a: a2, b: b2 } + ]; + }; + ShortCurve.prototype._endoSplit = function _endoSplit(k) { + var basis = this.endo.basis; + var v1 = basis[0]; + var v2 = basis[1]; + var c1 = v2.b.mul(k).divRound(this.n); + var c2 = v1.b.neg().mul(k).divRound(this.n); + var p1 = c1.mul(v1.a); + var p2 = c2.mul(v2.a); + var q1 = c1.mul(v1.b); + var q2 = c2.mul(v2.b); + var k1 = k.sub(p1).sub(p2); + var k2 = q1.add(q2).neg(); + return { k1, k2 }; + }; + ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); + var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error("invalid point"); + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + return this.point(x, y); + }; + ShortCurve.prototype.validate = function validate(point) { + if (point.inf) + return true; + var x = point.x; + var y = point.y; + var ax = this.a.redMul(x); + var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); + return y.redSqr().redISub(rhs).cmpn(0) === 0; + }; + ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) { + var npoints = this._endoWnafT1; + var ncoeffs = this._endoWnafT2; + for (var i = 0; i < points.length; i++) { + var split = this._endoSplit(coeffs[i]); + var p = points[i]; + var beta = p._getBeta(); + if (split.k1.negative) { + split.k1.ineg(); + p = p.neg(true); + } + if (split.k2.negative) { + split.k2.ineg(); + beta = beta.neg(true); + } + npoints[i * 2] = p; + npoints[i * 2 + 1] = beta; + ncoeffs[i * 2] = split.k1; + ncoeffs[i * 2 + 1] = split.k2; + } + var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); + for (var j = 0; j < i * 2; j++) { + npoints[j] = null; + ncoeffs[j] = null; + } + return res; + }; + function Point(curve2, x, y, isRed) { + Base.BasePoint.call(this, curve2, "affine"); + if (x === null && y === null) { + this.x = null; + this.y = null; + this.inf = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + if (isRed) { + this.x.forceRed(this.curve.red); + this.y.forceRed(this.curve.red); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + this.inf = false; + } + } + inherits(Point, Base.BasePoint); + ShortCurve.prototype.point = function point(x, y, isRed) { + return new Point(this, x, y, isRed); + }; + ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { + return Point.fromJSON(this, obj, red); + }; + Point.prototype._getBeta = function _getBeta() { + if (!this.curve.endo) + return; + var pre = this.precomputed; + if (pre && pre.beta) + return pre.beta; + var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); + if (pre) { + var curve2 = this.curve; + var endoMul = function(p) { + return curve2.point(p.x.redMul(curve2.endo.beta), p.y); + }; + pre.beta = beta; + beta.precomputed = { + beta: null, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(endoMul) + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(endoMul) + } + }; + } + return beta; + }; + Point.prototype.toJSON = function toJSON() { + if (!this.precomputed) + return [this.x, this.y]; + return [this.x, this.y, this.precomputed && { + doubles: this.precomputed.doubles && { + step: this.precomputed.doubles.step, + points: this.precomputed.doubles.points.slice(1) + }, + naf: this.precomputed.naf && { + wnd: this.precomputed.naf.wnd, + points: this.precomputed.naf.points.slice(1) + } + }]; + }; + Point.fromJSON = function fromJSON(curve2, obj, red) { + if (typeof obj === "string") + obj = JSON.parse(obj); + var res = curve2.point(obj[0], obj[1], red); + if (!obj[2]) + return res; + function obj2point(obj2) { + return curve2.point(obj2[0], obj2[1], red); + } + var pre = obj[2]; + res.precomputed = { + beta: null, + doubles: pre.doubles && { + step: pre.doubles.step, + points: [res].concat(pre.doubles.points.map(obj2point)) + }, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: [res].concat(pre.naf.points.map(obj2point)) + } + }; + return res; + }; + Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ""; + return ""; + }; + Point.prototype.isInfinity = function isInfinity() { + return this.inf; + }; + Point.prototype.add = function add(p) { + if (this.inf) + return p; + if (p.inf) + return this; + if (this.eq(p)) + return this.dbl(); + if (this.neg().eq(p)) + return this.curve.point(null, null); + if (this.x.cmp(p.x) === 0) + return this.curve.point(null, null); + var c = this.y.redSub(p.y); + if (c.cmpn(0) !== 0) + c = c.redMul(this.x.redSub(p.x).redInvm()); + var nx = c.redSqr().redISub(this.x).redISub(p.x); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); + }; + Point.prototype.dbl = function dbl() { + if (this.inf) + return this; + var ys1 = this.y.redAdd(this.y); + if (ys1.cmpn(0) === 0) + return this.curve.point(null, null); + var a = this.curve.a; + var x2 = this.x.redSqr(); + var dyinv = ys1.redInvm(); + var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); + var nx = c.redSqr().redISub(this.x.redAdd(this.x)); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); + }; + Point.prototype.getX = function getX() { + return this.x.fromRed(); + }; + Point.prototype.getY = function getY() { + return this.y.fromRed(); + }; + Point.prototype.mul = function mul(k) { + k = new BN(k, 16); + if (this.isInfinity()) + return this; + else if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else if (this.curve.endo) + return this.curve._endoWnafMulAdd([this], [k]); + else + return this.curve._wnafMul(this, k); + }; + Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { + var points = [this, p2]; + var coeffs = [k1, k2]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2); + }; + Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { + var points = [this, p2]; + var coeffs = [k1, k2]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs, true); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2, true); + }; + Point.prototype.eq = function eq(p) { + return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); + }; + Point.prototype.neg = function neg(_precompute) { + if (this.inf) + return this; + var res = this.curve.point(this.x, this.y.redNeg()); + if (_precompute && this.precomputed) { + var pre = this.precomputed; + var negate = function(p) { + return p.neg(); + }; + res.precomputed = { + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(negate) + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(negate) + } + }; + } + return res; + }; + Point.prototype.toJ = function toJ() { + if (this.inf) + return this.curve.jpoint(null, null, null); + var res = this.curve.jpoint(this.x, this.y, this.curve.one); + return res; + }; + function JPoint(curve2, x, y, z) { + Base.BasePoint.call(this, curve2, "jacobian"); + if (x === null && y === null && z === null) { + this.x = this.curve.one; + this.y = this.curve.one; + this.z = new BN(0); + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = new BN(z, 16); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + this.zOne = this.z === this.curve.one; + } + inherits(JPoint, Base.BasePoint); + ShortCurve.prototype.jpoint = function jpoint(x, y, z) { + return new JPoint(this, x, y, z); + }; + JPoint.prototype.toP = function toP() { + if (this.isInfinity()) + return this.curve.point(null, null); + var zinv = this.z.redInvm(); + var zinv2 = zinv.redSqr(); + var ax = this.x.redMul(zinv2); + var ay = this.y.redMul(zinv2).redMul(zinv); + return this.curve.point(ax, ay); + }; + JPoint.prototype.neg = function neg() { + return this.curve.jpoint(this.x, this.y.redNeg(), this.z); + }; + JPoint.prototype.add = function add(p) { + if (this.isInfinity()) + return p; + if (p.isInfinity()) + return this; + var pz2 = p.z.redSqr(); + var z2 = this.z.redSqr(); + var u1 = this.x.redMul(pz2); + var u2 = p.x.redMul(z2); + var s1 = this.y.redMul(pz2.redMul(p.z)); + var s2 = p.y.redMul(z2.redMul(this.z)); + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(p.z).redMul(h); + return this.curve.jpoint(nx, ny, nz); + }; + JPoint.prototype.mixedAdd = function mixedAdd(p) { + if (this.isInfinity()) + return p.toJ(); + if (p.isInfinity()) + return this; + var z2 = this.z.redSqr(); + var u1 = this.x; + var u2 = p.x.redMul(z2); + var s1 = this.y; + var s2 = p.y.redMul(z2).redMul(this.z); + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(h); + return this.curve.jpoint(nx, ny, nz); + }; + JPoint.prototype.dblp = function dblp(pow2) { + if (pow2 === 0) + return this; + if (this.isInfinity()) + return this; + if (!pow2) + return this.dbl(); + var i; + if (this.curve.zeroA || this.curve.threeA) { + var r = this; + for (i = 0; i < pow2; i++) + r = r.dbl(); + return r; + } + var a = this.curve.a; + var tinv = this.curve.tinv; + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + var jyd = jy.redAdd(jy); + for (i = 0; i < pow2; i++) { + var jx2 = jx.redSqr(); + var jyd2 = jyd.redSqr(); + var jyd4 = jyd2.redSqr(); + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + var t1 = jx.redMul(jyd2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + var dny = c.redMul(t2); + dny = dny.redIAdd(dny).redISub(jyd4); + var nz = jyd.redMul(jz); + if (i + 1 < pow2) + jz4 = jz4.redMul(jyd4); + jx = nx; + jz = nz; + jyd = dny; + } + return this.curve.jpoint(jx, jyd.redMul(tinv), jz); + }; + JPoint.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + if (this.curve.zeroA) + return this._zeroDbl(); + else if (this.curve.threeA) + return this._threeDbl(); + else + return this._dbl(); + }; + JPoint.prototype._zeroDbl = function _zeroDbl() { + var nx; + var ny; + var nz; + if (this.zOne) { + var xx = this.x.redSqr(); + var yy = this.y.redSqr(); + var yyyy = yy.redSqr(); + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + var m = xx.redAdd(xx).redIAdd(xx); + var t = m.redSqr().redISub(s).redISub(s); + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + nx = t; + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + nz = this.y.redAdd(this.y); + } else { + var a = this.x.redSqr(); + var b = this.y.redSqr(); + var c = b.redSqr(); + var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); + d = d.redIAdd(d); + var e = a.redAdd(a).redIAdd(a); + var f = e.redSqr(); + var c8 = c.redIAdd(c); + c8 = c8.redIAdd(c8); + c8 = c8.redIAdd(c8); + nx = f.redISub(d).redISub(d); + ny = e.redMul(d.redISub(nx)).redISub(c8); + nz = this.y.redMul(this.z); + nz = nz.redIAdd(nz); + } + return this.curve.jpoint(nx, ny, nz); + }; + JPoint.prototype._threeDbl = function _threeDbl() { + var nx; + var ny; + var nz; + if (this.zOne) { + var xx = this.x.redSqr(); + var yy = this.y.redSqr(); + var yyyy = yy.redSqr(); + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); + var t = m.redSqr().redISub(s).redISub(s); + nx = t; + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + nz = this.y.redAdd(this.y); + } else { + var delta = this.z.redSqr(); + var gamma = this.y.redSqr(); + var beta = this.x.redMul(gamma); + var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); + alpha = alpha.redAdd(alpha).redIAdd(alpha); + var beta4 = beta.redIAdd(beta); + beta4 = beta4.redIAdd(beta4); + var beta8 = beta4.redAdd(beta4); + nx = alpha.redSqr().redISub(beta8); + nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); + var ggamma8 = gamma.redSqr(); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); + } + return this.curve.jpoint(nx, ny, nz); + }; + JPoint.prototype._dbl = function _dbl() { + var a = this.curve.a; + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + var jx2 = jx.redSqr(); + var jy2 = jy.redSqr(); + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + var jxd4 = jx.redAdd(jx); + jxd4 = jxd4.redIAdd(jxd4); + var t1 = jxd4.redMul(jy2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + var jyd8 = jy2.redSqr(); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + var ny = c.redMul(t2).redISub(jyd8); + var nz = jy.redAdd(jy).redMul(jz); + return this.curve.jpoint(nx, ny, nz); + }; + JPoint.prototype.trpl = function trpl() { + if (!this.curve.zeroA) + return this.dbl().add(this); + var xx = this.x.redSqr(); + var yy = this.y.redSqr(); + var zz = this.z.redSqr(); + var yyyy = yy.redSqr(); + var m = xx.redAdd(xx).redIAdd(xx); + var mm = m.redSqr(); + var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + e = e.redIAdd(e); + e = e.redAdd(e).redIAdd(e); + e = e.redISub(mm); + var ee = e.redSqr(); + var t = yyyy.redIAdd(yyyy); + t = t.redIAdd(t); + t = t.redIAdd(t); + t = t.redIAdd(t); + var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); + var yyu4 = yy.redMul(u); + yyu4 = yyu4.redIAdd(yyu4); + yyu4 = yyu4.redIAdd(yyu4); + var nx = this.x.redMul(ee).redISub(yyu4); + nx = nx.redIAdd(nx); + nx = nx.redIAdd(nx); + var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); + return this.curve.jpoint(nx, ny, nz); + }; + JPoint.prototype.mul = function mul(k, kbase) { + k = new BN(k, kbase); + return this.curve._wnafMul(this, k); + }; + JPoint.prototype.eq = function eq(p) { + if (p.type === "affine") + return this.eq(p.toJ()); + if (this === p) + return true; + var z2 = this.z.redSqr(); + var pz2 = p.z.redSqr(); + if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) + return false; + var z3 = z2.redMul(this.z); + var pz3 = pz2.redMul(p.z); + return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; + }; + JPoint.prototype.eqXToP = function eqXToP(x) { + var zs = this.z.redSqr(); + var rx = x.toRed(this.curve.red).redMul(zs); + if (this.x.cmp(rx) === 0) + return true; + var xc = x.clone(); + var t = this.curve.redN.redMul(zs); + for (; ; ) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } + }; + JPoint.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ""; + return ""; + }; + JPoint.prototype.isInfinity = function isInfinity() { + return this.z.cmpn(0) === 0; + }; + return short; +} +var mont; +var hasRequiredMont; +function requireMont() { + if (hasRequiredMont) return mont; + hasRequiredMont = 1; + var BN = requireBn$3(); + var inherits = requireInherits_browser$1(); + var Base = requireBase$1(); + var utils2 = requireUtils$2(); + function MontCurve(conf) { + Base.call(this, "mont", conf); + this.a = new BN(conf.a, 16).toRed(this.red); + this.b = new BN(conf.b, 16).toRed(this.red); + this.i4 = new BN(4).toRed(this.red).redInvm(); + this.two = new BN(2).toRed(this.red); + this.a24 = this.i4.redMul(this.a.redAdd(this.two)); + } + inherits(MontCurve, Base); + mont = MontCurve; + MontCurve.prototype.validate = function validate(point) { + var x = point.normalize().x; + var x2 = x.redSqr(); + var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); + var y = rhs.redSqrt(); + return y.redSqr().cmp(rhs) === 0; + }; + function Point(curve2, x, z) { + Base.BasePoint.call(this, curve2, "projective"); + if (x === null && z === null) { + this.x = this.curve.one; + this.z = this.curve.zero; + } else { + this.x = new BN(x, 16); + this.z = new BN(z, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + } + } + inherits(Point, Base.BasePoint); + MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + return this.point(utils2.toArray(bytes, enc), 1); + }; + MontCurve.prototype.point = function point(x, z) { + return new Point(this, x, z); + }; + MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); + }; + Point.prototype.precompute = function precompute() { + }; + Point.prototype._encode = function _encode() { + return this.getX().toArray("be", this.curve.p.byteLength()); + }; + Point.fromJSON = function fromJSON(curve2, obj) { + return new Point(curve2, obj[0], obj[1] || curve2.one); + }; + Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ""; + return ""; + }; + Point.prototype.isInfinity = function isInfinity() { + return this.z.cmpn(0) === 0; + }; + Point.prototype.dbl = function dbl() { + var a = this.x.redAdd(this.z); + var aa = a.redSqr(); + var b = this.x.redSub(this.z); + var bb = b.redSqr(); + var c = aa.redSub(bb); + var nx = aa.redMul(bb); + var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); + return this.curve.point(nx, nz); + }; + Point.prototype.add = function add() { + throw new Error("Not supported on Montgomery curve"); + }; + Point.prototype.diffAdd = function diffAdd(p, diff3) { + var a = this.x.redAdd(this.z); + var b = this.x.redSub(this.z); + var c = p.x.redAdd(p.z); + var d = p.x.redSub(p.z); + var da = d.redMul(a); + var cb = c.redMul(b); + var nx = diff3.z.redMul(da.redAdd(cb).redSqr()); + var nz = diff3.x.redMul(da.redISub(cb).redSqr()); + return this.curve.point(nx, nz); + }; + Point.prototype.mul = function mul(k) { + var t = k.clone(); + var a = this; + var b = this.curve.point(null, null); + var c = this; + for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) + bits.push(t.andln(1)); + for (var i = bits.length - 1; i >= 0; i--) { + if (bits[i] === 0) { + a = a.diffAdd(b, c); + b = b.dbl(); + } else { + b = a.diffAdd(b, c); + a = a.dbl(); + } + } + return b; + }; + Point.prototype.mulAdd = function mulAdd() { + throw new Error("Not supported on Montgomery curve"); + }; + Point.prototype.jumlAdd = function jumlAdd() { + throw new Error("Not supported on Montgomery curve"); + }; + Point.prototype.eq = function eq(other2) { + return this.getX().cmp(other2.getX()) === 0; + }; + Point.prototype.normalize = function normalize() { + this.x = this.x.redMul(this.z.redInvm()); + this.z = this.curve.one; + return this; + }; + Point.prototype.getX = function getX() { + this.normalize(); + return this.x.fromRed(); + }; + return mont; +} +var edwards; +var hasRequiredEdwards; +function requireEdwards() { + if (hasRequiredEdwards) return edwards; + hasRequiredEdwards = 1; + var utils2 = requireUtils$2(); + var BN = requireBn$3(); + var inherits = requireInherits_browser$1(); + var Base = requireBase$1(); + var assert2 = utils2.assert; + function EdwardsCurve(conf) { + this.twisted = (conf.a | 0) !== 1; + this.mOneA = this.twisted && (conf.a | 0) === -1; + this.extended = this.mOneA; + Base.call(this, "edwards", conf); + this.a = new BN(conf.a, 16).umod(this.red.m); + this.a = this.a.toRed(this.red); + this.c = new BN(conf.c, 16).toRed(this.red); + this.c2 = this.c.redSqr(); + this.d = new BN(conf.d, 16).toRed(this.red); + this.dd = this.d.redAdd(this.d); + assert2(!this.twisted || this.c.fromRed().cmpn(1) === 0); + this.oneC = (conf.c | 0) === 1; + } + inherits(EdwardsCurve, Base); + edwards = EdwardsCurve; + EdwardsCurve.prototype._mulA = function _mulA(num) { + if (this.mOneA) + return num.redNeg(); + else + return this.a.redMul(num); + }; + EdwardsCurve.prototype._mulC = function _mulC(num) { + if (this.oneC) + return num; + else + return this.c.redMul(num); + }; + EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { + return this.point(x, y, z, t); + }; + EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new BN(x, 16); + if (!x.red) + x = x.toRed(this.red); + var x2 = x.redSqr(); + var rhs = this.c2.redSub(this.a.redMul(x2)); + var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); + var y2 = rhs.redMul(lhs.redInvm()); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error("invalid point"); + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + return this.point(x, y); + }; + EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { + y = new BN(y, 16); + if (!y.red) + y = y.toRed(this.red); + var y2 = y.redSqr(); + var lhs = y2.redSub(this.c2); + var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); + var x2 = lhs.redMul(rhs.redInvm()); + if (x2.cmp(this.zero) === 0) { + if (odd) + throw new Error("invalid point"); + else + return this.point(this.zero, y); + } + var x = x2.redSqrt(); + if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) + throw new Error("invalid point"); + if (x.fromRed().isOdd() !== odd) + x = x.redNeg(); + return this.point(x, y); + }; + EdwardsCurve.prototype.validate = function validate(point) { + if (point.isInfinity()) + return true; + point.normalize(); + var x2 = point.x.redSqr(); + var y2 = point.y.redSqr(); + var lhs = x2.redMul(this.a).redAdd(y2); + var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); + return lhs.cmp(rhs) === 0; + }; + function Point(curve2, x, y, z, t) { + Base.BasePoint.call(this, curve2, "projective"); + if (x === null && y === null && z === null) { + this.x = this.curve.zero; + this.y = this.curve.one; + this.z = this.curve.one; + this.t = this.curve.zero; + this.zOne = true; + } else { + this.x = new BN(x, 16); + this.y = new BN(y, 16); + this.z = z ? new BN(z, 16) : this.curve.one; + this.t = t && new BN(t, 16); + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + if (this.t && !this.t.red) + this.t = this.t.toRed(this.curve.red); + this.zOne = this.z === this.curve.one; + if (this.curve.extended && !this.t) { + this.t = this.x.redMul(this.y); + if (!this.zOne) + this.t = this.t.redMul(this.z.redInvm()); + } + } + } + inherits(Point, Base.BasePoint); + EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { + return Point.fromJSON(this, obj); + }; + EdwardsCurve.prototype.point = function point(x, y, z, t) { + return new Point(this, x, y, z, t); + }; + Point.fromJSON = function fromJSON(curve2, obj) { + return new Point(curve2, obj[0], obj[1], obj[2]); + }; + Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return ""; + return ""; + }; + Point.prototype.isInfinity = function isInfinity() { + return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0); + }; + Point.prototype._extDbl = function _extDbl() { + var a = this.x.redSqr(); + var b = this.y.redSqr(); + var c = this.z.redSqr(); + c = c.redIAdd(c); + var d = this.curve._mulA(a); + var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); + var g = d.redAdd(b); + var f = g.redSub(c); + var h = d.redSub(b); + var nx = e.redMul(f); + var ny = g.redMul(h); + var nt = e.redMul(h); + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); + }; + Point.prototype._projDbl = function _projDbl() { + var b = this.x.redAdd(this.y).redSqr(); + var c = this.x.redSqr(); + var d = this.y.redSqr(); + var nx; + var ny; + var nz; + var e; + var h; + var j; + if (this.curve.twisted) { + e = this.curve._mulA(c); + var f = e.redAdd(d); + if (this.zOne) { + nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); + ny = f.redMul(e.redSub(d)); + nz = f.redSqr().redSub(f).redSub(f); + } else { + h = this.z.redSqr(); + j = f.redSub(h).redISub(h); + nx = b.redSub(c).redISub(d).redMul(j); + ny = f.redMul(e.redSub(d)); + nz = f.redMul(j); + } + } else { + e = c.redAdd(d); + h = this.curve._mulC(this.z).redSqr(); + j = e.redSub(h).redSub(h); + nx = this.curve._mulC(b.redISub(e)).redMul(j); + ny = this.curve._mulC(e).redMul(c.redISub(d)); + nz = e.redMul(j); + } + return this.curve.point(nx, ny, nz); + }; + Point.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + if (this.curve.extended) + return this._extDbl(); + else + return this._projDbl(); + }; + Point.prototype._extAdd = function _extAdd(p) { + var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); + var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); + var c = this.t.redMul(this.curve.dd).redMul(p.t); + var d = this.z.redMul(p.z.redAdd(p.z)); + var e = b.redSub(a); + var f = d.redSub(c); + var g = d.redAdd(c); + var h = b.redAdd(a); + var nx = e.redMul(f); + var ny = g.redMul(h); + var nt = e.redMul(h); + var nz = f.redMul(g); + return this.curve.point(nx, ny, nz, nt); + }; + Point.prototype._projAdd = function _projAdd(p) { + var a = this.z.redMul(p.z); + var b = a.redSqr(); + var c = this.x.redMul(p.x); + var d = this.y.redMul(p.y); + var e = this.curve.d.redMul(c).redMul(d); + var f = b.redSub(e); + var g = b.redAdd(e); + var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); + var nx = a.redMul(f).redMul(tmp); + var ny; + var nz; + if (this.curve.twisted) { + ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); + nz = f.redMul(g); + } else { + ny = a.redMul(g).redMul(d.redSub(c)); + nz = this.curve._mulC(f).redMul(g); + } + return this.curve.point(nx, ny, nz); + }; + Point.prototype.add = function add(p) { + if (this.isInfinity()) + return p; + if (p.isInfinity()) + return this; + if (this.curve.extended) + return this._extAdd(p); + else + return this._projAdd(p); + }; + Point.prototype.mul = function mul(k) { + if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else + return this.curve._wnafMul(this, k); + }; + Point.prototype.mulAdd = function mulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false); + }; + Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { + return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true); + }; + Point.prototype.normalize = function normalize() { + if (this.zOne) + return this; + var zi = this.z.redInvm(); + this.x = this.x.redMul(zi); + this.y = this.y.redMul(zi); + if (this.t) + this.t = this.t.redMul(zi); + this.z = this.curve.one; + this.zOne = true; + return this; + }; + Point.prototype.neg = function neg() { + return this.curve.point( + this.x.redNeg(), + this.y, + this.z, + this.t && this.t.redNeg() + ); + }; + Point.prototype.getX = function getX() { + this.normalize(); + return this.x.fromRed(); + }; + Point.prototype.getY = function getY() { + this.normalize(); + return this.y.fromRed(); + }; + Point.prototype.eq = function eq(other2) { + return this === other2 || this.getX().cmp(other2.getX()) === 0 && this.getY().cmp(other2.getY()) === 0; + }; + Point.prototype.eqXToP = function eqXToP(x) { + var rx = x.toRed(this.curve.red).redMul(this.z); + if (this.x.cmp(rx) === 0) + return true; + var xc = x.clone(); + var t = this.curve.redN.redMul(this.z); + for (; ; ) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } + }; + Point.prototype.toP = Point.prototype.normalize; + Point.prototype.mixedAdd = Point.prototype.add; + return edwards; +} +var hasRequiredCurve; +function requireCurve() { + if (hasRequiredCurve) return curve; + hasRequiredCurve = 1; + (function(exports) { + var curve2 = exports; + curve2.base = requireBase$1(); + curve2.short = requireShort(); + curve2.mont = requireMont(); + curve2.edwards = requireEdwards(); + })(curve); + return curve; +} +var curves = {}; +var hash = {}; +var utils$1 = {}; +var hasRequiredUtils$1; +function requireUtils$1() { + if (hasRequiredUtils$1) return utils$1; + hasRequiredUtils$1 = 1; + var assert2 = requireMinimalisticAssert(); + var inherits = requireInherits_browser$1(); + utils$1.inherits = inherits; + function isSurrogatePair(msg, i) { + if ((msg.charCodeAt(i) & 64512) !== 55296) { + return false; + } + if (i < 0 || i + 1 >= msg.length) { + return false; + } + return (msg.charCodeAt(i + 1) & 64512) === 56320; + } + function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg === "string") { + if (!enc) { + var p = 0; + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + if (c < 128) { + res[p++] = c; + } else if (c < 2048) { + res[p++] = c >> 6 | 192; + res[p++] = c & 63 | 128; + } else if (isSurrogatePair(msg, i)) { + c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023); + res[p++] = c >> 18 | 240; + res[p++] = c >> 12 & 63 | 128; + res[p++] = c >> 6 & 63 | 128; + res[p++] = c & 63 | 128; + } else { + res[p++] = c >> 12 | 224; + res[p++] = c >> 6 & 63 | 128; + res[p++] = c & 63 | 128; + } + } + } else if (enc === "hex") { + msg = msg.replace(/[^a-z0-9]+/ig, ""); + if (msg.length % 2 !== 0) + msg = "0" + msg; + for (i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } + } else { + for (i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + } + return res; + } + utils$1.toArray = toArray; + function toHex(msg) { + var res = ""; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; + } + utils$1.toHex = toHex; + function htonl(w) { + var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24; + return res >>> 0; + } + utils$1.htonl = htonl; + function toHex32(msg, endian) { + var res = ""; + for (var i = 0; i < msg.length; i++) { + var w = msg[i]; + if (endian === "little") + w = htonl(w); + res += zero8(w.toString(16)); + } + return res; + } + utils$1.toHex32 = toHex32; + function zero2(word) { + if (word.length === 1) + return "0" + word; + else + return word; + } + utils$1.zero2 = zero2; + function zero8(word) { + if (word.length === 7) + return "0" + word; + else if (word.length === 6) + return "00" + word; + else if (word.length === 5) + return "000" + word; + else if (word.length === 4) + return "0000" + word; + else if (word.length === 3) + return "00000" + word; + else if (word.length === 2) + return "000000" + word; + else if (word.length === 1) + return "0000000" + word; + else + return word; + } + utils$1.zero8 = zero8; + function join32(msg, start, end, endian) { + var len = end - start; + assert2(len % 4 === 0); + var res = new Array(len / 4); + for (var i = 0, k = start; i < res.length; i++, k += 4) { + var w; + if (endian === "big") + w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3]; + else + w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k]; + res[i] = w >>> 0; + } + return res; + } + utils$1.join32 = join32; + function split32(msg, endian) { + var res = new Array(msg.length * 4); + for (var i = 0, k = 0; i < msg.length; i++, k += 4) { + var m = msg[i]; + if (endian === "big") { + res[k] = m >>> 24; + res[k + 1] = m >>> 16 & 255; + res[k + 2] = m >>> 8 & 255; + res[k + 3] = m & 255; + } else { + res[k + 3] = m >>> 24; + res[k + 2] = m >>> 16 & 255; + res[k + 1] = m >>> 8 & 255; + res[k] = m & 255; + } + } + return res; + } + utils$1.split32 = split32; + function rotr32(w, b) { + return w >>> b | w << 32 - b; + } + utils$1.rotr32 = rotr32; + function rotl32(w, b) { + return w << b | w >>> 32 - b; + } + utils$1.rotl32 = rotl32; + function sum32(a, b) { + return a + b >>> 0; + } + utils$1.sum32 = sum32; + function sum32_3(a, b, c) { + return a + b + c >>> 0; + } + utils$1.sum32_3 = sum32_3; + function sum32_4(a, b, c, d) { + return a + b + c + d >>> 0; + } + utils$1.sum32_4 = sum32_4; + function sum32_5(a, b, c, d, e) { + return a + b + c + d + e >>> 0; + } + utils$1.sum32_5 = sum32_5; + function sum64(buf, pos, ah, al) { + var bh = buf[pos]; + var bl = buf[pos + 1]; + var lo = al + bl >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + buf[pos] = hi >>> 0; + buf[pos + 1] = lo; + } + utils$1.sum64 = sum64; + function sum64_hi(ah, al, bh, bl) { + var lo = al + bl >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + return hi >>> 0; + } + utils$1.sum64_hi = sum64_hi; + function sum64_lo(ah, al, bh, bl) { + var lo = al + bl; + return lo >>> 0; + } + utils$1.sum64_lo = sum64_lo; + function sum64_4_hi(ah, al, bh, bl, ch, cl, dh2, dl) { + var carry = 0; + var lo = al; + lo = lo + bl >>> 0; + carry += lo < al ? 1 : 0; + lo = lo + cl >>> 0; + carry += lo < cl ? 1 : 0; + lo = lo + dl >>> 0; + carry += lo < dl ? 1 : 0; + var hi = ah + bh + ch + dh2 + carry; + return hi >>> 0; + } + utils$1.sum64_4_hi = sum64_4_hi; + function sum64_4_lo(ah, al, bh, bl, ch, cl, dh2, dl) { + var lo = al + bl + cl + dl; + return lo >>> 0; + } + utils$1.sum64_4_lo = sum64_4_lo; + function sum64_5_hi(ah, al, bh, bl, ch, cl, dh2, dl, eh, el) { + var carry = 0; + var lo = al; + lo = lo + bl >>> 0; + carry += lo < al ? 1 : 0; + lo = lo + cl >>> 0; + carry += lo < cl ? 1 : 0; + lo = lo + dl >>> 0; + carry += lo < dl ? 1 : 0; + lo = lo + el >>> 0; + carry += lo < el ? 1 : 0; + var hi = ah + bh + ch + dh2 + eh + carry; + return hi >>> 0; + } + utils$1.sum64_5_hi = sum64_5_hi; + function sum64_5_lo(ah, al, bh, bl, ch, cl, dh2, dl, eh, el) { + var lo = al + bl + cl + dl + el; + return lo >>> 0; + } + utils$1.sum64_5_lo = sum64_5_lo; + function rotr64_hi(ah, al, num) { + var r = al << 32 - num | ah >>> num; + return r >>> 0; + } + utils$1.rotr64_hi = rotr64_hi; + function rotr64_lo(ah, al, num) { + var r = ah << 32 - num | al >>> num; + return r >>> 0; + } + utils$1.rotr64_lo = rotr64_lo; + function shr64_hi(ah, al, num) { + return ah >>> num; + } + utils$1.shr64_hi = shr64_hi; + function shr64_lo(ah, al, num) { + var r = ah << 32 - num | al >>> num; + return r >>> 0; + } + utils$1.shr64_lo = shr64_lo; + return utils$1; +} +var common$3 = {}; +var hasRequiredCommon$3; +function requireCommon$3() { + if (hasRequiredCommon$3) return common$3; + hasRequiredCommon$3 = 1; + var utils2 = requireUtils$1(); + var assert2 = requireMinimalisticAssert(); + function BlockHash() { + this.pending = null; + this.pendingTotal = 0; + this.blockSize = this.constructor.blockSize; + this.outSize = this.constructor.outSize; + this.hmacStrength = this.constructor.hmacStrength; + this.padLength = this.constructor.padLength / 8; + this.endian = "big"; + this._delta8 = this.blockSize / 8; + this._delta32 = this.blockSize / 32; + } + common$3.BlockHash = BlockHash; + BlockHash.prototype.update = function update(msg, enc) { + msg = utils2.toArray(msg, enc); + if (!this.pending) + this.pending = msg; + else + this.pending = this.pending.concat(msg); + this.pendingTotal += msg.length; + if (this.pending.length >= this._delta8) { + msg = this.pending; + var r = msg.length % this._delta8; + this.pending = msg.slice(msg.length - r, msg.length); + if (this.pending.length === 0) + this.pending = null; + msg = utils2.join32(msg, 0, msg.length - r, this.endian); + for (var i = 0; i < msg.length; i += this._delta32) + this._update(msg, i, i + this._delta32); + } + return this; + }; + BlockHash.prototype.digest = function digest(enc) { + this.update(this._pad()); + assert2(this.pending === null); + return this._digest(enc); + }; + BlockHash.prototype._pad = function pad() { + var len = this.pendingTotal; + var bytes = this._delta8; + var k = bytes - (len + this.padLength) % bytes; + var res = new Array(k + this.padLength); + res[0] = 128; + for (var i = 1; i < k; i++) + res[i] = 0; + len <<= 3; + if (this.endian === "big") { + for (var t = 8; t < this.padLength; t++) + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = len >>> 24 & 255; + res[i++] = len >>> 16 & 255; + res[i++] = len >>> 8 & 255; + res[i++] = len & 255; + } else { + res[i++] = len & 255; + res[i++] = len >>> 8 & 255; + res[i++] = len >>> 16 & 255; + res[i++] = len >>> 24 & 255; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + for (t = 8; t < this.padLength; t++) + res[i++] = 0; + } + return res; + }; + return common$3; +} +var sha = {}; +var common$2 = {}; +var hasRequiredCommon$2; +function requireCommon$2() { + if (hasRequiredCommon$2) return common$2; + hasRequiredCommon$2 = 1; + var utils2 = requireUtils$1(); + var rotr32 = utils2.rotr32; + function ft_1(s, x, y, z) { + if (s === 0) + return ch32(x, y, z); + if (s === 1 || s === 3) + return p32(x, y, z); + if (s === 2) + return maj32(x, y, z); + } + common$2.ft_1 = ft_1; + function ch32(x, y, z) { + return x & y ^ ~x & z; + } + common$2.ch32 = ch32; + function maj32(x, y, z) { + return x & y ^ x & z ^ y & z; + } + common$2.maj32 = maj32; + function p32(x, y, z) { + return x ^ y ^ z; + } + common$2.p32 = p32; + function s0_256(x) { + return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); + } + common$2.s0_256 = s0_256; + function s1_256(x) { + return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); + } + common$2.s1_256 = s1_256; + function g0_256(x) { + return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3; + } + common$2.g0_256 = g0_256; + function g1_256(x) { + return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10; + } + common$2.g1_256 = g1_256; + return common$2; +} +var _1; +var hasRequired_1; +function require_1() { + if (hasRequired_1) return _1; + hasRequired_1 = 1; + var utils2 = requireUtils$1(); + var common2 = requireCommon$3(); + var shaCommon = requireCommon$2(); + var rotl32 = utils2.rotl32; + var sum32 = utils2.sum32; + var sum32_5 = utils2.sum32_5; + var ft_1 = shaCommon.ft_1; + var BlockHash = common2.BlockHash; + var sha1_K = [ + 1518500249, + 1859775393, + 2400959708, + 3395469782 + ]; + function SHA1() { + if (!(this instanceof SHA1)) + return new SHA1(); + BlockHash.call(this); + this.h = [ + 1732584193, + 4023233417, + 2562383102, + 271733878, + 3285377520 + ]; + this.W = new Array(80); + } + utils2.inherits(SHA1, BlockHash); + _1 = SHA1; + SHA1.blockSize = 512; + SHA1.outSize = 160; + SHA1.hmacStrength = 80; + SHA1.padLength = 64; + SHA1.prototype._update = function _update(msg, start) { + var W = this.W; + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + for (i = 0; i < W.length; i++) { + var s = ~~(i / 20); + var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); + e = d; + d = c; + c = rotl32(b, 30); + b = a; + a = t; + } + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + }; + SHA1.prototype._digest = function digest(enc) { + if (enc === "hex") + return utils2.toHex32(this.h, "big"); + else + return utils2.split32(this.h, "big"); + }; + return _1; +} +var _256; +var hasRequired_256; +function require_256() { + if (hasRequired_256) return _256; + hasRequired_256 = 1; + var utils2 = requireUtils$1(); + var common2 = requireCommon$3(); + var shaCommon = requireCommon$2(); + var assert2 = requireMinimalisticAssert(); + var sum32 = utils2.sum32; + var sum32_4 = utils2.sum32_4; + var sum32_5 = utils2.sum32_5; + var ch32 = shaCommon.ch32; + var maj32 = shaCommon.maj32; + var s0_256 = shaCommon.s0_256; + var s1_256 = shaCommon.s1_256; + var g0_256 = shaCommon.g0_256; + var g1_256 = shaCommon.g1_256; + var BlockHash = common2.BlockHash; + var sha256_K = [ + 1116352408, + 1899447441, + 3049323471, + 3921009573, + 961987163, + 1508970993, + 2453635748, + 2870763221, + 3624381080, + 310598401, + 607225278, + 1426881987, + 1925078388, + 2162078206, + 2614888103, + 3248222580, + 3835390401, + 4022224774, + 264347078, + 604807628, + 770255983, + 1249150122, + 1555081692, + 1996064986, + 2554220882, + 2821834349, + 2952996808, + 3210313671, + 3336571891, + 3584528711, + 113926993, + 338241895, + 666307205, + 773529912, + 1294757372, + 1396182291, + 1695183700, + 1986661051, + 2177026350, + 2456956037, + 2730485921, + 2820302411, + 3259730800, + 3345764771, + 3516065817, + 3600352804, + 4094571909, + 275423344, + 430227734, + 506948616, + 659060556, + 883997877, + 958139571, + 1322822218, + 1537002063, + 1747873779, + 1955562222, + 2024104815, + 2227730452, + 2361852424, + 2428436474, + 2756734187, + 3204031479, + 3329325298 + ]; + function SHA256() { + if (!(this instanceof SHA256)) + return new SHA256(); + BlockHash.call(this); + this.h = [ + 1779033703, + 3144134277, + 1013904242, + 2773480762, + 1359893119, + 2600822924, + 528734635, + 1541459225 + ]; + this.k = sha256_K; + this.W = new Array(64); + } + utils2.inherits(SHA256, BlockHash); + _256 = SHA256; + SHA256.blockSize = 512; + SHA256.outSize = 256; + SHA256.hmacStrength = 192; + SHA256.padLength = 64; + SHA256.prototype._update = function _update(msg, start) { + var W = this.W; + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + var f = this.h[5]; + var g = this.h[6]; + var h = this.h[7]; + assert2(this.k.length === W.length); + for (i = 0; i < W.length; i++) { + var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); + var T2 = sum32(s0_256(a), maj32(a, b, c)); + h = g; + g = f; + f = e; + e = sum32(d, T1); + d = c; + c = b; + b = a; + a = sum32(T1, T2); + } + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + this.h[5] = sum32(this.h[5], f); + this.h[6] = sum32(this.h[6], g); + this.h[7] = sum32(this.h[7], h); + }; + SHA256.prototype._digest = function digest(enc) { + if (enc === "hex") + return utils2.toHex32(this.h, "big"); + else + return utils2.split32(this.h, "big"); + }; + return _256; +} +var _224; +var hasRequired_224; +function require_224() { + if (hasRequired_224) return _224; + hasRequired_224 = 1; + var utils2 = requireUtils$1(); + var SHA256 = require_256(); + function SHA224() { + if (!(this instanceof SHA224)) + return new SHA224(); + SHA256.call(this); + this.h = [ + 3238371032, + 914150663, + 812702999, + 4144912697, + 4290775857, + 1750603025, + 1694076839, + 3204075428 + ]; + } + utils2.inherits(SHA224, SHA256); + _224 = SHA224; + SHA224.blockSize = 512; + SHA224.outSize = 224; + SHA224.hmacStrength = 192; + SHA224.padLength = 64; + SHA224.prototype._digest = function digest(enc) { + if (enc === "hex") + return utils2.toHex32(this.h.slice(0, 7), "big"); + else + return utils2.split32(this.h.slice(0, 7), "big"); + }; + return _224; +} +var _512; +var hasRequired_512; +function require_512() { + if (hasRequired_512) return _512; + hasRequired_512 = 1; + var utils2 = requireUtils$1(); + var common2 = requireCommon$3(); + var assert2 = requireMinimalisticAssert(); + var rotr64_hi = utils2.rotr64_hi; + var rotr64_lo = utils2.rotr64_lo; + var shr64_hi = utils2.shr64_hi; + var shr64_lo = utils2.shr64_lo; + var sum64 = utils2.sum64; + var sum64_hi = utils2.sum64_hi; + var sum64_lo = utils2.sum64_lo; + var sum64_4_hi = utils2.sum64_4_hi; + var sum64_4_lo = utils2.sum64_4_lo; + var sum64_5_hi = utils2.sum64_5_hi; + var sum64_5_lo = utils2.sum64_5_lo; + var BlockHash = common2.BlockHash; + var sha512_K = [ + 1116352408, + 3609767458, + 1899447441, + 602891725, + 3049323471, + 3964484399, + 3921009573, + 2173295548, + 961987163, + 4081628472, + 1508970993, + 3053834265, + 2453635748, + 2937671579, + 2870763221, + 3664609560, + 3624381080, + 2734883394, + 310598401, + 1164996542, + 607225278, + 1323610764, + 1426881987, + 3590304994, + 1925078388, + 4068182383, + 2162078206, + 991336113, + 2614888103, + 633803317, + 3248222580, + 3479774868, + 3835390401, + 2666613458, + 4022224774, + 944711139, + 264347078, + 2341262773, + 604807628, + 2007800933, + 770255983, + 1495990901, + 1249150122, + 1856431235, + 1555081692, + 3175218132, + 1996064986, + 2198950837, + 2554220882, + 3999719339, + 2821834349, + 766784016, + 2952996808, + 2566594879, + 3210313671, + 3203337956, + 3336571891, + 1034457026, + 3584528711, + 2466948901, + 113926993, + 3758326383, + 338241895, + 168717936, + 666307205, + 1188179964, + 773529912, + 1546045734, + 1294757372, + 1522805485, + 1396182291, + 2643833823, + 1695183700, + 2343527390, + 1986661051, + 1014477480, + 2177026350, + 1206759142, + 2456956037, + 344077627, + 2730485921, + 1290863460, + 2820302411, + 3158454273, + 3259730800, + 3505952657, + 3345764771, + 106217008, + 3516065817, + 3606008344, + 3600352804, + 1432725776, + 4094571909, + 1467031594, + 275423344, + 851169720, + 430227734, + 3100823752, + 506948616, + 1363258195, + 659060556, + 3750685593, + 883997877, + 3785050280, + 958139571, + 3318307427, + 1322822218, + 3812723403, + 1537002063, + 2003034995, + 1747873779, + 3602036899, + 1955562222, + 1575990012, + 2024104815, + 1125592928, + 2227730452, + 2716904306, + 2361852424, + 442776044, + 2428436474, + 593698344, + 2756734187, + 3733110249, + 3204031479, + 2999351573, + 3329325298, + 3815920427, + 3391569614, + 3928383900, + 3515267271, + 566280711, + 3940187606, + 3454069534, + 4118630271, + 4000239992, + 116418474, + 1914138554, + 174292421, + 2731055270, + 289380356, + 3203993006, + 460393269, + 320620315, + 685471733, + 587496836, + 852142971, + 1086792851, + 1017036298, + 365543100, + 1126000580, + 2618297676, + 1288033470, + 3409855158, + 1501505948, + 4234509866, + 1607167915, + 987167468, + 1816402316, + 1246189591 + ]; + function SHA512() { + if (!(this instanceof SHA512)) + return new SHA512(); + BlockHash.call(this); + this.h = [ + 1779033703, + 4089235720, + 3144134277, + 2227873595, + 1013904242, + 4271175723, + 2773480762, + 1595750129, + 1359893119, + 2917565137, + 2600822924, + 725511199, + 528734635, + 4215389547, + 1541459225, + 327033209 + ]; + this.k = sha512_K; + this.W = new Array(160); + } + utils2.inherits(SHA512, BlockHash); + _512 = SHA512; + SHA512.blockSize = 1024; + SHA512.outSize = 512; + SHA512.hmacStrength = 192; + SHA512.padLength = 128; + SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { + var W = this.W; + for (var i = 0; i < 32; i++) + W[i] = msg[start + i]; + for (; i < W.length; i += 2) { + var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); + var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); + var c1_hi = W[i - 14]; + var c1_lo = W[i - 13]; + var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); + var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); + var c3_hi = W[i - 32]; + var c3_lo = W[i - 31]; + W[i] = sum64_4_hi( + c0_hi, + c0_lo, + c1_hi, + c1_lo, + c2_hi, + c2_lo, + c3_hi, + c3_lo + ); + W[i + 1] = sum64_4_lo( + c0_hi, + c0_lo, + c1_hi, + c1_lo, + c2_hi, + c2_lo, + c3_hi, + c3_lo + ); + } + }; + SHA512.prototype._update = function _update(msg, start) { + this._prepareBlock(msg, start); + var W = this.W; + var ah = this.h[0]; + var al = this.h[1]; + var bh = this.h[2]; + var bl = this.h[3]; + var ch = this.h[4]; + var cl = this.h[5]; + var dh2 = this.h[6]; + var dl = this.h[7]; + var eh = this.h[8]; + var el = this.h[9]; + var fh = this.h[10]; + var fl = this.h[11]; + var gh = this.h[12]; + var gl = this.h[13]; + var hh = this.h[14]; + var hl = this.h[15]; + assert2(this.k.length === W.length); + for (var i = 0; i < W.length; i += 2) { + var c0_hi = hh; + var c0_lo = hl; + var c1_hi = s1_512_hi(eh, el); + var c1_lo = s1_512_lo(eh, el); + var c2_hi = ch64_hi(eh, el, fh, fl, gh); + var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); + var c3_hi = this.k[i]; + var c3_lo = this.k[i + 1]; + var c4_hi = W[i]; + var c4_lo = W[i + 1]; + var T1_hi = sum64_5_hi( + c0_hi, + c0_lo, + c1_hi, + c1_lo, + c2_hi, + c2_lo, + c3_hi, + c3_lo, + c4_hi, + c4_lo + ); + var T1_lo = sum64_5_lo( + c0_hi, + c0_lo, + c1_hi, + c1_lo, + c2_hi, + c2_lo, + c3_hi, + c3_lo, + c4_hi, + c4_lo + ); + c0_hi = s0_512_hi(ah, al); + c0_lo = s0_512_lo(ah, al); + c1_hi = maj64_hi(ah, al, bh, bl, ch); + c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); + var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + eh = sum64_hi(dh2, dl, T1_hi, T1_lo); + el = sum64_lo(dl, dl, T1_hi, T1_lo); + dh2 = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); + al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); + } + sum64(this.h, 0, ah, al); + sum64(this.h, 2, bh, bl); + sum64(this.h, 4, ch, cl); + sum64(this.h, 6, dh2, dl); + sum64(this.h, 8, eh, el); + sum64(this.h, 10, fh, fl); + sum64(this.h, 12, gh, gl); + sum64(this.h, 14, hh, hl); + }; + SHA512.prototype._digest = function digest(enc) { + if (enc === "hex") + return utils2.toHex32(this.h, "big"); + else + return utils2.split32(this.h, "big"); + }; + function ch64_hi(xh, xl, yh, yl, zh) { + var r = xh & yh ^ ~xh & zh; + if (r < 0) + r += 4294967296; + return r; + } + function ch64_lo(xh, xl, yh, yl, zh, zl) { + var r = xl & yl ^ ~xl & zl; + if (r < 0) + r += 4294967296; + return r; + } + function maj64_hi(xh, xl, yh, yl, zh) { + var r = xh & yh ^ xh & zh ^ yh & zh; + if (r < 0) + r += 4294967296; + return r; + } + function maj64_lo(xh, xl, yh, yl, zh, zl) { + var r = xl & yl ^ xl & zl ^ yl & zl; + if (r < 0) + r += 4294967296; + return r; + } + function s0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 28); + var c1_hi = rotr64_hi(xl, xh, 2); + var c2_hi = rotr64_hi(xl, xh, 7); + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 4294967296; + return r; + } + function s0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 28); + var c1_lo = rotr64_lo(xl, xh, 2); + var c2_lo = rotr64_lo(xl, xh, 7); + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 4294967296; + return r; + } + function s1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 14); + var c1_hi = rotr64_hi(xh, xl, 18); + var c2_hi = rotr64_hi(xl, xh, 9); + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 4294967296; + return r; + } + function s1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 14); + var c1_lo = rotr64_lo(xh, xl, 18); + var c2_lo = rotr64_lo(xl, xh, 9); + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 4294967296; + return r; + } + function g0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 1); + var c1_hi = rotr64_hi(xh, xl, 8); + var c2_hi = shr64_hi(xh, xl, 7); + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 4294967296; + return r; + } + function g0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 1); + var c1_lo = rotr64_lo(xh, xl, 8); + var c2_lo = shr64_lo(xh, xl, 7); + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 4294967296; + return r; + } + function g1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 19); + var c1_hi = rotr64_hi(xl, xh, 29); + var c2_hi = shr64_hi(xh, xl, 6); + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 4294967296; + return r; + } + function g1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 19); + var c1_lo = rotr64_lo(xl, xh, 29); + var c2_lo = shr64_lo(xh, xl, 6); + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 4294967296; + return r; + } + return _512; +} +var _384; +var hasRequired_384; +function require_384() { + if (hasRequired_384) return _384; + hasRequired_384 = 1; + var utils2 = requireUtils$1(); + var SHA512 = require_512(); + function SHA384() { + if (!(this instanceof SHA384)) + return new SHA384(); + SHA512.call(this); + this.h = [ + 3418070365, + 3238371032, + 1654270250, + 914150663, + 2438529370, + 812702999, + 355462360, + 4144912697, + 1731405415, + 4290775857, + 2394180231, + 1750603025, + 3675008525, + 1694076839, + 1203062813, + 3204075428 + ]; + } + utils2.inherits(SHA384, SHA512); + _384 = SHA384; + SHA384.blockSize = 1024; + SHA384.outSize = 384; + SHA384.hmacStrength = 192; + SHA384.padLength = 128; + SHA384.prototype._digest = function digest(enc) { + if (enc === "hex") + return utils2.toHex32(this.h.slice(0, 12), "big"); + else + return utils2.split32(this.h.slice(0, 12), "big"); + }; + return _384; +} +var hasRequiredSha; +function requireSha() { + if (hasRequiredSha) return sha; + hasRequiredSha = 1; + sha.sha1 = require_1(); + sha.sha224 = require_224(); + sha.sha256 = require_256(); + sha.sha384 = require_384(); + sha.sha512 = require_512(); + return sha; +} +var ripemd = {}; +var hasRequiredRipemd; +function requireRipemd() { + if (hasRequiredRipemd) return ripemd; + hasRequiredRipemd = 1; + var utils2 = requireUtils$1(); + var common2 = requireCommon$3(); + var rotl32 = utils2.rotl32; + var sum32 = utils2.sum32; + var sum32_3 = utils2.sum32_3; + var sum32_4 = utils2.sum32_4; + var BlockHash = common2.BlockHash; + function RIPEMD160() { + if (!(this instanceof RIPEMD160)) + return new RIPEMD160(); + BlockHash.call(this); + this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520]; + this.endian = "little"; + } + utils2.inherits(RIPEMD160, BlockHash); + ripemd.ripemd160 = RIPEMD160; + RIPEMD160.blockSize = 512; + RIPEMD160.outSize = 160; + RIPEMD160.hmacStrength = 192; + RIPEMD160.padLength = 64; + RIPEMD160.prototype._update = function update(msg, start) { + var A = this.h[0]; + var B = this.h[1]; + var C = this.h[2]; + var D = this.h[3]; + var E = this.h[4]; + var Ah = A; + var Bh = B; + var Ch = C; + var Dh = D; + var Eh = E; + for (var j = 0; j < 80; j++) { + var T = sum32( + rotl32( + sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), + s[j] + ), + E + ); + A = E; + E = D; + D = rotl32(C, 10); + C = B; + B = T; + T = sum32( + rotl32( + sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), + sh[j] + ), + Eh + ); + Ah = Eh; + Eh = Dh; + Dh = rotl32(Ch, 10); + Ch = Bh; + Bh = T; + } + T = sum32_3(this.h[1], C, Dh); + this.h[1] = sum32_3(this.h[2], D, Eh); + this.h[2] = sum32_3(this.h[3], E, Ah); + this.h[3] = sum32_3(this.h[4], A, Bh); + this.h[4] = sum32_3(this.h[0], B, Ch); + this.h[0] = T; + }; + RIPEMD160.prototype._digest = function digest(enc) { + if (enc === "hex") + return utils2.toHex32(this.h, "little"); + else + return utils2.split32(this.h, "little"); + }; + function f(j, x, y, z) { + if (j <= 15) + return x ^ y ^ z; + else if (j <= 31) + return x & y | ~x & z; + else if (j <= 47) + return (x | ~y) ^ z; + else if (j <= 63) + return x & z | y & ~z; + else + return x ^ (y | ~z); + } + function K(j) { + if (j <= 15) + return 0; + else if (j <= 31) + return 1518500249; + else if (j <= 47) + return 1859775393; + else if (j <= 63) + return 2400959708; + else + return 2840853838; + } + function Kh(j) { + if (j <= 15) + return 1352829926; + else if (j <= 31) + return 1548603684; + else if (j <= 47) + return 1836072691; + else if (j <= 63) + return 2053994217; + else + return 0; + } + var r = [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 7, + 4, + 13, + 1, + 10, + 6, + 15, + 3, + 12, + 0, + 9, + 5, + 2, + 14, + 11, + 8, + 3, + 10, + 14, + 4, + 9, + 15, + 8, + 1, + 2, + 7, + 0, + 6, + 13, + 11, + 5, + 12, + 1, + 9, + 11, + 10, + 0, + 8, + 12, + 4, + 13, + 3, + 7, + 15, + 14, + 5, + 6, + 2, + 4, + 0, + 5, + 9, + 7, + 12, + 2, + 10, + 14, + 1, + 3, + 8, + 11, + 6, + 15, + 13 + ]; + var rh = [ + 5, + 14, + 7, + 0, + 9, + 2, + 11, + 4, + 13, + 6, + 15, + 8, + 1, + 10, + 3, + 12, + 6, + 11, + 3, + 7, + 0, + 13, + 5, + 10, + 14, + 15, + 8, + 12, + 4, + 9, + 1, + 2, + 15, + 5, + 1, + 3, + 7, + 14, + 6, + 9, + 11, + 8, + 12, + 2, + 10, + 0, + 4, + 13, + 8, + 6, + 4, + 1, + 3, + 11, + 15, + 0, + 5, + 12, + 2, + 13, + 9, + 7, + 10, + 14, + 12, + 15, + 10, + 4, + 1, + 5, + 8, + 7, + 6, + 2, + 13, + 14, + 0, + 3, + 9, + 11 + ]; + var s = [ + 11, + 14, + 15, + 12, + 5, + 8, + 7, + 9, + 11, + 13, + 14, + 15, + 6, + 7, + 9, + 8, + 7, + 6, + 8, + 13, + 11, + 9, + 7, + 15, + 7, + 12, + 15, + 9, + 11, + 7, + 13, + 12, + 11, + 13, + 6, + 7, + 14, + 9, + 13, + 15, + 14, + 8, + 13, + 6, + 5, + 12, + 7, + 5, + 11, + 12, + 14, + 15, + 14, + 15, + 9, + 8, + 9, + 14, + 5, + 6, + 8, + 6, + 5, + 12, + 9, + 15, + 5, + 11, + 6, + 8, + 13, + 12, + 5, + 12, + 13, + 14, + 11, + 8, + 5, + 6 + ]; + var sh = [ + 8, + 9, + 9, + 11, + 13, + 15, + 15, + 5, + 7, + 7, + 8, + 11, + 14, + 14, + 12, + 6, + 9, + 13, + 15, + 7, + 12, + 8, + 9, + 11, + 7, + 7, + 12, + 7, + 6, + 15, + 13, + 11, + 9, + 7, + 15, + 11, + 8, + 6, + 6, + 14, + 12, + 13, + 5, + 14, + 13, + 13, + 7, + 5, + 15, + 5, + 8, + 11, + 14, + 14, + 6, + 14, + 6, + 9, + 12, + 9, + 12, + 5, + 15, + 8, + 8, + 5, + 12, + 9, + 12, + 5, + 14, + 6, + 8, + 13, + 6, + 5, + 15, + 13, + 11, + 11 + ]; + return ripemd; +} +var hmac; +var hasRequiredHmac; +function requireHmac() { + if (hasRequiredHmac) return hmac; + hasRequiredHmac = 1; + var utils2 = requireUtils$1(); + var assert2 = requireMinimalisticAssert(); + function Hmac(hash2, key2, enc) { + if (!(this instanceof Hmac)) + return new Hmac(hash2, key2, enc); + this.Hash = hash2; + this.blockSize = hash2.blockSize / 8; + this.outSize = hash2.outSize / 8; + this.inner = null; + this.outer = null; + this._init(utils2.toArray(key2, enc)); + } + hmac = Hmac; + Hmac.prototype._init = function init(key2) { + if (key2.length > this.blockSize) + key2 = new this.Hash().update(key2).digest(); + assert2(key2.length <= this.blockSize); + for (var i = key2.length; i < this.blockSize; i++) + key2.push(0); + for (i = 0; i < key2.length; i++) + key2[i] ^= 54; + this.inner = new this.Hash().update(key2); + for (i = 0; i < key2.length; i++) + key2[i] ^= 106; + this.outer = new this.Hash().update(key2); + }; + Hmac.prototype.update = function update(msg, enc) { + this.inner.update(msg, enc); + return this; + }; + Hmac.prototype.digest = function digest(enc) { + this.outer.update(this.inner.digest()); + return this.outer.digest(enc); + }; + return hmac; +} +var hasRequiredHash; +function requireHash() { + if (hasRequiredHash) return hash; + hasRequiredHash = 1; + (function(exports) { + var hash2 = exports; + hash2.utils = requireUtils$1(); + hash2.common = requireCommon$3(); + hash2.sha = requireSha(); + hash2.ripemd = requireRipemd(); + hash2.hmac = requireHmac(); + hash2.sha1 = hash2.sha.sha1; + hash2.sha256 = hash2.sha.sha256; + hash2.sha224 = hash2.sha.sha224; + hash2.sha384 = hash2.sha.sha384; + hash2.sha512 = hash2.sha.sha512; + hash2.ripemd160 = hash2.ripemd.ripemd160; + })(hash); + return hash; +} +var secp256k1; +var hasRequiredSecp256k1; +function requireSecp256k1() { + if (hasRequiredSecp256k1) return secp256k1; + hasRequiredSecp256k1 = 1; + secp256k1 = { + doubles: { + step: 4, + points: [ + [ + "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a", + "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821" + ], + [ + "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", + "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf" + ], + [ + "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739", + "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695" + ], + [ + "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640", + "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9" + ], + [ + "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c", + "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36" + ], + [ + "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda", + "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f" + ], + [ + "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa", + "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999" + ], + [ + "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0", + "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09" + ], + [ + "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d", + "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d" + ], + [ + "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d", + "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088" + ], + [ + "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1", + "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d" + ], + [ + "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0", + "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8" + ], + [ + "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047", + "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a" + ], + [ + "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862", + "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453" + ], + [ + "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7", + "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160" + ], + [ + "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd", + "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0" + ], + [ + "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83", + "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6" + ], + [ + "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a", + "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589" + ], + [ + "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8", + "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17" + ], + [ + "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d", + "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda" + ], + [ + "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725", + "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd" + ], + [ + "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754", + "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2" + ], + [ + "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c", + "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6" + ], + [ + "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6", + "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f" + ], + [ + "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39", + "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01" + ], + [ + "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891", + "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3" + ], + [ + "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b", + "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f" + ], + [ + "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03", + "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7" + ], + [ + "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d", + "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78" + ], + [ + "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070", + "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1" + ], + [ + "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4", + "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150" + ], + [ + "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da", + "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82" + ], + [ + "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11", + "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc" + ], + [ + "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e", + "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b" + ], + [ + "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41", + "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51" + ], + [ + "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef", + "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45" + ], + [ + "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8", + "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120" + ], + [ + "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d", + "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84" + ], + [ + "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96", + "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d" + ], + [ + "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd", + "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d" + ], + [ + "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5", + "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8" + ], + [ + "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266", + "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8" + ], + [ + "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71", + "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac" + ], + [ + "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac", + "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f" + ], + [ + "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751", + "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962" + ], + [ + "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e", + "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907" + ], + [ + "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241", + "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec" + ], + [ + "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3", + "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d" + ], + [ + "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f", + "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414" + ], + [ + "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19", + "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd" + ], + [ + "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be", + "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0" + ], + [ + "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9", + "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811" + ], + [ + "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2", + "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1" + ], + [ + "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13", + "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c" + ], + [ + "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c", + "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73" + ], + [ + "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba", + "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd" + ], + [ + "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151", + "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405" + ], + [ + "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073", + "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589" + ], + [ + "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458", + "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e" + ], + [ + "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b", + "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27" + ], + [ + "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366", + "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1" + ], + [ + "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa", + "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482" + ], + [ + "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0", + "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945" + ], + [ + "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787", + "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573" + ], + [ + "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e", + "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82" + ] + ] + }, + naf: { + wnd: 7, + points: [ + [ + "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9", + "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672" + ], + [ + "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4", + "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6" + ], + [ + "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc", + "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da" + ], + [ + "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe", + "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37" + ], + [ + "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb", + "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b" + ], + [ + "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8", + "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81" + ], + [ + "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e", + "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58" + ], + [ + "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34", + "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77" + ], + [ + "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c", + "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a" + ], + [ + "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5", + "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c" + ], + [ + "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f", + "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67" + ], + [ + "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714", + "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402" + ], + [ + "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729", + "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55" + ], + [ + "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db", + "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482" + ], + [ + "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4", + "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82" + ], + [ + "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5", + "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396" + ], + [ + "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479", + "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49" + ], + [ + "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d", + "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf" + ], + [ + "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f", + "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a" + ], + [ + "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb", + "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7" + ], + [ + "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9", + "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933" + ], + [ + "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963", + "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a" + ], + [ + "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74", + "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6" + ], + [ + "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530", + "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37" + ], + [ + "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b", + "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e" + ], + [ + "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247", + "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6" + ], + [ + "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1", + "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476" + ], + [ + "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120", + "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40" + ], + [ + "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435", + "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61" + ], + [ + "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18", + "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683" + ], + [ + "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8", + "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5" + ], + [ + "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb", + "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b" + ], + [ + "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f", + "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417" + ], + [ + "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143", + "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868" + ], + [ + "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba", + "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a" + ], + [ + "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45", + "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6" + ], + [ + "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a", + "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996" + ], + [ + "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e", + "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e" + ], + [ + "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8", + "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d" + ], + [ + "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c", + "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2" + ], + [ + "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519", + "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e" + ], + [ + "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab", + "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437" + ], + [ + "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca", + "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311" + ], + [ + "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf", + "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4" + ], + [ + "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610", + "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575" + ], + [ + "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4", + "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d" + ], + [ + "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c", + "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d" + ], + [ + "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940", + "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629" + ], + [ + "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980", + "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06" + ], + [ + "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3", + "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374" + ], + [ + "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf", + "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee" + ], + [ + "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63", + "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1" + ], + [ + "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448", + "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b" + ], + [ + "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf", + "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661" + ], + [ + "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5", + "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6" + ], + [ + "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6", + "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e" + ], + [ + "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5", + "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d" + ], + [ + "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99", + "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc" + ], + [ + "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51", + "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4" + ], + [ + "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5", + "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c" + ], + [ + "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5", + "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b" + ], + [ + "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997", + "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913" + ], + [ + "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881", + "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154" + ], + [ + "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5", + "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865" + ], + [ + "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66", + "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc" + ], + [ + "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726", + "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224" + ], + [ + "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede", + "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e" + ], + [ + "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94", + "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6" + ], + [ + "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31", + "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511" + ], + [ + "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51", + "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b" + ], + [ + "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252", + "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2" + ], + [ + "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5", + "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c" + ], + [ + "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b", + "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3" + ], + [ + "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4", + "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d" + ], + [ + "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f", + "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700" + ], + [ + "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889", + "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4" + ], + [ + "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246", + "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196" + ], + [ + "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984", + "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4" + ], + [ + "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a", + "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257" + ], + [ + "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030", + "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13" + ], + [ + "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197", + "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096" + ], + [ + "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593", + "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38" + ], + [ + "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef", + "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f" + ], + [ + "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38", + "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448" + ], + [ + "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a", + "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a" + ], + [ + "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111", + "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4" + ], + [ + "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502", + "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437" + ], + [ + "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea", + "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7" + ], + [ + "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26", + "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d" + ], + [ + "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986", + "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a" + ], + [ + "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e", + "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54" + ], + [ + "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4", + "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77" + ], + [ + "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda", + "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517" + ], + [ + "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859", + "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10" + ], + [ + "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f", + "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125" + ], + [ + "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c", + "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e" + ], + [ + "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942", + "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1" + ], + [ + "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a", + "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2" + ], + [ + "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80", + "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423" + ], + [ + "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d", + "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8" + ], + [ + "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1", + "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758" + ], + [ + "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63", + "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375" + ], + [ + "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352", + "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d" + ], + [ + "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193", + "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec" + ], + [ + "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00", + "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0" + ], + [ + "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58", + "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c" + ], + [ + "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7", + "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4" + ], + [ + "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8", + "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f" + ], + [ + "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e", + "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649" + ], + [ + "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d", + "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826" + ], + [ + "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b", + "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5" + ], + [ + "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f", + "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87" + ], + [ + "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6", + "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b" + ], + [ + "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297", + "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc" + ], + [ + "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a", + "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c" + ], + [ + "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c", + "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f" + ], + [ + "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52", + "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a" + ], + [ + "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb", + "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46" + ], + [ + "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065", + "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f" + ], + [ + "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917", + "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03" + ], + [ + "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9", + "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08" + ], + [ + "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3", + "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8" + ], + [ + "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57", + "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373" + ], + [ + "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66", + "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3" + ], + [ + "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8", + "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8" + ], + [ + "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721", + "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1" + ], + [ + "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180", + "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9" + ] + ] + } + }; + return secp256k1; +} +var hasRequiredCurves; +function requireCurves() { + if (hasRequiredCurves) return curves; + hasRequiredCurves = 1; + (function(exports) { + var curves2 = exports; + var hash2 = requireHash(); + var curve2 = requireCurve(); + var utils2 = requireUtils$2(); + var assert2 = utils2.assert; + function PresetCurve(options2) { + if (options2.type === "short") + this.curve = new curve2.short(options2); + else if (options2.type === "edwards") + this.curve = new curve2.edwards(options2); + else + this.curve = new curve2.mont(options2); + this.g = this.curve.g; + this.n = this.curve.n; + this.hash = options2.hash; + assert2(this.g.validate(), "Invalid curve"); + assert2(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O"); + } + curves2.PresetCurve = PresetCurve; + function defineCurve(name, options2) { + Object.defineProperty(curves2, name, { + configurable: true, + enumerable: true, + get: function() { + var curve3 = new PresetCurve(options2); + Object.defineProperty(curves2, name, { + configurable: true, + enumerable: true, + value: curve3 + }); + return curve3; + } + }); + } + defineCurve("p192", { + type: "short", + prime: "p192", + p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff", + a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc", + b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1", + n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831", + hash: hash2.sha256, + gRed: false, + g: [ + "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012", + "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811" + ] + }); + defineCurve("p224", { + type: "short", + prime: "p224", + p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001", + a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe", + b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4", + n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d", + hash: hash2.sha256, + gRed: false, + g: [ + "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21", + "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34" + ] + }); + defineCurve("p256", { + type: "short", + prime: null, + p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff", + a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc", + b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b", + n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551", + hash: hash2.sha256, + gRed: false, + g: [ + "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296", + "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5" + ] + }); + defineCurve("p384", { + type: "short", + prime: null, + p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff", + a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc", + b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef", + n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973", + hash: hash2.sha384, + gRed: false, + g: [ + "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7", + "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f" + ] + }); + defineCurve("p521", { + type: "short", + prime: null, + p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff", + a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc", + b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00", + n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409", + hash: hash2.sha512, + gRed: false, + g: [ + "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66", + "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650" + ] + }); + defineCurve("curve25519", { + type: "mont", + prime: "p25519", + p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", + a: "76d06", + b: "1", + n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", + hash: hash2.sha256, + gRed: false, + g: [ + "9" + ] + }); + defineCurve("ed25519", { + type: "edwards", + prime: "p25519", + p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", + a: "-1", + c: "1", + // -121665 * (121666^(-1)) (mod P) + d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3", + n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", + hash: hash2.sha256, + gRed: false, + g: [ + "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a", + // 4/5 + "6666666666666666666666666666666666666666666666666666666666666658" + ] + }); + var pre; + try { + pre = requireSecp256k1(); + } catch (e) { + pre = void 0; + } + defineCurve("secp256k1", { + type: "short", + prime: "k256", + p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f", + a: "0", + b: "7", + n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141", + h: "1", + hash: hash2.sha256, + // Precomputed endomorphism + beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee", + lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72", + basis: [ + { + a: "3086d221a7d46bcde86c90e49284eb15", + b: "-e4437ed6010e88286f547fa90abfe4c3" + }, + { + a: "114ca50f7a8e2f3f657c1108d9d44cfd8", + b: "3086d221a7d46bcde86c90e49284eb15" + } + ], + gRed: false, + g: [ + "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + pre + ] + }); + })(curves); + return curves; +} +var hmacDrbg; +var hasRequiredHmacDrbg; +function requireHmacDrbg() { + if (hasRequiredHmacDrbg) return hmacDrbg; + hasRequiredHmacDrbg = 1; + var hash2 = requireHash(); + var utils2 = requireUtils$3(); + var assert2 = requireMinimalisticAssert(); + function HmacDRBG(options2) { + if (!(this instanceof HmacDRBG)) + return new HmacDRBG(options2); + this.hash = options2.hash; + this.predResist = !!options2.predResist; + this.outLen = this.hash.outSize; + this.minEntropy = options2.minEntropy || this.hash.hmacStrength; + this._reseed = null; + this.reseedInterval = null; + this.K = null; + this.V = null; + var entropy = utils2.toArray(options2.entropy, options2.entropyEnc || "hex"); + var nonce = utils2.toArray(options2.nonce, options2.nonceEnc || "hex"); + var pers = utils2.toArray(options2.pers, options2.persEnc || "hex"); + assert2( + entropy.length >= this.minEntropy / 8, + "Not enough entropy. Minimum is: " + this.minEntropy + " bits" + ); + this._init(entropy, nonce, pers); + } + hmacDrbg = HmacDRBG; + HmacDRBG.prototype._init = function init(entropy, nonce, pers) { + var seed = entropy.concat(nonce).concat(pers); + this.K = new Array(this.outLen / 8); + this.V = new Array(this.outLen / 8); + for (var i = 0; i < this.V.length; i++) { + this.K[i] = 0; + this.V[i] = 1; + } + this._update(seed); + this._reseed = 1; + this.reseedInterval = 281474976710656; + }; + HmacDRBG.prototype._hmac = function hmac2() { + return new hash2.hmac(this.hash, this.K); + }; + HmacDRBG.prototype._update = function update(seed) { + var kmac = this._hmac().update(this.V).update([0]); + if (seed) + kmac = kmac.update(seed); + this.K = kmac.digest(); + this.V = this._hmac().update(this.V).digest(); + if (!seed) + return; + this.K = this._hmac().update(this.V).update([1]).update(seed).digest(); + this.V = this._hmac().update(this.V).digest(); + }; + HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { + if (typeof entropyEnc !== "string") { + addEnc = add; + add = entropyEnc; + entropyEnc = null; + } + entropy = utils2.toArray(entropy, entropyEnc); + add = utils2.toArray(add, addEnc); + assert2( + entropy.length >= this.minEntropy / 8, + "Not enough entropy. Minimum is: " + this.minEntropy + " bits" + ); + this._update(entropy.concat(add || [])); + this._reseed = 1; + }; + HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { + if (this._reseed > this.reseedInterval) + throw new Error("Reseed is required"); + if (typeof enc !== "string") { + addEnc = add; + add = enc; + enc = null; + } + if (add) { + add = utils2.toArray(add, addEnc || "hex"); + this._update(add); + } + var temp = []; + while (temp.length < len) { + this.V = this._hmac().update(this.V).digest(); + temp = temp.concat(this.V); + } + var res = temp.slice(0, len); + this._update(add); + this._reseed++; + return utils2.encode(res, enc); + }; + return hmacDrbg; +} +var key$1; +var hasRequiredKey$1; +function requireKey$1() { + if (hasRequiredKey$1) return key$1; + hasRequiredKey$1 = 1; + var BN = requireBn$3(); + var utils2 = requireUtils$2(); + var assert2 = utils2.assert; + function KeyPair(ec2, options2) { + this.ec = ec2; + this.priv = null; + this.pub = null; + if (options2.priv) + this._importPrivate(options2.priv, options2.privEnc); + if (options2.pub) + this._importPublic(options2.pub, options2.pubEnc); + } + key$1 = KeyPair; + KeyPair.fromPublic = function fromPublic(ec2, pub, enc) { + if (pub instanceof KeyPair) + return pub; + return new KeyPair(ec2, { + pub, + pubEnc: enc + }); + }; + KeyPair.fromPrivate = function fromPrivate(ec2, priv, enc) { + if (priv instanceof KeyPair) + return priv; + return new KeyPair(ec2, { + priv, + privEnc: enc + }); + }; + KeyPair.prototype.validate = function validate() { + var pub = this.getPublic(); + if (pub.isInfinity()) + return { result: false, reason: "Invalid public key" }; + if (!pub.validate()) + return { result: false, reason: "Public key is not a point" }; + if (!pub.mul(this.ec.curve.n).isInfinity()) + return { result: false, reason: "Public key * N != O" }; + return { result: true, reason: null }; + }; + KeyPair.prototype.getPublic = function getPublic(compact, enc) { + if (typeof compact === "string") { + enc = compact; + compact = null; + } + if (!this.pub) + this.pub = this.ec.g.mul(this.priv); + if (!enc) + return this.pub; + return this.pub.encode(enc, compact); + }; + KeyPair.prototype.getPrivate = function getPrivate(enc) { + if (enc === "hex") + return this.priv.toString(16, 2); + else + return this.priv; + }; + KeyPair.prototype._importPrivate = function _importPrivate(key2, enc) { + this.priv = new BN(key2, enc || 16); + this.priv = this.priv.umod(this.ec.curve.n); + }; + KeyPair.prototype._importPublic = function _importPublic(key2, enc) { + if (key2.x || key2.y) { + if (this.ec.curve.type === "mont") { + assert2(key2.x, "Need x coordinate"); + } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") { + assert2(key2.x && key2.y, "Need both x and y coordinate"); + } + this.pub = this.ec.curve.point(key2.x, key2.y); + return; + } + this.pub = this.ec.curve.decodePoint(key2, enc); + }; + KeyPair.prototype.derive = function derive(pub) { + if (!pub.validate()) { + assert2(pub.validate(), "public point not validated"); + } + return pub.mul(this.priv).getX(); + }; + KeyPair.prototype.sign = function sign2(msg, enc, options2) { + return this.ec.sign(msg, this, enc, options2); + }; + KeyPair.prototype.verify = function verify(msg, signature2) { + return this.ec.verify(msg, signature2, this); + }; + KeyPair.prototype.inspect = function inspect() { + return ""; + }; + return key$1; +} +var signature$1; +var hasRequiredSignature$1; +function requireSignature$1() { + if (hasRequiredSignature$1) return signature$1; + hasRequiredSignature$1 = 1; + var BN = requireBn$3(); + var utils2 = requireUtils$2(); + var assert2 = utils2.assert; + function Signature(options2, enc) { + if (options2 instanceof Signature) + return options2; + if (this._importDER(options2, enc)) + return; + assert2(options2.r && options2.s, "Signature without r or s"); + this.r = new BN(options2.r, 16); + this.s = new BN(options2.s, 16); + if (options2.recoveryParam === void 0) + this.recoveryParam = null; + else + this.recoveryParam = options2.recoveryParam; + } + signature$1 = Signature; + function Position3() { + this.place = 0; + } + function getLength(buf, p) { + var initial = buf[p.place++]; + if (!(initial & 128)) { + return initial; + } + var octetLen = initial & 15; + if (octetLen === 0 || octetLen > 4) { + return false; + } + var val = 0; + for (var i = 0, off = p.place; i < octetLen; i++, off++) { + val <<= 8; + val |= buf[off]; + val >>>= 0; + } + if (val <= 127) { + return false; + } + p.place = off; + return val; + } + function rmPadding(buf) { + var i = 0; + var len = buf.length - 1; + while (!buf[i] && !(buf[i + 1] & 128) && i < len) { + i++; + } + if (i === 0) { + return buf; + } + return buf.slice(i); + } + Signature.prototype._importDER = function _importDER(data2, enc) { + data2 = utils2.toArray(data2, enc); + var p = new Position3(); + if (data2[p.place++] !== 48) { + return false; + } + var len = getLength(data2, p); + if (len === false) { + return false; + } + if (len + p.place !== data2.length) { + return false; + } + if (data2[p.place++] !== 2) { + return false; + } + var rlen = getLength(data2, p); + if (rlen === false) { + return false; + } + var r = data2.slice(p.place, rlen + p.place); + p.place += rlen; + if (data2[p.place++] !== 2) { + return false; + } + var slen = getLength(data2, p); + if (slen === false) { + return false; + } + if (data2.length !== slen + p.place) { + return false; + } + var s = data2.slice(p.place, slen + p.place); + if (r[0] === 0) { + if (r[1] & 128) { + r = r.slice(1); + } else { + return false; + } + } + if (s[0] === 0) { + if (s[1] & 128) { + s = s.slice(1); + } else { + return false; + } + } + this.r = new BN(r); + this.s = new BN(s); + this.recoveryParam = null; + return true; + }; + function constructLength(arr, len) { + if (len < 128) { + arr.push(len); + return; + } + var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); + arr.push(octets | 128); + while (--octets) { + arr.push(len >>> (octets << 3) & 255); + } + arr.push(len); + } + Signature.prototype.toDER = function toDER(enc) { + var r = this.r.toArray(); + var s = this.s.toArray(); + if (r[0] & 128) + r = [0].concat(r); + if (s[0] & 128) + s = [0].concat(s); + r = rmPadding(r); + s = rmPadding(s); + while (!s[0] && !(s[1] & 128)) { + s = s.slice(1); + } + var arr = [2]; + constructLength(arr, r.length); + arr = arr.concat(r); + arr.push(2); + constructLength(arr, s.length); + var backHalf = arr.concat(s); + var res = [48]; + constructLength(res, backHalf.length); + res = res.concat(backHalf); + return utils2.encode(res, enc); + }; + return signature$1; +} +var ec; +var hasRequiredEc; +function requireEc() { + if (hasRequiredEc) return ec; + hasRequiredEc = 1; + var BN = requireBn$3(); + var HmacDRBG = requireHmacDrbg(); + var utils2 = requireUtils$2(); + var curves2 = requireCurves(); + var rand = requireBrorand(); + var assert2 = utils2.assert; + var KeyPair = requireKey$1(); + var Signature = requireSignature$1(); + function EC(options2) { + if (!(this instanceof EC)) + return new EC(options2); + if (typeof options2 === "string") { + assert2( + Object.prototype.hasOwnProperty.call(curves2, options2), + "Unknown curve " + options2 + ); + options2 = curves2[options2]; + } + if (options2 instanceof curves2.PresetCurve) + options2 = { curve: options2 }; + this.curve = options2.curve.curve; + this.n = this.curve.n; + this.nh = this.n.ushrn(1); + this.g = this.curve.g; + this.g = options2.curve.g; + this.g.precompute(options2.curve.n.bitLength() + 1); + this.hash = options2.hash || options2.curve.hash; + } + ec = EC; + EC.prototype.keyPair = function keyPair(options2) { + return new KeyPair(this, options2); + }; + EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { + return KeyPair.fromPrivate(this, priv, enc); + }; + EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { + return KeyPair.fromPublic(this, pub, enc); + }; + EC.prototype.genKeyPair = function genKeyPair(options2) { + if (!options2) + options2 = {}; + var drbg = new HmacDRBG({ + hash: this.hash, + pers: options2.pers, + persEnc: options2.persEnc || "utf8", + entropy: options2.entropy || rand(this.hash.hmacStrength), + entropyEnc: options2.entropy && options2.entropyEnc || "utf8", + nonce: this.n.toArray() + }); + var bytes = this.n.byteLength(); + var ns2 = this.n.sub(new BN(2)); + for (; ; ) { + var priv = new BN(drbg.generate(bytes)); + if (priv.cmp(ns2) > 0) + continue; + priv.iaddn(1); + return this.keyFromPrivate(priv); + } + }; + EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) { + var delta = msg.byteLength() * 8 - this.n.bitLength(); + if (delta > 0) + msg = msg.ushrn(delta); + if (!truncOnly && msg.cmp(this.n) >= 0) + return msg.sub(this.n); + else + return msg; + }; + EC.prototype.sign = function sign2(msg, key2, enc, options2) { + if (typeof enc === "object") { + options2 = enc; + enc = null; + } + if (!options2) + options2 = {}; + key2 = this.keyFromPrivate(key2, enc); + msg = this._truncateToN(new BN(msg, 16)); + var bytes = this.n.byteLength(); + var bkey = key2.getPrivate().toArray("be", bytes); + var nonce = msg.toArray("be", bytes); + var drbg = new HmacDRBG({ + hash: this.hash, + entropy: bkey, + nonce, + pers: options2.pers, + persEnc: options2.persEnc || "utf8" + }); + var ns1 = this.n.sub(new BN(1)); + for (var iter = 0; ; iter++) { + var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength())); + k = this._truncateToN(k, true); + if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) + continue; + var kp = this.g.mul(k); + if (kp.isInfinity()) + continue; + var kpX = kp.getX(); + var r = kpX.umod(this.n); + if (r.cmpn(0) === 0) + continue; + var s = k.invm(this.n).mul(r.mul(key2.getPrivate()).iadd(msg)); + s = s.umod(this.n); + if (s.cmpn(0) === 0) + continue; + var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0); + if (options2.canonical && s.cmp(this.nh) > 0) { + s = this.n.sub(s); + recoveryParam ^= 1; + } + return new Signature({ r, s, recoveryParam }); + } + }; + EC.prototype.verify = function verify(msg, signature2, key2, enc) { + msg = this._truncateToN(new BN(msg, 16)); + key2 = this.keyFromPublic(key2, enc); + signature2 = new Signature(signature2, "hex"); + var r = signature2.r; + var s = signature2.s; + if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) + return false; + if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) + return false; + var sinv = s.invm(this.n); + var u1 = sinv.mul(msg).umod(this.n); + var u2 = sinv.mul(r).umod(this.n); + var p; + if (!this.curve._maxwellTrick) { + p = this.g.mulAdd(u1, key2.getPublic(), u2); + if (p.isInfinity()) + return false; + return p.getX().umod(this.n).cmp(r) === 0; + } + p = this.g.jmulAdd(u1, key2.getPublic(), u2); + if (p.isInfinity()) + return false; + return p.eqXToP(r); + }; + EC.prototype.recoverPubKey = function(msg, signature2, j, enc) { + assert2((3 & j) === j, "The recovery param is more than two bits"); + signature2 = new Signature(signature2, enc); + var n = this.n; + var e = new BN(msg); + var r = signature2.r; + var s = signature2.s; + var isYOdd = j & 1; + var isSecondKey = j >> 1; + if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) + throw new Error("Unable to find sencond key candinate"); + if (isSecondKey) + r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); + else + r = this.curve.pointFromX(r, isYOdd); + var rInv = signature2.r.invm(n); + var s1 = n.sub(e).mul(rInv).umod(n); + var s2 = s.mul(rInv).umod(n); + return this.g.mulAdd(s1, r, s2); + }; + EC.prototype.getKeyRecoveryParam = function(e, signature2, Q, enc) { + signature2 = new Signature(signature2, enc); + if (signature2.recoveryParam !== null) + return signature2.recoveryParam; + for (var i = 0; i < 4; i++) { + var Qprime; + try { + Qprime = this.recoverPubKey(e, signature2, i); + } catch (e2) { + continue; + } + if (Qprime.eq(Q)) + return i; + } + throw new Error("Unable to find valid recovery factor"); + }; + return ec; +} +var key; +var hasRequiredKey; +function requireKey() { + if (hasRequiredKey) return key; + hasRequiredKey = 1; + var utils2 = requireUtils$2(); + var assert2 = utils2.assert; + var parseBytes = utils2.parseBytes; + var cachedProperty = utils2.cachedProperty; + function KeyPair(eddsa2, params) { + this.eddsa = eddsa2; + this._secret = parseBytes(params.secret); + if (eddsa2.isPoint(params.pub)) + this._pub = params.pub; + else + this._pubBytes = parseBytes(params.pub); + } + KeyPair.fromPublic = function fromPublic(eddsa2, pub) { + if (pub instanceof KeyPair) + return pub; + return new KeyPair(eddsa2, { pub }); + }; + KeyPair.fromSecret = function fromSecret(eddsa2, secret) { + if (secret instanceof KeyPair) + return secret; + return new KeyPair(eddsa2, { secret }); + }; + KeyPair.prototype.secret = function secret() { + return this._secret; + }; + cachedProperty(KeyPair, "pubBytes", function pubBytes() { + return this.eddsa.encodePoint(this.pub()); + }); + cachedProperty(KeyPair, "pub", function pub() { + if (this._pubBytes) + return this.eddsa.decodePoint(this._pubBytes); + return this.eddsa.g.mul(this.priv()); + }); + cachedProperty(KeyPair, "privBytes", function privBytes() { + var eddsa2 = this.eddsa; + var hash2 = this.hash(); + var lastIx = eddsa2.encodingLength - 1; + var a = hash2.slice(0, eddsa2.encodingLength); + a[0] &= 248; + a[lastIx] &= 127; + a[lastIx] |= 64; + return a; + }); + cachedProperty(KeyPair, "priv", function priv() { + return this.eddsa.decodeInt(this.privBytes()); + }); + cachedProperty(KeyPair, "hash", function hash2() { + return this.eddsa.hash().update(this.secret()).digest(); + }); + cachedProperty(KeyPair, "messagePrefix", function messagePrefix() { + return this.hash().slice(this.eddsa.encodingLength); + }); + KeyPair.prototype.sign = function sign2(message) { + assert2(this._secret, "KeyPair can only verify"); + return this.eddsa.sign(message, this); + }; + KeyPair.prototype.verify = function verify(message, sig) { + return this.eddsa.verify(message, sig, this); + }; + KeyPair.prototype.getSecret = function getSecret(enc) { + assert2(this._secret, "KeyPair is public only"); + return utils2.encode(this.secret(), enc); + }; + KeyPair.prototype.getPublic = function getPublic(enc) { + return utils2.encode(this.pubBytes(), enc); + }; + key = KeyPair; + return key; +} +var signature; +var hasRequiredSignature; +function requireSignature() { + if (hasRequiredSignature) return signature; + hasRequiredSignature = 1; + var BN = requireBn$3(); + var utils2 = requireUtils$2(); + var assert2 = utils2.assert; + var cachedProperty = utils2.cachedProperty; + var parseBytes = utils2.parseBytes; + function Signature(eddsa2, sig) { + this.eddsa = eddsa2; + if (typeof sig !== "object") + sig = parseBytes(sig); + if (Array.isArray(sig)) { + sig = { + R: sig.slice(0, eddsa2.encodingLength), + S: sig.slice(eddsa2.encodingLength) + }; + } + assert2(sig.R && sig.S, "Signature without R or S"); + if (eddsa2.isPoint(sig.R)) + this._R = sig.R; + if (sig.S instanceof BN) + this._S = sig.S; + this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; + this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; + } + cachedProperty(Signature, "S", function S() { + return this.eddsa.decodeInt(this.Sencoded()); + }); + cachedProperty(Signature, "R", function R() { + return this.eddsa.decodePoint(this.Rencoded()); + }); + cachedProperty(Signature, "Rencoded", function Rencoded() { + return this.eddsa.encodePoint(this.R()); + }); + cachedProperty(Signature, "Sencoded", function Sencoded() { + return this.eddsa.encodeInt(this.S()); + }); + Signature.prototype.toBytes = function toBytes() { + return this.Rencoded().concat(this.Sencoded()); + }; + Signature.prototype.toHex = function toHex() { + return utils2.encode(this.toBytes(), "hex").toUpperCase(); + }; + signature = Signature; + return signature; +} +var eddsa; +var hasRequiredEddsa; +function requireEddsa() { + if (hasRequiredEddsa) return eddsa; + hasRequiredEddsa = 1; + var hash2 = requireHash(); + var curves2 = requireCurves(); + var utils2 = requireUtils$2(); + var assert2 = utils2.assert; + var parseBytes = utils2.parseBytes; + var KeyPair = requireKey(); + var Signature = requireSignature(); + function EDDSA(curve2) { + assert2(curve2 === "ed25519", "only tested with ed25519 so far"); + if (!(this instanceof EDDSA)) + return new EDDSA(curve2); + curve2 = curves2[curve2].curve; + this.curve = curve2; + this.g = curve2.g; + this.g.precompute(curve2.n.bitLength() + 1); + this.pointClass = curve2.point().constructor; + this.encodingLength = Math.ceil(curve2.n.bitLength() / 8); + this.hash = hash2.sha512; + } + eddsa = EDDSA; + EDDSA.prototype.sign = function sign2(message, secret) { + message = parseBytes(message); + var key2 = this.keyFromSecret(secret); + var r = this.hashInt(key2.messagePrefix(), message); + var R = this.g.mul(r); + var Rencoded = this.encodePoint(R); + var s_ = this.hashInt(Rencoded, key2.pubBytes(), message).mul(key2.priv()); + var S = r.add(s_).umod(this.curve.n); + return this.makeSignature({ R, S, Rencoded }); + }; + EDDSA.prototype.verify = function verify(message, sig, pub) { + message = parseBytes(message); + sig = this.makeSignature(sig); + var key2 = this.keyFromPublic(pub); + var h = this.hashInt(sig.Rencoded(), key2.pubBytes(), message); + var SG = this.g.mul(sig.S()); + var RplusAh = sig.R().add(key2.pub().mul(h)); + return RplusAh.eq(SG); + }; + EDDSA.prototype.hashInt = function hashInt() { + var hash3 = this.hash(); + for (var i = 0; i < arguments.length; i++) + hash3.update(arguments[i]); + return utils2.intFromLE(hash3.digest()).umod(this.curve.n); + }; + EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { + return KeyPair.fromPublic(this, pub); + }; + EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { + return KeyPair.fromSecret(this, secret); + }; + EDDSA.prototype.makeSignature = function makeSignature(sig) { + if (sig instanceof Signature) + return sig; + return new Signature(this, sig); + }; + EDDSA.prototype.encodePoint = function encodePoint(point) { + var enc = point.getY().toArray("le", this.encodingLength); + enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0; + return enc; + }; + EDDSA.prototype.decodePoint = function decodePoint(bytes) { + bytes = utils2.parseBytes(bytes); + var lastIx = bytes.length - 1; + var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & -129); + var xIsOdd = (bytes[lastIx] & 128) !== 0; + var y = utils2.intFromLE(normed); + return this.curve.pointFromY(y, xIsOdd); + }; + EDDSA.prototype.encodeInt = function encodeInt(num) { + return num.toArray("le", this.encodingLength); + }; + EDDSA.prototype.decodeInt = function decodeInt(bytes) { + return utils2.intFromLE(bytes); + }; + EDDSA.prototype.isPoint = function isPoint(val) { + return val instanceof this.pointClass; + }; + return eddsa; +} +var hasRequiredElliptic; +function requireElliptic() { + if (hasRequiredElliptic) return elliptic; + hasRequiredElliptic = 1; + (function(exports) { + var elliptic2 = exports; + elliptic2.version = require$$0$4.version; + elliptic2.utils = requireUtils$2(); + elliptic2.rand = requireBrorand(); + elliptic2.curve = requireCurve(); + elliptic2.curves = requireCurves(); + elliptic2.ec = requireEc(); + elliptic2.eddsa = requireEddsa(); + })(elliptic); + return elliptic; +} +var asn1$1 = {}; +var asn1 = {}; +var bn$5 = { exports: {} }; +var bn$4 = bn$5.exports; +var hasRequiredBn$2; +function requireBn$2() { + if (hasRequiredBn$2) return bn$5.exports; + hasRequiredBn$2 = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + return c - 48 & 15; + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this.strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + r += c - 49 + 10; + } else if (c >= 17) { + r += c - 17 + 10; + } else { + r += c; + } + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this.strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype.strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + BN.prototype.inspect = function inspect() { + return (this.red ? ""; + }; + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16); + }; + BN.prototype.toBuffer = function toBuffer2(endian, length) { + assert2(typeof Buffer2 !== "undefined"); + return this.toArrayLike(Buffer2, endian, length); + }; + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + this.strip(); + var littleEndian = endian === "le"; + var res = new ArrayType(reqLength); + var b, i; + var q = this.clone(); + if (!littleEndian) { + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[i] = b; + } + for (; i < reqLength; i++) { + res[i] = 0; + } + } + return res; + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = (num.words[off] & 1 << wbit) >>> wbit; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this.strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this.strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this.strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this.strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this.strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this.strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out.strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out.strip(); + } + function jumboMulTo(self2, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + function FFTM(x, y) { + this.x = x; + this.y = y; + } + FFTM.prototype.makeRBT = function makeRBT(N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + return t; + }; + FFTM.prototype.revBin = function revBin(x, l, N) { + if (x === 0 || x === N - 1) return x; + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << l - i - 1; + x >>= 1; + } + return rb; + }; + FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + FFTM.prototype.transform = function transform2(rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + for (var j = 0; j < s; j++) { + var re2 = rtws[p + j]; + var ie = itws[p + j]; + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + var rx = rtwdf_ * ro - itwdf_ * io; + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + rtws[p + j] = re2 + ro; + itws[p + j] = ie + io; + rtws[p + j + s] = re2 - ro; + itws[p + j + s] = ie - io; + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + FFTM.prototype.guessLen13b = function guessLen13b(n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + return 1 << i + 1 + odd; + }; + FFTM.prototype.conjugate = function conjugate(rws, iws, N) { + if (N <= 1) return; + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + t = iws[i]; + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + FFTM.prototype.normalize13b = function normalize13b(ws2, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws2[2 * i + 1] / N) * 8192 + Math.round(ws2[2 * i] / N) + carry; + ws2[i] = w & 67108863; + if (w < 67108864) { + carry = 0; + } else { + carry = w / 67108864 | 0; + } + } + return ws2; + }; + FFTM.prototype.convert13b = function convert13b(ws2, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws2[i] | 0); + rws[2 * i] = carry & 8191; + carry = carry >>> 13; + rws[2 * i + 1] = carry & 8191; + carry = carry >>> 13; + } + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + assert2(carry === 0); + assert2((carry & -8192) === 0); + }; + FFTM.prototype.stub = function stub(N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + return ph; + }; + FFTM.prototype.mulp = function mulp(x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + var rbt = this.makeRBT(N); + var _ = this.stub(N); + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + var rmws = out.words; + rmws.length = N; + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this.strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this.strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this.strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this.strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this.strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this.strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modn = function modn(num) { + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return acc; + }; + BN.prototype.idivn = function idivn(num) { + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + return this.strip(); + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this.strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn$4); + })(bn$5); + return bn$5.exports; +} +var api = {}; +var encoders = {}; +var safer_1; +var hasRequiredSafer; +function requireSafer() { + if (hasRequiredSafer) return safer_1; + hasRequiredSafer = 1; + var buffer2 = requireBuffer$2(); + var Buffer2 = buffer2.Buffer; + var safer = {}; + var key2; + for (key2 in buffer2) { + if (!buffer2.hasOwnProperty(key2)) continue; + if (key2 === "SlowBuffer" || key2 === "Buffer") continue; + safer[key2] = buffer2[key2]; + } + var Safer = safer.Buffer = {}; + for (key2 in Buffer2) { + if (!Buffer2.hasOwnProperty(key2)) continue; + if (key2 === "allocUnsafe" || key2 === "allocUnsafeSlow") continue; + Safer[key2] = Buffer2[key2]; + } + safer.Buffer.prototype = Buffer2.prototype; + if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function(value, encodingOrOffset, length) { + if (typeof value === "number") { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value); + } + if (value && typeof value.length === "undefined") { + throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value); + } + return Buffer2(value, encodingOrOffset, length); + }; + } + if (!Safer.alloc) { + Safer.alloc = function(size, fill, encoding2) { + if (typeof size !== "number") { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size); + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"'); + } + var buf = Buffer2(size); + if (!fill || fill.length === 0) { + buf.fill(0); + } else if (typeof encoding2 === "string") { + buf.fill(fill, encoding2); + } else { + buf.fill(fill); + } + return buf; + }; + } + if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding("buffer").kStringMaxLength; + } catch (e) { + } + } + if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + }; + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength; + } + } + safer_1 = safer; + return safer_1; +} +var reporter = {}; +var hasRequiredReporter; +function requireReporter() { + if (hasRequiredReporter) return reporter; + hasRequiredReporter = 1; + const inherits = requireInherits_browser$1(); + function Reporter(options2) { + this._reporterState = { + obj: null, + path: [], + options: options2 || {}, + errors: [] + }; + } + reporter.Reporter = Reporter; + Reporter.prototype.isError = function isError2(obj) { + return obj instanceof ReporterError; + }; + Reporter.prototype.save = function save() { + const state2 = this._reporterState; + return { obj: state2.obj, pathLen: state2.path.length }; + }; + Reporter.prototype.restore = function restore(data2) { + const state2 = this._reporterState; + state2.obj = data2.obj; + state2.path = state2.path.slice(0, data2.pathLen); + }; + Reporter.prototype.enterKey = function enterKey(key2) { + return this._reporterState.path.push(key2); + }; + Reporter.prototype.exitKey = function exitKey(index2) { + const state2 = this._reporterState; + state2.path = state2.path.slice(0, index2 - 1); + }; + Reporter.prototype.leaveKey = function leaveKey(index2, key2, value) { + const state2 = this._reporterState; + this.exitKey(index2); + if (state2.obj !== null) + state2.obj[key2] = value; + }; + Reporter.prototype.path = function path2() { + return this._reporterState.path.join("/"); + }; + Reporter.prototype.enterObject = function enterObject() { + const state2 = this._reporterState; + const prev = state2.obj; + state2.obj = {}; + return prev; + }; + Reporter.prototype.leaveObject = function leaveObject(prev) { + const state2 = this._reporterState; + const now = state2.obj; + state2.obj = prev; + return now; + }; + Reporter.prototype.error = function error2(msg) { + let err; + const state2 = this._reporterState; + const inherited = msg instanceof ReporterError; + if (inherited) { + err = msg; + } else { + err = new ReporterError(state2.path.map(function(elem) { + return "[" + JSON.stringify(elem) + "]"; + }).join(""), msg.message || msg, msg.stack); + } + if (!state2.options.partial) + throw err; + if (!inherited) + state2.errors.push(err); + return err; + }; + Reporter.prototype.wrapResult = function wrapResult(result) { + const state2 = this._reporterState; + if (!state2.options.partial) + return result; + return { + result: this.isError(result) ? null : result, + errors: state2.errors + }; + }; + function ReporterError(path2, msg) { + this.path = path2; + this.rethrow(msg); + } + inherits(ReporterError, Error); + ReporterError.prototype.rethrow = function rethrow(msg) { + this.message = msg + " at: " + (this.path || "(shallow)"); + if (Error.captureStackTrace) + Error.captureStackTrace(this, ReporterError); + if (!this.stack) { + try { + throw new Error(this.message); + } catch (e) { + this.stack = e.stack; + } + } + return this; + }; + return reporter; +} +var buffer = {}; +var hasRequiredBuffer; +function requireBuffer() { + if (hasRequiredBuffer) return buffer; + hasRequiredBuffer = 1; + const inherits = requireInherits_browser$1(); + const Reporter = requireReporter().Reporter; + const Buffer2 = requireSafer().Buffer; + function DecoderBuffer(base2, options2) { + Reporter.call(this, options2); + if (!Buffer2.isBuffer(base2)) { + this.error("Input not Buffer"); + return; + } + this.base = base2; + this.offset = 0; + this.length = base2.length; + } + inherits(DecoderBuffer, Reporter); + buffer.DecoderBuffer = DecoderBuffer; + DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data2) { + if (data2 instanceof DecoderBuffer) { + return true; + } + const isCompatible = typeof data2 === "object" && Buffer2.isBuffer(data2.base) && data2.constructor.name === "DecoderBuffer" && typeof data2.offset === "number" && typeof data2.length === "number" && typeof data2.save === "function" && typeof data2.restore === "function" && typeof data2.isEmpty === "function" && typeof data2.readUInt8 === "function" && typeof data2.skip === "function" && typeof data2.raw === "function"; + return isCompatible; + }; + DecoderBuffer.prototype.save = function save() { + return { offset: this.offset, reporter: Reporter.prototype.save.call(this) }; + }; + DecoderBuffer.prototype.restore = function restore(save) { + const res = new DecoderBuffer(this.base); + res.offset = save.offset; + res.length = this.offset; + this.offset = save.offset; + Reporter.prototype.restore.call(this, save.reporter); + return res; + }; + DecoderBuffer.prototype.isEmpty = function isEmpty2() { + return this.offset === this.length; + }; + DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) { + if (this.offset + 1 <= this.length) + return this.base.readUInt8(this.offset++, true); + else + return this.error(fail || "DecoderBuffer overrun"); + }; + DecoderBuffer.prototype.skip = function skip(bytes, fail) { + if (!(this.offset + bytes <= this.length)) + return this.error(fail || "DecoderBuffer overrun"); + const res = new DecoderBuffer(this.base); + res._reporterState = this._reporterState; + res.offset = this.offset; + res.length = this.offset + bytes; + this.offset += bytes; + return res; + }; + DecoderBuffer.prototype.raw = function raw(save) { + return this.base.slice(save ? save.offset : this.offset, this.length); + }; + function EncoderBuffer(value, reporter2) { + if (Array.isArray(value)) { + this.length = 0; + this.value = value.map(function(item) { + if (!EncoderBuffer.isEncoderBuffer(item)) + item = new EncoderBuffer(item, reporter2); + this.length += item.length; + return item; + }, this); + } else if (typeof value === "number") { + if (!(0 <= value && value <= 255)) + return reporter2.error("non-byte EncoderBuffer value"); + this.value = value; + this.length = 1; + } else if (typeof value === "string") { + this.value = value; + this.length = Buffer2.byteLength(value); + } else if (Buffer2.isBuffer(value)) { + this.value = value; + this.length = value.length; + } else { + return reporter2.error("Unsupported type: " + typeof value); + } + } + buffer.EncoderBuffer = EncoderBuffer; + EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data2) { + if (data2 instanceof EncoderBuffer) { + return true; + } + const isCompatible = typeof data2 === "object" && data2.constructor.name === "EncoderBuffer" && typeof data2.length === "number" && typeof data2.join === "function"; + return isCompatible; + }; + EncoderBuffer.prototype.join = function join2(out, offset2) { + if (!out) + out = Buffer2.alloc(this.length); + if (!offset2) + offset2 = 0; + if (this.length === 0) + return out; + if (Array.isArray(this.value)) { + this.value.forEach(function(item) { + item.join(out, offset2); + offset2 += item.length; + }); + } else { + if (typeof this.value === "number") + out[offset2] = this.value; + else if (typeof this.value === "string") + out.write(this.value, offset2); + else if (Buffer2.isBuffer(this.value)) + this.value.copy(out, offset2); + offset2 += this.length; + } + return out; + }; + return buffer; +} +var node; +var hasRequiredNode; +function requireNode() { + if (hasRequiredNode) return node; + hasRequiredNode = 1; + const Reporter = requireReporter().Reporter; + const EncoderBuffer = requireBuffer().EncoderBuffer; + const DecoderBuffer = requireBuffer().DecoderBuffer; + const assert2 = requireMinimalisticAssert(); + const tags = [ + "seq", + "seqof", + "set", + "setof", + "objid", + "bool", + "gentime", + "utctime", + "null_", + "enum", + "int", + "objDesc", + "bitstr", + "bmpstr", + "charstr", + "genstr", + "graphstr", + "ia5str", + "iso646str", + "numstr", + "octstr", + "printstr", + "t61str", + "unistr", + "utf8str", + "videostr" + ]; + const methods = [ + "key", + "obj", + "use", + "optional", + "explicit", + "implicit", + "def", + "choice", + "any", + "contains" + ].concat(tags); + const overrided = [ + "_peekTag", + "_decodeTag", + "_use", + "_decodeStr", + "_decodeObjid", + "_decodeTime", + "_decodeNull", + "_decodeInt", + "_decodeBool", + "_decodeList", + "_encodeComposite", + "_encodeStr", + "_encodeObjid", + "_encodeTime", + "_encodeNull", + "_encodeInt", + "_encodeBool" + ]; + function Node3(enc, parent, name) { + const state2 = {}; + this._baseState = state2; + state2.name = name; + state2.enc = enc; + state2.parent = parent || null; + state2.children = null; + state2.tag = null; + state2.args = null; + state2.reverseArgs = null; + state2.choice = null; + state2.optional = false; + state2.any = false; + state2.obj = false; + state2.use = null; + state2.useDecoder = null; + state2.key = null; + state2["default"] = null; + state2.explicit = null; + state2.implicit = null; + state2.contains = null; + if (!state2.parent) { + state2.children = []; + this._wrap(); + } + } + node = Node3; + const stateProps = [ + "enc", + "parent", + "children", + "tag", + "args", + "reverseArgs", + "choice", + "optional", + "any", + "obj", + "use", + "alteredUse", + "key", + "default", + "explicit", + "implicit", + "contains" + ]; + Node3.prototype.clone = function clone() { + const state2 = this._baseState; + const cstate = {}; + stateProps.forEach(function(prop) { + cstate[prop] = state2[prop]; + }); + const res = new this.constructor(cstate.parent); + res._baseState = cstate; + return res; + }; + Node3.prototype._wrap = function wrap() { + const state2 = this._baseState; + methods.forEach(function(method) { + this[method] = function _wrappedMethod() { + const clone = new this.constructor(this); + state2.children.push(clone); + return clone[method].apply(clone, arguments); + }; + }, this); + }; + Node3.prototype._init = function init(body) { + const state2 = this._baseState; + assert2(state2.parent === null); + body.call(this); + state2.children = state2.children.filter(function(child) { + return child._baseState.parent === this; + }, this); + assert2.equal(state2.children.length, 1, "Root node can have only one child"); + }; + Node3.prototype._useArgs = function useArgs(args) { + const state2 = this._baseState; + const children = args.filter(function(arg) { + return arg instanceof this.constructor; + }, this); + args = args.filter(function(arg) { + return !(arg instanceof this.constructor); + }, this); + if (children.length !== 0) { + assert2(state2.children === null); + state2.children = children; + children.forEach(function(child) { + child._baseState.parent = this; + }, this); + } + if (args.length !== 0) { + assert2(state2.args === null); + state2.args = args; + state2.reverseArgs = args.map(function(arg) { + if (typeof arg !== "object" || arg.constructor !== Object) + return arg; + const res = {}; + Object.keys(arg).forEach(function(key2) { + if (key2 == (key2 | 0)) + key2 |= 0; + const value = arg[key2]; + res[value] = key2; + }); + return res; + }); + } + }; + overrided.forEach(function(method) { + Node3.prototype[method] = function _overrided() { + const state2 = this._baseState; + throw new Error(method + " not implemented for encoding: " + state2.enc); + }; + }); + tags.forEach(function(tag) { + Node3.prototype[tag] = function _tagMethod() { + const state2 = this._baseState; + const args = Array.prototype.slice.call(arguments); + assert2(state2.tag === null); + state2.tag = tag; + this._useArgs(args); + return this; + }; + }); + Node3.prototype.use = function use(item) { + assert2(item); + const state2 = this._baseState; + assert2(state2.use === null); + state2.use = item; + return this; + }; + Node3.prototype.optional = function optional() { + const state2 = this._baseState; + state2.optional = true; + return this; + }; + Node3.prototype.def = function def(val) { + const state2 = this._baseState; + assert2(state2["default"] === null); + state2["default"] = val; + state2.optional = true; + return this; + }; + Node3.prototype.explicit = function explicit(num) { + const state2 = this._baseState; + assert2(state2.explicit === null && state2.implicit === null); + state2.explicit = num; + return this; + }; + Node3.prototype.implicit = function implicit(num) { + const state2 = this._baseState; + assert2(state2.explicit === null && state2.implicit === null); + state2.implicit = num; + return this; + }; + Node3.prototype.obj = function obj() { + const state2 = this._baseState; + const args = Array.prototype.slice.call(arguments); + state2.obj = true; + if (args.length !== 0) + this._useArgs(args); + return this; + }; + Node3.prototype.key = function key2(newKey) { + const state2 = this._baseState; + assert2(state2.key === null); + state2.key = newKey; + return this; + }; + Node3.prototype.any = function any() { + const state2 = this._baseState; + state2.any = true; + return this; + }; + Node3.prototype.choice = function choice(obj) { + const state2 = this._baseState; + assert2(state2.choice === null); + state2.choice = obj; + this._useArgs(Object.keys(obj).map(function(key2) { + return obj[key2]; + })); + return this; + }; + Node3.prototype.contains = function contains(item) { + const state2 = this._baseState; + assert2(state2.use === null); + state2.contains = item; + return this; + }; + Node3.prototype._decode = function decode(input, options2) { + const state2 = this._baseState; + if (state2.parent === null) + return input.wrapResult(state2.children[0]._decode(input, options2)); + let result = state2["default"]; + let present = true; + let prevKey = null; + if (state2.key !== null) + prevKey = input.enterKey(state2.key); + if (state2.optional) { + let tag = null; + if (state2.explicit !== null) + tag = state2.explicit; + else if (state2.implicit !== null) + tag = state2.implicit; + else if (state2.tag !== null) + tag = state2.tag; + if (tag === null && !state2.any) { + const save = input.save(); + try { + if (state2.choice === null) + this._decodeGeneric(state2.tag, input, options2); + else + this._decodeChoice(input, options2); + present = true; + } catch (e) { + present = false; + } + input.restore(save); + } else { + present = this._peekTag(input, tag, state2.any); + if (input.isError(present)) + return present; + } + } + let prevObj; + if (state2.obj && present) + prevObj = input.enterObject(); + if (present) { + if (state2.explicit !== null) { + const explicit = this._decodeTag(input, state2.explicit); + if (input.isError(explicit)) + return explicit; + input = explicit; + } + const start = input.offset; + if (state2.use === null && state2.choice === null) { + let save; + if (state2.any) + save = input.save(); + const body = this._decodeTag( + input, + state2.implicit !== null ? state2.implicit : state2.tag, + state2.any + ); + if (input.isError(body)) + return body; + if (state2.any) + result = input.raw(save); + else + input = body; + } + if (options2 && options2.track && state2.tag !== null) + options2.track(input.path(), start, input.length, "tagged"); + if (options2 && options2.track && state2.tag !== null) + options2.track(input.path(), input.offset, input.length, "content"); + if (state2.any) ; + else if (state2.choice === null) { + result = this._decodeGeneric(state2.tag, input, options2); + } else { + result = this._decodeChoice(input, options2); + } + if (input.isError(result)) + return result; + if (!state2.any && state2.choice === null && state2.children !== null) { + state2.children.forEach(function decodeChildren(child) { + child._decode(input, options2); + }); + } + if (state2.contains && (state2.tag === "octstr" || state2.tag === "bitstr")) { + const data2 = new DecoderBuffer(result); + result = this._getUse(state2.contains, input._reporterState.obj)._decode(data2, options2); + } + } + if (state2.obj && present) + result = input.leaveObject(prevObj); + if (state2.key !== null && (result !== null || present === true)) + input.leaveKey(prevKey, state2.key, result); + else if (prevKey !== null) + input.exitKey(prevKey); + return result; + }; + Node3.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) { + const state2 = this._baseState; + if (tag === "seq" || tag === "set") + return null; + if (tag === "seqof" || tag === "setof") + return this._decodeList(input, tag, state2.args[0], options2); + else if (/str$/.test(tag)) + return this._decodeStr(input, tag, options2); + else if (tag === "objid" && state2.args) + return this._decodeObjid(input, state2.args[0], state2.args[1], options2); + else if (tag === "objid") + return this._decodeObjid(input, null, null, options2); + else if (tag === "gentime" || tag === "utctime") + return this._decodeTime(input, tag, options2); + else if (tag === "null_") + return this._decodeNull(input, options2); + else if (tag === "bool") + return this._decodeBool(input, options2); + else if (tag === "objDesc") + return this._decodeStr(input, tag, options2); + else if (tag === "int" || tag === "enum") + return this._decodeInt(input, state2.args && state2.args[0], options2); + if (state2.use !== null) { + return this._getUse(state2.use, input._reporterState.obj)._decode(input, options2); + } else { + return input.error("unknown tag: " + tag); + } + }; + Node3.prototype._getUse = function _getUse(entity, obj) { + const state2 = this._baseState; + state2.useDecoder = this._use(entity, obj); + assert2(state2.useDecoder._baseState.parent === null); + state2.useDecoder = state2.useDecoder._baseState.children[0]; + if (state2.implicit !== state2.useDecoder._baseState.implicit) { + state2.useDecoder = state2.useDecoder.clone(); + state2.useDecoder._baseState.implicit = state2.implicit; + } + return state2.useDecoder; + }; + Node3.prototype._decodeChoice = function decodeChoice(input, options2) { + const state2 = this._baseState; + let result = null; + let match = false; + Object.keys(state2.choice).some(function(key2) { + const save = input.save(); + const node2 = state2.choice[key2]; + try { + const value = node2._decode(input, options2); + if (input.isError(value)) + return false; + result = { type: key2, value }; + match = true; + } catch (e) { + input.restore(save); + return false; + } + return true; + }, this); + if (!match) + return input.error("Choice not matched"); + return result; + }; + Node3.prototype._createEncoderBuffer = function createEncoderBuffer(data2) { + return new EncoderBuffer(data2, this.reporter); + }; + Node3.prototype._encode = function encode(data2, reporter2, parent) { + const state2 = this._baseState; + if (state2["default"] !== null && state2["default"] === data2) + return; + const result = this._encodeValue(data2, reporter2, parent); + if (result === void 0) + return; + if (this._skipDefault(result, reporter2, parent)) + return; + return result; + }; + Node3.prototype._encodeValue = function encode(data2, reporter2, parent) { + const state2 = this._baseState; + if (state2.parent === null) + return state2.children[0]._encode(data2, reporter2 || new Reporter()); + let result = null; + this.reporter = reporter2; + if (state2.optional && data2 === void 0) { + if (state2["default"] !== null) + data2 = state2["default"]; + else + return; + } + let content = null; + let primitive = false; + if (state2.any) { + result = this._createEncoderBuffer(data2); + } else if (state2.choice) { + result = this._encodeChoice(data2, reporter2); + } else if (state2.contains) { + content = this._getUse(state2.contains, parent)._encode(data2, reporter2); + primitive = true; + } else if (state2.children) { + content = state2.children.map(function(child) { + if (child._baseState.tag === "null_") + return child._encode(null, reporter2, data2); + if (child._baseState.key === null) + return reporter2.error("Child should have a key"); + const prevKey = reporter2.enterKey(child._baseState.key); + if (typeof data2 !== "object") + return reporter2.error("Child expected, but input is not object"); + const res = child._encode(data2[child._baseState.key], reporter2, data2); + reporter2.leaveKey(prevKey); + return res; + }, this).filter(function(child) { + return child; + }); + content = this._createEncoderBuffer(content); + } else { + if (state2.tag === "seqof" || state2.tag === "setof") { + if (!(state2.args && state2.args.length === 1)) + return reporter2.error("Too many args for : " + state2.tag); + if (!Array.isArray(data2)) + return reporter2.error("seqof/setof, but data is not Array"); + const child = this.clone(); + child._baseState.implicit = null; + content = this._createEncoderBuffer(data2.map(function(item) { + const state3 = this._baseState; + return this._getUse(state3.args[0], data2)._encode(item, reporter2); + }, child)); + } else if (state2.use !== null) { + result = this._getUse(state2.use, parent)._encode(data2, reporter2); + } else { + content = this._encodePrimitive(state2.tag, data2); + primitive = true; + } + } + if (!state2.any && state2.choice === null) { + const tag = state2.implicit !== null ? state2.implicit : state2.tag; + const cls = state2.implicit === null ? "universal" : "context"; + if (tag === null) { + if (state2.use === null) + reporter2.error("Tag could be omitted only for .use()"); + } else { + if (state2.use === null) + result = this._encodeComposite(tag, primitive, cls, content); + } + } + if (state2.explicit !== null) + result = this._encodeComposite(state2.explicit, false, "context", result); + return result; + }; + Node3.prototype._encodeChoice = function encodeChoice(data2, reporter2) { + const state2 = this._baseState; + const node2 = state2.choice[data2.type]; + if (!node2) { + assert2( + false, + data2.type + " not found in " + JSON.stringify(Object.keys(state2.choice)) + ); + } + return node2._encode(data2.value, reporter2); + }; + Node3.prototype._encodePrimitive = function encodePrimitive(tag, data2) { + const state2 = this._baseState; + if (/str$/.test(tag)) + return this._encodeStr(data2, tag); + else if (tag === "objid" && state2.args) + return this._encodeObjid(data2, state2.reverseArgs[0], state2.args[1]); + else if (tag === "objid") + return this._encodeObjid(data2, null, null); + else if (tag === "gentime" || tag === "utctime") + return this._encodeTime(data2, tag); + else if (tag === "null_") + return this._encodeNull(); + else if (tag === "int" || tag === "enum") + return this._encodeInt(data2, state2.args && state2.reverseArgs[0]); + else if (tag === "bool") + return this._encodeBool(data2); + else if (tag === "objDesc") + return this._encodeStr(data2, tag); + else + throw new Error("Unsupported tag: " + tag); + }; + Node3.prototype._isNumstr = function isNumstr(str) { + return /^[0-9 ]*$/.test(str); + }; + Node3.prototype._isPrintstr = function isPrintstr(str) { + return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str); + }; + return node; +} +var der = {}; +var hasRequiredDer$2; +function requireDer$2() { + if (hasRequiredDer$2) return der; + hasRequiredDer$2 = 1; + (function(exports) { + function reverse(map2) { + const res = {}; + Object.keys(map2).forEach(function(key2) { + if ((key2 | 0) == key2) + key2 = key2 | 0; + const value = map2[key2]; + res[value] = key2; + }); + return res; + } + exports.tagClass = { + 0: "universal", + 1: "application", + 2: "context", + 3: "private" + }; + exports.tagClassByName = reverse(exports.tagClass); + exports.tag = { + 0: "end", + 1: "bool", + 2: "int", + 3: "bitstr", + 4: "octstr", + 5: "null_", + 6: "objid", + 7: "objDesc", + 8: "external", + 9: "real", + 10: "enum", + 11: "embed", + 12: "utf8str", + 13: "relativeOid", + 16: "seq", + 17: "set", + 18: "numstr", + 19: "printstr", + 20: "t61str", + 21: "videostr", + 22: "ia5str", + 23: "utctime", + 24: "gentime", + 25: "graphstr", + 26: "iso646str", + 27: "genstr", + 28: "unistr", + 29: "charstr", + 30: "bmpstr" + }; + exports.tagByName = reverse(exports.tag); + })(der); + return der; +} +var der_1$1; +var hasRequiredDer$1; +function requireDer$1() { + if (hasRequiredDer$1) return der_1$1; + hasRequiredDer$1 = 1; + const inherits = requireInherits_browser$1(); + const Buffer2 = requireSafer().Buffer; + const Node3 = requireNode(); + const der2 = requireDer$2(); + function DEREncoder(entity) { + this.enc = "der"; + this.name = entity.name; + this.entity = entity; + this.tree = new DERNode(); + this.tree._init(entity.body); + } + der_1$1 = DEREncoder; + DEREncoder.prototype.encode = function encode(data2, reporter2) { + return this.tree._encode(data2, reporter2).join(); + }; + function DERNode(parent) { + Node3.call(this, "der", parent); + } + inherits(DERNode, Node3); + DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) { + const encodedTag = encodeTag(tag, primitive, cls, this.reporter); + if (content.length < 128) { + const header2 = Buffer2.alloc(2); + header2[0] = encodedTag; + header2[1] = content.length; + return this._createEncoderBuffer([header2, content]); + } + let lenOctets = 1; + for (let i = content.length; i >= 256; i >>= 8) + lenOctets++; + const header = Buffer2.alloc(1 + 1 + lenOctets); + header[0] = encodedTag; + header[1] = 128 | lenOctets; + for (let i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) + header[i] = j & 255; + return this._createEncoderBuffer([header, content]); + }; + DERNode.prototype._encodeStr = function encodeStr(str, tag) { + if (tag === "bitstr") { + return this._createEncoderBuffer([str.unused | 0, str.data]); + } else if (tag === "bmpstr") { + const buf = Buffer2.alloc(str.length * 2); + for (let i = 0; i < str.length; i++) { + buf.writeUInt16BE(str.charCodeAt(i), i * 2); + } + return this._createEncoderBuffer(buf); + } else if (tag === "numstr") { + if (!this._isNumstr(str)) { + return this.reporter.error("Encoding of string type: numstr supports only digits and space"); + } + return this._createEncoderBuffer(str); + } else if (tag === "printstr") { + if (!this._isPrintstr(str)) { + return this.reporter.error("Encoding of string type: printstr supports only latin upper and lower case letters, digits, space, apostrophe, left and rigth parenthesis, plus sign, comma, hyphen, dot, slash, colon, equal sign, question mark"); + } + return this._createEncoderBuffer(str); + } else if (/str$/.test(tag)) { + return this._createEncoderBuffer(str); + } else if (tag === "objDesc") { + return this._createEncoderBuffer(str); + } else { + return this.reporter.error("Encoding of string type: " + tag + " unsupported"); + } + }; + DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { + if (typeof id === "string") { + if (!values) + return this.reporter.error("string objid given, but no values map found"); + if (!values.hasOwnProperty(id)) + return this.reporter.error("objid not found in values map"); + id = values[id].split(/[\s.]+/g); + for (let i = 0; i < id.length; i++) + id[i] |= 0; + } else if (Array.isArray(id)) { + id = id.slice(); + for (let i = 0; i < id.length; i++) + id[i] |= 0; + } + if (!Array.isArray(id)) { + return this.reporter.error("objid() should be either array or string, got: " + JSON.stringify(id)); + } + if (!relative) { + if (id[1] >= 40) + return this.reporter.error("Second objid identifier OOB"); + id.splice(0, 2, id[0] * 40 + id[1]); + } + let size = 0; + for (let i = 0; i < id.length; i++) { + let ident = id[i]; + for (size++; ident >= 128; ident >>= 7) + size++; + } + const objid = Buffer2.alloc(size); + let offset2 = objid.length - 1; + for (let i = id.length - 1; i >= 0; i--) { + let ident = id[i]; + objid[offset2--] = ident & 127; + while ((ident >>= 7) > 0) + objid[offset2--] = 128 | ident & 127; + } + return this._createEncoderBuffer(objid); + }; + function two(num) { + if (num < 10) + return "0" + num; + else + return num; + } + DERNode.prototype._encodeTime = function encodeTime(time, tag) { + let str; + const date = new Date(time); + if (tag === "gentime") { + str = [ + two(date.getUTCFullYear()), + two(date.getUTCMonth() + 1), + two(date.getUTCDate()), + two(date.getUTCHours()), + two(date.getUTCMinutes()), + two(date.getUTCSeconds()), + "Z" + ].join(""); + } else if (tag === "utctime") { + str = [ + two(date.getUTCFullYear() % 100), + two(date.getUTCMonth() + 1), + two(date.getUTCDate()), + two(date.getUTCHours()), + two(date.getUTCMinutes()), + two(date.getUTCSeconds()), + "Z" + ].join(""); + } else { + this.reporter.error("Encoding " + tag + " time is not supported yet"); + } + return this._encodeStr(str, "octstr"); + }; + DERNode.prototype._encodeNull = function encodeNull() { + return this._createEncoderBuffer(""); + }; + DERNode.prototype._encodeInt = function encodeInt(num, values) { + if (typeof num === "string") { + if (!values) + return this.reporter.error("String int or enum given, but no values map"); + if (!values.hasOwnProperty(num)) { + return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num)); + } + num = values[num]; + } + if (typeof num !== "number" && !Buffer2.isBuffer(num)) { + const numArray = num.toArray(); + if (!num.sign && numArray[0] & 128) { + numArray.unshift(0); + } + num = Buffer2.from(numArray); + } + if (Buffer2.isBuffer(num)) { + let size2 = num.length; + if (num.length === 0) + size2++; + const out2 = Buffer2.alloc(size2); + num.copy(out2); + if (num.length === 0) + out2[0] = 0; + return this._createEncoderBuffer(out2); + } + if (num < 128) + return this._createEncoderBuffer(num); + if (num < 256) + return this._createEncoderBuffer([0, num]); + let size = 1; + for (let i = num; i >= 256; i >>= 8) + size++; + const out = new Array(size); + for (let i = out.length - 1; i >= 0; i--) { + out[i] = num & 255; + num >>= 8; + } + if (out[0] & 128) { + out.unshift(0); + } + return this._createEncoderBuffer(Buffer2.from(out)); + }; + DERNode.prototype._encodeBool = function encodeBool(value) { + return this._createEncoderBuffer(value ? 255 : 0); + }; + DERNode.prototype._use = function use(entity, obj) { + if (typeof entity === "function") + entity = entity(obj); + return entity._getEncoder("der").tree; + }; + DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter2, parent) { + const state2 = this._baseState; + let i; + if (state2["default"] === null) + return false; + const data2 = dataBuffer.join(); + if (state2.defaultBuffer === void 0) + state2.defaultBuffer = this._encodeValue(state2["default"], reporter2, parent).join(); + if (data2.length !== state2.defaultBuffer.length) + return false; + for (i = 0; i < data2.length; i++) + if (data2[i] !== state2.defaultBuffer[i]) + return false; + return true; + }; + function encodeTag(tag, primitive, cls, reporter2) { + let res; + if (tag === "seqof") + tag = "seq"; + else if (tag === "setof") + tag = "set"; + if (der2.tagByName.hasOwnProperty(tag)) + res = der2.tagByName[tag]; + else if (typeof tag === "number" && (tag | 0) === tag) + res = tag; + else + return reporter2.error("Unknown tag: " + tag); + if (res >= 31) + return reporter2.error("Multi-octet tag encoding unsupported"); + if (!primitive) + res |= 32; + res |= der2.tagClassByName[cls || "universal"] << 6; + return res; + } + return der_1$1; +} +var pem$1; +var hasRequiredPem$1; +function requirePem$1() { + if (hasRequiredPem$1) return pem$1; + hasRequiredPem$1 = 1; + const inherits = requireInherits_browser$1(); + const DEREncoder = requireDer$1(); + function PEMEncoder(entity) { + DEREncoder.call(this, entity); + this.enc = "pem"; + } + inherits(PEMEncoder, DEREncoder); + pem$1 = PEMEncoder; + PEMEncoder.prototype.encode = function encode(data2, options2) { + const buf = DEREncoder.prototype.encode.call(this, data2); + const p = buf.toString("base64"); + const out = ["-----BEGIN " + options2.label + "-----"]; + for (let i = 0; i < p.length; i += 64) + out.push(p.slice(i, i + 64)); + out.push("-----END " + options2.label + "-----"); + return out.join("\n"); + }; + return pem$1; +} +var hasRequiredEncoders; +function requireEncoders() { + if (hasRequiredEncoders) return encoders; + hasRequiredEncoders = 1; + (function(exports) { + const encoders2 = exports; + encoders2.der = requireDer$1(); + encoders2.pem = requirePem$1(); + })(encoders); + return encoders; +} +var decoders = {}; +var der_1; +var hasRequiredDer; +function requireDer() { + if (hasRequiredDer) return der_1; + hasRequiredDer = 1; + const inherits = requireInherits_browser$1(); + const bignum = requireBn$2(); + const DecoderBuffer = requireBuffer().DecoderBuffer; + const Node3 = requireNode(); + const der2 = requireDer$2(); + function DERDecoder(entity) { + this.enc = "der"; + this.name = entity.name; + this.entity = entity; + this.tree = new DERNode(); + this.tree._init(entity.body); + } + der_1 = DERDecoder; + DERDecoder.prototype.decode = function decode(data2, options2) { + if (!DecoderBuffer.isDecoderBuffer(data2)) { + data2 = new DecoderBuffer(data2, options2); + } + return this.tree._decode(data2, options2); + }; + function DERNode(parent) { + Node3.call(this, "der", parent); + } + inherits(DERNode, Node3); + DERNode.prototype._peekTag = function peekTag(buffer2, tag, any) { + if (buffer2.isEmpty()) + return false; + const state2 = buffer2.save(); + const decodedTag = derDecodeTag(buffer2, 'Failed to peek tag: "' + tag + '"'); + if (buffer2.isError(decodedTag)) + return decodedTag; + buffer2.restore(state2); + return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any; + }; + DERNode.prototype._decodeTag = function decodeTag(buffer2, tag, any) { + const decodedTag = derDecodeTag( + buffer2, + 'Failed to decode tag of "' + tag + '"' + ); + if (buffer2.isError(decodedTag)) + return decodedTag; + let len = derDecodeLen( + buffer2, + decodedTag.primitive, + 'Failed to get length of "' + tag + '"' + ); + if (buffer2.isError(len)) + return len; + if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) { + return buffer2.error('Failed to match tag: "' + tag + '"'); + } + if (decodedTag.primitive || len !== null) + return buffer2.skip(len, 'Failed to match body of: "' + tag + '"'); + const state2 = buffer2.save(); + const res = this._skipUntilEnd( + buffer2, + 'Failed to skip indefinite length body: "' + this.tag + '"' + ); + if (buffer2.isError(res)) + return res; + len = buffer2.offset - state2.offset; + buffer2.restore(state2); + return buffer2.skip(len, 'Failed to match body of: "' + tag + '"'); + }; + DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer2, fail) { + for (; ; ) { + const tag = derDecodeTag(buffer2, fail); + if (buffer2.isError(tag)) + return tag; + const len = derDecodeLen(buffer2, tag.primitive, fail); + if (buffer2.isError(len)) + return len; + let res; + if (tag.primitive || len !== null) + res = buffer2.skip(len); + else + res = this._skipUntilEnd(buffer2, fail); + if (buffer2.isError(res)) + return res; + if (tag.tagStr === "end") + break; + } + }; + DERNode.prototype._decodeList = function decodeList(buffer2, tag, decoder2, options2) { + const result = []; + while (!buffer2.isEmpty()) { + const possibleEnd = this._peekTag(buffer2, "end"); + if (buffer2.isError(possibleEnd)) + return possibleEnd; + const res = decoder2.decode(buffer2, "der", options2); + if (buffer2.isError(res) && possibleEnd) + break; + result.push(res); + } + return result; + }; + DERNode.prototype._decodeStr = function decodeStr(buffer2, tag) { + if (tag === "bitstr") { + const unused = buffer2.readUInt8(); + if (buffer2.isError(unused)) + return unused; + return { unused, data: buffer2.raw() }; + } else if (tag === "bmpstr") { + const raw = buffer2.raw(); + if (raw.length % 2 === 1) + return buffer2.error("Decoding of string type: bmpstr length mismatch"); + let str = ""; + for (let i = 0; i < raw.length / 2; i++) { + str += String.fromCharCode(raw.readUInt16BE(i * 2)); + } + return str; + } else if (tag === "numstr") { + const numstr = buffer2.raw().toString("ascii"); + if (!this._isNumstr(numstr)) { + return buffer2.error("Decoding of string type: numstr unsupported characters"); + } + return numstr; + } else if (tag === "octstr") { + return buffer2.raw(); + } else if (tag === "objDesc") { + return buffer2.raw(); + } else if (tag === "printstr") { + const printstr = buffer2.raw().toString("ascii"); + if (!this._isPrintstr(printstr)) { + return buffer2.error("Decoding of string type: printstr unsupported characters"); + } + return printstr; + } else if (/str$/.test(tag)) { + return buffer2.raw().toString(); + } else { + return buffer2.error("Decoding of string type: " + tag + " unsupported"); + } + }; + DERNode.prototype._decodeObjid = function decodeObjid(buffer2, values, relative) { + let result; + const identifiers = []; + let ident = 0; + let subident = 0; + while (!buffer2.isEmpty()) { + subident = buffer2.readUInt8(); + ident <<= 7; + ident |= subident & 127; + if ((subident & 128) === 0) { + identifiers.push(ident); + ident = 0; + } + } + if (subident & 128) + identifiers.push(ident); + const first = identifiers[0] / 40 | 0; + const second = identifiers[0] % 40; + if (relative) + result = identifiers; + else + result = [first, second].concat(identifiers.slice(1)); + if (values) { + let tmp = values[result.join(" ")]; + if (tmp === void 0) + tmp = values[result.join(".")]; + if (tmp !== void 0) + result = tmp; + } + return result; + }; + DERNode.prototype._decodeTime = function decodeTime(buffer2, tag) { + const str = buffer2.raw().toString(); + let year; + let mon; + let day; + let hour; + let min2; + let sec; + if (tag === "gentime") { + year = str.slice(0, 4) | 0; + mon = str.slice(4, 6) | 0; + day = str.slice(6, 8) | 0; + hour = str.slice(8, 10) | 0; + min2 = str.slice(10, 12) | 0; + sec = str.slice(12, 14) | 0; + } else if (tag === "utctime") { + year = str.slice(0, 2) | 0; + mon = str.slice(2, 4) | 0; + day = str.slice(4, 6) | 0; + hour = str.slice(6, 8) | 0; + min2 = str.slice(8, 10) | 0; + sec = str.slice(10, 12) | 0; + if (year < 70) + year = 2e3 + year; + else + year = 1900 + year; + } else { + return buffer2.error("Decoding " + tag + " time is not supported yet"); + } + return Date.UTC(year, mon - 1, day, hour, min2, sec, 0); + }; + DERNode.prototype._decodeNull = function decodeNull() { + return null; + }; + DERNode.prototype._decodeBool = function decodeBool(buffer2) { + const res = buffer2.readUInt8(); + if (buffer2.isError(res)) + return res; + else + return res !== 0; + }; + DERNode.prototype._decodeInt = function decodeInt(buffer2, values) { + const raw = buffer2.raw(); + let res = new bignum(raw); + if (values) + res = values[res.toString(10)] || res; + return res; + }; + DERNode.prototype._use = function use(entity, obj) { + if (typeof entity === "function") + entity = entity(obj); + return entity._getDecoder("der").tree; + }; + function derDecodeTag(buf, fail) { + let tag = buf.readUInt8(fail); + if (buf.isError(tag)) + return tag; + const cls = der2.tagClass[tag >> 6]; + const primitive = (tag & 32) === 0; + if ((tag & 31) === 31) { + let oct = tag; + tag = 0; + while ((oct & 128) === 128) { + oct = buf.readUInt8(fail); + if (buf.isError(oct)) + return oct; + tag <<= 7; + tag |= oct & 127; + } + } else { + tag &= 31; + } + const tagStr = der2.tag[tag]; + return { + cls, + primitive, + tag, + tagStr + }; + } + function derDecodeLen(buf, primitive, fail) { + let len = buf.readUInt8(fail); + if (buf.isError(len)) + return len; + if (!primitive && len === 128) + return null; + if ((len & 128) === 0) { + return len; + } + const num = len & 127; + if (num > 4) + return buf.error("length octect is too long"); + len = 0; + for (let i = 0; i < num; i++) { + len <<= 8; + const j = buf.readUInt8(fail); + if (buf.isError(j)) + return j; + len |= j; + } + return len; + } + return der_1; +} +var pem; +var hasRequiredPem; +function requirePem() { + if (hasRequiredPem) return pem; + hasRequiredPem = 1; + const inherits = requireInherits_browser$1(); + const Buffer2 = requireSafer().Buffer; + const DERDecoder = requireDer(); + function PEMDecoder(entity) { + DERDecoder.call(this, entity); + this.enc = "pem"; + } + inherits(PEMDecoder, DERDecoder); + pem = PEMDecoder; + PEMDecoder.prototype.decode = function decode(data2, options2) { + const lines = data2.toString().split(/[\r\n]+/g); + const label = options2.label.toUpperCase(); + const re2 = /^-----(BEGIN|END) ([^-]+)-----$/; + let start = -1; + let end = -1; + for (let i = 0; i < lines.length; i++) { + const match = lines[i].match(re2); + if (match === null) + continue; + if (match[2] !== label) + continue; + if (start === -1) { + if (match[1] !== "BEGIN") + break; + start = i; + } else { + if (match[1] !== "END") + break; + end = i; + break; + } + } + if (start === -1 || end === -1) + throw new Error("PEM section not found for: " + label); + const base64 = lines.slice(start + 1, end).join(""); + base64.replace(/[^a-z0-9+/=]+/gi, ""); + const input = Buffer2.from(base64, "base64"); + return DERDecoder.prototype.decode.call(this, input, options2); + }; + return pem; +} +var hasRequiredDecoders; +function requireDecoders() { + if (hasRequiredDecoders) return decoders; + hasRequiredDecoders = 1; + (function(exports) { + const decoders2 = exports; + decoders2.der = requireDer(); + decoders2.pem = requirePem(); + })(decoders); + return decoders; +} +var hasRequiredApi; +function requireApi() { + if (hasRequiredApi) return api; + hasRequiredApi = 1; + (function(exports) { + const encoders2 = requireEncoders(); + const decoders2 = requireDecoders(); + const inherits = requireInherits_browser$1(); + const api2 = exports; + api2.define = function define(name, body) { + return new Entity(name, body); + }; + function Entity(name, body) { + this.name = name; + this.body = body; + this.decoders = {}; + this.encoders = {}; + } + Entity.prototype._createNamed = function createNamed(Base) { + const name = this.name; + function Generated(entity) { + this._initNamed(entity, name); + } + inherits(Generated, Base); + Generated.prototype._initNamed = function _initNamed(entity, name2) { + Base.call(this, entity, name2); + }; + return new Generated(this); + }; + Entity.prototype._getDecoder = function _getDecoder(enc) { + enc = enc || "der"; + if (!this.decoders.hasOwnProperty(enc)) + this.decoders[enc] = this._createNamed(decoders2[enc]); + return this.decoders[enc]; + }; + Entity.prototype.decode = function decode(data2, enc, options2) { + return this._getDecoder(enc).decode(data2, options2); + }; + Entity.prototype._getEncoder = function _getEncoder(enc) { + enc = enc || "der"; + if (!this.encoders.hasOwnProperty(enc)) + this.encoders[enc] = this._createNamed(encoders2[enc]); + return this.encoders[enc]; + }; + Entity.prototype.encode = function encode(data2, enc, reporter2) { + return this._getEncoder(enc).encode(data2, reporter2); + }; + })(api); + return api; +} +var base$1 = {}; +var hasRequiredBase; +function requireBase() { + if (hasRequiredBase) return base$1; + hasRequiredBase = 1; + (function(exports) { + const base2 = exports; + base2.Reporter = requireReporter().Reporter; + base2.DecoderBuffer = requireBuffer().DecoderBuffer; + base2.EncoderBuffer = requireBuffer().EncoderBuffer; + base2.Node = requireNode(); + })(base$1); + return base$1; +} +var constants$5 = {}; +var hasRequiredConstants$5; +function requireConstants$5() { + if (hasRequiredConstants$5) return constants$5; + hasRequiredConstants$5 = 1; + (function(exports) { + const constants2 = exports; + constants2._reverse = function reverse(map2) { + const res = {}; + Object.keys(map2).forEach(function(key2) { + if ((key2 | 0) == key2) + key2 = key2 | 0; + const value = map2[key2]; + res[value] = key2; + }); + return res; + }; + constants2.der = requireDer$2(); + })(constants$5); + return constants$5; +} +var hasRequiredAsn1$1; +function requireAsn1$1() { + if (hasRequiredAsn1$1) return asn1; + hasRequiredAsn1$1 = 1; + (function(exports) { + const asn12 = exports; + asn12.bignum = requireBn$2(); + asn12.define = requireApi().define; + asn12.base = requireBase(); + asn12.constants = requireConstants$5(); + asn12.decoders = requireDecoders(); + asn12.encoders = requireEncoders(); + })(asn1); + return asn1; +} +var certificate; +var hasRequiredCertificate; +function requireCertificate() { + if (hasRequiredCertificate) return certificate; + hasRequiredCertificate = 1; + var asn = requireAsn1$1(); + var Time = asn.define("Time", function() { + this.choice({ + utcTime: this.utctime(), + generalTime: this.gentime() + }); + }); + var AttributeTypeValue = asn.define("AttributeTypeValue", function() { + this.seq().obj( + this.key("type").objid(), + this.key("value").any() + ); + }); + var AlgorithmIdentifier = asn.define("AlgorithmIdentifier", function() { + this.seq().obj( + this.key("algorithm").objid(), + this.key("parameters").optional(), + this.key("curve").objid().optional() + ); + }); + var SubjectPublicKeyInfo = asn.define("SubjectPublicKeyInfo", function() { + this.seq().obj( + this.key("algorithm").use(AlgorithmIdentifier), + this.key("subjectPublicKey").bitstr() + ); + }); + var RelativeDistinguishedName = asn.define("RelativeDistinguishedName", function() { + this.setof(AttributeTypeValue); + }); + var RDNSequence = asn.define("RDNSequence", function() { + this.seqof(RelativeDistinguishedName); + }); + var Name = asn.define("Name", function() { + this.choice({ + rdnSequence: this.use(RDNSequence) + }); + }); + var Validity = asn.define("Validity", function() { + this.seq().obj( + this.key("notBefore").use(Time), + this.key("notAfter").use(Time) + ); + }); + var Extension = asn.define("Extension", function() { + this.seq().obj( + this.key("extnID").objid(), + this.key("critical").bool().def(false), + this.key("extnValue").octstr() + ); + }); + var TBSCertificate = asn.define("TBSCertificate", function() { + this.seq().obj( + this.key("version").explicit(0).int().optional(), + this.key("serialNumber").int(), + this.key("signature").use(AlgorithmIdentifier), + this.key("issuer").use(Name), + this.key("validity").use(Validity), + this.key("subject").use(Name), + this.key("subjectPublicKeyInfo").use(SubjectPublicKeyInfo), + this.key("issuerUniqueID").implicit(1).bitstr().optional(), + this.key("subjectUniqueID").implicit(2).bitstr().optional(), + this.key("extensions").explicit(3).seqof(Extension).optional() + ); + }); + var X509Certificate = asn.define("X509Certificate", function() { + this.seq().obj( + this.key("tbsCertificate").use(TBSCertificate), + this.key("signatureAlgorithm").use(AlgorithmIdentifier), + this.key("signatureValue").bitstr() + ); + }); + certificate = X509Certificate; + return certificate; +} +var hasRequiredAsn1; +function requireAsn1() { + if (hasRequiredAsn1) return asn1$1; + hasRequiredAsn1 = 1; + var asn12 = requireAsn1$1(); + asn1$1.certificate = requireCertificate(); + var RSAPrivateKey = asn12.define("RSAPrivateKey", function() { + this.seq().obj( + this.key("version").int(), + this.key("modulus").int(), + this.key("publicExponent").int(), + this.key("privateExponent").int(), + this.key("prime1").int(), + this.key("prime2").int(), + this.key("exponent1").int(), + this.key("exponent2").int(), + this.key("coefficient").int() + ); + }); + asn1$1.RSAPrivateKey = RSAPrivateKey; + var RSAPublicKey = asn12.define("RSAPublicKey", function() { + this.seq().obj( + this.key("modulus").int(), + this.key("publicExponent").int() + ); + }); + asn1$1.RSAPublicKey = RSAPublicKey; + var PublicKey = asn12.define("SubjectPublicKeyInfo", function() { + this.seq().obj( + this.key("algorithm").use(AlgorithmIdentifier), + this.key("subjectPublicKey").bitstr() + ); + }); + asn1$1.PublicKey = PublicKey; + var AlgorithmIdentifier = asn12.define("AlgorithmIdentifier", function() { + this.seq().obj( + this.key("algorithm").objid(), + this.key("none").null_().optional(), + this.key("curve").objid().optional(), + this.key("params").seq().obj( + this.key("p").int(), + this.key("q").int(), + this.key("g").int() + ).optional() + ); + }); + var PrivateKeyInfo = asn12.define("PrivateKeyInfo", function() { + this.seq().obj( + this.key("version").int(), + this.key("algorithm").use(AlgorithmIdentifier), + this.key("subjectPrivateKey").octstr() + ); + }); + asn1$1.PrivateKey = PrivateKeyInfo; + var EncryptedPrivateKeyInfo = asn12.define("EncryptedPrivateKeyInfo", function() { + this.seq().obj( + this.key("algorithm").seq().obj( + this.key("id").objid(), + this.key("decrypt").seq().obj( + this.key("kde").seq().obj( + this.key("id").objid(), + this.key("kdeparams").seq().obj( + this.key("salt").octstr(), + this.key("iters").int() + ) + ), + this.key("cipher").seq().obj( + this.key("algo").objid(), + this.key("iv").octstr() + ) + ) + ), + this.key("subjectPrivateKey").octstr() + ); + }); + asn1$1.EncryptedPrivateKey = EncryptedPrivateKeyInfo; + var DSAPrivateKey = asn12.define("DSAPrivateKey", function() { + this.seq().obj( + this.key("version").int(), + this.key("p").int(), + this.key("q").int(), + this.key("g").int(), + this.key("pub_key").int(), + this.key("priv_key").int() + ); + }); + asn1$1.DSAPrivateKey = DSAPrivateKey; + asn1$1.DSAparam = asn12.define("DSAparam", function() { + this.int(); + }); + var ECPrivateKey = asn12.define("ECPrivateKey", function() { + this.seq().obj( + this.key("version").int(), + this.key("privateKey").octstr(), + this.key("parameters").optional().explicit(0).use(ECParameters), + this.key("publicKey").optional().explicit(1).bitstr() + ); + }); + asn1$1.ECPrivateKey = ECPrivateKey; + var ECParameters = asn12.define("ECParameters", function() { + this.choice({ + namedCurve: this.objid() + }); + }); + asn1$1.signature = asn12.define("signature", function() { + this.seq().obj( + this.key("r").int(), + this.key("s").int() + ); + }); + return asn1$1; +} +const require$$1$3 = { + "2.16.840.1.101.3.4.1.1": "aes-128-ecb", + "2.16.840.1.101.3.4.1.2": "aes-128-cbc", + "2.16.840.1.101.3.4.1.3": "aes-128-ofb", + "2.16.840.1.101.3.4.1.4": "aes-128-cfb", + "2.16.840.1.101.3.4.1.21": "aes-192-ecb", + "2.16.840.1.101.3.4.1.22": "aes-192-cbc", + "2.16.840.1.101.3.4.1.23": "aes-192-ofb", + "2.16.840.1.101.3.4.1.24": "aes-192-cfb", + "2.16.840.1.101.3.4.1.41": "aes-256-ecb", + "2.16.840.1.101.3.4.1.42": "aes-256-cbc", + "2.16.840.1.101.3.4.1.43": "aes-256-ofb", + "2.16.840.1.101.3.4.1.44": "aes-256-cfb" +}; +var fixProc; +var hasRequiredFixProc; +function requireFixProc() { + if (hasRequiredFixProc) return fixProc; + hasRequiredFixProc = 1; + var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r+/=]+)[\n\r]+/m; + var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m; + var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r+/=]+)-----END \1-----$/m; + var evp = requireEvp_bytestokey(); + var ciphers = requireBrowser$9(); + var Buffer2 = requireSafeBuffer().Buffer; + fixProc = function(okey, password) { + var key2 = okey.toString(); + var match = key2.match(findProc); + var decrypted; + if (!match) { + var match2 = key2.match(fullRegex); + decrypted = Buffer2.from(match2[2].replace(/[\r\n]/g, ""), "base64"); + } else { + var suite = "aes" + match[1]; + var iv = Buffer2.from(match[2], "hex"); + var cipherText = Buffer2.from(match[3].replace(/[\r\n]/g, ""), "base64"); + var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key; + var out = []; + var cipher2 = ciphers.createDecipheriv(suite, cipherKey, iv); + out.push(cipher2.update(cipherText)); + out.push(cipher2.final()); + decrypted = Buffer2.concat(out); + } + var tag = key2.match(startRegex)[1]; + return { + tag, + data: decrypted + }; + }; + return fixProc; +} +var parseAsn1; +var hasRequiredParseAsn1; +function requireParseAsn1() { + if (hasRequiredParseAsn1) return parseAsn1; + hasRequiredParseAsn1 = 1; + var asn12 = requireAsn1(); + var aesid = require$$1$3; + var fixProc2 = requireFixProc(); + var ciphers = requireBrowser$9(); + var compat = requireBrowser$a(); + var Buffer2 = requireSafeBuffer().Buffer; + parseAsn1 = parseKeys; + function parseKeys(buffer2) { + var password; + if (typeof buffer2 === "object" && !Buffer2.isBuffer(buffer2)) { + password = buffer2.passphrase; + buffer2 = buffer2.key; + } + if (typeof buffer2 === "string") { + buffer2 = Buffer2.from(buffer2); + } + var stripped = fixProc2(buffer2, password); + var type2 = stripped.tag; + var data2 = stripped.data; + var subtype, ndata; + switch (type2) { + case "CERTIFICATE": + ndata = asn12.certificate.decode(data2, "der").tbsCertificate.subjectPublicKeyInfo; + // falls through + case "PUBLIC KEY": + if (!ndata) { + ndata = asn12.PublicKey.decode(data2, "der"); + } + subtype = ndata.algorithm.algorithm.join("."); + switch (subtype) { + case "1.2.840.113549.1.1.1": + return asn12.RSAPublicKey.decode(ndata.subjectPublicKey.data, "der"); + case "1.2.840.10045.2.1": + ndata.subjectPrivateKey = ndata.subjectPublicKey; + return { + type: "ec", + data: ndata + }; + case "1.2.840.10040.4.1": + ndata.algorithm.params.pub_key = asn12.DSAparam.decode(ndata.subjectPublicKey.data, "der"); + return { + type: "dsa", + data: ndata.algorithm.params + }; + default: + throw new Error("unknown key id " + subtype); + } + // throw new Error('unknown key type ' + type) + case "ENCRYPTED PRIVATE KEY": + data2 = asn12.EncryptedPrivateKey.decode(data2, "der"); + data2 = decrypt(data2, password); + // falls through + case "PRIVATE KEY": + ndata = asn12.PrivateKey.decode(data2, "der"); + subtype = ndata.algorithm.algorithm.join("."); + switch (subtype) { + case "1.2.840.113549.1.1.1": + return asn12.RSAPrivateKey.decode(ndata.subjectPrivateKey, "der"); + case "1.2.840.10045.2.1": + return { + curve: ndata.algorithm.curve, + privateKey: asn12.ECPrivateKey.decode(ndata.subjectPrivateKey, "der").privateKey + }; + case "1.2.840.10040.4.1": + ndata.algorithm.params.priv_key = asn12.DSAparam.decode(ndata.subjectPrivateKey, "der"); + return { + type: "dsa", + params: ndata.algorithm.params + }; + default: + throw new Error("unknown key id " + subtype); + } + // throw new Error('unknown key type ' + type) + case "RSA PUBLIC KEY": + return asn12.RSAPublicKey.decode(data2, "der"); + case "RSA PRIVATE KEY": + return asn12.RSAPrivateKey.decode(data2, "der"); + case "DSA PRIVATE KEY": + return { + type: "dsa", + params: asn12.DSAPrivateKey.decode(data2, "der") + }; + case "EC PRIVATE KEY": + data2 = asn12.ECPrivateKey.decode(data2, "der"); + return { + curve: data2.parameters.value, + privateKey: data2.privateKey + }; + default: + throw new Error("unknown key type " + type2); + } + } + parseKeys.signature = asn12.signature; + function decrypt(data2, password) { + var salt = data2.algorithm.decrypt.kde.kdeparams.salt; + var iters = parseInt(data2.algorithm.decrypt.kde.kdeparams.iters.toString(), 10); + var algo = aesid[data2.algorithm.decrypt.cipher.algo.join(".")]; + var iv = data2.algorithm.decrypt.cipher.iv; + var cipherText = data2.subjectPrivateKey; + var keylen = parseInt(algo.split("-")[1], 10) / 8; + var key2 = compat.pbkdf2Sync(password, salt, iters, keylen, "sha1"); + var cipher2 = ciphers.createDecipheriv(algo, key2, iv); + var out = []; + out.push(cipher2.update(cipherText)); + out.push(cipher2.final()); + return Buffer2.concat(out); + } + return parseAsn1; +} +const require$$4$1 = { + "1.3.132.0.10": "secp256k1", + "1.3.132.0.33": "p224", + "1.2.840.10045.3.1.1": "p192", + "1.2.840.10045.3.1.7": "p256", + "1.3.132.0.34": "p384", + "1.3.132.0.35": "p521" +}; +var hasRequiredSign; +function requireSign() { + if (hasRequiredSign) return sign.exports; + hasRequiredSign = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var createHmac = requireBrowser$b(); + var crt = requireBrowserifyRsa(); + var EC = requireElliptic().ec; + var BN = requireBn$4(); + var parseKeys = requireParseAsn1(); + var curves2 = require$$4$1; + function sign$12(hash2, key2, hashType, signType, tag) { + var priv = parseKeys(key2); + if (priv.curve) { + if (signType !== "ecdsa" && signType !== "ecdsa/rsa") throw new Error("wrong private key type"); + return ecSign(hash2, priv); + } else if (priv.type === "dsa") { + if (signType !== "dsa") throw new Error("wrong private key type"); + return dsaSign(hash2, priv, hashType); + } else { + if (signType !== "rsa" && signType !== "ecdsa/rsa") throw new Error("wrong private key type"); + } + hash2 = Buffer2.concat([tag, hash2]); + var len = priv.modulus.byteLength(); + var pad = [0, 1]; + while (hash2.length + pad.length + 1 < len) pad.push(255); + pad.push(0); + var i = -1; + while (++i < hash2.length) pad.push(hash2[i]); + var out = crt(pad, priv); + return out; + } + function ecSign(hash2, priv) { + var curveId = curves2[priv.curve.join(".")]; + if (!curveId) throw new Error("unknown curve " + priv.curve.join(".")); + var curve2 = new EC(curveId); + var key2 = curve2.keyFromPrivate(priv.privateKey); + var out = key2.sign(hash2); + return Buffer2.from(out.toDER()); + } + function dsaSign(hash2, priv, algo) { + var x = priv.params.priv_key; + var p = priv.params.p; + var q = priv.params.q; + var g = priv.params.g; + var r = new BN(0); + var k; + var H = bits2int(hash2, q).mod(q); + var s = false; + var kv = getKey(x, q, hash2, algo); + while (s === false) { + k = makeKey(q, kv, algo); + r = makeR(g, k, p, q); + s = k.invm(q).imul(H.add(x.mul(r))).mod(q); + if (s.cmpn(0) === 0) { + s = false; + r = new BN(0); + } + } + return toDER(r, s); + } + function toDER(r, s) { + r = r.toArray(); + s = s.toArray(); + if (r[0] & 128) r = [0].concat(r); + if (s[0] & 128) s = [0].concat(s); + var total = r.length + s.length + 4; + var res = [48, total, 2, r.length]; + res = res.concat(r, [2, s.length], s); + return Buffer2.from(res); + } + function getKey(x, q, hash2, algo) { + x = Buffer2.from(x.toArray()); + if (x.length < q.byteLength()) { + var zeros = Buffer2.alloc(q.byteLength() - x.length); + x = Buffer2.concat([zeros, x]); + } + var hlen = hash2.length; + var hbits = bits2octets(hash2, q); + var v = Buffer2.alloc(hlen); + v.fill(1); + var k = Buffer2.alloc(hlen); + k = createHmac(algo, k).update(v).update(Buffer2.from([0])).update(x).update(hbits).digest(); + v = createHmac(algo, k).update(v).digest(); + k = createHmac(algo, k).update(v).update(Buffer2.from([1])).update(x).update(hbits).digest(); + v = createHmac(algo, k).update(v).digest(); + return { k, v }; + } + function bits2int(obits, q) { + var bits = new BN(obits); + var shift = (obits.length << 3) - q.bitLength(); + if (shift > 0) bits.ishrn(shift); + return bits; + } + function bits2octets(bits, q) { + bits = bits2int(bits, q); + bits = bits.mod(q); + var out = Buffer2.from(bits.toArray()); + if (out.length < q.byteLength()) { + var zeros = Buffer2.alloc(q.byteLength() - out.length); + out = Buffer2.concat([zeros, out]); + } + return out; + } + function makeKey(q, kv, algo) { + var t; + var k; + do { + t = Buffer2.alloc(0); + while (t.length * 8 < q.bitLength()) { + kv.v = createHmac(algo, kv.k).update(kv.v).digest(); + t = Buffer2.concat([t, kv.v]); + } + k = bits2int(t, q); + kv.k = createHmac(algo, kv.k).update(kv.v).update(Buffer2.from([0])).digest(); + kv.v = createHmac(algo, kv.k).update(kv.v).digest(); + } while (k.cmp(q) !== -1); + return k; + } + function makeR(g, k, p, q) { + return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q); + } + sign.exports = sign$12; + sign.exports.getKey = getKey; + sign.exports.makeKey = makeKey; + return sign.exports; +} +var verify_1; +var hasRequiredVerify; +function requireVerify() { + if (hasRequiredVerify) return verify_1; + hasRequiredVerify = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var BN = requireBn$4(); + var EC = requireElliptic().ec; + var parseKeys = requireParseAsn1(); + var curves2 = require$$4$1; + function verify(sig, hash2, key2, signType, tag) { + var pub = parseKeys(key2); + if (pub.type === "ec") { + if (signType !== "ecdsa" && signType !== "ecdsa/rsa") throw new Error("wrong public key type"); + return ecVerify(sig, hash2, pub); + } else if (pub.type === "dsa") { + if (signType !== "dsa") throw new Error("wrong public key type"); + return dsaVerify(sig, hash2, pub); + } else { + if (signType !== "rsa" && signType !== "ecdsa/rsa") throw new Error("wrong public key type"); + } + hash2 = Buffer2.concat([tag, hash2]); + var len = pub.modulus.byteLength(); + var pad = [1]; + var padNum = 0; + while (hash2.length + pad.length + 2 < len) { + pad.push(255); + padNum++; + } + pad.push(0); + var i = -1; + while (++i < hash2.length) { + pad.push(hash2[i]); + } + pad = Buffer2.from(pad); + var red = BN.mont(pub.modulus); + sig = new BN(sig).toRed(red); + sig = sig.redPow(new BN(pub.publicExponent)); + sig = Buffer2.from(sig.fromRed().toArray()); + var out = padNum < 8 ? 1 : 0; + len = Math.min(sig.length, pad.length); + if (sig.length !== pad.length) out = 1; + i = -1; + while (++i < len) out |= sig[i] ^ pad[i]; + return out === 0; + } + function ecVerify(sig, hash2, pub) { + var curveId = curves2[pub.data.algorithm.curve.join(".")]; + if (!curveId) throw new Error("unknown curve " + pub.data.algorithm.curve.join(".")); + var curve2 = new EC(curveId); + var pubkey = pub.data.subjectPrivateKey.data; + return curve2.verify(hash2, sig, pubkey); + } + function dsaVerify(sig, hash2, pub) { + var p = pub.data.p; + var q = pub.data.q; + var g = pub.data.g; + var y = pub.data.pub_key; + var unpacked = parseKeys.signature.decode(sig, "der"); + var s = unpacked.s; + var r = unpacked.r; + checkValue(s, q); + checkValue(r, q); + var montp = BN.mont(p); + var w = s.invm(q); + var v = g.toRed(montp).redPow(new BN(hash2).mul(w).mod(q)).fromRed().mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed()).mod(p).mod(q); + return v.cmp(r) === 0; + } + function checkValue(b, q) { + if (b.cmpn(0) <= 0) throw new Error("invalid sig"); + if (b.cmp(q) >= q) throw new Error("invalid sig"); + } + verify_1 = verify; + return verify_1; +} +var browser$6; +var hasRequiredBrowser$6; +function requireBrowser$6() { + if (hasRequiredBrowser$6) return browser$6; + hasRequiredBrowser$6 = 1; + var Buffer2 = requireSafeBuffer().Buffer; + var createHash = requireBrowser$c(); + var stream2 = requireReadableBrowser$1(); + var inherits = requireInherits_browser$1(); + var sign2 = requireSign(); + var verify = requireVerify(); + var algorithms = require$$6; + Object.keys(algorithms).forEach(function(key2) { + algorithms[key2].id = Buffer2.from(algorithms[key2].id, "hex"); + algorithms[key2.toLowerCase()] = algorithms[key2]; + }); + function Sign(algorithm) { + stream2.Writable.call(this); + var data2 = algorithms[algorithm]; + if (!data2) throw new Error("Unknown message digest"); + this._hashType = data2.hash; + this._hash = createHash(data2.hash); + this._tag = data2.id; + this._signType = data2.sign; + } + inherits(Sign, stream2.Writable); + Sign.prototype._write = function _write(data2, _, done) { + this._hash.update(data2); + done(); + }; + Sign.prototype.update = function update(data2, enc) { + if (typeof data2 === "string") data2 = Buffer2.from(data2, enc); + this._hash.update(data2); + return this; + }; + Sign.prototype.sign = function signMethod(key2, enc) { + this.end(); + var hash2 = this._hash.digest(); + var sig = sign2(hash2, key2, this._hashType, this._signType, this._tag); + return enc ? sig.toString(enc) : sig; + }; + function Verify(algorithm) { + stream2.Writable.call(this); + var data2 = algorithms[algorithm]; + if (!data2) throw new Error("Unknown message digest"); + this._hash = createHash(data2.hash); + this._tag = data2.id; + this._signType = data2.sign; + } + inherits(Verify, stream2.Writable); + Verify.prototype._write = function _write(data2, _, done) { + this._hash.update(data2); + done(); + }; + Verify.prototype.update = function update(data2, enc) { + if (typeof data2 === "string") data2 = Buffer2.from(data2, enc); + this._hash.update(data2); + return this; + }; + Verify.prototype.verify = function verifyMethod(key2, sig, enc) { + if (typeof sig === "string") sig = Buffer2.from(sig, enc); + this.end(); + var hash2 = this._hash.digest(); + return verify(sig, hash2, key2, this._signType, this._tag); + }; + function createSign(algorithm) { + return new Sign(algorithm); + } + function createVerify(algorithm) { + return new Verify(algorithm); + } + browser$6 = { + Sign: createSign, + Verify: createVerify, + createSign, + createVerify + }; + return browser$6; +} +var bn$3 = { exports: {} }; +var bn$2 = bn$3.exports; +var hasRequiredBn$1; +function requireBn$1() { + if (hasRequiredBn$1) return bn$3.exports; + hasRequiredBn$1 = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + return c - 48 & 15; + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this.strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + r += c - 49 + 10; + } else if (c >= 17) { + r += c - 17 + 10; + } else { + r += c; + } + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this.strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype.strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + BN.prototype.inspect = function inspect() { + return (this.red ? ""; + }; + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16); + }; + BN.prototype.toBuffer = function toBuffer2(endian, length) { + assert2(typeof Buffer2 !== "undefined"); + return this.toArrayLike(Buffer2, endian, length); + }; + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + this.strip(); + var littleEndian = endian === "le"; + var res = new ArrayType(reqLength); + var b, i; + var q = this.clone(); + if (!littleEndian) { + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[i] = b; + } + for (; i < reqLength; i++) { + res[i] = 0; + } + } + return res; + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = (num.words[off] & 1 << wbit) >>> wbit; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this.strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this.strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this.strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this.strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this.strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this.strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out.strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out.strip(); + } + function jumboMulTo(self2, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + function FFTM(x, y) { + this.x = x; + this.y = y; + } + FFTM.prototype.makeRBT = function makeRBT(N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + return t; + }; + FFTM.prototype.revBin = function revBin(x, l, N) { + if (x === 0 || x === N - 1) return x; + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << l - i - 1; + x >>= 1; + } + return rb; + }; + FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + FFTM.prototype.transform = function transform2(rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + for (var j = 0; j < s; j++) { + var re2 = rtws[p + j]; + var ie = itws[p + j]; + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + var rx = rtwdf_ * ro - itwdf_ * io; + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + rtws[p + j] = re2 + ro; + itws[p + j] = ie + io; + rtws[p + j + s] = re2 - ro; + itws[p + j + s] = ie - io; + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + FFTM.prototype.guessLen13b = function guessLen13b(n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + return 1 << i + 1 + odd; + }; + FFTM.prototype.conjugate = function conjugate(rws, iws, N) { + if (N <= 1) return; + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + t = iws[i]; + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + FFTM.prototype.normalize13b = function normalize13b(ws2, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws2[2 * i + 1] / N) * 8192 + Math.round(ws2[2 * i] / N) + carry; + ws2[i] = w & 67108863; + if (w < 67108864) { + carry = 0; + } else { + carry = w / 67108864 | 0; + } + } + return ws2; + }; + FFTM.prototype.convert13b = function convert13b(ws2, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws2[i] | 0); + rws[2 * i] = carry & 8191; + carry = carry >>> 13; + rws[2 * i + 1] = carry & 8191; + carry = carry >>> 13; + } + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + assert2(carry === 0); + assert2((carry & -8192) === 0); + }; + FFTM.prototype.stub = function stub(N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + return ph; + }; + FFTM.prototype.mulp = function mulp(x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + var rbt = this.makeRBT(N); + var _ = this.stub(N); + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + var rmws = out.words; + rmws.length = N; + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this.strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this.strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this.strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this.strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this.strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this.strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modn = function modn(num) { + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return acc; + }; + BN.prototype.idivn = function idivn(num) { + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + return this.strip(); + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this.strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn$2); + })(bn$3); + return bn$3.exports; +} +var browser$5; +var hasRequiredBrowser$5; +function requireBrowser$5() { + if (hasRequiredBrowser$5) return browser$5; + hasRequiredBrowser$5 = 1; + var elliptic2 = requireElliptic(); + var BN = requireBn$1(); + browser$5 = function createECDH(curve2) { + return new ECDH(curve2); + }; + var aliases2 = { + secp256k1: { + name: "secp256k1", + byteLength: 32 + }, + secp224r1: { + name: "p224", + byteLength: 28 + }, + prime256v1: { + name: "p256", + byteLength: 32 + }, + prime192v1: { + name: "p192", + byteLength: 24 + }, + ed25519: { + name: "ed25519", + byteLength: 32 + }, + secp384r1: { + name: "p384", + byteLength: 48 + }, + secp521r1: { + name: "p521", + byteLength: 66 + } + }; + aliases2.p224 = aliases2.secp224r1; + aliases2.p256 = aliases2.secp256r1 = aliases2.prime256v1; + aliases2.p192 = aliases2.secp192r1 = aliases2.prime192v1; + aliases2.p384 = aliases2.secp384r1; + aliases2.p521 = aliases2.secp521r1; + function ECDH(curve2) { + this.curveType = aliases2[curve2]; + if (!this.curveType) { + this.curveType = { + name: curve2 + }; + } + this.curve = new elliptic2.ec(this.curveType.name); + this.keys = void 0; + } + ECDH.prototype.generateKeys = function(enc, format) { + this.keys = this.curve.genKeyPair(); + return this.getPublicKey(enc, format); + }; + ECDH.prototype.computeSecret = function(other2, inenc, enc) { + inenc = inenc || "utf8"; + if (!Buffer.isBuffer(other2)) { + other2 = new Buffer(other2, inenc); + } + var otherPub = this.curve.keyFromPublic(other2).getPublic(); + var out = otherPub.mul(this.keys.getPrivate()).getX(); + return formatReturnValue(out, enc, this.curveType.byteLength); + }; + ECDH.prototype.getPublicKey = function(enc, format) { + var key2 = this.keys.getPublic(format === "compressed", true); + if (format === "hybrid") { + if (key2[key2.length - 1] % 2) { + key2[0] = 7; + } else { + key2[0] = 6; + } + } + return formatReturnValue(key2, enc); + }; + ECDH.prototype.getPrivateKey = function(enc) { + return formatReturnValue(this.keys.getPrivate(), enc); + }; + ECDH.prototype.setPublicKey = function(pub, enc) { + enc = enc || "utf8"; + if (!Buffer.isBuffer(pub)) { + pub = new Buffer(pub, enc); + } + this.keys._importPublic(pub); + return this; + }; + ECDH.prototype.setPrivateKey = function(priv, enc) { + enc = enc || "utf8"; + if (!Buffer.isBuffer(priv)) { + priv = new Buffer(priv, enc); + } + var _priv = new BN(priv); + _priv = _priv.toString(16); + this.keys = this.curve.genKeyPair(); + this.keys._importPrivate(_priv); + return this; + }; + function formatReturnValue(bn2, enc, len) { + if (!Array.isArray(bn2)) { + bn2 = bn2.toArray(); + } + var buf = new Buffer(bn2); + if (len && buf.length < len) { + var zeros = new Buffer(len - buf.length); + zeros.fill(0); + buf = Buffer.concat([zeros, buf]); + } + if (!enc) { + return buf; + } else { + return buf.toString(enc); + } + } + return browser$5; +} +var browser$4 = {}; +var mgf; +var hasRequiredMgf; +function requireMgf() { + if (hasRequiredMgf) return mgf; + hasRequiredMgf = 1; + var createHash = requireBrowser$c(); + var Buffer2 = requireSafeBuffer().Buffer; + mgf = function(seed, len) { + var t = Buffer2.alloc(0); + var i = 0; + var c; + while (t.length < len) { + c = i2ops(i++); + t = Buffer2.concat([t, createHash("sha1").update(seed).update(c).digest()]); + } + return t.slice(0, len); + }; + function i2ops(c) { + var out = Buffer2.allocUnsafe(4); + out.writeUInt32BE(c, 0); + return out; + } + return mgf; +} +var xor; +var hasRequiredXor; +function requireXor() { + if (hasRequiredXor) return xor; + hasRequiredXor = 1; + xor = function xor2(a, b) { + var len = a.length; + var i = -1; + while (++i < len) { + a[i] ^= b[i]; + } + return a; + }; + return xor; +} +var bn$1 = { exports: {} }; +var bn = bn$1.exports; +var hasRequiredBn; +function requireBn() { + if (hasRequiredBn) return bn$1.exports; + hasRequiredBn = 1; + (function(module) { + (function(module2, exports) { + function assert2(val, msg) { + if (!val) throw new Error(msg || "Assertion failed"); + } + function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + function BN(number, base2, endian) { + if (BN.isBN(number)) { + return number; + } + this.negative = 0; + this.words = null; + this.length = 0; + this.red = null; + if (number !== null) { + if (base2 === "le" || base2 === "be") { + endian = base2; + base2 = 10; + } + this._init(number || 0, base2 || 10, endian || "be"); + } + } + if (typeof module2 === "object") { + module2.exports = BN; + } else { + exports.BN = BN; + } + BN.BN = BN; + BN.wordSize = 26; + var Buffer2; + try { + if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { + Buffer2 = window.Buffer; + } else { + Buffer2 = requireBuffer$2().Buffer; + } + } catch (e) { + } + BN.isBN = function isBN(num) { + if (num instanceof BN) { + return true; + } + return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + BN.max = function max2(left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + BN.min = function min2(left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + BN.prototype._init = function init(number, base2, endian) { + if (typeof number === "number") { + return this._initNumber(number, base2, endian); + } + if (typeof number === "object") { + return this._initArray(number, base2, endian); + } + if (base2 === "hex") { + base2 = 16; + } + assert2(base2 === (base2 | 0) && base2 >= 2 && base2 <= 36); + number = number.toString().replace(/\s+/g, ""); + var start = 0; + if (number[0] === "-") { + start++; + this.negative = 1; + } + if (start < number.length) { + if (base2 === 16) { + this._parseHex(number, start, endian); + } else { + this._parseBase(number, base2, start); + if (endian === "le") { + this._initArray(this.toArray(), base2, endian); + } + } + } + }; + BN.prototype._initNumber = function _initNumber(number, base2, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 67108864) { + this.words = [number & 67108863]; + this.length = 1; + } else if (number < 4503599627370496) { + this.words = [ + number & 67108863, + number / 67108864 & 67108863 + ]; + this.length = 2; + } else { + assert2(number < 9007199254740992); + this.words = [ + number & 67108863, + number / 67108864 & 67108863, + 1 + ]; + this.length = 3; + } + if (endian !== "le") return; + this._initArray(this.toArray(), base2, endian); + }; + BN.prototype._initArray = function _initArray(number, base2, endian) { + assert2(typeof number.length === "number"); + if (number.length <= 0) { + this.words = [0]; + this.length = 1; + return this; + } + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var j, w; + var off = 0; + if (endian === "be") { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | number[i - 1] << 8 | number[i - 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === "le") { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | number[i + 1] << 8 | number[i + 2] << 16; + this.words[j] |= w << off & 67108863; + this.words[j + 1] = w >>> 26 - off & 67108863; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + function parseHex4Bits(string2, index2) { + var c = string2.charCodeAt(index2); + if (c >= 65 && c <= 70) { + return c - 55; + } else if (c >= 97 && c <= 102) { + return c - 87; + } else { + return c - 48 & 15; + } + } + function parseHexByte(string2, lowerBound, index2) { + var r = parseHex4Bits(string2, index2); + if (index2 - 1 >= lowerBound) { + r |= parseHex4Bits(string2, index2 - 1) << 4; + } + return r; + } + BN.prototype._parseHex = function _parseHex(number, start, endian) { + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + var off = 0; + var j = 0; + var w; + if (endian === "be") { + for (i = number.length - 1; i >= start; i -= 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } else { + var parseLength = number.length - start; + for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { + w = parseHexByte(number, start, i) << off; + this.words[j] |= w & 67108863; + if (off >= 18) { + off -= 18; + j += 1; + this.words[j] |= w >>> 26; + } else { + off += 8; + } + } + } + this.strip(); + }; + function parseBase(str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + r *= mul; + if (c >= 49) { + r += c - 49 + 10; + } else if (c >= 17) { + r += c - 17 + 10; + } else { + r += c; + } + } + return r; + } + BN.prototype._parseBase = function _parseBase(number, base2, start) { + this.words = [0]; + this.length = 1; + for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base2) { + limbLen++; + } + limbLen--; + limbPow = limbPow / base2 | 0; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base2); + this.imuln(limbPow); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow2 = 1; + word = parseBase(number, i, number.length, base2); + for (i = 0; i < mod; i++) { + pow2 *= base2; + } + this.imuln(pow2); + if (this.words[0] + word < 67108864) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + this.strip(); + }; + BN.prototype.copy = function copy(dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + BN.prototype.clone = function clone() { + var r = new BN(null); + this.copy(r); + return r; + }; + BN.prototype._expand = function _expand(size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + BN.prototype.strip = function strip() { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + BN.prototype._normSign = function _normSign() { + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + BN.prototype.inspect = function inspect() { + return (this.red ? ""; + }; + var zeros = [ + "", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000", + "0000000000", + "00000000000", + "000000000000", + "0000000000000", + "00000000000000", + "000000000000000", + "0000000000000000", + "00000000000000000", + "000000000000000000", + "0000000000000000000", + "00000000000000000000", + "000000000000000000000", + "0000000000000000000000", + "00000000000000000000000", + "000000000000000000000000", + "0000000000000000000000000" + ]; + var groupSizes = [ + 0, + 0, + 25, + 16, + 12, + 11, + 10, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + ]; + var groupBases = [ + 0, + 0, + 33554432, + 43046721, + 16777216, + 48828125, + 60466176, + 40353607, + 16777216, + 43046721, + 1e7, + 19487171, + 35831808, + 62748517, + 7529536, + 11390625, + 16777216, + 24137569, + 34012224, + 47045881, + 64e6, + 4084101, + 5153632, + 6436343, + 7962624, + 9765625, + 11881376, + 14348907, + 17210368, + 20511149, + 243e5, + 28629151, + 33554432, + 39135393, + 45435424, + 52521875, + 60466176 + ]; + BN.prototype.toString = function toString2(base2, padding) { + base2 = base2 || 10; + padding = padding | 0 || 1; + var out; + if (base2 === 16 || base2 === "hex") { + out = ""; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = ((w << off | carry) & 16777215).toString(16); + carry = w >>> 24 - off & 16777215; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + if (base2 === (base2 | 0) && base2 >= 2 && base2 <= 36) { + var groupSize = groupSizes[base2]; + var groupBase = groupBases[base2]; + out = ""; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base2); + c = c.idivn(groupBase); + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = "0" + out; + } + while (out.length % padding !== 0) { + out = "0" + out; + } + if (this.negative !== 0) { + out = "-" + out; + } + return out; + } + assert2(false, "Base should be between 2 and 36"); + }; + BN.prototype.toNumber = function toNumber() { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 67108864; + } else if (this.length === 3 && this.words[2] === 1) { + ret += 4503599627370496 + this.words[1] * 67108864; + } else if (this.length > 2) { + assert2(false, "Number can only safely store up to 53 bits"); + } + return this.negative !== 0 ? -ret : ret; + }; + BN.prototype.toJSON = function toJSON() { + return this.toString(16); + }; + BN.prototype.toBuffer = function toBuffer2(endian, length) { + assert2(typeof Buffer2 !== "undefined"); + return this.toArrayLike(Buffer2, endian, length); + }; + BN.prototype.toArray = function toArray(endian, length) { + return this.toArrayLike(Array, endian, length); + }; + BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert2(byteLength <= reqLength, "byte array longer than desired length"); + assert2(reqLength > 0, "Requested array length <= 0"); + this.strip(); + var littleEndian = endian === "le"; + var res = new ArrayType(reqLength); + var b, i; + var q = this.clone(); + if (!littleEndian) { + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(255); + q.iushrn(8); + res[i] = b; + } + for (; i < reqLength; i++) { + res[i] = 0; + } + } + return res; + }; + if (Math.clz32) { + BN.prototype._countBits = function _countBits(w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits(w) { + var t = w; + var r = 0; + if (t >= 4096) { + r += 13; + t >>>= 13; + } + if (t >= 64) { + r += 7; + t >>>= 7; + } + if (t >= 8) { + r += 4; + t >>>= 4; + } + if (t >= 2) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + BN.prototype._zeroBits = function _zeroBits(w) { + if (w === 0) return 26; + var t = w; + var r = 0; + if ((t & 8191) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 127) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 15) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 1) === 0) { + r++; + } + return r; + }; + BN.prototype.bitLength = function bitLength() { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + function toBitArray(num) { + var w = new Array(num.bitLength()); + for (var bit = 0; bit < w.length; bit++) { + var off = bit / 26 | 0; + var wbit = bit % 26; + w[bit] = (num.words[off] & 1 << wbit) >>> wbit; + } + return w; + } + BN.prototype.zeroBits = function zeroBits() { + if (this.isZero()) return 0; + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + BN.prototype.byteLength = function byteLength() { + return Math.ceil(this.bitLength() / 8); + }; + BN.prototype.toTwos = function toTwos(width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + BN.prototype.fromTwos = function fromTwos(width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + BN.prototype.isNeg = function isNeg() { + return this.negative !== 0; + }; + BN.prototype.neg = function neg() { + return this.clone().ineg(); + }; + BN.prototype.ineg = function ineg() { + if (!this.isZero()) { + this.negative ^= 1; + } + return this; + }; + BN.prototype.iuor = function iuor(num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + return this.strip(); + }; + BN.prototype.ior = function ior(num) { + assert2((this.negative | num.negative) === 0); + return this.iuor(num); + }; + BN.prototype.or = function or(num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + BN.prototype.uor = function uor(num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + BN.prototype.iuand = function iuand(num) { + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + this.length = b.length; + return this.strip(); + }; + BN.prototype.iand = function iand(num) { + assert2((this.negative | num.negative) === 0); + return this.iuand(num); + }; + BN.prototype.and = function and(num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + BN.prototype.uand = function uand(num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + BN.prototype.iuxor = function iuxor(num) { + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = a.length; + return this.strip(); + }; + BN.prototype.ixor = function ixor(num) { + assert2((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + BN.prototype.xor = function xor2(num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + BN.prototype.uxor = function uxor(num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + BN.prototype.inotn = function inotn(width) { + assert2(typeof width === "number" && width >= 0); + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + this._expand(bytesNeeded); + if (bitsLeft > 0) { + bytesNeeded--; + } + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 67108863; + } + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft; + } + return this.strip(); + }; + BN.prototype.notn = function notn(width) { + return this.clone().inotn(width); + }; + BN.prototype.setn = function setn(bit, val) { + assert2(typeof bit === "number" && bit >= 0); + var off = bit / 26 | 0; + var wbit = bit % 26; + this._expand(off + 1); + if (val) { + this.words[off] = this.words[off] | 1 << wbit; + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + return this.strip(); + }; + BN.prototype.iadd = function iadd(num) { + var r; + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 67108863; + carry = r >>> 26; + } + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + return this; + }; + BN.prototype.add = function add(num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + if (this.length > num.length) return this.clone().iadd(num); + return num.clone().iadd(this); + }; + BN.prototype.isub = function isub(num) { + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + var cmp = this.cmp(num); + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 67108863; + } + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + this.length = Math.max(this.length, i); + if (a !== this) { + this.negative = 1; + } + return this.strip(); + }; + BN.prototype.sub = function sub(num) { + return this.clone().isub(num); + }; + function smallMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + var len = self2.length + num.length | 0; + out.length = len; + len = len - 1 | 0; + var a = self2.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + var lo = r & 67108863; + var carry = r / 67108864 | 0; + out.words[0] = lo; + for (var k = 1; k < len; k++) { + var ncarry = carry >>> 26; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j | 0; + a = self2.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += r / 67108864 | 0; + rword = r & 67108863; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + return out.strip(); + } + var comb10MulTo = function comb10MulTo2(self2, num, out) { + var a = self2.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 8191; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 8191; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 8191; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 8191; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 8191; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 8191; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 8191; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 8191; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 8191; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 8191; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 8191; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 8191; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 8191; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 8191; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 8191; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 8191; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 8191; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 8191; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 8191; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 8191; + var bh9 = b9 >>> 13; + out.negative = self2.negative ^ num.negative; + out.length = 19; + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = mid + Math.imul(ah0, bl0) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0; + w0 &= 67108863; + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = mid + Math.imul(ah1, bl0) | 0; + hi = Math.imul(ah1, bh0); + lo = lo + Math.imul(al0, bl1) | 0; + mid = mid + Math.imul(al0, bh1) | 0; + mid = mid + Math.imul(ah0, bl1) | 0; + hi = hi + Math.imul(ah0, bh1) | 0; + var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0; + w1 &= 67108863; + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = mid + Math.imul(ah2, bl0) | 0; + hi = Math.imul(ah2, bh0); + lo = lo + Math.imul(al1, bl1) | 0; + mid = mid + Math.imul(al1, bh1) | 0; + mid = mid + Math.imul(ah1, bl1) | 0; + hi = hi + Math.imul(ah1, bh1) | 0; + lo = lo + Math.imul(al0, bl2) | 0; + mid = mid + Math.imul(al0, bh2) | 0; + mid = mid + Math.imul(ah0, bl2) | 0; + hi = hi + Math.imul(ah0, bh2) | 0; + var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0; + w2 &= 67108863; + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = mid + Math.imul(ah3, bl0) | 0; + hi = Math.imul(ah3, bh0); + lo = lo + Math.imul(al2, bl1) | 0; + mid = mid + Math.imul(al2, bh1) | 0; + mid = mid + Math.imul(ah2, bl1) | 0; + hi = hi + Math.imul(ah2, bh1) | 0; + lo = lo + Math.imul(al1, bl2) | 0; + mid = mid + Math.imul(al1, bh2) | 0; + mid = mid + Math.imul(ah1, bl2) | 0; + hi = hi + Math.imul(ah1, bh2) | 0; + lo = lo + Math.imul(al0, bl3) | 0; + mid = mid + Math.imul(al0, bh3) | 0; + mid = mid + Math.imul(ah0, bl3) | 0; + hi = hi + Math.imul(ah0, bh3) | 0; + var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0; + w3 &= 67108863; + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = mid + Math.imul(ah4, bl0) | 0; + hi = Math.imul(ah4, bh0); + lo = lo + Math.imul(al3, bl1) | 0; + mid = mid + Math.imul(al3, bh1) | 0; + mid = mid + Math.imul(ah3, bl1) | 0; + hi = hi + Math.imul(ah3, bh1) | 0; + lo = lo + Math.imul(al2, bl2) | 0; + mid = mid + Math.imul(al2, bh2) | 0; + mid = mid + Math.imul(ah2, bl2) | 0; + hi = hi + Math.imul(ah2, bh2) | 0; + lo = lo + Math.imul(al1, bl3) | 0; + mid = mid + Math.imul(al1, bh3) | 0; + mid = mid + Math.imul(ah1, bl3) | 0; + hi = hi + Math.imul(ah1, bh3) | 0; + lo = lo + Math.imul(al0, bl4) | 0; + mid = mid + Math.imul(al0, bh4) | 0; + mid = mid + Math.imul(ah0, bl4) | 0; + hi = hi + Math.imul(ah0, bh4) | 0; + var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0; + w4 &= 67108863; + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = mid + Math.imul(ah5, bl0) | 0; + hi = Math.imul(ah5, bh0); + lo = lo + Math.imul(al4, bl1) | 0; + mid = mid + Math.imul(al4, bh1) | 0; + mid = mid + Math.imul(ah4, bl1) | 0; + hi = hi + Math.imul(ah4, bh1) | 0; + lo = lo + Math.imul(al3, bl2) | 0; + mid = mid + Math.imul(al3, bh2) | 0; + mid = mid + Math.imul(ah3, bl2) | 0; + hi = hi + Math.imul(ah3, bh2) | 0; + lo = lo + Math.imul(al2, bl3) | 0; + mid = mid + Math.imul(al2, bh3) | 0; + mid = mid + Math.imul(ah2, bl3) | 0; + hi = hi + Math.imul(ah2, bh3) | 0; + lo = lo + Math.imul(al1, bl4) | 0; + mid = mid + Math.imul(al1, bh4) | 0; + mid = mid + Math.imul(ah1, bl4) | 0; + hi = hi + Math.imul(ah1, bh4) | 0; + lo = lo + Math.imul(al0, bl5) | 0; + mid = mid + Math.imul(al0, bh5) | 0; + mid = mid + Math.imul(ah0, bl5) | 0; + hi = hi + Math.imul(ah0, bh5) | 0; + var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0; + w5 &= 67108863; + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = mid + Math.imul(ah6, bl0) | 0; + hi = Math.imul(ah6, bh0); + lo = lo + Math.imul(al5, bl1) | 0; + mid = mid + Math.imul(al5, bh1) | 0; + mid = mid + Math.imul(ah5, bl1) | 0; + hi = hi + Math.imul(ah5, bh1) | 0; + lo = lo + Math.imul(al4, bl2) | 0; + mid = mid + Math.imul(al4, bh2) | 0; + mid = mid + Math.imul(ah4, bl2) | 0; + hi = hi + Math.imul(ah4, bh2) | 0; + lo = lo + Math.imul(al3, bl3) | 0; + mid = mid + Math.imul(al3, bh3) | 0; + mid = mid + Math.imul(ah3, bl3) | 0; + hi = hi + Math.imul(ah3, bh3) | 0; + lo = lo + Math.imul(al2, bl4) | 0; + mid = mid + Math.imul(al2, bh4) | 0; + mid = mid + Math.imul(ah2, bl4) | 0; + hi = hi + Math.imul(ah2, bh4) | 0; + lo = lo + Math.imul(al1, bl5) | 0; + mid = mid + Math.imul(al1, bh5) | 0; + mid = mid + Math.imul(ah1, bl5) | 0; + hi = hi + Math.imul(ah1, bh5) | 0; + lo = lo + Math.imul(al0, bl6) | 0; + mid = mid + Math.imul(al0, bh6) | 0; + mid = mid + Math.imul(ah0, bl6) | 0; + hi = hi + Math.imul(ah0, bh6) | 0; + var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0; + w6 &= 67108863; + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = mid + Math.imul(ah7, bl0) | 0; + hi = Math.imul(ah7, bh0); + lo = lo + Math.imul(al6, bl1) | 0; + mid = mid + Math.imul(al6, bh1) | 0; + mid = mid + Math.imul(ah6, bl1) | 0; + hi = hi + Math.imul(ah6, bh1) | 0; + lo = lo + Math.imul(al5, bl2) | 0; + mid = mid + Math.imul(al5, bh2) | 0; + mid = mid + Math.imul(ah5, bl2) | 0; + hi = hi + Math.imul(ah5, bh2) | 0; + lo = lo + Math.imul(al4, bl3) | 0; + mid = mid + Math.imul(al4, bh3) | 0; + mid = mid + Math.imul(ah4, bl3) | 0; + hi = hi + Math.imul(ah4, bh3) | 0; + lo = lo + Math.imul(al3, bl4) | 0; + mid = mid + Math.imul(al3, bh4) | 0; + mid = mid + Math.imul(ah3, bl4) | 0; + hi = hi + Math.imul(ah3, bh4) | 0; + lo = lo + Math.imul(al2, bl5) | 0; + mid = mid + Math.imul(al2, bh5) | 0; + mid = mid + Math.imul(ah2, bl5) | 0; + hi = hi + Math.imul(ah2, bh5) | 0; + lo = lo + Math.imul(al1, bl6) | 0; + mid = mid + Math.imul(al1, bh6) | 0; + mid = mid + Math.imul(ah1, bl6) | 0; + hi = hi + Math.imul(ah1, bh6) | 0; + lo = lo + Math.imul(al0, bl7) | 0; + mid = mid + Math.imul(al0, bh7) | 0; + mid = mid + Math.imul(ah0, bl7) | 0; + hi = hi + Math.imul(ah0, bh7) | 0; + var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0; + w7 &= 67108863; + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = mid + Math.imul(ah8, bl0) | 0; + hi = Math.imul(ah8, bh0); + lo = lo + Math.imul(al7, bl1) | 0; + mid = mid + Math.imul(al7, bh1) | 0; + mid = mid + Math.imul(ah7, bl1) | 0; + hi = hi + Math.imul(ah7, bh1) | 0; + lo = lo + Math.imul(al6, bl2) | 0; + mid = mid + Math.imul(al6, bh2) | 0; + mid = mid + Math.imul(ah6, bl2) | 0; + hi = hi + Math.imul(ah6, bh2) | 0; + lo = lo + Math.imul(al5, bl3) | 0; + mid = mid + Math.imul(al5, bh3) | 0; + mid = mid + Math.imul(ah5, bl3) | 0; + hi = hi + Math.imul(ah5, bh3) | 0; + lo = lo + Math.imul(al4, bl4) | 0; + mid = mid + Math.imul(al4, bh4) | 0; + mid = mid + Math.imul(ah4, bl4) | 0; + hi = hi + Math.imul(ah4, bh4) | 0; + lo = lo + Math.imul(al3, bl5) | 0; + mid = mid + Math.imul(al3, bh5) | 0; + mid = mid + Math.imul(ah3, bl5) | 0; + hi = hi + Math.imul(ah3, bh5) | 0; + lo = lo + Math.imul(al2, bl6) | 0; + mid = mid + Math.imul(al2, bh6) | 0; + mid = mid + Math.imul(ah2, bl6) | 0; + hi = hi + Math.imul(ah2, bh6) | 0; + lo = lo + Math.imul(al1, bl7) | 0; + mid = mid + Math.imul(al1, bh7) | 0; + mid = mid + Math.imul(ah1, bl7) | 0; + hi = hi + Math.imul(ah1, bh7) | 0; + lo = lo + Math.imul(al0, bl8) | 0; + mid = mid + Math.imul(al0, bh8) | 0; + mid = mid + Math.imul(ah0, bl8) | 0; + hi = hi + Math.imul(ah0, bh8) | 0; + var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0; + w8 &= 67108863; + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = mid + Math.imul(ah9, bl0) | 0; + hi = Math.imul(ah9, bh0); + lo = lo + Math.imul(al8, bl1) | 0; + mid = mid + Math.imul(al8, bh1) | 0; + mid = mid + Math.imul(ah8, bl1) | 0; + hi = hi + Math.imul(ah8, bh1) | 0; + lo = lo + Math.imul(al7, bl2) | 0; + mid = mid + Math.imul(al7, bh2) | 0; + mid = mid + Math.imul(ah7, bl2) | 0; + hi = hi + Math.imul(ah7, bh2) | 0; + lo = lo + Math.imul(al6, bl3) | 0; + mid = mid + Math.imul(al6, bh3) | 0; + mid = mid + Math.imul(ah6, bl3) | 0; + hi = hi + Math.imul(ah6, bh3) | 0; + lo = lo + Math.imul(al5, bl4) | 0; + mid = mid + Math.imul(al5, bh4) | 0; + mid = mid + Math.imul(ah5, bl4) | 0; + hi = hi + Math.imul(ah5, bh4) | 0; + lo = lo + Math.imul(al4, bl5) | 0; + mid = mid + Math.imul(al4, bh5) | 0; + mid = mid + Math.imul(ah4, bl5) | 0; + hi = hi + Math.imul(ah4, bh5) | 0; + lo = lo + Math.imul(al3, bl6) | 0; + mid = mid + Math.imul(al3, bh6) | 0; + mid = mid + Math.imul(ah3, bl6) | 0; + hi = hi + Math.imul(ah3, bh6) | 0; + lo = lo + Math.imul(al2, bl7) | 0; + mid = mid + Math.imul(al2, bh7) | 0; + mid = mid + Math.imul(ah2, bl7) | 0; + hi = hi + Math.imul(ah2, bh7) | 0; + lo = lo + Math.imul(al1, bl8) | 0; + mid = mid + Math.imul(al1, bh8) | 0; + mid = mid + Math.imul(ah1, bl8) | 0; + hi = hi + Math.imul(ah1, bh8) | 0; + lo = lo + Math.imul(al0, bl9) | 0; + mid = mid + Math.imul(al0, bh9) | 0; + mid = mid + Math.imul(ah0, bl9) | 0; + hi = hi + Math.imul(ah0, bh9) | 0; + var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0; + w9 &= 67108863; + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = mid + Math.imul(ah9, bl1) | 0; + hi = Math.imul(ah9, bh1); + lo = lo + Math.imul(al8, bl2) | 0; + mid = mid + Math.imul(al8, bh2) | 0; + mid = mid + Math.imul(ah8, bl2) | 0; + hi = hi + Math.imul(ah8, bh2) | 0; + lo = lo + Math.imul(al7, bl3) | 0; + mid = mid + Math.imul(al7, bh3) | 0; + mid = mid + Math.imul(ah7, bl3) | 0; + hi = hi + Math.imul(ah7, bh3) | 0; + lo = lo + Math.imul(al6, bl4) | 0; + mid = mid + Math.imul(al6, bh4) | 0; + mid = mid + Math.imul(ah6, bl4) | 0; + hi = hi + Math.imul(ah6, bh4) | 0; + lo = lo + Math.imul(al5, bl5) | 0; + mid = mid + Math.imul(al5, bh5) | 0; + mid = mid + Math.imul(ah5, bl5) | 0; + hi = hi + Math.imul(ah5, bh5) | 0; + lo = lo + Math.imul(al4, bl6) | 0; + mid = mid + Math.imul(al4, bh6) | 0; + mid = mid + Math.imul(ah4, bl6) | 0; + hi = hi + Math.imul(ah4, bh6) | 0; + lo = lo + Math.imul(al3, bl7) | 0; + mid = mid + Math.imul(al3, bh7) | 0; + mid = mid + Math.imul(ah3, bl7) | 0; + hi = hi + Math.imul(ah3, bh7) | 0; + lo = lo + Math.imul(al2, bl8) | 0; + mid = mid + Math.imul(al2, bh8) | 0; + mid = mid + Math.imul(ah2, bl8) | 0; + hi = hi + Math.imul(ah2, bh8) | 0; + lo = lo + Math.imul(al1, bl9) | 0; + mid = mid + Math.imul(al1, bh9) | 0; + mid = mid + Math.imul(ah1, bl9) | 0; + hi = hi + Math.imul(ah1, bh9) | 0; + var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0; + w10 &= 67108863; + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = mid + Math.imul(ah9, bl2) | 0; + hi = Math.imul(ah9, bh2); + lo = lo + Math.imul(al8, bl3) | 0; + mid = mid + Math.imul(al8, bh3) | 0; + mid = mid + Math.imul(ah8, bl3) | 0; + hi = hi + Math.imul(ah8, bh3) | 0; + lo = lo + Math.imul(al7, bl4) | 0; + mid = mid + Math.imul(al7, bh4) | 0; + mid = mid + Math.imul(ah7, bl4) | 0; + hi = hi + Math.imul(ah7, bh4) | 0; + lo = lo + Math.imul(al6, bl5) | 0; + mid = mid + Math.imul(al6, bh5) | 0; + mid = mid + Math.imul(ah6, bl5) | 0; + hi = hi + Math.imul(ah6, bh5) | 0; + lo = lo + Math.imul(al5, bl6) | 0; + mid = mid + Math.imul(al5, bh6) | 0; + mid = mid + Math.imul(ah5, bl6) | 0; + hi = hi + Math.imul(ah5, bh6) | 0; + lo = lo + Math.imul(al4, bl7) | 0; + mid = mid + Math.imul(al4, bh7) | 0; + mid = mid + Math.imul(ah4, bl7) | 0; + hi = hi + Math.imul(ah4, bh7) | 0; + lo = lo + Math.imul(al3, bl8) | 0; + mid = mid + Math.imul(al3, bh8) | 0; + mid = mid + Math.imul(ah3, bl8) | 0; + hi = hi + Math.imul(ah3, bh8) | 0; + lo = lo + Math.imul(al2, bl9) | 0; + mid = mid + Math.imul(al2, bh9) | 0; + mid = mid + Math.imul(ah2, bl9) | 0; + hi = hi + Math.imul(ah2, bh9) | 0; + var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0; + w11 &= 67108863; + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = mid + Math.imul(ah9, bl3) | 0; + hi = Math.imul(ah9, bh3); + lo = lo + Math.imul(al8, bl4) | 0; + mid = mid + Math.imul(al8, bh4) | 0; + mid = mid + Math.imul(ah8, bl4) | 0; + hi = hi + Math.imul(ah8, bh4) | 0; + lo = lo + Math.imul(al7, bl5) | 0; + mid = mid + Math.imul(al7, bh5) | 0; + mid = mid + Math.imul(ah7, bl5) | 0; + hi = hi + Math.imul(ah7, bh5) | 0; + lo = lo + Math.imul(al6, bl6) | 0; + mid = mid + Math.imul(al6, bh6) | 0; + mid = mid + Math.imul(ah6, bl6) | 0; + hi = hi + Math.imul(ah6, bh6) | 0; + lo = lo + Math.imul(al5, bl7) | 0; + mid = mid + Math.imul(al5, bh7) | 0; + mid = mid + Math.imul(ah5, bl7) | 0; + hi = hi + Math.imul(ah5, bh7) | 0; + lo = lo + Math.imul(al4, bl8) | 0; + mid = mid + Math.imul(al4, bh8) | 0; + mid = mid + Math.imul(ah4, bl8) | 0; + hi = hi + Math.imul(ah4, bh8) | 0; + lo = lo + Math.imul(al3, bl9) | 0; + mid = mid + Math.imul(al3, bh9) | 0; + mid = mid + Math.imul(ah3, bl9) | 0; + hi = hi + Math.imul(ah3, bh9) | 0; + var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0; + w12 &= 67108863; + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = mid + Math.imul(ah9, bl4) | 0; + hi = Math.imul(ah9, bh4); + lo = lo + Math.imul(al8, bl5) | 0; + mid = mid + Math.imul(al8, bh5) | 0; + mid = mid + Math.imul(ah8, bl5) | 0; + hi = hi + Math.imul(ah8, bh5) | 0; + lo = lo + Math.imul(al7, bl6) | 0; + mid = mid + Math.imul(al7, bh6) | 0; + mid = mid + Math.imul(ah7, bl6) | 0; + hi = hi + Math.imul(ah7, bh6) | 0; + lo = lo + Math.imul(al6, bl7) | 0; + mid = mid + Math.imul(al6, bh7) | 0; + mid = mid + Math.imul(ah6, bl7) | 0; + hi = hi + Math.imul(ah6, bh7) | 0; + lo = lo + Math.imul(al5, bl8) | 0; + mid = mid + Math.imul(al5, bh8) | 0; + mid = mid + Math.imul(ah5, bl8) | 0; + hi = hi + Math.imul(ah5, bh8) | 0; + lo = lo + Math.imul(al4, bl9) | 0; + mid = mid + Math.imul(al4, bh9) | 0; + mid = mid + Math.imul(ah4, bl9) | 0; + hi = hi + Math.imul(ah4, bh9) | 0; + var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0; + w13 &= 67108863; + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = mid + Math.imul(ah9, bl5) | 0; + hi = Math.imul(ah9, bh5); + lo = lo + Math.imul(al8, bl6) | 0; + mid = mid + Math.imul(al8, bh6) | 0; + mid = mid + Math.imul(ah8, bl6) | 0; + hi = hi + Math.imul(ah8, bh6) | 0; + lo = lo + Math.imul(al7, bl7) | 0; + mid = mid + Math.imul(al7, bh7) | 0; + mid = mid + Math.imul(ah7, bl7) | 0; + hi = hi + Math.imul(ah7, bh7) | 0; + lo = lo + Math.imul(al6, bl8) | 0; + mid = mid + Math.imul(al6, bh8) | 0; + mid = mid + Math.imul(ah6, bl8) | 0; + hi = hi + Math.imul(ah6, bh8) | 0; + lo = lo + Math.imul(al5, bl9) | 0; + mid = mid + Math.imul(al5, bh9) | 0; + mid = mid + Math.imul(ah5, bl9) | 0; + hi = hi + Math.imul(ah5, bh9) | 0; + var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0; + w14 &= 67108863; + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = mid + Math.imul(ah9, bl6) | 0; + hi = Math.imul(ah9, bh6); + lo = lo + Math.imul(al8, bl7) | 0; + mid = mid + Math.imul(al8, bh7) | 0; + mid = mid + Math.imul(ah8, bl7) | 0; + hi = hi + Math.imul(ah8, bh7) | 0; + lo = lo + Math.imul(al7, bl8) | 0; + mid = mid + Math.imul(al7, bh8) | 0; + mid = mid + Math.imul(ah7, bl8) | 0; + hi = hi + Math.imul(ah7, bh8) | 0; + lo = lo + Math.imul(al6, bl9) | 0; + mid = mid + Math.imul(al6, bh9) | 0; + mid = mid + Math.imul(ah6, bl9) | 0; + hi = hi + Math.imul(ah6, bh9) | 0; + var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0; + w15 &= 67108863; + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = mid + Math.imul(ah9, bl7) | 0; + hi = Math.imul(ah9, bh7); + lo = lo + Math.imul(al8, bl8) | 0; + mid = mid + Math.imul(al8, bh8) | 0; + mid = mid + Math.imul(ah8, bl8) | 0; + hi = hi + Math.imul(ah8, bh8) | 0; + lo = lo + Math.imul(al7, bl9) | 0; + mid = mid + Math.imul(al7, bh9) | 0; + mid = mid + Math.imul(ah7, bl9) | 0; + hi = hi + Math.imul(ah7, bh9) | 0; + var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0; + w16 &= 67108863; + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = mid + Math.imul(ah9, bl8) | 0; + hi = Math.imul(ah9, bh8); + lo = lo + Math.imul(al8, bl9) | 0; + mid = mid + Math.imul(al8, bh9) | 0; + mid = mid + Math.imul(ah8, bl9) | 0; + hi = hi + Math.imul(ah8, bh9) | 0; + var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0; + w17 &= 67108863; + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = mid + Math.imul(ah9, bl9) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0; + c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0; + w18 &= 67108863; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + function bigMulTo(self2, num, out) { + out.negative = num.negative ^ self2.negative; + out.length = self2.length + num.length; + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 67108863; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self2.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + var lo = r & 67108863; + ncarry = ncarry + (r / 67108864 | 0) | 0; + lo = lo + rword | 0; + rword = lo & 67108863; + ncarry = ncarry + (lo >>> 26) | 0; + hncarry += ncarry >>> 26; + ncarry &= 67108863; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + return out.strip(); + } + function jumboMulTo(self2, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self2, num, out); + } + BN.prototype.mulTo = function mulTo(num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + return res; + }; + function FFTM(x, y) { + this.x = x; + this.y = y; + } + FFTM.prototype.makeRBT = function makeRBT(N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + return t; + }; + FFTM.prototype.revBin = function revBin(x, l, N) { + if (x === 0 || x === N - 1) return x; + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << l - i - 1; + x >>= 1; + } + return rb; + }; + FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + FFTM.prototype.transform = function transform2(rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + for (var j = 0; j < s; j++) { + var re2 = rtws[p + j]; + var ie = itws[p + j]; + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + var rx = rtwdf_ * ro - itwdf_ * io; + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + rtws[p + j] = re2 + ro; + itws[p + j] = ie + io; + rtws[p + j + s] = re2 - ro; + itws[p + j + s] = ie - io; + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + FFTM.prototype.guessLen13b = function guessLen13b(n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + return 1 << i + 1 + odd; + }; + FFTM.prototype.conjugate = function conjugate(rws, iws, N) { + if (N <= 1) return; + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + t = iws[i]; + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + FFTM.prototype.normalize13b = function normalize13b(ws2, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws2[2 * i + 1] / N) * 8192 + Math.round(ws2[2 * i] / N) + carry; + ws2[i] = w & 67108863; + if (w < 67108864) { + carry = 0; + } else { + carry = w / 67108864 | 0; + } + } + return ws2; + }; + FFTM.prototype.convert13b = function convert13b(ws2, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws2[i] | 0); + rws[2 * i] = carry & 8191; + carry = carry >>> 13; + rws[2 * i + 1] = carry & 8191; + carry = carry >>> 13; + } + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + assert2(carry === 0); + assert2((carry & -8192) === 0); + }; + FFTM.prototype.stub = function stub(N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + return ph; + }; + FFTM.prototype.mulp = function mulp(x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + var rbt = this.makeRBT(N); + var _ = this.stub(N); + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + var rmws = out.words; + rmws.length = N; + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + BN.prototype.mul = function mul(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + BN.prototype.mulf = function mulf(num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + BN.prototype.imul = function imul(num) { + return this.clone().mulTo(num, this); + }; + BN.prototype.imuln = function imuln(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 67108863) + (carry & 67108863); + carry >>= 26; + carry += w / 67108864 | 0; + carry += lo >>> 26; + this.words[i] = lo & 67108863; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.muln = function muln(num) { + return this.clone().imuln(num); + }; + BN.prototype.sqr = function sqr() { + return this.mul(this); + }; + BN.prototype.isqr = function isqr() { + return this.imul(this.clone()); + }; + BN.prototype.pow = function pow2(num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + res = res.mul(q); + } + } + return res; + }; + BN.prototype.iushln = function iushln(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = 67108863 >>> 26 - r << 26 - r; + var i; + if (r !== 0) { + var carry = 0; + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = (this.words[i] | 0) - newCarry << r; + this.words[i] = c | carry; + carry = newCarry >>> 26 - r; + } + if (carry) { + this.words[i] = carry; + this.length++; + } + } + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + this.length += s; + } + return this.strip(); + }; + BN.prototype.ishln = function ishln(bits) { + assert2(this.negative === 0); + return this.iushln(bits); + }; + BN.prototype.iushrn = function iushrn(bits, hint, extended) { + assert2(typeof bits === "number" && bits >= 0); + var h; + if (hint) { + h = (hint - hint % 26) / 26; + } else { + h = 0; + } + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 67108863 ^ 67108863 >>> r << r; + var maskedWords = extended; + h -= s; + h = Math.max(0, h); + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + if (s === 0) ; + else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = carry << 26 - r | word >>> r; + carry = word & mask; + } + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + return this.strip(); + }; + BN.prototype.ishrn = function ishrn(bits, hint, extended) { + assert2(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + BN.prototype.shln = function shln(bits) { + return this.clone().ishln(bits); + }; + BN.prototype.ushln = function ushln(bits) { + return this.clone().iushln(bits); + }; + BN.prototype.shrn = function shrn(bits) { + return this.clone().ishrn(bits); + }; + BN.prototype.ushrn = function ushrn(bits) { + return this.clone().iushrn(bits); + }; + BN.prototype.testn = function testn(bit) { + assert2(typeof bit === "number" && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) return false; + var w = this.words[s]; + return !!(w & q); + }; + BN.prototype.imaskn = function imaskn(bits) { + assert2(typeof bits === "number" && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + assert2(this.negative === 0, "imaskn works only with positive numbers"); + if (this.length <= s) { + return this; + } + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + if (r !== 0) { + var mask = 67108863 ^ 67108863 >>> r << r; + this.words[this.length - 1] &= mask; + } + return this.strip(); + }; + BN.prototype.maskn = function maskn(bits) { + return this.clone().imaskn(bits); + }; + BN.prototype.iaddn = function iaddn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.isubn(-num); + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + return this._iaddn(num); + }; + BN.prototype._iaddn = function _iaddn(num) { + this.words[0] += num; + for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { + this.words[i] -= 67108864; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + return this; + }; + BN.prototype.isubn = function isubn(num) { + assert2(typeof num === "number"); + assert2(num < 67108864); + if (num < 0) return this.iaddn(-num); + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + this.words[0] -= num; + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 67108864; + this.words[i + 1] -= 1; + } + } + return this.strip(); + }; + BN.prototype.addn = function addn(num) { + return this.clone().iaddn(num); + }; + BN.prototype.subn = function subn(num) { + return this.clone().isubn(num); + }; + BN.prototype.iabs = function iabs() { + this.negative = 0; + return this; + }; + BN.prototype.abs = function abs2() { + return this.clone().iabs(); + }; + BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { + var len = num.length + shift; + var i; + this._expand(len); + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 67108863; + carry = (w >> 26) - (right / 67108864 | 0); + this.words[i + shift] = w & 67108863; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 67108863; + } + if (carry === 0) return this.strip(); + assert2(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 67108863; + } + this.negative = 1; + return this.strip(); + }; + BN.prototype._wordDiv = function _wordDiv(num, mode) { + var shift = this.length - num.length; + var a = this.clone(); + var b = num; + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + var m = a.length - b.length; + var q; + if (mode !== "mod") { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + var diff3 = a.clone()._ishlnsubmul(b, 1, m); + if (diff3.negative === 0) { + a = diff3; + if (q) { + q.words[m] = 1; + } + } + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); + qj = Math.min(qj / bhi | 0, 67108863); + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + if (mode !== "div" && shift !== 0) { + a.iushrn(shift); + } + return { + div: q || null, + mod: a + }; + }; + BN.prototype.divmod = function divmod(num, mode, positive) { + assert2(!num.isZero()); + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + if (mode !== "mod") { + div = res.div.neg(); + } + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + return { + div, + mod + }; + } + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + if (mode !== "mod") { + div = res.div.neg(); + } + return { + div, + mod: res.mod + }; + } + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + if (mode !== "div") { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + return { + div: res.div, + mod + }; + } + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + if (num.length === 1) { + if (mode === "div") { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + if (mode === "mod") { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + return this._wordDiv(num, mode); + }; + BN.prototype.div = function div(num) { + return this.divmod(num, "div", false).div; + }; + BN.prototype.mod = function mod(num) { + return this.divmod(num, "mod", false).mod; + }; + BN.prototype.umod = function umod(num) { + return this.divmod(num, "mod", true).mod; + }; + BN.prototype.divRound = function divRound(num) { + var dm = this.divmod(num); + if (dm.mod.isZero()) return dm.div; + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + BN.prototype.modn = function modn(num) { + assert2(num <= 67108863); + var p = (1 << 26) % num; + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + return acc; + }; + BN.prototype.idivn = function idivn(num) { + assert2(num <= 67108863); + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 67108864; + this.words[i] = w / num | 0; + carry = w % num; + } + return this.strip(); + }; + BN.prototype.divn = function divn(num) { + return this.clone().idivn(num); + }; + BN.prototype.egcd = function egcd(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var x = this; + var y = p.clone(); + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + var A = new BN(1); + var B = new BN(0); + var C = new BN(0); + var D = new BN(1); + var g = 0; + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + var yp = y.clone(); + var xp = x.clone(); + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + A.iushrn(1); + B.iushrn(1); + } + } + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + C.iushrn(1); + D.iushrn(1); + } + } + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + BN.prototype._invmp = function _invmp(p) { + assert2(p.negative === 0); + assert2(!p.isZero()); + var a = this; + var b = p.clone(); + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + var x1 = new BN(1); + var x2 = new BN(0); + var delta = b.clone(); + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ; + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + x1.iushrn(1); + } + } + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ; + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + x2.iushrn(1); + } + } + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + if (res.cmpn(0) < 0) { + res.iadd(p); + } + return res; + }; + BN.prototype.gcd = function gcd(num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + var r = a.cmp(b); + if (r < 0) { + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + a.isub(b); + } while (true); + return b.iushln(shift); + }; + BN.prototype.invm = function invm(num) { + return this.egcd(num).a.umod(num); + }; + BN.prototype.isEven = function isEven() { + return (this.words[0] & 1) === 0; + }; + BN.prototype.isOdd = function isOdd() { + return (this.words[0] & 1) === 1; + }; + BN.prototype.andln = function andln(num) { + return this.words[0] & num; + }; + BN.prototype.bincn = function bincn(bit) { + assert2(typeof bit === "number"); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 67108863; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + BN.prototype.isZero = function isZero() { + return this.length === 1 && this.words[0] === 0; + }; + BN.prototype.cmpn = function cmpn(num) { + var negative = num < 0; + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + this.strip(); + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + assert2(num <= 67108863, "Number is too big"); + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.cmp = function cmp(num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + BN.prototype.ucmp = function ucmp(num) { + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + BN.prototype.gtn = function gtn(num) { + return this.cmpn(num) === 1; + }; + BN.prototype.gt = function gt(num) { + return this.cmp(num) === 1; + }; + BN.prototype.gten = function gten(num) { + return this.cmpn(num) >= 0; + }; + BN.prototype.gte = function gte(num) { + return this.cmp(num) >= 0; + }; + BN.prototype.ltn = function ltn(num) { + return this.cmpn(num) === -1; + }; + BN.prototype.lt = function lt(num) { + return this.cmp(num) === -1; + }; + BN.prototype.lten = function lten(num) { + return this.cmpn(num) <= 0; + }; + BN.prototype.lte = function lte(num) { + return this.cmp(num) <= 0; + }; + BN.prototype.eqn = function eqn(num) { + return this.cmpn(num) === 0; + }; + BN.prototype.eq = function eq(num) { + return this.cmp(num) === 0; + }; + BN.red = function red(num) { + return new Red(num); + }; + BN.prototype.toRed = function toRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + assert2(this.negative === 0, "red works only with positives"); + return ctx.convertTo(this)._forceRed(ctx); + }; + BN.prototype.fromRed = function fromRed() { + assert2(this.red, "fromRed works only with numbers in reduction context"); + return this.red.convertFrom(this); + }; + BN.prototype._forceRed = function _forceRed(ctx) { + this.red = ctx; + return this; + }; + BN.prototype.forceRed = function forceRed(ctx) { + assert2(!this.red, "Already a number in reduction context"); + return this._forceRed(ctx); + }; + BN.prototype.redAdd = function redAdd(num) { + assert2(this.red, "redAdd works only with red numbers"); + return this.red.add(this, num); + }; + BN.prototype.redIAdd = function redIAdd(num) { + assert2(this.red, "redIAdd works only with red numbers"); + return this.red.iadd(this, num); + }; + BN.prototype.redSub = function redSub(num) { + assert2(this.red, "redSub works only with red numbers"); + return this.red.sub(this, num); + }; + BN.prototype.redISub = function redISub(num) { + assert2(this.red, "redISub works only with red numbers"); + return this.red.isub(this, num); + }; + BN.prototype.redShl = function redShl(num) { + assert2(this.red, "redShl works only with red numbers"); + return this.red.shl(this, num); + }; + BN.prototype.redMul = function redMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + BN.prototype.redIMul = function redIMul(num) { + assert2(this.red, "redMul works only with red numbers"); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + BN.prototype.redSqr = function redSqr() { + assert2(this.red, "redSqr works only with red numbers"); + this.red._verify1(this); + return this.red.sqr(this); + }; + BN.prototype.redISqr = function redISqr() { + assert2(this.red, "redISqr works only with red numbers"); + this.red._verify1(this); + return this.red.isqr(this); + }; + BN.prototype.redSqrt = function redSqrt() { + assert2(this.red, "redSqrt works only with red numbers"); + this.red._verify1(this); + return this.red.sqrt(this); + }; + BN.prototype.redInvm = function redInvm() { + assert2(this.red, "redInvm works only with red numbers"); + this.red._verify1(this); + return this.red.invm(this); + }; + BN.prototype.redNeg = function redNeg() { + assert2(this.red, "redNeg works only with red numbers"); + this.red._verify1(this); + return this.red.neg(this); + }; + BN.prototype.redPow = function redPow(num) { + assert2(this.red && !num.red, "redPow(normalNum)"); + this.red._verify1(this); + return this.red.pow(this, num); + }; + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + function MPrime(name, p) { + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + this.tmp = this._tmp(); + } + MPrime.prototype._tmp = function _tmp() { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + MPrime.prototype.ireduce = function ireduce(num) { + var r = num; + var rlen; + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== void 0) { + r.strip(); + } else { + r._strip(); + } + } + return r; + }; + MPrime.prototype.split = function split(input, out) { + input.iushrn(this.n, 0, out); + }; + MPrime.prototype.imulK = function imulK(num) { + return num.imul(this.k); + }; + function K256() { + MPrime.call( + this, + "k256", + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f" + ); + } + inherits(K256, MPrime); + K256.prototype.split = function split(input, output) { + var mask = 4194303; + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = (next & mask) << 4 | prev >>> 22; + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + K256.prototype.imulK = function imulK(num) { + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 977; + num.words[i] = lo & 67108863; + lo = w * 64 + (lo / 67108864 | 0); + } + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + function P224() { + MPrime.call( + this, + "p224", + "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001" + ); + } + inherits(P224, MPrime); + function P192() { + MPrime.call( + this, + "p192", + "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff" + ); + } + inherits(P192, MPrime); + function P25519() { + MPrime.call( + this, + "25519", + "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed" + ); + } + inherits(P25519, MPrime); + P25519.prototype.imulK = function imulK(num) { + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 19 + carry; + var lo = hi & 67108863; + hi >>>= 26; + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + BN._prime = function prime(name) { + if (primes[name]) return primes[name]; + var prime2; + if (name === "k256") { + prime2 = new K256(); + } else if (name === "p224") { + prime2 = new P224(); + } else if (name === "p192") { + prime2 = new P192(); + } else if (name === "p25519") { + prime2 = new P25519(); + } else { + throw new Error("Unknown prime " + name); + } + primes[name] = prime2; + return prime2; + }; + function Red(m) { + if (typeof m === "string") { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert2(m.gtn(1), "modulus must be greater than 1"); + this.m = m; + this.prime = null; + } + } + Red.prototype._verify1 = function _verify1(a) { + assert2(a.negative === 0, "red works only with positives"); + assert2(a.red, "red works only with red numbers"); + }; + Red.prototype._verify2 = function _verify2(a, b) { + assert2((a.negative | b.negative) === 0, "red works only with positives"); + assert2( + a.red && a.red === b.red, + "red works only with red numbers" + ); + }; + Red.prototype.imod = function imod(a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + Red.prototype.neg = function neg(a) { + if (a.isZero()) { + return a.clone(); + } + return this.m.sub(a)._forceRed(this); + }; + Red.prototype.add = function add(a, b) { + this._verify2(a, b); + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + Red.prototype.iadd = function iadd(a, b) { + this._verify2(a, b); + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + Red.prototype.sub = function sub(a, b) { + this._verify2(a, b); + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + Red.prototype.isub = function isub(a, b) { + this._verify2(a, b); + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + Red.prototype.shl = function shl(a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + Red.prototype.imul = function imul(a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + Red.prototype.mul = function mul(a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + Red.prototype.isqr = function isqr(a) { + return this.imul(a, a.clone()); + }; + Red.prototype.sqr = function sqr(a) { + return this.mul(a, a); + }; + Red.prototype.sqrt = function sqrt(a) { + if (a.isZero()) return a.clone(); + var mod3 = this.m.andln(3); + assert2(mod3 % 2 === 1); + if (mod3 === 3) { + var pow2 = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow2); + } + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert2(!q.isZero()); + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert2(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + return r; + }; + Red.prototype.invm = function invm(a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + Red.prototype.pow = function pow2(a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + var res = wnd[0]; + var current2 = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = word >> j & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + if (bit === 0 && current2 === 0) { + currentLen = 0; + continue; + } + current2 <<= 1; + current2 |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + res = this.mul(res, wnd[current2]); + currentLen = 0; + current2 = 0; + } + start = 26; + } + return res; + }; + Red.prototype.convertTo = function convertTo(num) { + var r = num.umod(this.m); + return r === num ? r.clone() : r; + }; + Red.prototype.convertFrom = function convertFrom(num) { + var res = num.clone(); + res.red = null; + return res; + }; + BN.mont = function mont2(num) { + return new Mont(num); + }; + function Mont(m) { + Red.call(this, m); + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - this.shift % 26; + } + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + Mont.prototype.convertTo = function convertTo(num) { + return this.imod(num.ushln(this.shift)); + }; + Mont.prototype.convertFrom = function convertFrom(num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + Mont.prototype.imul = function imul(a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.mul = function mul(a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + return res._forceRed(this); + }; + Mont.prototype.invm = function invm(a) { + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; + })(module, bn); + })(bn$1); + return bn$1.exports; +} +var withPublic_1; +var hasRequiredWithPublic; +function requireWithPublic() { + if (hasRequiredWithPublic) return withPublic_1; + hasRequiredWithPublic = 1; + var BN = requireBn(); + var Buffer2 = requireSafeBuffer().Buffer; + function withPublic(paddedMsg, key2) { + return Buffer2.from(paddedMsg.toRed(BN.mont(key2.modulus)).redPow(new BN(key2.publicExponent)).fromRed().toArray()); + } + withPublic_1 = withPublic; + return withPublic_1; +} +var publicEncrypt; +var hasRequiredPublicEncrypt; +function requirePublicEncrypt() { + if (hasRequiredPublicEncrypt) return publicEncrypt; + hasRequiredPublicEncrypt = 1; + var parseKeys = requireParseAsn1(); + var randomBytes = requireBrowser$e(); + var createHash = requireBrowser$c(); + var mgf2 = requireMgf(); + var xor2 = requireXor(); + var BN = requireBn(); + var withPublic = requireWithPublic(); + var crt = requireBrowserifyRsa(); + var Buffer2 = requireSafeBuffer().Buffer; + publicEncrypt = function publicEncrypt2(publicKey, msg, reverse) { + var padding; + if (publicKey.padding) { + padding = publicKey.padding; + } else if (reverse) { + padding = 1; + } else { + padding = 4; + } + var key2 = parseKeys(publicKey); + var paddedMsg; + if (padding === 4) { + paddedMsg = oaep(key2, msg); + } else if (padding === 1) { + paddedMsg = pkcs1(key2, msg, reverse); + } else if (padding === 3) { + paddedMsg = new BN(msg); + if (paddedMsg.cmp(key2.modulus) >= 0) { + throw new Error("data too long for modulus"); + } + } else { + throw new Error("unknown padding"); + } + if (reverse) { + return crt(paddedMsg, key2); + } else { + return withPublic(paddedMsg, key2); + } + }; + function oaep(key2, msg) { + var k = key2.modulus.byteLength(); + var mLen = msg.length; + var iHash = createHash("sha1").update(Buffer2.alloc(0)).digest(); + var hLen = iHash.length; + var hLen2 = 2 * hLen; + if (mLen > k - hLen2 - 2) { + throw new Error("message too long"); + } + var ps = Buffer2.alloc(k - mLen - hLen2 - 2); + var dblen = k - hLen - 1; + var seed = randomBytes(hLen); + var maskedDb = xor2(Buffer2.concat([iHash, ps, Buffer2.alloc(1, 1), msg], dblen), mgf2(seed, dblen)); + var maskedSeed = xor2(seed, mgf2(maskedDb, hLen)); + return new BN(Buffer2.concat([Buffer2.alloc(1), maskedSeed, maskedDb], k)); + } + function pkcs1(key2, msg, reverse) { + var mLen = msg.length; + var k = key2.modulus.byteLength(); + if (mLen > k - 11) { + throw new Error("message too long"); + } + var ps; + if (reverse) { + ps = Buffer2.alloc(k - mLen - 3, 255); + } else { + ps = nonZero(k - mLen - 3); + } + return new BN(Buffer2.concat([Buffer2.from([0, reverse ? 1 : 2]), ps, Buffer2.alloc(1), msg], k)); + } + function nonZero(len) { + var out = Buffer2.allocUnsafe(len); + var i = 0; + var cache = randomBytes(len * 2); + var cur = 0; + var num; + while (i < len) { + if (cur === cache.length) { + cache = randomBytes(len * 2); + cur = 0; + } + num = cache[cur++]; + if (num) { + out[i++] = num; + } + } + return out; + } + return publicEncrypt; +} +var privateDecrypt; +var hasRequiredPrivateDecrypt; +function requirePrivateDecrypt() { + if (hasRequiredPrivateDecrypt) return privateDecrypt; + hasRequiredPrivateDecrypt = 1; + var parseKeys = requireParseAsn1(); + var mgf2 = requireMgf(); + var xor2 = requireXor(); + var BN = requireBn(); + var crt = requireBrowserifyRsa(); + var createHash = requireBrowser$c(); + var withPublic = requireWithPublic(); + var Buffer2 = requireSafeBuffer().Buffer; + privateDecrypt = function privateDecrypt2(privateKey, enc, reverse) { + var padding; + if (privateKey.padding) { + padding = privateKey.padding; + } else if (reverse) { + padding = 1; + } else { + padding = 4; + } + var key2 = parseKeys(privateKey); + var k = key2.modulus.byteLength(); + if (enc.length > k || new BN(enc).cmp(key2.modulus) >= 0) { + throw new Error("decryption error"); + } + var msg; + if (reverse) { + msg = withPublic(new BN(enc), key2); + } else { + msg = crt(enc, key2); + } + var zBuffer = Buffer2.alloc(k - msg.length); + msg = Buffer2.concat([zBuffer, msg], k); + if (padding === 4) { + return oaep(key2, msg); + } else if (padding === 1) { + return pkcs1(key2, msg, reverse); + } else if (padding === 3) { + return msg; + } else { + throw new Error("unknown padding"); + } + }; + function oaep(key2, msg) { + var k = key2.modulus.byteLength(); + var iHash = createHash("sha1").update(Buffer2.alloc(0)).digest(); + var hLen = iHash.length; + if (msg[0] !== 0) { + throw new Error("decryption error"); + } + var maskedSeed = msg.slice(1, hLen + 1); + var maskedDb = msg.slice(hLen + 1); + var seed = xor2(maskedSeed, mgf2(maskedDb, hLen)); + var db = xor2(maskedDb, mgf2(seed, k - hLen - 1)); + if (compare2(iHash, db.slice(0, hLen))) { + throw new Error("decryption error"); + } + var i = hLen; + while (db[i] === 0) { + i++; + } + if (db[i++] !== 1) { + throw new Error("decryption error"); + } + return db.slice(i); + } + function pkcs1(key2, msg, reverse) { + var p1 = msg.slice(0, 2); + var i = 2; + var status = 0; + while (msg[i++] !== 0) { + if (i >= msg.length) { + status++; + break; + } + } + var ps = msg.slice(2, i - 1); + if (p1.toString("hex") !== "0002" && !reverse || p1.toString("hex") !== "0001" && reverse) { + status++; + } + if (ps.length < 8) { + status++; + } + if (status) { + throw new Error("decryption error"); + } + return msg.slice(i); + } + function compare2(a, b) { + a = Buffer2.from(a); + b = Buffer2.from(b); + var dif = 0; + var len = a.length; + if (a.length !== b.length) { + dif++; + len = Math.min(a.length, b.length); + } + var i = -1; + while (++i < len) { + dif += a[i] ^ b[i]; + } + return dif; + } + return privateDecrypt; +} +var hasRequiredBrowser$4; +function requireBrowser$4() { + if (hasRequiredBrowser$4) return browser$4; + hasRequiredBrowser$4 = 1; + (function(exports) { + exports.publicEncrypt = requirePublicEncrypt(); + exports.privateDecrypt = requirePrivateDecrypt(); + exports.privateEncrypt = function privateEncrypt(key2, buf) { + return exports.publicEncrypt(key2, buf, true); + }; + exports.publicDecrypt = function publicDecrypt(key2, buf) { + return exports.privateDecrypt(key2, buf, true); + }; + })(browser$4); + return browser$4; +} +var browser$3 = {}; +var hasRequiredBrowser$3; +function requireBrowser$3() { + if (hasRequiredBrowser$3) return browser$3; + hasRequiredBrowser$3 = 1; + function oldBrowser() { + throw new Error("secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11"); + } + var safeBuffer2 = requireSafeBuffer(); + var randombytes = requireBrowser$e(); + var Buffer2 = safeBuffer2.Buffer; + var kBufferMaxLength = safeBuffer2.kMaxLength; + var crypto2 = commonjsGlobal.crypto || commonjsGlobal.msCrypto; + var kMaxUint32 = Math.pow(2, 32) - 1; + function assertOffset(offset2, length) { + if (typeof offset2 !== "number" || offset2 !== offset2) { + throw new TypeError("offset must be a number"); + } + if (offset2 > kMaxUint32 || offset2 < 0) { + throw new TypeError("offset must be a uint32"); + } + if (offset2 > kBufferMaxLength || offset2 > length) { + throw new RangeError("offset out of range"); + } + } + function assertSize(size, offset2, length) { + if (typeof size !== "number" || size !== size) { + throw new TypeError("size must be a number"); + } + if (size > kMaxUint32 || size < 0) { + throw new TypeError("size must be a uint32"); + } + if (size + offset2 > length || size > kBufferMaxLength) { + throw new RangeError("buffer too small"); + } + } + if (crypto2 && crypto2.getRandomValues || !process.browser) { + browser$3.randomFill = randomFill; + browser$3.randomFillSync = randomFillSync; + } else { + browser$3.randomFill = oldBrowser; + browser$3.randomFillSync = oldBrowser; + } + function randomFill(buf, offset2, size, cb) { + if (!Buffer2.isBuffer(buf) && !(buf instanceof commonjsGlobal.Uint8Array)) { + throw new TypeError('"buf" argument must be a Buffer or Uint8Array'); + } + if (typeof offset2 === "function") { + cb = offset2; + offset2 = 0; + size = buf.length; + } else if (typeof size === "function") { + cb = size; + size = buf.length - offset2; + } else if (typeof cb !== "function") { + throw new TypeError('"cb" argument must be a function'); + } + assertOffset(offset2, buf.length); + assertSize(size, offset2, buf.length); + return actualFill(buf, offset2, size, cb); + } + function actualFill(buf, offset2, size, cb) { + if (process.browser) { + var ourBuf = buf.buffer; + var uint = new Uint8Array(ourBuf, offset2, size); + crypto2.getRandomValues(uint); + if (cb) { + process.nextTick(function() { + cb(null, buf); + }); + return; + } + return buf; + } + if (cb) { + randombytes(size, function(err, bytes2) { + if (err) { + return cb(err); + } + bytes2.copy(buf, offset2); + cb(null, buf); + }); + return; + } + var bytes = randombytes(size); + bytes.copy(buf, offset2); + return buf; + } + function randomFillSync(buf, offset2, size) { + if (typeof offset2 === "undefined") { + offset2 = 0; + } + if (!Buffer2.isBuffer(buf) && !(buf instanceof commonjsGlobal.Uint8Array)) { + throw new TypeError('"buf" argument must be a Buffer or Uint8Array'); + } + assertOffset(offset2, buf.length); + if (size === void 0) size = buf.length - offset2; + assertSize(size, offset2, buf.length); + return actualFill(buf, offset2, size); + } + return browser$3; +} +var hasRequiredCryptoBrowserify; +function requireCryptoBrowserify() { + if (hasRequiredCryptoBrowserify) return cryptoBrowserify; + hasRequiredCryptoBrowserify = 1; + cryptoBrowserify.randomBytes = cryptoBrowserify.rng = cryptoBrowserify.pseudoRandomBytes = cryptoBrowserify.prng = requireBrowser$e(); + cryptoBrowserify.createHash = cryptoBrowserify.Hash = requireBrowser$c(); + cryptoBrowserify.createHmac = cryptoBrowserify.Hmac = requireBrowser$b(); + var algos2 = requireAlgos(); + var algoKeys = Object.keys(algos2); + var hashes = ["sha1", "sha224", "sha256", "sha384", "sha512", "md5", "rmd160"].concat(algoKeys); + cryptoBrowserify.getHashes = function() { + return hashes; + }; + var p = requireBrowser$a(); + cryptoBrowserify.pbkdf2 = p.pbkdf2; + cryptoBrowserify.pbkdf2Sync = p.pbkdf2Sync; + var aes2 = requireBrowser$8(); + cryptoBrowserify.Cipher = aes2.Cipher; + cryptoBrowserify.createCipher = aes2.createCipher; + cryptoBrowserify.Cipheriv = aes2.Cipheriv; + cryptoBrowserify.createCipheriv = aes2.createCipheriv; + cryptoBrowserify.Decipher = aes2.Decipher; + cryptoBrowserify.createDecipher = aes2.createDecipher; + cryptoBrowserify.Decipheriv = aes2.Decipheriv; + cryptoBrowserify.createDecipheriv = aes2.createDecipheriv; + cryptoBrowserify.getCiphers = aes2.getCiphers; + cryptoBrowserify.listCiphers = aes2.listCiphers; + var dh2 = requireBrowser$7(); + cryptoBrowserify.DiffieHellmanGroup = dh2.DiffieHellmanGroup; + cryptoBrowserify.createDiffieHellmanGroup = dh2.createDiffieHellmanGroup; + cryptoBrowserify.getDiffieHellman = dh2.getDiffieHellman; + cryptoBrowserify.createDiffieHellman = dh2.createDiffieHellman; + cryptoBrowserify.DiffieHellman = dh2.DiffieHellman; + var sign2 = requireBrowser$6(); + cryptoBrowserify.createSign = sign2.createSign; + cryptoBrowserify.Sign = sign2.Sign; + cryptoBrowserify.createVerify = sign2.createVerify; + cryptoBrowserify.Verify = sign2.Verify; + cryptoBrowserify.createECDH = requireBrowser$5(); + var publicEncrypt2 = requireBrowser$4(); + cryptoBrowserify.publicEncrypt = publicEncrypt2.publicEncrypt; + cryptoBrowserify.privateEncrypt = publicEncrypt2.privateEncrypt; + cryptoBrowserify.publicDecrypt = publicEncrypt2.publicDecrypt; + cryptoBrowserify.privateDecrypt = publicEncrypt2.privateDecrypt; + var rf = requireBrowser$3(); + cryptoBrowserify.randomFill = rf.randomFill; + cryptoBrowserify.randomFillSync = rf.randomFillSync; + cryptoBrowserify.createCredentials = function() { + throw new Error([ + "sorry, createCredentials is not implemented yet", + "we accept pull requests", + "https://github.com/crypto-browserify/crypto-browserify" + ].join("\n")); + }; + cryptoBrowserify.constants = { + "DH_CHECK_P_NOT_SAFE_PRIME": 2, + "DH_CHECK_P_NOT_PRIME": 1, + "DH_UNABLE_TO_CHECK_GENERATOR": 4, + "DH_NOT_SUITABLE_GENERATOR": 8, + "NPN_ENABLED": 1, + "ALPN_ENABLED": 1, + "RSA_PKCS1_PADDING": 1, + "RSA_SSLV23_PADDING": 2, + "RSA_NO_PADDING": 3, + "RSA_PKCS1_OAEP_PADDING": 4, + "RSA_X931_PADDING": 5, + "RSA_PKCS1_PSS_PADDING": 6, + "POINT_CONVERSION_COMPRESSED": 2, + "POINT_CONVERSION_UNCOMPRESSED": 4, + "POINT_CONVERSION_HYBRID": 6 + }; + return cryptoBrowserify; +} +const version$3 = "16.4.5"; +const require$$4 = { + version: version$3 +}; +var hasRequiredMain; +function requireMain() { + if (hasRequiredMain) return main.exports; + hasRequiredMain = 1; + const fs2 = require$$2$1; + const path2 = requirePath(); + const os2 = requireBrowser$g(); + const crypto2 = requireCryptoBrowserify(); + const packageJson = require$$4; + const version2 = packageJson.version; + const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; + function parse4(src2) { + const obj = {}; + let lines = src2.toString(); + lines = lines.replace(/\r\n?/mg, "\n"); + let match; + while ((match = LINE.exec(lines)) != null) { + const key2 = match[1]; + let value = match[2] || ""; + value = value.trim(); + const maybeQuote = value[0]; + value = value.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"); + if (maybeQuote === '"') { + value = value.replace(/\\n/g, "\n"); + value = value.replace(/\\r/g, "\r"); + } + obj[key2] = value; + } + return obj; + } + function _parseVault(options2) { + const vaultPath = _vaultPath(options2); + const result = DotenvModule.configDotenv({ path: vaultPath }); + if (!result.parsed) { + const err = new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`); + err.code = "MISSING_DATA"; + throw err; + } + const keys = _dotenvKey(options2).split(","); + const length = keys.length; + let decrypted; + for (let i = 0; i < length; i++) { + try { + const key2 = keys[i].trim(); + const attrs = _instructions(result, key2); + decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key); + break; + } catch (error2) { + if (i + 1 >= length) { + throw error2; + } + } + } + return DotenvModule.parse(decrypted); + } + function _log(message) { + console.log(`[dotenv@${version2}][INFO] ${message}`); + } + function _warn(message) { + console.log(`[dotenv@${version2}][WARN] ${message}`); + } + function _debug(message) { + console.log(`[dotenv@${version2}][DEBUG] ${message}`); + } + function _dotenvKey(options2) { + if (options2 && options2.DOTENV_KEY && options2.DOTENV_KEY.length > 0) { + return options2.DOTENV_KEY; + } + if (define_process_env_default.DOTENV_KEY && define_process_env_default.DOTENV_KEY.length > 0) { + return define_process_env_default.DOTENV_KEY; + } + return ""; + } + function _instructions(result, dotenvKey) { + let uri2; + try { + uri2 = new URL(dotenvKey); + } catch (error2) { + if (error2.code === "ERR_INVALID_URL") { + const err = new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development"); + err.code = "INVALID_DOTENV_KEY"; + throw err; + } + throw error2; + } + const key2 = uri2.password; + if (!key2) { + const err = new Error("INVALID_DOTENV_KEY: Missing key part"); + err.code = "INVALID_DOTENV_KEY"; + throw err; + } + const environment = uri2.searchParams.get("environment"); + if (!environment) { + const err = new Error("INVALID_DOTENV_KEY: Missing environment part"); + err.code = "INVALID_DOTENV_KEY"; + throw err; + } + const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`; + const ciphertext = result.parsed[environmentKey]; + if (!ciphertext) { + const err = new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`); + err.code = "NOT_FOUND_DOTENV_ENVIRONMENT"; + throw err; + } + return { ciphertext, key: key2 }; + } + function _vaultPath(options2) { + let possibleVaultPath = null; + if (options2 && options2.path && options2.path.length > 0) { + if (Array.isArray(options2.path)) { + for (const filepath of options2.path) { + if (fs2.existsSync(filepath)) { + possibleVaultPath = filepath.endsWith(".vault") ? filepath : `${filepath}.vault`; + } + } + } else { + possibleVaultPath = options2.path.endsWith(".vault") ? options2.path : `${options2.path}.vault`; + } + } else { + possibleVaultPath = path2.resolve(process.cwd(), ".env.vault"); + } + if (fs2.existsSync(possibleVaultPath)) { + return possibleVaultPath; + } + return null; + } + function _resolveHome(envPath) { + return envPath[0] === "~" ? path2.join(os2.homedir(), envPath.slice(1)) : envPath; + } + function _configVault(options2) { + _log("Loading env from encrypted .env.vault"); + const parsed = DotenvModule._parseVault(options2); + let processEnv = define_process_env_default; + if (options2 && options2.processEnv != null) { + processEnv = options2.processEnv; + } + DotenvModule.populate(processEnv, parsed, options2); + return { parsed }; + } + function configDotenv(options2) { + const dotenvPath = path2.resolve(process.cwd(), ".env"); + let encoding2 = "utf8"; + const debug2 = Boolean(options2 && options2.debug); + if (options2 && options2.encoding) { + encoding2 = options2.encoding; + } else { + if (debug2) { + _debug("No encoding is specified. UTF-8 is used by default"); + } + } + let optionPaths = [dotenvPath]; + if (options2 && options2.path) { + if (!Array.isArray(options2.path)) { + optionPaths = [_resolveHome(options2.path)]; + } else { + optionPaths = []; + for (const filepath of options2.path) { + optionPaths.push(_resolveHome(filepath)); + } + } + } + let lastError; + const parsedAll = {}; + for (const path3 of optionPaths) { + try { + const parsed = DotenvModule.parse(fs2.readFileSync(path3, { encoding: encoding2 })); + DotenvModule.populate(parsedAll, parsed, options2); + } catch (e) { + if (debug2) { + _debug(`Failed to load ${path3} ${e.message}`); + } + lastError = e; + } + } + let processEnv = define_process_env_default; + if (options2 && options2.processEnv != null) { + processEnv = options2.processEnv; + } + DotenvModule.populate(processEnv, parsedAll, options2); + if (lastError) { + return { parsed: parsedAll, error: lastError }; + } else { + return { parsed: parsedAll }; + } + } + function config(options2) { + if (_dotenvKey(options2).length === 0) { + return DotenvModule.configDotenv(options2); + } + const vaultPath = _vaultPath(options2); + if (!vaultPath) { + _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`); + return DotenvModule.configDotenv(options2); + } + return DotenvModule._configVault(options2); + } + function decrypt(encrypted, keyStr) { + const key2 = Buffer.from(keyStr.slice(-64), "hex"); + let ciphertext = Buffer.from(encrypted, "base64"); + const nonce = ciphertext.subarray(0, 12); + const authTag = ciphertext.subarray(-16); + ciphertext = ciphertext.subarray(12, -16); + try { + const aesgcm = crypto2.createDecipheriv("aes-256-gcm", key2, nonce); + aesgcm.setAuthTag(authTag); + return `${aesgcm.update(ciphertext)}${aesgcm.final()}`; + } catch (error2) { + const isRange = error2 instanceof RangeError; + const invalidKeyLength = error2.message === "Invalid key length"; + const decryptionFailed = error2.message === "Unsupported state or unable to authenticate data"; + if (isRange || invalidKeyLength) { + const err = new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)"); + err.code = "INVALID_DOTENV_KEY"; + throw err; + } else if (decryptionFailed) { + const err = new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY"); + err.code = "DECRYPTION_FAILED"; + throw err; + } else { + throw error2; + } + } + } + function populate(processEnv, parsed, options2 = {}) { + const debug2 = Boolean(options2 && options2.debug); + const override = Boolean(options2 && options2.override); + if (typeof parsed !== "object") { + const err = new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate"); + err.code = "OBJECT_REQUIRED"; + throw err; + } + for (const key2 of Object.keys(parsed)) { + if (Object.prototype.hasOwnProperty.call(processEnv, key2)) { + if (override === true) { + processEnv[key2] = parsed[key2]; + } + if (debug2) { + if (override === true) { + _debug(`"${key2}" is already defined and WAS overwritten`); + } else { + _debug(`"${key2}" is already defined and was NOT overwritten`); + } + } + } else { + processEnv[key2] = parsed[key2]; + } + } + } + const DotenvModule = { + configDotenv, + _configVault, + _parseVault, + config, + decrypt, + parse: parse4, + populate + }; + main.exports.configDotenv = DotenvModule.configDotenv; + main.exports._configVault = DotenvModule._configVault; + main.exports._parseVault = DotenvModule._parseVault; + main.exports.config = DotenvModule.config; + main.exports.decrypt = DotenvModule.decrypt; + main.exports.parse = DotenvModule.parse; + main.exports.populate = DotenvModule.populate; + main.exports = DotenvModule; + return main.exports; +} +var mainExports = requireMain(); +const dotenvLibrary = /* @__PURE__ */ getDefaultExportFromCjs(mainExports); +var proxyFromEnv = {}; +var hasRequiredProxyFromEnv; +function requireProxyFromEnv() { + if (hasRequiredProxyFromEnv) return proxyFromEnv; + hasRequiredProxyFromEnv = 1; + var parseUrl = require$$1$5.parse; + var DEFAULT_PORTS = { + ftp: 21, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 + }; + var stringEndsWith = String.prototype.endsWith || function(s) { + return s.length <= this.length && this.indexOf(s, this.length - s.length) !== -1; + }; + function getProxyForUrl2(url2) { + var parsedUrl = typeof url2 === "string" ? parseUrl(url2) : url2 || {}; + var proto = parsedUrl.protocol; + var hostname = parsedUrl.host; + var port = parsedUrl.port; + if (typeof hostname !== "string" || !hostname || typeof proto !== "string") { + return ""; + } + proto = proto.split(":", 1)[0]; + hostname = hostname.replace(/:\d*$/, ""); + port = parseInt(port) || DEFAULT_PORTS[proto] || 0; + if (!shouldProxy(hostname, port)) { + return ""; + } + var proxy = getEnv("npm_config_" + proto + "_proxy") || getEnv(proto + "_proxy") || getEnv("npm_config_proxy") || getEnv("all_proxy"); + if (proxy && proxy.indexOf("://") === -1) { + proxy = proto + "://" + proxy; + } + return proxy; + } + function shouldProxy(hostname, port) { + var NO_PROXY = (getEnv("npm_config_no_proxy") || getEnv("no_proxy")).toLowerCase(); + if (!NO_PROXY) { + return true; + } + if (NO_PROXY === "*") { + return false; + } + return NO_PROXY.split(/[,\s]/).every(function(proxy) { + if (!proxy) { + return true; + } + var parsedProxy = proxy.match(/^(.+):(\d+)$/); + var parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy; + var parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2]) : 0; + if (parsedProxyPort && parsedProxyPort !== port) { + return true; + } + if (!/^[.*]/.test(parsedProxyHostname)) { + return hostname !== parsedProxyHostname; + } + if (parsedProxyHostname.charAt(0) === "*") { + parsedProxyHostname = parsedProxyHostname.slice(1); + } + return !stringEndsWith.call(hostname, parsedProxyHostname); + }); + } + function getEnv(key2) { + return define_process_env_default[key2.toLowerCase()] || define_process_env_default[key2.toUpperCase()] || ""; + } + proxyFromEnv.getProxyForUrl = getProxyForUrl2; + return proxyFromEnv; +} +var proxyFromEnvExports = requireProxyFromEnv(); +var agent$1 = {}; +function noop$3() { +} +const createConnection = noop$3; +const isIP = noop$3; +const net = { + createConnection, + isIP +}; +const net$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + createConnection, + default: net, + isIP +}, Symbol.toStringTag, { value: "Module" })); +const require$$1$2 = /* @__PURE__ */ getAugmentedNamespace(net$1); +function noop$2() { +} +const connect = noop$2; +const TLSSocket = noop$2; +const tls = { + connect, + TLSSocket +}; +const tls$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + TLSSocket, + connect, + default: tls +}, Symbol.toStringTag, { value: "Module" })); +const require$$1$1 = /* @__PURE__ */ getAugmentedNamespace(tls$1); +var promisify = {}; +var hasRequiredPromisify; +function requirePromisify() { + if (hasRequiredPromisify) return promisify; + hasRequiredPromisify = 1; + Object.defineProperty(promisify, "__esModule", { value: true }); + function promisify$1(fn) { + return function(req, opts) { + return new Promise((resolve, reject) => { + fn.call(this, req, opts, (err, rtn) => { + if (err) { + reject(err); + } else { + resolve(rtn); + } + }); + }); + }; + } + promisify.default = promisify$1; + return promisify; +} +var src; +var hasRequiredSrc; +function requireSrc() { + if (hasRequiredSrc) return src; + hasRequiredSrc = 1; + var __importDefault = src && src.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + const events_1 = requireEvents(); + const debug_1 = __importDefault(requireBrowser$f()); + const promisify_1 = __importDefault(requirePromisify()); + const debug2 = debug_1.default("agent-base"); + function isAgent(v) { + return Boolean(v) && typeof v.addRequest === "function"; + } + function isSecureEndpoint() { + const { stack } = new Error(); + if (typeof stack !== "string") + return false; + return stack.split("\n").some((l) => l.indexOf("(https.js:") !== -1 || l.indexOf("node:https:") !== -1); + } + function createAgent(callback, opts) { + return new createAgent.Agent(callback, opts); + } + (function(createAgent2) { + class Agent extends events_1.EventEmitter { + constructor(callback, _opts) { + super(); + let opts = _opts; + if (typeof callback === "function") { + this.callback = callback; + } else if (callback) { + opts = callback; + } + this.timeout = null; + if (opts && typeof opts.timeout === "number") { + this.timeout = opts.timeout; + } + this.maxFreeSockets = 1; + this.maxSockets = 1; + this.maxTotalSockets = Infinity; + this.sockets = {}; + this.freeSockets = {}; + this.requests = {}; + this.options = {}; + } + get defaultPort() { + if (typeof this.explicitDefaultPort === "number") { + return this.explicitDefaultPort; + } + return isSecureEndpoint() ? 443 : 80; + } + set defaultPort(v) { + this.explicitDefaultPort = v; + } + get protocol() { + if (typeof this.explicitProtocol === "string") { + return this.explicitProtocol; + } + return isSecureEndpoint() ? "https:" : "http:"; + } + set protocol(v) { + this.explicitProtocol = v; + } + callback(req, opts, fn) { + throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`'); + } + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req, _opts) { + const opts = Object.assign({}, _opts); + if (typeof opts.secureEndpoint !== "boolean") { + opts.secureEndpoint = isSecureEndpoint(); + } + if (opts.host == null) { + opts.host = "localhost"; + } + if (opts.port == null) { + opts.port = opts.secureEndpoint ? 443 : 80; + } + if (opts.protocol == null) { + opts.protocol = opts.secureEndpoint ? "https:" : "http:"; + } + if (opts.host && opts.path) { + delete opts.path; + } + delete opts.agent; + delete opts.hostname; + delete opts._defaultAgent; + delete opts.defaultPort; + delete opts.createConnection; + req._last = true; + req.shouldKeepAlive = false; + let timedOut = false; + let timeoutId = null; + const timeoutMs = opts.timeout || this.timeout; + const onerror = (err) => { + if (req._hadError) + return; + req.emit("error", err); + req._hadError = true; + }; + const ontimeout = () => { + timeoutId = null; + timedOut = true; + const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`); + err.code = "ETIMEOUT"; + onerror(err); + }; + const callbackError = (err) => { + if (timedOut) + return; + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + onerror(err); + }; + const onsocket = (socket) => { + if (timedOut) + return; + if (timeoutId != null) { + clearTimeout(timeoutId); + timeoutId = null; + } + if (isAgent(socket)) { + debug2("Callback returned another Agent instance %o", socket.constructor.name); + socket.addRequest(req, opts); + return; + } + if (socket) { + socket.once("free", () => { + this.freeSocket(socket, opts); + }); + req.onSocket(socket); + return; + } + const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``); + onerror(err); + }; + if (typeof this.callback !== "function") { + onerror(new Error("`callback` is not defined")); + return; + } + if (!this.promisifiedCallback) { + if (this.callback.length >= 3) { + debug2("Converting legacy callback function to promise"); + this.promisifiedCallback = promisify_1.default(this.callback); + } else { + this.promisifiedCallback = this.callback; + } + } + if (typeof timeoutMs === "number" && timeoutMs > 0) { + timeoutId = setTimeout(ontimeout, timeoutMs); + } + if ("port" in opts && typeof opts.port !== "number") { + opts.port = Number(opts.port); + } + try { + debug2("Resolving socket for %o request: %o", opts.protocol, `${req.method} ${req.path}`); + Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError); + } catch (err) { + Promise.reject(err).catch(callbackError); + } + } + freeSocket(socket, opts) { + debug2("Freeing socket %o %o", socket.constructor.name, opts); + socket.destroy(); + } + destroy() { + debug2("Destroying agent %o", this.constructor.name); + } + } + createAgent2.Agent = Agent; + createAgent2.prototype = createAgent2.Agent.prototype; + })(createAgent || (createAgent = {})); + src = createAgent; + return src; +} +var parseProxyResponse = {}; +var hasRequiredParseProxyResponse; +function requireParseProxyResponse() { + if (hasRequiredParseProxyResponse) return parseProxyResponse; + hasRequiredParseProxyResponse = 1; + var __importDefault = parseProxyResponse && parseProxyResponse.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(parseProxyResponse, "__esModule", { value: true }); + const debug_1 = __importDefault(requireBrowser$f()); + const debug2 = debug_1.default("https-proxy-agent:parse-proxy-response"); + function parseProxyResponse$1(socket) { + return new Promise((resolve, reject) => { + let buffersLength = 0; + const buffers = []; + function read2() { + const b = socket.read(); + if (b) + ondata(b); + else + socket.once("readable", read2); + } + function cleanup() { + socket.removeListener("end", onend); + socket.removeListener("error", onerror); + socket.removeListener("close", onclose); + socket.removeListener("readable", read2); + } + function onclose(err) { + debug2("onclose had error %o", err); + } + function onend() { + debug2("onend"); + } + function onerror(err) { + cleanup(); + debug2("onerror %o", err); + reject(err); + } + function ondata(b) { + buffers.push(b); + buffersLength += b.length; + const buffered = Buffer.concat(buffers, buffersLength); + const endOfHeaders = buffered.indexOf("\r\n\r\n"); + if (endOfHeaders === -1) { + debug2("have not received end of HTTP headers yet..."); + read2(); + return; + } + const firstLine = buffered.toString("ascii", 0, buffered.indexOf("\r\n")); + const statusCode = +firstLine.split(" ")[1]; + debug2("got proxy server response: %o", firstLine); + resolve({ + statusCode, + buffered + }); + } + socket.on("error", onerror); + socket.on("close", onclose); + socket.on("end", onend); + read2(); + }); + } + parseProxyResponse.default = parseProxyResponse$1; + return parseProxyResponse; +} +var hasRequiredAgent$1; +function requireAgent$1() { + if (hasRequiredAgent$1) return agent$1; + hasRequiredAgent$1 = 1; + var __awaiter = agent$1 && agent$1.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __importDefault = agent$1 && agent$1.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(agent$1, "__esModule", { value: true }); + const net_1 = __importDefault(require$$1$2); + const tls_1 = __importDefault(require$$1$1); + const url_1 = __importDefault(require$$1$5); + const assert_1 = __importDefault(requireAssert()); + const debug_1 = __importDefault(requireBrowser$f()); + const agent_base_1 = requireSrc(); + const parse_proxy_response_1 = __importDefault(requireParseProxyResponse()); + const debug2 = debug_1.default("https-proxy-agent:agent"); + class HttpsProxyAgent2 extends agent_base_1.Agent { + constructor(_opts) { + let opts; + if (typeof _opts === "string") { + opts = url_1.default.parse(_opts); + } else { + opts = _opts; + } + if (!opts) { + throw new Error("an HTTP(S) proxy server `host` and `port` must be specified!"); + } + debug2("creating new HttpsProxyAgent instance: %o", opts); + super(opts); + const proxy = Object.assign({}, opts); + this.secureProxy = opts.secureProxy || isHTTPS(proxy.protocol); + proxy.host = proxy.hostname || proxy.host; + if (typeof proxy.port === "string") { + proxy.port = parseInt(proxy.port, 10); + } + if (!proxy.port && proxy.host) { + proxy.port = this.secureProxy ? 443 : 80; + } + if (this.secureProxy && !("ALPNProtocols" in proxy)) { + proxy.ALPNProtocols = ["http 1.1"]; + } + if (proxy.host && proxy.path) { + delete proxy.path; + delete proxy.pathname; + } + this.proxy = proxy; + } + /** + * Called when the node-core HTTP client library is creating a + * new HTTP request. + * + * @api protected + */ + callback(req, opts) { + return __awaiter(this, void 0, void 0, function* () { + const { proxy, secureProxy } = this; + let socket; + if (secureProxy) { + debug2("Creating `tls.Socket`: %o", proxy); + socket = tls_1.default.connect(proxy); + } else { + debug2("Creating `net.Socket`: %o", proxy); + socket = net_1.default.connect(proxy); + } + const headers = Object.assign({}, proxy.headers); + const hostname = `${opts.host}:${opts.port}`; + let payload = `CONNECT ${hostname} HTTP/1.1\r +`; + if (proxy.auth) { + headers["Proxy-Authorization"] = `Basic ${Buffer.from(proxy.auth).toString("base64")}`; + } + let { host, port, secureEndpoint } = opts; + if (!isDefaultPort(port, secureEndpoint)) { + host += `:${port}`; + } + headers.Host = host; + headers.Connection = "close"; + for (const name of Object.keys(headers)) { + payload += `${name}: ${headers[name]}\r +`; + } + const proxyResponsePromise = parse_proxy_response_1.default(socket); + socket.write(`${payload}\r +`); + const { statusCode, buffered } = yield proxyResponsePromise; + if (statusCode === 200) { + req.once("socket", resume); + if (opts.secureEndpoint) { + debug2("Upgrading socket connection to TLS"); + const servername = opts.servername || opts.host; + return tls_1.default.connect(Object.assign(Object.assign({}, omit(opts, "host", "hostname", "path", "port")), { + socket, + servername + })); + } + return socket; + } + socket.destroy(); + const fakeSocket = new net_1.default.Socket({ writable: false }); + fakeSocket.readable = true; + req.once("socket", (s) => { + debug2("replaying proxy buffer for failed request"); + assert_1.default(s.listenerCount("data") > 0); + s.push(buffered); + s.push(null); + }); + return fakeSocket; + }); + } + } + agent$1.default = HttpsProxyAgent2; + function resume(socket) { + socket.resume(); + } + function isDefaultPort(port, secure) { + return Boolean(!secure && port === 80 || secure && port === 443); + } + function isHTTPS(protocol) { + return typeof protocol === "string" ? /^https:?$/i.test(protocol) : false; + } + function omit(obj, ...keys) { + const ret = {}; + let key2; + for (key2 in obj) { + if (!keys.includes(key2)) { + ret[key2] = obj[key2]; + } + } + return ret; + } + return agent$1; +} +var dist$1; +var hasRequiredDist$1; +function requireDist$1() { + if (hasRequiredDist$1) return dist$1; + hasRequiredDist$1 = 1; + var __importDefault = dist$1 && dist$1.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + const agent_1 = __importDefault(requireAgent$1()); + function createHttpsProxyAgent(opts) { + return new agent_1.default(opts); + } + (function(createHttpsProxyAgent2) { + createHttpsProxyAgent2.HttpsProxyAgent = agent_1.default; + createHttpsProxyAgent2.prototype = agent_1.default.prototype; + })(createHttpsProxyAgent || (createHttpsProxyAgent = {})); + dist$1 = createHttpsProxyAgent; + return dist$1; +} +var distExports$1 = requireDist$1(); +var encoder = { exports: {} }; +var hasRequiredEncoder; +function requireEncoder() { + if (hasRequiredEncoder) return encoder.exports; + hasRequiredEncoder = 1; + (function(module) { + function JPEGEncoder(quality) { + var ffloor = Math.floor; + var YTable = new Array(64); + var UVTable = new Array(64); + var fdtbl_Y = new Array(64); + var fdtbl_UV = new Array(64); + var YDC_HT; + var UVDC_HT; + var YAC_HT; + var UVAC_HT; + var bitcode = new Array(65535); + var category = new Array(65535); + var outputfDCTQuant = new Array(64); + var DU = new Array(64); + var byteout = []; + var bytenew = 0; + var bytepos = 7; + var YDU = new Array(64); + var UDU = new Array(64); + var VDU = new Array(64); + var clt = new Array(256); + var RGB_YUV_TABLE = new Array(2048); + var currentQuality; + var ZigZag = [ + 0, + 1, + 5, + 6, + 14, + 15, + 27, + 28, + 2, + 4, + 7, + 13, + 16, + 26, + 29, + 42, + 3, + 8, + 12, + 17, + 25, + 30, + 41, + 43, + 9, + 11, + 18, + 24, + 31, + 40, + 44, + 53, + 10, + 19, + 23, + 32, + 39, + 45, + 52, + 54, + 20, + 22, + 33, + 38, + 46, + 51, + 55, + 60, + 21, + 34, + 37, + 47, + 50, + 56, + 59, + 61, + 35, + 36, + 48, + 49, + 57, + 58, + 62, + 63 + ]; + var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]; + var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125]; + var std_ac_luminance_values = [ + 1, + 2, + 3, + 0, + 4, + 17, + 5, + 18, + 33, + 49, + 65, + 6, + 19, + 81, + 97, + 7, + 34, + 113, + 20, + 50, + 129, + 145, + 161, + 8, + 35, + 66, + 177, + 193, + 21, + 82, + 209, + 240, + 36, + 51, + 98, + 114, + 130, + 9, + 10, + 22, + 23, + 24, + 25, + 26, + 37, + 38, + 39, + 40, + 41, + 42, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]; + var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; + var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119]; + var std_ac_chrominance_values = [ + 0, + 1, + 2, + 3, + 17, + 4, + 5, + 33, + 49, + 6, + 18, + 65, + 81, + 7, + 97, + 113, + 19, + 34, + 50, + 129, + 8, + 20, + 66, + 145, + 161, + 177, + 193, + 9, + 35, + 51, + 82, + 240, + 21, + 98, + 114, + 209, + 10, + 22, + 36, + 52, + 225, + 37, + 241, + 23, + 24, + 25, + 26, + 38, + 39, + 40, + 41, + 42, + 53, + 54, + 55, + 56, + 57, + 58, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250 + ]; + function initQuantTables(sf) { + var YQT = [ + 16, + 11, + 10, + 16, + 24, + 40, + 51, + 61, + 12, + 12, + 14, + 19, + 26, + 58, + 60, + 55, + 14, + 13, + 16, + 24, + 40, + 57, + 69, + 56, + 14, + 17, + 22, + 29, + 51, + 87, + 80, + 62, + 18, + 22, + 37, + 56, + 68, + 109, + 103, + 77, + 24, + 35, + 55, + 64, + 81, + 104, + 113, + 92, + 49, + 64, + 78, + 87, + 103, + 121, + 120, + 101, + 72, + 92, + 95, + 98, + 112, + 100, + 103, + 99 + ]; + for (var i = 0; i < 64; i++) { + var t = ffloor((YQT[i] * sf + 50) / 100); + if (t < 1) { + t = 1; + } else if (t > 255) { + t = 255; + } + YTable[ZigZag[i]] = t; + } + var UVQT = [ + 17, + 18, + 24, + 47, + 99, + 99, + 99, + 99, + 18, + 21, + 26, + 66, + 99, + 99, + 99, + 99, + 24, + 26, + 56, + 99, + 99, + 99, + 99, + 99, + 47, + 66, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99 + ]; + for (var j = 0; j < 64; j++) { + var u = ffloor((UVQT[j] * sf + 50) / 100); + if (u < 1) { + u = 1; + } else if (u > 255) { + u = 255; + } + UVTable[ZigZag[j]] = u; + } + var aasf = [ + 1, + 1.387039845, + 1.306562965, + 1.175875602, + 1, + 0.785694958, + 0.5411961, + 0.275899379 + ]; + var k = 0; + for (var row = 0; row < 8; row++) { + for (var col = 0; col < 8; col++) { + fdtbl_Y[k] = 1 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + fdtbl_UV[k] = 1 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8); + k++; + } + } + } + function computeHuffmanTbl(nrcodes, std_table) { + var codevalue = 0; + var pos_in_table = 0; + var HT = new Array(); + for (var k = 1; k <= 16; k++) { + for (var j = 1; j <= nrcodes[k]; j++) { + HT[std_table[pos_in_table]] = []; + HT[std_table[pos_in_table]][0] = codevalue; + HT[std_table[pos_in_table]][1] = k; + pos_in_table++; + codevalue++; + } + codevalue *= 2; + } + return HT; + } + function initHuffmanTbl() { + YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values); + UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values); + YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values); + UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values); + } + function initCategoryNumber() { + var nrlower = 1; + var nrupper = 2; + for (var cat = 1; cat <= 15; cat++) { + for (var nr = nrlower; nr < nrupper; nr++) { + category[32767 + nr] = cat; + bitcode[32767 + nr] = []; + bitcode[32767 + nr][1] = cat; + bitcode[32767 + nr][0] = nr; + } + for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) { + category[32767 + nrneg] = cat; + bitcode[32767 + nrneg] = []; + bitcode[32767 + nrneg][1] = cat; + bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg; + } + nrlower <<= 1; + nrupper <<= 1; + } + } + function initRGBYUVTable() { + for (var i = 0; i < 256; i++) { + RGB_YUV_TABLE[i] = 19595 * i; + RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i; + RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 32768; + RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i; + RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i; + RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 8421375; + RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i; + RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i; + } + } + function writeBits(bs) { + var value = bs[0]; + var posval = bs[1] - 1; + while (posval >= 0) { + if (value & 1 << posval) { + bytenew |= 1 << bytepos; + } + posval--; + bytepos--; + if (bytepos < 0) { + if (bytenew == 255) { + writeByte(255); + writeByte(0); + } else { + writeByte(bytenew); + } + bytepos = 7; + bytenew = 0; + } + } + } + function writeByte(value) { + byteout.push(value); + } + function writeWord(value) { + writeByte(value >> 8 & 255); + writeByte(value & 255); + } + function fDCTQuant(data2, fdtbl) { + var d0, d1, d2, d3, d4, d5, d6, d7; + var dataOff = 0; + var i; + var I8 = 8; + var I64 = 64; + for (i = 0; i < I8; ++i) { + d0 = data2[dataOff]; + d1 = data2[dataOff + 1]; + d2 = data2[dataOff + 2]; + d3 = data2[dataOff + 3]; + d4 = data2[dataOff + 4]; + d5 = data2[dataOff + 5]; + d6 = data2[dataOff + 6]; + d7 = data2[dataOff + 7]; + var tmp0 = d0 + d7; + var tmp7 = d0 - d7; + var tmp1 = d1 + d6; + var tmp6 = d1 - d6; + var tmp2 = d2 + d5; + var tmp5 = d2 - d5; + var tmp3 = d3 + d4; + var tmp4 = d3 - d4; + var tmp10 = tmp0 + tmp3; + var tmp13 = tmp0 - tmp3; + var tmp11 = tmp1 + tmp2; + var tmp12 = tmp1 - tmp2; + data2[dataOff] = tmp10 + tmp11; + data2[dataOff + 4] = tmp10 - tmp11; + var z1 = (tmp12 + tmp13) * 0.707106781; + data2[dataOff + 2] = tmp13 + z1; + data2[dataOff + 6] = tmp13 - z1; + tmp10 = tmp4 + tmp5; + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + var z5 = (tmp10 - tmp12) * 0.382683433; + var z2 = 0.5411961 * tmp10 + z5; + var z4 = 1.306562965 * tmp12 + z5; + var z3 = tmp11 * 0.707106781; + var z11 = tmp7 + z3; + var z13 = tmp7 - z3; + data2[dataOff + 5] = z13 + z2; + data2[dataOff + 3] = z13 - z2; + data2[dataOff + 1] = z11 + z4; + data2[dataOff + 7] = z11 - z4; + dataOff += 8; + } + dataOff = 0; + for (i = 0; i < I8; ++i) { + d0 = data2[dataOff]; + d1 = data2[dataOff + 8]; + d2 = data2[dataOff + 16]; + d3 = data2[dataOff + 24]; + d4 = data2[dataOff + 32]; + d5 = data2[dataOff + 40]; + d6 = data2[dataOff + 48]; + d7 = data2[dataOff + 56]; + var tmp0p2 = d0 + d7; + var tmp7p2 = d0 - d7; + var tmp1p2 = d1 + d6; + var tmp6p2 = d1 - d6; + var tmp2p2 = d2 + d5; + var tmp5p2 = d2 - d5; + var tmp3p2 = d3 + d4; + var tmp4p2 = d3 - d4; + var tmp10p2 = tmp0p2 + tmp3p2; + var tmp13p2 = tmp0p2 - tmp3p2; + var tmp11p2 = tmp1p2 + tmp2p2; + var tmp12p2 = tmp1p2 - tmp2p2; + data2[dataOff] = tmp10p2 + tmp11p2; + data2[dataOff + 32] = tmp10p2 - tmp11p2; + var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; + data2[dataOff + 16] = tmp13p2 + z1p2; + data2[dataOff + 48] = tmp13p2 - z1p2; + tmp10p2 = tmp4p2 + tmp5p2; + tmp11p2 = tmp5p2 + tmp6p2; + tmp12p2 = tmp6p2 + tmp7p2; + var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; + var z2p2 = 0.5411961 * tmp10p2 + z5p2; + var z4p2 = 1.306562965 * tmp12p2 + z5p2; + var z3p2 = tmp11p2 * 0.707106781; + var z11p2 = tmp7p2 + z3p2; + var z13p2 = tmp7p2 - z3p2; + data2[dataOff + 40] = z13p2 + z2p2; + data2[dataOff + 24] = z13p2 - z2p2; + data2[dataOff + 8] = z11p2 + z4p2; + data2[dataOff + 56] = z11p2 - z4p2; + dataOff++; + } + var fDCTQuant2; + for (i = 0; i < I64; ++i) { + fDCTQuant2 = data2[i] * fdtbl[i]; + outputfDCTQuant[i] = fDCTQuant2 > 0 ? fDCTQuant2 + 0.5 | 0 : fDCTQuant2 - 0.5 | 0; + } + return outputfDCTQuant; + } + function writeAPP0() { + writeWord(65504); + writeWord(16); + writeByte(74); + writeByte(70); + writeByte(73); + writeByte(70); + writeByte(0); + writeByte(1); + writeByte(1); + writeByte(0); + writeWord(1); + writeWord(1); + writeByte(0); + writeByte(0); + } + function writeAPP1(exifBuffer) { + if (!exifBuffer) return; + writeWord(65505); + if (exifBuffer[0] === 69 && exifBuffer[1] === 120 && exifBuffer[2] === 105 && exifBuffer[3] === 102) { + writeWord(exifBuffer.length + 2); + } else { + writeWord(exifBuffer.length + 5 + 2); + writeByte(69); + writeByte(120); + writeByte(105); + writeByte(102); + writeByte(0); + } + for (var i = 0; i < exifBuffer.length; i++) { + writeByte(exifBuffer[i]); + } + } + function writeSOF0(width, height) { + writeWord(65472); + writeWord(17); + writeByte(8); + writeWord(height); + writeWord(width); + writeByte(3); + writeByte(1); + writeByte(17); + writeByte(0); + writeByte(2); + writeByte(17); + writeByte(1); + writeByte(3); + writeByte(17); + writeByte(1); + } + function writeDQT() { + writeWord(65499); + writeWord(132); + writeByte(0); + for (var i = 0; i < 64; i++) { + writeByte(YTable[i]); + } + writeByte(1); + for (var j = 0; j < 64; j++) { + writeByte(UVTable[j]); + } + } + function writeDHT() { + writeWord(65476); + writeWord(418); + writeByte(0); + for (var i = 0; i < 16; i++) { + writeByte(std_dc_luminance_nrcodes[i + 1]); + } + for (var j = 0; j <= 11; j++) { + writeByte(std_dc_luminance_values[j]); + } + writeByte(16); + for (var k = 0; k < 16; k++) { + writeByte(std_ac_luminance_nrcodes[k + 1]); + } + for (var l = 0; l <= 161; l++) { + writeByte(std_ac_luminance_values[l]); + } + writeByte(1); + for (var m = 0; m < 16; m++) { + writeByte(std_dc_chrominance_nrcodes[m + 1]); + } + for (var n = 0; n <= 11; n++) { + writeByte(std_dc_chrominance_values[n]); + } + writeByte(17); + for (var o = 0; o < 16; o++) { + writeByte(std_ac_chrominance_nrcodes[o + 1]); + } + for (var p = 0; p <= 161; p++) { + writeByte(std_ac_chrominance_values[p]); + } + } + function writeCOM(comments) { + if (typeof comments === "undefined" || comments.constructor !== Array) return; + comments.forEach((e) => { + if (typeof e !== "string") return; + writeWord(65534); + var l = e.length; + writeWord(l + 2); + var i; + for (i = 0; i < l; i++) + writeByte(e.charCodeAt(i)); + }); + } + function writeSOS() { + writeWord(65498); + writeWord(12); + writeByte(3); + writeByte(1); + writeByte(0); + writeByte(2); + writeByte(17); + writeByte(3); + writeByte(17); + writeByte(0); + writeByte(63); + writeByte(0); + } + function processDU(CDU, fdtbl, DC, HTDC, HTAC) { + var EOB = HTAC[0]; + var M16zeroes = HTAC[240]; + var pos; + var I16 = 16; + var I63 = 63; + var I64 = 64; + var DU_DCT = fDCTQuant(CDU, fdtbl); + for (var j = 0; j < I64; ++j) { + DU[ZigZag[j]] = DU_DCT[j]; + } + var Diff2 = DU[0] - DC; + DC = DU[0]; + if (Diff2 == 0) { + writeBits(HTDC[0]); + } else { + pos = 32767 + Diff2; + writeBits(HTDC[category[pos]]); + writeBits(bitcode[pos]); + } + var end0pos = 63; + for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) { + } + if (end0pos == 0) { + writeBits(EOB); + return DC; + } + var i = 1; + var lng; + while (i <= end0pos) { + var startpos = i; + for (; DU[i] == 0 && i <= end0pos; ++i) { + } + var nrzeroes = i - startpos; + if (nrzeroes >= I16) { + lng = nrzeroes >> 4; + for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) + writeBits(M16zeroes); + nrzeroes = nrzeroes & 15; + } + pos = 32767 + DU[i]; + writeBits(HTAC[(nrzeroes << 4) + category[pos]]); + writeBits(bitcode[pos]); + i++; + } + if (end0pos != I63) { + writeBits(EOB); + } + return DC; + } + function initCharLookupTable() { + var sfcc = String.fromCharCode; + for (var i = 0; i < 256; i++) { + clt[i] = sfcc(i); + } + } + this.encode = function(image, quality2) { + (/* @__PURE__ */ new Date()).getTime(); + if (quality2) setQuality(quality2); + byteout = new Array(); + bytenew = 0; + bytepos = 7; + writeWord(65496); + writeAPP0(); + writeCOM(image.comments); + writeAPP1(image.exifBuffer); + writeDQT(); + writeSOF0(image.width, image.height); + writeDHT(); + writeSOS(); + var DCY = 0; + var DCU = 0; + var DCV = 0; + bytenew = 0; + bytepos = 7; + this.encode.displayName = "_encode_"; + var imageData = image.data; + var width = image.width; + var height = image.height; + var quadWidth = width * 4; + var x, y = 0; + var r, g, b; + var start, p, col, row, pos; + while (y < height) { + x = 0; + while (x < quadWidth) { + start = quadWidth * y + x; + p = start; + col = -1; + row = 0; + for (pos = 0; pos < 64; pos++) { + row = pos >> 3; + col = (pos & 7) * 4; + p = start + row * quadWidth + col; + if (y + row >= height) { + p -= quadWidth * (y + 1 + row - height); + } + if (x + col >= quadWidth) { + p -= x + col - quadWidth + 4; + } + r = imageData[p++]; + g = imageData[p++]; + b = imageData[p++]; + YDU[pos] = (RGB_YUV_TABLE[r] + RGB_YUV_TABLE[g + 256 >> 0] + RGB_YUV_TABLE[b + 512 >> 0] >> 16) - 128; + UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128; + VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128; + } + DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + x += 32; + } + y += 8; + } + if (bytepos >= 0) { + var fillbits = []; + fillbits[1] = bytepos + 1; + fillbits[0] = (1 << bytepos + 1) - 1; + writeBits(fillbits); + } + writeWord(65497); + return Buffer.from(byteout); + }; + function setQuality(quality2) { + if (quality2 <= 0) { + quality2 = 1; + } + if (quality2 > 100) { + quality2 = 100; + } + if (currentQuality == quality2) return; + var sf = 0; + if (quality2 < 50) { + sf = Math.floor(5e3 / quality2); + } else { + sf = Math.floor(200 - quality2 * 2); + } + initQuantTables(sf); + currentQuality = quality2; + } + function init() { + var time_start = (/* @__PURE__ */ new Date()).getTime(); + if (!quality) quality = 50; + initCharLookupTable(); + initHuffmanTbl(); + initCategoryNumber(); + initRGBYUVTable(); + setQuality(quality); + (/* @__PURE__ */ new Date()).getTime() - time_start; + } + init(); + } + { + module.exports = encode; + } + function encode(imgData, qu) { + if (typeof qu === "undefined") qu = 50; + var encoder2 = new JPEGEncoder(qu); + var data2 = encoder2.encode(imgData, qu); + return { + data: data2, + width: imgData.width, + height: imgData.height + }; + } + })(encoder); + return encoder.exports; +} +var decoder = { exports: {} }; +var hasRequiredDecoder; +function requireDecoder() { + if (hasRequiredDecoder) return decoder.exports; + hasRequiredDecoder = 1; + (function(module) { + var JpegImage = function jpegImage() { + var dctZigZag = new Int32Array([ + 0, + 1, + 8, + 16, + 9, + 2, + 3, + 10, + 17, + 24, + 32, + 25, + 18, + 11, + 4, + 5, + 12, + 19, + 26, + 33, + 40, + 48, + 41, + 34, + 27, + 20, + 13, + 6, + 7, + 14, + 21, + 28, + 35, + 42, + 49, + 56, + 57, + 50, + 43, + 36, + 29, + 22, + 15, + 23, + 30, + 37, + 44, + 51, + 58, + 59, + 52, + 45, + 38, + 31, + 39, + 46, + 53, + 60, + 61, + 54, + 47, + 55, + 62, + 63 + ]); + var dctCos1 = 4017; + var dctSin1 = 799; + var dctCos3 = 3406; + var dctSin3 = 2276; + var dctCos6 = 1567; + var dctSin6 = 3784; + var dctSqrt2 = 5793; + var dctSqrt1d2 = 2896; + function constructor() { + } + function buildHuffmanTable(codeLengths, values) { + var k = 0, code = [], i, j, length = 16; + while (length > 0 && !codeLengths[length - 1]) + length--; + code.push({ children: [], index: 0 }); + var p = code[0], q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + if (code.length === 0) + throw new Error("Could not recreate Huffman Table"); + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push(q = { children: [], index: 0 }); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + code.push(q = { children: [], index: 0 }); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; + } + function decodeScan(data2, offset2, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, opts) { + frame.precision; + frame.samplesPerLine; + frame.scanLines; + var mcusPerLine = frame.mcusPerLine; + var progressive = frame.progressive; + frame.maxH; + frame.maxV; + var startOffset = offset2, bitsData = 0, bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return bitsData >> bitsCount & 1; + } + bitsData = data2[offset2++]; + if (bitsData == 255) { + var nextByte = data2[offset2++]; + if (nextByte) { + throw new Error("unexpected marker: " + (bitsData << 8 | nextByte).toString(16)); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + var node2 = tree, bit; + while ((bit = readBit()) !== null) { + node2 = node2[bit]; + if (typeof node2 === "number") + return node2; + if (typeof node2 !== "object") + throw new Error("invalid huffman sequence"); + } + return null; + } + function receive(length) { + var n2 = 0; + while (length > 0) { + var bit = readBit(); + if (bit === null) return; + n2 = n2 << 1 | bit; + length--; + } + return n2; + } + function receiveAndExtend(length) { + var n2 = receive(length); + if (n2 >= 1 << length - 1) + return n2; + return n2 + (-1 << length) + 1; + } + function decodeBaseline(component2, zz) { + var t = decodeHuffman(component2.huffmanTableDC); + var diff3 = t === 0 ? 0 : receiveAndExtend(t); + zz[0] = component2.pred += diff3; + var k2 = 1; + while (k2 < 64) { + var rs = decodeHuffman(component2.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) + break; + k2 += 16; + continue; + } + k2 += r; + var z = dctZigZag[k2]; + zz[z] = receiveAndExtend(s); + k2++; + } + } + function decodeDCFirst(component2, zz) { + var t = decodeHuffman(component2.huffmanTableDC); + var diff3 = t === 0 ? 0 : receiveAndExtend(t) << successive; + zz[0] = component2.pred += diff3; + } + function decodeDCSuccessive(component2, zz) { + zz[0] |= readBit() << successive; + } + var eobrun = 0; + function decodeACFirst(component2, zz) { + if (eobrun > 0) { + eobrun--; + return; + } + var k2 = spectralStart, e = spectralEnd; + while (k2 <= e) { + var rs = decodeHuffman(component2.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k2 += 16; + continue; + } + k2 += r; + var z = dctZigZag[k2]; + zz[z] = receiveAndExtend(s) * (1 << successive); + k2++; + } + } + var successiveACState = 0, successiveACNextValue; + function decodeACSuccessive(component2, zz) { + var k2 = spectralStart, e = spectralEnd, r = 0; + while (k2 <= e) { + var z = dctZigZag[k2]; + var direction = zz[z] < 0 ? -1 : 1; + switch (successiveACState) { + case 0: + var rs = decodeHuffman(component2.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) + throw new Error("invalid ACn encoding"); + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: + // skipping r zero items + case 2: + if (zz[z]) + zz[z] += (readBit() << successive) * direction; + else { + r--; + if (r === 0) + successiveACState = successiveACState == 2 ? 3 : 0; + } + break; + case 3: + if (zz[z]) + zz[z] += (readBit() << successive) * direction; + else { + zz[z] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: + if (zz[z]) + zz[z] += (readBit() << successive) * direction; + break; + } + k2++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) + successiveACState = 0; + } + } + function decodeMcu(component2, decode2, mcu2, row, col) { + var mcuRow = mcu2 / mcusPerLine | 0; + var mcuCol = mcu2 % mcusPerLine; + var blockRow = mcuRow * component2.v + row; + var blockCol = mcuCol * component2.h + col; + if (component2.blocks[blockRow] === void 0 && opts.tolerantDecoding) + return; + decode2(component2, component2.blocks[blockRow][blockCol]); + } + function decodeBlock(component2, decode2, mcu2) { + var blockRow = mcu2 / component2.blocksPerLine | 0; + var blockCol = mcu2 % component2.blocksPerLine; + if (component2.blocks[blockRow] === void 0 && opts.tolerantDecoding) + return; + decode2(component2, component2.blocks[blockRow][blockCol]); + } + var componentsLength = components.length; + var component, i, j, k, n; + var decodeFn; + if (progressive) { + if (spectralStart === 0) + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + else + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } else { + decodeFn = decodeBaseline; + } + var mcu = 0, marker; + var mcuExpected; + if (componentsLength == 1) { + mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; + } else { + mcuExpected = mcusPerLine * frame.mcusPerColumn; + } + if (!resetInterval) resetInterval = mcuExpected; + var h, v; + while (mcu < mcuExpected) { + for (i = 0; i < componentsLength; i++) + components[i].pred = 0; + eobrun = 0; + if (componentsLength == 1) { + component = components[0]; + for (n = 0; n < resetInterval; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < resetInterval; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + if (mcu === mcuExpected) break; + } + } + if (mcu === mcuExpected) { + do { + if (data2[offset2] === 255) { + if (data2[offset2 + 1] !== 0) { + break; + } + } + offset2 += 1; + } while (offset2 < data2.length - 2); + } + bitsCount = 0; + marker = data2[offset2] << 8 | data2[offset2 + 1]; + if (marker < 65280) { + throw new Error("marker was not found"); + } + if (marker >= 65488 && marker <= 65495) { + offset2 += 2; + } else + break; + } + return offset2 - startOffset; + } + function buildComponentData(frame, component) { + var lines = []; + var blocksPerLine = component.blocksPerLine; + var blocksPerColumn = component.blocksPerColumn; + var samplesPerLine = blocksPerLine << 3; + var R = new Int32Array(64), r = new Uint8Array(64); + function quantizeAndInverse(zz, dataOut, dataIn) { + var qt = component.quantizationTable; + var v0, v1, v2, v3, v4, v5, v6, v7, t; + var p = dataIn; + var i2; + for (i2 = 0; i2 < 64; i2++) + p[i2] = zz[i2] * qt[i2]; + for (i2 = 0; i2 < 8; ++i2) { + var row = 8 * i2; + if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 && p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 && p[7 + row] == 0) { + t = dctSqrt2 * p[0 + row] + 512 >> 10; + p[0 + row] = t; + p[1 + row] = t; + p[2 + row] = t; + p[3 + row] = t; + p[4 + row] = t; + p[5 + row] = t; + p[6 + row] = t; + p[7 + row] = t; + continue; + } + v0 = dctSqrt2 * p[0 + row] + 128 >> 8; + v1 = dctSqrt2 * p[4 + row] + 128 >> 8; + v2 = p[2 + row]; + v3 = p[6 + row]; + v4 = dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128 >> 8; + v7 = dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128 >> 8; + v5 = p[3 + row] << 4; + v6 = p[5 + row] << 4; + t = v0 - v1 + 1 >> 1; + v0 = v0 + v1 + 1 >> 1; + v1 = t; + t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; + v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; + v3 = t; + t = v4 - v6 + 1 >> 1; + v4 = v4 + v6 + 1 >> 1; + v6 = t; + t = v7 + v5 + 1 >> 1; + v5 = v7 - v5 + 1 >> 1; + v7 = t; + t = v0 - v3 + 1 >> 1; + v0 = v0 + v3 + 1 >> 1; + v3 = t; + t = v1 - v2 + 1 >> 1; + v1 = v1 + v2 + 1 >> 1; + v2 = t; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p[0 + row] = v0 + v7; + p[7 + row] = v0 - v7; + p[1 + row] = v1 + v6; + p[6 + row] = v1 - v6; + p[2 + row] = v2 + v5; + p[5 + row] = v2 - v5; + p[3 + row] = v3 + v4; + p[4 + row] = v3 - v4; + } + for (i2 = 0; i2 < 8; ++i2) { + var col = i2; + if (p[1 * 8 + col] == 0 && p[2 * 8 + col] == 0 && p[3 * 8 + col] == 0 && p[4 * 8 + col] == 0 && p[5 * 8 + col] == 0 && p[6 * 8 + col] == 0 && p[7 * 8 + col] == 0) { + t = dctSqrt2 * dataIn[i2 + 0] + 8192 >> 14; + p[0 * 8 + col] = t; + p[1 * 8 + col] = t; + p[2 * 8 + col] = t; + p[3 * 8 + col] = t; + p[4 * 8 + col] = t; + p[5 * 8 + col] = t; + p[6 * 8 + col] = t; + p[7 * 8 + col] = t; + continue; + } + v0 = dctSqrt2 * p[0 * 8 + col] + 2048 >> 12; + v1 = dctSqrt2 * p[4 * 8 + col] + 2048 >> 12; + v2 = p[2 * 8 + col]; + v3 = p[6 * 8 + col]; + v4 = dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048 >> 12; + v7 = dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048 >> 12; + v5 = p[3 * 8 + col]; + v6 = p[5 * 8 + col]; + t = v0 - v1 + 1 >> 1; + v0 = v0 + v1 + 1 >> 1; + v1 = t; + t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; + v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; + v3 = t; + t = v4 - v6 + 1 >> 1; + v4 = v4 + v6 + 1 >> 1; + v6 = t; + t = v7 + v5 + 1 >> 1; + v5 = v7 - v5 + 1 >> 1; + v7 = t; + t = v0 - v3 + 1 >> 1; + v0 = v0 + v3 + 1 >> 1; + v3 = t; + t = v1 - v2 + 1 >> 1; + v1 = v1 + v2 + 1 >> 1; + v2 = t; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p[0 * 8 + col] = v0 + v7; + p[7 * 8 + col] = v0 - v7; + p[1 * 8 + col] = v1 + v6; + p[6 * 8 + col] = v1 - v6; + p[2 * 8 + col] = v2 + v5; + p[5 * 8 + col] = v2 - v5; + p[3 * 8 + col] = v3 + v4; + p[4 * 8 + col] = v3 - v4; + } + for (i2 = 0; i2 < 64; ++i2) { + var sample2 = 128 + (p[i2] + 8 >> 4); + dataOut[i2] = sample2 < 0 ? 0 : sample2 > 255 ? 255 : sample2; + } + } + requestMemoryAllocation(samplesPerLine * blocksPerColumn * 8); + var i, j; + for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + var scanLine = blockRow << 3; + for (i = 0; i < 8; i++) + lines.push(new Uint8Array(samplesPerLine)); + for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { + quantizeAndInverse(component.blocks[blockRow][blockCol], r, R); + var offset2 = 0, sample = blockCol << 3; + for (j = 0; j < 8; j++) { + var line = lines[scanLine + j]; + for (i = 0; i < 8; i++) + line[sample + i] = r[offset2++]; + } + } + } + return lines; + } + function clampTo8bit(a) { + return a < 0 ? 0 : a > 255 ? 255 : a; + } + constructor.prototype = { + load: function load(path2) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", path2, true); + xhr.responseType = "arraybuffer"; + xhr.onload = (function() { + var data2 = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer); + this.parse(data2); + if (this.onload) + this.onload(); + }).bind(this); + xhr.send(null); + }, + parse: function parse4(data2) { + var maxResolutionInPixels = this.opts.maxResolutionInMP * 1e3 * 1e3; + var offset2 = 0; + data2.length; + function readUint16() { + var value = data2[offset2] << 8 | data2[offset2 + 1]; + offset2 += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data2.subarray(offset2, offset2 + length - 2); + offset2 += array.length; + return array; + } + function prepareComponents(frame2) { + var maxH = 1, maxV = 1; + var component2, componentId2; + for (componentId2 in frame2.components) { + if (frame2.components.hasOwnProperty(componentId2)) { + component2 = frame2.components[componentId2]; + if (maxH < component2.h) maxH = component2.h; + if (maxV < component2.v) maxV = component2.v; + } + } + var mcusPerLine = Math.ceil(frame2.samplesPerLine / 8 / maxH); + var mcusPerColumn = Math.ceil(frame2.scanLines / 8 / maxV); + for (componentId2 in frame2.components) { + if (frame2.components.hasOwnProperty(componentId2)) { + component2 = frame2.components[componentId2]; + var blocksPerLine = Math.ceil(Math.ceil(frame2.samplesPerLine / 8) * component2.h / maxH); + var blocksPerColumn = Math.ceil(Math.ceil(frame2.scanLines / 8) * component2.v / maxV); + var blocksPerLineForMcu = mcusPerLine * component2.h; + var blocksPerColumnForMcu = mcusPerColumn * component2.v; + var blocksToAllocate = blocksPerColumnForMcu * blocksPerLineForMcu; + var blocks = []; + requestMemoryAllocation(blocksToAllocate * 256); + for (var i2 = 0; i2 < blocksPerColumnForMcu; i2++) { + var row = []; + for (var j2 = 0; j2 < blocksPerLineForMcu; j2++) + row.push(new Int32Array(64)); + blocks.push(row); + } + component2.blocksPerLine = blocksPerLine; + component2.blocksPerColumn = blocksPerColumn; + component2.blocks = blocks; + } + } + frame2.maxH = maxH; + frame2.maxV = maxV; + frame2.mcusPerLine = mcusPerLine; + frame2.mcusPerColumn = mcusPerColumn; + } + var jfif = null; + var adobe = null; + var frame, resetInterval; + var quantizationTables = [], frames = []; + var huffmanTablesAC = [], huffmanTablesDC = []; + var fileMarker = readUint16(); + var malformedDataOffset = -1; + this.comments = []; + if (fileMarker != 65496) { + throw new Error("SOI not found"); + } + fileMarker = readUint16(); + while (fileMarker != 65497) { + var i, j; + switch (fileMarker) { + case 65280: + break; + case 65504: + // APP0 (Application Specific) + case 65505: + // APP1 + case 65506: + // APP2 + case 65507: + // APP3 + case 65508: + // APP4 + case 65509: + // APP5 + case 65510: + // APP6 + case 65511: + // APP7 + case 65512: + // APP8 + case 65513: + // APP9 + case 65514: + // APP10 + case 65515: + // APP11 + case 65516: + // APP12 + case 65517: + // APP13 + case 65518: + // APP14 + case 65519: + // APP15 + case 65534: + var appData = readDataBlock(); + if (fileMarker === 65534) { + var comment2 = String.fromCharCode.apply(null, appData); + this.comments.push(comment2); + } + if (fileMarker === 65504) { + if (appData[0] === 74 && appData[1] === 70 && appData[2] === 73 && appData[3] === 70 && appData[4] === 0) { + jfif = { + version: { major: appData[5], minor: appData[6] }, + densityUnits: appData[7], + xDensity: appData[8] << 8 | appData[9], + yDensity: appData[10] << 8 | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) + }; + } + } + if (fileMarker === 65505) { + if (appData[0] === 69 && appData[1] === 120 && appData[2] === 105 && appData[3] === 102 && appData[4] === 0) { + this.exifBuffer = appData.subarray(5, appData.length); + } + } + if (fileMarker === 65518) { + if (appData[0] === 65 && appData[1] === 100 && appData[2] === 111 && appData[3] === 98 && appData[4] === 101 && appData[5] === 0) { + adobe = { + version: appData[6], + flags0: appData[7] << 8 | appData[8], + flags1: appData[9] << 8 | appData[10], + transformCode: appData[11] + }; + } + } + break; + case 65499: + var quantizationTablesLength = readUint16(); + var quantizationTablesEnd = quantizationTablesLength + offset2 - 2; + while (offset2 < quantizationTablesEnd) { + var quantizationTableSpec = data2[offset2++]; + requestMemoryAllocation(64 * 4); + var tableData = new Int32Array(64); + if (quantizationTableSpec >> 4 === 0) { + for (j = 0; j < 64; j++) { + var z = dctZigZag[j]; + tableData[z] = data2[offset2++]; + } + } else if (quantizationTableSpec >> 4 === 1) { + for (j = 0; j < 64; j++) { + var z = dctZigZag[j]; + tableData[z] = readUint16(); + } + } else + throw new Error("DQT: invalid table spec"); + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + case 65472: + // SOF0 (Start of Frame, Baseline DCT) + case 65473: + // SOF1 (Start of Frame, Extended DCT) + case 65474: + readUint16(); + frame = {}; + frame.extended = fileMarker === 65473; + frame.progressive = fileMarker === 65474; + frame.precision = data2[offset2++]; + frame.scanLines = readUint16(); + frame.samplesPerLine = readUint16(); + frame.components = {}; + frame.componentsOrder = []; + var pixelsInFrame = frame.scanLines * frame.samplesPerLine; + if (pixelsInFrame > maxResolutionInPixels) { + var exceededAmount = Math.ceil((pixelsInFrame - maxResolutionInPixels) / 1e6); + throw new Error(`maxResolutionInMP limit exceeded by ${exceededAmount}MP`); + } + var componentsCount = data2[offset2++], componentId; + for (i = 0; i < componentsCount; i++) { + componentId = data2[offset2]; + var h = data2[offset2 + 1] >> 4; + var v = data2[offset2 + 1] & 15; + var qId = data2[offset2 + 2]; + if (h <= 0 || v <= 0) { + throw new Error("Invalid sampling factor, expected values above 0"); + } + frame.componentsOrder.push(componentId); + frame.components[componentId] = { + h, + v, + quantizationIdx: qId + }; + offset2 += 3; + } + prepareComponents(frame); + frames.push(frame); + break; + case 65476: + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength; ) { + var huffmanTableSpec = data2[offset2++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset2++) { + codeLengthSum += codeLengths[j] = data2[offset2]; + } + requestMemoryAllocation(16 + codeLengthSum); + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset2++) + huffmanValues[j] = data2[offset2]; + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); + } + break; + case 65501: + readUint16(); + resetInterval = readUint16(); + break; + case 65500: + readUint16(); + readUint16(); + break; + case 65498: + readUint16(); + var selectorsCount = data2[offset2++]; + var components = [], component; + for (i = 0; i < selectorsCount; i++) { + component = frame.components[data2[offset2++]]; + var tableSpec = data2[offset2++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data2[offset2++]; + var spectralEnd = data2[offset2++]; + var successiveApproximation = data2[offset2++]; + var processed = decodeScan( + data2, + offset2, + frame, + components, + resetInterval, + spectralStart, + spectralEnd, + successiveApproximation >> 4, + successiveApproximation & 15, + this.opts + ); + offset2 += processed; + break; + case 65535: + if (data2[offset2] !== 255) { + offset2--; + } + break; + default: + if (data2[offset2 - 3] == 255 && data2[offset2 - 2] >= 192 && data2[offset2 - 2] <= 254) { + offset2 -= 3; + break; + } else if (fileMarker === 224 || fileMarker == 225) { + if (malformedDataOffset !== -1) { + throw new Error(`first unknown JPEG marker at offset ${malformedDataOffset.toString(16)}, second unknown JPEG marker ${fileMarker.toString(16)} at offset ${(offset2 - 1).toString(16)}`); + } + malformedDataOffset = offset2 - 1; + const nextOffset = readUint16(); + if (data2[offset2 + nextOffset - 2] === 255) { + offset2 += nextOffset - 2; + break; + } + } + throw new Error("unknown JPEG marker " + fileMarker.toString(16)); + } + fileMarker = readUint16(); + } + if (frames.length != 1) + throw new Error("only single frame JPEGs supported"); + for (var i = 0; i < frames.length; i++) { + var cp2 = frames[i].components; + for (var j in cp2) { + cp2[j].quantizationTable = quantizationTables[cp2[j].quantizationIdx]; + delete cp2[j].quantizationIdx; + } + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (var i = 0; i < frame.componentsOrder.length; i++) { + var component = frame.components[frame.componentsOrder[i]]; + this.components.push({ + lines: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV + }); + } + }, + getData: function getData(width, height) { + var scaleX = this.width / width, scaleY = this.height / height; + var component1, component2, component3, component4; + var component1Line, component2Line, component3Line, component4Line; + var x, y; + var offset2 = 0; + var Y, Cb, Cr, K, C, M, Ye, R, G, B; + var colorTransform; + var dataLength = width * height * this.components.length; + requestMemoryAllocation(dataLength); + var data2 = new Uint8Array(dataLength); + switch (this.components.length) { + case 1: + component1 = this.components[0]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | y * component1.scaleY * scaleY]; + for (x = 0; x < width; x++) { + Y = component1Line[0 | x * component1.scaleX * scaleX]; + data2[offset2++] = Y; + } + } + break; + case 2: + component1 = this.components[0]; + component2 = this.components[1]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | y * component1.scaleY * scaleY]; + component2Line = component2.lines[0 | y * component2.scaleY * scaleY]; + for (x = 0; x < width; x++) { + Y = component1Line[0 | x * component1.scaleX * scaleX]; + data2[offset2++] = Y; + Y = component2Line[0 | x * component2.scaleX * scaleX]; + data2[offset2++] = Y; + } + } + break; + case 3: + colorTransform = true; + if (this.adobe && this.adobe.transformCode) + colorTransform = true; + else if (typeof this.opts.colorTransform !== "undefined") + colorTransform = !!this.opts.colorTransform; + component1 = this.components[0]; + component2 = this.components[1]; + component3 = this.components[2]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | y * component1.scaleY * scaleY]; + component2Line = component2.lines[0 | y * component2.scaleY * scaleY]; + component3Line = component3.lines[0 | y * component3.scaleY * scaleY]; + for (x = 0; x < width; x++) { + if (!colorTransform) { + R = component1Line[0 | x * component1.scaleX * scaleX]; + G = component2Line[0 | x * component2.scaleX * scaleX]; + B = component3Line[0 | x * component3.scaleX * scaleX]; + } else { + Y = component1Line[0 | x * component1.scaleX * scaleX]; + Cb = component2Line[0 | x * component2.scaleX * scaleX]; + Cr = component3Line[0 | x * component3.scaleX * scaleX]; + R = clampTo8bit(Y + 1.402 * (Cr - 128)); + G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128)); + B = clampTo8bit(Y + 1.772 * (Cb - 128)); + } + data2[offset2++] = R; + data2[offset2++] = G; + data2[offset2++] = B; + } + } + break; + case 4: + if (!this.adobe) + throw new Error("Unsupported color mode (4 components)"); + colorTransform = false; + if (this.adobe && this.adobe.transformCode) + colorTransform = true; + else if (typeof this.opts.colorTransform !== "undefined") + colorTransform = !!this.opts.colorTransform; + component1 = this.components[0]; + component2 = this.components[1]; + component3 = this.components[2]; + component4 = this.components[3]; + for (y = 0; y < height; y++) { + component1Line = component1.lines[0 | y * component1.scaleY * scaleY]; + component2Line = component2.lines[0 | y * component2.scaleY * scaleY]; + component3Line = component3.lines[0 | y * component3.scaleY * scaleY]; + component4Line = component4.lines[0 | y * component4.scaleY * scaleY]; + for (x = 0; x < width; x++) { + if (!colorTransform) { + C = component1Line[0 | x * component1.scaleX * scaleX]; + M = component2Line[0 | x * component2.scaleX * scaleX]; + Ye = component3Line[0 | x * component3.scaleX * scaleX]; + K = component4Line[0 | x * component4.scaleX * scaleX]; + } else { + Y = component1Line[0 | x * component1.scaleX * scaleX]; + Cb = component2Line[0 | x * component2.scaleX * scaleX]; + Cr = component3Line[0 | x * component3.scaleX * scaleX]; + K = component4Line[0 | x * component4.scaleX * scaleX]; + C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128)); + M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128)); + Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128)); + } + data2[offset2++] = 255 - C; + data2[offset2++] = 255 - M; + data2[offset2++] = 255 - Ye; + data2[offset2++] = 255 - K; + } + } + break; + default: + throw new Error("Unsupported color mode"); + } + return data2; + }, + copyToImageData: function copyToImageData(imageData, formatAsRGBA) { + var width = imageData.width, height = imageData.height; + var imageDataArray = imageData.data; + var data2 = this.getData(width, height); + var i = 0, j = 0, x, y; + var Y, K, C, M, R, G, B; + switch (this.components.length) { + case 1: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + Y = data2[i++]; + imageDataArray[j++] = Y; + imageDataArray[j++] = Y; + imageDataArray[j++] = Y; + if (formatAsRGBA) { + imageDataArray[j++] = 255; + } + } + } + break; + case 3: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + R = data2[i++]; + G = data2[i++]; + B = data2[i++]; + imageDataArray[j++] = R; + imageDataArray[j++] = G; + imageDataArray[j++] = B; + if (formatAsRGBA) { + imageDataArray[j++] = 255; + } + } + } + break; + case 4: + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + C = data2[i++]; + M = data2[i++]; + Y = data2[i++]; + K = data2[i++]; + R = 255 - clampTo8bit(C * (1 - K / 255) + K); + G = 255 - clampTo8bit(M * (1 - K / 255) + K); + B = 255 - clampTo8bit(Y * (1 - K / 255) + K); + imageDataArray[j++] = R; + imageDataArray[j++] = G; + imageDataArray[j++] = B; + if (formatAsRGBA) { + imageDataArray[j++] = 255; + } + } + } + break; + default: + throw new Error("Unsupported color mode"); + } + } + }; + var totalBytesAllocated = 0; + var maxMemoryUsageBytes = 0; + function requestMemoryAllocation(increaseAmount = 0) { + var totalMemoryImpactBytes = totalBytesAllocated + increaseAmount; + if (totalMemoryImpactBytes > maxMemoryUsageBytes) { + var exceededAmount = Math.ceil((totalMemoryImpactBytes - maxMemoryUsageBytes) / 1024 / 1024); + throw new Error(`maxMemoryUsageInMB limit exceeded by at least ${exceededAmount}MB`); + } + totalBytesAllocated = totalMemoryImpactBytes; + } + constructor.resetMaxMemoryUsage = function(maxMemoryUsageBytes_) { + totalBytesAllocated = 0; + maxMemoryUsageBytes = maxMemoryUsageBytes_; + }; + constructor.getBytesAllocated = function() { + return totalBytesAllocated; + }; + constructor.requestMemoryAllocation = requestMemoryAllocation; + return constructor; + }(); + { + module.exports = decode; + } + function decode(jpegData, userOpts = {}) { + var defaultOpts = { + // "undefined" means "Choose whether to transform colors based on the image’s color model." + colorTransform: void 0, + useTArray: false, + formatAsRGBA: true, + tolerantDecoding: true, + maxResolutionInMP: 100, + // Don't decode more than 100 megapixels + maxMemoryUsageInMB: 512 + // Don't decode if memory footprint is more than 512MB + }; + var opts = { ...defaultOpts, ...userOpts }; + var arr = new Uint8Array(jpegData); + var decoder2 = new JpegImage(); + decoder2.opts = opts; + JpegImage.resetMaxMemoryUsage(opts.maxMemoryUsageInMB * 1024 * 1024); + decoder2.parse(arr); + var channels = opts.formatAsRGBA ? 4 : 3; + var bytesNeeded = decoder2.width * decoder2.height * channels; + try { + JpegImage.requestMemoryAllocation(bytesNeeded); + var image = { + width: decoder2.width, + height: decoder2.height, + exifBuffer: decoder2.exifBuffer, + data: opts.useTArray ? new Uint8Array(bytesNeeded) : Buffer.alloc(bytesNeeded) + }; + if (decoder2.comments.length > 0) { + image["comments"] = decoder2.comments; + } + } catch (err) { + if (err instanceof RangeError) { + throw new Error("Could not allocate enough memory for the image. Required: " + bytesNeeded); + } + if (err instanceof ReferenceError) { + if (err.message === "Buffer is not defined") { + throw new Error("Buffer is not globally defined in this environment. Consider setting useTArray to true"); + } + } + throw err; + } + decoder2.copyToImageData(image, opts.formatAsRGBA); + return image; + } + })(decoder); + return decoder.exports; +} +var jpegJs; +var hasRequiredJpegJs; +function requireJpegJs() { + if (hasRequiredJpegJs) return jpegJs; + hasRequiredJpegJs = 1; + var encode = requireEncoder(), decode = requireDecoder(); + jpegJs = { + encode, + decode + }; + return jpegJs; +} +var jpegJsExports = requireJpegJs(); +const jpegLibrary = /* @__PURE__ */ getDefaultExportFromCjs(jpegJsExports); +var Mime_1; +var hasRequiredMime$1; +function requireMime$1() { + if (hasRequiredMime$1) return Mime_1; + hasRequiredMime$1 = 1; + function Mime() { + this._types = /* @__PURE__ */ Object.create(null); + this._extensions = /* @__PURE__ */ Object.create(null); + for (let i = 0; i < arguments.length; i++) { + this.define(arguments[i]); + } + this.define = this.define.bind(this); + this.getType = this.getType.bind(this); + this.getExtension = this.getExtension.bind(this); + } + Mime.prototype.define = function(typeMap, force) { + for (let type2 in typeMap) { + let extensions = typeMap[type2].map(function(t) { + return t.toLowerCase(); + }); + type2 = type2.toLowerCase(); + for (let i = 0; i < extensions.length; i++) { + const ext = extensions[i]; + if (ext[0] === "*") { + continue; + } + if (!force && ext in this._types) { + throw new Error( + 'Attempt to change mapping for "' + ext + '" extension from "' + this._types[ext] + '" to "' + type2 + '". Pass `force=true` to allow this, otherwise remove "' + ext + '" from the list of extensions for "' + type2 + '".' + ); + } + this._types[ext] = type2; + } + if (force || !this._extensions[type2]) { + const ext = extensions[0]; + this._extensions[type2] = ext[0] !== "*" ? ext : ext.substr(1); + } + } + }; + Mime.prototype.getType = function(path2) { + path2 = String(path2); + let last = path2.replace(/^.*[/\\]/, "").toLowerCase(); + let ext = last.replace(/^.*\./, "").toLowerCase(); + let hasPath = last.length < path2.length; + let hasDot = ext.length < last.length - 1; + return (hasDot || !hasPath) && this._types[ext] || null; + }; + Mime.prototype.getExtension = function(type2) { + type2 = /^\s*([^;\s]*)/.test(type2) && RegExp.$1; + return type2 && this._extensions[type2.toLowerCase()] || null; + }; + Mime_1 = Mime; + return Mime_1; +} +var standard; +var hasRequiredStandard; +function requireStandard() { + if (hasRequiredStandard) return standard; + hasRequiredStandard = 1; + standard = { "application/andrew-inset": ["ez"], "application/applixware": ["aw"], "application/atom+xml": ["atom"], "application/atomcat+xml": ["atomcat"], "application/atomdeleted+xml": ["atomdeleted"], "application/atomsvc+xml": ["atomsvc"], "application/atsc-dwd+xml": ["dwd"], "application/atsc-held+xml": ["held"], "application/atsc-rsat+xml": ["rsat"], "application/bdoc": ["bdoc"], "application/calendar+xml": ["xcs"], "application/ccxml+xml": ["ccxml"], "application/cdfx+xml": ["cdfx"], "application/cdmi-capability": ["cdmia"], "application/cdmi-container": ["cdmic"], "application/cdmi-domain": ["cdmid"], "application/cdmi-object": ["cdmio"], "application/cdmi-queue": ["cdmiq"], "application/cu-seeme": ["cu"], "application/dash+xml": ["mpd"], "application/davmount+xml": ["davmount"], "application/docbook+xml": ["dbk"], "application/dssc+der": ["dssc"], "application/dssc+xml": ["xdssc"], "application/ecmascript": ["es", "ecma"], "application/emma+xml": ["emma"], "application/emotionml+xml": ["emotionml"], "application/epub+zip": ["epub"], "application/exi": ["exi"], "application/express": ["exp"], "application/fdt+xml": ["fdt"], "application/font-tdpfr": ["pfr"], "application/geo+json": ["geojson"], "application/gml+xml": ["gml"], "application/gpx+xml": ["gpx"], "application/gxf": ["gxf"], "application/gzip": ["gz"], "application/hjson": ["hjson"], "application/hyperstudio": ["stk"], "application/inkml+xml": ["ink", "inkml"], "application/ipfix": ["ipfix"], "application/its+xml": ["its"], "application/java-archive": ["jar", "war", "ear"], "application/java-serialized-object": ["ser"], "application/java-vm": ["class"], "application/javascript": ["js", "mjs"], "application/json": ["json", "map"], "application/json5": ["json5"], "application/jsonml+json": ["jsonml"], "application/ld+json": ["jsonld"], "application/lgr+xml": ["lgr"], "application/lost+xml": ["lostxml"], "application/mac-binhex40": ["hqx"], "application/mac-compactpro": ["cpt"], "application/mads+xml": ["mads"], "application/manifest+json": ["webmanifest"], "application/marc": ["mrc"], "application/marcxml+xml": ["mrcx"], "application/mathematica": ["ma", "nb", "mb"], "application/mathml+xml": ["mathml"], "application/mbox": ["mbox"], "application/mediaservercontrol+xml": ["mscml"], "application/metalink+xml": ["metalink"], "application/metalink4+xml": ["meta4"], "application/mets+xml": ["mets"], "application/mmt-aei+xml": ["maei"], "application/mmt-usd+xml": ["musd"], "application/mods+xml": ["mods"], "application/mp21": ["m21", "mp21"], "application/mp4": ["mp4s", "m4p"], "application/msword": ["doc", "dot"], "application/mxf": ["mxf"], "application/n-quads": ["nq"], "application/n-triples": ["nt"], "application/node": ["cjs"], "application/octet-stream": ["bin", "dms", "lrf", "mar", "so", "dist", "distz", "pkg", "bpk", "dump", "elc", "deploy", "exe", "dll", "deb", "dmg", "iso", "img", "msi", "msp", "msm", "buffer"], "application/oda": ["oda"], "application/oebps-package+xml": ["opf"], "application/ogg": ["ogx"], "application/omdoc+xml": ["omdoc"], "application/onenote": ["onetoc", "onetoc2", "onetmp", "onepkg"], "application/oxps": ["oxps"], "application/p2p-overlay+xml": ["relo"], "application/patch-ops-error+xml": ["xer"], "application/pdf": ["pdf"], "application/pgp-encrypted": ["pgp"], "application/pgp-signature": ["asc", "sig"], "application/pics-rules": ["prf"], "application/pkcs10": ["p10"], "application/pkcs7-mime": ["p7m", "p7c"], "application/pkcs7-signature": ["p7s"], "application/pkcs8": ["p8"], "application/pkix-attr-cert": ["ac"], "application/pkix-cert": ["cer"], "application/pkix-crl": ["crl"], "application/pkix-pkipath": ["pkipath"], "application/pkixcmp": ["pki"], "application/pls+xml": ["pls"], "application/postscript": ["ai", "eps", "ps"], "application/provenance+xml": ["provx"], "application/pskc+xml": ["pskcxml"], "application/raml+yaml": ["raml"], "application/rdf+xml": ["rdf", "owl"], "application/reginfo+xml": ["rif"], "application/relax-ng-compact-syntax": ["rnc"], "application/resource-lists+xml": ["rl"], "application/resource-lists-diff+xml": ["rld"], "application/rls-services+xml": ["rs"], "application/route-apd+xml": ["rapd"], "application/route-s-tsid+xml": ["sls"], "application/route-usd+xml": ["rusd"], "application/rpki-ghostbusters": ["gbr"], "application/rpki-manifest": ["mft"], "application/rpki-roa": ["roa"], "application/rsd+xml": ["rsd"], "application/rss+xml": ["rss"], "application/rtf": ["rtf"], "application/sbml+xml": ["sbml"], "application/scvp-cv-request": ["scq"], "application/scvp-cv-response": ["scs"], "application/scvp-vp-request": ["spq"], "application/scvp-vp-response": ["spp"], "application/sdp": ["sdp"], "application/senml+xml": ["senmlx"], "application/sensml+xml": ["sensmlx"], "application/set-payment-initiation": ["setpay"], "application/set-registration-initiation": ["setreg"], "application/shf+xml": ["shf"], "application/sieve": ["siv", "sieve"], "application/smil+xml": ["smi", "smil"], "application/sparql-query": ["rq"], "application/sparql-results+xml": ["srx"], "application/srgs": ["gram"], "application/srgs+xml": ["grxml"], "application/sru+xml": ["sru"], "application/ssdl+xml": ["ssdl"], "application/ssml+xml": ["ssml"], "application/swid+xml": ["swidtag"], "application/tei+xml": ["tei", "teicorpus"], "application/thraud+xml": ["tfi"], "application/timestamped-data": ["tsd"], "application/toml": ["toml"], "application/trig": ["trig"], "application/ttml+xml": ["ttml"], "application/ubjson": ["ubj"], "application/urc-ressheet+xml": ["rsheet"], "application/urc-targetdesc+xml": ["td"], "application/voicexml+xml": ["vxml"], "application/wasm": ["wasm"], "application/widget": ["wgt"], "application/winhlp": ["hlp"], "application/wsdl+xml": ["wsdl"], "application/wspolicy+xml": ["wspolicy"], "application/xaml+xml": ["xaml"], "application/xcap-att+xml": ["xav"], "application/xcap-caps+xml": ["xca"], "application/xcap-diff+xml": ["xdf"], "application/xcap-el+xml": ["xel"], "application/xcap-ns+xml": ["xns"], "application/xenc+xml": ["xenc"], "application/xhtml+xml": ["xhtml", "xht"], "application/xliff+xml": ["xlf"], "application/xml": ["xml", "xsl", "xsd", "rng"], "application/xml-dtd": ["dtd"], "application/xop+xml": ["xop"], "application/xproc+xml": ["xpl"], "application/xslt+xml": ["*xsl", "xslt"], "application/xspf+xml": ["xspf"], "application/xv+xml": ["mxml", "xhvml", "xvml", "xvm"], "application/yang": ["yang"], "application/yin+xml": ["yin"], "application/zip": ["zip"], "audio/3gpp": ["*3gpp"], "audio/adpcm": ["adp"], "audio/amr": ["amr"], "audio/basic": ["au", "snd"], "audio/midi": ["mid", "midi", "kar", "rmi"], "audio/mobile-xmf": ["mxmf"], "audio/mp3": ["*mp3"], "audio/mp4": ["m4a", "mp4a"], "audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"], "audio/ogg": ["oga", "ogg", "spx", "opus"], "audio/s3m": ["s3m"], "audio/silk": ["sil"], "audio/wav": ["wav"], "audio/wave": ["*wav"], "audio/webm": ["weba"], "audio/xm": ["xm"], "font/collection": ["ttc"], "font/otf": ["otf"], "font/ttf": ["ttf"], "font/woff": ["woff"], "font/woff2": ["woff2"], "image/aces": ["exr"], "image/apng": ["apng"], "image/avif": ["avif"], "image/bmp": ["bmp"], "image/cgm": ["cgm"], "image/dicom-rle": ["drle"], "image/emf": ["emf"], "image/fits": ["fits"], "image/g3fax": ["g3"], "image/gif": ["gif"], "image/heic": ["heic"], "image/heic-sequence": ["heics"], "image/heif": ["heif"], "image/heif-sequence": ["heifs"], "image/hej2k": ["hej2"], "image/hsj2": ["hsj2"], "image/ief": ["ief"], "image/jls": ["jls"], "image/jp2": ["jp2", "jpg2"], "image/jpeg": ["jpeg", "jpg", "jpe"], "image/jph": ["jph"], "image/jphc": ["jhc"], "image/jpm": ["jpm"], "image/jpx": ["jpx", "jpf"], "image/jxr": ["jxr"], "image/jxra": ["jxra"], "image/jxrs": ["jxrs"], "image/jxs": ["jxs"], "image/jxsc": ["jxsc"], "image/jxsi": ["jxsi"], "image/jxss": ["jxss"], "image/ktx": ["ktx"], "image/ktx2": ["ktx2"], "image/png": ["png"], "image/sgi": ["sgi"], "image/svg+xml": ["svg", "svgz"], "image/t38": ["t38"], "image/tiff": ["tif", "tiff"], "image/tiff-fx": ["tfx"], "image/webp": ["webp"], "image/wmf": ["wmf"], "message/disposition-notification": ["disposition-notification"], "message/global": ["u8msg"], "message/global-delivery-status": ["u8dsn"], "message/global-disposition-notification": ["u8mdn"], "message/global-headers": ["u8hdr"], "message/rfc822": ["eml", "mime"], "model/3mf": ["3mf"], "model/gltf+json": ["gltf"], "model/gltf-binary": ["glb"], "model/iges": ["igs", "iges"], "model/mesh": ["msh", "mesh", "silo"], "model/mtl": ["mtl"], "model/obj": ["obj"], "model/step+xml": ["stpx"], "model/step+zip": ["stpz"], "model/step-xml+zip": ["stpxz"], "model/stl": ["stl"], "model/vrml": ["wrl", "vrml"], "model/x3d+binary": ["*x3db", "x3dbz"], "model/x3d+fastinfoset": ["x3db"], "model/x3d+vrml": ["*x3dv", "x3dvz"], "model/x3d+xml": ["x3d", "x3dz"], "model/x3d-vrml": ["x3dv"], "text/cache-manifest": ["appcache", "manifest"], "text/calendar": ["ics", "ifb"], "text/coffeescript": ["coffee", "litcoffee"], "text/css": ["css"], "text/csv": ["csv"], "text/html": ["html", "htm", "shtml"], "text/jade": ["jade"], "text/jsx": ["jsx"], "text/less": ["less"], "text/markdown": ["markdown", "md"], "text/mathml": ["mml"], "text/mdx": ["mdx"], "text/n3": ["n3"], "text/plain": ["txt", "text", "conf", "def", "list", "log", "in", "ini"], "text/richtext": ["rtx"], "text/rtf": ["*rtf"], "text/sgml": ["sgml", "sgm"], "text/shex": ["shex"], "text/slim": ["slim", "slm"], "text/spdx": ["spdx"], "text/stylus": ["stylus", "styl"], "text/tab-separated-values": ["tsv"], "text/troff": ["t", "tr", "roff", "man", "me", "ms"], "text/turtle": ["ttl"], "text/uri-list": ["uri", "uris", "urls"], "text/vcard": ["vcard"], "text/vtt": ["vtt"], "text/xml": ["*xml"], "text/yaml": ["yaml", "yml"], "video/3gpp": ["3gp", "3gpp"], "video/3gpp2": ["3g2"], "video/h261": ["h261"], "video/h263": ["h263"], "video/h264": ["h264"], "video/iso.segment": ["m4s"], "video/jpeg": ["jpgv"], "video/jpm": ["*jpm", "jpgm"], "video/mj2": ["mj2", "mjp2"], "video/mp2t": ["ts"], "video/mp4": ["mp4", "mp4v", "mpg4"], "video/mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v"], "video/ogg": ["ogv"], "video/quicktime": ["qt", "mov"], "video/webm": ["webm"] }; + return standard; +} +var other; +var hasRequiredOther; +function requireOther() { + if (hasRequiredOther) return other; + hasRequiredOther = 1; + other = { "application/prs.cww": ["cww"], "application/vnd.1000minds.decision-model+xml": ["1km"], "application/vnd.3gpp.pic-bw-large": ["plb"], "application/vnd.3gpp.pic-bw-small": ["psb"], "application/vnd.3gpp.pic-bw-var": ["pvb"], "application/vnd.3gpp2.tcap": ["tcap"], "application/vnd.3m.post-it-notes": ["pwn"], "application/vnd.accpac.simply.aso": ["aso"], "application/vnd.accpac.simply.imp": ["imp"], "application/vnd.acucobol": ["acu"], "application/vnd.acucorp": ["atc", "acutc"], "application/vnd.adobe.air-application-installer-package+zip": ["air"], "application/vnd.adobe.formscentral.fcdt": ["fcdt"], "application/vnd.adobe.fxp": ["fxp", "fxpl"], "application/vnd.adobe.xdp+xml": ["xdp"], "application/vnd.adobe.xfdf": ["xfdf"], "application/vnd.ahead.space": ["ahead"], "application/vnd.airzip.filesecure.azf": ["azf"], "application/vnd.airzip.filesecure.azs": ["azs"], "application/vnd.amazon.ebook": ["azw"], "application/vnd.americandynamics.acc": ["acc"], "application/vnd.amiga.ami": ["ami"], "application/vnd.android.package-archive": ["apk"], "application/vnd.anser-web-certificate-issue-initiation": ["cii"], "application/vnd.anser-web-funds-transfer-initiation": ["fti"], "application/vnd.antix.game-component": ["atx"], "application/vnd.apple.installer+xml": ["mpkg"], "application/vnd.apple.keynote": ["key"], "application/vnd.apple.mpegurl": ["m3u8"], "application/vnd.apple.numbers": ["numbers"], "application/vnd.apple.pages": ["pages"], "application/vnd.apple.pkpass": ["pkpass"], "application/vnd.aristanetworks.swi": ["swi"], "application/vnd.astraea-software.iota": ["iota"], "application/vnd.audiograph": ["aep"], "application/vnd.balsamiq.bmml+xml": ["bmml"], "application/vnd.blueice.multipass": ["mpm"], "application/vnd.bmi": ["bmi"], "application/vnd.businessobjects": ["rep"], "application/vnd.chemdraw+xml": ["cdxml"], "application/vnd.chipnuts.karaoke-mmd": ["mmd"], "application/vnd.cinderella": ["cdy"], "application/vnd.citationstyles.style+xml": ["csl"], "application/vnd.claymore": ["cla"], "application/vnd.cloanto.rp9": ["rp9"], "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"], "application/vnd.cluetrust.cartomobile-config": ["c11amc"], "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"], "application/vnd.commonspace": ["csp"], "application/vnd.contact.cmsg": ["cdbcmsg"], "application/vnd.cosmocaller": ["cmc"], "application/vnd.crick.clicker": ["clkx"], "application/vnd.crick.clicker.keyboard": ["clkk"], "application/vnd.crick.clicker.palette": ["clkp"], "application/vnd.crick.clicker.template": ["clkt"], "application/vnd.crick.clicker.wordbank": ["clkw"], "application/vnd.criticaltools.wbs+xml": ["wbs"], "application/vnd.ctc-posml": ["pml"], "application/vnd.cups-ppd": ["ppd"], "application/vnd.curl.car": ["car"], "application/vnd.curl.pcurl": ["pcurl"], "application/vnd.dart": ["dart"], "application/vnd.data-vision.rdz": ["rdz"], "application/vnd.dbf": ["dbf"], "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"], "application/vnd.dece.ttml+xml": ["uvt", "uvvt"], "application/vnd.dece.unspecified": ["uvx", "uvvx"], "application/vnd.dece.zip": ["uvz", "uvvz"], "application/vnd.denovo.fcselayout-link": ["fe_launch"], "application/vnd.dna": ["dna"], "application/vnd.dolby.mlp": ["mlp"], "application/vnd.dpgraph": ["dpg"], "application/vnd.dreamfactory": ["dfac"], "application/vnd.ds-keypoint": ["kpxx"], "application/vnd.dvb.ait": ["ait"], "application/vnd.dvb.service": ["svc"], "application/vnd.dynageo": ["geo"], "application/vnd.ecowin.chart": ["mag"], "application/vnd.enliven": ["nml"], "application/vnd.epson.esf": ["esf"], "application/vnd.epson.msf": ["msf"], "application/vnd.epson.quickanime": ["qam"], "application/vnd.epson.salt": ["slt"], "application/vnd.epson.ssf": ["ssf"], "application/vnd.eszigno3+xml": ["es3", "et3"], "application/vnd.ezpix-album": ["ez2"], "application/vnd.ezpix-package": ["ez3"], "application/vnd.fdf": ["fdf"], "application/vnd.fdsn.mseed": ["mseed"], "application/vnd.fdsn.seed": ["seed", "dataless"], "application/vnd.flographit": ["gph"], "application/vnd.fluxtime.clip": ["ftc"], "application/vnd.framemaker": ["fm", "frame", "maker", "book"], "application/vnd.frogans.fnc": ["fnc"], "application/vnd.frogans.ltf": ["ltf"], "application/vnd.fsc.weblaunch": ["fsc"], "application/vnd.fujitsu.oasys": ["oas"], "application/vnd.fujitsu.oasys2": ["oa2"], "application/vnd.fujitsu.oasys3": ["oa3"], "application/vnd.fujitsu.oasysgp": ["fg5"], "application/vnd.fujitsu.oasysprs": ["bh2"], "application/vnd.fujixerox.ddd": ["ddd"], "application/vnd.fujixerox.docuworks": ["xdw"], "application/vnd.fujixerox.docuworks.binder": ["xbd"], "application/vnd.fuzzysheet": ["fzs"], "application/vnd.genomatix.tuxedo": ["txd"], "application/vnd.geogebra.file": ["ggb"], "application/vnd.geogebra.tool": ["ggt"], "application/vnd.geometry-explorer": ["gex", "gre"], "application/vnd.geonext": ["gxt"], "application/vnd.geoplan": ["g2w"], "application/vnd.geospace": ["g3w"], "application/vnd.gmx": ["gmx"], "application/vnd.google-apps.document": ["gdoc"], "application/vnd.google-apps.presentation": ["gslides"], "application/vnd.google-apps.spreadsheet": ["gsheet"], "application/vnd.google-earth.kml+xml": ["kml"], "application/vnd.google-earth.kmz": ["kmz"], "application/vnd.grafeq": ["gqf", "gqs"], "application/vnd.groove-account": ["gac"], "application/vnd.groove-help": ["ghf"], "application/vnd.groove-identity-message": ["gim"], "application/vnd.groove-injector": ["grv"], "application/vnd.groove-tool-message": ["gtm"], "application/vnd.groove-tool-template": ["tpl"], "application/vnd.groove-vcard": ["vcg"], "application/vnd.hal+xml": ["hal"], "application/vnd.handheld-entertainment+xml": ["zmm"], "application/vnd.hbci": ["hbci"], "application/vnd.hhe.lesson-player": ["les"], "application/vnd.hp-hpgl": ["hpgl"], "application/vnd.hp-hpid": ["hpid"], "application/vnd.hp-hps": ["hps"], "application/vnd.hp-jlyt": ["jlt"], "application/vnd.hp-pcl": ["pcl"], "application/vnd.hp-pclxl": ["pclxl"], "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"], "application/vnd.ibm.minipay": ["mpy"], "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"], "application/vnd.ibm.rights-management": ["irm"], "application/vnd.ibm.secure-container": ["sc"], "application/vnd.iccprofile": ["icc", "icm"], "application/vnd.igloader": ["igl"], "application/vnd.immervision-ivp": ["ivp"], "application/vnd.immervision-ivu": ["ivu"], "application/vnd.insors.igm": ["igm"], "application/vnd.intercon.formnet": ["xpw", "xpx"], "application/vnd.intergeo": ["i2g"], "application/vnd.intu.qbo": ["qbo"], "application/vnd.intu.qfx": ["qfx"], "application/vnd.ipunplugged.rcprofile": ["rcprofile"], "application/vnd.irepository.package+xml": ["irp"], "application/vnd.is-xpr": ["xpr"], "application/vnd.isac.fcs": ["fcs"], "application/vnd.jam": ["jam"], "application/vnd.jcp.javame.midlet-rms": ["rms"], "application/vnd.jisp": ["jisp"], "application/vnd.joost.joda-archive": ["joda"], "application/vnd.kahootz": ["ktz", "ktr"], "application/vnd.kde.karbon": ["karbon"], "application/vnd.kde.kchart": ["chrt"], "application/vnd.kde.kformula": ["kfo"], "application/vnd.kde.kivio": ["flw"], "application/vnd.kde.kontour": ["kon"], "application/vnd.kde.kpresenter": ["kpr", "kpt"], "application/vnd.kde.kspread": ["ksp"], "application/vnd.kde.kword": ["kwd", "kwt"], "application/vnd.kenameaapp": ["htke"], "application/vnd.kidspiration": ["kia"], "application/vnd.kinar": ["kne", "knp"], "application/vnd.koan": ["skp", "skd", "skt", "skm"], "application/vnd.kodak-descriptor": ["sse"], "application/vnd.las.las+xml": ["lasxml"], "application/vnd.llamagraphics.life-balance.desktop": ["lbd"], "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"], "application/vnd.lotus-1-2-3": ["123"], "application/vnd.lotus-approach": ["apr"], "application/vnd.lotus-freelance": ["pre"], "application/vnd.lotus-notes": ["nsf"], "application/vnd.lotus-organizer": ["org"], "application/vnd.lotus-screencam": ["scm"], "application/vnd.lotus-wordpro": ["lwp"], "application/vnd.macports.portpkg": ["portpkg"], "application/vnd.mapbox-vector-tile": ["mvt"], "application/vnd.mcd": ["mcd"], "application/vnd.medcalcdata": ["mc1"], "application/vnd.mediastation.cdkey": ["cdkey"], "application/vnd.mfer": ["mwf"], "application/vnd.mfmp": ["mfm"], "application/vnd.micrografx.flo": ["flo"], "application/vnd.micrografx.igx": ["igx"], "application/vnd.mif": ["mif"], "application/vnd.mobius.daf": ["daf"], "application/vnd.mobius.dis": ["dis"], "application/vnd.mobius.mbk": ["mbk"], "application/vnd.mobius.mqy": ["mqy"], "application/vnd.mobius.msl": ["msl"], "application/vnd.mobius.plc": ["plc"], "application/vnd.mobius.txf": ["txf"], "application/vnd.mophun.application": ["mpn"], "application/vnd.mophun.certificate": ["mpc"], "application/vnd.mozilla.xul+xml": ["xul"], "application/vnd.ms-artgalry": ["cil"], "application/vnd.ms-cab-compressed": ["cab"], "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"], "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"], "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"], "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"], "application/vnd.ms-excel.template.macroenabled.12": ["xltm"], "application/vnd.ms-fontobject": ["eot"], "application/vnd.ms-htmlhelp": ["chm"], "application/vnd.ms-ims": ["ims"], "application/vnd.ms-lrm": ["lrm"], "application/vnd.ms-officetheme": ["thmx"], "application/vnd.ms-outlook": ["msg"], "application/vnd.ms-pki.seccat": ["cat"], "application/vnd.ms-pki.stl": ["*stl"], "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"], "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"], "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"], "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"], "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"], "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"], "application/vnd.ms-project": ["mpp", "mpt"], "application/vnd.ms-word.document.macroenabled.12": ["docm"], "application/vnd.ms-word.template.macroenabled.12": ["dotm"], "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"], "application/vnd.ms-wpl": ["wpl"], "application/vnd.ms-xpsdocument": ["xps"], "application/vnd.mseq": ["mseq"], "application/vnd.musician": ["mus"], "application/vnd.muvee.style": ["msty"], "application/vnd.mynfc": ["taglet"], "application/vnd.neurolanguage.nlu": ["nlu"], "application/vnd.nitf": ["ntf", "nitf"], "application/vnd.noblenet-directory": ["nnd"], "application/vnd.noblenet-sealer": ["nns"], "application/vnd.noblenet-web": ["nnw"], "application/vnd.nokia.n-gage.ac+xml": ["*ac"], "application/vnd.nokia.n-gage.data": ["ngdat"], "application/vnd.nokia.n-gage.symbian.install": ["n-gage"], "application/vnd.nokia.radio-preset": ["rpst"], "application/vnd.nokia.radio-presets": ["rpss"], "application/vnd.novadigm.edm": ["edm"], "application/vnd.novadigm.edx": ["edx"], "application/vnd.novadigm.ext": ["ext"], "application/vnd.oasis.opendocument.chart": ["odc"], "application/vnd.oasis.opendocument.chart-template": ["otc"], "application/vnd.oasis.opendocument.database": ["odb"], "application/vnd.oasis.opendocument.formula": ["odf"], "application/vnd.oasis.opendocument.formula-template": ["odft"], "application/vnd.oasis.opendocument.graphics": ["odg"], "application/vnd.oasis.opendocument.graphics-template": ["otg"], "application/vnd.oasis.opendocument.image": ["odi"], "application/vnd.oasis.opendocument.image-template": ["oti"], "application/vnd.oasis.opendocument.presentation": ["odp"], "application/vnd.oasis.opendocument.presentation-template": ["otp"], "application/vnd.oasis.opendocument.spreadsheet": ["ods"], "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"], "application/vnd.oasis.opendocument.text": ["odt"], "application/vnd.oasis.opendocument.text-master": ["odm"], "application/vnd.oasis.opendocument.text-template": ["ott"], "application/vnd.oasis.opendocument.text-web": ["oth"], "application/vnd.olpc-sugar": ["xo"], "application/vnd.oma.dd2+xml": ["dd2"], "application/vnd.openblox.game+xml": ["obgx"], "application/vnd.openofficeorg.extension": ["oxt"], "application/vnd.openstreetmap.data+xml": ["osm"], "application/vnd.openxmlformats-officedocument.presentationml.presentation": ["pptx"], "application/vnd.openxmlformats-officedocument.presentationml.slide": ["sldx"], "application/vnd.openxmlformats-officedocument.presentationml.slideshow": ["ppsx"], "application/vnd.openxmlformats-officedocument.presentationml.template": ["potx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.template": ["xltx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ["docx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.template": ["dotx"], "application/vnd.osgeo.mapguide.package": ["mgp"], "application/vnd.osgi.dp": ["dp"], "application/vnd.osgi.subsystem": ["esa"], "application/vnd.palm": ["pdb", "pqa", "oprc"], "application/vnd.pawaafile": ["paw"], "application/vnd.pg.format": ["str"], "application/vnd.pg.osasli": ["ei6"], "application/vnd.picsel": ["efif"], "application/vnd.pmi.widget": ["wg"], "application/vnd.pocketlearn": ["plf"], "application/vnd.powerbuilder6": ["pbd"], "application/vnd.previewsystems.box": ["box"], "application/vnd.proteus.magazine": ["mgz"], "application/vnd.publishare-delta-tree": ["qps"], "application/vnd.pvi.ptid1": ["ptid"], "application/vnd.quark.quarkxpress": ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"], "application/vnd.rar": ["rar"], "application/vnd.realvnc.bed": ["bed"], "application/vnd.recordare.musicxml": ["mxl"], "application/vnd.recordare.musicxml+xml": ["musicxml"], "application/vnd.rig.cryptonote": ["cryptonote"], "application/vnd.rim.cod": ["cod"], "application/vnd.rn-realmedia": ["rm"], "application/vnd.rn-realmedia-vbr": ["rmvb"], "application/vnd.route66.link66+xml": ["link66"], "application/vnd.sailingtracker.track": ["st"], "application/vnd.seemail": ["see"], "application/vnd.sema": ["sema"], "application/vnd.semd": ["semd"], "application/vnd.semf": ["semf"], "application/vnd.shana.informed.formdata": ["ifm"], "application/vnd.shana.informed.formtemplate": ["itp"], "application/vnd.shana.informed.interchange": ["iif"], "application/vnd.shana.informed.package": ["ipk"], "application/vnd.simtech-mindmapper": ["twd", "twds"], "application/vnd.smaf": ["mmf"], "application/vnd.smart.teacher": ["teacher"], "application/vnd.software602.filler.form+xml": ["fo"], "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"], "application/vnd.spotfire.dxp": ["dxp"], "application/vnd.spotfire.sfs": ["sfs"], "application/vnd.stardivision.calc": ["sdc"], "application/vnd.stardivision.draw": ["sda"], "application/vnd.stardivision.impress": ["sdd"], "application/vnd.stardivision.math": ["smf"], "application/vnd.stardivision.writer": ["sdw", "vor"], "application/vnd.stardivision.writer-global": ["sgl"], "application/vnd.stepmania.package": ["smzip"], "application/vnd.stepmania.stepchart": ["sm"], "application/vnd.sun.wadl+xml": ["wadl"], "application/vnd.sun.xml.calc": ["sxc"], "application/vnd.sun.xml.calc.template": ["stc"], "application/vnd.sun.xml.draw": ["sxd"], "application/vnd.sun.xml.draw.template": ["std"], "application/vnd.sun.xml.impress": ["sxi"], "application/vnd.sun.xml.impress.template": ["sti"], "application/vnd.sun.xml.math": ["sxm"], "application/vnd.sun.xml.writer": ["sxw"], "application/vnd.sun.xml.writer.global": ["sxg"], "application/vnd.sun.xml.writer.template": ["stw"], "application/vnd.sus-calendar": ["sus", "susp"], "application/vnd.svd": ["svd"], "application/vnd.symbian.install": ["sis", "sisx"], "application/vnd.syncml+xml": ["xsm"], "application/vnd.syncml.dm+wbxml": ["bdm"], "application/vnd.syncml.dm+xml": ["xdm"], "application/vnd.syncml.dmddf+xml": ["ddf"], "application/vnd.tao.intent-module-archive": ["tao"], "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"], "application/vnd.tmobile-livetv": ["tmo"], "application/vnd.trid.tpt": ["tpt"], "application/vnd.triscape.mxs": ["mxs"], "application/vnd.trueapp": ["tra"], "application/vnd.ufdl": ["ufd", "ufdl"], "application/vnd.uiq.theme": ["utz"], "application/vnd.umajin": ["umj"], "application/vnd.unity": ["unityweb"], "application/vnd.uoml+xml": ["uoml"], "application/vnd.vcx": ["vcx"], "application/vnd.visio": ["vsd", "vst", "vss", "vsw"], "application/vnd.visionary": ["vis"], "application/vnd.vsf": ["vsf"], "application/vnd.wap.wbxml": ["wbxml"], "application/vnd.wap.wmlc": ["wmlc"], "application/vnd.wap.wmlscriptc": ["wmlsc"], "application/vnd.webturbo": ["wtb"], "application/vnd.wolfram.player": ["nbp"], "application/vnd.wordperfect": ["wpd"], "application/vnd.wqd": ["wqd"], "application/vnd.wt.stf": ["stf"], "application/vnd.xara": ["xar"], "application/vnd.xfdl": ["xfdl"], "application/vnd.yamaha.hv-dic": ["hvd"], "application/vnd.yamaha.hv-script": ["hvs"], "application/vnd.yamaha.hv-voice": ["hvp"], "application/vnd.yamaha.openscoreformat": ["osf"], "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"], "application/vnd.yamaha.smaf-audio": ["saf"], "application/vnd.yamaha.smaf-phrase": ["spf"], "application/vnd.yellowriver-custom-menu": ["cmp"], "application/vnd.zul": ["zir", "zirz"], "application/vnd.zzazz.deck+xml": ["zaz"], "application/x-7z-compressed": ["7z"], "application/x-abiword": ["abw"], "application/x-ace-compressed": ["ace"], "application/x-apple-diskimage": ["*dmg"], "application/x-arj": ["arj"], "application/x-authorware-bin": ["aab", "x32", "u32", "vox"], "application/x-authorware-map": ["aam"], "application/x-authorware-seg": ["aas"], "application/x-bcpio": ["bcpio"], "application/x-bdoc": ["*bdoc"], "application/x-bittorrent": ["torrent"], "application/x-blorb": ["blb", "blorb"], "application/x-bzip": ["bz"], "application/x-bzip2": ["bz2", "boz"], "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"], "application/x-cdlink": ["vcd"], "application/x-cfs-compressed": ["cfs"], "application/x-chat": ["chat"], "application/x-chess-pgn": ["pgn"], "application/x-chrome-extension": ["crx"], "application/x-cocoa": ["cco"], "application/x-conference": ["nsc"], "application/x-cpio": ["cpio"], "application/x-csh": ["csh"], "application/x-debian-package": ["*deb", "udeb"], "application/x-dgc-compressed": ["dgc"], "application/x-director": ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"], "application/x-doom": ["wad"], "application/x-dtbncx+xml": ["ncx"], "application/x-dtbook+xml": ["dtb"], "application/x-dtbresource+xml": ["res"], "application/x-dvi": ["dvi"], "application/x-envoy": ["evy"], "application/x-eva": ["eva"], "application/x-font-bdf": ["bdf"], "application/x-font-ghostscript": ["gsf"], "application/x-font-linux-psf": ["psf"], "application/x-font-pcf": ["pcf"], "application/x-font-snf": ["snf"], "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"], "application/x-freearc": ["arc"], "application/x-futuresplash": ["spl"], "application/x-gca-compressed": ["gca"], "application/x-glulx": ["ulx"], "application/x-gnumeric": ["gnumeric"], "application/x-gramps-xml": ["gramps"], "application/x-gtar": ["gtar"], "application/x-hdf": ["hdf"], "application/x-httpd-php": ["php"], "application/x-install-instructions": ["install"], "application/x-iso9660-image": ["*iso"], "application/x-iwork-keynote-sffkey": ["*key"], "application/x-iwork-numbers-sffnumbers": ["*numbers"], "application/x-iwork-pages-sffpages": ["*pages"], "application/x-java-archive-diff": ["jardiff"], "application/x-java-jnlp-file": ["jnlp"], "application/x-keepass2": ["kdbx"], "application/x-latex": ["latex"], "application/x-lua-bytecode": ["luac"], "application/x-lzh-compressed": ["lzh", "lha"], "application/x-makeself": ["run"], "application/x-mie": ["mie"], "application/x-mobipocket-ebook": ["prc", "mobi"], "application/x-ms-application": ["application"], "application/x-ms-shortcut": ["lnk"], "application/x-ms-wmd": ["wmd"], "application/x-ms-wmz": ["wmz"], "application/x-ms-xbap": ["xbap"], "application/x-msaccess": ["mdb"], "application/x-msbinder": ["obd"], "application/x-mscardfile": ["crd"], "application/x-msclip": ["clp"], "application/x-msdos-program": ["*exe"], "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"], "application/x-msmediaview": ["mvb", "m13", "m14"], "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"], "application/x-msmoney": ["mny"], "application/x-mspublisher": ["pub"], "application/x-msschedule": ["scd"], "application/x-msterminal": ["trm"], "application/x-mswrite": ["wri"], "application/x-netcdf": ["nc", "cdf"], "application/x-ns-proxy-autoconfig": ["pac"], "application/x-nzb": ["nzb"], "application/x-perl": ["pl", "pm"], "application/x-pilot": ["*prc", "*pdb"], "application/x-pkcs12": ["p12", "pfx"], "application/x-pkcs7-certificates": ["p7b", "spc"], "application/x-pkcs7-certreqresp": ["p7r"], "application/x-rar-compressed": ["*rar"], "application/x-redhat-package-manager": ["rpm"], "application/x-research-info-systems": ["ris"], "application/x-sea": ["sea"], "application/x-sh": ["sh"], "application/x-shar": ["shar"], "application/x-shockwave-flash": ["swf"], "application/x-silverlight-app": ["xap"], "application/x-sql": ["sql"], "application/x-stuffit": ["sit"], "application/x-stuffitx": ["sitx"], "application/x-subrip": ["srt"], "application/x-sv4cpio": ["sv4cpio"], "application/x-sv4crc": ["sv4crc"], "application/x-t3vm-image": ["t3"], "application/x-tads": ["gam"], "application/x-tar": ["tar"], "application/x-tcl": ["tcl", "tk"], "application/x-tex": ["tex"], "application/x-tex-tfm": ["tfm"], "application/x-texinfo": ["texinfo", "texi"], "application/x-tgif": ["*obj"], "application/x-ustar": ["ustar"], "application/x-virtualbox-hdd": ["hdd"], "application/x-virtualbox-ova": ["ova"], "application/x-virtualbox-ovf": ["ovf"], "application/x-virtualbox-vbox": ["vbox"], "application/x-virtualbox-vbox-extpack": ["vbox-extpack"], "application/x-virtualbox-vdi": ["vdi"], "application/x-virtualbox-vhd": ["vhd"], "application/x-virtualbox-vmdk": ["vmdk"], "application/x-wais-source": ["src"], "application/x-web-app-manifest+json": ["webapp"], "application/x-x509-ca-cert": ["der", "crt", "pem"], "application/x-xfig": ["fig"], "application/x-xliff+xml": ["*xlf"], "application/x-xpinstall": ["xpi"], "application/x-xz": ["xz"], "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"], "audio/vnd.dece.audio": ["uva", "uvva"], "audio/vnd.digital-winds": ["eol"], "audio/vnd.dra": ["dra"], "audio/vnd.dts": ["dts"], "audio/vnd.dts.hd": ["dtshd"], "audio/vnd.lucent.voice": ["lvp"], "audio/vnd.ms-playready.media.pya": ["pya"], "audio/vnd.nuera.ecelp4800": ["ecelp4800"], "audio/vnd.nuera.ecelp7470": ["ecelp7470"], "audio/vnd.nuera.ecelp9600": ["ecelp9600"], "audio/vnd.rip": ["rip"], "audio/x-aac": ["aac"], "audio/x-aiff": ["aif", "aiff", "aifc"], "audio/x-caf": ["caf"], "audio/x-flac": ["flac"], "audio/x-m4a": ["*m4a"], "audio/x-matroska": ["mka"], "audio/x-mpegurl": ["m3u"], "audio/x-ms-wax": ["wax"], "audio/x-ms-wma": ["wma"], "audio/x-pn-realaudio": ["ram", "ra"], "audio/x-pn-realaudio-plugin": ["rmp"], "audio/x-realaudio": ["*ra"], "audio/x-wav": ["*wav"], "chemical/x-cdx": ["cdx"], "chemical/x-cif": ["cif"], "chemical/x-cmdf": ["cmdf"], "chemical/x-cml": ["cml"], "chemical/x-csml": ["csml"], "chemical/x-xyz": ["xyz"], "image/prs.btif": ["btif"], "image/prs.pti": ["pti"], "image/vnd.adobe.photoshop": ["psd"], "image/vnd.airzip.accelerator.azv": ["azv"], "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"], "image/vnd.djvu": ["djvu", "djv"], "image/vnd.dvb.subtitle": ["*sub"], "image/vnd.dwg": ["dwg"], "image/vnd.dxf": ["dxf"], "image/vnd.fastbidsheet": ["fbs"], "image/vnd.fpx": ["fpx"], "image/vnd.fst": ["fst"], "image/vnd.fujixerox.edmics-mmr": ["mmr"], "image/vnd.fujixerox.edmics-rlc": ["rlc"], "image/vnd.microsoft.icon": ["ico"], "image/vnd.ms-dds": ["dds"], "image/vnd.ms-modi": ["mdi"], "image/vnd.ms-photo": ["wdp"], "image/vnd.net-fpx": ["npx"], "image/vnd.pco.b16": ["b16"], "image/vnd.tencent.tap": ["tap"], "image/vnd.valve.source.texture": ["vtf"], "image/vnd.wap.wbmp": ["wbmp"], "image/vnd.xiff": ["xif"], "image/vnd.zbrush.pcx": ["pcx"], "image/x-3ds": ["3ds"], "image/x-cmu-raster": ["ras"], "image/x-cmx": ["cmx"], "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"], "image/x-icon": ["*ico"], "image/x-jng": ["jng"], "image/x-mrsid-image": ["sid"], "image/x-ms-bmp": ["*bmp"], "image/x-pcx": ["*pcx"], "image/x-pict": ["pic", "pct"], "image/x-portable-anymap": ["pnm"], "image/x-portable-bitmap": ["pbm"], "image/x-portable-graymap": ["pgm"], "image/x-portable-pixmap": ["ppm"], "image/x-rgb": ["rgb"], "image/x-tga": ["tga"], "image/x-xbitmap": ["xbm"], "image/x-xpixmap": ["xpm"], "image/x-xwindowdump": ["xwd"], "message/vnd.wfa.wsc": ["wsc"], "model/vnd.collada+xml": ["dae"], "model/vnd.dwf": ["dwf"], "model/vnd.gdl": ["gdl"], "model/vnd.gtw": ["gtw"], "model/vnd.mts": ["mts"], "model/vnd.opengex": ["ogex"], "model/vnd.parasolid.transmit.binary": ["x_b"], "model/vnd.parasolid.transmit.text": ["x_t"], "model/vnd.sap.vds": ["vds"], "model/vnd.usdz+zip": ["usdz"], "model/vnd.valve.source.compiled-map": ["bsp"], "model/vnd.vtu": ["vtu"], "text/prs.lines.tag": ["dsc"], "text/vnd.curl": ["curl"], "text/vnd.curl.dcurl": ["dcurl"], "text/vnd.curl.mcurl": ["mcurl"], "text/vnd.curl.scurl": ["scurl"], "text/vnd.dvb.subtitle": ["sub"], "text/vnd.fly": ["fly"], "text/vnd.fmi.flexstor": ["flx"], "text/vnd.graphviz": ["gv"], "text/vnd.in3d.3dml": ["3dml"], "text/vnd.in3d.spot": ["spot"], "text/vnd.sun.j2me.app-descriptor": ["jad"], "text/vnd.wap.wml": ["wml"], "text/vnd.wap.wmlscript": ["wmls"], "text/x-asm": ["s", "asm"], "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"], "text/x-component": ["htc"], "text/x-fortran": ["f", "for", "f77", "f90"], "text/x-handlebars-template": ["hbs"], "text/x-java-source": ["java"], "text/x-lua": ["lua"], "text/x-markdown": ["mkd"], "text/x-nfo": ["nfo"], "text/x-opml": ["opml"], "text/x-org": ["*org"], "text/x-pascal": ["p", "pas"], "text/x-processing": ["pde"], "text/x-sass": ["sass"], "text/x-scss": ["scss"], "text/x-setext": ["etx"], "text/x-sfv": ["sfv"], "text/x-suse-ymp": ["ymp"], "text/x-uuencode": ["uu"], "text/x-vcalendar": ["vcs"], "text/x-vcard": ["vcf"], "video/vnd.dece.hd": ["uvh", "uvvh"], "video/vnd.dece.mobile": ["uvm", "uvvm"], "video/vnd.dece.pd": ["uvp", "uvvp"], "video/vnd.dece.sd": ["uvs", "uvvs"], "video/vnd.dece.video": ["uvv", "uvvv"], "video/vnd.dvb.file": ["dvb"], "video/vnd.fvt": ["fvt"], "video/vnd.mpegurl": ["mxu", "m4u"], "video/vnd.ms-playready.media.pyv": ["pyv"], "video/vnd.uvvu.mp4": ["uvu", "uvvu"], "video/vnd.vivo": ["viv"], "video/x-f4v": ["f4v"], "video/x-fli": ["fli"], "video/x-flv": ["flv"], "video/x-m4v": ["m4v"], "video/x-matroska": ["mkv", "mk3d", "mks"], "video/x-mng": ["mng"], "video/x-ms-asf": ["asf", "asx"], "video/x-ms-vob": ["vob"], "video/x-ms-wm": ["wm"], "video/x-ms-wmv": ["wmv"], "video/x-ms-wmx": ["wmx"], "video/x-ms-wvx": ["wvx"], "video/x-msvideo": ["avi"], "video/x-sgi-movie": ["movie"], "video/x-smv": ["smv"], "x-conference/x-cooltalk": ["ice"] }; + return other; +} +var mime$2; +var hasRequiredMime; +function requireMime() { + if (hasRequiredMime) return mime$2; + hasRequiredMime = 1; + let Mime = requireMime$1(); + mime$2 = new Mime(requireStandard(), requireOther()); + return mime$2; +} +var mimeExports = requireMime(); +const mimeLibrary = /* @__PURE__ */ getDefaultExportFromCjs(mimeExports); +var concatMap; +var hasRequiredConcatMap; +function requireConcatMap() { + if (hasRequiredConcatMap) return concatMap; + hasRequiredConcatMap = 1; + concatMap = function(xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray2(x)) res.push.apply(res, x); + else res.push(x); + } + return res; + }; + var isArray2 = Array.isArray || function(xs) { + return Object.prototype.toString.call(xs) === "[object Array]"; + }; + return concatMap; +} +var balancedMatch; +var hasRequiredBalancedMatch; +function requireBalancedMatch() { + if (hasRequiredBalancedMatch) return balancedMatch; + hasRequiredBalancedMatch = 1; + balancedMatch = balanced; + function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + var r = range2(a, b, str); + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; + } + function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; + } + balanced.range = range2; + function range2(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + if (ai >= 0 && bi > 0) { + if (a === b) { + return [ai, bi]; + } + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [begs.pop(), bi]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length) { + result = [left, right]; + } + } + return result; + } + return balancedMatch; +} +var braceExpansion; +var hasRequiredBraceExpansion; +function requireBraceExpansion() { + if (hasRequiredBraceExpansion) return braceExpansion; + hasRequiredBraceExpansion = 1; + var concatMap2 = requireConcatMap(); + var balanced = requireBalancedMatch(); + braceExpansion = expandTop; + var escSlash = "\0SLASH" + Math.random() + "\0"; + var escOpen = "\0OPEN" + Math.random() + "\0"; + var escClose = "\0CLOSE" + Math.random() + "\0"; + var escComma = "\0COMMA" + Math.random() + "\0"; + var escPeriod = "\0PERIOD" + Math.random() + "\0"; + function numeric(str) { + return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); + } + function escapeBraces(str) { + return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); + } + function unescapeBraces(str) { + return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); + } + function parseCommaParts(str) { + if (!str) + return [""]; + var parts = []; + var m = balanced("{", "}", str); + if (!m) + return str.split(","); + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(","); + p[p.length - 1] += "{" + body + "}"; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; + } + function expandTop(str) { + if (!str) + return []; + if (str.substr(0, 2) === "{}") { + str = "\\{\\}" + str.substr(2); + } + return expand(escapeBraces(str), true).map(unescapeBraces); + } + function embrace(str) { + return "{" + str + "}"; + } + function isPadded(el) { + return /^-?0\d/.test(el); + } + function lte(i, y) { + return i <= y; + } + function gte(i, y) { + return i >= y; + } + function expand(str, isTop) { + var expansions = []; + var m = balanced("{", "}", str); + if (!m || /\$$/.test(m.pre)) return [str]; + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(",") >= 0; + if (!isSequence && !isOptions) { + if (m.post.match(/,.*\}/)) { + str = m.pre + "{" + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length ? expand(m.post, false) : [""]; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + var pre = m.pre; + var post = m.post.length ? expand(m.post, false) : [""]; + var N; + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length); + var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + N = []; + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") + c = ""; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join("0"); + if (i < 0) + c = "-" + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap2(n, function(el) { + return expand(el, false); + }); + } + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + return expansions; + } + return braceExpansion; +} +var minimatch_1; +var hasRequiredMinimatch; +function requireMinimatch() { + if (hasRequiredMinimatch) return minimatch_1; + hasRequiredMinimatch = 1; + minimatch_1 = minimatch2; + minimatch2.Minimatch = Minimatch; + var path2 = function() { + try { + return requirePath(); + } catch (e) { + } + }() || { + sep: "/" + }; + minimatch2.sep = path2.sep; + var GLOBSTAR = minimatch2.GLOBSTAR = Minimatch.GLOBSTAR = {}; + var expand = requireBraceExpansion(); + var plTypes = { + "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, + "?": { open: "(?:", close: ")?" }, + "+": { open: "(?:", close: ")+" }, + "*": { open: "(?:", close: ")*" }, + "@": { open: "(?:", close: ")" } + }; + var qmark = "[^/]"; + var star = qmark + "*?"; + var twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + var twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + var reSpecials = charSet("().*{}+?[]^$\\!"); + function charSet(s) { + return s.split("").reduce(function(set2, c) { + set2[c] = true; + return set2; + }, {}); + } + var slashSplit = /\/+/; + minimatch2.filter = filter; + function filter(pattern, options2) { + options2 = options2 || {}; + return function(p, i, list) { + return minimatch2(p, pattern, options2); + }; + } + function ext(a, b) { + b = b || {}; + var t = {}; + Object.keys(a).forEach(function(k) { + t[k] = a[k]; + }); + Object.keys(b).forEach(function(k) { + t[k] = b[k]; + }); + return t; + } + minimatch2.defaults = function(def) { + if (!def || typeof def !== "object" || !Object.keys(def).length) { + return minimatch2; + } + var orig = minimatch2; + var m = function minimatch3(p, pattern, options2) { + return orig(p, pattern, ext(def, options2)); + }; + m.Minimatch = function Minimatch2(pattern, options2) { + return new orig.Minimatch(pattern, ext(def, options2)); + }; + m.Minimatch.defaults = function defaults(options2) { + return orig.defaults(ext(def, options2)).Minimatch; + }; + m.filter = function filter2(pattern, options2) { + return orig.filter(pattern, ext(def, options2)); + }; + m.defaults = function defaults(options2) { + return orig.defaults(ext(def, options2)); + }; + m.makeRe = function makeRe2(pattern, options2) { + return orig.makeRe(pattern, ext(def, options2)); + }; + m.braceExpand = function braceExpand2(pattern, options2) { + return orig.braceExpand(pattern, ext(def, options2)); + }; + m.match = function(list, pattern, options2) { + return orig.match(list, pattern, ext(def, options2)); + }; + return m; + }; + Minimatch.defaults = function(def) { + return minimatch2.defaults(def).Minimatch; + }; + function minimatch2(p, pattern, options2) { + assertValidPattern(pattern); + if (!options2) options2 = {}; + if (!options2.nocomment && pattern.charAt(0) === "#") { + return false; + } + return new Minimatch(pattern, options2).match(p); + } + function Minimatch(pattern, options2) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options2); + } + assertValidPattern(pattern); + if (!options2) options2 = {}; + pattern = pattern.trim(); + if (!options2.allowWindowsEscape && path2.sep !== "/") { + pattern = pattern.split(path2.sep).join("/"); + } + this.options = options2; + this.set = []; + this.pattern = pattern; + this.regexp = null; + this.negate = false; + this.comment = false; + this.empty = false; + this.partial = !!options2.partial; + this.make(); + } + Minimatch.prototype.debug = function() { + }; + Minimatch.prototype.make = make; + function make() { + var pattern = this.pattern; + var options2 = this.options; + if (!options2.nocomment && pattern.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + this.parseNegate(); + var set2 = this.globSet = this.braceExpand(); + if (options2.debug) this.debug = function debug2() { + console.error.apply(console, arguments); + }; + this.debug(this.pattern, set2); + set2 = this.globParts = set2.map(function(s) { + return s.split(slashSplit); + }); + this.debug(this.pattern, set2); + set2 = set2.map(function(s, si, set3) { + return s.map(this.parse, this); + }, this); + this.debug(this.pattern, set2); + set2 = set2.filter(function(s) { + return s.indexOf(false) === -1; + }); + this.debug(this.pattern, set2); + this.set = set2; + } + Minimatch.prototype.parseNegate = parseNegate; + function parseNegate() { + var pattern = this.pattern; + var negate = false; + var options2 = this.options; + var negateOffset = 0; + if (options2.nonegate) return; + for (var i = 0, l = pattern.length; i < l && pattern.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) this.pattern = pattern.substr(negateOffset); + this.negate = negate; + } + minimatch2.braceExpand = function(pattern, options2) { + return braceExpand(pattern, options2); + }; + Minimatch.prototype.braceExpand = braceExpand; + function braceExpand(pattern, options2) { + if (!options2) { + if (this instanceof Minimatch) { + options2 = this.options; + } else { + options2 = {}; + } + } + pattern = typeof pattern === "undefined" ? this.pattern : pattern; + assertValidPattern(pattern); + if (options2.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + return [pattern]; + } + return expand(pattern); + } + var MAX_PATTERN_LENGTH = 1024 * 64; + var assertValidPattern = function(pattern) { + if (typeof pattern !== "string") { + throw new TypeError("invalid pattern"); + } + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError("pattern is too long"); + } + }; + Minimatch.prototype.parse = parse4; + var SUBPARSE = {}; + function parse4(pattern, isSub) { + assertValidPattern(pattern); + var options2 = this.options; + if (pattern === "**") { + if (!options2.noglobstar) + return GLOBSTAR; + else + pattern = "*"; + } + if (pattern === "") return ""; + var re2 = ""; + var hasMagic = !!options2.nocase; + var escaping = false; + var patternListStack = []; + var negativeLists = []; + var stateChar; + var inClass = false; + var reClassStart = -1; + var classStart = -1; + var patternStart = pattern.charAt(0) === "." ? "" : options2.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + var self2 = this; + function clearStateChar() { + if (stateChar) { + switch (stateChar) { + case "*": + re2 += star; + hasMagic = true; + break; + case "?": + re2 += qmark; + hasMagic = true; + break; + default: + re2 += "\\" + stateChar; + break; + } + self2.debug("clearStateChar %j %j", stateChar, re2); + stateChar = false; + } + } + for (var i = 0, len = pattern.length, c; i < len && (c = pattern.charAt(i)); i++) { + this.debug("%s %s %s %j", pattern, i, re2, c); + if (escaping && reSpecials[c]) { + re2 += "\\" + c; + escaping = false; + continue; + } + switch (c) { + /* istanbul ignore next */ + case "/": { + return false; + } + case "\\": + clearStateChar(); + escaping = true; + continue; + // the various stateChar values + // for the "extglob" stuff. + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s %s %s %j <-- stateChar", pattern, i, re2, c); + if (inClass) { + this.debug(" in class"); + if (c === "!" && i === classStart + 1) c = "^"; + re2 += c; + continue; + } + self2.debug("call clearStateChar %j", stateChar); + clearStateChar(); + stateChar = c; + if (options2.noext) clearStateChar(); + continue; + case "(": + if (inClass) { + re2 += "("; + continue; + } + if (!stateChar) { + re2 += "\\("; + continue; + } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re2.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }); + re2 += stateChar === "!" ? "(?:(?!(?:" : "(?:"; + this.debug("plType %j %j", stateChar, re2); + stateChar = false; + continue; + case ")": + if (inClass || !patternListStack.length) { + re2 += "\\)"; + continue; + } + clearStateChar(); + hasMagic = true; + var pl = patternListStack.pop(); + re2 += pl.close; + if (pl.type === "!") { + negativeLists.push(pl); + } + pl.reEnd = re2.length; + continue; + case "|": + if (inClass || !patternListStack.length || escaping) { + re2 += "\\|"; + escaping = false; + continue; + } + clearStateChar(); + re2 += "|"; + continue; + // these are mostly the same in regexp and glob + case "[": + clearStateChar(); + if (inClass) { + re2 += "\\" + c; + continue; + } + inClass = true; + classStart = i; + reClassStart = re2.length; + re2 += c; + continue; + case "]": + if (i === classStart + 1 || !inClass) { + re2 += "\\" + c; + escaping = false; + continue; + } + var cs = pattern.substring(classStart + 1, i); + try { + RegExp("[" + cs + "]"); + } catch (er) { + var sp = this.parse(cs, SUBPARSE); + re2 = re2.substr(0, reClassStart) + "\\[" + sp[0] + "\\]"; + hasMagic = hasMagic || sp[1]; + inClass = false; + continue; + } + hasMagic = true; + inClass = false; + re2 += c; + continue; + default: + clearStateChar(); + if (escaping) { + escaping = false; + } else if (reSpecials[c] && !(c === "^" && inClass)) { + re2 += "\\"; + } + re2 += c; + } + } + if (inClass) { + cs = pattern.substr(classStart + 1); + sp = this.parse(cs, SUBPARSE); + re2 = re2.substr(0, reClassStart) + "\\[" + sp[0]; + hasMagic = hasMagic || sp[1]; + } + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re2.slice(pl.reStart + pl.open.length); + this.debug("setting tail", re2, pl); + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function(_, $1, $2) { + if (!$2) { + $2 = "\\"; + } + return $1 + $1 + $2 + "|"; + }); + this.debug("tail=%j\n %s", tail, tail, pl, re2); + var t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; + hasMagic = true; + re2 = re2.slice(0, pl.reStart) + t + "\\(" + tail; + } + clearStateChar(); + if (escaping) { + re2 += "\\\\"; + } + var addPatternStart = false; + switch (re2.charAt(0)) { + case "[": + case ".": + case "(": + addPatternStart = true; + } + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n]; + var nlBefore = re2.slice(0, nl.reStart); + var nlFirst = re2.slice(nl.reStart, nl.reEnd - 8); + var nlLast = re2.slice(nl.reEnd - 8, nl.reEnd); + var nlAfter = re2.slice(nl.reEnd); + nlLast += nlAfter; + var openParensBefore = nlBefore.split("(").length - 1; + var cleanAfter = nlAfter; + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, ""); + } + nlAfter = cleanAfter; + var dollar = ""; + if (nlAfter === "" && isSub !== SUBPARSE) { + dollar = "$"; + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast; + re2 = newRe; + } + if (re2 !== "" && hasMagic) { + re2 = "(?=.)" + re2; + } + if (addPatternStart) { + re2 = patternStart + re2; + } + if (isSub === SUBPARSE) { + return [re2, hasMagic]; + } + if (!hasMagic) { + return globUnescape(pattern); + } + var flags = options2.nocase ? "i" : ""; + try { + var regExp = new RegExp("^" + re2 + "$", flags); + } catch (er) { + return new RegExp("$."); + } + regExp._glob = pattern; + regExp._src = re2; + return regExp; + } + minimatch2.makeRe = function(pattern, options2) { + return new Minimatch(pattern, options2 || {}).makeRe(); + }; + Minimatch.prototype.makeRe = makeRe; + function makeRe() { + if (this.regexp || this.regexp === false) return this.regexp; + var set2 = this.set; + if (!set2.length) { + this.regexp = false; + return this.regexp; + } + var options2 = this.options; + var twoStar = options2.noglobstar ? star : options2.dot ? twoStarDot : twoStarNoDot; + var flags = options2.nocase ? "i" : ""; + var re2 = set2.map(function(pattern) { + return pattern.map(function(p) { + return p === GLOBSTAR ? twoStar : typeof p === "string" ? regExpEscape(p) : p._src; + }).join("\\/"); + }).join("|"); + re2 = "^(?:" + re2 + ")$"; + if (this.negate) re2 = "^(?!" + re2 + ").*$"; + try { + this.regexp = new RegExp(re2, flags); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + minimatch2.match = function(list, pattern, options2) { + options2 = options2 || {}; + var mm = new Minimatch(pattern, options2); + list = list.filter(function(f) { + return mm.match(f); + }); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; + }; + Minimatch.prototype.match = function match(f, partial) { + if (typeof partial === "undefined") partial = this.partial; + this.debug("match", f, this.pattern); + if (this.comment) return false; + if (this.empty) return f === ""; + if (f === "/" && partial) return true; + var options2 = this.options; + if (path2.sep !== "/") { + f = f.split(path2.sep).join("/"); + } + f = f.split(slashSplit); + this.debug(this.pattern, "split", f); + var set2 = this.set; + this.debug(this.pattern, "set", set2); + var filename; + var i; + for (i = f.length - 1; i >= 0; i--) { + filename = f[i]; + if (filename) break; + } + for (i = 0; i < set2.length; i++) { + var pattern = set2[i]; + var file = f; + if (options2.matchBase && pattern.length === 1) { + file = [filename]; + } + var hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options2.flipNegate) return true; + return !this.negate; + } + } + if (options2.flipNegate) return false; + return this.negate; + }; + Minimatch.prototype.matchOne = function(file, pattern, partial) { + var options2 = this.options; + this.debug( + "matchOne", + { "this": this, file, pattern } + ); + this.debug("matchOne", file.length, pattern.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern[pi]; + var f = file[fi]; + this.debug(pattern, p, f); + if (p === false) return false; + if (p === GLOBSTAR) { + this.debug("GLOBSTAR", [pattern, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (; fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options2.dot && file[fi].charAt(0) === ".") return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options2.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial) { + this.debug("\n>>> no match, partial?", file, fr, pattern, pr); + if (fr === fl) return true; + } + return false; + } + var hit; + if (typeof p === "string") { + hit = f === p; + this.debug("string match", p, f, hit); + } else { + hit = f.match(p); + this.debug("pattern match", p, f, hit); + } + if (!hit) return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial; + } else if (pi === pl) { + return fi === fl - 1 && file[fi] === ""; + } + throw new Error("wtf?"); + }; + function globUnescape(s) { + return s.replace(/\\(.)/g, "$1"); + } + function regExpEscape(s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + return minimatch_1; +} +var minimatchExports = requireMinimatch(); +const minimatchLibrary = /* @__PURE__ */ getDefaultExportFromCjs(minimatchExports); +const require$$1 = /* @__PURE__ */ getAugmentedNamespace(child_process$1); +var isWsl = { exports: {} }; +var isDocker_1; +var hasRequiredIsDocker; +function requireIsDocker() { + if (hasRequiredIsDocker) return isDocker_1; + hasRequiredIsDocker = 1; + const fs2 = require$$2$1; + let isDocker; + function hasDockerEnv() { + try { + fs2.statSync("/.dockerenv"); + return true; + } catch (_) { + return false; + } + } + function hasDockerCGroup() { + try { + return fs2.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); + } catch (_) { + return false; + } + } + isDocker_1 = () => { + if (isDocker === void 0) { + isDocker = hasDockerEnv() || hasDockerCGroup(); + } + return isDocker; + }; + return isDocker_1; +} +var hasRequiredIsWsl; +function requireIsWsl() { + if (hasRequiredIsWsl) return isWsl.exports; + hasRequiredIsWsl = 1; + const os2 = requireBrowser$g(); + const fs2 = require$$2$1; + const isDocker = requireIsDocker(); + const isWsl$1 = () => { + if (process.platform !== "linux") { + return false; + } + if (os2.release().toLowerCase().includes("microsoft")) { + if (isDocker()) { + return false; + } + return true; + } + try { + return fs2.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft") ? !isDocker() : false; + } catch (_) { + return false; + } + }; + if (define_process_env_default.__IS_WSL_TEST__) { + isWsl.exports = isWsl$1; + } else { + isWsl.exports = isWsl$1(); + } + return isWsl.exports; +} +var defineLazyProp; +var hasRequiredDefineLazyProp; +function requireDefineLazyProp() { + if (hasRequiredDefineLazyProp) return defineLazyProp; + hasRequiredDefineLazyProp = 1; + defineLazyProp = (object, propertyName, fn) => { + const define = (value) => Object.defineProperty(object, propertyName, { value, enumerable: true, writable: true }); + Object.defineProperty(object, propertyName, { + configurable: true, + enumerable: true, + get() { + const result = fn(); + define(result); + return result; + }, + set(value) { + define(value); + } + }); + return object; + }; + return defineLazyProp; +} +var open_1; +var hasRequiredOpen; +function requireOpen() { + if (hasRequiredOpen) return open_1; + hasRequiredOpen = 1; + const path2 = requirePath(); + const childProcess = require$$1; + const { promises: fs2, constants: fsConstants } = require$$2$1; + const isWsl2 = requireIsWsl(); + const isDocker = requireIsDocker(); + const defineLazyProperty = requireDefineLazyProp(); + const localXdgOpenPath = path2.join(__dirname, "xdg-open"); + const { platform, arch } = process; + const getWslDrivesMountPoint = /* @__PURE__ */ (() => { + const defaultMountPoint = "/mnt/"; + let mountPoint; + return async function() { + if (mountPoint) { + return mountPoint; + } + const configFilePath = "/etc/wsl.conf"; + let isConfigFileExists = false; + try { + await fs2.access(configFilePath, fsConstants.F_OK); + isConfigFileExists = true; + } catch { + } + if (!isConfigFileExists) { + return defaultMountPoint; + } + const configContent = await fs2.readFile(configFilePath, { encoding: "utf8" }); + const configMountPoint = new RegExp("(?.*)", "g").exec(configContent); + if (!configMountPoint) { + return defaultMountPoint; + } + mountPoint = configMountPoint.groups.mountPoint.trim(); + mountPoint = mountPoint.endsWith("/") ? mountPoint : `${mountPoint}/`; + return mountPoint; + }; + })(); + const pTryEach = async (array, mapper) => { + let latestError; + for (const item of array) { + try { + return await mapper(item); + } catch (error2) { + latestError = error2; + } + } + throw latestError; + }; + const baseOpen = async (options2) => { + options2 = { + wait: false, + background: false, + newInstance: false, + allowNonzeroExitCode: false, + ...options2 + }; + if (Array.isArray(options2.app)) { + return pTryEach(options2.app, (singleApp) => baseOpen({ + ...options2, + app: singleApp + })); + } + let { name: app, arguments: appArguments = [] } = options2.app || {}; + appArguments = [...appArguments]; + if (Array.isArray(app)) { + return pTryEach(app, (appName) => baseOpen({ + ...options2, + app: { + name: appName, + arguments: appArguments + } + })); + } + let command2; + const cliArguments = []; + const childProcessOptions = {}; + if (platform === "darwin") { + command2 = "open"; + if (options2.wait) { + cliArguments.push("--wait-apps"); + } + if (options2.background) { + cliArguments.push("--background"); + } + if (options2.newInstance) { + cliArguments.push("--new"); + } + if (app) { + cliArguments.push("-a", app); + } + } else if (platform === "win32" || isWsl2 && !isDocker()) { + const mountPoint = await getWslDrivesMountPoint(); + command2 = isWsl2 ? `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe` : `${define_process_env_default.SYSTEMROOT}\\System32\\WindowsPowerShell\\v1.0\\powershell`; + cliArguments.push( + "-NoProfile", + "-NonInteractive", + "–ExecutionPolicy", + "Bypass", + "-EncodedCommand" + ); + if (!isWsl2) { + childProcessOptions.windowsVerbatimArguments = true; + } + const encodedArguments = ["Start"]; + if (options2.wait) { + encodedArguments.push("-Wait"); + } + if (app) { + encodedArguments.push(`"\`"${app}\`""`, "-ArgumentList"); + if (options2.target) { + appArguments.unshift(options2.target); + } + } else if (options2.target) { + encodedArguments.push(`"${options2.target}"`); + } + if (appArguments.length > 0) { + appArguments = appArguments.map((arg) => `"\`"${arg}\`""`); + encodedArguments.push(appArguments.join(",")); + } + options2.target = Buffer.from(encodedArguments.join(" "), "utf16le").toString("base64"); + } else { + if (app) { + command2 = app; + } else { + const isBundled = !__dirname || __dirname === "/"; + let exeLocalXdgOpen = false; + try { + await fs2.access(localXdgOpenPath, fsConstants.X_OK); + exeLocalXdgOpen = true; + } catch { + } + const useSystemXdgOpen = process.versions.electron || platform === "android" || isBundled || !exeLocalXdgOpen; + command2 = useSystemXdgOpen ? "xdg-open" : localXdgOpenPath; + } + if (appArguments.length > 0) { + cliArguments.push(...appArguments); + } + if (!options2.wait) { + childProcessOptions.stdio = "ignore"; + childProcessOptions.detached = true; + } + } + if (options2.target) { + cliArguments.push(options2.target); + } + if (platform === "darwin" && appArguments.length > 0) { + cliArguments.push("--args", ...appArguments); + } + const subprocess = childProcess.spawn(command2, cliArguments, childProcessOptions); + if (options2.wait) { + return new Promise((resolve, reject) => { + subprocess.once("error", reject); + subprocess.once("close", (exitCode) => { + if (options2.allowNonzeroExitCode && exitCode > 0) { + reject(new Error(`Exited with code ${exitCode}`)); + return; + } + resolve(subprocess); + }); + }); + } + subprocess.unref(); + return subprocess; + }; + const open2 = (target, options2) => { + if (typeof target !== "string") { + throw new TypeError("Expected a `target`"); + } + return baseOpen({ + ...options2, + target + }); + }; + const openApp = (name, options2) => { + if (typeof name !== "string") { + throw new TypeError("Expected a `name`"); + } + const { arguments: appArguments = [] } = options2 || {}; + if (appArguments !== void 0 && appArguments !== null && !Array.isArray(appArguments)) { + throw new TypeError("Expected `appArguments` as Array type"); + } + return baseOpen({ + ...options2, + app: { + name, + arguments: appArguments + } + }); + }; + function detectArchBinary(binary2) { + if (typeof binary2 === "string" || Array.isArray(binary2)) { + return binary2; + } + const { [arch]: archBinary } = binary2; + if (!archBinary) { + throw new Error(`${arch} is not supported`); + } + return archBinary; + } + function detectPlatformBinary({ [platform]: platformBinary }, { wsl }) { + if (wsl && isWsl2) { + return detectArchBinary(wsl); + } + if (!platformBinary) { + throw new Error(`${platform} is not supported`); + } + return detectArchBinary(platformBinary); + } + const apps = {}; + defineLazyProperty(apps, "chrome", () => detectPlatformBinary({ + darwin: "google chrome", + win32: "chrome", + linux: ["google-chrome", "google-chrome-stable", "chromium"] + }, { + wsl: { + ia32: "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe", + x64: ["/mnt/c/Program Files/Google/Chrome/Application/chrome.exe", "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"] + } + })); + defineLazyProperty(apps, "firefox", () => detectPlatformBinary({ + darwin: "firefox", + win32: "C:\\Program Files\\Mozilla Firefox\\firefox.exe", + linux: "firefox" + }, { + wsl: "/mnt/c/Program Files/Mozilla Firefox/firefox.exe" + })); + defineLazyProperty(apps, "edge", () => detectPlatformBinary({ + darwin: "microsoft edge", + win32: "msedge", + linux: ["microsoft-edge", "microsoft-edge-dev"] + }, { + wsl: "/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" + })); + open2.apps = apps; + open2.openApp = openApp; + open_1 = open2; + return open_1; +} +var openExports = requireOpen(); +const openLibrary = /* @__PURE__ */ getDefaultExportFromCjs(openExports); +var png = {}; +var parserAsync = { exports: {} }; +var lib = {}; +var binding = {}; +var zstream; +var hasRequiredZstream; +function requireZstream() { + if (hasRequiredZstream) return zstream; + hasRequiredZstream = 1; + function ZStream() { + this.input = null; + this.next_in = 0; + this.avail_in = 0; + this.total_in = 0; + this.output = null; + this.next_out = 0; + this.avail_out = 0; + this.total_out = 0; + this.msg = ""; + this.state = null; + this.data_type = 2; + this.adler = 0; + } + zstream = ZStream; + return zstream; +} +var deflate = {}; +var common$1 = {}; +var hasRequiredCommon$1; +function requireCommon$1() { + if (hasRequiredCommon$1) return common$1; + hasRequiredCommon$1 = 1; + (function(exports) { + var TYPED_OK = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Int32Array !== "undefined"; + function _has(obj, key2) { + return Object.prototype.hasOwnProperty.call(obj, key2); + } + exports.assign = function(obj) { + var sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + var source2 = sources.shift(); + if (!source2) { + continue; + } + if (typeof source2 !== "object") { + throw new TypeError(source2 + "must be non-object"); + } + for (var p in source2) { + if (_has(source2, p)) { + obj[p] = source2[p]; + } + } + } + return obj; + }; + exports.shrinkBuf = function(buf, size) { + if (buf.length === size) { + return buf; + } + if (buf.subarray) { + return buf.subarray(0, size); + } + buf.length = size; + return buf; + }; + var fnTyped = { + arraySet: function(dest, src2, src_offs, len, dest_offs) { + if (src2.subarray && dest.subarray) { + dest.set(src2.subarray(src_offs, src_offs + len), dest_offs); + return; + } + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src2[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function(chunks) { + var i, l, len, pos, chunk, result; + len = 0; + for (i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + result = new Uint8Array(len); + pos = 0; + for (i = 0, l = chunks.length; i < l; i++) { + chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + return result; + } + }; + var fnUntyped = { + arraySet: function(dest, src2, src_offs, len, dest_offs) { + for (var i = 0; i < len; i++) { + dest[dest_offs + i] = src2[src_offs + i]; + } + }, + // Join array of chunks to single array. + flattenChunks: function(chunks) { + return [].concat.apply([], chunks); + } + }; + exports.setTyped = function(on) { + if (on) { + exports.Buf8 = Uint8Array; + exports.Buf16 = Uint16Array; + exports.Buf32 = Int32Array; + exports.assign(exports, fnTyped); + } else { + exports.Buf8 = Array; + exports.Buf16 = Array; + exports.Buf32 = Array; + exports.assign(exports, fnUntyped); + } + }; + exports.setTyped(TYPED_OK); + })(common$1); + return common$1; +} +var trees = {}; +var hasRequiredTrees; +function requireTrees() { + if (hasRequiredTrees) return trees; + hasRequiredTrees = 1; + var utils2 = requireCommon$1(); + var Z_FIXED = 4; + var Z_BINARY = 0; + var Z_TEXT = 1; + var Z_UNKNOWN = 2; + function zero(buf) { + var len = buf.length; + while (--len >= 0) { + buf[len] = 0; + } + } + var STORED_BLOCK = 0; + var STATIC_TREES = 1; + var DYN_TREES = 2; + var MIN_MATCH = 3; + var MAX_MATCH = 258; + var LENGTH_CODES = 29; + var LITERALS = 256; + var L_CODES = LITERALS + 1 + LENGTH_CODES; + var D_CODES = 30; + var BL_CODES = 19; + var HEAP_SIZE = 2 * L_CODES + 1; + var MAX_BITS = 15; + var Buf_size = 16; + var MAX_BL_BITS = 7; + var END_BLOCK = 256; + var REP_3_6 = 16; + var REPZ_3_10 = 17; + var REPZ_11_138 = 18; + var extra_lbits = ( + /* extra bits for each length code */ + [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0] + ); + var extra_dbits = ( + /* extra bits for each distance code */ + [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13] + ); + var extra_blbits = ( + /* extra bits for each bit length code */ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7] + ); + var bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + var DIST_CODE_LEN = 512; + var static_ltree = new Array((L_CODES + 2) * 2); + zero(static_ltree); + var static_dtree = new Array(D_CODES * 2); + zero(static_dtree); + var _dist_code = new Array(DIST_CODE_LEN); + zero(_dist_code); + var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); + zero(_length_code); + var base_length = new Array(LENGTH_CODES); + zero(base_length); + var base_dist = new Array(D_CODES); + zero(base_dist); + function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + this.static_tree = static_tree; + this.extra_bits = extra_bits; + this.extra_base = extra_base; + this.elems = elems; + this.max_length = max_length; + this.has_stree = static_tree && static_tree.length; + } + var static_l_desc; + var static_d_desc; + var static_bl_desc; + function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; + this.max_code = 0; + this.stat_desc = stat_desc; + } + function d_code(dist2) { + return dist2 < 256 ? _dist_code[dist2] : _dist_code[256 + (dist2 >>> 7)]; + } + function put_short(s, w) { + s.pending_buf[s.pending++] = w & 255; + s.pending_buf[s.pending++] = w >>> 8 & 255; + } + function send_bits(s, value, length) { + if (s.bi_valid > Buf_size - length) { + s.bi_buf |= value << s.bi_valid & 65535; + put_short(s, s.bi_buf); + s.bi_buf = value >> Buf_size - s.bi_valid; + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= value << s.bi_valid & 65535; + s.bi_valid += length; + } + } + function send_code(s, c, tree) { + send_bits( + s, + tree[c * 2], + tree[c * 2 + 1] + /*.Len*/ + ); + } + function bi_reverse(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; + } + function bi_flush(s) { + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 255; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } + } + function gen_bitlen(s, desc) { + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base2 = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; + var n, m; + var bits; + var xbits; + var f; + var overflow = 0; + for (bits = 0; bits <= MAX_BITS; bits++) { + s.bl_count[bits] = 0; + } + tree[s.heap[s.heap_max] * 2 + 1] = 0; + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1] = bits; + if (n > max_code) { + continue; + } + s.bl_count[bits]++; + xbits = 0; + if (n >= base2) { + xbits = extra[n - base2]; + } + f = tree[n * 2]; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1] + xbits); + } + } + if (overflow === 0) { + return; + } + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { + bits--; + } + s.bl_count[bits]--; + s.bl_count[bits + 1] += 2; + s.bl_count[max_length]--; + overflow -= 2; + } while (overflow > 0); + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { + continue; + } + if (tree[m * 2 + 1] !== bits) { + s.opt_len += (bits - tree[m * 2 + 1]) * tree[m * 2]; + tree[m * 2 + 1] = bits; + } + n--; + } + } + } + function gen_codes(tree, max_code, bl_count) { + var next_code = new Array(MAX_BITS + 1); + var code = 0; + var bits; + var n; + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = code + bl_count[bits - 1] << 1; + } + for (n = 0; n <= max_code; n++) { + var len = tree[n * 2 + 1]; + if (len === 0) { + continue; + } + tree[n * 2] = bi_reverse(next_code[len]++, len); + } + } + function tr_static_init() { + var n; + var bits; + var length; + var code; + var dist2; + var bl_count = new Array(MAX_BITS + 1); + length = 0; + for (code = 0; code < LENGTH_CODES - 1; code++) { + base_length[code] = length; + for (n = 0; n < 1 << extra_lbits[code]; n++) { + _length_code[length++] = code; + } + } + _length_code[length - 1] = code; + dist2 = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist2; + for (n = 0; n < 1 << extra_dbits[code]; n++) { + _dist_code[dist2++] = code; + } + } + dist2 >>= 7; + for (; code < D_CODES; code++) { + base_dist[code] = dist2 << 7; + for (n = 0; n < 1 << extra_dbits[code] - 7; n++) { + _dist_code[256 + dist2++] = code; + } + } + for (bits = 0; bits <= MAX_BITS; bits++) { + bl_count[bits] = 0; + } + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1] = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1] = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1] = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1] = 8; + n++; + bl_count[8]++; + } + gen_codes(static_ltree, L_CODES + 1, bl_count); + for (n = 0; n < D_CODES; n++) { + static_dtree[n * 2 + 1] = 5; + static_dtree[n * 2] = bi_reverse(n, 5); + } + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); + } + function init_block(s) { + var n; + for (n = 0; n < L_CODES; n++) { + s.dyn_ltree[n * 2] = 0; + } + for (n = 0; n < D_CODES; n++) { + s.dyn_dtree[n * 2] = 0; + } + for (n = 0; n < BL_CODES; n++) { + s.bl_tree[n * 2] = 0; + } + s.dyn_ltree[END_BLOCK * 2] = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; + } + function bi_windup(s) { + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; + } + function copy_block(s, buf, len, header) { + bi_windup(s); + { + put_short(s, len); + put_short(s, ~len); + } + utils2.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; + } + function smaller(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return tree[_n2] < tree[_m2] || tree[_n2] === tree[_m2] && depth[n] <= depth[m]; + } + function pqdownheap(s, tree, k) { + var v = s.heap[k]; + var j = k << 1; + while (j <= s.heap_len) { + if (j < s.heap_len && smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + if (smaller(tree, v, s.heap[j], s.depth)) { + break; + } + s.heap[k] = s.heap[j]; + k = j; + j <<= 1; + } + s.heap[k] = v; + } + function compress_block(s, ltree, dtree) { + var dist2; + var lc; + var lx = 0; + var code; + var extra; + if (s.last_lit !== 0) { + do { + dist2 = s.pending_buf[s.d_buf + lx * 2] << 8 | s.pending_buf[s.d_buf + lx * 2 + 1]; + lc = s.pending_buf[s.l_buf + lx]; + lx++; + if (dist2 === 0) { + send_code(s, lc, ltree); + } else { + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); + } + dist2--; + code = d_code(dist2); + send_code(s, code, dtree); + extra = extra_dbits[code]; + if (extra !== 0) { + dist2 -= base_dist[code]; + send_bits(s, dist2, extra); + } + } + } while (lx < s.last_lit); + } + send_code(s, END_BLOCK, ltree); + } + function build_tree(s, desc) { + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; + var max_code = -1; + var node2; + s.heap_len = 0; + s.heap_max = HEAP_SIZE; + for (n = 0; n < elems; n++) { + if (tree[n * 2] !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + } else { + tree[n * 2 + 1] = 0; + } + } + while (s.heap_len < 2) { + node2 = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0; + tree[node2 * 2] = 1; + s.depth[node2] = 0; + s.opt_len--; + if (has_stree) { + s.static_len -= stree[node2 * 2 + 1]; + } + } + desc.max_code = max_code; + for (n = s.heap_len >> 1; n >= 1; n--) { + pqdownheap(s, tree, n); + } + node2 = elems; + do { + n = s.heap[ + 1 + /*SMALLEST*/ + ]; + s.heap[ + 1 + /*SMALLEST*/ + ] = s.heap[s.heap_len--]; + pqdownheap( + s, + tree, + 1 + /*SMALLEST*/ + ); + m = s.heap[ + 1 + /*SMALLEST*/ + ]; + s.heap[--s.heap_max] = n; + s.heap[--s.heap_max] = m; + tree[node2 * 2] = tree[n * 2] + tree[m * 2]; + s.depth[node2] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1] = tree[m * 2 + 1] = node2; + s.heap[ + 1 + /*SMALLEST*/ + ] = node2++; + pqdownheap( + s, + tree, + 1 + /*SMALLEST*/ + ); + } while (s.heap_len >= 2); + s.heap[--s.heap_max] = s.heap[ + 1 + /*SMALLEST*/ + ]; + gen_bitlen(s, desc); + gen_codes(tree, max_code, s.bl_count); + } + function scan_tree(s, tree, max_code) { + var n; + var prevlen = -1; + var curlen; + var nextlen = tree[0 * 2 + 1]; + var count = 0; + var max_count = 7; + var min_count = 4; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1] = 65535; + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]; + if (++count < max_count && curlen === nextlen) { + continue; + } else if (count < min_count) { + s.bl_tree[curlen * 2] += count; + } else if (curlen !== 0) { + if (curlen !== prevlen) { + s.bl_tree[curlen * 2]++; + } + s.bl_tree[REP_3_6 * 2]++; + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]++; + } else { + s.bl_tree[REPZ_11_138 * 2]++; + } + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + function send_tree(s, tree, max_code) { + var n; + var prevlen = -1; + var curlen; + var nextlen = tree[0 * 2 + 1]; + var count = 0; + var max_count = 7; + var min_count = 4; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]; + if (++count < max_count && curlen === nextlen) { + continue; + } else if (count < min_count) { + do { + send_code(s, curlen, s.bl_tree); + } while (--count !== 0); + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + function build_bl_tree(s) { + var max_blindex; + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); + build_tree(s, s.bl_desc); + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1] !== 0) { + break; + } + } + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + return max_blindex; + } + function send_all_trees(s, lcodes, dcodes, blcodes) { + var rank; + send_bits(s, lcodes - 257, 5); + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); + for (rank = 0; rank < blcodes; rank++) { + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1], 3); + } + send_tree(s, s.dyn_ltree, lcodes - 1); + send_tree(s, s.dyn_dtree, dcodes - 1); + } + function detect_data_type(s) { + var black_mask = 4093624447; + var n; + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if (black_mask & 1 && s.dyn_ltree[n * 2] !== 0) { + return Z_BINARY; + } + } + if (s.dyn_ltree[9 * 2] !== 0 || s.dyn_ltree[10 * 2] !== 0 || s.dyn_ltree[13 * 2] !== 0) { + return Z_TEXT; + } + for (n = 32; n < LITERALS; n++) { + if (s.dyn_ltree[n * 2] !== 0) { + return Z_TEXT; + } + } + return Z_BINARY; + } + var static_init_done = false; + function _tr_init(s) { + if (!static_init_done) { + tr_static_init(); + static_init_done = true; + } + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); + s.bi_buf = 0; + s.bi_valid = 0; + init_block(s); + } + function _tr_stored_block(s, buf, stored_len, last) { + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); + copy_block(s, buf, stored_len); + } + function _tr_align(s) { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); + } + function _tr_flush_block(s, buf, stored_len, last) { + var opt_lenb, static_lenb; + var max_blindex = 0; + if (s.level > 0) { + if (s.strm.data_type === Z_UNKNOWN) { + s.strm.data_type = detect_data_type(s); + } + build_tree(s, s.l_desc); + build_tree(s, s.d_desc); + max_blindex = build_bl_tree(s); + opt_lenb = s.opt_len + 3 + 7 >>> 3; + static_lenb = s.static_len + 3 + 7 >>> 3; + if (static_lenb <= opt_lenb) { + opt_lenb = static_lenb; + } + } else { + opt_lenb = static_lenb = stored_len + 5; + } + if (stored_len + 4 <= opt_lenb && buf !== -1) { + _tr_stored_block(s, buf, stored_len, last); + } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); + } + init_block(s); + if (last) { + bi_windup(s); + } + } + function _tr_tally(s, dist2, lc) { + s.pending_buf[s.d_buf + s.last_lit * 2] = dist2 >>> 8 & 255; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist2 & 255; + s.pending_buf[s.l_buf + s.last_lit] = lc & 255; + s.last_lit++; + if (dist2 === 0) { + s.dyn_ltree[lc * 2]++; + } else { + s.matches++; + dist2--; + s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]++; + s.dyn_dtree[d_code(dist2) * 2]++; + } + return s.last_lit === s.lit_bufsize - 1; + } + trees._tr_init = _tr_init; + trees._tr_stored_block = _tr_stored_block; + trees._tr_flush_block = _tr_flush_block; + trees._tr_tally = _tr_tally; + trees._tr_align = _tr_align; + return trees; +} +var adler32_1; +var hasRequiredAdler32; +function requireAdler32() { + if (hasRequiredAdler32) return adler32_1; + hasRequiredAdler32 = 1; + function adler32(adler, buf, len, pos) { + var s1 = adler & 65535 | 0, s2 = adler >>> 16 & 65535 | 0, n = 0; + while (len !== 0) { + n = len > 2e3 ? 2e3 : len; + len -= n; + do { + s1 = s1 + buf[pos++] | 0; + s2 = s2 + s1 | 0; + } while (--n); + s1 %= 65521; + s2 %= 65521; + } + return s1 | s2 << 16 | 0; + } + adler32_1 = adler32; + return adler32_1; +} +var crc32_1; +var hasRequiredCrc32; +function requireCrc32() { + if (hasRequiredCrc32) return crc32_1; + hasRequiredCrc32 = 1; + function makeTable() { + var c, table = []; + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1; + } + table[n] = c; + } + return table; + } + var crcTable = makeTable(); + function crc32(crc2, buf, len, pos) { + var t = crcTable, end = pos + len; + crc2 ^= -1; + for (var i = pos; i < end; i++) { + crc2 = crc2 >>> 8 ^ t[(crc2 ^ buf[i]) & 255]; + } + return crc2 ^ -1; + } + crc32_1 = crc32; + return crc32_1; +} +var messages; +var hasRequiredMessages; +function requireMessages() { + if (hasRequiredMessages) return messages; + hasRequiredMessages = 1; + messages = { + 2: "need dictionary", + /* Z_NEED_DICT 2 */ + 1: "stream end", + /* Z_STREAM_END 1 */ + 0: "", + /* Z_OK 0 */ + "-1": "file error", + /* Z_ERRNO (-1) */ + "-2": "stream error", + /* Z_STREAM_ERROR (-2) */ + "-3": "data error", + /* Z_DATA_ERROR (-3) */ + "-4": "insufficient memory", + /* Z_MEM_ERROR (-4) */ + "-5": "buffer error", + /* Z_BUF_ERROR (-5) */ + "-6": "incompatible version" + /* Z_VERSION_ERROR (-6) */ + }; + return messages; +} +var hasRequiredDeflate; +function requireDeflate() { + if (hasRequiredDeflate) return deflate; + hasRequiredDeflate = 1; + var utils2 = requireCommon$1(); + var trees2 = requireTrees(); + var adler32 = requireAdler32(); + var crc32 = requireCrc32(); + var msg = requireMessages(); + var Z_NO_FLUSH = 0; + var Z_PARTIAL_FLUSH = 1; + var Z_FULL_FLUSH = 3; + var Z_FINISH = 4; + var Z_BLOCK = 5; + var Z_OK = 0; + var Z_STREAM_END = 1; + var Z_STREAM_ERROR = -2; + var Z_DATA_ERROR = -3; + var Z_BUF_ERROR = -5; + var Z_DEFAULT_COMPRESSION = -1; + var Z_FILTERED = 1; + var Z_HUFFMAN_ONLY = 2; + var Z_RLE = 3; + var Z_FIXED = 4; + var Z_DEFAULT_STRATEGY = 0; + var Z_UNKNOWN = 2; + var Z_DEFLATED = 8; + var MAX_MEM_LEVEL = 9; + var MAX_WBITS = 15; + var DEF_MEM_LEVEL = 8; + var LENGTH_CODES = 29; + var LITERALS = 256; + var L_CODES = LITERALS + 1 + LENGTH_CODES; + var D_CODES = 30; + var BL_CODES = 19; + var HEAP_SIZE = 2 * L_CODES + 1; + var MAX_BITS = 15; + var MIN_MATCH = 3; + var MAX_MATCH = 258; + var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; + var PRESET_DICT = 32; + var INIT_STATE = 42; + var EXTRA_STATE = 69; + var NAME_STATE = 73; + var COMMENT_STATE = 91; + var HCRC_STATE = 103; + var BUSY_STATE = 113; + var FINISH_STATE = 666; + var BS_NEED_MORE = 1; + var BS_BLOCK_DONE = 2; + var BS_FINISH_STARTED = 3; + var BS_FINISH_DONE = 4; + var OS_CODE = 3; + function err(strm, errorCode) { + strm.msg = msg[errorCode]; + return errorCode; + } + function rank(f) { + return (f << 1) - (f > 4 ? 9 : 0); + } + function zero(buf) { + var len = buf.length; + while (--len >= 0) { + buf[len] = 0; + } + } + function flush_pending(strm) { + var s = strm.state; + var len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { + return; + } + utils2.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; + } + } + function flush_block_only(s, last) { + trees2._tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending(s.strm); + } + function put_byte(s, b) { + s.pending_buf[s.pending++] = b; + } + function putShortMSB(s, b) { + s.pending_buf[s.pending++] = b >>> 8 & 255; + s.pending_buf[s.pending++] = b & 255; + } + function read_buf(strm, buf, start, size) { + var len = strm.avail_in; + if (len > size) { + len = size; + } + if (len === 0) { + return 0; + } + strm.avail_in -= len; + utils2.arraySet(buf, strm.input, strm.next_in, len, start); + if (strm.state.wrap === 1) { + strm.adler = adler32(strm.adler, buf, len, start); + } else if (strm.state.wrap === 2) { + strm.adler = crc32(strm.adler, buf, len, start); + } + strm.next_in += len; + strm.total_in += len; + return len; + } + function longest_match(s, cur_match) { + var chain_length = s.max_chain_length; + var scan = s.strstart; + var match; + var len; + var best_len = s.prev_length; + var nice_match = s.nice_match; + var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0; + var _win = s.window; + var wmask = s.w_mask; + var prev = s.prev; + var strend = s.strstart + MAX_MATCH; + var scan_end1 = _win[scan + best_len - 1]; + var scan_end = _win[scan + best_len]; + if (s.prev_length >= s.good_match) { + chain_length >>= 2; + } + if (nice_match > s.lookahead) { + nice_match = s.lookahead; + } + do { + match = cur_match; + if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) { + continue; + } + scan += 2; + match++; + do { + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend); + len = MAX_MATCH - (strend - scan); + scan = strend - MAX_MATCH; + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { + break; + } + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; + } + function fill_window(s) { + var _w_size = s.w_size; + var p, n, m, more, str; + do { + more = s.window_size - s.lookahead - s.strstart; + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { + utils2.arraySet(s.window, s.window, _w_size, _w_size, 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + s.block_start -= _w_size; + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = m >= _w_size ? m - _w_size : 0; + } while (--n); + n = _w_size; + p = n; + do { + m = s.prev[--p]; + s.prev[p] = m >= _w_size ? m - _w_size : 0; + } while (--n); + more += _w_size; + } + if (s.strm.avail_in === 0) { + break; + } + n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + if (s.lookahead + s.insert >= MIN_MATCH) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask; + while (s.insert) { + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH) { + break; + } + } + } + } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); + } + function deflate_stored(s, flush) { + var max_block_size = 65535; + if (max_block_size > s.pending_buf_size - 5) { + max_block_size = s.pending_buf_size - 5; + } + for (; ; ) { + if (s.lookahead <= 1) { + fill_window(s); + if (s.lookahead === 0 && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; + } + } + s.strstart += s.lookahead; + s.lookahead = 0; + var max_start = s.block_start + max_block_size; + if (s.strstart === 0 || s.strstart >= max_start) { + s.lookahead = s.strstart - max_start; + s.strstart = max_start; + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + if (s.strstart - s.block_start >= s.w_size - MIN_LOOKAHEAD) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + } + s.insert = 0; + if (flush === Z_FINISH) { + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + return BS_FINISH_DONE; + } + if (s.strstart > s.block_start) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + return BS_NEED_MORE; + } + function deflate_fast(s, flush) { + var hash_head; + var bflush; + for (; ; ) { + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; + } + } + hash_head = 0; + if (s.lookahead >= MIN_MATCH) { + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + } + if (hash_head !== 0 && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { + s.match_length = longest_match(s, hash_head); + } + if (s.match_length >= MIN_MATCH) { + bflush = trees2._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); + s.lookahead -= s.match_length; + if (s.match_length <= s.max_lazy_match && s.lookahead >= MIN_MATCH) { + s.match_length--; + do { + s.strstart++; + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + } while (--s.match_length !== 0); + s.strstart++; + } else { + s.strstart += s.match_length; + s.match_length = 0; + s.ins_h = s.window[s.strstart]; + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask; + } + } else { + bflush = trees2._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + } + if (bflush) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + } + s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; + if (flush === Z_FINISH) { + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + return BS_FINISH_DONE; + } + if (s.last_lit) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + return BS_BLOCK_DONE; + } + function deflate_slow(s, flush) { + var hash_head; + var bflush; + var max_insert; + for (; ; ) { + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; + } + } + hash_head = 0; + if (s.lookahead >= MIN_MATCH) { + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + } + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH - 1; + if (hash_head !== 0 && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) { + s.match_length = longest_match(s, hash_head); + if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096)) { + s.match_length = MIN_MATCH - 1; + } + } + if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH; + bflush = trees2._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + } + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH - 1; + s.strstart++; + if (bflush) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + } else if (s.match_available) { + bflush = trees2._tr_tally(s, 0, s.window[s.strstart - 1]); + if (bflush) { + flush_block_only(s, false); + } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } else { + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + if (s.match_available) { + bflush = trees2._tr_tally(s, 0, s.window[s.strstart - 1]); + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; + if (flush === Z_FINISH) { + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + return BS_FINISH_DONE; + } + if (s.last_lit) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + return BS_BLOCK_DONE; + } + function deflate_rle(s, flush) { + var bflush; + var prev; + var scan, strend; + var _win = s.window; + for (; ; ) { + if (s.lookahead <= MAX_MATCH) { + fill_window(s); + if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; + } + } + s.match_length = 0; + if (s.lookahead >= MIN_MATCH && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH; + do { + } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend); + s.match_length = MAX_MATCH - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; + } + } + } + if (s.match_length >= MIN_MATCH) { + bflush = trees2._tr_tally(s, 1, s.match_length - MIN_MATCH); + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + bflush = trees2._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + } + if (bflush) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + } + s.insert = 0; + if (flush === Z_FINISH) { + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + return BS_FINISH_DONE; + } + if (s.last_lit) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + return BS_BLOCK_DONE; + } + function deflate_huff(s, flush) { + var bflush; + for (; ; ) { + if (s.lookahead === 0) { + fill_window(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH) { + return BS_NEED_MORE; + } + break; + } + } + s.match_length = 0; + bflush = trees2._tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + } + s.insert = 0; + if (flush === Z_FINISH) { + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + return BS_FINISH_DONE; + } + if (s.last_lit) { + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } + return BS_BLOCK_DONE; + } + function Config(good_length, max_lazy, nice_length, max_chain, func) { + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; + } + var configuration_table; + configuration_table = [ + /* good lazy nice chain */ + new Config(0, 0, 0, 0, deflate_stored), + /* 0 store only */ + new Config(4, 4, 8, 4, deflate_fast), + /* 1 max speed, no lazy matches */ + new Config(4, 5, 16, 8, deflate_fast), + /* 2 */ + new Config(4, 6, 32, 32, deflate_fast), + /* 3 */ + new Config(4, 4, 16, 16, deflate_slow), + /* 4 lazy matches */ + new Config(8, 16, 32, 32, deflate_slow), + /* 5 */ + new Config(8, 16, 128, 128, deflate_slow), + /* 6 */ + new Config(8, 32, 128, 256, deflate_slow), + /* 7 */ + new Config(32, 128, 258, 1024, deflate_slow), + /* 8 */ + new Config(32, 258, 258, 4096, deflate_slow) + /* 9 max compression */ + ]; + function lm_init(s) { + s.window_size = 2 * s.w_size; + zero(s.head); + s.max_lazy_match = configuration_table[s.level].max_lazy; + s.good_match = configuration_table[s.level].good_length; + s.nice_match = configuration_table[s.level].nice_length; + s.max_chain_length = configuration_table[s.level].max_chain; + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + s.ins_h = 0; + } + function DeflateState() { + this.strm = null; + this.status = 0; + this.pending_buf = null; + this.pending_buf_size = 0; + this.pending_out = 0; + this.pending = 0; + this.wrap = 0; + this.gzhead = null; + this.gzindex = 0; + this.method = Z_DEFLATED; + this.last_flush = -1; + this.w_size = 0; + this.w_bits = 0; + this.w_mask = 0; + this.window = null; + this.window_size = 0; + this.prev = null; + this.head = null; + this.ins_h = 0; + this.hash_size = 0; + this.hash_bits = 0; + this.hash_mask = 0; + this.hash_shift = 0; + this.block_start = 0; + this.match_length = 0; + this.prev_match = 0; + this.match_available = 0; + this.strstart = 0; + this.match_start = 0; + this.lookahead = 0; + this.prev_length = 0; + this.max_chain_length = 0; + this.max_lazy_match = 0; + this.level = 0; + this.strategy = 0; + this.good_match = 0; + this.nice_match = 0; + this.dyn_ltree = new utils2.Buf16(HEAP_SIZE * 2); + this.dyn_dtree = new utils2.Buf16((2 * D_CODES + 1) * 2); + this.bl_tree = new utils2.Buf16((2 * BL_CODES + 1) * 2); + zero(this.dyn_ltree); + zero(this.dyn_dtree); + zero(this.bl_tree); + this.l_desc = null; + this.d_desc = null; + this.bl_desc = null; + this.bl_count = new utils2.Buf16(MAX_BITS + 1); + this.heap = new utils2.Buf16(2 * L_CODES + 1); + zero(this.heap); + this.heap_len = 0; + this.heap_max = 0; + this.depth = new utils2.Buf16(2 * L_CODES + 1); + zero(this.depth); + this.l_buf = 0; + this.lit_bufsize = 0; + this.last_lit = 0; + this.d_buf = 0; + this.opt_len = 0; + this.static_len = 0; + this.matches = 0; + this.insert = 0; + this.bi_buf = 0; + this.bi_valid = 0; + } + function deflateResetKeep(strm) { + var s; + if (!strm || !strm.state) { + return err(strm, Z_STREAM_ERROR); + } + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN; + s = strm.state; + s.pending = 0; + s.pending_out = 0; + if (s.wrap < 0) { + s.wrap = -s.wrap; + } + s.status = s.wrap ? INIT_STATE : BUSY_STATE; + strm.adler = s.wrap === 2 ? 0 : 1; + s.last_flush = Z_NO_FLUSH; + trees2._tr_init(s); + return Z_OK; + } + function deflateReset(strm) { + var ret = deflateResetKeep(strm); + if (ret === Z_OK) { + lm_init(strm.state); + } + return ret; + } + function deflateSetHeader(strm, head) { + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + if (strm.state.wrap !== 2) { + return Z_STREAM_ERROR; + } + strm.state.gzhead = head; + return Z_OK; + } + function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { + if (!strm) { + return Z_STREAM_ERROR; + } + var wrap = 1; + if (level === Z_DEFAULT_COMPRESSION) { + level = 6; + } + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } else if (windowBits > 15) { + wrap = 2; + windowBits -= 16; + } + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return err(strm, Z_STREAM_ERROR); + } + if (windowBits === 8) { + windowBits = 9; + } + var s = new DeflateState(); + strm.state = s; + s.strm = strm; + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; + s.hash_bits = memLevel + 7; + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); + s.window = new utils2.Buf8(s.w_size * 2); + s.head = new utils2.Buf16(s.hash_size); + s.prev = new utils2.Buf16(s.w_size); + s.lit_bufsize = 1 << memLevel + 6; + s.pending_buf_size = s.lit_bufsize * 4; + s.pending_buf = new utils2.Buf8(s.pending_buf_size); + s.d_buf = 1 * s.lit_bufsize; + s.l_buf = (1 + 2) * s.lit_bufsize; + s.level = level; + s.strategy = strategy; + s.method = method; + return deflateReset(strm); + } + function deflateInit(strm, level) { + return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); + } + function deflate$1(strm, flush) { + var old_flush, s; + var beg, val; + if (!strm || !strm.state || flush > Z_BLOCK || flush < 0) { + return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; + } + s = strm.state; + if (!strm.output || !strm.input && strm.avail_in !== 0 || s.status === FINISH_STATE && flush !== Z_FINISH) { + return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR : Z_STREAM_ERROR); + } + s.strm = strm; + old_flush = s.last_flush; + s.last_flush = flush; + if (s.status === INIT_STATE) { + if (s.wrap === 2) { + strm.adler = 0; + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (!s.gzhead) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); + put_byte(s, OS_CODE); + s.status = BUSY_STATE; + } else { + put_byte( + s, + (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16) + ); + put_byte(s, s.gzhead.time & 255); + put_byte(s, s.gzhead.time >> 8 & 255); + put_byte(s, s.gzhead.time >> 16 & 255); + put_byte(s, s.gzhead.time >> 24 & 255); + put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0); + put_byte(s, s.gzhead.os & 255); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte(s, s.gzhead.extra.length & 255); + put_byte(s, s.gzhead.extra.length >> 8 & 255); + } + if (s.gzhead.hcrc) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE; + } + } else { + var header = Z_DEFLATED + (s.w_bits - 8 << 4) << 8; + var level_flags = -1; + if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= level_flags << 6; + if (s.strstart !== 0) { + header |= PRESET_DICT; + } + header += 31 - header % 31; + s.status = BUSY_STATE; + putShortMSB(s, header); + if (s.strstart !== 0) { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 65535); + } + strm.adler = 1; + } + } + if (s.status === EXTRA_STATE) { + if (s.gzhead.extra) { + beg = s.pending; + while (s.gzindex < (s.gzhead.extra.length & 65535)) { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + break; + } + } + put_byte(s, s.gzhead.extra[s.gzindex] & 255); + s.gzindex++; + } + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (s.gzindex === s.gzhead.extra.length) { + s.gzindex = 0; + s.status = NAME_STATE; + } + } else { + s.status = NAME_STATE; + } + } + if (s.status === NAME_STATE) { + if (s.gzhead.name) { + beg = s.pending; + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 255; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.gzindex = 0; + s.status = COMMENT_STATE; + } + } else { + s.status = COMMENT_STATE; + } + } + if (s.status === COMMENT_STATE) { + if (s.gzhead.comment) { + beg = s.pending; + do { + if (s.pending === s.pending_buf_size) { + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + flush_pending(strm); + beg = s.pending; + if (s.pending === s.pending_buf_size) { + val = 1; + break; + } + } + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 255; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); + } + if (val === 0) { + s.status = HCRC_STATE; + } + } else { + s.status = HCRC_STATE; + } + } + if (s.status === HCRC_STATE) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending(strm); + } + if (s.pending + 2 <= s.pending_buf_size) { + put_byte(s, strm.adler & 255); + put_byte(s, strm.adler >> 8 & 255); + strm.adler = 0; + s.status = BUSY_STATE; + } + } else { + s.status = BUSY_STATE; + } + } + if (s.pending !== 0) { + flush_pending(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; + return Z_OK; + } + } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH) { + return err(strm, Z_BUF_ERROR); + } + if (s.status === FINISH_STATE && strm.avail_in !== 0) { + return err(strm, Z_BUF_ERROR); + } + if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH && s.status !== FINISH_STATE) { + var bstate = s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush); + if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { + s.status = FINISH_STATE; + } + if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { + if (strm.avail_out === 0) { + s.last_flush = -1; + } + return Z_OK; + } + if (bstate === BS_BLOCK_DONE) { + if (flush === Z_PARTIAL_FLUSH) { + trees2._tr_align(s); + } else if (flush !== Z_BLOCK) { + trees2._tr_stored_block(s, 0, 0, false); + if (flush === Z_FULL_FLUSH) { + zero(s.head); + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; + return Z_OK; + } + } + } + if (flush !== Z_FINISH) { + return Z_OK; + } + if (s.wrap <= 0) { + return Z_STREAM_END; + } + if (s.wrap === 2) { + put_byte(s, strm.adler & 255); + put_byte(s, strm.adler >> 8 & 255); + put_byte(s, strm.adler >> 16 & 255); + put_byte(s, strm.adler >> 24 & 255); + put_byte(s, strm.total_in & 255); + put_byte(s, strm.total_in >> 8 & 255); + put_byte(s, strm.total_in >> 16 & 255); + put_byte(s, strm.total_in >> 24 & 255); + } else { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 65535); + } + flush_pending(strm); + if (s.wrap > 0) { + s.wrap = -s.wrap; + } + return s.pending !== 0 ? Z_OK : Z_STREAM_END; + } + function deflateEnd(strm) { + var status; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + status = strm.state.status; + if (status !== INIT_STATE && status !== EXTRA_STATE && status !== NAME_STATE && status !== COMMENT_STATE && status !== HCRC_STATE && status !== BUSY_STATE && status !== FINISH_STATE) { + return err(strm, Z_STREAM_ERROR); + } + strm.state = null; + return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; + } + function deflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + var s; + var str, n; + var wrap; + var avail; + var next; + var input; + var tmpDict; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + s = strm.state; + wrap = s.wrap; + if (wrap === 2 || wrap === 1 && s.status !== INIT_STATE || s.lookahead) { + return Z_STREAM_ERROR; + } + if (wrap === 1) { + strm.adler = adler32(strm.adler, dictionary, dictLength, 0); + } + s.wrap = 0; + if (dictLength >= s.w_size) { + if (wrap === 0) { + zero(s.head); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + tmpDict = new utils2.Buf8(s.w_size); + utils2.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + avail = strm.avail_in; + next = strm.next_in; + input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window(s); + while (s.lookahead >= MIN_MATCH) { + str = s.strstart; + n = s.lookahead - (MIN_MATCH - 1); + do { + s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH - 1; + fill_window(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK; + } + deflate.deflateInit = deflateInit; + deflate.deflateInit2 = deflateInit2; + deflate.deflateReset = deflateReset; + deflate.deflateResetKeep = deflateResetKeep; + deflate.deflateSetHeader = deflateSetHeader; + deflate.deflate = deflate$1; + deflate.deflateEnd = deflateEnd; + deflate.deflateSetDictionary = deflateSetDictionary; + deflate.deflateInfo = "pako deflate (from Nodeca project)"; + return deflate; +} +var inflate = {}; +var inffast; +var hasRequiredInffast; +function requireInffast() { + if (hasRequiredInffast) return inffast; + hasRequiredInffast = 1; + var BAD = 30; + var TYPE = 12; + inffast = function inflate_fast(strm, start) { + var state2; + var _in; + var last; + var _out; + var beg; + var end; + var dmax; + var wsize; + var whave; + var wnext; + var s_window; + var hold; + var bits; + var lcode; + var dcode; + var lmask; + var dmask; + var here; + var op; + var len; + var dist2; + var from2; + var from_source; + var input, output; + state2 = strm.state; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); + dmax = state2.dmax; + wsize = state2.wsize; + whave = state2.whave; + wnext = state2.wnext; + s_window = state2.window; + hold = state2.hold; + bits = state2.bits; + lcode = state2.lencode; + dcode = state2.distcode; + lmask = (1 << state2.lenbits) - 1; + dmask = (1 << state2.distbits) - 1; + top: + do { + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + for (; ; ) { + op = here >>> 24; + hold >>>= op; + bits -= op; + op = here >>> 16 & 255; + if (op === 0) { + output[_out++] = here & 65535; + } else if (op & 16) { + len = here & 65535; + op &= 15; + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & (1 << op) - 1; + hold >>>= op; + bits -= op; + } + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + for (; ; ) { + op = here >>> 24; + hold >>>= op; + bits -= op; + op = here >>> 16 & 255; + if (op & 16) { + dist2 = here & 65535; + op &= 15; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist2 += hold & (1 << op) - 1; + if (dist2 > dmax) { + strm.msg = "invalid distance too far back"; + state2.mode = BAD; + break top; + } + hold >>>= op; + bits -= op; + op = _out - beg; + if (dist2 > op) { + op = dist2 - op; + if (op > whave) { + if (state2.sane) { + strm.msg = "invalid distance too far back"; + state2.mode = BAD; + break top; + } + } + from2 = 0; + from_source = s_window; + if (wnext === 0) { + from2 += wsize - op; + if (op < len) { + len -= op; + do { + output[_out++] = s_window[from2++]; + } while (--op); + from2 = _out - dist2; + from_source = output; + } + } else if (wnext < op) { + from2 += wsize + wnext - op; + op -= wnext; + if (op < len) { + len -= op; + do { + output[_out++] = s_window[from2++]; + } while (--op); + from2 = 0; + if (wnext < len) { + op = wnext; + len -= op; + do { + output[_out++] = s_window[from2++]; + } while (--op); + from2 = _out - dist2; + from_source = output; + } + } + } else { + from2 += wnext - op; + if (op < len) { + len -= op; + do { + output[_out++] = s_window[from2++]; + } while (--op); + from2 = _out - dist2; + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from2++]; + output[_out++] = from_source[from2++]; + output[_out++] = from_source[from2++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from2++]; + if (len > 1) { + output[_out++] = from_source[from2++]; + } + } + } else { + from2 = _out - dist2; + do { + output[_out++] = output[from2++]; + output[_out++] = output[from2++]; + output[_out++] = output[from2++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from2++]; + if (len > 1) { + output[_out++] = output[from2++]; + } + } + } + } else if ((op & 64) === 0) { + here = dcode[(here & 65535) + (hold & (1 << op) - 1)]; + continue dodist; + } else { + strm.msg = "invalid distance code"; + state2.mode = BAD; + break top; + } + break; + } + } else if ((op & 64) === 0) { + here = lcode[(here & 65535) + (hold & (1 << op) - 1)]; + continue dolen; + } else if (op & 32) { + state2.mode = TYPE; + break top; + } else { + strm.msg = "invalid literal/length code"; + state2.mode = BAD; + break top; + } + break; + } + } while (_in < last && _out < end); + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last); + strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end); + state2.hold = hold; + state2.bits = bits; + return; + }; + return inffast; +} +var inftrees; +var hasRequiredInftrees; +function requireInftrees() { + if (hasRequiredInftrees) return inftrees; + hasRequiredInftrees = 1; + var utils2 = requireCommon$1(); + var MAXBITS = 15; + var ENOUGH_LENS = 852; + var ENOUGH_DISTS = 592; + var CODES = 0; + var LENS = 1; + var DISTS = 2; + var lbase = [ + /* Length codes 257..285 base */ + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 17, + 19, + 23, + 27, + 31, + 35, + 43, + 51, + 59, + 67, + 83, + 99, + 115, + 131, + 163, + 195, + 227, + 258, + 0, + 0 + ]; + var lext = [ + /* Length codes 257..285 extra */ + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 16, + 17, + 17, + 17, + 17, + 18, + 18, + 18, + 18, + 19, + 19, + 19, + 19, + 20, + 20, + 20, + 20, + 21, + 21, + 21, + 21, + 16, + 72, + 78 + ]; + var dbase = [ + /* Distance codes 0..29 base */ + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577, + 0, + 0 + ]; + var dext = [ + /* Distance codes 0..29 extra */ + 16, + 16, + 16, + 16, + 17, + 17, + 18, + 18, + 19, + 19, + 20, + 20, + 21, + 21, + 22, + 22, + 23, + 23, + 24, + 24, + 25, + 25, + 26, + 26, + 27, + 27, + 28, + 28, + 29, + 29, + 64, + 64 + ]; + inftrees = function inflate_table(type2, lens, lens_index, codes, table, table_index, work, opts) { + var bits = opts.bits; + var len = 0; + var sym = 0; + var min2 = 0, max2 = 0; + var root = 0; + var curr = 0; + var drop = 0; + var left = 0; + var used = 0; + var huff = 0; + var incr; + var fill; + var low; + var mask; + var next; + var base2 = null; + var base_index = 0; + var end; + var count = new utils2.Buf16(MAXBITS + 1); + var offs = new utils2.Buf16(MAXBITS + 1); + var extra = null; + var extra_index = 0; + var here_bits, here_op, here_val; + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + root = bits; + for (max2 = MAXBITS; max2 >= 1; max2--) { + if (count[max2] !== 0) { + break; + } + } + if (root > max2) { + root = max2; + } + if (max2 === 0) { + table[table_index++] = 1 << 24 | 64 << 16 | 0; + table[table_index++] = 1 << 24 | 64 << 16 | 0; + opts.bits = 1; + return 0; + } + for (min2 = 1; min2 < max2; min2++) { + if (count[min2] !== 0) { + break; + } + } + if (root < min2) { + root = min2; + } + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } + } + if (left > 0 && (type2 === CODES || max2 !== 1)) { + return -1; + } + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + if (type2 === CODES) { + base2 = extra = work; + end = 19; + } else if (type2 === LENS) { + base2 = lbase; + base_index -= 257; + extra = lext; + extra_index -= 257; + end = 256; + } else { + base2 = dbase; + extra = dext; + end = -1; + } + huff = 0; + sym = 0; + len = min2; + next = table_index; + curr = root; + drop = 0; + low = -1; + used = 1 << root; + mask = used - 1; + if (type2 === LENS && used > ENOUGH_LENS || type2 === DISTS && used > ENOUGH_DISTS) { + return 1; + } + for (; ; ) { + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base2[base_index + work[sym]]; + } else { + here_op = 32 + 64; + here_val = 0; + } + incr = 1 << len - drop; + fill = 1 << curr; + min2 = fill; + do { + fill -= incr; + table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0; + } while (fill !== 0); + incr = 1 << len - 1; + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + sym++; + if (--count[len] === 0) { + if (len === max2) { + break; + } + len = lens[lens_index + work[sym]]; + } + if (len > root && (huff & mask) !== low) { + if (drop === 0) { + drop = root; + } + next += min2; + curr = len - drop; + left = 1 << curr; + while (curr + drop < max2) { + left -= count[curr + drop]; + if (left <= 0) { + break; + } + curr++; + left <<= 1; + } + used += 1 << curr; + if (type2 === LENS && used > ENOUGH_LENS || type2 === DISTS && used > ENOUGH_DISTS) { + return 1; + } + low = huff & mask; + table[low] = root << 24 | curr << 16 | next - table_index | 0; + } + } + if (huff !== 0) { + table[next + huff] = len - drop << 24 | 64 << 16 | 0; + } + opts.bits = root; + return 0; + }; + return inftrees; +} +var hasRequiredInflate; +function requireInflate() { + if (hasRequiredInflate) return inflate; + hasRequiredInflate = 1; + var utils2 = requireCommon$1(); + var adler32 = requireAdler32(); + var crc32 = requireCrc32(); + var inflate_fast = requireInffast(); + var inflate_table = requireInftrees(); + var CODES = 0; + var LENS = 1; + var DISTS = 2; + var Z_FINISH = 4; + var Z_BLOCK = 5; + var Z_TREES = 6; + var Z_OK = 0; + var Z_STREAM_END = 1; + var Z_NEED_DICT = 2; + var Z_STREAM_ERROR = -2; + var Z_DATA_ERROR = -3; + var Z_MEM_ERROR = -4; + var Z_BUF_ERROR = -5; + var Z_DEFLATED = 8; + var HEAD = 1; + var FLAGS = 2; + var TIME = 3; + var OS = 4; + var EXLEN = 5; + var EXTRA = 6; + var NAME = 7; + var COMMENT = 8; + var HCRC = 9; + var DICTID = 10; + var DICT = 11; + var TYPE = 12; + var TYPEDO = 13; + var STORED = 14; + var COPY_ = 15; + var COPY = 16; + var TABLE = 17; + var LENLENS = 18; + var CODELENS = 19; + var LEN_ = 20; + var LEN = 21; + var LENEXT = 22; + var DIST = 23; + var DISTEXT = 24; + var MATCH = 25; + var LIT = 26; + var CHECK = 27; + var LENGTH = 28; + var DONE = 29; + var BAD = 30; + var MEM = 31; + var SYNC = 32; + var ENOUGH_LENS = 852; + var ENOUGH_DISTS = 592; + var MAX_WBITS = 15; + var DEF_WBITS = MAX_WBITS; + function zswap32(q) { + return (q >>> 24 & 255) + (q >>> 8 & 65280) + ((q & 65280) << 8) + ((q & 255) << 24); + } + function InflateState() { + this.mode = 0; + this.last = false; + this.wrap = 0; + this.havedict = false; + this.flags = 0; + this.dmax = 0; + this.check = 0; + this.total = 0; + this.head = null; + this.wbits = 0; + this.wsize = 0; + this.whave = 0; + this.wnext = 0; + this.window = null; + this.hold = 0; + this.bits = 0; + this.length = 0; + this.offset = 0; + this.extra = 0; + this.lencode = null; + this.distcode = null; + this.lenbits = 0; + this.distbits = 0; + this.ncode = 0; + this.nlen = 0; + this.ndist = 0; + this.have = 0; + this.next = null; + this.lens = new utils2.Buf16(320); + this.work = new utils2.Buf16(288); + this.lendyn = null; + this.distdyn = null; + this.sane = 0; + this.back = 0; + this.was = 0; + } + function inflateResetKeep(strm) { + var state2; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + state2 = strm.state; + strm.total_in = strm.total_out = state2.total = 0; + strm.msg = ""; + if (state2.wrap) { + strm.adler = state2.wrap & 1; + } + state2.mode = HEAD; + state2.last = 0; + state2.havedict = 0; + state2.dmax = 32768; + state2.head = null; + state2.hold = 0; + state2.bits = 0; + state2.lencode = state2.lendyn = new utils2.Buf32(ENOUGH_LENS); + state2.distcode = state2.distdyn = new utils2.Buf32(ENOUGH_DISTS); + state2.sane = 1; + state2.back = -1; + return Z_OK; + } + function inflateReset(strm) { + var state2; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + state2 = strm.state; + state2.wsize = 0; + state2.whave = 0; + state2.wnext = 0; + return inflateResetKeep(strm); + } + function inflateReset2(strm, windowBits) { + var wrap; + var state2; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + state2 = strm.state; + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } else { + wrap = (windowBits >> 4) + 1; + if (windowBits < 48) { + windowBits &= 15; + } + } + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR; + } + if (state2.window !== null && state2.wbits !== windowBits) { + state2.window = null; + } + state2.wrap = wrap; + state2.wbits = windowBits; + return inflateReset(strm); + } + function inflateInit2(strm, windowBits) { + var ret; + var state2; + if (!strm) { + return Z_STREAM_ERROR; + } + state2 = new InflateState(); + strm.state = state2; + state2.window = null; + ret = inflateReset2(strm, windowBits); + if (ret !== Z_OK) { + strm.state = null; + } + return ret; + } + function inflateInit(strm) { + return inflateInit2(strm, DEF_WBITS); + } + var virgin = true; + var lenfix, distfix; + function fixedtables(state2) { + if (virgin) { + var sym; + lenfix = new utils2.Buf32(512); + distfix = new utils2.Buf32(32); + sym = 0; + while (sym < 144) { + state2.lens[sym++] = 8; + } + while (sym < 256) { + state2.lens[sym++] = 9; + } + while (sym < 280) { + state2.lens[sym++] = 7; + } + while (sym < 288) { + state2.lens[sym++] = 8; + } + inflate_table(LENS, state2.lens, 0, 288, lenfix, 0, state2.work, { bits: 9 }); + sym = 0; + while (sym < 32) { + state2.lens[sym++] = 5; + } + inflate_table(DISTS, state2.lens, 0, 32, distfix, 0, state2.work, { bits: 5 }); + virgin = false; + } + state2.lencode = lenfix; + state2.lenbits = 9; + state2.distcode = distfix; + state2.distbits = 5; + } + function updatewindow(strm, src2, end, copy) { + var dist2; + var state2 = strm.state; + if (state2.window === null) { + state2.wsize = 1 << state2.wbits; + state2.wnext = 0; + state2.whave = 0; + state2.window = new utils2.Buf8(state2.wsize); + } + if (copy >= state2.wsize) { + utils2.arraySet(state2.window, src2, end - state2.wsize, state2.wsize, 0); + state2.wnext = 0; + state2.whave = state2.wsize; + } else { + dist2 = state2.wsize - state2.wnext; + if (dist2 > copy) { + dist2 = copy; + } + utils2.arraySet(state2.window, src2, end - copy, dist2, state2.wnext); + copy -= dist2; + if (copy) { + utils2.arraySet(state2.window, src2, end - copy, copy, 0); + state2.wnext = copy; + state2.whave = state2.wsize; + } else { + state2.wnext += dist2; + if (state2.wnext === state2.wsize) { + state2.wnext = 0; + } + if (state2.whave < state2.wsize) { + state2.whave += dist2; + } + } + } + return 0; + } + function inflate$1(strm, flush) { + var state2; + var input, output; + var next; + var put; + var have, left; + var hold; + var bits; + var _in, _out; + var copy; + var from2; + var from_source; + var here = 0; + var here_bits, here_op, here_val; + var last_bits, last_op, last_val; + var len; + var ret; + var hbuf = new utils2.Buf8(4); + var opts; + var n; + var order = ( + /* permutation of code lengths */ + [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] + ); + if (!strm || !strm.state || !strm.output || !strm.input && strm.avail_in !== 0) { + return Z_STREAM_ERROR; + } + state2 = strm.state; + if (state2.mode === TYPE) { + state2.mode = TYPEDO; + } + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state2.hold; + bits = state2.bits; + _in = have; + _out = left; + ret = Z_OK; + inf_leave: + for (; ; ) { + switch (state2.mode) { + case HEAD: + if (state2.wrap === 0) { + state2.mode = TYPEDO; + break; + } + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state2.wrap & 2 && hold === 35615) { + state2.check = 0; + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state2.check = crc32(state2.check, hbuf, 2, 0); + hold = 0; + bits = 0; + state2.mode = FLAGS; + break; + } + state2.flags = 0; + if (state2.head) { + state2.head.done = false; + } + if (!(state2.wrap & 1) || /* check if zlib header allowed */ + (((hold & 255) << 8) + (hold >> 8)) % 31) { + strm.msg = "incorrect header check"; + state2.mode = BAD; + break; + } + if ((hold & 15) !== Z_DEFLATED) { + strm.msg = "unknown compression method"; + state2.mode = BAD; + break; + } + hold >>>= 4; + bits -= 4; + len = (hold & 15) + 8; + if (state2.wbits === 0) { + state2.wbits = len; + } else if (len > state2.wbits) { + strm.msg = "invalid window size"; + state2.mode = BAD; + break; + } + state2.dmax = 1 << len; + strm.adler = state2.check = 1; + state2.mode = hold & 512 ? DICTID : TYPE; + hold = 0; + bits = 0; + break; + case FLAGS: + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.flags = hold; + if ((state2.flags & 255) !== Z_DEFLATED) { + strm.msg = "unknown compression method"; + state2.mode = BAD; + break; + } + if (state2.flags & 57344) { + strm.msg = "unknown header flags set"; + state2.mode = BAD; + break; + } + if (state2.head) { + state2.head.text = hold >> 8 & 1; + } + if (state2.flags & 512) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state2.check = crc32(state2.check, hbuf, 2, 0); + } + hold = 0; + bits = 0; + state2.mode = TIME; + /* falls through */ + case TIME: + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state2.head) { + state2.head.time = hold; + } + if (state2.flags & 512) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + hbuf[2] = hold >>> 16 & 255; + hbuf[3] = hold >>> 24 & 255; + state2.check = crc32(state2.check, hbuf, 4, 0); + } + hold = 0; + bits = 0; + state2.mode = OS; + /* falls through */ + case OS: + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (state2.head) { + state2.head.xflags = hold & 255; + state2.head.os = hold >> 8; + } + if (state2.flags & 512) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state2.check = crc32(state2.check, hbuf, 2, 0); + } + hold = 0; + bits = 0; + state2.mode = EXLEN; + /* falls through */ + case EXLEN: + if (state2.flags & 1024) { + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.length = hold; + if (state2.head) { + state2.head.extra_len = hold; + } + if (state2.flags & 512) { + hbuf[0] = hold & 255; + hbuf[1] = hold >>> 8 & 255; + state2.check = crc32(state2.check, hbuf, 2, 0); + } + hold = 0; + bits = 0; + } else if (state2.head) { + state2.head.extra = null; + } + state2.mode = EXTRA; + /* falls through */ + case EXTRA: + if (state2.flags & 1024) { + copy = state2.length; + if (copy > have) { + copy = have; + } + if (copy) { + if (state2.head) { + len = state2.head.extra_len - state2.length; + if (!state2.head.extra) { + state2.head.extra = new Array(state2.head.extra_len); + } + utils2.arraySet( + state2.head.extra, + input, + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + copy, + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + } + if (state2.flags & 512) { + state2.check = crc32(state2.check, input, copy, next); + } + have -= copy; + next += copy; + state2.length -= copy; + } + if (state2.length) { + break inf_leave; + } + } + state2.length = 0; + state2.mode = NAME; + /* falls through */ + case NAME: + if (state2.flags & 2048) { + if (have === 0) { + break inf_leave; + } + copy = 0; + do { + len = input[next + copy++]; + if (state2.head && len && state2.length < 65536) { + state2.head.name += String.fromCharCode(len); + } + } while (len && copy < have); + if (state2.flags & 512) { + state2.check = crc32(state2.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { + break inf_leave; + } + } else if (state2.head) { + state2.head.name = null; + } + state2.length = 0; + state2.mode = COMMENT; + /* falls through */ + case COMMENT: + if (state2.flags & 4096) { + if (have === 0) { + break inf_leave; + } + copy = 0; + do { + len = input[next + copy++]; + if (state2.head && len && state2.length < 65536) { + state2.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if (state2.flags & 512) { + state2.check = crc32(state2.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { + break inf_leave; + } + } else if (state2.head) { + state2.head.comment = null; + } + state2.mode = HCRC; + /* falls through */ + case HCRC: + if (state2.flags & 512) { + while (bits < 16) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (hold !== (state2.check & 65535)) { + strm.msg = "header crc mismatch"; + state2.mode = BAD; + break; + } + hold = 0; + bits = 0; + } + if (state2.head) { + state2.head.hcrc = state2.flags >> 9 & 1; + state2.head.done = true; + } + strm.adler = state2.check = 0; + state2.mode = TYPE; + break; + case DICTID: + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + strm.adler = state2.check = zswap32(hold); + hold = 0; + bits = 0; + state2.mode = DICT; + /* falls through */ + case DICT: + if (state2.havedict === 0) { + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state2.hold = hold; + state2.bits = bits; + return Z_NEED_DICT; + } + strm.adler = state2.check = 1; + state2.mode = TYPE; + /* falls through */ + case TYPE: + if (flush === Z_BLOCK || flush === Z_TREES) { + break inf_leave; + } + /* falls through */ + case TYPEDO: + if (state2.last) { + hold >>>= bits & 7; + bits -= bits & 7; + state2.mode = CHECK; + break; + } + while (bits < 3) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.last = hold & 1; + hold >>>= 1; + bits -= 1; + switch (hold & 3) { + case 0: + state2.mode = STORED; + break; + case 1: + fixedtables(state2); + state2.mode = LEN_; + if (flush === Z_TREES) { + hold >>>= 2; + bits -= 2; + break inf_leave; + } + break; + case 2: + state2.mode = TABLE; + break; + case 3: + strm.msg = "invalid block type"; + state2.mode = BAD; + } + hold >>>= 2; + bits -= 2; + break; + case STORED: + hold >>>= bits & 7; + bits -= bits & 7; + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if ((hold & 65535) !== (hold >>> 16 ^ 65535)) { + strm.msg = "invalid stored block lengths"; + state2.mode = BAD; + break; + } + state2.length = hold & 65535; + hold = 0; + bits = 0; + state2.mode = COPY_; + if (flush === Z_TREES) { + break inf_leave; + } + /* falls through */ + case COPY_: + state2.mode = COPY; + /* falls through */ + case COPY: + copy = state2.length; + if (copy) { + if (copy > have) { + copy = have; + } + if (copy > left) { + copy = left; + } + if (copy === 0) { + break inf_leave; + } + utils2.arraySet(output, input, next, copy, put); + have -= copy; + next += copy; + left -= copy; + put += copy; + state2.length -= copy; + break; + } + state2.mode = TYPE; + break; + case TABLE: + while (bits < 14) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.nlen = (hold & 31) + 257; + hold >>>= 5; + bits -= 5; + state2.ndist = (hold & 31) + 1; + hold >>>= 5; + bits -= 5; + state2.ncode = (hold & 15) + 4; + hold >>>= 4; + bits -= 4; + if (state2.nlen > 286 || state2.ndist > 30) { + strm.msg = "too many length or distance symbols"; + state2.mode = BAD; + break; + } + state2.have = 0; + state2.mode = LENLENS; + /* falls through */ + case LENLENS: + while (state2.have < state2.ncode) { + while (bits < 3) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.lens[order[state2.have++]] = hold & 7; + hold >>>= 3; + bits -= 3; + } + while (state2.have < 19) { + state2.lens[order[state2.have++]] = 0; + } + state2.lencode = state2.lendyn; + state2.lenbits = 7; + opts = { bits: state2.lenbits }; + ret = inflate_table(CODES, state2.lens, 0, 19, state2.lencode, 0, state2.work, opts); + state2.lenbits = opts.bits; + if (ret) { + strm.msg = "invalid code lengths set"; + state2.mode = BAD; + break; + } + state2.have = 0; + state2.mode = CODELENS; + /* falls through */ + case CODELENS: + while (state2.have < state2.nlen + state2.ndist) { + for (; ; ) { + here = state2.lencode[hold & (1 << state2.lenbits) - 1]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (here_val < 16) { + hold >>>= here_bits; + bits -= here_bits; + state2.lens[state2.have++] = here_val; + } else { + if (here_val === 16) { + n = here_bits + 2; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= here_bits; + bits -= here_bits; + if (state2.have === 0) { + strm.msg = "invalid bit length repeat"; + state2.mode = BAD; + break; + } + len = state2.lens[state2.have - 1]; + copy = 3 + (hold & 3); + hold >>>= 2; + bits -= 2; + } else if (here_val === 17) { + n = here_bits + 3; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= here_bits; + bits -= here_bits; + len = 0; + copy = 3 + (hold & 7); + hold >>>= 3; + bits -= 3; + } else { + n = here_bits + 7; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= here_bits; + bits -= here_bits; + len = 0; + copy = 11 + (hold & 127); + hold >>>= 7; + bits -= 7; + } + if (state2.have + copy > state2.nlen + state2.ndist) { + strm.msg = "invalid bit length repeat"; + state2.mode = BAD; + break; + } + while (copy--) { + state2.lens[state2.have++] = len; + } + } + } + if (state2.mode === BAD) { + break; + } + if (state2.lens[256] === 0) { + strm.msg = "invalid code -- missing end-of-block"; + state2.mode = BAD; + break; + } + state2.lenbits = 9; + opts = { bits: state2.lenbits }; + ret = inflate_table(LENS, state2.lens, 0, state2.nlen, state2.lencode, 0, state2.work, opts); + state2.lenbits = opts.bits; + if (ret) { + strm.msg = "invalid literal/lengths set"; + state2.mode = BAD; + break; + } + state2.distbits = 6; + state2.distcode = state2.distdyn; + opts = { bits: state2.distbits }; + ret = inflate_table(DISTS, state2.lens, state2.nlen, state2.ndist, state2.distcode, 0, state2.work, opts); + state2.distbits = opts.bits; + if (ret) { + strm.msg = "invalid distances set"; + state2.mode = BAD; + break; + } + state2.mode = LEN_; + if (flush === Z_TREES) { + break inf_leave; + } + /* falls through */ + case LEN_: + state2.mode = LEN; + /* falls through */ + case LEN: + if (have >= 6 && left >= 258) { + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state2.hold = hold; + state2.bits = bits; + inflate_fast(strm, _out); + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state2.hold; + bits = state2.bits; + if (state2.mode === TYPE) { + state2.back = -1; + } + break; + } + state2.back = 0; + for (; ; ) { + here = state2.lencode[hold & (1 << state2.lenbits) - 1]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (here_op && (here_op & 240) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (; ; ) { + here = state2.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (last_bits + here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= last_bits; + bits -= last_bits; + state2.back += last_bits; + } + hold >>>= here_bits; + bits -= here_bits; + state2.back += here_bits; + state2.length = here_val; + if (here_op === 0) { + state2.mode = LIT; + break; + } + if (here_op & 32) { + state2.back = -1; + state2.mode = TYPE; + break; + } + if (here_op & 64) { + strm.msg = "invalid literal/length code"; + state2.mode = BAD; + break; + } + state2.extra = here_op & 15; + state2.mode = LENEXT; + /* falls through */ + case LENEXT: + if (state2.extra) { + n = state2.extra; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.length += hold & (1 << state2.extra) - 1; + hold >>>= state2.extra; + bits -= state2.extra; + state2.back += state2.extra; + } + state2.was = state2.length; + state2.mode = DIST; + /* falls through */ + case DIST: + for (; ; ) { + here = state2.distcode[hold & (1 << state2.distbits) - 1]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if ((here_op & 240) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (; ; ) { + here = state2.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)]; + here_bits = here >>> 24; + here_op = here >>> 16 & 255; + here_val = here & 65535; + if (last_bits + here_bits <= bits) { + break; + } + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + hold >>>= last_bits; + bits -= last_bits; + state2.back += last_bits; + } + hold >>>= here_bits; + bits -= here_bits; + state2.back += here_bits; + if (here_op & 64) { + strm.msg = "invalid distance code"; + state2.mode = BAD; + break; + } + state2.offset = here_val; + state2.extra = here_op & 15; + state2.mode = DISTEXT; + /* falls through */ + case DISTEXT: + if (state2.extra) { + n = state2.extra; + while (bits < n) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + state2.offset += hold & (1 << state2.extra) - 1; + hold >>>= state2.extra; + bits -= state2.extra; + state2.back += state2.extra; + } + if (state2.offset > state2.dmax) { + strm.msg = "invalid distance too far back"; + state2.mode = BAD; + break; + } + state2.mode = MATCH; + /* falls through */ + case MATCH: + if (left === 0) { + break inf_leave; + } + copy = _out - left; + if (state2.offset > copy) { + copy = state2.offset - copy; + if (copy > state2.whave) { + if (state2.sane) { + strm.msg = "invalid distance too far back"; + state2.mode = BAD; + break; + } + } + if (copy > state2.wnext) { + copy -= state2.wnext; + from2 = state2.wsize - copy; + } else { + from2 = state2.wnext - copy; + } + if (copy > state2.length) { + copy = state2.length; + } + from_source = state2.window; + } else { + from_source = output; + from2 = put - state2.offset; + copy = state2.length; + } + if (copy > left) { + copy = left; + } + left -= copy; + state2.length -= copy; + do { + output[put++] = from_source[from2++]; + } while (--copy); + if (state2.length === 0) { + state2.mode = LEN; + } + break; + case LIT: + if (left === 0) { + break inf_leave; + } + output[put++] = state2.length; + left--; + state2.mode = LEN; + break; + case CHECK: + if (state2.wrap) { + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold |= input[next++] << bits; + bits += 8; + } + _out -= left; + strm.total_out += _out; + state2.total += _out; + if (_out) { + strm.adler = state2.check = /*UPDATE(state.check, put - _out, _out);*/ + state2.flags ? crc32(state2.check, output, _out, put - _out) : adler32(state2.check, output, _out, put - _out); + } + _out = left; + if ((state2.flags ? hold : zswap32(hold)) !== state2.check) { + strm.msg = "incorrect data check"; + state2.mode = BAD; + break; + } + hold = 0; + bits = 0; + } + state2.mode = LENGTH; + /* falls through */ + case LENGTH: + if (state2.wrap && state2.flags) { + while (bits < 32) { + if (have === 0) { + break inf_leave; + } + have--; + hold += input[next++] << bits; + bits += 8; + } + if (hold !== (state2.total & 4294967295)) { + strm.msg = "incorrect length check"; + state2.mode = BAD; + break; + } + hold = 0; + bits = 0; + } + state2.mode = DONE; + /* falls through */ + case DONE: + ret = Z_STREAM_END; + break inf_leave; + case BAD: + ret = Z_DATA_ERROR; + break inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + /* falls through */ + default: + return Z_STREAM_ERROR; + } + } + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state2.hold = hold; + state2.bits = bits; + if (state2.wsize || _out !== strm.avail_out && state2.mode < BAD && (state2.mode < CHECK || flush !== Z_FINISH)) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state2.total += _out; + if (state2.wrap && _out) { + strm.adler = state2.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + state2.flags ? crc32(state2.check, output, _out, strm.next_out - _out) : adler32(state2.check, output, _out, strm.next_out - _out); + } + strm.data_type = state2.bits + (state2.last ? 64 : 0) + (state2.mode === TYPE ? 128 : 0) + (state2.mode === LEN_ || state2.mode === COPY_ ? 256 : 0); + if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) { + ret = Z_BUF_ERROR; + } + return ret; + } + function inflateEnd(strm) { + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + var state2 = strm.state; + if (state2.window) { + state2.window = null; + } + strm.state = null; + return Z_OK; + } + function inflateGetHeader(strm, head) { + var state2; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + state2 = strm.state; + if ((state2.wrap & 2) === 0) { + return Z_STREAM_ERROR; + } + state2.head = head; + head.done = false; + return Z_OK; + } + function inflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + var state2; + var dictid; + var ret; + if (!strm || !strm.state) { + return Z_STREAM_ERROR; + } + state2 = strm.state; + if (state2.wrap !== 0 && state2.mode !== DICT) { + return Z_STREAM_ERROR; + } + if (state2.mode === DICT) { + dictid = 1; + dictid = adler32(dictid, dictionary, dictLength, 0); + if (dictid !== state2.check) { + return Z_DATA_ERROR; + } + } + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state2.mode = MEM; + return Z_MEM_ERROR; + } + state2.havedict = 1; + return Z_OK; + } + inflate.inflateReset = inflateReset; + inflate.inflateReset2 = inflateReset2; + inflate.inflateResetKeep = inflateResetKeep; + inflate.inflateInit = inflateInit; + inflate.inflateInit2 = inflateInit2; + inflate.inflate = inflate$1; + inflate.inflateEnd = inflateEnd; + inflate.inflateGetHeader = inflateGetHeader; + inflate.inflateSetDictionary = inflateSetDictionary; + inflate.inflateInfo = "pako inflate (from Nodeca project)"; + return inflate; +} +var constants$4; +var hasRequiredConstants$4; +function requireConstants$4() { + if (hasRequiredConstants$4) return constants$4; + hasRequiredConstants$4 = 1; + constants$4 = { + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + //Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type + }; + return constants$4; +} +var hasRequiredBinding; +function requireBinding() { + if (hasRequiredBinding) return binding; + hasRequiredBinding = 1; + (function(exports) { + var assert2 = requireAssert(); + var Zstream = requireZstream(); + var zlib_deflate = requireDeflate(); + var zlib_inflate = requireInflate(); + var constants2 = requireConstants$4(); + for (var key2 in constants2) { + exports[key2] = constants2[key2]; + } + exports.NONE = 0; + exports.DEFLATE = 1; + exports.INFLATE = 2; + exports.GZIP = 3; + exports.GUNZIP = 4; + exports.DEFLATERAW = 5; + exports.INFLATERAW = 6; + exports.UNZIP = 7; + var GZIP_HEADER_ID1 = 31; + var GZIP_HEADER_ID2 = 139; + function Zlib(mode) { + if (typeof mode !== "number" || mode < exports.DEFLATE || mode > exports.UNZIP) { + throw new TypeError("Bad argument"); + } + this.dictionary = null; + this.err = 0; + this.flush = 0; + this.init_done = false; + this.level = 0; + this.memLevel = 0; + this.mode = mode; + this.strategy = 0; + this.windowBits = 0; + this.write_in_progress = false; + this.pending_close = false; + this.gzip_id_bytes_read = 0; + } + Zlib.prototype.close = function() { + if (this.write_in_progress) { + this.pending_close = true; + return; + } + this.pending_close = false; + assert2(this.init_done, "close before init"); + assert2(this.mode <= exports.UNZIP); + if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) { + zlib_deflate.deflateEnd(this.strm); + } else if (this.mode === exports.INFLATE || this.mode === exports.GUNZIP || this.mode === exports.INFLATERAW || this.mode === exports.UNZIP) { + zlib_inflate.inflateEnd(this.strm); + } + this.mode = exports.NONE; + this.dictionary = null; + }; + Zlib.prototype.write = function(flush, input, in_off, in_len, out, out_off, out_len) { + return this._write(true, flush, input, in_off, in_len, out, out_off, out_len); + }; + Zlib.prototype.writeSync = function(flush, input, in_off, in_len, out, out_off, out_len) { + return this._write(false, flush, input, in_off, in_len, out, out_off, out_len); + }; + Zlib.prototype._write = function(async2, flush, input, in_off, in_len, out, out_off, out_len) { + assert2.equal(arguments.length, 8); + assert2(this.init_done, "write before init"); + assert2(this.mode !== exports.NONE, "already finalized"); + assert2.equal(false, this.write_in_progress, "write already in progress"); + assert2.equal(false, this.pending_close, "close is pending"); + this.write_in_progress = true; + assert2.equal(false, flush === void 0, "must provide flush value"); + this.write_in_progress = true; + if (flush !== exports.Z_NO_FLUSH && flush !== exports.Z_PARTIAL_FLUSH && flush !== exports.Z_SYNC_FLUSH && flush !== exports.Z_FULL_FLUSH && flush !== exports.Z_FINISH && flush !== exports.Z_BLOCK) { + throw new Error("Invalid flush value"); + } + if (input == null) { + input = Buffer.alloc(0); + in_len = 0; + in_off = 0; + } + this.strm.avail_in = in_len; + this.strm.input = input; + this.strm.next_in = in_off; + this.strm.avail_out = out_len; + this.strm.output = out; + this.strm.next_out = out_off; + this.flush = flush; + if (!async2) { + this._process(); + if (this._checkError()) { + return this._afterSync(); + } + return; + } + var self2 = this; + process.nextTick(function() { + self2._process(); + self2._after(); + }); + return this; + }; + Zlib.prototype._afterSync = function() { + var avail_out = this.strm.avail_out; + var avail_in = this.strm.avail_in; + this.write_in_progress = false; + return [avail_in, avail_out]; + }; + Zlib.prototype._process = function() { + var next_expected_header_byte = null; + switch (this.mode) { + case exports.DEFLATE: + case exports.GZIP: + case exports.DEFLATERAW: + this.err = zlib_deflate.deflate(this.strm, this.flush); + break; + case exports.UNZIP: + if (this.strm.avail_in > 0) { + next_expected_header_byte = this.strm.next_in; + } + switch (this.gzip_id_bytes_read) { + case 0: + if (next_expected_header_byte === null) { + break; + } + if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID1) { + this.gzip_id_bytes_read = 1; + next_expected_header_byte++; + if (this.strm.avail_in === 1) { + break; + } + } else { + this.mode = exports.INFLATE; + break; + } + // fallthrough + case 1: + if (next_expected_header_byte === null) { + break; + } + if (this.strm.input[next_expected_header_byte] === GZIP_HEADER_ID2) { + this.gzip_id_bytes_read = 2; + this.mode = exports.GUNZIP; + } else { + this.mode = exports.INFLATE; + } + break; + default: + throw new Error("invalid number of gzip magic number bytes read"); + } + // fallthrough + case exports.INFLATE: + case exports.GUNZIP: + case exports.INFLATERAW: + this.err = zlib_inflate.inflate( + this.strm, + this.flush + // If data was encoded with dictionary + ); + if (this.err === exports.Z_NEED_DICT && this.dictionary) { + this.err = zlib_inflate.inflateSetDictionary(this.strm, this.dictionary); + if (this.err === exports.Z_OK) { + this.err = zlib_inflate.inflate(this.strm, this.flush); + } else if (this.err === exports.Z_DATA_ERROR) { + this.err = exports.Z_NEED_DICT; + } + } + while (this.strm.avail_in > 0 && this.mode === exports.GUNZIP && this.err === exports.Z_STREAM_END && this.strm.next_in[0] !== 0) { + this.reset(); + this.err = zlib_inflate.inflate(this.strm, this.flush); + } + break; + default: + throw new Error("Unknown mode " + this.mode); + } + }; + Zlib.prototype._checkError = function() { + switch (this.err) { + case exports.Z_OK: + case exports.Z_BUF_ERROR: + if (this.strm.avail_out !== 0 && this.flush === exports.Z_FINISH) { + this._error("unexpected end of file"); + return false; + } + break; + case exports.Z_STREAM_END: + break; + case exports.Z_NEED_DICT: + if (this.dictionary == null) { + this._error("Missing dictionary"); + } else { + this._error("Bad dictionary"); + } + return false; + default: + this._error("Zlib error"); + return false; + } + return true; + }; + Zlib.prototype._after = function() { + if (!this._checkError()) { + return; + } + var avail_out = this.strm.avail_out; + var avail_in = this.strm.avail_in; + this.write_in_progress = false; + this.callback(avail_in, avail_out); + if (this.pending_close) { + this.close(); + } + }; + Zlib.prototype._error = function(message) { + if (this.strm.msg) { + message = this.strm.msg; + } + this.onerror( + message, + this.err + // no hope of rescue. + ); + this.write_in_progress = false; + if (this.pending_close) { + this.close(); + } + }; + Zlib.prototype.init = function(windowBits, level, memLevel, strategy, dictionary) { + assert2(arguments.length === 4 || arguments.length === 5, "init(windowBits, level, memLevel, strategy, [dictionary])"); + assert2(windowBits >= 8 && windowBits <= 15, "invalid windowBits"); + assert2(level >= -1 && level <= 9, "invalid compression level"); + assert2(memLevel >= 1 && memLevel <= 9, "invalid memlevel"); + assert2(strategy === exports.Z_FILTERED || strategy === exports.Z_HUFFMAN_ONLY || strategy === exports.Z_RLE || strategy === exports.Z_FIXED || strategy === exports.Z_DEFAULT_STRATEGY, "invalid strategy"); + this._init(level, windowBits, memLevel, strategy, dictionary); + this._setDictionary(); + }; + Zlib.prototype.params = function() { + throw new Error("deflateParams Not supported"); + }; + Zlib.prototype.reset = function() { + this._reset(); + this._setDictionary(); + }; + Zlib.prototype._init = function(level, windowBits, memLevel, strategy, dictionary) { + this.level = level; + this.windowBits = windowBits; + this.memLevel = memLevel; + this.strategy = strategy; + this.flush = exports.Z_NO_FLUSH; + this.err = exports.Z_OK; + if (this.mode === exports.GZIP || this.mode === exports.GUNZIP) { + this.windowBits += 16; + } + if (this.mode === exports.UNZIP) { + this.windowBits += 32; + } + if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW) { + this.windowBits = -1 * this.windowBits; + } + this.strm = new Zstream(); + switch (this.mode) { + case exports.DEFLATE: + case exports.GZIP: + case exports.DEFLATERAW: + this.err = zlib_deflate.deflateInit2(this.strm, this.level, exports.Z_DEFLATED, this.windowBits, this.memLevel, this.strategy); + break; + case exports.INFLATE: + case exports.GUNZIP: + case exports.INFLATERAW: + case exports.UNZIP: + this.err = zlib_inflate.inflateInit2(this.strm, this.windowBits); + break; + default: + throw new Error("Unknown mode " + this.mode); + } + if (this.err !== exports.Z_OK) { + this._error("Init error"); + } + this.dictionary = dictionary; + this.write_in_progress = false; + this.init_done = true; + }; + Zlib.prototype._setDictionary = function() { + if (this.dictionary == null) { + return; + } + this.err = exports.Z_OK; + switch (this.mode) { + case exports.DEFLATE: + case exports.DEFLATERAW: + this.err = zlib_deflate.deflateSetDictionary(this.strm, this.dictionary); + break; + } + if (this.err !== exports.Z_OK) { + this._error("Failed to set dictionary"); + } + }; + Zlib.prototype._reset = function() { + this.err = exports.Z_OK; + switch (this.mode) { + case exports.DEFLATE: + case exports.DEFLATERAW: + case exports.GZIP: + this.err = zlib_deflate.deflateReset(this.strm); + break; + case exports.INFLATE: + case exports.INFLATERAW: + case exports.GUNZIP: + this.err = zlib_inflate.inflateReset(this.strm); + break; + } + if (this.err !== exports.Z_OK) { + this._error("Failed to reset stream"); + } + }; + exports.Zlib = Zlib; + })(binding); + return binding; +} +var hasRequiredLib; +function requireLib() { + if (hasRequiredLib) return lib; + hasRequiredLib = 1; + (function(exports) { + var Buffer2 = requireBuffer$2().Buffer; + var Transform = requireBrowser$h().Transform; + var binding2 = requireBinding(); + var util2 = requireUtil$5(); + var assert2 = requireAssert().ok; + var kMaxLength = requireBuffer$2().kMaxLength; + var kRangeErrorMessage = "Cannot create final Buffer. It would be larger than 0x" + kMaxLength.toString(16) + " bytes"; + binding2.Z_MIN_WINDOWBITS = 8; + binding2.Z_MAX_WINDOWBITS = 15; + binding2.Z_DEFAULT_WINDOWBITS = 15; + binding2.Z_MIN_CHUNK = 64; + binding2.Z_MAX_CHUNK = Infinity; + binding2.Z_DEFAULT_CHUNK = 16 * 1024; + binding2.Z_MIN_MEMLEVEL = 1; + binding2.Z_MAX_MEMLEVEL = 9; + binding2.Z_DEFAULT_MEMLEVEL = 8; + binding2.Z_MIN_LEVEL = -1; + binding2.Z_MAX_LEVEL = 9; + binding2.Z_DEFAULT_LEVEL = binding2.Z_DEFAULT_COMPRESSION; + var bkeys = Object.keys(binding2); + for (var bk = 0; bk < bkeys.length; bk++) { + var bkey = bkeys[bk]; + if (bkey.match(/^Z/)) { + Object.defineProperty(exports, bkey, { + enumerable: true, + value: binding2[bkey], + writable: false + }); + } + } + var codes = { + Z_OK: binding2.Z_OK, + Z_STREAM_END: binding2.Z_STREAM_END, + Z_NEED_DICT: binding2.Z_NEED_DICT, + Z_ERRNO: binding2.Z_ERRNO, + Z_STREAM_ERROR: binding2.Z_STREAM_ERROR, + Z_DATA_ERROR: binding2.Z_DATA_ERROR, + Z_MEM_ERROR: binding2.Z_MEM_ERROR, + Z_BUF_ERROR: binding2.Z_BUF_ERROR, + Z_VERSION_ERROR: binding2.Z_VERSION_ERROR + }; + var ckeys = Object.keys(codes); + for (var ck = 0; ck < ckeys.length; ck++) { + var ckey = ckeys[ck]; + codes[codes[ckey]] = ckey; + } + Object.defineProperty(exports, "codes", { + enumerable: true, + value: Object.freeze(codes), + writable: false + }); + exports.Deflate = Deflate; + exports.Inflate = Inflate; + exports.Gzip = Gzip; + exports.Gunzip = Gunzip; + exports.DeflateRaw = DeflateRaw; + exports.InflateRaw = InflateRaw; + exports.Unzip = Unzip; + exports.createDeflate = function(o) { + return new Deflate(o); + }; + exports.createInflate = function(o) { + return new Inflate(o); + }; + exports.createDeflateRaw = function(o) { + return new DeflateRaw(o); + }; + exports.createInflateRaw = function(o) { + return new InflateRaw(o); + }; + exports.createGzip = function(o) { + return new Gzip(o); + }; + exports.createGunzip = function(o) { + return new Gunzip(o); + }; + exports.createUnzip = function(o) { + return new Unzip(o); + }; + exports.deflate = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new Deflate(opts), buffer2, callback); + }; + exports.deflateSync = function(buffer2, opts) { + return zlibBufferSync(new Deflate(opts), buffer2); + }; + exports.gzip = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new Gzip(opts), buffer2, callback); + }; + exports.gzipSync = function(buffer2, opts) { + return zlibBufferSync(new Gzip(opts), buffer2); + }; + exports.deflateRaw = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new DeflateRaw(opts), buffer2, callback); + }; + exports.deflateRawSync = function(buffer2, opts) { + return zlibBufferSync(new DeflateRaw(opts), buffer2); + }; + exports.unzip = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new Unzip(opts), buffer2, callback); + }; + exports.unzipSync = function(buffer2, opts) { + return zlibBufferSync(new Unzip(opts), buffer2); + }; + exports.inflate = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new Inflate(opts), buffer2, callback); + }; + exports.inflateSync = function(buffer2, opts) { + return zlibBufferSync(new Inflate(opts), buffer2); + }; + exports.gunzip = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new Gunzip(opts), buffer2, callback); + }; + exports.gunzipSync = function(buffer2, opts) { + return zlibBufferSync(new Gunzip(opts), buffer2); + }; + exports.inflateRaw = function(buffer2, opts, callback) { + if (typeof opts === "function") { + callback = opts; + opts = {}; + } + return zlibBuffer(new InflateRaw(opts), buffer2, callback); + }; + exports.inflateRawSync = function(buffer2, opts) { + return zlibBufferSync(new InflateRaw(opts), buffer2); + }; + function zlibBuffer(engine, buffer2, callback) { + var buffers = []; + var nread = 0; + engine.on("error", onError); + engine.on("end", onEnd); + engine.end(buffer2); + flow(); + function flow() { + var chunk; + while (null !== (chunk = engine.read())) { + buffers.push(chunk); + nread += chunk.length; + } + engine.once("readable", flow); + } + function onError(err) { + engine.removeListener("end", onEnd); + engine.removeListener("readable", flow); + callback(err); + } + function onEnd() { + var buf; + var err = null; + if (nread >= kMaxLength) { + err = new RangeError(kRangeErrorMessage); + } else { + buf = Buffer2.concat(buffers, nread); + } + buffers = []; + engine.close(); + callback(err, buf); + } + } + function zlibBufferSync(engine, buffer2) { + if (typeof buffer2 === "string") buffer2 = Buffer2.from(buffer2); + if (!Buffer2.isBuffer(buffer2)) throw new TypeError("Not a string or buffer"); + var flushFlag = engine._finishFlushFlag; + return engine._processChunk(buffer2, flushFlag); + } + function Deflate(opts) { + if (!(this instanceof Deflate)) return new Deflate(opts); + Zlib.call(this, opts, binding2.DEFLATE); + } + function Inflate(opts) { + if (!(this instanceof Inflate)) return new Inflate(opts); + Zlib.call(this, opts, binding2.INFLATE); + } + function Gzip(opts) { + if (!(this instanceof Gzip)) return new Gzip(opts); + Zlib.call(this, opts, binding2.GZIP); + } + function Gunzip(opts) { + if (!(this instanceof Gunzip)) return new Gunzip(opts); + Zlib.call(this, opts, binding2.GUNZIP); + } + function DeflateRaw(opts) { + if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts); + Zlib.call(this, opts, binding2.DEFLATERAW); + } + function InflateRaw(opts) { + if (!(this instanceof InflateRaw)) return new InflateRaw(opts); + Zlib.call(this, opts, binding2.INFLATERAW); + } + function Unzip(opts) { + if (!(this instanceof Unzip)) return new Unzip(opts); + Zlib.call(this, opts, binding2.UNZIP); + } + function isValidFlushFlag(flag) { + return flag === binding2.Z_NO_FLUSH || flag === binding2.Z_PARTIAL_FLUSH || flag === binding2.Z_SYNC_FLUSH || flag === binding2.Z_FULL_FLUSH || flag === binding2.Z_FINISH || flag === binding2.Z_BLOCK; + } + function Zlib(opts, mode) { + var _this = this; + this._opts = opts = opts || {}; + this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK; + Transform.call(this, opts); + if (opts.flush && !isValidFlushFlag(opts.flush)) { + throw new Error("Invalid flush flag: " + opts.flush); + } + if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) { + throw new Error("Invalid flush flag: " + opts.finishFlush); + } + this._flushFlag = opts.flush || binding2.Z_NO_FLUSH; + this._finishFlushFlag = typeof opts.finishFlush !== "undefined" ? opts.finishFlush : binding2.Z_FINISH; + if (opts.chunkSize) { + if (opts.chunkSize < exports.Z_MIN_CHUNK || opts.chunkSize > exports.Z_MAX_CHUNK) { + throw new Error("Invalid chunk size: " + opts.chunkSize); + } + } + if (opts.windowBits) { + if (opts.windowBits < exports.Z_MIN_WINDOWBITS || opts.windowBits > exports.Z_MAX_WINDOWBITS) { + throw new Error("Invalid windowBits: " + opts.windowBits); + } + } + if (opts.level) { + if (opts.level < exports.Z_MIN_LEVEL || opts.level > exports.Z_MAX_LEVEL) { + throw new Error("Invalid compression level: " + opts.level); + } + } + if (opts.memLevel) { + if (opts.memLevel < exports.Z_MIN_MEMLEVEL || opts.memLevel > exports.Z_MAX_MEMLEVEL) { + throw new Error("Invalid memLevel: " + opts.memLevel); + } + } + if (opts.strategy) { + if (opts.strategy != exports.Z_FILTERED && opts.strategy != exports.Z_HUFFMAN_ONLY && opts.strategy != exports.Z_RLE && opts.strategy != exports.Z_FIXED && opts.strategy != exports.Z_DEFAULT_STRATEGY) { + throw new Error("Invalid strategy: " + opts.strategy); + } + } + if (opts.dictionary) { + if (!Buffer2.isBuffer(opts.dictionary)) { + throw new Error("Invalid dictionary: it should be a Buffer instance"); + } + } + this._handle = new binding2.Zlib(mode); + var self2 = this; + this._hadError = false; + this._handle.onerror = function(message, errno) { + _close(self2); + self2._hadError = true; + var error2 = new Error(message); + error2.errno = errno; + error2.code = exports.codes[errno]; + self2.emit("error", error2); + }; + var level = exports.Z_DEFAULT_COMPRESSION; + if (typeof opts.level === "number") level = opts.level; + var strategy = exports.Z_DEFAULT_STRATEGY; + if (typeof opts.strategy === "number") strategy = opts.strategy; + this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, level, opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, strategy, opts.dictionary); + this._buffer = Buffer2.allocUnsafe(this._chunkSize); + this._offset = 0; + this._level = level; + this._strategy = strategy; + this.once("end", this.close); + Object.defineProperty(this, "_closed", { + get: function() { + return !_this._handle; + }, + configurable: true, + enumerable: true + }); + } + util2.inherits(Zlib, Transform); + Zlib.prototype.params = function(level, strategy, callback) { + if (level < exports.Z_MIN_LEVEL || level > exports.Z_MAX_LEVEL) { + throw new RangeError("Invalid compression level: " + level); + } + if (strategy != exports.Z_FILTERED && strategy != exports.Z_HUFFMAN_ONLY && strategy != exports.Z_RLE && strategy != exports.Z_FIXED && strategy != exports.Z_DEFAULT_STRATEGY) { + throw new TypeError("Invalid strategy: " + strategy); + } + if (this._level !== level || this._strategy !== strategy) { + var self2 = this; + this.flush(binding2.Z_SYNC_FLUSH, function() { + assert2(self2._handle, "zlib binding closed"); + self2._handle.params(level, strategy); + if (!self2._hadError) { + self2._level = level; + self2._strategy = strategy; + if (callback) callback(); + } + }); + } else { + process.nextTick(callback); + } + }; + Zlib.prototype.reset = function() { + assert2(this._handle, "zlib binding closed"); + return this._handle.reset(); + }; + Zlib.prototype._flush = function(callback) { + this._transform(Buffer2.alloc(0), "", callback); + }; + Zlib.prototype.flush = function(kind, callback) { + var _this2 = this; + var ws2 = this._writableState; + if (typeof kind === "function" || kind === void 0 && !callback) { + callback = kind; + kind = binding2.Z_FULL_FLUSH; + } + if (ws2.ended) { + if (callback) process.nextTick(callback); + } else if (ws2.ending) { + if (callback) this.once("end", callback); + } else if (ws2.needDrain) { + if (callback) { + this.once("drain", function() { + return _this2.flush(kind, callback); + }); + } + } else { + this._flushFlag = kind; + this.write(Buffer2.alloc(0), "", callback); + } + }; + Zlib.prototype.close = function(callback) { + _close(this, callback); + process.nextTick(emitCloseNT, this); + }; + function _close(engine, callback) { + if (callback) process.nextTick(callback); + if (!engine._handle) return; + engine._handle.close(); + engine._handle = null; + } + function emitCloseNT(self2) { + self2.emit("close"); + } + Zlib.prototype._transform = function(chunk, encoding2, cb) { + var flushFlag; + var ws2 = this._writableState; + var ending = ws2.ending || ws2.ended; + var last = ending && (!chunk || ws2.length === chunk.length); + if (chunk !== null && !Buffer2.isBuffer(chunk)) return cb(new Error("invalid input")); + if (!this._handle) return cb(new Error("zlib binding closed")); + if (last) flushFlag = this._finishFlushFlag; + else { + flushFlag = this._flushFlag; + if (chunk.length >= ws2.length) { + this._flushFlag = this._opts.flush || binding2.Z_NO_FLUSH; + } + } + this._processChunk(chunk, flushFlag, cb); + }; + Zlib.prototype._processChunk = function(chunk, flushFlag, cb) { + var availInBefore = chunk && chunk.length; + var availOutBefore = this._chunkSize - this._offset; + var inOff = 0; + var self2 = this; + var async2 = typeof cb === "function"; + if (!async2) { + var buffers = []; + var nread = 0; + var error2; + this.on("error", function(er) { + error2 = er; + }); + assert2(this._handle, "zlib binding closed"); + do { + var res = this._handle.writeSync( + flushFlag, + chunk, + // in + inOff, + // in_off + availInBefore, + // in_len + this._buffer, + // out + this._offset, + //out_off + availOutBefore + ); + } while (!this._hadError && callback(res[0], res[1])); + if (this._hadError) { + throw error2; + } + if (nread >= kMaxLength) { + _close(this); + throw new RangeError(kRangeErrorMessage); + } + var buf = Buffer2.concat(buffers, nread); + _close(this); + return buf; + } + assert2(this._handle, "zlib binding closed"); + var req = this._handle.write( + flushFlag, + chunk, + // in + inOff, + // in_off + availInBefore, + // in_len + this._buffer, + // out + this._offset, + //out_off + availOutBefore + ); + req.buffer = chunk; + req.callback = callback; + function callback(availInAfter, availOutAfter) { + if (this) { + this.buffer = null; + this.callback = null; + } + if (self2._hadError) return; + var have = availOutBefore - availOutAfter; + assert2(have >= 0, "have should not go down"); + if (have > 0) { + var out = self2._buffer.slice(self2._offset, self2._offset + have); + self2._offset += have; + if (async2) { + self2.push(out); + } else { + buffers.push(out); + nread += out.length; + } + } + if (availOutAfter === 0 || self2._offset >= self2._chunkSize) { + availOutBefore = self2._chunkSize; + self2._offset = 0; + self2._buffer = Buffer2.allocUnsafe(self2._chunkSize); + } + if (availOutAfter === 0) { + inOff += availInBefore - availInAfter; + availInBefore = availInAfter; + if (!async2) return true; + var newReq = self2._handle.write(flushFlag, chunk, inOff, availInBefore, self2._buffer, self2._offset, self2._chunkSize); + newReq.callback = callback; + newReq.buffer = chunk; + return; + } + if (!async2) return false; + cb(); + } + }; + util2.inherits(Deflate, Zlib); + util2.inherits(Inflate, Zlib); + util2.inherits(Gzip, Zlib); + util2.inherits(Gunzip, Zlib); + util2.inherits(DeflateRaw, Zlib); + util2.inherits(InflateRaw, Zlib); + util2.inherits(Unzip, Zlib); + })(lib); + return lib; +} +var chunkstream = { exports: {} }; +var hasRequiredChunkstream; +function requireChunkstream() { + if (hasRequiredChunkstream) return chunkstream.exports; + hasRequiredChunkstream = 1; + let util2 = requireUtil$5(); + let Stream2 = requireBrowser$h(); + let ChunkStream = chunkstream.exports = function() { + Stream2.call(this); + this._buffers = []; + this._buffered = 0; + this._reads = []; + this._paused = false; + this._encoding = "utf8"; + this.writable = true; + }; + util2.inherits(ChunkStream, Stream2); + ChunkStream.prototype.read = function(length, callback) { + this._reads.push({ + length: Math.abs(length), + // if length < 0 then at most this length + allowLess: length < 0, + func: callback + }); + process.nextTick( + (function() { + this._process(); + if (this._paused && this._reads && this._reads.length > 0) { + this._paused = false; + this.emit("drain"); + } + }).bind(this) + ); + }; + ChunkStream.prototype.write = function(data2, encoding2) { + if (!this.writable) { + this.emit("error", new Error("Stream not writable")); + return false; + } + let dataBuffer; + if (Buffer.isBuffer(data2)) { + dataBuffer = data2; + } else { + dataBuffer = Buffer.from(data2, encoding2 || this._encoding); + } + this._buffers.push(dataBuffer); + this._buffered += dataBuffer.length; + this._process(); + if (this._reads && this._reads.length === 0) { + this._paused = true; + } + return this.writable && !this._paused; + }; + ChunkStream.prototype.end = function(data2, encoding2) { + if (data2) { + this.write(data2, encoding2); + } + this.writable = false; + if (!this._buffers) { + return; + } + if (this._buffers.length === 0) { + this._end(); + } else { + this._buffers.push(null); + this._process(); + } + }; + ChunkStream.prototype.destroySoon = ChunkStream.prototype.end; + ChunkStream.prototype._end = function() { + if (this._reads.length > 0) { + this.emit("error", new Error("Unexpected end of input")); + } + this.destroy(); + }; + ChunkStream.prototype.destroy = function() { + if (!this._buffers) { + return; + } + this.writable = false; + this._reads = null; + this._buffers = null; + this.emit("close"); + }; + ChunkStream.prototype._processReadAllowingLess = function(read2) { + this._reads.shift(); + let smallerBuf = this._buffers[0]; + if (smallerBuf.length > read2.length) { + this._buffered -= read2.length; + this._buffers[0] = smallerBuf.slice(read2.length); + read2.func.call(this, smallerBuf.slice(0, read2.length)); + } else { + this._buffered -= smallerBuf.length; + this._buffers.shift(); + read2.func.call(this, smallerBuf); + } + }; + ChunkStream.prototype._processRead = function(read2) { + this._reads.shift(); + let pos = 0; + let count = 0; + let data2 = Buffer.alloc(read2.length); + while (pos < read2.length) { + let buf = this._buffers[count++]; + let len = Math.min(buf.length, read2.length - pos); + buf.copy(data2, pos, 0, len); + pos += len; + if (len !== buf.length) { + this._buffers[--count] = buf.slice(len); + } + } + if (count > 0) { + this._buffers.splice(0, count); + } + this._buffered -= read2.length; + read2.func.call(this, data2); + }; + ChunkStream.prototype._process = function() { + try { + while (this._buffered > 0 && this._reads && this._reads.length > 0) { + let read2 = this._reads[0]; + if (read2.allowLess) { + this._processReadAllowingLess(read2); + } else if (this._buffered >= read2.length) { + this._processRead(read2); + } else { + break; + } + } + if (this._buffers && !this.writable) { + this._end(); + } + } catch (ex) { + this.emit("error", ex); + } + }; + return chunkstream.exports; +} +var filterParseAsync = { exports: {} }; +var filterParse = { exports: {} }; +var interlace = {}; +var hasRequiredInterlace; +function requireInterlace() { + if (hasRequiredInterlace) return interlace; + hasRequiredInterlace = 1; + let imagePasses = [ + { + // pass 1 - 1px + x: [0], + y: [0] + }, + { + // pass 2 - 1px + x: [4], + y: [0] + }, + { + // pass 3 - 2px + x: [0, 4], + y: [4] + }, + { + // pass 4 - 4px + x: [2, 6], + y: [0, 4] + }, + { + // pass 5 - 8px + x: [0, 2, 4, 6], + y: [2, 6] + }, + { + // pass 6 - 16px + x: [1, 3, 5, 7], + y: [0, 2, 4, 6] + }, + { + // pass 7 - 32px + x: [0, 1, 2, 3, 4, 5, 6, 7], + y: [1, 3, 5, 7] + } + ]; + interlace.getImagePasses = function(width, height) { + let images = []; + let xLeftOver = width % 8; + let yLeftOver = height % 8; + let xRepeats = (width - xLeftOver) / 8; + let yRepeats = (height - yLeftOver) / 8; + for (let i = 0; i < imagePasses.length; i++) { + let pass = imagePasses[i]; + let passWidth = xRepeats * pass.x.length; + let passHeight = yRepeats * pass.y.length; + for (let j = 0; j < pass.x.length; j++) { + if (pass.x[j] < xLeftOver) { + passWidth++; + } else { + break; + } + } + for (let j = 0; j < pass.y.length; j++) { + if (pass.y[j] < yLeftOver) { + passHeight++; + } else { + break; + } + } + if (passWidth > 0 && passHeight > 0) { + images.push({ width: passWidth, height: passHeight, index: i }); + } + } + return images; + }; + interlace.getInterlaceIterator = function(width) { + return function(x, y, pass) { + let outerXLeftOver = x % imagePasses[pass].x.length; + let outerX = (x - outerXLeftOver) / imagePasses[pass].x.length * 8 + imagePasses[pass].x[outerXLeftOver]; + let outerYLeftOver = y % imagePasses[pass].y.length; + let outerY = (y - outerYLeftOver) / imagePasses[pass].y.length * 8 + imagePasses[pass].y[outerYLeftOver]; + return outerX * 4 + outerY * width * 4; + }; + }; + return interlace; +} +var paethPredictor; +var hasRequiredPaethPredictor; +function requirePaethPredictor() { + if (hasRequiredPaethPredictor) return paethPredictor; + hasRequiredPaethPredictor = 1; + paethPredictor = function paethPredictor2(left, above, upLeft) { + let paeth = left + above - upLeft; + let pLeft = Math.abs(paeth - left); + let pAbove = Math.abs(paeth - above); + let pUpLeft = Math.abs(paeth - upLeft); + if (pLeft <= pAbove && pLeft <= pUpLeft) { + return left; + } + if (pAbove <= pUpLeft) { + return above; + } + return upLeft; + }; + return paethPredictor; +} +var hasRequiredFilterParse; +function requireFilterParse() { + if (hasRequiredFilterParse) return filterParse.exports; + hasRequiredFilterParse = 1; + let interlaceUtils = requireInterlace(); + let paethPredictor2 = requirePaethPredictor(); + function getByteWidth(width, bpp, depth) { + let byteWidth = width * bpp; + if (depth !== 8) { + byteWidth = Math.ceil(byteWidth / (8 / depth)); + } + return byteWidth; + } + let Filter = filterParse.exports = function(bitmapInfo, dependencies) { + let width = bitmapInfo.width; + let height = bitmapInfo.height; + let interlace2 = bitmapInfo.interlace; + let bpp = bitmapInfo.bpp; + let depth = bitmapInfo.depth; + this.read = dependencies.read; + this.write = dependencies.write; + this.complete = dependencies.complete; + this._imageIndex = 0; + this._images = []; + if (interlace2) { + let passes = interlaceUtils.getImagePasses(width, height); + for (let i = 0; i < passes.length; i++) { + this._images.push({ + byteWidth: getByteWidth(passes[i].width, bpp, depth), + height: passes[i].height, + lineIndex: 0 + }); + } + } else { + this._images.push({ + byteWidth: getByteWidth(width, bpp, depth), + height, + lineIndex: 0 + }); + } + if (depth === 8) { + this._xComparison = bpp; + } else if (depth === 16) { + this._xComparison = bpp * 2; + } else { + this._xComparison = 1; + } + }; + Filter.prototype.start = function() { + this.read( + this._images[this._imageIndex].byteWidth + 1, + this._reverseFilterLine.bind(this) + ); + }; + Filter.prototype._unFilterType1 = function(rawData, unfilteredLine, byteWidth) { + let xComparison = this._xComparison; + let xBiggerThan = xComparison - 1; + for (let x = 0; x < byteWidth; x++) { + let rawByte = rawData[1 + x]; + let f1Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; + unfilteredLine[x] = rawByte + f1Left; + } + }; + Filter.prototype._unFilterType2 = function(rawData, unfilteredLine, byteWidth) { + let lastLine = this._lastLine; + for (let x = 0; x < byteWidth; x++) { + let rawByte = rawData[1 + x]; + let f2Up = lastLine ? lastLine[x] : 0; + unfilteredLine[x] = rawByte + f2Up; + } + }; + Filter.prototype._unFilterType3 = function(rawData, unfilteredLine, byteWidth) { + let xComparison = this._xComparison; + let xBiggerThan = xComparison - 1; + let lastLine = this._lastLine; + for (let x = 0; x < byteWidth; x++) { + let rawByte = rawData[1 + x]; + let f3Up = lastLine ? lastLine[x] : 0; + let f3Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; + let f3Add = Math.floor((f3Left + f3Up) / 2); + unfilteredLine[x] = rawByte + f3Add; + } + }; + Filter.prototype._unFilterType4 = function(rawData, unfilteredLine, byteWidth) { + let xComparison = this._xComparison; + let xBiggerThan = xComparison - 1; + let lastLine = this._lastLine; + for (let x = 0; x < byteWidth; x++) { + let rawByte = rawData[1 + x]; + let f4Up = lastLine ? lastLine[x] : 0; + let f4Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0; + let f4UpLeft = x > xBiggerThan && lastLine ? lastLine[x - xComparison] : 0; + let f4Add = paethPredictor2(f4Left, f4Up, f4UpLeft); + unfilteredLine[x] = rawByte + f4Add; + } + }; + Filter.prototype._reverseFilterLine = function(rawData) { + let filter = rawData[0]; + let unfilteredLine; + let currentImage = this._images[this._imageIndex]; + let byteWidth = currentImage.byteWidth; + if (filter === 0) { + unfilteredLine = rawData.slice(1, byteWidth + 1); + } else { + unfilteredLine = Buffer.alloc(byteWidth); + switch (filter) { + case 1: + this._unFilterType1(rawData, unfilteredLine, byteWidth); + break; + case 2: + this._unFilterType2(rawData, unfilteredLine, byteWidth); + break; + case 3: + this._unFilterType3(rawData, unfilteredLine, byteWidth); + break; + case 4: + this._unFilterType4(rawData, unfilteredLine, byteWidth); + break; + default: + throw new Error("Unrecognised filter type - " + filter); + } + } + this.write(unfilteredLine); + currentImage.lineIndex++; + if (currentImage.lineIndex >= currentImage.height) { + this._lastLine = null; + this._imageIndex++; + currentImage = this._images[this._imageIndex]; + } else { + this._lastLine = unfilteredLine; + } + if (currentImage) { + this.read(currentImage.byteWidth + 1, this._reverseFilterLine.bind(this)); + } else { + this._lastLine = null; + this.complete(); + } + }; + return filterParse.exports; +} +var hasRequiredFilterParseAsync; +function requireFilterParseAsync() { + if (hasRequiredFilterParseAsync) return filterParseAsync.exports; + hasRequiredFilterParseAsync = 1; + let util2 = requireUtil$5(); + let ChunkStream = requireChunkstream(); + let Filter = requireFilterParse(); + let FilterAsync = filterParseAsync.exports = function(bitmapInfo) { + ChunkStream.call(this); + let buffers = []; + let that = this; + this._filter = new Filter(bitmapInfo, { + read: this.read.bind(this), + write: function(buffer2) { + buffers.push(buffer2); + }, + complete: function() { + that.emit("complete", Buffer.concat(buffers)); + } + }); + this._filter.start(); + }; + util2.inherits(FilterAsync, ChunkStream); + return filterParseAsync.exports; +} +var parser = { exports: {} }; +var constants$3; +var hasRequiredConstants$3; +function requireConstants$3() { + if (hasRequiredConstants$3) return constants$3; + hasRequiredConstants$3 = 1; + constants$3 = { + PNG_SIGNATURE: [137, 80, 78, 71, 13, 10, 26, 10], + TYPE_IHDR: 1229472850, + TYPE_IEND: 1229278788, + TYPE_IDAT: 1229209940, + TYPE_PLTE: 1347179589, + TYPE_tRNS: 1951551059, + // eslint-disable-line camelcase + TYPE_gAMA: 1732332865, + // eslint-disable-line camelcase + // color-type bits + COLORTYPE_GRAYSCALE: 0, + COLORTYPE_PALETTE: 1, + COLORTYPE_COLOR: 2, + COLORTYPE_ALPHA: 4, + // e.g. grayscale and alpha + // color-type combinations + COLORTYPE_PALETTE_COLOR: 3, + COLORTYPE_COLOR_ALPHA: 6, + COLORTYPE_TO_BPP_MAP: { + 0: 1, + 2: 3, + 3: 1, + 4: 2, + 6: 4 + }, + GAMMA_DIVISION: 1e5 + }; + return constants$3; +} +var crc = { exports: {} }; +var hasRequiredCrc; +function requireCrc() { + if (hasRequiredCrc) return crc.exports; + hasRequiredCrc = 1; + let crcTable = []; + (function() { + for (let i = 0; i < 256; i++) { + let currentCrc = i; + for (let j = 0; j < 8; j++) { + if (currentCrc & 1) { + currentCrc = 3988292384 ^ currentCrc >>> 1; + } else { + currentCrc = currentCrc >>> 1; + } + } + crcTable[i] = currentCrc; + } + })(); + let CrcCalculator = crc.exports = function() { + this._crc = -1; + }; + CrcCalculator.prototype.write = function(data2) { + for (let i = 0; i < data2.length; i++) { + this._crc = crcTable[(this._crc ^ data2[i]) & 255] ^ this._crc >>> 8; + } + return true; + }; + CrcCalculator.prototype.crc32 = function() { + return this._crc ^ -1; + }; + CrcCalculator.crc32 = function(buf) { + let crc2 = -1; + for (let i = 0; i < buf.length; i++) { + crc2 = crcTable[(crc2 ^ buf[i]) & 255] ^ crc2 >>> 8; + } + return crc2 ^ -1; + }; + return crc.exports; +} +var hasRequiredParser; +function requireParser() { + if (hasRequiredParser) return parser.exports; + hasRequiredParser = 1; + let constants2 = requireConstants$3(); + let CrcCalculator = requireCrc(); + let Parser4 = parser.exports = function(options2, dependencies) { + this._options = options2; + options2.checkCRC = options2.checkCRC !== false; + this._hasIHDR = false; + this._hasIEND = false; + this._emittedHeadersFinished = false; + this._palette = []; + this._colorType = 0; + this._chunks = {}; + this._chunks[constants2.TYPE_IHDR] = this._handleIHDR.bind(this); + this._chunks[constants2.TYPE_IEND] = this._handleIEND.bind(this); + this._chunks[constants2.TYPE_IDAT] = this._handleIDAT.bind(this); + this._chunks[constants2.TYPE_PLTE] = this._handlePLTE.bind(this); + this._chunks[constants2.TYPE_tRNS] = this._handleTRNS.bind(this); + this._chunks[constants2.TYPE_gAMA] = this._handleGAMA.bind(this); + this.read = dependencies.read; + this.error = dependencies.error; + this.metadata = dependencies.metadata; + this.gamma = dependencies.gamma; + this.transColor = dependencies.transColor; + this.palette = dependencies.palette; + this.parsed = dependencies.parsed; + this.inflateData = dependencies.inflateData; + this.finished = dependencies.finished; + this.simpleTransparency = dependencies.simpleTransparency; + this.headersFinished = dependencies.headersFinished || function() { + }; + }; + Parser4.prototype.start = function() { + this.read(constants2.PNG_SIGNATURE.length, this._parseSignature.bind(this)); + }; + Parser4.prototype._parseSignature = function(data2) { + let signature2 = constants2.PNG_SIGNATURE; + for (let i = 0; i < signature2.length; i++) { + if (data2[i] !== signature2[i]) { + this.error(new Error("Invalid file signature")); + return; + } + } + this.read(8, this._parseChunkBegin.bind(this)); + }; + Parser4.prototype._parseChunkBegin = function(data2) { + let length = data2.readUInt32BE(0); + let type2 = data2.readUInt32BE(4); + let name = ""; + for (let i = 4; i < 8; i++) { + name += String.fromCharCode(data2[i]); + } + let ancillary = Boolean(data2[4] & 32); + if (!this._hasIHDR && type2 !== constants2.TYPE_IHDR) { + this.error(new Error("Expected IHDR on beggining")); + return; + } + this._crc = new CrcCalculator(); + this._crc.write(Buffer.from(name)); + if (this._chunks[type2]) { + return this._chunks[type2](length); + } + if (!ancillary) { + this.error(new Error("Unsupported critical chunk type " + name)); + return; + } + this.read(length + 4, this._skipChunk.bind(this)); + }; + Parser4.prototype._skipChunk = function() { + this.read(8, this._parseChunkBegin.bind(this)); + }; + Parser4.prototype._handleChunkEnd = function() { + this.read(4, this._parseChunkEnd.bind(this)); + }; + Parser4.prototype._parseChunkEnd = function(data2) { + let fileCrc = data2.readInt32BE(0); + let calcCrc = this._crc.crc32(); + if (this._options.checkCRC && calcCrc !== fileCrc) { + this.error(new Error("Crc error - " + fileCrc + " - " + calcCrc)); + return; + } + if (!this._hasIEND) { + this.read(8, this._parseChunkBegin.bind(this)); + } + }; + Parser4.prototype._handleIHDR = function(length) { + this.read(length, this._parseIHDR.bind(this)); + }; + Parser4.prototype._parseIHDR = function(data2) { + this._crc.write(data2); + let width = data2.readUInt32BE(0); + let height = data2.readUInt32BE(4); + let depth = data2[8]; + let colorType = data2[9]; + let compr = data2[10]; + let filter = data2[11]; + let interlace2 = data2[12]; + if (depth !== 8 && depth !== 4 && depth !== 2 && depth !== 1 && depth !== 16) { + this.error(new Error("Unsupported bit depth " + depth)); + return; + } + if (!(colorType in constants2.COLORTYPE_TO_BPP_MAP)) { + this.error(new Error("Unsupported color type")); + return; + } + if (compr !== 0) { + this.error(new Error("Unsupported compression method")); + return; + } + if (filter !== 0) { + this.error(new Error("Unsupported filter method")); + return; + } + if (interlace2 !== 0 && interlace2 !== 1) { + this.error(new Error("Unsupported interlace method")); + return; + } + this._colorType = colorType; + let bpp = constants2.COLORTYPE_TO_BPP_MAP[this._colorType]; + this._hasIHDR = true; + this.metadata({ + width, + height, + depth, + interlace: Boolean(interlace2), + palette: Boolean(colorType & constants2.COLORTYPE_PALETTE), + color: Boolean(colorType & constants2.COLORTYPE_COLOR), + alpha: Boolean(colorType & constants2.COLORTYPE_ALPHA), + bpp, + colorType + }); + this._handleChunkEnd(); + }; + Parser4.prototype._handlePLTE = function(length) { + this.read(length, this._parsePLTE.bind(this)); + }; + Parser4.prototype._parsePLTE = function(data2) { + this._crc.write(data2); + let entries = Math.floor(data2.length / 3); + for (let i = 0; i < entries; i++) { + this._palette.push([data2[i * 3], data2[i * 3 + 1], data2[i * 3 + 2], 255]); + } + this.palette(this._palette); + this._handleChunkEnd(); + }; + Parser4.prototype._handleTRNS = function(length) { + this.simpleTransparency(); + this.read(length, this._parseTRNS.bind(this)); + }; + Parser4.prototype._parseTRNS = function(data2) { + this._crc.write(data2); + if (this._colorType === constants2.COLORTYPE_PALETTE_COLOR) { + if (this._palette.length === 0) { + this.error(new Error("Transparency chunk must be after palette")); + return; + } + if (data2.length > this._palette.length) { + this.error(new Error("More transparent colors than palette size")); + return; + } + for (let i = 0; i < data2.length; i++) { + this._palette[i][3] = data2[i]; + } + this.palette(this._palette); + } + if (this._colorType === constants2.COLORTYPE_GRAYSCALE) { + this.transColor([data2.readUInt16BE(0)]); + } + if (this._colorType === constants2.COLORTYPE_COLOR) { + this.transColor([ + data2.readUInt16BE(0), + data2.readUInt16BE(2), + data2.readUInt16BE(4) + ]); + } + this._handleChunkEnd(); + }; + Parser4.prototype._handleGAMA = function(length) { + this.read(length, this._parseGAMA.bind(this)); + }; + Parser4.prototype._parseGAMA = function(data2) { + this._crc.write(data2); + this.gamma(data2.readUInt32BE(0) / constants2.GAMMA_DIVISION); + this._handleChunkEnd(); + }; + Parser4.prototype._handleIDAT = function(length) { + if (!this._emittedHeadersFinished) { + this._emittedHeadersFinished = true; + this.headersFinished(); + } + this.read(-length, this._parseIDAT.bind(this, length)); + }; + Parser4.prototype._parseIDAT = function(length, data2) { + this._crc.write(data2); + if (this._colorType === constants2.COLORTYPE_PALETTE_COLOR && this._palette.length === 0) { + throw new Error("Expected palette not found"); + } + this.inflateData(data2); + let leftOverLength = length - data2.length; + if (leftOverLength > 0) { + this._handleIDAT(leftOverLength); + } else { + this._handleChunkEnd(); + } + }; + Parser4.prototype._handleIEND = function(length) { + this.read(length, this._parseIEND.bind(this)); + }; + Parser4.prototype._parseIEND = function(data2) { + this._crc.write(data2); + this._hasIEND = true; + this._handleChunkEnd(); + if (this.finished) { + this.finished(); + } + }; + return parser.exports; +} +var bitmapper = {}; +var hasRequiredBitmapper; +function requireBitmapper() { + if (hasRequiredBitmapper) return bitmapper; + hasRequiredBitmapper = 1; + let interlaceUtils = requireInterlace(); + let pixelBppMapper = [ + // 0 - dummy entry + function() { + }, + // 1 - L + // 0: 0, 1: 0, 2: 0, 3: 0xff + function(pxData, data2, pxPos, rawPos) { + if (rawPos === data2.length) { + throw new Error("Ran out of data"); + } + let pixel = data2[rawPos]; + pxData[pxPos] = pixel; + pxData[pxPos + 1] = pixel; + pxData[pxPos + 2] = pixel; + pxData[pxPos + 3] = 255; + }, + // 2 - LA + // 0: 0, 1: 0, 2: 0, 3: 1 + function(pxData, data2, pxPos, rawPos) { + if (rawPos + 1 >= data2.length) { + throw new Error("Ran out of data"); + } + let pixel = data2[rawPos]; + pxData[pxPos] = pixel; + pxData[pxPos + 1] = pixel; + pxData[pxPos + 2] = pixel; + pxData[pxPos + 3] = data2[rawPos + 1]; + }, + // 3 - RGB + // 0: 0, 1: 1, 2: 2, 3: 0xff + function(pxData, data2, pxPos, rawPos) { + if (rawPos + 2 >= data2.length) { + throw new Error("Ran out of data"); + } + pxData[pxPos] = data2[rawPos]; + pxData[pxPos + 1] = data2[rawPos + 1]; + pxData[pxPos + 2] = data2[rawPos + 2]; + pxData[pxPos + 3] = 255; + }, + // 4 - RGBA + // 0: 0, 1: 1, 2: 2, 3: 3 + function(pxData, data2, pxPos, rawPos) { + if (rawPos + 3 >= data2.length) { + throw new Error("Ran out of data"); + } + pxData[pxPos] = data2[rawPos]; + pxData[pxPos + 1] = data2[rawPos + 1]; + pxData[pxPos + 2] = data2[rawPos + 2]; + pxData[pxPos + 3] = data2[rawPos + 3]; + } + ]; + let pixelBppCustomMapper = [ + // 0 - dummy entry + function() { + }, + // 1 - L + // 0: 0, 1: 0, 2: 0, 3: 0xff + function(pxData, pixelData, pxPos, maxBit) { + let pixel = pixelData[0]; + pxData[pxPos] = pixel; + pxData[pxPos + 1] = pixel; + pxData[pxPos + 2] = pixel; + pxData[pxPos + 3] = maxBit; + }, + // 2 - LA + // 0: 0, 1: 0, 2: 0, 3: 1 + function(pxData, pixelData, pxPos) { + let pixel = pixelData[0]; + pxData[pxPos] = pixel; + pxData[pxPos + 1] = pixel; + pxData[pxPos + 2] = pixel; + pxData[pxPos + 3] = pixelData[1]; + }, + // 3 - RGB + // 0: 0, 1: 1, 2: 2, 3: 0xff + function(pxData, pixelData, pxPos, maxBit) { + pxData[pxPos] = pixelData[0]; + pxData[pxPos + 1] = pixelData[1]; + pxData[pxPos + 2] = pixelData[2]; + pxData[pxPos + 3] = maxBit; + }, + // 4 - RGBA + // 0: 0, 1: 1, 2: 2, 3: 3 + function(pxData, pixelData, pxPos) { + pxData[pxPos] = pixelData[0]; + pxData[pxPos + 1] = pixelData[1]; + pxData[pxPos + 2] = pixelData[2]; + pxData[pxPos + 3] = pixelData[3]; + } + ]; + function bitRetriever(data2, depth) { + let leftOver = []; + let i = 0; + function split() { + if (i === data2.length) { + throw new Error("Ran out of data"); + } + let byte = data2[i]; + i++; + let byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1; + switch (depth) { + default: + throw new Error("unrecognised depth"); + case 16: + byte2 = data2[i]; + i++; + leftOver.push((byte << 8) + byte2); + break; + case 4: + byte2 = byte & 15; + byte1 = byte >> 4; + leftOver.push(byte1, byte2); + break; + case 2: + byte4 = byte & 3; + byte3 = byte >> 2 & 3; + byte2 = byte >> 4 & 3; + byte1 = byte >> 6 & 3; + leftOver.push(byte1, byte2, byte3, byte4); + break; + case 1: + byte8 = byte & 1; + byte7 = byte >> 1 & 1; + byte6 = byte >> 2 & 1; + byte5 = byte >> 3 & 1; + byte4 = byte >> 4 & 1; + byte3 = byte >> 5 & 1; + byte2 = byte >> 6 & 1; + byte1 = byte >> 7 & 1; + leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8); + break; + } + } + return { + get: function(count) { + while (leftOver.length < count) { + split(); + } + let returner = leftOver.slice(0, count); + leftOver = leftOver.slice(count); + return returner; + }, + resetAfterLine: function() { + leftOver.length = 0; + }, + end: function() { + if (i !== data2.length) { + throw new Error("extra data found"); + } + } + }; + } + function mapImage8Bit(image, pxData, getPxPos, bpp, data2, rawPos) { + let imageWidth = image.width; + let imageHeight = image.height; + let imagePass = image.index; + for (let y = 0; y < imageHeight; y++) { + for (let x = 0; x < imageWidth; x++) { + let pxPos = getPxPos(x, y, imagePass); + pixelBppMapper[bpp](pxData, data2, pxPos, rawPos); + rawPos += bpp; + } + } + return rawPos; + } + function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) { + let imageWidth = image.width; + let imageHeight = image.height; + let imagePass = image.index; + for (let y = 0; y < imageHeight; y++) { + for (let x = 0; x < imageWidth; x++) { + let pixelData = bits.get(bpp); + let pxPos = getPxPos(x, y, imagePass); + pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit); + } + bits.resetAfterLine(); + } + } + bitmapper.dataToBitMap = function(data2, bitmapInfo) { + let width = bitmapInfo.width; + let height = bitmapInfo.height; + let depth = bitmapInfo.depth; + let bpp = bitmapInfo.bpp; + let interlace2 = bitmapInfo.interlace; + let bits; + if (depth !== 8) { + bits = bitRetriever(data2, depth); + } + let pxData; + if (depth <= 8) { + pxData = Buffer.alloc(width * height * 4); + } else { + pxData = new Uint16Array(width * height * 4); + } + let maxBit = Math.pow(2, depth) - 1; + let rawPos = 0; + let images; + let getPxPos; + if (interlace2) { + images = interlaceUtils.getImagePasses(width, height); + getPxPos = interlaceUtils.getInterlaceIterator(width, height); + } else { + let nonInterlacedPxPos = 0; + getPxPos = function() { + let returner = nonInterlacedPxPos; + nonInterlacedPxPos += 4; + return returner; + }; + images = [{ width, height }]; + } + for (let imageIndex = 0; imageIndex < images.length; imageIndex++) { + if (depth === 8) { + rawPos = mapImage8Bit( + images[imageIndex], + pxData, + getPxPos, + bpp, + data2, + rawPos + ); + } else { + mapImageCustomBit( + images[imageIndex], + pxData, + getPxPos, + bpp, + bits, + maxBit + ); + } + } + if (depth === 8) { + if (rawPos !== data2.length) { + throw new Error("extra data found"); + } + } else { + bits.end(); + } + return pxData; + }; + return bitmapper; +} +var formatNormaliser; +var hasRequiredFormatNormaliser; +function requireFormatNormaliser() { + if (hasRequiredFormatNormaliser) return formatNormaliser; + hasRequiredFormatNormaliser = 1; + function dePalette(indata, outdata, width, height, palette) { + let pxPos = 0; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + let color = palette[indata[pxPos]]; + if (!color) { + throw new Error("index " + indata[pxPos] + " not in palette"); + } + for (let i = 0; i < 4; i++) { + outdata[pxPos + i] = color[i]; + } + pxPos += 4; + } + } + } + function replaceTransparentColor(indata, outdata, width, height, transColor) { + let pxPos = 0; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + let makeTrans = false; + if (transColor.length === 1) { + if (transColor[0] === indata[pxPos]) { + makeTrans = true; + } + } else if (transColor[0] === indata[pxPos] && transColor[1] === indata[pxPos + 1] && transColor[2] === indata[pxPos + 2]) { + makeTrans = true; + } + if (makeTrans) { + for (let i = 0; i < 4; i++) { + outdata[pxPos + i] = 0; + } + } + pxPos += 4; + } + } + } + function scaleDepth(indata, outdata, width, height, depth) { + let maxOutSample = 255; + let maxInSample = Math.pow(2, depth) - 1; + let pxPos = 0; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + for (let i = 0; i < 4; i++) { + outdata[pxPos + i] = Math.floor( + indata[pxPos + i] * maxOutSample / maxInSample + 0.5 + ); + } + pxPos += 4; + } + } + } + formatNormaliser = function(indata, imageData, skipRescale = false) { + let depth = imageData.depth; + let width = imageData.width; + let height = imageData.height; + let colorType = imageData.colorType; + let transColor = imageData.transColor; + let palette = imageData.palette; + let outdata = indata; + if (colorType === 3) { + dePalette(indata, outdata, width, height, palette); + } else { + if (transColor) { + replaceTransparentColor(indata, outdata, width, height, transColor); + } + if (depth !== 8 && !skipRescale) { + if (depth === 16) { + outdata = Buffer.alloc(width * height * 4); + } + scaleDepth(indata, outdata, width, height, depth); + } + } + return outdata; + }; + return formatNormaliser; +} +var hasRequiredParserAsync; +function requireParserAsync() { + if (hasRequiredParserAsync) return parserAsync.exports; + hasRequiredParserAsync = 1; + let util2 = requireUtil$5(); + let zlib = requireLib(); + let ChunkStream = requireChunkstream(); + let FilterAsync = requireFilterParseAsync(); + let Parser4 = requireParser(); + let bitmapper2 = requireBitmapper(); + let formatNormaliser2 = requireFormatNormaliser(); + let ParserAsync = parserAsync.exports = function(options2) { + ChunkStream.call(this); + this._parser = new Parser4(options2, { + read: this.read.bind(this), + error: this._handleError.bind(this), + metadata: this._handleMetaData.bind(this), + gamma: this.emit.bind(this, "gamma"), + palette: this._handlePalette.bind(this), + transColor: this._handleTransColor.bind(this), + finished: this._finished.bind(this), + inflateData: this._inflateData.bind(this), + simpleTransparency: this._simpleTransparency.bind(this), + headersFinished: this._headersFinished.bind(this) + }); + this._options = options2; + this.writable = true; + this._parser.start(); + }; + util2.inherits(ParserAsync, ChunkStream); + ParserAsync.prototype._handleError = function(err) { + this.emit("error", err); + this.writable = false; + this.destroy(); + if (this._inflate && this._inflate.destroy) { + this._inflate.destroy(); + } + if (this._filter) { + this._filter.destroy(); + this._filter.on("error", function() { + }); + } + this.errord = true; + }; + ParserAsync.prototype._inflateData = function(data2) { + if (!this._inflate) { + if (this._bitmapInfo.interlace) { + this._inflate = zlib.createInflate(); + this._inflate.on("error", this.emit.bind(this, "error")); + this._filter.on("complete", this._complete.bind(this)); + this._inflate.pipe(this._filter); + } else { + let rowSize = (this._bitmapInfo.width * this._bitmapInfo.bpp * this._bitmapInfo.depth + 7 >> 3) + 1; + let imageSize = rowSize * this._bitmapInfo.height; + let chunkSize = Math.max(imageSize, zlib.Z_MIN_CHUNK); + this._inflate = zlib.createInflate({ chunkSize }); + let leftToInflate = imageSize; + let emitError = this.emit.bind(this, "error"); + this._inflate.on("error", function(err) { + if (!leftToInflate) { + return; + } + emitError(err); + }); + this._filter.on("complete", this._complete.bind(this)); + let filterWrite = this._filter.write.bind(this._filter); + this._inflate.on("data", function(chunk) { + if (!leftToInflate) { + return; + } + if (chunk.length > leftToInflate) { + chunk = chunk.slice(0, leftToInflate); + } + leftToInflate -= chunk.length; + filterWrite(chunk); + }); + this._inflate.on("end", this._filter.end.bind(this._filter)); + } + } + this._inflate.write(data2); + }; + ParserAsync.prototype._handleMetaData = function(metaData) { + this._metaData = metaData; + this._bitmapInfo = Object.create(metaData); + this._filter = new FilterAsync(this._bitmapInfo); + }; + ParserAsync.prototype._handleTransColor = function(transColor) { + this._bitmapInfo.transColor = transColor; + }; + ParserAsync.prototype._handlePalette = function(palette) { + this._bitmapInfo.palette = palette; + }; + ParserAsync.prototype._simpleTransparency = function() { + this._metaData.alpha = true; + }; + ParserAsync.prototype._headersFinished = function() { + this.emit("metadata", this._metaData); + }; + ParserAsync.prototype._finished = function() { + if (this.errord) { + return; + } + if (!this._inflate) { + this.emit("error", "No Inflate block"); + } else { + this._inflate.end(); + } + }; + ParserAsync.prototype._complete = function(filteredData) { + if (this.errord) { + return; + } + let normalisedBitmapData; + try { + let bitmapData = bitmapper2.dataToBitMap(filteredData, this._bitmapInfo); + normalisedBitmapData = formatNormaliser2( + bitmapData, + this._bitmapInfo, + this._options.skipRescale + ); + bitmapData = null; + } catch (ex) { + this._handleError(ex); + return; + } + this.emit("parsed", normalisedBitmapData); + }; + return parserAsync.exports; +} +var packerAsync = { exports: {} }; +var packer = { exports: {} }; +var bitpacker; +var hasRequiredBitpacker; +function requireBitpacker() { + if (hasRequiredBitpacker) return bitpacker; + hasRequiredBitpacker = 1; + let constants2 = requireConstants$3(); + bitpacker = function(dataIn, width, height, options2) { + let outHasAlpha = [constants2.COLORTYPE_COLOR_ALPHA, constants2.COLORTYPE_ALPHA].indexOf( + options2.colorType + ) !== -1; + if (options2.colorType === options2.inputColorType) { + let bigEndian = function() { + let buffer2 = new ArrayBuffer(2); + new DataView(buffer2).setInt16( + 0, + 256, + true + /* littleEndian */ + ); + return new Int16Array(buffer2)[0] !== 256; + }(); + if (options2.bitDepth === 8 || options2.bitDepth === 16 && bigEndian) { + return dataIn; + } + } + let data2 = options2.bitDepth !== 16 ? dataIn : new Uint16Array(dataIn.buffer); + let maxValue = 255; + let inBpp = constants2.COLORTYPE_TO_BPP_MAP[options2.inputColorType]; + if (inBpp === 4 && !options2.inputHasAlpha) { + inBpp = 3; + } + let outBpp = constants2.COLORTYPE_TO_BPP_MAP[options2.colorType]; + if (options2.bitDepth === 16) { + maxValue = 65535; + outBpp *= 2; + } + let outData = Buffer.alloc(width * height * outBpp); + let inIndex = 0; + let outIndex = 0; + let bgColor = options2.bgColor || {}; + if (bgColor.red === void 0) { + bgColor.red = maxValue; + } + if (bgColor.green === void 0) { + bgColor.green = maxValue; + } + if (bgColor.blue === void 0) { + bgColor.blue = maxValue; + } + function getRGBA() { + let red; + let green; + let blue; + let alpha = maxValue; + switch (options2.inputColorType) { + case constants2.COLORTYPE_COLOR_ALPHA: + alpha = data2[inIndex + 3]; + red = data2[inIndex]; + green = data2[inIndex + 1]; + blue = data2[inIndex + 2]; + break; + case constants2.COLORTYPE_COLOR: + red = data2[inIndex]; + green = data2[inIndex + 1]; + blue = data2[inIndex + 2]; + break; + case constants2.COLORTYPE_ALPHA: + alpha = data2[inIndex + 1]; + red = data2[inIndex]; + green = red; + blue = red; + break; + case constants2.COLORTYPE_GRAYSCALE: + red = data2[inIndex]; + green = red; + blue = red; + break; + default: + throw new Error( + "input color type:" + options2.inputColorType + " is not supported at present" + ); + } + if (options2.inputHasAlpha) { + if (!outHasAlpha) { + alpha /= maxValue; + red = Math.min( + Math.max(Math.round((1 - alpha) * bgColor.red + alpha * red), 0), + maxValue + ); + green = Math.min( + Math.max(Math.round((1 - alpha) * bgColor.green + alpha * green), 0), + maxValue + ); + blue = Math.min( + Math.max(Math.round((1 - alpha) * bgColor.blue + alpha * blue), 0), + maxValue + ); + } + } + return { red, green, blue, alpha }; + } + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + let rgba = getRGBA(); + switch (options2.colorType) { + case constants2.COLORTYPE_COLOR_ALPHA: + case constants2.COLORTYPE_COLOR: + if (options2.bitDepth === 8) { + outData[outIndex] = rgba.red; + outData[outIndex + 1] = rgba.green; + outData[outIndex + 2] = rgba.blue; + if (outHasAlpha) { + outData[outIndex + 3] = rgba.alpha; + } + } else { + outData.writeUInt16BE(rgba.red, outIndex); + outData.writeUInt16BE(rgba.green, outIndex + 2); + outData.writeUInt16BE(rgba.blue, outIndex + 4); + if (outHasAlpha) { + outData.writeUInt16BE(rgba.alpha, outIndex + 6); + } + } + break; + case constants2.COLORTYPE_ALPHA: + case constants2.COLORTYPE_GRAYSCALE: { + let grayscale = (rgba.red + rgba.green + rgba.blue) / 3; + if (options2.bitDepth === 8) { + outData[outIndex] = grayscale; + if (outHasAlpha) { + outData[outIndex + 1] = rgba.alpha; + } + } else { + outData.writeUInt16BE(grayscale, outIndex); + if (outHasAlpha) { + outData.writeUInt16BE(rgba.alpha, outIndex + 2); + } + } + break; + } + default: + throw new Error("unrecognised color Type " + options2.colorType); + } + inIndex += inBpp; + outIndex += outBpp; + } + } + return outData; + }; + return bitpacker; +} +var filterPack; +var hasRequiredFilterPack; +function requireFilterPack() { + if (hasRequiredFilterPack) return filterPack; + hasRequiredFilterPack = 1; + let paethPredictor2 = requirePaethPredictor(); + function filterNone(pxData, pxPos, byteWidth, rawData, rawPos) { + for (let x = 0; x < byteWidth; x++) { + rawData[rawPos + x] = pxData[pxPos + x]; + } + } + function filterSumNone(pxData, pxPos, byteWidth) { + let sum = 0; + let length = pxPos + byteWidth; + for (let i = pxPos; i < length; i++) { + sum += Math.abs(pxData[i]); + } + return sum; + } + function filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { + for (let x = 0; x < byteWidth; x++) { + let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; + let val = pxData[pxPos + x] - left; + rawData[rawPos + x] = val; + } + } + function filterSumSub(pxData, pxPos, byteWidth, bpp) { + let sum = 0; + for (let x = 0; x < byteWidth; x++) { + let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; + let val = pxData[pxPos + x] - left; + sum += Math.abs(val); + } + return sum; + } + function filterUp(pxData, pxPos, byteWidth, rawData, rawPos) { + for (let x = 0; x < byteWidth; x++) { + let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; + let val = pxData[pxPos + x] - up; + rawData[rawPos + x] = val; + } + } + function filterSumUp(pxData, pxPos, byteWidth) { + let sum = 0; + let length = pxPos + byteWidth; + for (let x = pxPos; x < length; x++) { + let up = pxPos > 0 ? pxData[x - byteWidth] : 0; + let val = pxData[x] - up; + sum += Math.abs(val); + } + return sum; + } + function filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { + for (let x = 0; x < byteWidth; x++) { + let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; + let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; + let val = pxData[pxPos + x] - (left + up >> 1); + rawData[rawPos + x] = val; + } + } + function filterSumAvg(pxData, pxPos, byteWidth, bpp) { + let sum = 0; + for (let x = 0; x < byteWidth; x++) { + let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; + let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; + let val = pxData[pxPos + x] - (left + up >> 1); + sum += Math.abs(val); + } + return sum; + } + function filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) { + for (let x = 0; x < byteWidth; x++) { + let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; + let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; + let upleft = pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; + let val = pxData[pxPos + x] - paethPredictor2(left, up, upleft); + rawData[rawPos + x] = val; + } + } + function filterSumPaeth(pxData, pxPos, byteWidth, bpp) { + let sum = 0; + for (let x = 0; x < byteWidth; x++) { + let left = x >= bpp ? pxData[pxPos + x - bpp] : 0; + let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0; + let upleft = pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0; + let val = pxData[pxPos + x] - paethPredictor2(left, up, upleft); + sum += Math.abs(val); + } + return sum; + } + let filters = { + 0: filterNone, + 1: filterSub, + 2: filterUp, + 3: filterAvg, + 4: filterPaeth + }; + let filterSums = { + 0: filterSumNone, + 1: filterSumSub, + 2: filterSumUp, + 3: filterSumAvg, + 4: filterSumPaeth + }; + filterPack = function(pxData, width, height, options2, bpp) { + let filterTypes; + if (!("filterType" in options2) || options2.filterType === -1) { + filterTypes = [0, 1, 2, 3, 4]; + } else if (typeof options2.filterType === "number") { + filterTypes = [options2.filterType]; + } else { + throw new Error("unrecognised filter types"); + } + if (options2.bitDepth === 16) { + bpp *= 2; + } + let byteWidth = width * bpp; + let rawPos = 0; + let pxPos = 0; + let rawData = Buffer.alloc((byteWidth + 1) * height); + let sel = filterTypes[0]; + for (let y = 0; y < height; y++) { + if (filterTypes.length > 1) { + let min2 = Infinity; + for (let i = 0; i < filterTypes.length; i++) { + let sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp); + if (sum < min2) { + sel = filterTypes[i]; + min2 = sum; + } + } + } + rawData[rawPos] = sel; + rawPos++; + filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp); + rawPos += byteWidth; + pxPos += byteWidth; + } + return rawData; + }; + return filterPack; +} +var hasRequiredPacker; +function requirePacker() { + if (hasRequiredPacker) return packer.exports; + hasRequiredPacker = 1; + let constants2 = requireConstants$3(); + let CrcStream = requireCrc(); + let bitPacker = requireBitpacker(); + let filter = requireFilterPack(); + let zlib = requireLib(); + let Packer = packer.exports = function(options2) { + this._options = options2; + options2.deflateChunkSize = options2.deflateChunkSize || 32 * 1024; + options2.deflateLevel = options2.deflateLevel != null ? options2.deflateLevel : 9; + options2.deflateStrategy = options2.deflateStrategy != null ? options2.deflateStrategy : 3; + options2.inputHasAlpha = options2.inputHasAlpha != null ? options2.inputHasAlpha : true; + options2.deflateFactory = options2.deflateFactory || zlib.createDeflate; + options2.bitDepth = options2.bitDepth || 8; + options2.colorType = typeof options2.colorType === "number" ? options2.colorType : constants2.COLORTYPE_COLOR_ALPHA; + options2.inputColorType = typeof options2.inputColorType === "number" ? options2.inputColorType : constants2.COLORTYPE_COLOR_ALPHA; + if ([ + constants2.COLORTYPE_GRAYSCALE, + constants2.COLORTYPE_COLOR, + constants2.COLORTYPE_COLOR_ALPHA, + constants2.COLORTYPE_ALPHA + ].indexOf(options2.colorType) === -1) { + throw new Error( + "option color type:" + options2.colorType + " is not supported at present" + ); + } + if ([ + constants2.COLORTYPE_GRAYSCALE, + constants2.COLORTYPE_COLOR, + constants2.COLORTYPE_COLOR_ALPHA, + constants2.COLORTYPE_ALPHA + ].indexOf(options2.inputColorType) === -1) { + throw new Error( + "option input color type:" + options2.inputColorType + " is not supported at present" + ); + } + if (options2.bitDepth !== 8 && options2.bitDepth !== 16) { + throw new Error( + "option bit depth:" + options2.bitDepth + " is not supported at present" + ); + } + }; + Packer.prototype.getDeflateOptions = function() { + return { + chunkSize: this._options.deflateChunkSize, + level: this._options.deflateLevel, + strategy: this._options.deflateStrategy + }; + }; + Packer.prototype.createDeflate = function() { + return this._options.deflateFactory(this.getDeflateOptions()); + }; + Packer.prototype.filterData = function(data2, width, height) { + let packedData = bitPacker(data2, width, height, this._options); + let bpp = constants2.COLORTYPE_TO_BPP_MAP[this._options.colorType]; + let filteredData = filter(packedData, width, height, this._options, bpp); + return filteredData; + }; + Packer.prototype._packChunk = function(type2, data2) { + let len = data2 ? data2.length : 0; + let buf = Buffer.alloc(len + 12); + buf.writeUInt32BE(len, 0); + buf.writeUInt32BE(type2, 4); + if (data2) { + data2.copy(buf, 8); + } + buf.writeInt32BE( + CrcStream.crc32(buf.slice(4, buf.length - 4)), + buf.length - 4 + ); + return buf; + }; + Packer.prototype.packGAMA = function(gamma) { + let buf = Buffer.alloc(4); + buf.writeUInt32BE(Math.floor(gamma * constants2.GAMMA_DIVISION), 0); + return this._packChunk(constants2.TYPE_gAMA, buf); + }; + Packer.prototype.packIHDR = function(width, height) { + let buf = Buffer.alloc(13); + buf.writeUInt32BE(width, 0); + buf.writeUInt32BE(height, 4); + buf[8] = this._options.bitDepth; + buf[9] = this._options.colorType; + buf[10] = 0; + buf[11] = 0; + buf[12] = 0; + return this._packChunk(constants2.TYPE_IHDR, buf); + }; + Packer.prototype.packIDAT = function(data2) { + return this._packChunk(constants2.TYPE_IDAT, data2); + }; + Packer.prototype.packIEND = function() { + return this._packChunk(constants2.TYPE_IEND, null); + }; + return packer.exports; +} +var hasRequiredPackerAsync; +function requirePackerAsync() { + if (hasRequiredPackerAsync) return packerAsync.exports; + hasRequiredPackerAsync = 1; + let util2 = requireUtil$5(); + let Stream2 = requireBrowser$h(); + let constants2 = requireConstants$3(); + let Packer = requirePacker(); + let PackerAsync = packerAsync.exports = function(opt) { + Stream2.call(this); + let options2 = opt || {}; + this._packer = new Packer(options2); + this._deflate = this._packer.createDeflate(); + this.readable = true; + }; + util2.inherits(PackerAsync, Stream2); + PackerAsync.prototype.pack = function(data2, width, height, gamma) { + this.emit("data", Buffer.from(constants2.PNG_SIGNATURE)); + this.emit("data", this._packer.packIHDR(width, height)); + if (gamma) { + this.emit("data", this._packer.packGAMA(gamma)); + } + let filteredData = this._packer.filterData(data2, width, height); + this._deflate.on("error", this.emit.bind(this, "error")); + this._deflate.on( + "data", + (function(compressedData) { + this.emit("data", this._packer.packIDAT(compressedData)); + }).bind(this) + ); + this._deflate.on( + "end", + (function() { + this.emit("data", this._packer.packIEND()); + this.emit("end"); + }).bind(this) + ); + this._deflate.end(filteredData); + }; + return packerAsync.exports; +} +var pngSync = {}; +var syncInflate = { exports: {} }; +var hasRequiredSyncInflate; +function requireSyncInflate() { + if (hasRequiredSyncInflate) return syncInflate.exports; + hasRequiredSyncInflate = 1; + (function(module, exports) { + let assert2 = requireAssert().ok; + let zlib = requireLib(); + let util2 = requireUtil$5(); + let kMaxLength = requireBuffer$2().kMaxLength; + function Inflate(opts) { + if (!(this instanceof Inflate)) { + return new Inflate(opts); + } + if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) { + opts.chunkSize = zlib.Z_MIN_CHUNK; + } + zlib.Inflate.call(this, opts); + this._offset = this._offset === void 0 ? this._outOffset : this._offset; + this._buffer = this._buffer || this._outBuffer; + if (opts && opts.maxLength != null) { + this._maxLength = opts.maxLength; + } + } + function createInflate(opts) { + return new Inflate(opts); + } + function _close(engine, callback) { + if (!engine._handle) { + return; + } + engine._handle.close(); + engine._handle = null; + } + Inflate.prototype._processChunk = function(chunk, flushFlag, asyncCb) { + if (typeof asyncCb === "function") { + return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb); + } + let self2 = this; + let availInBefore = chunk && chunk.length; + let availOutBefore = this._chunkSize - this._offset; + let leftToInflate = this._maxLength; + let inOff = 0; + let buffers = []; + let nread = 0; + let error2; + this.on("error", function(err) { + error2 = err; + }); + function handleChunk(availInAfter, availOutAfter) { + if (self2._hadError) { + return; + } + let have = availOutBefore - availOutAfter; + assert2(have >= 0, "have should not go down"); + if (have > 0) { + let out = self2._buffer.slice(self2._offset, self2._offset + have); + self2._offset += have; + if (out.length > leftToInflate) { + out = out.slice(0, leftToInflate); + } + buffers.push(out); + nread += out.length; + leftToInflate -= out.length; + if (leftToInflate === 0) { + return false; + } + } + if (availOutAfter === 0 || self2._offset >= self2._chunkSize) { + availOutBefore = self2._chunkSize; + self2._offset = 0; + self2._buffer = Buffer.allocUnsafe(self2._chunkSize); + } + if (availOutAfter === 0) { + inOff += availInBefore - availInAfter; + availInBefore = availInAfter; + return true; + } + return false; + } + assert2(this._handle, "zlib binding closed"); + let res; + do { + res = this._handle.writeSync( + flushFlag, + chunk, + // in + inOff, + // in_off + availInBefore, + // in_len + this._buffer, + // out + this._offset, + //out_off + availOutBefore + ); + res = res || this._writeState; + } while (!this._hadError && handleChunk(res[0], res[1])); + if (this._hadError) { + throw error2; + } + if (nread >= kMaxLength) { + _close(this); + throw new RangeError( + "Cannot create final Buffer. It would be larger than 0x" + kMaxLength.toString(16) + " bytes" + ); + } + let buf = Buffer.concat(buffers, nread); + _close(this); + return buf; + }; + util2.inherits(Inflate, zlib.Inflate); + function zlibBufferSync(engine, buffer2) { + if (typeof buffer2 === "string") { + buffer2 = Buffer.from(buffer2); + } + if (!(buffer2 instanceof Buffer)) { + throw new TypeError("Not a string or buffer"); + } + let flushFlag = engine._finishFlushFlag; + if (flushFlag == null) { + flushFlag = zlib.Z_FINISH; + } + return engine._processChunk(buffer2, flushFlag); + } + function inflateSync(buffer2, opts) { + return zlibBufferSync(new Inflate(opts), buffer2); + } + module.exports = exports = inflateSync; + exports.Inflate = Inflate; + exports.createInflate = createInflate; + exports.inflateSync = inflateSync; + })(syncInflate, syncInflate.exports); + return syncInflate.exports; +} +var syncReader = { exports: {} }; +var hasRequiredSyncReader; +function requireSyncReader() { + if (hasRequiredSyncReader) return syncReader.exports; + hasRequiredSyncReader = 1; + let SyncReader = syncReader.exports = function(buffer2) { + this._buffer = buffer2; + this._reads = []; + }; + SyncReader.prototype.read = function(length, callback) { + this._reads.push({ + length: Math.abs(length), + // if length < 0 then at most this length + allowLess: length < 0, + func: callback + }); + }; + SyncReader.prototype.process = function() { + while (this._reads.length > 0 && this._buffer.length) { + let read2 = this._reads[0]; + if (this._buffer.length && (this._buffer.length >= read2.length || read2.allowLess)) { + this._reads.shift(); + let buf = this._buffer; + this._buffer = buf.slice(read2.length); + read2.func.call(this, buf.slice(0, read2.length)); + } else { + break; + } + } + if (this._reads.length > 0) { + throw new Error("There are some read requests waitng on finished stream"); + } + if (this._buffer.length > 0) { + throw new Error("unrecognised content at end of stream"); + } + }; + return syncReader.exports; +} +var filterParseSync = {}; +var hasRequiredFilterParseSync; +function requireFilterParseSync() { + if (hasRequiredFilterParseSync) return filterParseSync; + hasRequiredFilterParseSync = 1; + let SyncReader = requireSyncReader(); + let Filter = requireFilterParse(); + filterParseSync.process = function(inBuffer, bitmapInfo) { + let outBuffers = []; + let reader = new SyncReader(inBuffer); + let filter = new Filter(bitmapInfo, { + read: reader.read.bind(reader), + write: function(bufferPart) { + outBuffers.push(bufferPart); + }, + complete: function() { + } + }); + filter.start(); + reader.process(); + return Buffer.concat(outBuffers); + }; + return filterParseSync; +} +var parserSync; +var hasRequiredParserSync; +function requireParserSync() { + if (hasRequiredParserSync) return parserSync; + hasRequiredParserSync = 1; + let hasSyncZlib = true; + let zlib = requireLib(); + let inflateSync = requireSyncInflate(); + if (!zlib.deflateSync) { + hasSyncZlib = false; + } + let SyncReader = requireSyncReader(); + let FilterSync = requireFilterParseSync(); + let Parser4 = requireParser(); + let bitmapper2 = requireBitmapper(); + let formatNormaliser2 = requireFormatNormaliser(); + parserSync = function(buffer2, options2) { + if (!hasSyncZlib) { + throw new Error( + "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" + ); + } + let err; + function handleError(_err_) { + err = _err_; + } + let metaData; + function handleMetaData(_metaData_) { + metaData = _metaData_; + } + function handleTransColor(transColor) { + metaData.transColor = transColor; + } + function handlePalette(palette) { + metaData.palette = palette; + } + function handleSimpleTransparency() { + metaData.alpha = true; + } + let gamma; + function handleGamma(_gamma_) { + gamma = _gamma_; + } + let inflateDataList = []; + function handleInflateData(inflatedData2) { + inflateDataList.push(inflatedData2); + } + let reader = new SyncReader(buffer2); + let parser2 = new Parser4(options2, { + read: reader.read.bind(reader), + error: handleError, + metadata: handleMetaData, + gamma: handleGamma, + palette: handlePalette, + transColor: handleTransColor, + inflateData: handleInflateData, + simpleTransparency: handleSimpleTransparency + }); + parser2.start(); + reader.process(); + if (err) { + throw err; + } + let inflateData = Buffer.concat(inflateDataList); + inflateDataList.length = 0; + let inflatedData; + if (metaData.interlace) { + inflatedData = zlib.inflateSync(inflateData); + } else { + let rowSize = (metaData.width * metaData.bpp * metaData.depth + 7 >> 3) + 1; + let imageSize = rowSize * metaData.height; + inflatedData = inflateSync(inflateData, { + chunkSize: imageSize, + maxLength: imageSize + }); + } + inflateData = null; + if (!inflatedData || !inflatedData.length) { + throw new Error("bad png - invalid inflate data response"); + } + let unfilteredData = FilterSync.process(inflatedData, metaData); + inflateData = null; + let bitmapData = bitmapper2.dataToBitMap(unfilteredData, metaData); + unfilteredData = null; + let normalisedBitmapData = formatNormaliser2( + bitmapData, + metaData, + options2.skipRescale + ); + metaData.data = normalisedBitmapData; + metaData.gamma = gamma || 0; + return metaData; + }; + return parserSync; +} +var packerSync; +var hasRequiredPackerSync; +function requirePackerSync() { + if (hasRequiredPackerSync) return packerSync; + hasRequiredPackerSync = 1; + let hasSyncZlib = true; + let zlib = requireLib(); + if (!zlib.deflateSync) { + hasSyncZlib = false; + } + let constants2 = requireConstants$3(); + let Packer = requirePacker(); + packerSync = function(metaData, opt) { + if (!hasSyncZlib) { + throw new Error( + "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0" + ); + } + let options2 = opt || {}; + let packer2 = new Packer(options2); + let chunks = []; + chunks.push(Buffer.from(constants2.PNG_SIGNATURE)); + chunks.push(packer2.packIHDR(metaData.width, metaData.height)); + if (metaData.gamma) { + chunks.push(packer2.packGAMA(metaData.gamma)); + } + let filteredData = packer2.filterData( + metaData.data, + metaData.width, + metaData.height + ); + let compressedData = zlib.deflateSync( + filteredData, + packer2.getDeflateOptions() + ); + filteredData = null; + if (!compressedData || !compressedData.length) { + throw new Error("bad png - invalid compressed data response"); + } + chunks.push(packer2.packIDAT(compressedData)); + chunks.push(packer2.packIEND()); + return Buffer.concat(chunks); + }; + return packerSync; +} +var hasRequiredPngSync; +function requirePngSync() { + if (hasRequiredPngSync) return pngSync; + hasRequiredPngSync = 1; + let parse4 = requireParserSync(); + let pack = requirePackerSync(); + pngSync.read = function(buffer2, options2) { + return parse4(buffer2, options2 || {}); + }; + pngSync.write = function(png2, options2) { + return pack(png2, options2); + }; + return pngSync; +} +var hasRequiredPng; +function requirePng() { + if (hasRequiredPng) return png; + hasRequiredPng = 1; + let util2 = requireUtil$5(); + let Stream2 = requireBrowser$h(); + let Parser4 = requireParserAsync(); + let Packer = requirePackerAsync(); + let PNGSync = requirePngSync(); + let PNG2 = png.PNG = function(options2) { + Stream2.call(this); + options2 = options2 || {}; + this.width = options2.width | 0; + this.height = options2.height | 0; + this.data = this.width > 0 && this.height > 0 ? Buffer.alloc(4 * this.width * this.height) : null; + if (options2.fill && this.data) { + this.data.fill(0); + } + this.gamma = 0; + this.readable = this.writable = true; + this._parser = new Parser4(options2); + this._parser.on("error", this.emit.bind(this, "error")); + this._parser.on("close", this._handleClose.bind(this)); + this._parser.on("metadata", this._metadata.bind(this)); + this._parser.on("gamma", this._gamma.bind(this)); + this._parser.on( + "parsed", + (function(data2) { + this.data = data2; + this.emit("parsed", data2); + }).bind(this) + ); + this._packer = new Packer(options2); + this._packer.on("data", this.emit.bind(this, "data")); + this._packer.on("end", this.emit.bind(this, "end")); + this._parser.on("close", this._handleClose.bind(this)); + this._packer.on("error", this.emit.bind(this, "error")); + }; + util2.inherits(PNG2, Stream2); + PNG2.sync = PNGSync; + PNG2.prototype.pack = function() { + if (!this.data || !this.data.length) { + this.emit("error", "No data provided"); + return this; + } + process.nextTick( + (function() { + this._packer.pack(this.data, this.width, this.height, this.gamma); + }).bind(this) + ); + return this; + }; + PNG2.prototype.parse = function(data2, callback) { + if (callback) { + let onParsed, onError; + onParsed = (function(parsedData) { + this.removeListener("error", onError); + this.data = parsedData; + callback(null, this); + }).bind(this); + onError = (function(err) { + this.removeListener("parsed", onParsed); + callback(err, null); + }).bind(this); + this.once("parsed", onParsed); + this.once("error", onError); + } + this.end(data2); + return this; + }; + PNG2.prototype.write = function(data2) { + this._parser.write(data2); + return true; + }; + PNG2.prototype.end = function(data2) { + this._parser.end(data2); + }; + PNG2.prototype._metadata = function(metadata) { + this.width = metadata.width; + this.height = metadata.height; + this.emit("metadata", metadata); + }; + PNG2.prototype._gamma = function(gamma) { + this.gamma = gamma; + }; + PNG2.prototype._handleClose = function() { + if (!this._parser.writable && !this._packer.readable) { + this.emit("close"); + } + }; + PNG2.bitblt = function(src2, dst, srcX, srcY, width, height, deltaX, deltaY) { + srcX |= 0; + srcY |= 0; + width |= 0; + height |= 0; + deltaX |= 0; + deltaY |= 0; + if (srcX > src2.width || srcY > src2.height || srcX + width > src2.width || srcY + height > src2.height) { + throw new Error("bitblt reading outside image"); + } + if (deltaX > dst.width || deltaY > dst.height || deltaX + width > dst.width || deltaY + height > dst.height) { + throw new Error("bitblt writing outside image"); + } + for (let y = 0; y < height; y++) { + src2.data.copy( + dst.data, + (deltaY + y) * dst.width + deltaX << 2, + (srcY + y) * src2.width + srcX << 2, + (srcY + y) * src2.width + srcX + width << 2 + ); + } + }; + PNG2.prototype.bitblt = function(dst, srcX, srcY, width, height, deltaX, deltaY) { + PNG2.bitblt(this, dst, srcX, srcY, width, height, deltaX, deltaY); + return this; + }; + PNG2.adjustGamma = function(src2) { + if (src2.gamma) { + for (let y = 0; y < src2.height; y++) { + for (let x = 0; x < src2.width; x++) { + let idx = src2.width * y + x << 2; + for (let i = 0; i < 3; i++) { + let sample = src2.data[idx + i] / 255; + sample = Math.pow(sample, 1 / 2.2 / src2.gamma); + src2.data[idx + i] = Math.round(sample * 255); + } + } + } + src2.gamma = 0; + } + }; + PNG2.prototype.adjustGamma = function() { + PNG2.adjustGamma(this); + }; + return png; +} +var pngExports = requirePng(); +var commander = { exports: {} }; +var argument = {}; +var error = {}; +var hasRequiredError; +function requireError() { + if (hasRequiredError) return error; + hasRequiredError = 1; + class CommanderError extends Error { + /** + * Constructs the CommanderError class + * @param {number} exitCode suggested exit code which could be used with process.exit + * @param {string} code an id string representing the error + * @param {string} message human-readable description of the error + * @constructor + */ + constructor(exitCode, code, message) { + super(message); + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.code = code; + this.exitCode = exitCode; + this.nestedError = void 0; + } + } + class InvalidArgumentError extends CommanderError { + /** + * Constructs the InvalidArgumentError class + * @param {string} [message] explanation of why argument is invalid + * @constructor + */ + constructor(message) { + super(1, "commander.invalidArgument", message); + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + } + } + error.CommanderError = CommanderError; + error.InvalidArgumentError = InvalidArgumentError; + return error; +} +var hasRequiredArgument; +function requireArgument() { + if (hasRequiredArgument) return argument; + hasRequiredArgument = 1; + const { InvalidArgumentError } = requireError(); + class Argument { + /** + * Initialize a new command argument with the given name and description. + * The default is that the argument is required, and you can explicitly + * indicate this with <> around the name. Put [] around the name for an optional argument. + * + * @param {string} name + * @param {string} [description] + */ + constructor(name, description) { + this.description = description || ""; + this.variadic = false; + this.parseArg = void 0; + this.defaultValue = void 0; + this.defaultValueDescription = void 0; + this.argChoices = void 0; + switch (name[0]) { + case "<": + this.required = true; + this._name = name.slice(1, -1); + break; + case "[": + this.required = false; + this._name = name.slice(1, -1); + break; + default: + this.required = true; + this._name = name; + break; + } + if (this._name.length > 3 && this._name.slice(-3) === "...") { + this.variadic = true; + this._name = this._name.slice(0, -3); + } + } + /** + * Return argument name. + * + * @return {string} + */ + name() { + return this._name; + } + /** + * @api private + */ + _concatValue(value, previous) { + if (previous === this.defaultValue || !Array.isArray(previous)) { + return [value]; + } + return previous.concat(value); + } + /** + * Set the default value, and optionally supply the description to be displayed in the help. + * + * @param {any} value + * @param {string} [description] + * @return {Argument} + */ + default(value, description) { + this.defaultValue = value; + this.defaultValueDescription = description; + return this; + } + /** + * Set the custom handler for processing CLI command arguments into argument values. + * + * @param {Function} [fn] + * @return {Argument} + */ + argParser(fn) { + this.parseArg = fn; + return this; + } + /** + * Only allow option value to be one of choices. + * + * @param {string[]} values + * @return {Argument} + */ + choices(values) { + this.argChoices = values; + this.parseArg = (arg, previous) => { + if (!values.includes(arg)) { + throw new InvalidArgumentError(`Allowed choices are ${values.join(", ")}.`); + } + if (this.variadic) { + return this._concatValue(arg, previous); + } + return arg; + }; + return this; + } + /** + * Make option-argument required. + */ + argRequired() { + this.required = true; + return this; + } + /** + * Make option-argument optional. + */ + argOptional() { + this.required = false; + return this; + } + } + function humanReadableArgName(arg) { + const nameOutput = arg.name() + (arg.variadic === true ? "..." : ""); + return arg.required ? "<" + nameOutput + ">" : "[" + nameOutput + "]"; + } + argument.Argument = Argument; + argument.humanReadableArgName = humanReadableArgName; + return argument; +} +var command = {}; +var help = {}; +var hasRequiredHelp; +function requireHelp() { + if (hasRequiredHelp) return help; + hasRequiredHelp = 1; + const { humanReadableArgName } = requireArgument(); + class Help { + constructor() { + this.helpWidth = void 0; + this.sortSubcommands = false; + this.sortOptions = false; + } + /** + * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one. + * + * @param {Command} cmd + * @returns {Command[]} + */ + visibleCommands(cmd) { + const visibleCommands = cmd.commands.filter((cmd2) => !cmd2._hidden); + if (cmd._hasImplicitHelpCommand()) { + const [, helpName, helpArgs] = cmd._helpCommandnameAndArgs.match(/([^ ]+) *(.*)/); + const helpCommand = cmd.createCommand(helpName).helpOption(false); + helpCommand.description(cmd._helpCommandDescription); + if (helpArgs) helpCommand.arguments(helpArgs); + visibleCommands.push(helpCommand); + } + if (this.sortSubcommands) { + visibleCommands.sort((a, b) => { + return a.name().localeCompare(b.name()); + }); + } + return visibleCommands; + } + /** + * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one. + * + * @param {Command} cmd + * @returns {Option[]} + */ + visibleOptions(cmd) { + const visibleOptions = cmd.options.filter((option2) => !option2.hidden); + const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag); + const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag); + if (showShortHelpFlag || showLongHelpFlag) { + let helpOption; + if (!showShortHelpFlag) { + helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription); + } else if (!showLongHelpFlag) { + helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription); + } else { + helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription); + } + visibleOptions.push(helpOption); + } + if (this.sortOptions) { + const getSortKey = (option2) => { + return option2.short ? option2.short.replace(/^-/, "") : option2.long.replace(/^--/, ""); + }; + visibleOptions.sort((a, b) => { + return getSortKey(a).localeCompare(getSortKey(b)); + }); + } + return visibleOptions; + } + /** + * Get an array of the arguments if any have a description. + * + * @param {Command} cmd + * @returns {Argument[]} + */ + visibleArguments(cmd) { + if (cmd._argsDescription) { + cmd._args.forEach((argument2) => { + argument2.description = argument2.description || cmd._argsDescription[argument2.name()] || ""; + }); + } + if (cmd._args.find((argument2) => argument2.description)) { + return cmd._args; + } + return []; + } + /** + * Get the command term to show in the list of subcommands. + * + * @param {Command} cmd + * @returns {string} + */ + subcommandTerm(cmd) { + const args = cmd._args.map((arg) => humanReadableArgName(arg)).join(" "); + return cmd._name + (cmd._aliases[0] ? "|" + cmd._aliases[0] : "") + (cmd.options.length ? " [options]" : "") + // simplistic check for non-help option + (args ? " " + args : ""); + } + /** + * Get the option term to show in the list of options. + * + * @param {Option} option + * @returns {string} + */ + optionTerm(option2) { + return option2.flags; + } + /** + * Get the argument term to show in the list of arguments. + * + * @param {Argument} argument + * @returns {string} + */ + argumentTerm(argument2) { + return argument2.name(); + } + /** + * Get the longest command term length. + * + * @param {Command} cmd + * @param {Help} helper + * @returns {number} + */ + longestSubcommandTermLength(cmd, helper2) { + return helper2.visibleCommands(cmd).reduce((max2, command2) => { + return Math.max(max2, helper2.subcommandTerm(command2).length); + }, 0); + } + /** + * Get the longest option term length. + * + * @param {Command} cmd + * @param {Help} helper + * @returns {number} + */ + longestOptionTermLength(cmd, helper2) { + return helper2.visibleOptions(cmd).reduce((max2, option2) => { + return Math.max(max2, helper2.optionTerm(option2).length); + }, 0); + } + /** + * Get the longest argument term length. + * + * @param {Command} cmd + * @param {Help} helper + * @returns {number} + */ + longestArgumentTermLength(cmd, helper2) { + return helper2.visibleArguments(cmd).reduce((max2, argument2) => { + return Math.max(max2, helper2.argumentTerm(argument2).length); + }, 0); + } + /** + * Get the command usage to be displayed at the top of the built-in help. + * + * @param {Command} cmd + * @returns {string} + */ + commandUsage(cmd) { + let cmdName = cmd._name; + if (cmd._aliases[0]) { + cmdName = cmdName + "|" + cmd._aliases[0]; + } + let parentCmdNames = ""; + for (let parentCmd = cmd.parent; parentCmd; parentCmd = parentCmd.parent) { + parentCmdNames = parentCmd.name() + " " + parentCmdNames; + } + return parentCmdNames + cmdName + " " + cmd.usage(); + } + /** + * Get the description for the command. + * + * @param {Command} cmd + * @returns {string} + */ + commandDescription(cmd) { + return cmd.description(); + } + /** + * Get the command description to show in the list of subcommands. + * + * @param {Command} cmd + * @returns {string} + */ + subcommandDescription(cmd) { + return cmd.description(); + } + /** + * Get the option description to show in the list of options. + * + * @param {Option} option + * @return {string} + */ + optionDescription(option2) { + const extraInfo = []; + if (option2.argChoices && !option2.negate) { + extraInfo.push( + // use stringify to match the display of the default value + `choices: ${option2.argChoices.map((choice) => JSON.stringify(choice)).join(", ")}` + ); + } + if (option2.defaultValue !== void 0 && !option2.negate) { + extraInfo.push(`default: ${option2.defaultValueDescription || JSON.stringify(option2.defaultValue)}`); + } + if (option2.envVar !== void 0) { + extraInfo.push(`env: ${option2.envVar}`); + } + if (extraInfo.length > 0) { + return `${option2.description} (${extraInfo.join(", ")})`; + } + return option2.description; + } + /** + * Get the argument description to show in the list of arguments. + * + * @param {Argument} argument + * @return {string} + */ + argumentDescription(argument2) { + const extraInfo = []; + if (argument2.argChoices) { + extraInfo.push( + // use stringify to match the display of the default value + `choices: ${argument2.argChoices.map((choice) => JSON.stringify(choice)).join(", ")}` + ); + } + if (argument2.defaultValue !== void 0) { + extraInfo.push(`default: ${argument2.defaultValueDescription || JSON.stringify(argument2.defaultValue)}`); + } + if (extraInfo.length > 0) { + const extraDescripton = `(${extraInfo.join(", ")})`; + if (argument2.description) { + return `${argument2.description} ${extraDescripton}`; + } + return extraDescripton; + } + return argument2.description; + } + /** + * Generate the built-in help text. + * + * @param {Command} cmd + * @param {Help} helper + * @returns {string} + */ + formatHelp(cmd, helper2) { + const termWidth = helper2.padWidth(cmd, helper2); + const helpWidth = helper2.helpWidth || 80; + const itemIndentWidth = 2; + const itemSeparatorWidth = 2; + function formatItem(term, description) { + if (description) { + const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`; + return helper2.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth); + } + return term; + } + function formatList(textArray) { + return textArray.join("\n").replace(/^/gm, " ".repeat(itemIndentWidth)); + } + let output = [`Usage: ${helper2.commandUsage(cmd)}`, ""]; + const commandDescription = helper2.commandDescription(cmd); + if (commandDescription.length > 0) { + output = output.concat([commandDescription, ""]); + } + const argumentList = helper2.visibleArguments(cmd).map((argument2) => { + return formatItem(helper2.argumentTerm(argument2), helper2.argumentDescription(argument2)); + }); + if (argumentList.length > 0) { + output = output.concat(["Arguments:", formatList(argumentList), ""]); + } + const optionList = helper2.visibleOptions(cmd).map((option2) => { + return formatItem(helper2.optionTerm(option2), helper2.optionDescription(option2)); + }); + if (optionList.length > 0) { + output = output.concat(["Options:", formatList(optionList), ""]); + } + const commandList = helper2.visibleCommands(cmd).map((cmd2) => { + return formatItem(helper2.subcommandTerm(cmd2), helper2.subcommandDescription(cmd2)); + }); + if (commandList.length > 0) { + output = output.concat(["Commands:", formatList(commandList), ""]); + } + return output.join("\n"); + } + /** + * Calculate the pad width from the maximum term length. + * + * @param {Command} cmd + * @param {Help} helper + * @returns {number} + */ + padWidth(cmd, helper2) { + return Math.max( + helper2.longestOptionTermLength(cmd, helper2), + helper2.longestSubcommandTermLength(cmd, helper2), + helper2.longestArgumentTermLength(cmd, helper2) + ); + } + /** + * Wrap the given string to width characters per line, with lines after the first indented. + * Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted. + * + * @param {string} str + * @param {number} width + * @param {number} indent + * @param {number} [minColumnWidth=40] + * @return {string} + * + */ + wrap(str, width, indent, minColumnWidth = 40) { + if (str.match(/[\n]\s+/)) return str; + const columnWidth = width - indent; + if (columnWidth < minColumnWidth) return str; + const leadingStr = str.substr(0, indent); + const columnText = str.substr(indent); + const indentString = " ".repeat(indent); + const regex = new RegExp(".{1," + (columnWidth - 1) + "}([\\s​]|$)|[^\\s​]+?([\\s​]|$)", "g"); + const lines = columnText.match(regex) || []; + return leadingStr + lines.map((line, i) => { + if (line.slice(-1) === "\n") { + line = line.slice(0, line.length - 1); + } + return (i > 0 ? indentString : "") + line.trimRight(); + }).join("\n"); + } + } + help.Help = Help; + return help; +} +var option = {}; +var hasRequiredOption; +function requireOption() { + if (hasRequiredOption) return option; + hasRequiredOption = 1; + const { InvalidArgumentError } = requireError(); + class Option { + /** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {string} flags + * @param {string} [description] + */ + constructor(flags, description) { + this.flags = flags; + this.description = description || ""; + this.required = flags.includes("<"); + this.optional = flags.includes("["); + this.variadic = /\w\.\.\.[>\]]$/.test(flags); + this.mandatory = false; + const optionFlags = splitOptionFlags(flags); + this.short = optionFlags.shortFlag; + this.long = optionFlags.longFlag; + this.negate = false; + if (this.long) { + this.negate = this.long.startsWith("--no-"); + } + this.defaultValue = void 0; + this.defaultValueDescription = void 0; + this.envVar = void 0; + this.parseArg = void 0; + this.hidden = false; + this.argChoices = void 0; + } + /** + * Set the default value, and optionally supply the description to be displayed in the help. + * + * @param {any} value + * @param {string} [description] + * @return {Option} + */ + default(value, description) { + this.defaultValue = value; + this.defaultValueDescription = description; + return this; + } + /** + * Set environment variable to check for option value. + * Priority order of option values is default < env < cli + * + * @param {string} name + * @return {Option} + */ + env(name) { + this.envVar = name; + return this; + } + /** + * Set the custom handler for processing CLI option arguments into option values. + * + * @param {Function} [fn] + * @return {Option} + */ + argParser(fn) { + this.parseArg = fn; + return this; + } + /** + * Whether the option is mandatory and must have a value after parsing. + * + * @param {boolean} [mandatory=true] + * @return {Option} + */ + makeOptionMandatory(mandatory = true) { + this.mandatory = !!mandatory; + return this; + } + /** + * Hide option in help. + * + * @param {boolean} [hide=true] + * @return {Option} + */ + hideHelp(hide = true) { + this.hidden = !!hide; + return this; + } + /** + * @api private + */ + _concatValue(value, previous) { + if (previous === this.defaultValue || !Array.isArray(previous)) { + return [value]; + } + return previous.concat(value); + } + /** + * Only allow option value to be one of choices. + * + * @param {string[]} values + * @return {Option} + */ + choices(values) { + this.argChoices = values; + this.parseArg = (arg, previous) => { + if (!values.includes(arg)) { + throw new InvalidArgumentError(`Allowed choices are ${values.join(", ")}.`); + } + if (this.variadic) { + return this._concatValue(arg, previous); + } + return arg; + }; + return this; + } + /** + * Return option name. + * + * @return {string} + */ + name() { + if (this.long) { + return this.long.replace(/^--/, ""); + } + return this.short.replace(/^-/, ""); + } + /** + * Return option name, in a camelcase format that can be used + * as a object attribute key. + * + * @return {string} + * @api private + */ + attributeName() { + return camelcase(this.name().replace(/^no-/, "")); + } + /** + * Check if `arg` matches the short or long flag. + * + * @param {string} arg + * @return {boolean} + * @api private + */ + is(arg) { + return this.short === arg || this.long === arg; + } + } + function camelcase(str) { + return str.split("-").reduce((str2, word) => { + return str2 + word[0].toUpperCase() + word.slice(1); + }); + } + function splitOptionFlags(flags) { + let shortFlag; + let longFlag; + const flagParts = flags.split(/[ |,]+/); + if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift(); + longFlag = flagParts.shift(); + if (!shortFlag && /^-[^-]$/.test(longFlag)) { + shortFlag = longFlag; + longFlag = void 0; + } + return { shortFlag, longFlag }; + } + option.Option = Option; + option.splitOptionFlags = splitOptionFlags; + return option; +} +var suggestSimilar = {}; +var hasRequiredSuggestSimilar; +function requireSuggestSimilar() { + if (hasRequiredSuggestSimilar) return suggestSimilar; + hasRequiredSuggestSimilar = 1; + const maxDistance = 3; + function editDistance(a, b) { + if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length); + const d = []; + for (let i = 0; i <= a.length; i++) { + d[i] = [i]; + } + for (let j = 0; j <= b.length; j++) { + d[0][j] = j; + } + for (let j = 1; j <= b.length; j++) { + for (let i = 1; i <= a.length; i++) { + let cost = 1; + if (a[i - 1] === b[j - 1]) { + cost = 0; + } else { + cost = 1; + } + d[i][j] = Math.min( + d[i - 1][j] + 1, + // deletion + d[i][j - 1] + 1, + // insertion + d[i - 1][j - 1] + cost + // substitution + ); + if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { + d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1); + } + } + } + return d[a.length][b.length]; + } + function suggestSimilar$1(word, candidates) { + if (!candidates || candidates.length === 0) return ""; + candidates = Array.from(new Set(candidates)); + const searchingOptions = word.startsWith("--"); + if (searchingOptions) { + word = word.slice(2); + candidates = candidates.map((candidate) => candidate.slice(2)); + } + let similar = []; + let bestDistance = maxDistance; + const minSimilarity = 0.4; + candidates.forEach((candidate) => { + if (candidate.length <= 1) return; + const distance = editDistance(word, candidate); + const length = Math.max(word.length, candidate.length); + const similarity = (length - distance) / length; + if (similarity > minSimilarity) { + if (distance < bestDistance) { + bestDistance = distance; + similar = [candidate]; + } else if (distance === bestDistance) { + similar.push(candidate); + } + } + }); + similar.sort((a, b) => a.localeCompare(b)); + if (searchingOptions) { + similar = similar.map((candidate) => `--${candidate}`); + } + if (similar.length > 1) { + return ` +(Did you mean one of ${similar.join(", ")}?)`; + } + if (similar.length === 1) { + return ` +(Did you mean ${similar[0]}?)`; + } + return ""; + } + suggestSimilar.suggestSimilar = suggestSimilar$1; + return suggestSimilar; +} +var hasRequiredCommand; +function requireCommand() { + if (hasRequiredCommand) return command; + hasRequiredCommand = 1; + const EventEmitter2 = requireEvents().EventEmitter; + const childProcess = require$$1; + const path2 = requirePath(); + const fs2 = require$$2$1; + const { Argument, humanReadableArgName } = requireArgument(); + const { CommanderError } = requireError(); + const { Help } = requireHelp(); + const { Option, splitOptionFlags } = requireOption(); + const { suggestSimilar: suggestSimilar2 } = requireSuggestSimilar(); + class Command extends EventEmitter2 { + /** + * Initialize a new `Command`. + * + * @param {string} [name] + */ + constructor(name) { + super(); + this.commands = []; + this.options = []; + this.parent = null; + this._allowUnknownOption = false; + this._allowExcessArguments = true; + this._args = []; + this.args = []; + this.rawArgs = []; + this.processedArgs = []; + this._scriptPath = null; + this._name = name || ""; + this._optionValues = {}; + this._optionValueSources = {}; + this._storeOptionsAsProperties = false; + this._actionHandler = null; + this._executableHandler = false; + this._executableFile = null; + this._defaultCommandName = null; + this._exitCallback = null; + this._aliases = []; + this._combineFlagAndOptionalValue = true; + this._description = ""; + this._argsDescription = void 0; + this._enablePositionalOptions = false; + this._passThroughOptions = false; + this._lifeCycleHooks = {}; + this._showHelpAfterError = false; + this._showSuggestionAfterError = false; + this._outputConfiguration = { + writeOut: (str) => process.stdout.write(str), + writeErr: (str) => process.stderr.write(str), + getOutHelpWidth: () => process.stdout.isTTY ? process.stdout.columns : void 0, + getErrHelpWidth: () => process.stderr.isTTY ? process.stderr.columns : void 0, + outputError: (str, write2) => write2(str) + }; + this._hidden = false; + this._hasHelpOption = true; + this._helpFlags = "-h, --help"; + this._helpDescription = "display help for command"; + this._helpShortFlag = "-h"; + this._helpLongFlag = "--help"; + this._addImplicitHelpCommand = void 0; + this._helpCommandName = "help"; + this._helpCommandnameAndArgs = "help [command]"; + this._helpCommandDescription = "display help for command"; + this._helpConfiguration = {}; + } + /** + * Copy settings that are useful to have in common across root command and subcommands. + * + * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.) + * + * @param {Command} sourceCommand + * @return {Command} returns `this` for executable command + */ + copyInheritedSettings(sourceCommand) { + this._outputConfiguration = sourceCommand._outputConfiguration; + this._hasHelpOption = sourceCommand._hasHelpOption; + this._helpFlags = sourceCommand._helpFlags; + this._helpDescription = sourceCommand._helpDescription; + this._helpShortFlag = sourceCommand._helpShortFlag; + this._helpLongFlag = sourceCommand._helpLongFlag; + this._helpCommandName = sourceCommand._helpCommandName; + this._helpCommandnameAndArgs = sourceCommand._helpCommandnameAndArgs; + this._helpCommandDescription = sourceCommand._helpCommandDescription; + this._helpConfiguration = sourceCommand._helpConfiguration; + this._exitCallback = sourceCommand._exitCallback; + this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties; + this._combineFlagAndOptionalValue = sourceCommand._combineFlagAndOptionalValue; + this._allowExcessArguments = sourceCommand._allowExcessArguments; + this._enablePositionalOptions = sourceCommand._enablePositionalOptions; + this._showHelpAfterError = sourceCommand._showHelpAfterError; + this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError; + return this; + } + /** + * Define a command. + * + * There are two styles of command: pay attention to where to put the description. + * + * @example + * // Command implemented using action handler (description is supplied separately to `.command`) + * program + * .command('clone [destination]') + * .description('clone a repository into a newly created directory') + * .action((source, destination) => { + * console.log('clone command called'); + * }); + * + * // Command implemented using separate executable file (description is second parameter to `.command`) + * program + * .command('start ', 'start named service') + * .command('stop [service]', 'stop named service, or all if no name supplied'); + * + * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {Object} [execOpts] - configuration options (for executable) + * @return {Command} returns new command for action handler, or `this` for executable command + */ + command(nameAndArgs, actionOptsOrExecDesc, execOpts) { + let desc = actionOptsOrExecDesc; + let opts = execOpts; + if (typeof desc === "object" && desc !== null) { + opts = desc; + desc = null; + } + opts = opts || {}; + const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/); + const cmd = this.createCommand(name); + if (desc) { + cmd.description(desc); + cmd._executableHandler = true; + } + if (opts.isDefault) this._defaultCommandName = cmd._name; + cmd._hidden = !!(opts.noHelp || opts.hidden); + cmd._executableFile = opts.executableFile || null; + if (args) cmd.arguments(args); + this.commands.push(cmd); + cmd.parent = this; + cmd.copyInheritedSettings(this); + if (desc) return this; + return cmd; + } + /** + * Factory routine to create a new unattached command. + * + * See .command() for creating an attached subcommand, which uses this routine to + * create the command. You can override createCommand to customise subcommands. + * + * @param {string} [name] + * @return {Command} new command + */ + createCommand(name) { + return new Command(name); + } + /** + * You can customise the help with a subclass of Help by overriding createHelp, + * or by overriding Help properties using configureHelp(). + * + * @return {Help} + */ + createHelp() { + return Object.assign(new Help(), this.configureHelp()); + } + /** + * You can customise the help by overriding Help properties using configureHelp(), + * or with a subclass of Help by overriding createHelp(). + * + * @param {Object} [configuration] - configuration options + * @return {Command|Object} `this` command for chaining, or stored configuration + */ + configureHelp(configuration) { + if (configuration === void 0) return this._helpConfiguration; + this._helpConfiguration = configuration; + return this; + } + /** + * The default output goes to stdout and stderr. You can customise this for special + * applications. You can also customise the display of errors by overriding outputError. + * + * The configuration properties are all functions: + * + * // functions to change where being written, stdout and stderr + * writeOut(str) + * writeErr(str) + * // matching functions to specify width for wrapping help + * getOutHelpWidth() + * getErrHelpWidth() + * // functions based on what is being written out + * outputError(str, write) // used for displaying errors, and not used for displaying help + * + * @param {Object} [configuration] - configuration options + * @return {Command|Object} `this` command for chaining, or stored configuration + */ + configureOutput(configuration) { + if (configuration === void 0) return this._outputConfiguration; + Object.assign(this._outputConfiguration, configuration); + return this; + } + /** + * Display the help or a custom message after an error occurs. + * + * @param {boolean|string} [displayHelp] + * @return {Command} `this` command for chaining + */ + showHelpAfterError(displayHelp = true) { + if (typeof displayHelp !== "string") displayHelp = !!displayHelp; + this._showHelpAfterError = displayHelp; + return this; + } + /** + * Display suggestion of similar commands for unknown commands, or options for unknown options. + * + * @param {boolean} [displaySuggestion] + * @return {Command} `this` command for chaining + */ + showSuggestionAfterError(displaySuggestion = true) { + this._showSuggestionAfterError = !!displaySuggestion; + return this; + } + /** + * Add a prepared subcommand. + * + * See .command() for creating an attached subcommand which inherits settings from its parent. + * + * @param {Command} cmd - new subcommand + * @param {Object} [opts] - configuration options + * @return {Command} `this` command for chaining + */ + addCommand(cmd, opts) { + if (!cmd._name) throw new Error("Command passed to .addCommand() must have a name"); + function checkExplicitNames(commandArray) { + commandArray.forEach((cmd2) => { + if (cmd2._executableHandler && !cmd2._executableFile) { + throw new Error(`Must specify executableFile for deeply nested executable: ${cmd2.name()}`); + } + checkExplicitNames(cmd2.commands); + }); + } + checkExplicitNames(cmd.commands); + opts = opts || {}; + if (opts.isDefault) this._defaultCommandName = cmd._name; + if (opts.noHelp || opts.hidden) cmd._hidden = true; + this.commands.push(cmd); + cmd.parent = this; + return this; + } + /** + * Factory routine to create a new unattached argument. + * + * See .argument() for creating an attached argument, which uses this routine to + * create the argument. You can override createArgument to return a custom argument. + * + * @param {string} name + * @param {string} [description] + * @return {Argument} new argument + */ + createArgument(name, description) { + return new Argument(name, description); + } + /** + * Define argument syntax for command. + * + * The default is that the argument is required, and you can explicitly + * indicate this with <> around the name. Put [] around the name for an optional argument. + * + * @example + * program.argument(''); + * program.argument('[output-file]'); + * + * @param {string} name + * @param {string} [description] + * @param {Function|*} [fn] - custom argument processing function + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + */ + argument(name, description, fn, defaultValue) { + const argument2 = this.createArgument(name, description); + if (typeof fn === "function") { + argument2.default(defaultValue).argParser(fn); + } else { + argument2.default(fn); + } + this.addArgument(argument2); + return this; + } + /** + * Define argument syntax for command, adding multiple at once (without descriptions). + * + * See also .argument(). + * + * @example + * program.arguments(' [env]'); + * + * @param {string} names + * @return {Command} `this` command for chaining + */ + arguments(names) { + names.split(/ +/).forEach((detail) => { + this.argument(detail); + }); + return this; + } + /** + * Define argument syntax for command, adding a prepared argument. + * + * @param {Argument} argument + * @return {Command} `this` command for chaining + */ + addArgument(argument2) { + const previousArgument = this._args.slice(-1)[0]; + if (previousArgument && previousArgument.variadic) { + throw new Error(`only the last argument can be variadic '${previousArgument.name()}'`); + } + if (argument2.required && argument2.defaultValue !== void 0 && argument2.parseArg === void 0) { + throw new Error(`a default value for a required argument is never used: '${argument2.name()}'`); + } + this._args.push(argument2); + return this; + } + /** + * Override default decision whether to add implicit help command. + * + * addHelpCommand() // force on + * addHelpCommand(false); // force off + * addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details + * + * @return {Command} `this` command for chaining + */ + addHelpCommand(enableOrNameAndArgs, description) { + if (enableOrNameAndArgs === false) { + this._addImplicitHelpCommand = false; + } else { + this._addImplicitHelpCommand = true; + if (typeof enableOrNameAndArgs === "string") { + this._helpCommandName = enableOrNameAndArgs.split(" ")[0]; + this._helpCommandnameAndArgs = enableOrNameAndArgs; + } + this._helpCommandDescription = description || this._helpCommandDescription; + } + return this; + } + /** + * @return {boolean} + * @api private + */ + _hasImplicitHelpCommand() { + if (this._addImplicitHelpCommand === void 0) { + return this.commands.length && !this._actionHandler && !this._findCommand("help"); + } + return this._addImplicitHelpCommand; + } + /** + * Add hook for life cycle event. + * + * @param {string} event + * @param {Function} listener + * @return {Command} `this` command for chaining + */ + hook(event, listener) { + const allowedValues = ["preAction", "postAction"]; + if (!allowedValues.includes(event)) { + throw new Error(`Unexpected value for event passed to hook : '${event}'. +Expecting one of '${allowedValues.join("', '")}'`); + } + if (this._lifeCycleHooks[event]) { + this._lifeCycleHooks[event].push(listener); + } else { + this._lifeCycleHooks[event] = [listener]; + } + return this; + } + /** + * Register callback to use as replacement for calling process.exit. + * + * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing + * @return {Command} `this` command for chaining + */ + exitOverride(fn) { + if (fn) { + this._exitCallback = fn; + } else { + this._exitCallback = (err) => { + if (err.code !== "commander.executeSubCommandAsync") { + throw err; + } + }; + } + return this; + } + /** + * Call process.exit, and _exitCallback if defined. + * + * @param {number} exitCode exit code for using with process.exit + * @param {string} code an id string representing the error + * @param {string} message human-readable description of the error + * @return never + * @api private + */ + _exit(exitCode, code, message) { + if (this._exitCallback) { + this._exitCallback(new CommanderError(exitCode, code, message)); + } + process.exit(exitCode); + } + /** + * Register callback `fn` for the command. + * + * @example + * program + * .command('serve') + * .description('start service') + * .action(function() { + * // do work here + * }); + * + * @param {Function} fn + * @return {Command} `this` command for chaining + */ + action(fn) { + const listener = (args) => { + const expectedArgsCount = this._args.length; + const actionArgs = args.slice(0, expectedArgsCount); + if (this._storeOptionsAsProperties) { + actionArgs[expectedArgsCount] = this; + } else { + actionArgs[expectedArgsCount] = this.opts(); + } + actionArgs.push(this); + return fn.apply(this, actionArgs); + }; + this._actionHandler = listener; + return this; + } + /** + * Factory routine to create a new unattached option. + * + * See .option() for creating an attached option, which uses this routine to + * create the option. You can override createOption to return a custom option. + * + * @param {string} flags + * @param {string} [description] + * @return {Option} new option + */ + createOption(flags, description) { + return new Option(flags, description); + } + /** + * Add an option. + * + * @param {Option} option + * @return {Command} `this` command for chaining + */ + addOption(option2) { + const oname = option2.name(); + const name = option2.attributeName(); + let defaultValue = option2.defaultValue; + if (option2.negate || option2.optional || option2.required || typeof defaultValue === "boolean") { + if (option2.negate) { + const positiveLongFlag = option2.long.replace(/^--no-/, "--"); + defaultValue = this._findOption(positiveLongFlag) ? this.getOptionValue(name) : true; + } + if (defaultValue !== void 0) { + this.setOptionValueWithSource(name, defaultValue, "default"); + } + } + this.options.push(option2); + const handleOptionValue = (val, invalidValueMessage, valueSource) => { + const oldValue = this.getOptionValue(name); + if (val !== null && option2.parseArg) { + try { + val = option2.parseArg(val, oldValue === void 0 ? defaultValue : oldValue); + } catch (err) { + if (err.code === "commander.invalidArgument") { + const message = `${invalidValueMessage} ${err.message}`; + this._displayError(err.exitCode, err.code, message); + } + throw err; + } + } else if (val !== null && option2.variadic) { + val = option2._concatValue(val, oldValue); + } + if (typeof oldValue === "boolean" || typeof oldValue === "undefined") { + if (val == null) { + this.setOptionValueWithSource(name, option2.negate ? false : defaultValue || true, valueSource); + } else { + this.setOptionValueWithSource(name, val, valueSource); + } + } else if (val !== null) { + this.setOptionValueWithSource(name, option2.negate ? false : val, valueSource); + } + }; + this.on("option:" + oname, (val) => { + const invalidValueMessage = `error: option '${option2.flags}' argument '${val}' is invalid.`; + handleOptionValue(val, invalidValueMessage, "cli"); + }); + if (option2.envVar) { + this.on("optionEnv:" + oname, (val) => { + const invalidValueMessage = `error: option '${option2.flags}' value '${val}' from env '${option2.envVar}' is invalid.`; + handleOptionValue(val, invalidValueMessage, "env"); + }); + } + return this; + } + /** + * Internal implementation shared by .option() and .requiredOption() + * + * @api private + */ + _optionEx(config, flags, description, fn, defaultValue) { + const option2 = this.createOption(flags, description); + option2.makeOptionMandatory(!!config.mandatory); + if (typeof fn === "function") { + option2.default(defaultValue).argParser(fn); + } else if (fn instanceof RegExp) { + const regex = fn; + fn = (val, def) => { + const m = regex.exec(val); + return m ? m[0] : def; + }; + option2.default(defaultValue).argParser(fn); + } else { + option2.default(fn); + } + return this.addOption(option2); + } + /** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string contains the short and/or long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * @example + * // simple boolean defaulting to undefined + * program.option('-p, --pepper', 'add pepper'); + * + * program.pepper + * // => undefined + * + * --pepper + * program.pepper + * // => true + * + * // simple boolean defaulting to true (unless non-negated option is also defined) + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => false + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {string} flags + * @param {string} [description] + * @param {Function|*} [fn] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + */ + option(flags, description, fn, defaultValue) { + return this._optionEx({}, flags, description, fn, defaultValue); + } + /** + * Add a required option which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. + * + * @param {string} flags + * @param {string} [description] + * @param {Function|*} [fn] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + */ + requiredOption(flags, description, fn, defaultValue) { + return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue); + } + /** + * Alter parsing of short flags with optional values. + * + * @example + * // for `.option('-f,--flag [value]'): + * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour + * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` + * + * @param {Boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. + */ + combineFlagAndOptionalValue(combine = true) { + this._combineFlagAndOptionalValue = !!combine; + return this; + } + /** + * Allow unknown options on the command line. + * + * @param {Boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown + * for unknown options. + */ + allowUnknownOption(allowUnknown = true) { + this._allowUnknownOption = !!allowUnknown; + return this; + } + /** + * Allow excess command-arguments on the command line. Pass false to make excess arguments an error. + * + * @param {Boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown + * for excess arguments. + */ + allowExcessArguments(allowExcess = true) { + this._allowExcessArguments = !!allowExcess; + return this; + } + /** + * Enable positional options. Positional means global options are specified before subcommands which lets + * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions. + * The default behaviour is non-positional and global options may appear anywhere on the command line. + * + * @param {Boolean} [positional=true] + */ + enablePositionalOptions(positional = true) { + this._enablePositionalOptions = !!positional; + return this; + } + /** + * Pass through options that come after command-arguments rather than treat them as command-options, + * so actual command-options come before command-arguments. Turning this on for a subcommand requires + * positional options to have been enabled on the program (parent commands). + * The default behaviour is non-positional and options may appear before or after command-arguments. + * + * @param {Boolean} [passThrough=true] + * for unknown options. + */ + passThroughOptions(passThrough = true) { + this._passThroughOptions = !!passThrough; + if (!!this.parent && passThrough && !this.parent._enablePositionalOptions) { + throw new Error("passThroughOptions can not be used without turning on enablePositionalOptions for parent command(s)"); + } + return this; + } + /** + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @param {boolean} [storeAsProperties=true] + * @return {Command} `this` command for chaining + */ + storeOptionsAsProperties(storeAsProperties = true) { + this._storeOptionsAsProperties = !!storeAsProperties; + if (this.options.length) { + throw new Error("call .storeOptionsAsProperties() before adding options"); + } + return this; + } + /** + * Retrieve option value. + * + * @param {string} key + * @return {Object} value + */ + getOptionValue(key2) { + if (this._storeOptionsAsProperties) { + return this[key2]; + } + return this._optionValues[key2]; + } + /** + * Store option value. + * + * @param {string} key + * @param {Object} value + * @return {Command} `this` command for chaining + */ + setOptionValue(key2, value) { + if (this._storeOptionsAsProperties) { + this[key2] = value; + } else { + this._optionValues[key2] = value; + } + return this; + } + /** + * Store option value and where the value came from. + * + * @param {string} key + * @param {Object} value + * @param {string} source - expected values are default/config/env/cli + * @return {Command} `this` command for chaining + */ + setOptionValueWithSource(key2, value, source2) { + this.setOptionValue(key2, value); + this._optionValueSources[key2] = source2; + return this; + } + /** + * Get source of option value. + * Expected values are default | config | env | cli + * + * @param {string} key + * @return {string} + */ + getOptionValueSource(key2) { + return this._optionValueSources[key2]; + } + /** + * Get user arguments implied or explicit arguments. + * Side-effects: set _scriptPath if args included application, and use that to set implicit command name. + * + * @api private + */ + _prepareUserArgs(argv, parseOptions2) { + if (argv !== void 0 && !Array.isArray(argv)) { + throw new Error("first parameter to parse must be array or undefined"); + } + parseOptions2 = parseOptions2 || {}; + if (argv === void 0) { + argv = process.argv; + if (process.versions && process.versions.electron) { + parseOptions2.from = "electron"; + } + } + this.rawArgs = argv.slice(); + let userArgs; + switch (parseOptions2.from) { + case void 0: + case "node": + this._scriptPath = argv[1]; + userArgs = argv.slice(2); + break; + case "electron": + if (process.defaultApp) { + this._scriptPath = argv[1]; + userArgs = argv.slice(2); + } else { + userArgs = argv.slice(1); + } + break; + case "user": + userArgs = argv.slice(0); + break; + default: + throw new Error(`unexpected parse option { from: '${parseOptions2.from}' }`); + } + if (!this._scriptPath && require.main) { + this._scriptPath = require.main.filename; + } + this._name = this._name || this._scriptPath && path2.basename(this._scriptPath, path2.extname(this._scriptPath)); + return userArgs; + } + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * The default expectation is that the arguments are from node and have the application as argv[0] + * and the script being run in argv[1], with user parameters after that. + * + * @example + * program.parse(process.argv); + * program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] + * + * @param {string[]} [argv] - optional, defaults to process.argv + * @param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron + * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron' + * @return {Command} `this` command for chaining + */ + parse(argv, parseOptions2) { + const userArgs = this._prepareUserArgs(argv, parseOptions2); + this._parseCommand([], userArgs); + return this; + } + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * + * The default expectation is that the arguments are from node and have the application as argv[0] + * and the script being run in argv[1], with user parameters after that. + * + * @example + * await program.parseAsync(process.argv); + * await program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions + * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] + * + * @param {string[]} [argv] + * @param {Object} [parseOptions] + * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron' + * @return {Promise} + */ + async parseAsync(argv, parseOptions2) { + const userArgs = this._prepareUserArgs(argv, parseOptions2); + await this._parseCommand([], userArgs); + return this; + } + /** + * Execute a sub-command executable. + * + * @api private + */ + _executeSubCommand(subcommand, args) { + args = args.slice(); + let launchWithNode = false; + const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"]; + this._checkForMissingMandatoryOptions(); + let scriptPath = this._scriptPath; + if (!scriptPath && require.main) { + scriptPath = require.main.filename; + } + let baseDir; + try { + const resolvedLink = fs2.realpathSync(scriptPath); + baseDir = path2.dirname(resolvedLink); + } catch (e) { + baseDir = "."; + } + let bin = path2.basename(scriptPath, path2.extname(scriptPath)) + "-" + subcommand._name; + if (subcommand._executableFile) { + bin = subcommand._executableFile; + } + const localBin = path2.join(baseDir, bin); + if (fs2.existsSync(localBin)) { + bin = localBin; + } else { + sourceExt.forEach((ext) => { + if (fs2.existsSync(`${localBin}${ext}`)) { + bin = `${localBin}${ext}`; + } + }); + } + launchWithNode = sourceExt.includes(path2.extname(bin)); + let proc; + if (process.platform !== "win32") { + if (launchWithNode) { + args.unshift(bin); + args = incrementNodeInspectorPort(process.execArgv).concat(args); + proc = childProcess.spawn(process.argv[0], args, { stdio: "inherit" }); + } else { + proc = childProcess.spawn(bin, args, { stdio: "inherit" }); + } + } else { + args.unshift(bin); + args = incrementNodeInspectorPort(process.execArgv).concat(args); + proc = childProcess.spawn(process.execPath, args, { stdio: "inherit" }); + } + const signals2 = ["SIGUSR1", "SIGUSR2", "SIGTERM", "SIGINT", "SIGHUP"]; + signals2.forEach((signal) => { + process.on(signal, () => { + if (proc.killed === false && proc.exitCode === null) { + proc.kill(signal); + } + }); + }); + const exitCallback = this._exitCallback; + if (!exitCallback) { + proc.on("close", process.exit.bind(process)); + } else { + proc.on("close", () => { + exitCallback(new CommanderError(process.exitCode || 0, "commander.executeSubCommandAsync", "(close)")); + }); + } + proc.on("error", (err) => { + if (err.code === "ENOENT") { + const executableMissing = `'${bin}' does not exist + - if '${subcommand._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead + - if the default executable name is not suitable, use the executableFile option to supply a custom name`; + throw new Error(executableMissing); + } else if (err.code === "EACCES") { + throw new Error(`'${bin}' not executable`); + } + if (!exitCallback) { + process.exit(1); + } else { + const wrappedError = new CommanderError(1, "commander.executeSubCommandAsync", "(error)"); + wrappedError.nestedError = err; + exitCallback(wrappedError); + } + }); + this.runningCommand = proc; + } + /** + * @api private + */ + _dispatchSubcommand(commandName, operands, unknown) { + const subCommand = this._findCommand(commandName); + if (!subCommand) this.help({ error: true }); + if (subCommand._executableHandler) { + this._executeSubCommand(subCommand, operands.concat(unknown)); + } else { + return subCommand._parseCommand(operands, unknown); + } + } + /** + * Check this.args against expected this._args. + * + * @api private + */ + _checkNumberOfArguments() { + this._args.forEach((arg, i) => { + if (arg.required && this.args[i] == null) { + this.missingArgument(arg.name()); + } + }); + if (this._args.length > 0 && this._args[this._args.length - 1].variadic) { + return; + } + if (this.args.length > this._args.length) { + this._excessArguments(this.args); + } + } + /** + * Process this.args using this._args and save as this.processedArgs! + * + * @api private + */ + _processArguments() { + const myParseArg = (argument2, value, previous) => { + let parsedValue = value; + if (value !== null && argument2.parseArg) { + try { + parsedValue = argument2.parseArg(value, previous); + } catch (err) { + if (err.code === "commander.invalidArgument") { + const message = `error: command-argument value '${value}' is invalid for argument '${argument2.name()}'. ${err.message}`; + this._displayError(err.exitCode, err.code, message); + } + throw err; + } + } + return parsedValue; + }; + this._checkNumberOfArguments(); + const processedArgs = []; + this._args.forEach((declaredArg, index2) => { + let value = declaredArg.defaultValue; + if (declaredArg.variadic) { + if (index2 < this.args.length) { + value = this.args.slice(index2); + if (declaredArg.parseArg) { + value = value.reduce((processed, v) => { + return myParseArg(declaredArg, v, processed); + }, declaredArg.defaultValue); + } + } else if (value === void 0) { + value = []; + } + } else if (index2 < this.args.length) { + value = this.args[index2]; + if (declaredArg.parseArg) { + value = myParseArg(declaredArg, value, declaredArg.defaultValue); + } + } + processedArgs[index2] = value; + }); + this.processedArgs = processedArgs; + } + /** + * Once we have a promise we chain, but call synchronously until then. + * + * @param {Promise|undefined} promise + * @param {Function} fn + * @return {Promise|undefined} + * @api private + */ + _chainOrCall(promise, fn) { + if (promise && promise.then && typeof promise.then === "function") { + return promise.then(() => fn()); + } + return fn(); + } + /** + * + * @param {Promise|undefined} promise + * @param {string} event + * @return {Promise|undefined} + * @api private + */ + _chainOrCallHooks(promise, event) { + let result = promise; + const hooks = []; + getCommandAndParents(this).reverse().filter((cmd) => cmd._lifeCycleHooks[event] !== void 0).forEach((hookedCommand) => { + hookedCommand._lifeCycleHooks[event].forEach((callback) => { + hooks.push({ hookedCommand, callback }); + }); + }); + if (event === "postAction") { + hooks.reverse(); + } + hooks.forEach((hookDetail) => { + result = this._chainOrCall(result, () => { + return hookDetail.callback(hookDetail.hookedCommand, this); + }); + }); + return result; + } + /** + * Process arguments in context of this command. + * Returns action result, in case it is a promise. + * + * @api private + */ + _parseCommand(operands, unknown) { + const parsed = this.parseOptions(unknown); + this._parseOptionsEnv(); + operands = operands.concat(parsed.operands); + unknown = parsed.unknown; + this.args = operands.concat(unknown); + if (operands && this._findCommand(operands[0])) { + return this._dispatchSubcommand(operands[0], operands.slice(1), unknown); + } + if (this._hasImplicitHelpCommand() && operands[0] === this._helpCommandName) { + if (operands.length === 1) { + this.help(); + } + return this._dispatchSubcommand(operands[1], [], [this._helpLongFlag]); + } + if (this._defaultCommandName) { + outputHelpIfRequested(this, unknown); + return this._dispatchSubcommand(this._defaultCommandName, operands, unknown); + } + if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { + this.help({ error: true }); + } + outputHelpIfRequested(this, parsed.unknown); + this._checkForMissingMandatoryOptions(); + const checkForUnknownOptions = () => { + if (parsed.unknown.length > 0) { + this.unknownOption(parsed.unknown[0]); + } + }; + const commandEvent = `command:${this.name()}`; + if (this._actionHandler) { + checkForUnknownOptions(); + this._processArguments(); + let actionResult; + actionResult = this._chainOrCallHooks(actionResult, "preAction"); + actionResult = this._chainOrCall(actionResult, () => this._actionHandler(this.processedArgs)); + if (this.parent) this.parent.emit(commandEvent, operands, unknown); + actionResult = this._chainOrCallHooks(actionResult, "postAction"); + return actionResult; + } + if (this.parent && this.parent.listenerCount(commandEvent)) { + checkForUnknownOptions(); + this._processArguments(); + this.parent.emit(commandEvent, operands, unknown); + } else if (operands.length) { + if (this._findCommand("*")) { + return this._dispatchSubcommand("*", operands, unknown); + } + if (this.listenerCount("command:*")) { + this.emit("command:*", operands, unknown); + } else if (this.commands.length) { + this.unknownCommand(); + } else { + checkForUnknownOptions(); + this._processArguments(); + } + } else if (this.commands.length) { + checkForUnknownOptions(); + this.help({ error: true }); + } else { + checkForUnknownOptions(); + this._processArguments(); + } + } + /** + * Find matching command. + * + * @api private + */ + _findCommand(name) { + if (!name) return void 0; + return this.commands.find((cmd) => cmd._name === name || cmd._aliases.includes(name)); + } + /** + * Return an option matching `arg` if any. + * + * @param {string} arg + * @return {Option} + * @api private + */ + _findOption(arg) { + return this.options.find((option2) => option2.is(arg)); + } + /** + * Display an error message if a mandatory option does not have a value. + * Lazy calling after checking for help flags from leaf subcommand. + * + * @api private + */ + _checkForMissingMandatoryOptions() { + for (let cmd = this; cmd; cmd = cmd.parent) { + cmd.options.forEach((anOption) => { + if (anOption.mandatory && cmd.getOptionValue(anOption.attributeName()) === void 0) { + cmd.missingMandatoryOptionValue(anOption); + } + }); + } + } + /** + * Parse options from `argv` removing known options, + * and return argv split into operands and unknown arguments. + * + * Examples: + * + * argv => operands, unknown + * --known kkk op => [op], [] + * op --known kkk => [op], [] + * sub --unknown uuu op => [sub], [--unknown uuu op] + * sub -- --unknown uuu op => [sub --unknown uuu op], [] + * + * @param {String[]} argv + * @return {{operands: String[], unknown: String[]}} + */ + parseOptions(argv) { + const operands = []; + const unknown = []; + let dest = operands; + const args = argv.slice(); + function maybeOption(arg) { + return arg.length > 1 && arg[0] === "-"; + } + let activeVariadicOption = null; + while (args.length) { + const arg = args.shift(); + if (arg === "--") { + if (dest === unknown) dest.push(arg); + dest.push(...args); + break; + } + if (activeVariadicOption && !maybeOption(arg)) { + this.emit(`option:${activeVariadicOption.name()}`, arg); + continue; + } + activeVariadicOption = null; + if (maybeOption(arg)) { + const option2 = this._findOption(arg); + if (option2) { + if (option2.required) { + const value = args.shift(); + if (value === void 0) this.optionMissingArgument(option2); + this.emit(`option:${option2.name()}`, value); + } else if (option2.optional) { + let value = null; + if (args.length > 0 && !maybeOption(args[0])) { + value = args.shift(); + } + this.emit(`option:${option2.name()}`, value); + } else { + this.emit(`option:${option2.name()}`); + } + activeVariadicOption = option2.variadic ? option2 : null; + continue; + } + } + if (arg.length > 2 && arg[0] === "-" && arg[1] !== "-") { + const option2 = this._findOption(`-${arg[1]}`); + if (option2) { + if (option2.required || option2.optional && this._combineFlagAndOptionalValue) { + this.emit(`option:${option2.name()}`, arg.slice(2)); + } else { + this.emit(`option:${option2.name()}`); + args.unshift(`-${arg.slice(2)}`); + } + continue; + } + } + if (/^--[^=]+=/.test(arg)) { + const index2 = arg.indexOf("="); + const option2 = this._findOption(arg.slice(0, index2)); + if (option2 && (option2.required || option2.optional)) { + this.emit(`option:${option2.name()}`, arg.slice(index2 + 1)); + continue; + } + } + if (maybeOption(arg)) { + dest = unknown; + } + if ((this._enablePositionalOptions || this._passThroughOptions) && operands.length === 0 && unknown.length === 0) { + if (this._findCommand(arg)) { + operands.push(arg); + if (args.length > 0) unknown.push(...args); + break; + } else if (arg === this._helpCommandName && this._hasImplicitHelpCommand()) { + operands.push(arg); + if (args.length > 0) operands.push(...args); + break; + } else if (this._defaultCommandName) { + unknown.push(arg); + if (args.length > 0) unknown.push(...args); + break; + } + } + if (this._passThroughOptions) { + dest.push(arg); + if (args.length > 0) dest.push(...args); + break; + } + dest.push(arg); + } + return { operands, unknown }; + } + /** + * Return an object containing options as key-value pairs + * + * @return {Object} + */ + opts() { + if (this._storeOptionsAsProperties) { + const result = {}; + const len = this.options.length; + for (let i = 0; i < len; i++) { + const key2 = this.options[i].attributeName(); + result[key2] = key2 === this._versionOptionName ? this._version : this[key2]; + } + return result; + } + return this._optionValues; + } + /** + * Internal bottleneck for handling of parsing errors. + * + * @api private + */ + _displayError(exitCode, code, message) { + this._outputConfiguration.outputError(`${message} +`, this._outputConfiguration.writeErr); + if (typeof this._showHelpAfterError === "string") { + this._outputConfiguration.writeErr(`${this._showHelpAfterError} +`); + } else if (this._showHelpAfterError) { + this._outputConfiguration.writeErr("\n"); + this.outputHelp({ error: true }); + } + this._exit(exitCode, code, message); + } + /** + * Apply any option related environment variables, if option does + * not have a value from cli or client code. + * + * @api private + */ + _parseOptionsEnv() { + this.options.forEach((option2) => { + if (option2.envVar && option2.envVar in define_process_env_default) { + const optionKey = option2.attributeName(); + if (this.getOptionValue(optionKey) === void 0 || ["default", "config", "env"].includes(this.getOptionValueSource(optionKey))) { + if (option2.required || option2.optional) { + this.emit(`optionEnv:${option2.name()}`, define_process_env_default[option2.envVar]); + } else { + this.emit(`optionEnv:${option2.name()}`); + } + } + } + }); + } + /** + * Argument `name` is missing. + * + * @param {string} name + * @api private + */ + missingArgument(name) { + const message = `error: missing required argument '${name}'`; + this._displayError(1, "commander.missingArgument", message); + } + /** + * `Option` is missing an argument. + * + * @param {Option} option + * @api private + */ + optionMissingArgument(option2) { + const message = `error: option '${option2.flags}' argument missing`; + this._displayError(1, "commander.optionMissingArgument", message); + } + /** + * `Option` does not have a value, and is a mandatory option. + * + * @param {Option} option + * @api private + */ + missingMandatoryOptionValue(option2) { + const message = `error: required option '${option2.flags}' not specified`; + this._displayError(1, "commander.missingMandatoryOptionValue", message); + } + /** + * Unknown option `flag`. + * + * @param {string} flag + * @api private + */ + unknownOption(flag) { + if (this._allowUnknownOption) return; + let suggestion = ""; + if (flag.startsWith("--") && this._showSuggestionAfterError) { + let candidateFlags = []; + let command2 = this; + do { + const moreFlags = command2.createHelp().visibleOptions(command2).filter((option2) => option2.long).map((option2) => option2.long); + candidateFlags = candidateFlags.concat(moreFlags); + command2 = command2.parent; + } while (command2 && !command2._enablePositionalOptions); + suggestion = suggestSimilar2(flag, candidateFlags); + } + const message = `error: unknown option '${flag}'${suggestion}`; + this._displayError(1, "commander.unknownOption", message); + } + /** + * Excess arguments, more than expected. + * + * @param {string[]} receivedArgs + * @api private + */ + _excessArguments(receivedArgs) { + if (this._allowExcessArguments) return; + const expected = this._args.length; + const s = expected === 1 ? "" : "s"; + const forSubcommand = this.parent ? ` for '${this.name()}'` : ""; + const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`; + this._displayError(1, "commander.excessArguments", message); + } + /** + * Unknown command. + * + * @api private + */ + unknownCommand() { + const unknownName = this.args[0]; + let suggestion = ""; + if (this._showSuggestionAfterError) { + const candidateNames = []; + this.createHelp().visibleCommands(this).forEach((command2) => { + candidateNames.push(command2.name()); + if (command2.alias()) candidateNames.push(command2.alias()); + }); + suggestion = suggestSimilar2(unknownName, candidateNames); + } + const message = `error: unknown command '${unknownName}'${suggestion}`; + this._displayError(1, "commander.unknownCommand", message); + } + /** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * You can optionally supply the flags and description to override the defaults. + * + * @param {string} str + * @param {string} [flags] + * @param {string} [description] + * @return {this | string} `this` command for chaining, or version string if no arguments + */ + version(str, flags, description) { + if (str === void 0) return this._version; + this._version = str; + flags = flags || "-V, --version"; + description = description || "output the version number"; + const versionOption = this.createOption(flags, description); + this._versionOptionName = versionOption.attributeName(); + this.options.push(versionOption); + this.on("option:" + versionOption.name(), () => { + this._outputConfiguration.writeOut(`${str} +`); + this._exit(0, "commander.version", str); + }); + return this; + } + /** + * Set the description to `str`. + * + * @param {string} [str] + * @param {Object} [argsDescription] + * @return {string|Command} + */ + description(str, argsDescription) { + if (str === void 0 && argsDescription === void 0) return this._description; + this._description = str; + if (argsDescription) { + this._argsDescription = argsDescription; + } + return this; + } + /** + * Set an alias for the command. + * + * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help. + * + * @param {string} [alias] + * @return {string|Command} + */ + alias(alias) { + if (alias === void 0) return this._aliases[0]; + let command2 = this; + if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) { + command2 = this.commands[this.commands.length - 1]; + } + if (alias === command2._name) throw new Error("Command alias can't be the same as its name"); + command2._aliases.push(alias); + return this; + } + /** + * Set aliases for the command. + * + * Only the first alias is shown in the auto-generated help. + * + * @param {string[]} [aliases] + * @return {string[]|Command} + */ + aliases(aliases2) { + if (aliases2 === void 0) return this._aliases; + aliases2.forEach((alias) => this.alias(alias)); + return this; + } + /** + * Set / get the command usage `str`. + * + * @param {string} [str] + * @return {String|Command} + */ + usage(str) { + if (str === void 0) { + if (this._usage) return this._usage; + const args = this._args.map((arg) => { + return humanReadableArgName(arg); + }); + return [].concat( + this.options.length || this._hasHelpOption ? "[options]" : [], + this.commands.length ? "[command]" : [], + this._args.length ? args : [] + ).join(" "); + } + this._usage = str; + return this; + } + /** + * Get or set the name of the command + * + * @param {string} [str] + * @return {string|Command} + */ + name(str) { + if (str === void 0) return this._name; + this._name = str; + return this; + } + /** + * Return program help documentation. + * + * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout + * @return {string} + */ + helpInformation(contextOptions) { + const helper2 = this.createHelp(); + if (helper2.helpWidth === void 0) { + helper2.helpWidth = contextOptions && contextOptions.error ? this._outputConfiguration.getErrHelpWidth() : this._outputConfiguration.getOutHelpWidth(); + } + return helper2.formatHelp(this, helper2); + } + /** + * @api private + */ + _getHelpContext(contextOptions) { + contextOptions = contextOptions || {}; + const context = { error: !!contextOptions.error }; + let write2; + if (context.error) { + write2 = (arg) => this._outputConfiguration.writeErr(arg); + } else { + write2 = (arg) => this._outputConfiguration.writeOut(arg); + } + context.write = contextOptions.write || write2; + context.command = this; + return context; + } + /** + * Output help information for this command. + * + * Outputs built-in help, and custom text added using `.addHelpText()`. + * + * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout + */ + outputHelp(contextOptions) { + let deprecatedCallback; + if (typeof contextOptions === "function") { + deprecatedCallback = contextOptions; + contextOptions = void 0; + } + const context = this._getHelpContext(contextOptions); + getCommandAndParents(this).reverse().forEach((command2) => command2.emit("beforeAllHelp", context)); + this.emit("beforeHelp", context); + let helpInformation = this.helpInformation(context); + if (deprecatedCallback) { + helpInformation = deprecatedCallback(helpInformation); + if (typeof helpInformation !== "string" && !Buffer.isBuffer(helpInformation)) { + throw new Error("outputHelp callback must return a string or a Buffer"); + } + } + context.write(helpInformation); + this.emit(this._helpLongFlag); + this.emit("afterHelp", context); + getCommandAndParents(this).forEach((command2) => command2.emit("afterAllHelp", context)); + } + /** + * You can pass in flags and a description to override the help + * flags and help description for your command. Pass in false to + * disable the built-in help option. + * + * @param {string | boolean} [flags] + * @param {string} [description] + * @return {Command} `this` command for chaining + */ + helpOption(flags, description) { + if (typeof flags === "boolean") { + this._hasHelpOption = flags; + return this; + } + this._helpFlags = flags || this._helpFlags; + this._helpDescription = description || this._helpDescription; + const helpFlags = splitOptionFlags(this._helpFlags); + this._helpShortFlag = helpFlags.shortFlag; + this._helpLongFlag = helpFlags.longFlag; + return this; + } + /** + * Output help information and exit. + * + * Outputs built-in help, and custom text added using `.addHelpText()`. + * + * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout + */ + help(contextOptions) { + this.outputHelp(contextOptions); + let exitCode = process.exitCode || 0; + if (exitCode === 0 && contextOptions && typeof contextOptions !== "function" && contextOptions.error) { + exitCode = 1; + } + this._exit(exitCode, "commander.help", "(outputHelp)"); + } + /** + * Add additional text to be displayed with the built-in help. + * + * Position is 'before' or 'after' to affect just this command, + * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands. + * + * @param {string} position - before or after built-in help + * @param {string | Function} text - string to add, or a function returning a string + * @return {Command} `this` command for chaining + */ + addHelpText(position, text) { + const allowedValues = ["beforeAll", "before", "after", "afterAll"]; + if (!allowedValues.includes(position)) { + throw new Error(`Unexpected value for position to addHelpText. +Expecting one of '${allowedValues.join("', '")}'`); + } + const helpEvent = `${position}Help`; + this.on(helpEvent, (context) => { + let helpStr; + if (typeof text === "function") { + helpStr = text({ error: context.error, command: context.command }); + } else { + helpStr = text; + } + if (helpStr) { + context.write(`${helpStr} +`); + } + }); + return this; + } + } + function outputHelpIfRequested(cmd, args) { + const helpOption = cmd._hasHelpOption && args.find((arg) => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag); + if (helpOption) { + cmd.outputHelp(); + cmd._exit(0, "commander.helpDisplayed", "(outputHelp)"); + } + } + function incrementNodeInspectorPort(args) { + return args.map((arg) => { + if (!arg.startsWith("--inspect")) { + return arg; + } + let debugOption; + let debugHost = "127.0.0.1"; + let debugPort = "9229"; + let match; + if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { + debugOption = match[1]; + } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { + debugOption = match[1]; + if (/^\d+$/.test(match[3])) { + debugPort = match[3]; + } else { + debugHost = match[3]; + } + } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { + debugOption = match[1]; + debugHost = match[3]; + debugPort = match[4]; + } + if (debugOption && debugPort !== "0") { + return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`; + } + return arg; + }); + } + function getCommandAndParents(startCommand) { + const result = []; + for (let command2 = startCommand; command2; command2 = command2.parent) { + result.push(command2); + } + return result; + } + command.Command = Command; + return command; +} +var hasRequiredCommander; +function requireCommander() { + if (hasRequiredCommander) return commander.exports; + hasRequiredCommander = 1; + (function(module, exports) { + const { Argument } = requireArgument(); + const { Command } = requireCommand(); + const { CommanderError, InvalidArgumentError } = requireError(); + const { Help } = requireHelp(); + const { Option } = requireOption(); + exports = module.exports = new Command(); + exports.program = exports; + exports.Argument = Argument; + exports.Command = Command; + exports.CommanderError = CommanderError; + exports.Help = Help; + exports.InvalidArgumentError = InvalidArgumentError; + exports.InvalidOptionArgumentError = InvalidArgumentError; + exports.Option = Option; + })(commander, commander.exports); + return commander.exports; +} +var commanderExports = requireCommander(); +var nodeProgress = { exports: {} }; +/*! + * node-progress + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ +var hasRequiredNodeProgress; +function requireNodeProgress() { + if (hasRequiredNodeProgress) return nodeProgress.exports; + hasRequiredNodeProgress = 1; + (function(module, exports) { + module.exports = ProgressBar; + function ProgressBar(fmt, options2) { + this.stream = options2.stream || process.stderr; + if (typeof options2 == "number") { + var total = options2; + options2 = {}; + options2.total = total; + } else { + options2 = options2 || {}; + if ("string" != typeof fmt) throw new Error("format required"); + if ("number" != typeof options2.total) throw new Error("total required"); + } + this.fmt = fmt; + this.curr = options2.curr || 0; + this.total = options2.total; + this.width = options2.width || this.total; + this.clear = options2.clear; + this.chars = { + complete: options2.complete || "=", + incomplete: options2.incomplete || "-", + head: options2.head || (options2.complete || "=") + }; + this.renderThrottle = options2.renderThrottle !== 0 ? options2.renderThrottle || 16 : 0; + this.lastRender = -Infinity; + this.callback = options2.callback || function() { + }; + this.tokens = {}; + this.lastDraw = ""; + } + ProgressBar.prototype.tick = function(len, tokens) { + if (len !== 0) + len = len || 1; + if ("object" == typeof len) tokens = len, len = 1; + if (tokens) this.tokens = tokens; + if (0 == this.curr) this.start = /* @__PURE__ */ new Date(); + this.curr += len; + this.render(); + if (this.curr >= this.total) { + this.render(void 0, true); + this.complete = true; + this.terminate(); + this.callback(this); + return; + } + }; + ProgressBar.prototype.render = function(tokens, force) { + force = force !== void 0 ? force : false; + if (tokens) this.tokens = tokens; + if (!this.stream.isTTY) return; + var now = Date.now(); + var delta = now - this.lastRender; + if (!force && delta < this.renderThrottle) { + return; + } else { + this.lastRender = now; + } + var ratio = this.curr / this.total; + ratio = Math.min(Math.max(ratio, 0), 1); + var percent = Math.floor(ratio * 100); + var incomplete, complete, completeLength; + var elapsed = /* @__PURE__ */ new Date() - this.start; + var eta = percent == 100 ? 0 : elapsed * (this.total / this.curr - 1); + var rate = this.curr / (elapsed / 1e3); + var str = this.fmt.replace(":current", this.curr).replace(":total", this.total).replace(":elapsed", isNaN(elapsed) ? "0.0" : (elapsed / 1e3).toFixed(1)).replace(":eta", isNaN(eta) || !isFinite(eta) ? "0.0" : (eta / 1e3).toFixed(1)).replace(":percent", percent.toFixed(0) + "%").replace(":rate", Math.round(rate)); + var availableSpace = Math.max(0, this.stream.columns - str.replace(":bar", "").length); + if (availableSpace && process.platform === "win32") { + availableSpace = availableSpace - 1; + } + var width = Math.min(this.width, availableSpace); + completeLength = Math.round(width * ratio); + complete = Array(Math.max(0, completeLength + 1)).join(this.chars.complete); + incomplete = Array(Math.max(0, width - completeLength + 1)).join(this.chars.incomplete); + if (completeLength > 0) + complete = complete.slice(0, -1) + this.chars.head; + str = str.replace(":bar", complete + incomplete); + if (this.tokens) for (var key2 in this.tokens) str = str.replace(":" + key2, this.tokens[key2]); + if (this.lastDraw !== str) { + this.stream.cursorTo(0); + this.stream.write(str); + this.stream.clearLine(1); + this.lastDraw = str; + } + }; + ProgressBar.prototype.update = function(ratio, tokens) { + var goal = Math.floor(ratio * this.total); + var delta = goal - this.curr; + this.tick(delta, tokens); + }; + ProgressBar.prototype.interrupt = function(message) { + this.stream.clearLine(); + this.stream.cursorTo(0); + this.stream.write(message); + this.stream.write("\n"); + this.stream.write(this.lastDraw); + }; + ProgressBar.prototype.terminate = function() { + if (this.clear) { + if (this.stream.clearLine) { + this.stream.clearLine(); + this.stream.cursorTo(0); + } + } else { + this.stream.write("\n"); + } + }; + })(nodeProgress); + return nodeProgress.exports; +} +var progress$2; +var hasRequiredProgress; +function requireProgress() { + if (hasRequiredProgress) return progress$2; + hasRequiredProgress = 1; + progress$2 = requireNodeProgress(); + return progress$2; +} +var progressExports = requireProgress(); +const progressLibrary = /* @__PURE__ */ getDefaultExportFromCjs(progressExports); +var agent = {}; +function noop$1() { +} +const promises = { + lookup: noop$1() +}; +const dns = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + default: promises, + promises +}, Symbol.toStringTag, { value: "Module" })); +const require$$0$3 = /* @__PURE__ */ getAugmentedNamespace(dns); +var build = {}; +var socksclient = {}; +var smartbuffer = {}; +var utils = {}; +var hasRequiredUtils; +function requireUtils() { + if (hasRequiredUtils) return utils; + hasRequiredUtils = 1; + Object.defineProperty(utils, "__esModule", { value: true }); + const buffer_1 = requireBuffer$2(); + const ERRORS = { + INVALID_ENCODING: "Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.", + INVALID_SMARTBUFFER_SIZE: "Invalid size provided. Size must be a valid integer greater than zero.", + INVALID_SMARTBUFFER_BUFFER: "Invalid Buffer provided in SmartBufferOptions.", + INVALID_SMARTBUFFER_OBJECT: "Invalid SmartBufferOptions object supplied to SmartBuffer constructor or factory methods.", + INVALID_OFFSET: "An invalid offset value was provided.", + INVALID_OFFSET_NON_NUMBER: "An invalid offset value was provided. A numeric value is required.", + INVALID_LENGTH: "An invalid length value was provided.", + INVALID_LENGTH_NON_NUMBER: "An invalid length value was provived. A numeric value is required.", + INVALID_TARGET_OFFSET: "Target offset is beyond the bounds of the internal SmartBuffer data.", + INVALID_TARGET_LENGTH: "Specified length value moves cursor beyong the bounds of the internal SmartBuffer data.", + INVALID_READ_BEYOND_BOUNDS: "Attempted to read beyond the bounds of the managed data.", + INVALID_WRITE_BEYOND_BOUNDS: "Attempted to write beyond the bounds of the managed data." + }; + utils.ERRORS = ERRORS; + function checkEncoding(encoding2) { + if (!buffer_1.Buffer.isEncoding(encoding2)) { + throw new Error(ERRORS.INVALID_ENCODING); + } + } + utils.checkEncoding = checkEncoding; + function isFiniteInteger(value) { + return typeof value === "number" && isFinite(value) && isInteger(value); + } + utils.isFiniteInteger = isFiniteInteger; + function checkOffsetOrLengthValue(value, offset2) { + if (typeof value === "number") { + if (!isFiniteInteger(value) || value < 0) { + throw new Error(offset2 ? ERRORS.INVALID_OFFSET : ERRORS.INVALID_LENGTH); + } + } else { + throw new Error(offset2 ? ERRORS.INVALID_OFFSET_NON_NUMBER : ERRORS.INVALID_LENGTH_NON_NUMBER); + } + } + function checkLengthValue(length) { + checkOffsetOrLengthValue(length, false); + } + utils.checkLengthValue = checkLengthValue; + function checkOffsetValue(offset2) { + checkOffsetOrLengthValue(offset2, true); + } + utils.checkOffsetValue = checkOffsetValue; + function checkTargetOffset(offset2, buff) { + if (offset2 < 0 || offset2 > buff.length) { + throw new Error(ERRORS.INVALID_TARGET_OFFSET); + } + } + utils.checkTargetOffset = checkTargetOffset; + function isInteger(value) { + return typeof value === "number" && isFinite(value) && Math.floor(value) === value; + } + function bigIntAndBufferInt64Check(bufferMethod) { + if (typeof BigInt === "undefined") { + throw new Error("Platform does not support JS BigInt type."); + } + if (typeof buffer_1.Buffer.prototype[bufferMethod] === "undefined") { + throw new Error(`Platform does not support Buffer.prototype.${bufferMethod}.`); + } + } + utils.bigIntAndBufferInt64Check = bigIntAndBufferInt64Check; + return utils; +} +var hasRequiredSmartbuffer; +function requireSmartbuffer() { + if (hasRequiredSmartbuffer) return smartbuffer; + hasRequiredSmartbuffer = 1; + Object.defineProperty(smartbuffer, "__esModule", { value: true }); + const utils_1 = requireUtils(); + const DEFAULT_SMARTBUFFER_SIZE = 4096; + const DEFAULT_SMARTBUFFER_ENCODING = "utf8"; + class SmartBuffer { + /** + * Creates a new SmartBuffer instance. + * + * @param options { SmartBufferOptions } The SmartBufferOptions to apply to this instance. + */ + constructor(options2) { + this.length = 0; + this._encoding = DEFAULT_SMARTBUFFER_ENCODING; + this._writeOffset = 0; + this._readOffset = 0; + if (SmartBuffer.isSmartBufferOptions(options2)) { + if (options2.encoding) { + utils_1.checkEncoding(options2.encoding); + this._encoding = options2.encoding; + } + if (options2.size) { + if (utils_1.isFiniteInteger(options2.size) && options2.size > 0) { + this._buff = Buffer.allocUnsafe(options2.size); + } else { + throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_SIZE); + } + } else if (options2.buff) { + if (Buffer.isBuffer(options2.buff)) { + this._buff = options2.buff; + this.length = options2.buff.length; + } else { + throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_BUFFER); + } + } else { + this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); + } + } else { + if (typeof options2 !== "undefined") { + throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_OBJECT); + } + this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE); + } + } + /** + * Creates a new SmartBuffer instance with the provided internal Buffer size and optional encoding. + * + * @param size { Number } The size of the internal Buffer. + * @param encoding { String } The BufferEncoding to use for strings. + * + * @return { SmartBuffer } + */ + static fromSize(size, encoding2) { + return new this({ + size, + encoding: encoding2 + }); + } + /** + * Creates a new SmartBuffer instance with the provided Buffer and optional encoding. + * + * @param buffer { Buffer } The Buffer to use as the internal Buffer value. + * @param encoding { String } The BufferEncoding to use for strings. + * + * @return { SmartBuffer } + */ + static fromBuffer(buff, encoding2) { + return new this({ + buff, + encoding: encoding2 + }); + } + /** + * Creates a new SmartBuffer instance with the provided SmartBufferOptions options. + * + * @param options { SmartBufferOptions } The options to use when creating the SmartBuffer instance. + */ + static fromOptions(options2) { + return new this(options2); + } + /** + * Type checking function that determines if an object is a SmartBufferOptions object. + */ + static isSmartBufferOptions(options2) { + const castOptions = options2; + return castOptions && (castOptions.encoding !== void 0 || castOptions.size !== void 0 || castOptions.buff !== void 0); + } + // Signed integers + /** + * Reads an Int8 value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readInt8(offset2) { + return this._readNumberValue(Buffer.prototype.readInt8, 1, offset2); + } + /** + * Reads an Int16BE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readInt16BE(offset2) { + return this._readNumberValue(Buffer.prototype.readInt16BE, 2, offset2); + } + /** + * Reads an Int16LE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readInt16LE(offset2) { + return this._readNumberValue(Buffer.prototype.readInt16LE, 2, offset2); + } + /** + * Reads an Int32BE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readInt32BE(offset2) { + return this._readNumberValue(Buffer.prototype.readInt32BE, 4, offset2); + } + /** + * Reads an Int32LE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readInt32LE(offset2) { + return this._readNumberValue(Buffer.prototype.readInt32LE, 4, offset2); + } + /** + * Reads a BigInt64BE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { BigInt } + */ + readBigInt64BE(offset2) { + utils_1.bigIntAndBufferInt64Check("readBigInt64BE"); + return this._readNumberValue(Buffer.prototype.readBigInt64BE, 8, offset2); + } + /** + * Reads a BigInt64LE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { BigInt } + */ + readBigInt64LE(offset2) { + utils_1.bigIntAndBufferInt64Check("readBigInt64LE"); + return this._readNumberValue(Buffer.prototype.readBigInt64LE, 8, offset2); + } + /** + * Writes an Int8 value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeInt8(value, offset2) { + this._writeNumberValue(Buffer.prototype.writeInt8, 1, value, offset2); + return this; + } + /** + * Inserts an Int8 value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertInt8(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeInt8, 1, value, offset2); + } + /** + * Writes an Int16BE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeInt16BE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset2); + } + /** + * Inserts an Int16BE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertInt16BE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset2); + } + /** + * Writes an Int16LE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeInt16LE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset2); + } + /** + * Inserts an Int16LE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertInt16LE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset2); + } + /** + * Writes an Int32BE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeInt32BE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset2); + } + /** + * Inserts an Int32BE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertInt32BE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset2); + } + /** + * Writes an Int32LE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeInt32LE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset2); + } + /** + * Inserts an Int32LE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertInt32LE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset2); + } + /** + * Writes a BigInt64BE value to the current write position (or at optional offset). + * + * @param value { BigInt } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeBigInt64BE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigInt64BE"); + return this._writeNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset2); + } + /** + * Inserts a BigInt64BE value at the given offset value. + * + * @param value { BigInt } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertBigInt64BE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigInt64BE"); + return this._insertNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset2); + } + /** + * Writes a BigInt64LE value to the current write position (or at optional offset). + * + * @param value { BigInt } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeBigInt64LE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigInt64LE"); + return this._writeNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset2); + } + /** + * Inserts a Int64LE value at the given offset value. + * + * @param value { BigInt } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertBigInt64LE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigInt64LE"); + return this._insertNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset2); + } + // Unsigned Integers + /** + * Reads an UInt8 value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readUInt8(offset2) { + return this._readNumberValue(Buffer.prototype.readUInt8, 1, offset2); + } + /** + * Reads an UInt16BE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readUInt16BE(offset2) { + return this._readNumberValue(Buffer.prototype.readUInt16BE, 2, offset2); + } + /** + * Reads an UInt16LE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readUInt16LE(offset2) { + return this._readNumberValue(Buffer.prototype.readUInt16LE, 2, offset2); + } + /** + * Reads an UInt32BE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readUInt32BE(offset2) { + return this._readNumberValue(Buffer.prototype.readUInt32BE, 4, offset2); + } + /** + * Reads an UInt32LE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readUInt32LE(offset2) { + return this._readNumberValue(Buffer.prototype.readUInt32LE, 4, offset2); + } + /** + * Reads a BigUInt64BE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { BigInt } + */ + readBigUInt64BE(offset2) { + utils_1.bigIntAndBufferInt64Check("readBigUInt64BE"); + return this._readNumberValue(Buffer.prototype.readBigUInt64BE, 8, offset2); + } + /** + * Reads a BigUInt64LE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { BigInt } + */ + readBigUInt64LE(offset2) { + utils_1.bigIntAndBufferInt64Check("readBigUInt64LE"); + return this._readNumberValue(Buffer.prototype.readBigUInt64LE, 8, offset2); + } + /** + * Writes an UInt8 value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeUInt8(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeUInt8, 1, value, offset2); + } + /** + * Inserts an UInt8 value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertUInt8(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeUInt8, 1, value, offset2); + } + /** + * Writes an UInt16BE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeUInt16BE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset2); + } + /** + * Inserts an UInt16BE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertUInt16BE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset2); + } + /** + * Writes an UInt16LE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeUInt16LE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset2); + } + /** + * Inserts an UInt16LE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertUInt16LE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset2); + } + /** + * Writes an UInt32BE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeUInt32BE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset2); + } + /** + * Inserts an UInt32BE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertUInt32BE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset2); + } + /** + * Writes an UInt32LE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeUInt32LE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset2); + } + /** + * Inserts an UInt32LE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertUInt32LE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset2); + } + /** + * Writes a BigUInt64BE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeBigUInt64BE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigUInt64BE"); + return this._writeNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset2); + } + /** + * Inserts a BigUInt64BE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertBigUInt64BE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigUInt64BE"); + return this._insertNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset2); + } + /** + * Writes a BigUInt64LE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeBigUInt64LE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigUInt64LE"); + return this._writeNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset2); + } + /** + * Inserts a BigUInt64LE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertBigUInt64LE(value, offset2) { + utils_1.bigIntAndBufferInt64Check("writeBigUInt64LE"); + return this._insertNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset2); + } + // Floating Point + /** + * Reads an FloatBE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readFloatBE(offset2) { + return this._readNumberValue(Buffer.prototype.readFloatBE, 4, offset2); + } + /** + * Reads an FloatLE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readFloatLE(offset2) { + return this._readNumberValue(Buffer.prototype.readFloatLE, 4, offset2); + } + /** + * Writes a FloatBE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeFloatBE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset2); + } + /** + * Inserts a FloatBE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertFloatBE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset2); + } + /** + * Writes a FloatLE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeFloatLE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset2); + } + /** + * Inserts a FloatLE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertFloatLE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset2); + } + // Double Floating Point + /** + * Reads an DoublEBE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readDoubleBE(offset2) { + return this._readNumberValue(Buffer.prototype.readDoubleBE, 8, offset2); + } + /** + * Reads an DoubleLE value from the current read position or an optionally provided offset. + * + * @param offset { Number } The offset to read data from (optional) + * @return { Number } + */ + readDoubleLE(offset2) { + return this._readNumberValue(Buffer.prototype.readDoubleLE, 8, offset2); + } + /** + * Writes a DoubleBE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeDoubleBE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset2); + } + /** + * Inserts a DoubleBE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertDoubleBE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset2); + } + /** + * Writes a DoubleLE value to the current write position (or at optional offset). + * + * @param value { Number } The value to write. + * @param offset { Number } The offset to write the value at. + * + * @return this + */ + writeDoubleLE(value, offset2) { + return this._writeNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset2); + } + /** + * Inserts a DoubleLE value at the given offset value. + * + * @param value { Number } The value to insert. + * @param offset { Number } The offset to insert the value at. + * + * @return this + */ + insertDoubleLE(value, offset2) { + return this._insertNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset2); + } + // Strings + /** + * Reads a String from the current read position. + * + * @param arg1 { Number | String } The number of bytes to read as a String, or the BufferEncoding to use for + * the string (Defaults to instance level encoding). + * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding). + * + * @return { String } + */ + readString(arg1, encoding2) { + let lengthVal; + if (typeof arg1 === "number") { + utils_1.checkLengthValue(arg1); + lengthVal = Math.min(arg1, this.length - this._readOffset); + } else { + encoding2 = arg1; + lengthVal = this.length - this._readOffset; + } + if (typeof encoding2 !== "undefined") { + utils_1.checkEncoding(encoding2); + } + const value = this._buff.slice(this._readOffset, this._readOffset + lengthVal).toString(encoding2 || this._encoding); + this._readOffset += lengthVal; + return value; + } + /** + * Inserts a String + * + * @param value { String } The String value to insert. + * @param offset { Number } The offset to insert the string at. + * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). + * + * @return this + */ + insertString(value, offset2, encoding2) { + utils_1.checkOffsetValue(offset2); + return this._handleString(value, true, offset2, encoding2); + } + /** + * Writes a String + * + * @param value { String } The String value to write. + * @param arg2 { Number | String } The offset to write the string at, or the BufferEncoding to use. + * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). + * + * @return this + */ + writeString(value, arg2, encoding2) { + return this._handleString(value, false, arg2, encoding2); + } + /** + * Reads a null-terminated String from the current read position. + * + * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding). + * + * @return { String } + */ + readStringNT(encoding2) { + if (typeof encoding2 !== "undefined") { + utils_1.checkEncoding(encoding2); + } + let nullPos = this.length; + for (let i = this._readOffset; i < this.length; i++) { + if (this._buff[i] === 0) { + nullPos = i; + break; + } + } + const value = this._buff.slice(this._readOffset, nullPos); + this._readOffset = nullPos + 1; + return value.toString(encoding2 || this._encoding); + } + /** + * Inserts a null-terminated String. + * + * @param value { String } The String value to write. + * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use. + * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). + * + * @return this + */ + insertStringNT(value, offset2, encoding2) { + utils_1.checkOffsetValue(offset2); + this.insertString(value, offset2, encoding2); + this.insertUInt8(0, offset2 + value.length); + return this; + } + /** + * Writes a null-terminated String. + * + * @param value { String } The String value to write. + * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use. + * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). + * + * @return this + */ + writeStringNT(value, arg2, encoding2) { + this.writeString(value, arg2, encoding2); + this.writeUInt8(0, typeof arg2 === "number" ? arg2 + value.length : this.writeOffset); + return this; + } + // Buffers + /** + * Reads a Buffer from the internal read position. + * + * @param length { Number } The length of data to read as a Buffer. + * + * @return { Buffer } + */ + readBuffer(length) { + if (typeof length !== "undefined") { + utils_1.checkLengthValue(length); + } + const lengthVal = typeof length === "number" ? length : this.length; + const endPoint = Math.min(this.length, this._readOffset + lengthVal); + const value = this._buff.slice(this._readOffset, endPoint); + this._readOffset = endPoint; + return value; + } + /** + * Writes a Buffer to the current write position. + * + * @param value { Buffer } The Buffer to write. + * @param offset { Number } The offset to write the Buffer to. + * + * @return this + */ + insertBuffer(value, offset2) { + utils_1.checkOffsetValue(offset2); + return this._handleBuffer(value, true, offset2); + } + /** + * Writes a Buffer to the current write position. + * + * @param value { Buffer } The Buffer to write. + * @param offset { Number } The offset to write the Buffer to. + * + * @return this + */ + writeBuffer(value, offset2) { + return this._handleBuffer(value, false, offset2); + } + /** + * Reads a null-terminated Buffer from the current read poisiton. + * + * @return { Buffer } + */ + readBufferNT() { + let nullPos = this.length; + for (let i = this._readOffset; i < this.length; i++) { + if (this._buff[i] === 0) { + nullPos = i; + break; + } + } + const value = this._buff.slice(this._readOffset, nullPos); + this._readOffset = nullPos + 1; + return value; + } + /** + * Inserts a null-terminated Buffer. + * + * @param value { Buffer } The Buffer to write. + * @param offset { Number } The offset to write the Buffer to. + * + * @return this + */ + insertBufferNT(value, offset2) { + utils_1.checkOffsetValue(offset2); + this.insertBuffer(value, offset2); + this.insertUInt8(0, offset2 + value.length); + return this; + } + /** + * Writes a null-terminated Buffer. + * + * @param value { Buffer } The Buffer to write. + * @param offset { Number } The offset to write the Buffer to. + * + * @return this + */ + writeBufferNT(value, offset2) { + if (typeof offset2 !== "undefined") { + utils_1.checkOffsetValue(offset2); + } + this.writeBuffer(value, offset2); + this.writeUInt8(0, typeof offset2 === "number" ? offset2 + value.length : this._writeOffset); + return this; + } + /** + * Clears the SmartBuffer instance to its original empty state. + */ + clear() { + this._writeOffset = 0; + this._readOffset = 0; + this.length = 0; + return this; + } + /** + * Gets the remaining data left to be read from the SmartBuffer instance. + * + * @return { Number } + */ + remaining() { + return this.length - this._readOffset; + } + /** + * Gets the current read offset value of the SmartBuffer instance. + * + * @return { Number } + */ + get readOffset() { + return this._readOffset; + } + /** + * Sets the read offset value of the SmartBuffer instance. + * + * @param offset { Number } - The offset value to set. + */ + set readOffset(offset2) { + utils_1.checkOffsetValue(offset2); + utils_1.checkTargetOffset(offset2, this); + this._readOffset = offset2; + } + /** + * Gets the current write offset value of the SmartBuffer instance. + * + * @return { Number } + */ + get writeOffset() { + return this._writeOffset; + } + /** + * Sets the write offset value of the SmartBuffer instance. + * + * @param offset { Number } - The offset value to set. + */ + set writeOffset(offset2) { + utils_1.checkOffsetValue(offset2); + utils_1.checkTargetOffset(offset2, this); + this._writeOffset = offset2; + } + /** + * Gets the currently set string encoding of the SmartBuffer instance. + * + * @return { BufferEncoding } The string Buffer encoding currently set. + */ + get encoding() { + return this._encoding; + } + /** + * Sets the string encoding of the SmartBuffer instance. + * + * @param encoding { BufferEncoding } The string Buffer encoding to set. + */ + set encoding(encoding2) { + utils_1.checkEncoding(encoding2); + this._encoding = encoding2; + } + /** + * Gets the underlying internal Buffer. (This includes unmanaged data in the Buffer) + * + * @return { Buffer } The Buffer value. + */ + get internalBuffer() { + return this._buff; + } + /** + * Gets the value of the internal managed Buffer (Includes managed data only) + * + * @param { Buffer } + */ + toBuffer() { + return this._buff.slice(0, this.length); + } + /** + * Gets the String value of the internal managed Buffer + * + * @param encoding { String } The BufferEncoding to display the Buffer as (defaults to instance level encoding). + */ + toString(encoding2) { + const encodingVal = typeof encoding2 === "string" ? encoding2 : this._encoding; + utils_1.checkEncoding(encodingVal); + return this._buff.toString(encodingVal, 0, this.length); + } + /** + * Destroys the SmartBuffer instance. + */ + destroy() { + this.clear(); + return this; + } + /** + * Handles inserting and writing strings. + * + * @param value { String } The String value to insert. + * @param isInsert { Boolean } True if inserting a string, false if writing. + * @param arg2 { Number | String } The offset to insert the string at, or the BufferEncoding to use. + * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding). + */ + _handleString(value, isInsert, arg3, encoding2) { + let offsetVal = this._writeOffset; + let encodingVal = this._encoding; + if (typeof arg3 === "number") { + offsetVal = arg3; + } else if (typeof arg3 === "string") { + utils_1.checkEncoding(arg3); + encodingVal = arg3; + } + if (typeof encoding2 === "string") { + utils_1.checkEncoding(encoding2); + encodingVal = encoding2; + } + const byteLength = Buffer.byteLength(value, encodingVal); + if (isInsert) { + this.ensureInsertable(byteLength, offsetVal); + } else { + this._ensureWriteable(byteLength, offsetVal); + } + this._buff.write(value, offsetVal, byteLength, encodingVal); + if (isInsert) { + this._writeOffset += byteLength; + } else { + if (typeof arg3 === "number") { + this._writeOffset = Math.max(this._writeOffset, offsetVal + byteLength); + } else { + this._writeOffset += byteLength; + } + } + return this; + } + /** + * Handles writing or insert of a Buffer. + * + * @param value { Buffer } The Buffer to write. + * @param offset { Number } The offset to write the Buffer to. + */ + _handleBuffer(value, isInsert, offset2) { + const offsetVal = typeof offset2 === "number" ? offset2 : this._writeOffset; + if (isInsert) { + this.ensureInsertable(value.length, offsetVal); + } else { + this._ensureWriteable(value.length, offsetVal); + } + value.copy(this._buff, offsetVal); + if (isInsert) { + this._writeOffset += value.length; + } else { + if (typeof offset2 === "number") { + this._writeOffset = Math.max(this._writeOffset, offsetVal + value.length); + } else { + this._writeOffset += value.length; + } + } + return this; + } + /** + * Ensures that the internal Buffer is large enough to read data. + * + * @param length { Number } The length of the data that needs to be read. + * @param offset { Number } The offset of the data that needs to be read. + */ + ensureReadable(length, offset2) { + let offsetVal = this._readOffset; + if (typeof offset2 !== "undefined") { + utils_1.checkOffsetValue(offset2); + offsetVal = offset2; + } + if (offsetVal < 0 || offsetVal + length > this.length) { + throw new Error(utils_1.ERRORS.INVALID_READ_BEYOND_BOUNDS); + } + } + /** + * Ensures that the internal Buffer is large enough to insert data. + * + * @param dataLength { Number } The length of the data that needs to be written. + * @param offset { Number } The offset of the data to be written. + */ + ensureInsertable(dataLength, offset2) { + utils_1.checkOffsetValue(offset2); + this._ensureCapacity(this.length + dataLength); + if (offset2 < this.length) { + this._buff.copy(this._buff, offset2 + dataLength, offset2, this._buff.length); + } + if (offset2 + dataLength > this.length) { + this.length = offset2 + dataLength; + } else { + this.length += dataLength; + } + } + /** + * Ensures that the internal Buffer is large enough to write data. + * + * @param dataLength { Number } The length of the data that needs to be written. + * @param offset { Number } The offset of the data to be written (defaults to writeOffset). + */ + _ensureWriteable(dataLength, offset2) { + const offsetVal = typeof offset2 === "number" ? offset2 : this._writeOffset; + this._ensureCapacity(offsetVal + dataLength); + if (offsetVal + dataLength > this.length) { + this.length = offsetVal + dataLength; + } + } + /** + * Ensures that the internal Buffer is large enough to write at least the given amount of data. + * + * @param minLength { Number } The minimum length of the data needs to be written. + */ + _ensureCapacity(minLength) { + const oldLength = this._buff.length; + if (minLength > oldLength) { + let data2 = this._buff; + let newLength = oldLength * 3 / 2 + 1; + if (newLength < minLength) { + newLength = minLength; + } + this._buff = Buffer.allocUnsafe(newLength); + data2.copy(this._buff, 0, 0, oldLength); + } + } + /** + * Reads a numeric number value using the provided function. + * + * @typeparam T { number | bigint } The type of the value to be read + * + * @param func { Function(offset: number) => number } The function to read data on the internal Buffer with. + * @param byteSize { Number } The number of bytes read. + * @param offset { Number } The offset to read from (optional). When this is not provided, the managed readOffset is used instead. + * + * @returns { T } the number value + */ + _readNumberValue(func, byteSize, offset2) { + this.ensureReadable(byteSize, offset2); + const value = func.call(this._buff, typeof offset2 === "number" ? offset2 : this._readOffset); + if (typeof offset2 === "undefined") { + this._readOffset += byteSize; + } + return value; + } + /** + * Inserts a numeric number value based on the given offset and value. + * + * @typeparam T { number | bigint } The type of the value to be written + * + * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with. + * @param byteSize { Number } The number of bytes written. + * @param value { T } The number value to write. + * @param offset { Number } the offset to write the number at (REQUIRED). + * + * @returns SmartBuffer this buffer + */ + _insertNumberValue(func, byteSize, value, offset2) { + utils_1.checkOffsetValue(offset2); + this.ensureInsertable(byteSize, offset2); + func.call(this._buff, value, offset2); + this._writeOffset += byteSize; + return this; + } + /** + * Writes a numeric number value based on the given offset and value. + * + * @typeparam T { number | bigint } The type of the value to be written + * + * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with. + * @param byteSize { Number } The number of bytes written. + * @param value { T } The number value to write. + * @param offset { Number } the offset to write the number at (REQUIRED). + * + * @returns SmartBuffer this buffer + */ + _writeNumberValue(func, byteSize, value, offset2) { + if (typeof offset2 === "number") { + if (offset2 < 0) { + throw new Error(utils_1.ERRORS.INVALID_WRITE_BEYOND_BOUNDS); + } + utils_1.checkOffsetValue(offset2); + } + const offsetVal = typeof offset2 === "number" ? offset2 : this._writeOffset; + this._ensureWriteable(byteSize, offsetVal); + func.call(this._buff, value, offsetVal); + if (typeof offset2 === "number") { + this._writeOffset = Math.max(this._writeOffset, offsetVal + byteSize); + } else { + this._writeOffset += byteSize; + } + return this; + } + } + smartbuffer.SmartBuffer = SmartBuffer; + return smartbuffer; +} +var constants$2 = {}; +var hasRequiredConstants$2; +function requireConstants$2() { + if (hasRequiredConstants$2) return constants$2; + hasRequiredConstants$2 = 1; + Object.defineProperty(constants$2, "__esModule", { value: true }); + constants$2.SOCKS5_NO_ACCEPTABLE_AUTH = constants$2.SOCKS5_CUSTOM_AUTH_END = constants$2.SOCKS5_CUSTOM_AUTH_START = constants$2.SOCKS_INCOMING_PACKET_SIZES = constants$2.SocksClientState = constants$2.Socks5Response = constants$2.Socks5HostType = constants$2.Socks5Auth = constants$2.Socks4Response = constants$2.SocksCommand = constants$2.ERRORS = constants$2.DEFAULT_TIMEOUT = void 0; + const DEFAULT_TIMEOUT = 3e4; + constants$2.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT; + const ERRORS = { + InvalidSocksCommand: "An invalid SOCKS command was provided. Valid options are connect, bind, and associate.", + InvalidSocksCommandForOperation: "An invalid SOCKS command was provided. Only a subset of commands are supported for this operation.", + InvalidSocksCommandChain: "An invalid SOCKS command was provided. Chaining currently only supports the connect command.", + InvalidSocksClientOptionsDestination: "An invalid destination host was provided.", + InvalidSocksClientOptionsExistingSocket: "An invalid existing socket was provided. This should be an instance of stream.Duplex.", + InvalidSocksClientOptionsProxy: "Invalid SOCKS proxy details were provided.", + InvalidSocksClientOptionsTimeout: "An invalid timeout value was provided. Please enter a value above 0 (in ms).", + InvalidSocksClientOptionsProxiesLength: "At least two socks proxies must be provided for chaining.", + InvalidSocksClientOptionsCustomAuthRange: "Custom auth must be a value between 0x80 and 0xFE.", + InvalidSocksClientOptionsCustomAuthOptions: "When a custom_auth_method is provided, custom_auth_request_handler, custom_auth_response_size, and custom_auth_response_handler must also be provided and valid.", + NegotiationError: "Negotiation error", + SocketClosed: "Socket closed", + ProxyConnectionTimedOut: "Proxy connection timed out", + InternalError: "SocksClient internal error (this should not happen)", + InvalidSocks4HandshakeResponse: "Received invalid Socks4 handshake response", + Socks4ProxyRejectedConnection: "Socks4 Proxy rejected connection", + InvalidSocks4IncomingConnectionResponse: "Socks4 invalid incoming connection response", + Socks4ProxyRejectedIncomingBoundConnection: "Socks4 Proxy rejected incoming bound connection", + InvalidSocks5InitialHandshakeResponse: "Received invalid Socks5 initial handshake response", + InvalidSocks5IntiailHandshakeSocksVersion: "Received invalid Socks5 initial handshake (invalid socks version)", + InvalidSocks5InitialHandshakeNoAcceptedAuthType: "Received invalid Socks5 initial handshake (no accepted authentication type)", + InvalidSocks5InitialHandshakeUnknownAuthType: "Received invalid Socks5 initial handshake (unknown authentication type)", + Socks5AuthenticationFailed: "Socks5 Authentication failed", + InvalidSocks5FinalHandshake: "Received invalid Socks5 final handshake response", + InvalidSocks5FinalHandshakeRejected: "Socks5 proxy rejected connection", + InvalidSocks5IncomingConnectionResponse: "Received invalid Socks5 incoming connection response", + Socks5ProxyRejectedIncomingBoundConnection: "Socks5 Proxy rejected incoming bound connection" + }; + constants$2.ERRORS = ERRORS; + const SOCKS_INCOMING_PACKET_SIZES = { + Socks5InitialHandshakeResponse: 2, + Socks5UserPassAuthenticationResponse: 2, + // Command response + incoming connection (bind) + Socks5ResponseHeader: 5, + // We need at least 5 to read the hostname length, then we wait for the address+port information. + Socks5ResponseIPv4: 10, + // 4 header + 4 ip + 2 port + Socks5ResponseIPv6: 22, + // 4 header + 16 ip + 2 port + Socks5ResponseHostname: (hostNameLength) => hostNameLength + 7, + // 4 header + 1 host length + host + 2 port + // Command response + incoming connection (bind) + Socks4Response: 8 + // 2 header + 2 port + 4 ip + }; + constants$2.SOCKS_INCOMING_PACKET_SIZES = SOCKS_INCOMING_PACKET_SIZES; + var SocksCommand; + (function(SocksCommand2) { + SocksCommand2[SocksCommand2["connect"] = 1] = "connect"; + SocksCommand2[SocksCommand2["bind"] = 2] = "bind"; + SocksCommand2[SocksCommand2["associate"] = 3] = "associate"; + })(SocksCommand || (constants$2.SocksCommand = SocksCommand = {})); + var Socks4Response; + (function(Socks4Response2) { + Socks4Response2[Socks4Response2["Granted"] = 90] = "Granted"; + Socks4Response2[Socks4Response2["Failed"] = 91] = "Failed"; + Socks4Response2[Socks4Response2["Rejected"] = 92] = "Rejected"; + Socks4Response2[Socks4Response2["RejectedIdent"] = 93] = "RejectedIdent"; + })(Socks4Response || (constants$2.Socks4Response = Socks4Response = {})); + var Socks5Auth; + (function(Socks5Auth2) { + Socks5Auth2[Socks5Auth2["NoAuth"] = 0] = "NoAuth"; + Socks5Auth2[Socks5Auth2["GSSApi"] = 1] = "GSSApi"; + Socks5Auth2[Socks5Auth2["UserPass"] = 2] = "UserPass"; + })(Socks5Auth || (constants$2.Socks5Auth = Socks5Auth = {})); + const SOCKS5_CUSTOM_AUTH_START = 128; + constants$2.SOCKS5_CUSTOM_AUTH_START = SOCKS5_CUSTOM_AUTH_START; + const SOCKS5_CUSTOM_AUTH_END = 254; + constants$2.SOCKS5_CUSTOM_AUTH_END = SOCKS5_CUSTOM_AUTH_END; + const SOCKS5_NO_ACCEPTABLE_AUTH = 255; + constants$2.SOCKS5_NO_ACCEPTABLE_AUTH = SOCKS5_NO_ACCEPTABLE_AUTH; + var Socks5Response; + (function(Socks5Response2) { + Socks5Response2[Socks5Response2["Granted"] = 0] = "Granted"; + Socks5Response2[Socks5Response2["Failure"] = 1] = "Failure"; + Socks5Response2[Socks5Response2["NotAllowed"] = 2] = "NotAllowed"; + Socks5Response2[Socks5Response2["NetworkUnreachable"] = 3] = "NetworkUnreachable"; + Socks5Response2[Socks5Response2["HostUnreachable"] = 4] = "HostUnreachable"; + Socks5Response2[Socks5Response2["ConnectionRefused"] = 5] = "ConnectionRefused"; + Socks5Response2[Socks5Response2["TTLExpired"] = 6] = "TTLExpired"; + Socks5Response2[Socks5Response2["CommandNotSupported"] = 7] = "CommandNotSupported"; + Socks5Response2[Socks5Response2["AddressNotSupported"] = 8] = "AddressNotSupported"; + })(Socks5Response || (constants$2.Socks5Response = Socks5Response = {})); + var Socks5HostType; + (function(Socks5HostType2) { + Socks5HostType2[Socks5HostType2["IPv4"] = 1] = "IPv4"; + Socks5HostType2[Socks5HostType2["Hostname"] = 3] = "Hostname"; + Socks5HostType2[Socks5HostType2["IPv6"] = 4] = "IPv6"; + })(Socks5HostType || (constants$2.Socks5HostType = Socks5HostType = {})); + var SocksClientState; + (function(SocksClientState2) { + SocksClientState2[SocksClientState2["Created"] = 0] = "Created"; + SocksClientState2[SocksClientState2["Connecting"] = 1] = "Connecting"; + SocksClientState2[SocksClientState2["Connected"] = 2] = "Connected"; + SocksClientState2[SocksClientState2["SentInitialHandshake"] = 3] = "SentInitialHandshake"; + SocksClientState2[SocksClientState2["ReceivedInitialHandshakeResponse"] = 4] = "ReceivedInitialHandshakeResponse"; + SocksClientState2[SocksClientState2["SentAuthentication"] = 5] = "SentAuthentication"; + SocksClientState2[SocksClientState2["ReceivedAuthenticationResponse"] = 6] = "ReceivedAuthenticationResponse"; + SocksClientState2[SocksClientState2["SentFinalHandshake"] = 7] = "SentFinalHandshake"; + SocksClientState2[SocksClientState2["ReceivedFinalResponse"] = 8] = "ReceivedFinalResponse"; + SocksClientState2[SocksClientState2["BoundWaitingForConnection"] = 9] = "BoundWaitingForConnection"; + SocksClientState2[SocksClientState2["Established"] = 10] = "Established"; + SocksClientState2[SocksClientState2["Disconnected"] = 11] = "Disconnected"; + SocksClientState2[SocksClientState2["Error"] = 99] = "Error"; + })(SocksClientState || (constants$2.SocksClientState = SocksClientState = {})); + return constants$2; +} +var helpers$1 = {}; +var util = {}; +var hasRequiredUtil; +function requireUtil() { + if (hasRequiredUtil) return util; + hasRequiredUtil = 1; + Object.defineProperty(util, "__esModule", { value: true }); + util.shuffleArray = util.SocksClientError = void 0; + class SocksClientError extends Error { + constructor(message, options2) { + super(message); + this.options = options2; + } + } + util.SocksClientError = SocksClientError; + function shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + } + util.shuffleArray = shuffleArray; + return util; +} +var ipAddress = {}; +var ipv4 = {}; +var common = {}; +var hasRequiredCommon; +function requireCommon() { + if (hasRequiredCommon) return common; + hasRequiredCommon = 1; + Object.defineProperty(common, "__esModule", { value: true }); + common.isCorrect = common.isInSubnet = void 0; + function isInSubnet(address) { + if (this.subnetMask < address.subnetMask) { + return false; + } + if (this.mask(address.subnetMask) === address.mask()) { + return true; + } + return false; + } + common.isInSubnet = isInSubnet; + function isCorrect(defaultBits) { + return function() { + if (this.addressMinusSuffix !== this.correctForm()) { + return false; + } + if (this.subnetMask === defaultBits && !this.parsedSubnet) { + return true; + } + return this.parsedSubnet === String(this.subnetMask); + }; + } + common.isCorrect = isCorrect; + return common; +} +var constants$1 = {}; +var hasRequiredConstants$1; +function requireConstants$1() { + if (hasRequiredConstants$1) return constants$1; + hasRequiredConstants$1 = 1; + Object.defineProperty(constants$1, "__esModule", { value: true }); + constants$1.RE_SUBNET_STRING = constants$1.RE_ADDRESS = constants$1.GROUPS = constants$1.BITS = void 0; + constants$1.BITS = 32; + constants$1.GROUPS = 4; + constants$1.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g; + constants$1.RE_SUBNET_STRING = /\/\d{1,2}$/; + return constants$1; +} +var addressError = {}; +var hasRequiredAddressError; +function requireAddressError() { + if (hasRequiredAddressError) return addressError; + hasRequiredAddressError = 1; + Object.defineProperty(addressError, "__esModule", { value: true }); + addressError.AddressError = void 0; + class AddressError extends Error { + constructor(message, parseMessage) { + super(message); + this.name = "AddressError"; + if (parseMessage !== null) { + this.parseMessage = parseMessage; + } + } + } + addressError.AddressError = AddressError; + return addressError; +} +var jsbn$1 = { exports: {} }; +var jsbn = jsbn$1.exports; +var hasRequiredJsbn; +function requireJsbn() { + if (hasRequiredJsbn) return jsbn$1.exports; + hasRequiredJsbn = 1; + (function(module, exports) { + (function() { + var dbits; + var canary = 244837814094590; + var j_lm = (canary & 16777215) == 15715070; + function BigInteger(a, b, c) { + if (a != null) + if ("number" == typeof a) this.fromNumber(a, b, c); + else if (b == null && "string" != typeof a) this.fromString(a, 256); + else this.fromString(a, b); + } + function nbi() { + return new BigInteger(null); + } + function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this[i++] + w[j] + c; + c = Math.floor(v / 67108864); + w[j++] = v & 67108863; + } + return c; + } + function am2(i, x, w, j, c, n) { + var xl = x & 32767, xh = x >> 15; + while (--n >= 0) { + var l = this[i] & 32767; + var h = this[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 32767) << 15) + w[j] + (c & 1073741823); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w[j++] = l & 1073741823; + } + return c; + } + function am3(i, x, w, j, c, n) { + var xl = x & 16383, xh = x >> 14; + while (--n >= 0) { + var l = this[i] & 16383; + var h = this[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 16383) << 14) + w[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w[j++] = l & 268435455; + } + return c; + } + var inBrowser = typeof navigator !== "undefined"; + if (inBrowser && j_lm && navigator.appName == "Microsoft Internet Explorer") { + BigInteger.prototype.am = am2; + dbits = 30; + } else if (inBrowser && j_lm && navigator.appName != "Netscape") { + BigInteger.prototype.am = am1; + dbits = 26; + } else { + BigInteger.prototype.am = am3; + dbits = 28; + } + BigInteger.prototype.DB = dbits; + BigInteger.prototype.DM = (1 << dbits) - 1; + BigInteger.prototype.DV = 1 << dbits; + var BI_FP = 52; + BigInteger.prototype.FV = Math.pow(2, BI_FP); + BigInteger.prototype.F1 = BI_FP - dbits; + BigInteger.prototype.F2 = 2 * dbits - BI_FP; + var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; + var BI_RC = new Array(); + var rr, vv; + rr = "0".charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv; + rr = "a".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + rr = "A".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv; + function int2char(n) { + return BI_RM.charAt(n); + } + function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return c == null ? -1 : c; + } + function bnpCopyTo(r) { + for (var i = this.t - 1; i >= 0; --i) r[i] = this[i]; + r.t = this.t; + r.s = this.s; + } + function bnpFromInt(x) { + this.t = 1; + this.s = x < 0 ? -1 : 0; + if (x > 0) this[0] = x; + else if (x < -1) this[0] = x + this.DV; + else this.t = 0; + } + function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; + } + function bnpFromString(s, b) { + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 256) k = 8; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length, mi = false, sh = 0; + while (--i >= 0) { + var x = k == 8 ? s[i] & 255 : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-") mi = true; + continue; + } + mi = false; + if (sh == 0) + this[this.t++] = x; + else if (sh + k > this.DB) { + this[this.t - 1] |= (x & (1 << this.DB - sh) - 1) << sh; + this[this.t++] = x >> this.DB - sh; + } else + this[this.t - 1] |= x << sh; + sh += k; + if (sh >= this.DB) sh -= this.DB; + } + if (k == 8 && (s[0] & 128) != 0) { + this.s = -1; + if (sh > 0) this[this.t - 1] |= (1 << this.DB - sh) - 1 << sh; + } + this.clamp(); + if (mi) BigInteger.ZERO.subTo(this, this); + } + function bnpClamp() { + var c = this.s & this.DM; + while (this.t > 0 && this[this.t - 1] == c) --this.t; + } + function bnToString(b) { + if (this.s < 0) return "-" + this.negate().toString(b); + var k; + if (b == 16) k = 4; + else if (b == 8) k = 3; + else if (b == 2) k = 1; + else if (b == 32) k = 5; + else if (b == 4) k = 2; + else return this.toRadix(b); + var km = (1 << k) - 1, d, m = false, r = "", i = this.t; + var p = this.DB - i * this.DB % k; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this[i] & (1 << p) - 1) << k - p; + d |= this[--i] >> (p += this.DB - k); + } else { + d = this[i] >> (p -= k) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) m = true; + if (m) r += int2char(d); + } + } + return m ? r : "0"; + } + function bnNegate() { + var r = nbi(); + BigInteger.ZERO.subTo(this, r); + return r; + } + function bnAbs() { + return this.s < 0 ? this.negate() : this; + } + function bnCompareTo(a) { + var r = this.s - a.s; + if (r != 0) return r; + var i = this.t; + r = i - a.t; + if (r != 0) return this.s < 0 ? -r : r; + while (--i >= 0) if ((r = this[i] - a[i]) != 0) return r; + return 0; + } + function nbits(x) { + var r = 1, t2; + if ((t2 = x >>> 16) != 0) { + x = t2; + r += 16; + } + if ((t2 = x >> 8) != 0) { + x = t2; + r += 8; + } + if ((t2 = x >> 4) != 0) { + x = t2; + r += 4; + } + if ((t2 = x >> 2) != 0) { + x = t2; + r += 2; + } + if ((t2 = x >> 1) != 0) { + x = t2; + r += 1; + } + return r; + } + function bnBitLength() { + if (this.t <= 0) return 0; + return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM); + } + function bnpDLShiftTo(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i]; + for (i = n - 1; i >= 0; --i) r[i] = 0; + r.t = this.t + n; + r.s = this.s; + } + function bnpDRShiftTo(n, r) { + for (var i = n; i < this.t; ++i) r[i - n] = this[i]; + r.t = Math.max(this.t - n, 0); + r.s = this.s; + } + function bnpLShiftTo(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB), c = this.s << bs & this.DM, i; + for (i = this.t - 1; i >= 0; --i) { + r[i + ds + 1] = this[i] >> cbs | c; + c = (this[i] & bm) << bs; + } + for (i = ds - 1; i >= 0; --i) r[i] = 0; + r[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + } + function bnpRShiftTo(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r[0] = this[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r[i - ds - 1] |= (this[i] & bm) << cbs; + r[i - ds] = this[i] >> bs; + } + if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs; + r.t = this.t - ds; + r.clamp(); + } + function bnpSubTo(a, r) { + var i = 0, c = 0, m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] - a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = c < 0 ? -1 : 0; + if (c < -1) r[i++] = this.DV + c; + else if (c > 0) r[i++] = c; + r.t = i; + r.clamp(); + } + function bnpMultiplyTo(a, r) { + var x = this.abs(), y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) r[i] = 0; + for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); + r.s = 0; + r.clamp(); + if (this.s != a.s) BigInteger.ZERO.subTo(r, r); + } + function bnpSquareTo(r) { + var x = this.abs(); + var i = r.t = 2 * x.t; + while (--i >= 0) r[i] = 0; + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x[i], r, 2 * i, 0, 1); + if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { + r[i + x.t] -= x.DV; + r[i + x.t + 1] = 1; + } + } + if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); + r.s = 0; + r.clamp(); + } + function bnpDivRemTo(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) return; + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) q.fromInt(0); + if (r != null) this.copyTo(r); + return; + } + if (r == null) r = nbi(); + var y = nbi(), ts = this.s, ms2 = m.s; + var nsh = this.DB - nbits(pm[pm.t - 1]); + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y[ys - 1]; + if (y0 == 0) return; + var yt = y0 * (1 << this.F1) + (ys > 1 ? y[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt, d2 = (1 << this.F1) / yt, e = 1 << this.F2; + var i = r.t, j = i - ys, t2 = q == null ? nbi() : q; + y.dlShiftTo(j, t2); + if (r.compareTo(t2) >= 0) { + r[r.t++] = 1; + r.subTo(t2, r); + } + BigInteger.ONE.dlShiftTo(ys, t2); + t2.subTo(y, y); + while (y.t < ys) y[y.t++] = 0; + while (--j >= 0) { + var qd = r[--i] == y0 ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + y.dlShiftTo(j, t2); + r.subTo(t2, r); + while (r[i] < --qd) r.subTo(t2, r); + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms2) BigInteger.ZERO.subTo(q, q); + } + r.t = ys; + r.clamp(); + if (nsh > 0) r.rShiftTo(nsh, r); + if (ts < 0) BigInteger.ZERO.subTo(r, r); + } + function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r); + return r; + } + function Classic(m) { + this.m = m; + } + function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); + else return x; + } + function cRevert(x) { + return x; + } + function cReduce(x) { + x.divRemTo(this.m, null, x); + } + function cMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + function cSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + Classic.prototype.convert = cConvert; + Classic.prototype.revert = cRevert; + Classic.prototype.reduce = cReduce; + Classic.prototype.mulTo = cMulTo; + Classic.prototype.sqrTo = cSqrTo; + function bnpInvDigit() { + if (this.t < 1) return 0; + var x = this[0]; + if ((x & 1) == 0) return 0; + var y = x & 3; + y = y * (2 - (x & 15) * y) & 15; + y = y * (2 - (x & 255) * y) & 255; + y = y * (2 - ((x & 65535) * y & 65535)) & 65535; + y = y * (2 - x * y % this.DV) % this.DV; + return y > 0 ? this.DV - y : -y; + } + function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 32767; + this.mph = this.mp >> 15; + this.um = (1 << m.DB - 15) - 1; + this.mt2 = 2 * m.t; + } + function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r); + return r; + } + function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + function montReduce(x) { + while (x.t <= this.mt2) + x[x.t++] = 0; + for (var i = 0; i < this.m.t; ++i) { + var j = x[i] & 32767; + var u0 = j * this.mpl + ((j * this.mph + (x[i] >> 15) * this.mpl & this.um) << 15) & x.DM; + j = i + this.m.t; + x[j] += this.m.am(0, u0, x, i, 0, this.m.t); + while (x[j] >= x.DV) { + x[j] -= x.DV; + x[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + function montSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + function montMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + Montgomery.prototype.convert = montConvert; + Montgomery.prototype.revert = montRevert; + Montgomery.prototype.reduce = montReduce; + Montgomery.prototype.mulTo = montMulTo; + Montgomery.prototype.sqrTo = montSqrTo; + function bnpIsEven() { + return (this.t > 0 ? this[0] & 1 : this.s) == 0; + } + function bnpExp(e, z2) { + if (e > 4294967295 || e < 1) return BigInteger.ONE; + var r = nbi(), r2 = nbi(), g = z2.convert(this), i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z2.sqrTo(r, r2); + if ((e & 1 << i) > 0) z2.mulTo(r2, g, r); + else { + var t2 = r; + r = r2; + r2 = t2; + } + } + return z2.revert(r); + } + function bnModPowInt(e, m) { + var z2; + if (e < 256 || m.isEven()) z2 = new Classic(m); + else z2 = new Montgomery(m); + return this.exp(e, z2); + } + BigInteger.prototype.copyTo = bnpCopyTo; + BigInteger.prototype.fromInt = bnpFromInt; + BigInteger.prototype.fromString = bnpFromString; + BigInteger.prototype.clamp = bnpClamp; + BigInteger.prototype.dlShiftTo = bnpDLShiftTo; + BigInteger.prototype.drShiftTo = bnpDRShiftTo; + BigInteger.prototype.lShiftTo = bnpLShiftTo; + BigInteger.prototype.rShiftTo = bnpRShiftTo; + BigInteger.prototype.subTo = bnpSubTo; + BigInteger.prototype.multiplyTo = bnpMultiplyTo; + BigInteger.prototype.squareTo = bnpSquareTo; + BigInteger.prototype.divRemTo = bnpDivRemTo; + BigInteger.prototype.invDigit = bnpInvDigit; + BigInteger.prototype.isEven = bnpIsEven; + BigInteger.prototype.exp = bnpExp; + BigInteger.prototype.toString = bnToString; + BigInteger.prototype.negate = bnNegate; + BigInteger.prototype.abs = bnAbs; + BigInteger.prototype.compareTo = bnCompareTo; + BigInteger.prototype.bitLength = bnBitLength; + BigInteger.prototype.mod = bnMod; + BigInteger.prototype.modPowInt = bnModPowInt; + BigInteger.ZERO = nbv(0); + BigInteger.ONE = nbv(1); + function bnClone() { + var r = nbi(); + this.copyTo(r); + return r; + } + function bnIntValue() { + if (this.s < 0) { + if (this.t == 1) return this[0] - this.DV; + else if (this.t == 0) return -1; + } else if (this.t == 1) return this[0]; + else if (this.t == 0) return 0; + return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]; + } + function bnByteValue() { + return this.t == 0 ? this.s : this[0] << 24 >> 24; + } + function bnShortValue() { + return this.t == 0 ? this.s : this[0] << 16 >> 16; + } + function bnpChunkSize(r) { + return Math.floor(Math.LN2 * this.DB / Math.log(r)); + } + function bnSigNum() { + if (this.s < 0) return -1; + else if (this.t <= 0 || this.t == 1 && this[0] <= 0) return 0; + else return 1; + } + function bnpToRadix(b) { + if (b == null) b = 10; + if (this.signum() == 0 || b < 2 || b > 36) return "0"; + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a), y = nbi(), z2 = nbi(), r = ""; + this.divRemTo(d, y, z2); + while (y.signum() > 0) { + r = (a + z2.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z2); + } + return z2.intValue().toString(b) + r; + } + function bnpFromRadix(s, b) { + this.fromInt(0); + if (b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b, cs), mi = false, j = 0, w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-" && this.signum() == 0) mi = true; + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) BigInteger.ZERO.subTo(this, this); + } + function bnpFromNumber(a, b, c) { + if ("number" == typeof b) { + if (a < 2) this.fromInt(1); + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + if (this.isEven()) this.dAddOffset(1, 0); + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); + } + } + } else { + var x = new Array(), t2 = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t2 > 0) x[0] &= (1 << t2) - 1; + else x[0] = 0; + this.fromString(x, 256); + } + } + function bnToByteArray() { + var i = this.t, r = new Array(); + r[0] = this.s; + var p = this.DB - i * this.DB % 8, d, k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) + r[k++] = d | this.s << this.DB - p; + while (i >= 0) { + if (p < 8) { + d = (this[i] & (1 << p) - 1) << 8 - p; + d |= this[--i] >> (p += this.DB - 8); + } else { + d = this[i] >> (p -= 8) & 255; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 128) != 0) d |= -256; + if (k == 0 && (this.s & 128) != (d & 128)) ++k; + if (k > 0 || d != this.s) r[k++] = d; + } + } + return r; + } + function bnEquals(a) { + return this.compareTo(a) == 0; + } + function bnMin(a) { + return this.compareTo(a) < 0 ? this : a; + } + function bnMax(a) { + return this.compareTo(a) > 0 ? this : a; + } + function bnpBitwiseTo(a, op, r) { + var i, f, m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]); + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) r[i] = op(this[i], f); + r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) r[i] = op(f, a[i]); + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + } + function op_and(x, y) { + return x & y; + } + function bnAnd(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + } + function op_or(x, y) { + return x | y; + } + function bnOr(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + } + function op_xor(x, y) { + return x ^ y; + } + function bnXor(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + } + function op_andnot(x, y) { + return x & ~y; + } + function bnAndNot(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + } + function bnNot() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i]; + r.t = this.t; + r.s = ~this.s; + return r; + } + function bnShiftLeft(n) { + var r = nbi(); + if (n < 0) this.rShiftTo(-n, r); + else this.lShiftTo(n, r); + return r; + } + function bnShiftRight(n) { + var r = nbi(); + if (n < 0) this.lShiftTo(-n, r); + else this.rShiftTo(n, r); + return r; + } + function lbit(x) { + if (x == 0) return -1; + var r = 0; + if ((x & 65535) == 0) { + x >>= 16; + r += 16; + } + if ((x & 255) == 0) { + x >>= 8; + r += 8; + } + if ((x & 15) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) ++r; + return r; + } + function bnGetLowestSetBit() { + for (var i = 0; i < this.t; ++i) + if (this[i] != 0) return i * this.DB + lbit(this[i]); + if (this.s < 0) return this.t * this.DB; + return -1; + } + function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + function bnBitCount() { + var r = 0, x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x); + return r; + } + function bnTestBit(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) return this.s != 0; + return (this[j] & 1 << n % this.DB) != 0; + } + function bnpChangeBit(n, op) { + var r = BigInteger.ONE.shiftLeft(n); + this.bitwiseTo(r, op, r); + return r; + } + function bnSetBit(n) { + return this.changeBit(n, op_or); + } + function bnClearBit(n) { + return this.changeBit(n, op_andnot); + } + function bnFlipBit(n) { + return this.changeBit(n, op_xor); + } + function bnpAddTo(a, r) { + var i = 0, c = 0, m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] + a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = c < 0 ? -1 : 0; + if (c > 0) r[i++] = c; + else if (c < -1) r[i++] = this.DV + c; + r.t = i; + r.clamp(); + } + function bnAdd(a) { + var r = nbi(); + this.addTo(a, r); + return r; + } + function bnSubtract(a) { + var r = nbi(); + this.subTo(a, r); + return r; + } + function bnMultiply(a) { + var r = nbi(); + this.multiplyTo(a, r); + return r; + } + function bnSquare() { + var r = nbi(); + this.squareTo(r); + return r; + } + function bnDivide(a) { + var r = nbi(); + this.divRemTo(a, r, null); + return r; + } + function bnRemainder(a) { + var r = nbi(); + this.divRemTo(a, null, r); + return r; + } + function bnDivideAndRemainder(a) { + var q = nbi(), r = nbi(); + this.divRemTo(a, q, r); + return new Array(q, r); + } + function bnpDMultiply(n) { + this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + } + function bnpDAddOffset(n, w) { + if (n == 0) return; + while (this.t <= w) this[this.t++] = 0; + this[w] += n; + while (this[w] >= this.DV) { + this[w] -= this.DV; + if (++w >= this.t) this[this.t++] = 0; + ++this[w]; + } + } + function NullExp() { + } + function nNop(x) { + return x; + } + function nMulTo(x, y, r) { + x.multiplyTo(y, r); + } + function nSqrTo(x, r) { + x.squareTo(r); + } + NullExp.prototype.convert = nNop; + NullExp.prototype.revert = nNop; + NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.sqrTo = nSqrTo; + function bnPow(e) { + return this.exp(e, new NullExp()); + } + function bnpMultiplyLowerTo(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; + r.t = i; + while (i > 0) r[--i] = 0; + var j; + for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); + for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i); + r.clamp(); + } + function bnpMultiplyUpperTo(a, n, r) { + --n; + var i = r.t = this.t + a.t - n; + r.s = 0; + while (--i >= 0) r[i] = 0; + for (i = Math.max(n - this.t, 0); i < a.t; ++i) + r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); + r.clamp(); + r.drShiftTo(1, r); + } + function Barrett(m) { + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + this.m = m; + } + function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m); + else if (x.compareTo(this.m) < 0) return x; + else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + } + function barrettRevert(x) { + return x; + } + function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1); + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) x.subTo(this.m, x); + } + function barrettSqrTo(x, r) { + x.squareTo(r); + this.reduce(r); + } + function barrettMulTo(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + } + Barrett.prototype.convert = barrettConvert; + Barrett.prototype.revert = barrettRevert; + Barrett.prototype.reduce = barrettReduce; + Barrett.prototype.mulTo = barrettMulTo; + Barrett.prototype.sqrTo = barrettSqrTo; + function bnModPow(e, m) { + var i = e.bitLength(), k, r = nbv(1), z2; + if (i <= 0) return r; + else if (i < 18) k = 1; + else if (i < 48) k = 3; + else if (i < 144) k = 4; + else if (i < 768) k = 5; + else k = 6; + if (i < 8) + z2 = new Classic(m); + else if (m.isEven()) + z2 = new Barrett(m); + else + z2 = new Montgomery(m); + var g = new Array(), n = 3, k1 = k - 1, km = (1 << k) - 1; + g[1] = z2.convert(this); + if (k > 1) { + var g2 = nbi(); + z2.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z2.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + var j = e.t - 1, w, is1 = true, r2 = nbi(), t2; + i = nbits(e[j]) - 1; + while (j >= 0) { + if (i >= k1) w = e[j] >> i - k1 & km; + else { + w = (e[j] & (1 << i + 1) - 1) << k1 - i; + if (j > 0) w |= e[j - 1] >> this.DB + i - k1; + } + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z2.sqrTo(r, r2); + z2.sqrTo(r2, r); + n -= 2; + } + if (n > 0) z2.sqrTo(r, r2); + else { + t2 = r; + r = r2; + r2 = t2; + } + z2.mulTo(r2, g[w], r); + } + while (j >= 0 && (e[j] & 1 << i) == 0) { + z2.sqrTo(r, r2); + t2 = r; + r = r2; + r2 = t2; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z2.revert(r); + } + function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone(); + var y = a.s < 0 ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t2 = x; + x = y; + y = t2; + } + var i = x.getLowestSetBit(), g = y.getLowestSetBit(); + if (g < 0) return x; + if (i < g) g = i; + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x); + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y); + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) y.lShiftTo(g, y); + return y; + } + function bnpModInt(n) { + if (n <= 0) return 0; + var d = this.DV % n, r = this.s < 0 ? n - 1 : 0; + if (this.t > 0) + if (d == 0) r = this[0] % n; + else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n; + return r; + } + function bnModInverse(m) { + var ac = m.isEven(); + if (this.isEven() && ac || m.signum() == 0) return BigInteger.ZERO; + var u = m.clone(), v = this.clone(); + var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) b.subTo(m, b); + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) d.subTo(m, d); + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) a.subTo(c, a); + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) c.subTo(a, c); + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; + if (d.compareTo(m) >= 0) return d.subtract(m); + if (d.signum() < 0) d.addTo(m, d); + else return d; + if (d.signum() < 0) return d.add(m); + else return d; + } + var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + function bnIsProbablePrime(t2) { + var i, x = this.abs(); + if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) + if (x[0] == lowprimes[i]) return true; + return false; + } + if (x.isEven()) return false; + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i], j = i + 1; + while (j < lowprimes.length && m < lplim) m *= lowprimes[j++]; + m = x.modInt(m); + while (i < j) if (m % lowprimes[i++] == 0) return false; + } + return x.millerRabin(t2); + } + function bnpMillerRabin(t2) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) return false; + var r = n1.shiftRight(k); + t2 = t2 + 1 >> 1; + if (t2 > lowprimes.length) t2 = lowprimes.length; + var a = nbi(); + for (var i = 0; i < t2; ++i) { + a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger.ONE) == 0) return false; + } + if (y.compareTo(n1) != 0) return false; + } + } + return true; + } + BigInteger.prototype.chunkSize = bnpChunkSize; + BigInteger.prototype.toRadix = bnpToRadix; + BigInteger.prototype.fromRadix = bnpFromRadix; + BigInteger.prototype.fromNumber = bnpFromNumber; + BigInteger.prototype.bitwiseTo = bnpBitwiseTo; + BigInteger.prototype.changeBit = bnpChangeBit; + BigInteger.prototype.addTo = bnpAddTo; + BigInteger.prototype.dMultiply = bnpDMultiply; + BigInteger.prototype.dAddOffset = bnpDAddOffset; + BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + BigInteger.prototype.modInt = bnpModInt; + BigInteger.prototype.millerRabin = bnpMillerRabin; + BigInteger.prototype.clone = bnClone; + BigInteger.prototype.intValue = bnIntValue; + BigInteger.prototype.byteValue = bnByteValue; + BigInteger.prototype.shortValue = bnShortValue; + BigInteger.prototype.signum = bnSigNum; + BigInteger.prototype.toByteArray = bnToByteArray; + BigInteger.prototype.equals = bnEquals; + BigInteger.prototype.min = bnMin; + BigInteger.prototype.max = bnMax; + BigInteger.prototype.and = bnAnd; + BigInteger.prototype.or = bnOr; + BigInteger.prototype.xor = bnXor; + BigInteger.prototype.andNot = bnAndNot; + BigInteger.prototype.not = bnNot; + BigInteger.prototype.shiftLeft = bnShiftLeft; + BigInteger.prototype.shiftRight = bnShiftRight; + BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; + BigInteger.prototype.bitCount = bnBitCount; + BigInteger.prototype.testBit = bnTestBit; + BigInteger.prototype.setBit = bnSetBit; + BigInteger.prototype.clearBit = bnClearBit; + BigInteger.prototype.flipBit = bnFlipBit; + BigInteger.prototype.add = bnAdd; + BigInteger.prototype.subtract = bnSubtract; + BigInteger.prototype.multiply = bnMultiply; + BigInteger.prototype.divide = bnDivide; + BigInteger.prototype.remainder = bnRemainder; + BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; + BigInteger.prototype.modPow = bnModPow; + BigInteger.prototype.modInverse = bnModInverse; + BigInteger.prototype.pow = bnPow; + BigInteger.prototype.gcd = bnGCD; + BigInteger.prototype.isProbablePrime = bnIsProbablePrime; + BigInteger.prototype.square = bnSquare; + BigInteger.prototype.Barrett = Barrett; + var rng_state; + var rng_pool; + var rng_pptr; + function rng_seed_int(x) { + rng_pool[rng_pptr++] ^= x & 255; + rng_pool[rng_pptr++] ^= x >> 8 & 255; + rng_pool[rng_pptr++] ^= x >> 16 & 255; + rng_pool[rng_pptr++] ^= x >> 24 & 255; + if (rng_pptr >= rng_psize) rng_pptr -= rng_psize; + } + function rng_seed_time() { + rng_seed_int((/* @__PURE__ */ new Date()).getTime()); + } + if (rng_pool == null) { + rng_pool = new Array(); + rng_pptr = 0; + var t; + if (typeof window !== "undefined" && window.crypto) { + if (window.crypto.getRandomValues) { + var ua = new Uint8Array(32); + window.crypto.getRandomValues(ua); + for (t = 0; t < 32; ++t) + rng_pool[rng_pptr++] = ua[t]; + } else if (navigator.appName == "Netscape" && navigator.appVersion < "5") { + var z = window.crypto.random(32); + for (t = 0; t < z.length; ++t) + rng_pool[rng_pptr++] = z.charCodeAt(t) & 255; + } + } + while (rng_pptr < rng_psize) { + t = Math.floor(65536 * Math.random()); + rng_pool[rng_pptr++] = t >>> 8; + rng_pool[rng_pptr++] = t & 255; + } + rng_pptr = 0; + rng_seed_time(); + } + function rng_get_byte() { + if (rng_state == null) { + rng_seed_time(); + rng_state = prng_newstate(); + rng_state.init(rng_pool); + for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) + rng_pool[rng_pptr] = 0; + rng_pptr = 0; + } + return rng_state.next(); + } + function rng_get_bytes(ba) { + var i; + for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte(); + } + function SecureRandom() { + } + SecureRandom.prototype.nextBytes = rng_get_bytes; + function Arcfour() { + this.i = 0; + this.j = 0; + this.S = new Array(); + } + function ARC4init(key2) { + var i, j, t2; + for (i = 0; i < 256; ++i) + this.S[i] = i; + j = 0; + for (i = 0; i < 256; ++i) { + j = j + this.S[i] + key2[i % key2.length] & 255; + t2 = this.S[i]; + this.S[i] = this.S[j]; + this.S[j] = t2; + } + this.i = 0; + this.j = 0; + } + function ARC4next() { + var t2; + this.i = this.i + 1 & 255; + this.j = this.j + this.S[this.i] & 255; + t2 = this.S[this.i]; + this.S[this.i] = this.S[this.j]; + this.S[this.j] = t2; + return this.S[t2 + this.S[this.i] & 255]; + } + Arcfour.prototype.init = ARC4init; + Arcfour.prototype.next = ARC4next; + function prng_newstate() { + return new Arcfour(); + } + var rng_psize = 256; + { + module.exports = { + default: BigInteger, + BigInteger, + SecureRandom + }; + } + }).call(jsbn); + })(jsbn$1); + return jsbn$1.exports; +} +var sprintf = {}; +var hasRequiredSprintf; +function requireSprintf() { + if (hasRequiredSprintf) return sprintf; + hasRequiredSprintf = 1; + (function(exports) { + !function() { + var re2 = { + not_type: /[^T]/, + not_primitive: /[^v]/, + number: /[diefg]/, + numeric_arg: /[bcdiefguxX]/, + json: /[j]/, + text: /^[^\x25]+/, + modulo: /^\x25{2}/, + placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, + key: /^([a-z_][a-z_\d]*)/i, + key_access: /^\.([a-z_][a-z_\d]*)/i, + index_access: /^\[(\d+)\]/, + sign: /^[+-]/ + }; + function sprintf2(key2) { + return sprintf_format(sprintf_parse(key2), arguments); + } + function vsprintf(fmt, argv) { + return sprintf2.apply(null, [fmt].concat(argv || [])); + } + function sprintf_format(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign2; + for (i = 0; i < tree_length; i++) { + if (typeof parse_tree[i] === "string") { + output += parse_tree[i]; + } else if (typeof parse_tree[i] === "object") { + ph = parse_tree[i]; + if (ph.keys) { + arg = argv[cursor]; + for (k = 0; k < ph.keys.length; k++) { + if (arg == void 0) { + throw new Error(sprintf2('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k - 1])); + } + arg = arg[ph.keys[k]]; + } + } else if (ph.param_no) { + arg = argv[ph.param_no]; + } else { + arg = argv[cursor++]; + } + if (re2.not_type.test(ph.type) && re2.not_primitive.test(ph.type) && arg instanceof Function) { + arg = arg(); + } + if (re2.numeric_arg.test(ph.type) && (typeof arg !== "number" && isNaN(arg))) { + throw new TypeError(sprintf2("[sprintf] expecting number but found %T", arg)); + } + if (re2.number.test(ph.type)) { + is_positive = arg >= 0; + } + switch (ph.type) { + case "b": + arg = parseInt(arg, 10).toString(2); + break; + case "c": + arg = String.fromCharCode(parseInt(arg, 10)); + break; + case "d": + case "i": + arg = parseInt(arg, 10); + break; + case "j": + arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0); + break; + case "e": + arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential(); + break; + case "f": + arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg); + break; + case "g": + arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg); + break; + case "o": + arg = (parseInt(arg, 10) >>> 0).toString(8); + break; + case "s": + arg = String(arg); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "t": + arg = String(!!arg); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "T": + arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase(); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "u": + arg = parseInt(arg, 10) >>> 0; + break; + case "v": + arg = arg.valueOf(); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "x": + arg = (parseInt(arg, 10) >>> 0).toString(16); + break; + case "X": + arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase(); + break; + } + if (re2.json.test(ph.type)) { + output += arg; + } else { + if (re2.number.test(ph.type) && (!is_positive || ph.sign)) { + sign2 = is_positive ? "+" : "-"; + arg = arg.toString().replace(re2.sign, ""); + } else { + sign2 = ""; + } + pad_character = ph.pad_char ? ph.pad_char === "0" ? "0" : ph.pad_char.charAt(1) : " "; + pad_length = ph.width - (sign2 + arg).length; + pad = ph.width ? pad_length > 0 ? pad_character.repeat(pad_length) : "" : ""; + output += ph.align ? sign2 + arg + pad : pad_character === "0" ? sign2 + pad + arg : pad + sign2 + arg; + } + } + } + return output; + } + var sprintf_cache = /* @__PURE__ */ Object.create(null); + function sprintf_parse(fmt) { + if (sprintf_cache[fmt]) { + return sprintf_cache[fmt]; + } + var _fmt = fmt, match, parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = re2.text.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } else if ((match = re2.modulo.exec(_fmt)) !== null) { + parse_tree.push("%"); + } else if ((match = re2.placeholder.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = re2.key.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") { + if ((field_match = re2.key_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } else if ((field_match = re2.index_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } else { + throw new SyntaxError("[sprintf] failed to parse named argument key"); + } + } + } else { + throw new SyntaxError("[sprintf] failed to parse named argument key"); + } + match[2] = field_list; + } else { + arg_names |= 2; + } + if (arg_names === 3) { + throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported"); + } + parse_tree.push( + { + placeholder: match[0], + param_no: match[1], + keys: match[2], + sign: match[3], + pad_char: match[4], + align: match[5], + width: match[6], + precision: match[7], + type: match[8] + } + ); + } else { + throw new SyntaxError("[sprintf] unexpected placeholder"); + } + _fmt = _fmt.substring(match[0].length); + } + return sprintf_cache[fmt] = parse_tree; + } + { + exports["sprintf"] = sprintf2; + exports["vsprintf"] = vsprintf; + } + if (typeof window !== "undefined") { + window["sprintf"] = sprintf2; + window["vsprintf"] = vsprintf; + } + }(); + })(sprintf); + return sprintf; +} +var hasRequiredIpv4; +function requireIpv4() { + if (hasRequiredIpv4) return ipv4; + hasRequiredIpv4 = 1; + var __createBinding = ipv4 && ipv4.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = ipv4 && ipv4.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = ipv4 && ipv4.__importStar || function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(ipv4, "__esModule", { value: true }); + ipv4.Address4 = void 0; + const common2 = __importStar(requireCommon()); + const constants2 = __importStar(requireConstants$1()); + const address_error_1 = requireAddressError(); + const jsbn_1 = requireJsbn(); + const sprintf_js_1 = requireSprintf(); + class Address4 { + constructor(address) { + this.groups = constants2.GROUPS; + this.parsedAddress = []; + this.parsedSubnet = ""; + this.subnet = "/32"; + this.subnetMask = 32; + this.v4 = true; + this.isCorrect = common2.isCorrect(constants2.BITS); + this.isInSubnet = common2.isInSubnet; + this.address = address; + const subnet = constants2.RE_SUBNET_STRING.exec(address); + if (subnet) { + this.parsedSubnet = subnet[0].replace("/", ""); + this.subnetMask = parseInt(this.parsedSubnet, 10); + this.subnet = `/${this.subnetMask}`; + if (this.subnetMask < 0 || this.subnetMask > constants2.BITS) { + throw new address_error_1.AddressError("Invalid subnet mask."); + } + address = address.replace(constants2.RE_SUBNET_STRING, ""); + } + this.addressMinusSuffix = address; + this.parsedAddress = this.parse(address); + } + static isValid(address) { + try { + new Address4(address); + return true; + } catch (e) { + return false; + } + } + /* + * Parses a v4 address + */ + parse(address) { + const groups = address.split("."); + if (!address.match(constants2.RE_ADDRESS)) { + throw new address_error_1.AddressError("Invalid IPv4 address."); + } + return groups; + } + /** + * Returns the correct form of an address + * @memberof Address4 + * @instance + * @returns {String} + */ + correctForm() { + return this.parsedAddress.map((part) => parseInt(part, 10)).join("."); + } + /** + * Converts a hex string to an IPv4 address object + * @memberof Address4 + * @static + * @param {string} hex - a hex string to convert + * @returns {Address4} + */ + static fromHex(hex) { + const padded = hex.replace(/:/g, "").padStart(8, "0"); + const groups = []; + let i; + for (i = 0; i < 8; i += 2) { + const h = padded.slice(i, i + 2); + groups.push(parseInt(h, 16)); + } + return new Address4(groups.join(".")); + } + /** + * Converts an integer into a IPv4 address object + * @memberof Address4 + * @static + * @param {integer} integer - a number to convert + * @returns {Address4} + */ + static fromInteger(integer) { + return Address4.fromHex(integer.toString(16)); + } + /** + * Return an address from in-addr.arpa form + * @memberof Address4 + * @static + * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address + * @returns {Adress4} + * @example + * var address = Address4.fromArpa(42.2.0.192.in-addr.arpa.) + * address.correctForm(); // '192.0.2.42' + */ + static fromArpa(arpaFormAddress) { + const leader = arpaFormAddress.replace(/(\.in-addr\.arpa)?\.$/, ""); + const address = leader.split(".").reverse().join("."); + return new Address4(address); + } + /** + * Converts an IPv4 address object to a hex string + * @memberof Address4 + * @instance + * @returns {String} + */ + toHex() { + return this.parsedAddress.map((part) => (0, sprintf_js_1.sprintf)("%02x", parseInt(part, 10))).join(":"); + } + /** + * Converts an IPv4 address object to an array of bytes + * @memberof Address4 + * @instance + * @returns {Array} + */ + toArray() { + return this.parsedAddress.map((part) => parseInt(part, 10)); + } + /** + * Converts an IPv4 address object to an IPv6 address group + * @memberof Address4 + * @instance + * @returns {String} + */ + toGroup6() { + const output = []; + let i; + for (i = 0; i < constants2.GROUPS; i += 2) { + const hex = (0, sprintf_js_1.sprintf)("%02x%02x", parseInt(this.parsedAddress[i], 10), parseInt(this.parsedAddress[i + 1], 10)); + output.push((0, sprintf_js_1.sprintf)("%x", parseInt(hex, 16))); + } + return output.join(":"); + } + /** + * Returns the address as a BigInteger + * @memberof Address4 + * @instance + * @returns {BigInteger} + */ + bigInteger() { + return new jsbn_1.BigInteger(this.parsedAddress.map((n) => (0, sprintf_js_1.sprintf)("%02x", parseInt(n, 10))).join(""), 16); + } + /** + * Helper function getting start address. + * @memberof Address4 + * @instance + * @returns {BigInteger} + */ + _startAddress() { + return new jsbn_1.BigInteger(this.mask() + "0".repeat(constants2.BITS - this.subnetMask), 2); + } + /** + * The first address in the range given by this address' subnet. + * Often referred to as the Network Address. + * @memberof Address4 + * @instance + * @returns {Address4} + */ + startAddress() { + return Address4.fromBigInteger(this._startAddress()); + } + /** + * The first host address in the range given by this address's subnet ie + * the first address after the Network Address + * @memberof Address4 + * @instance + * @returns {Address4} + */ + startAddressExclusive() { + const adjust = new jsbn_1.BigInteger("1"); + return Address4.fromBigInteger(this._startAddress().add(adjust)); + } + /** + * Helper function getting end address. + * @memberof Address4 + * @instance + * @returns {BigInteger} + */ + _endAddress() { + return new jsbn_1.BigInteger(this.mask() + "1".repeat(constants2.BITS - this.subnetMask), 2); + } + /** + * The last address in the range given by this address' subnet + * Often referred to as the Broadcast + * @memberof Address4 + * @instance + * @returns {Address4} + */ + endAddress() { + return Address4.fromBigInteger(this._endAddress()); + } + /** + * The last host address in the range given by this address's subnet ie + * the last address prior to the Broadcast Address + * @memberof Address4 + * @instance + * @returns {Address4} + */ + endAddressExclusive() { + const adjust = new jsbn_1.BigInteger("1"); + return Address4.fromBigInteger(this._endAddress().subtract(adjust)); + } + /** + * Converts a BigInteger to a v4 address object + * @memberof Address4 + * @static + * @param {BigInteger} bigInteger - a BigInteger to convert + * @returns {Address4} + */ + static fromBigInteger(bigInteger) { + return Address4.fromInteger(parseInt(bigInteger.toString(), 10)); + } + /** + * Returns the first n bits of the address, defaulting to the + * subnet mask + * @memberof Address4 + * @instance + * @returns {String} + */ + mask(mask) { + if (mask === void 0) { + mask = this.subnetMask; + } + return this.getBitsBase2(0, mask); + } + /** + * Returns the bits in the given range as a base-2 string + * @memberof Address4 + * @instance + * @returns {string} + */ + getBitsBase2(start, end) { + return this.binaryZeroPad().slice(start, end); + } + /** + * Return the reversed ip6.arpa form of the address + * @memberof Address4 + * @param {Object} options + * @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix + * @instance + * @returns {String} + */ + reverseForm(options2) { + if (!options2) { + options2 = {}; + } + const reversed = this.correctForm().split(".").reverse().join("."); + if (options2.omitSuffix) { + return reversed; + } + return (0, sprintf_js_1.sprintf)("%s.in-addr.arpa.", reversed); + } + /** + * Returns true if the given address is a multicast address + * @memberof Address4 + * @instance + * @returns {boolean} + */ + isMulticast() { + return this.isInSubnet(new Address4("224.0.0.0/4")); + } + /** + * Returns a zero-padded base-2 string representation of the address + * @memberof Address4 + * @instance + * @returns {string} + */ + binaryZeroPad() { + return this.bigInteger().toString(2).padStart(constants2.BITS, "0"); + } + /** + * Groups an IPv4 address for inclusion at the end of an IPv6 address + * @returns {String} + */ + groupForV6() { + const segments = this.parsedAddress; + return this.address.replace(constants2.RE_ADDRESS, (0, sprintf_js_1.sprintf)('%s.%s', segments.slice(0, 2).join("."), segments.slice(2, 4).join("."))); + } + } + ipv4.Address4 = Address4; + return ipv4; +} +var ipv6 = {}; +var constants = {}; +var hasRequiredConstants; +function requireConstants() { + if (hasRequiredConstants) return constants; + hasRequiredConstants = 1; + Object.defineProperty(constants, "__esModule", { value: true }); + constants.RE_URL_WITH_PORT = constants.RE_URL = constants.RE_ZONE_STRING = constants.RE_SUBNET_STRING = constants.RE_BAD_ADDRESS = constants.RE_BAD_CHARACTERS = constants.TYPES = constants.SCOPES = constants.GROUPS = constants.BITS = void 0; + constants.BITS = 128; + constants.GROUPS = 8; + constants.SCOPES = { + 0: "Reserved", + 1: "Interface local", + 2: "Link local", + 4: "Admin local", + 5: "Site local", + 8: "Organization local", + 14: "Global", + 15: "Reserved" + }; + constants.TYPES = { + "ff01::1/128": "Multicast (All nodes on this interface)", + "ff01::2/128": "Multicast (All routers on this interface)", + "ff02::1/128": "Multicast (All nodes on this link)", + "ff02::2/128": "Multicast (All routers on this link)", + "ff05::2/128": "Multicast (All routers in this site)", + "ff02::5/128": "Multicast (OSPFv3 AllSPF routers)", + "ff02::6/128": "Multicast (OSPFv3 AllDR routers)", + "ff02::9/128": "Multicast (RIP routers)", + "ff02::a/128": "Multicast (EIGRP routers)", + "ff02::d/128": "Multicast (PIM routers)", + "ff02::16/128": "Multicast (MLDv2 reports)", + "ff01::fb/128": "Multicast (mDNSv6)", + "ff02::fb/128": "Multicast (mDNSv6)", + "ff05::fb/128": "Multicast (mDNSv6)", + "ff02::1:2/128": "Multicast (All DHCP servers and relay agents on this link)", + "ff05::1:2/128": "Multicast (All DHCP servers and relay agents in this site)", + "ff02::1:3/128": "Multicast (All DHCP servers on this link)", + "ff05::1:3/128": "Multicast (All DHCP servers in this site)", + "::/128": "Unspecified", + "::1/128": "Loopback", + "ff00::/8": "Multicast", + "fe80::/10": "Link-local unicast" + }; + constants.RE_BAD_CHARACTERS = /([^0-9a-f:/%])/gi; + constants.RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/gi; + constants.RE_SUBNET_STRING = /\/\d{1,3}(?=%|$)/; + constants.RE_ZONE_STRING = /%.*$/; + constants.RE_URL = new RegExp(/^\[{0,1}([0-9a-f:]+)\]{0,1}/); + constants.RE_URL_WITH_PORT = new RegExp(/\[([0-9a-f:]+)\]:([0-9]{1,5})/); + return constants; +} +var helpers = {}; +var hasRequiredHelpers$1; +function requireHelpers$1() { + if (hasRequiredHelpers$1) return helpers; + hasRequiredHelpers$1 = 1; + Object.defineProperty(helpers, "__esModule", { value: true }); + helpers.simpleGroup = helpers.spanLeadingZeroes = helpers.spanAll = helpers.spanAllZeroes = void 0; + const sprintf_js_1 = requireSprintf(); + function spanAllZeroes(s) { + return s.replace(/(0+)/g, '$1'); + } + helpers.spanAllZeroes = spanAllZeroes; + function spanAll(s, offset2 = 0) { + const letters = s.split(""); + return letters.map( + (n, i) => (0, sprintf_js_1.sprintf)('%s', n, i + offset2, spanAllZeroes(n)) + // XXX Use #base-2 .value-0 instead? + ).join(""); + } + helpers.spanAll = spanAll; + function spanLeadingZeroesSimple(group) { + return group.replace(/^(0+)/, '$1'); + } + function spanLeadingZeroes(address) { + const groups = address.split(":"); + return groups.map((g) => spanLeadingZeroesSimple(g)).join(":"); + } + helpers.spanLeadingZeroes = spanLeadingZeroes; + function simpleGroup(addressString, offset2 = 0) { + const groups = addressString.split(":"); + return groups.map((g, i) => { + if (/group-v4/.test(g)) { + return g; + } + return (0, sprintf_js_1.sprintf)('%s', i + offset2, spanLeadingZeroesSimple(g)); + }); + } + helpers.simpleGroup = simpleGroup; + return helpers; +} +var regularExpressions = {}; +var hasRequiredRegularExpressions; +function requireRegularExpressions() { + if (hasRequiredRegularExpressions) return regularExpressions; + hasRequiredRegularExpressions = 1; + var __createBinding = regularExpressions && regularExpressions.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = regularExpressions && regularExpressions.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = regularExpressions && regularExpressions.__importStar || function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(regularExpressions, "__esModule", { value: true }); + regularExpressions.possibleElisions = regularExpressions.simpleRegularExpression = regularExpressions.ADDRESS_BOUNDARY = regularExpressions.padGroup = regularExpressions.groupPossibilities = void 0; + const v6 = __importStar(requireConstants()); + const sprintf_js_1 = requireSprintf(); + function groupPossibilities(possibilities) { + return (0, sprintf_js_1.sprintf)("(%s)", possibilities.join("|")); + } + regularExpressions.groupPossibilities = groupPossibilities; + function padGroup(group) { + if (group.length < 4) { + return (0, sprintf_js_1.sprintf)("0{0,%d}%s", 4 - group.length, group); + } + return group; + } + regularExpressions.padGroup = padGroup; + regularExpressions.ADDRESS_BOUNDARY = "[^A-Fa-f0-9:]"; + function simpleRegularExpression(groups) { + const zeroIndexes = []; + groups.forEach((group, i) => { + const groupInteger = parseInt(group, 16); + if (groupInteger === 0) { + zeroIndexes.push(i); + } + }); + const possibilities = zeroIndexes.map((zeroIndex) => groups.map((group, i) => { + if (i === zeroIndex) { + const elision = i === 0 || i === v6.GROUPS - 1 ? ":" : ""; + return groupPossibilities([padGroup(group), elision]); + } + return padGroup(group); + }).join(":")); + possibilities.push(groups.map(padGroup).join(":")); + return groupPossibilities(possibilities); + } + regularExpressions.simpleRegularExpression = simpleRegularExpression; + function possibleElisions(elidedGroups, moreLeft, moreRight) { + const left = moreLeft ? "" : ":"; + const right = moreRight ? "" : ":"; + const possibilities = []; + if (!moreLeft && !moreRight) { + possibilities.push("::"); + } + if (moreLeft && moreRight) { + possibilities.push(""); + } + if (moreRight && !moreLeft || !moreRight && moreLeft) { + possibilities.push(":"); + } + possibilities.push((0, sprintf_js_1.sprintf)("%s(:0{1,4}){1,%d}", left, elidedGroups - 1)); + possibilities.push((0, sprintf_js_1.sprintf)("(0{1,4}:){1,%d}%s", elidedGroups - 1, right)); + possibilities.push((0, sprintf_js_1.sprintf)("(0{1,4}:){%d}0{1,4}", elidedGroups - 1)); + for (let groups = 1; groups < elidedGroups - 1; groups++) { + for (let position = 1; position < elidedGroups - groups; position++) { + possibilities.push((0, sprintf_js_1.sprintf)("(0{1,4}:){%d}:(0{1,4}:){%d}0{1,4}", position, elidedGroups - position - groups - 1)); + } + } + return groupPossibilities(possibilities); + } + regularExpressions.possibleElisions = possibleElisions; + return regularExpressions; +} +var hasRequiredIpv6; +function requireIpv6() { + if (hasRequiredIpv6) return ipv6; + hasRequiredIpv6 = 1; + var __createBinding = ipv6 && ipv6.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = ipv6 && ipv6.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = ipv6 && ipv6.__importStar || function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(ipv6, "__esModule", { value: true }); + ipv6.Address6 = void 0; + const common2 = __importStar(requireCommon()); + const constants4 = __importStar(requireConstants$1()); + const constants6 = __importStar(requireConstants()); + const helpers2 = __importStar(requireHelpers$1()); + const ipv4_1 = requireIpv4(); + const regular_expressions_1 = requireRegularExpressions(); + const address_error_1 = requireAddressError(); + const jsbn_1 = requireJsbn(); + const sprintf_js_1 = requireSprintf(); + function assert2(condition) { + if (!condition) { + throw new Error("Assertion failed."); + } + } + function addCommas(number) { + const r = /(\d+)(\d{3})/; + while (r.test(number)) { + number = number.replace(r, "$1,$2"); + } + return number; + } + function spanLeadingZeroes4(n) { + n = n.replace(/^(0{1,})([1-9]+)$/, '$1$2'); + n = n.replace(/^(0{1,})(0)$/, '$1$2'); + return n; + } + function compact(address, slice) { + const s1 = []; + const s2 = []; + let i; + for (i = 0; i < address.length; i++) { + if (i < slice[0]) { + s1.push(address[i]); + } else if (i > slice[1]) { + s2.push(address[i]); + } + } + return s1.concat(["compact"]).concat(s2); + } + function paddedHex(octet) { + return (0, sprintf_js_1.sprintf)("%04x", parseInt(octet, 16)); + } + function unsignByte(b) { + return b & 255; + } + class Address6 { + constructor(address, optionalGroups) { + this.addressMinusSuffix = ""; + this.parsedSubnet = ""; + this.subnet = "/128"; + this.subnetMask = 128; + this.v4 = false; + this.zone = ""; + this.isInSubnet = common2.isInSubnet; + this.isCorrect = common2.isCorrect(constants6.BITS); + if (optionalGroups === void 0) { + this.groups = constants6.GROUPS; + } else { + this.groups = optionalGroups; + } + this.address = address; + const subnet = constants6.RE_SUBNET_STRING.exec(address); + if (subnet) { + this.parsedSubnet = subnet[0].replace("/", ""); + this.subnetMask = parseInt(this.parsedSubnet, 10); + this.subnet = `/${this.subnetMask}`; + if (Number.isNaN(this.subnetMask) || this.subnetMask < 0 || this.subnetMask > constants6.BITS) { + throw new address_error_1.AddressError("Invalid subnet mask."); + } + address = address.replace(constants6.RE_SUBNET_STRING, ""); + } else if (/\//.test(address)) { + throw new address_error_1.AddressError("Invalid subnet mask."); + } + const zone = constants6.RE_ZONE_STRING.exec(address); + if (zone) { + this.zone = zone[0]; + address = address.replace(constants6.RE_ZONE_STRING, ""); + } + this.addressMinusSuffix = address; + this.parsedAddress = this.parse(this.addressMinusSuffix); + } + static isValid(address) { + try { + new Address6(address); + return true; + } catch (e) { + return false; + } + } + /** + * Convert a BigInteger to a v6 address object + * @memberof Address6 + * @static + * @param {BigInteger} bigInteger - a BigInteger to convert + * @returns {Address6} + * @example + * var bigInteger = new BigInteger('1000000000000'); + * var address = Address6.fromBigInteger(bigInteger); + * address.correctForm(); // '::e8:d4a5:1000' + */ + static fromBigInteger(bigInteger) { + const hex = bigInteger.toString(16).padStart(32, "0"); + const groups = []; + let i; + for (i = 0; i < constants6.GROUPS; i++) { + groups.push(hex.slice(i * 4, (i + 1) * 4)); + } + return new Address6(groups.join(":")); + } + /** + * Convert a URL (with optional port number) to an address object + * @memberof Address6 + * @static + * @param {string} url - a URL with optional port number + * @example + * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/'); + * addressAndPort.address.correctForm(); // 'ffff::' + * addressAndPort.port; // 8080 + */ + static fromURL(url2) { + let host; + let port = null; + let result; + if (url2.indexOf("[") !== -1 && url2.indexOf("]:") !== -1) { + result = constants6.RE_URL_WITH_PORT.exec(url2); + if (result === null) { + return { + error: "failed to parse address with port", + address: null, + port: null + }; + } + host = result[1]; + port = result[2]; + } else if (url2.indexOf("/") !== -1) { + url2 = url2.replace(/^[a-z0-9]+:\/\//, ""); + result = constants6.RE_URL.exec(url2); + if (result === null) { + return { + error: "failed to parse address from URL", + address: null, + port: null + }; + } + host = result[1]; + } else { + host = url2; + } + if (port) { + port = parseInt(port, 10); + if (port < 0 || port > 65536) { + port = null; + } + } else { + port = null; + } + return { + address: new Address6(host), + port + }; + } + /** + * Create an IPv6-mapped address given an IPv4 address + * @memberof Address6 + * @static + * @param {string} address - An IPv4 address string + * @returns {Address6} + * @example + * var address = Address6.fromAddress4('192.168.0.1'); + * address.correctForm(); // '::ffff:c0a8:1' + * address.to4in6(); // '::ffff:192.168.0.1' + */ + static fromAddress4(address) { + const address4 = new ipv4_1.Address4(address); + const mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask); + return new Address6(`::ffff:${address4.correctForm()}/${mask6}`); + } + /** + * Return an address from ip6.arpa form + * @memberof Address6 + * @static + * @param {string} arpaFormAddress - an 'ip6.arpa' form address + * @returns {Adress6} + * @example + * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.) + * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe' + */ + static fromArpa(arpaFormAddress) { + let address = arpaFormAddress.replace(/(\.ip6\.arpa)?\.$/, ""); + const semicolonAmount = 7; + if (address.length !== 63) { + throw new address_error_1.AddressError("Invalid 'ip6.arpa' form."); + } + const parts = address.split(".").reverse(); + for (let i = semicolonAmount; i > 0; i--) { + const insertIndex = i * 4; + parts.splice(insertIndex, 0, ":"); + } + address = parts.join(""); + return new Address6(address); + } + /** + * Return the Microsoft UNC transcription of the address + * @memberof Address6 + * @instance + * @returns {String} the Microsoft UNC transcription of the address + */ + microsoftTranscription() { + return (0, sprintf_js_1.sprintf)("%s.ipv6-literal.net", this.correctForm().replace(/:/g, "-")); + } + /** + * Return the first n bits of the address, defaulting to the subnet mask + * @memberof Address6 + * @instance + * @param {number} [mask=subnet] - the number of bits to mask + * @returns {String} the first n bits of the address as a string + */ + mask(mask = this.subnetMask) { + return this.getBitsBase2(0, mask); + } + /** + * Return the number of possible subnets of a given size in the address + * @memberof Address6 + * @instance + * @param {number} [size=128] - the subnet size + * @returns {String} + */ + // TODO: probably useful to have a numeric version of this too + possibleSubnets(subnetSize = 128) { + const availableBits = constants6.BITS - this.subnetMask; + const subnetBits = Math.abs(subnetSize - constants6.BITS); + const subnetPowers = availableBits - subnetBits; + if (subnetPowers < 0) { + return "0"; + } + return addCommas(new jsbn_1.BigInteger("2", 10).pow(subnetPowers).toString(10)); + } + /** + * Helper function getting start address. + * @memberof Address6 + * @instance + * @returns {BigInteger} + */ + _startAddress() { + return new jsbn_1.BigInteger(this.mask() + "0".repeat(constants6.BITS - this.subnetMask), 2); + } + /** + * The first address in the range given by this address' subnet + * Often referred to as the Network Address. + * @memberof Address6 + * @instance + * @returns {Address6} + */ + startAddress() { + return Address6.fromBigInteger(this._startAddress()); + } + /** + * The first host address in the range given by this address's subnet ie + * the first address after the Network Address + * @memberof Address6 + * @instance + * @returns {Address6} + */ + startAddressExclusive() { + const adjust = new jsbn_1.BigInteger("1"); + return Address6.fromBigInteger(this._startAddress().add(adjust)); + } + /** + * Helper function getting end address. + * @memberof Address6 + * @instance + * @returns {BigInteger} + */ + _endAddress() { + return new jsbn_1.BigInteger(this.mask() + "1".repeat(constants6.BITS - this.subnetMask), 2); + } + /** + * The last address in the range given by this address' subnet + * Often referred to as the Broadcast + * @memberof Address6 + * @instance + * @returns {Address6} + */ + endAddress() { + return Address6.fromBigInteger(this._endAddress()); + } + /** + * The last host address in the range given by this address's subnet ie + * the last address prior to the Broadcast Address + * @memberof Address6 + * @instance + * @returns {Address6} + */ + endAddressExclusive() { + const adjust = new jsbn_1.BigInteger("1"); + return Address6.fromBigInteger(this._endAddress().subtract(adjust)); + } + /** + * Return the scope of the address + * @memberof Address6 + * @instance + * @returns {String} + */ + getScope() { + let scope = constants6.SCOPES[this.getBits(12, 16).intValue()]; + if (this.getType() === "Global unicast" && scope !== "Link local") { + scope = "Global"; + } + return scope || "Unknown"; + } + /** + * Return the type of the address + * @memberof Address6 + * @instance + * @returns {String} + */ + getType() { + for (const subnet of Object.keys(constants6.TYPES)) { + if (this.isInSubnet(new Address6(subnet))) { + return constants6.TYPES[subnet]; + } + } + return "Global unicast"; + } + /** + * Return the bits in the given range as a BigInteger + * @memberof Address6 + * @instance + * @returns {BigInteger} + */ + getBits(start, end) { + return new jsbn_1.BigInteger(this.getBitsBase2(start, end), 2); + } + /** + * Return the bits in the given range as a base-2 string + * @memberof Address6 + * @instance + * @returns {String} + */ + getBitsBase2(start, end) { + return this.binaryZeroPad().slice(start, end); + } + /** + * Return the bits in the given range as a base-16 string + * @memberof Address6 + * @instance + * @returns {String} + */ + getBitsBase16(start, end) { + const length = end - start; + if (length % 4 !== 0) { + throw new Error("Length of bits to retrieve must be divisible by four"); + } + return this.getBits(start, end).toString(16).padStart(length / 4, "0"); + } + /** + * Return the bits that are set past the subnet mask length + * @memberof Address6 + * @instance + * @returns {String} + */ + getBitsPastSubnet() { + return this.getBitsBase2(this.subnetMask, constants6.BITS); + } + /** + * Return the reversed ip6.arpa form of the address + * @memberof Address6 + * @param {Object} options + * @param {boolean} options.omitSuffix - omit the "ip6.arpa" suffix + * @instance + * @returns {String} + */ + reverseForm(options2) { + if (!options2) { + options2 = {}; + } + const characters = Math.floor(this.subnetMask / 4); + const reversed = this.canonicalForm().replace(/:/g, "").split("").slice(0, characters).reverse().join("."); + if (characters > 0) { + if (options2.omitSuffix) { + return reversed; + } + return (0, sprintf_js_1.sprintf)("%s.ip6.arpa.", reversed); + } + if (options2.omitSuffix) { + return ""; + } + return "ip6.arpa."; + } + /** + * Return the correct form of the address + * @memberof Address6 + * @instance + * @returns {String} + */ + correctForm() { + let i; + let groups = []; + let zeroCounter = 0; + const zeroes = []; + for (i = 0; i < this.parsedAddress.length; i++) { + const value = parseInt(this.parsedAddress[i], 16); + if (value === 0) { + zeroCounter++; + } + if (value !== 0 && zeroCounter > 0) { + if (zeroCounter > 1) { + zeroes.push([i - zeroCounter, i - 1]); + } + zeroCounter = 0; + } + } + if (zeroCounter > 1) { + zeroes.push([this.parsedAddress.length - zeroCounter, this.parsedAddress.length - 1]); + } + const zeroLengths = zeroes.map((n) => n[1] - n[0] + 1); + if (zeroes.length > 0) { + const index2 = zeroLengths.indexOf(Math.max(...zeroLengths)); + groups = compact(this.parsedAddress, zeroes[index2]); + } else { + groups = this.parsedAddress; + } + for (i = 0; i < groups.length; i++) { + if (groups[i] !== "compact") { + groups[i] = parseInt(groups[i], 16).toString(16); + } + } + let correct = groups.join(":"); + correct = correct.replace(/^compact$/, "::"); + correct = correct.replace(/^compact|compact$/, ":"); + correct = correct.replace(/compact/, ""); + return correct; + } + /** + * Return a zero-padded base-2 string representation of the address + * @memberof Address6 + * @instance + * @returns {String} + * @example + * var address = new Address6('2001:4860:4001:803::1011'); + * address.binaryZeroPad(); + * // '0010000000000001010010000110000001000000000000010000100000000011 + * // 0000000000000000000000000000000000000000000000000001000000010001' + */ + binaryZeroPad() { + return this.bigInteger().toString(2).padStart(constants6.BITS, "0"); + } + // TODO: Improve the semantics of this helper function + parse4in6(address) { + const groups = address.split(":"); + const lastGroup = groups.slice(-1)[0]; + const address4 = lastGroup.match(constants4.RE_ADDRESS); + if (address4) { + this.parsedAddress4 = address4[0]; + this.address4 = new ipv4_1.Address4(this.parsedAddress4); + for (let i = 0; i < this.address4.groups; i++) { + if (/^0[0-9]+/.test(this.address4.parsedAddress[i])) { + throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", address.replace(constants4.RE_ADDRESS, this.address4.parsedAddress.map(spanLeadingZeroes4).join("."))); + } + } + this.v4 = true; + groups[groups.length - 1] = this.address4.toGroup6(); + address = groups.join(":"); + } + return address; + } + // TODO: Make private? + parse(address) { + address = this.parse4in6(address); + const badCharacters = address.match(constants6.RE_BAD_CHARACTERS); + if (badCharacters) { + throw new address_error_1.AddressError((0, sprintf_js_1.sprintf)("Bad character%s detected in address: %s", badCharacters.length > 1 ? "s" : "", badCharacters.join("")), address.replace(constants6.RE_BAD_CHARACTERS, '$1')); + } + const badAddress = address.match(constants6.RE_BAD_ADDRESS); + if (badAddress) { + throw new address_error_1.AddressError((0, sprintf_js_1.sprintf)("Address failed regex: %s", badAddress.join("")), address.replace(constants6.RE_BAD_ADDRESS, '$1')); + } + let groups = []; + const halves = address.split("::"); + if (halves.length === 2) { + let first = halves[0].split(":"); + let last = halves[1].split(":"); + if (first.length === 1 && first[0] === "") { + first = []; + } + if (last.length === 1 && last[0] === "") { + last = []; + } + const remaining = this.groups - (first.length + last.length); + if (!remaining) { + throw new address_error_1.AddressError("Error parsing groups"); + } + this.elidedGroups = remaining; + this.elisionBegin = first.length; + this.elisionEnd = first.length + this.elidedGroups; + groups = groups.concat(first); + for (let i = 0; i < remaining; i++) { + groups.push("0"); + } + groups = groups.concat(last); + } else if (halves.length === 1) { + groups = address.split(":"); + this.elidedGroups = 0; + } else { + throw new address_error_1.AddressError("Too many :: groups found"); + } + groups = groups.map((group) => (0, sprintf_js_1.sprintf)("%x", parseInt(group, 16))); + if (groups.length !== this.groups) { + throw new address_error_1.AddressError("Incorrect number of groups found"); + } + return groups; + } + /** + * Return the canonical form of the address + * @memberof Address6 + * @instance + * @returns {String} + */ + canonicalForm() { + return this.parsedAddress.map(paddedHex).join(":"); + } + /** + * Return the decimal form of the address + * @memberof Address6 + * @instance + * @returns {String} + */ + decimal() { + return this.parsedAddress.map((n) => (0, sprintf_js_1.sprintf)("%05d", parseInt(n, 16))).join(":"); + } + /** + * Return the address as a BigInteger + * @memberof Address6 + * @instance + * @returns {BigInteger} + */ + bigInteger() { + return new jsbn_1.BigInteger(this.parsedAddress.map(paddedHex).join(""), 16); + } + /** + * Return the last two groups of this address as an IPv4 address string + * @memberof Address6 + * @instance + * @returns {Address4} + * @example + * var address = new Address6('2001:4860:4001::1825:bf11'); + * address.to4().correctForm(); // '24.37.191.17' + */ + to4() { + const binary2 = this.binaryZeroPad().split(""); + return ipv4_1.Address4.fromHex(new jsbn_1.BigInteger(binary2.slice(96, 128).join(""), 2).toString(16)); + } + /** + * Return the v4-in-v6 form of the address + * @memberof Address6 + * @instance + * @returns {String} + */ + to4in6() { + const address4 = this.to4(); + const address6 = new Address6(this.parsedAddress.slice(0, 6).join(":"), 6); + const correct = address6.correctForm(); + let infix = ""; + if (!/:$/.test(correct)) { + infix = ":"; + } + return correct + infix + address4.address; + } + /** + * Return an object containing the Teredo properties of the address + * @memberof Address6 + * @instance + * @returns {Object} + */ + inspectTeredo() { + const prefix = this.getBitsBase16(0, 32); + const udpPort = this.getBits(80, 96).xor(new jsbn_1.BigInteger("ffff", 16)).toString(); + const server4 = ipv4_1.Address4.fromHex(this.getBitsBase16(32, 64)); + const client4 = ipv4_1.Address4.fromHex(this.getBits(96, 128).xor(new jsbn_1.BigInteger("ffffffff", 16)).toString(16)); + const flags = this.getBits(64, 80); + const flagsBase2 = this.getBitsBase2(64, 80); + const coneNat = flags.testBit(15); + const reserved = flags.testBit(14); + const groupIndividual = flags.testBit(8); + const universalLocal = flags.testBit(9); + const nonce = new jsbn_1.BigInteger(flagsBase2.slice(2, 6) + flagsBase2.slice(8, 16), 2).toString(10); + return { + prefix: (0, sprintf_js_1.sprintf)("%s:%s", prefix.slice(0, 4), prefix.slice(4, 8)), + server4: server4.address, + client4: client4.address, + flags: flagsBase2, + coneNat, + microsoft: { + reserved, + universalLocal, + groupIndividual, + nonce + }, + udpPort + }; + } + /** + * Return an object containing the 6to4 properties of the address + * @memberof Address6 + * @instance + * @returns {Object} + */ + inspect6to4() { + const prefix = this.getBitsBase16(0, 16); + const gateway = ipv4_1.Address4.fromHex(this.getBitsBase16(16, 48)); + return { + prefix: (0, sprintf_js_1.sprintf)("%s", prefix.slice(0, 4)), + gateway: gateway.address + }; + } + /** + * Return a v6 6to4 address from a v6 v4inv6 address + * @memberof Address6 + * @instance + * @returns {Address6} + */ + to6to4() { + if (!this.is4()) { + return null; + } + const addr6to4 = [ + "2002", + this.getBitsBase16(96, 112), + this.getBitsBase16(112, 128), + "", + "/16" + ].join(":"); + return new Address6(addr6to4); + } + /** + * Return a byte array + * @memberof Address6 + * @instance + * @returns {Array} + */ + toByteArray() { + const byteArray = this.bigInteger().toByteArray(); + if (byteArray.length === 17 && byteArray[0] === 0) { + return byteArray.slice(1); + } + return byteArray; + } + /** + * Return an unsigned byte array + * @memberof Address6 + * @instance + * @returns {Array} + */ + toUnsignedByteArray() { + return this.toByteArray().map(unsignByte); + } + /** + * Convert a byte array to an Address6 object + * @memberof Address6 + * @static + * @returns {Address6} + */ + static fromByteArray(bytes) { + return this.fromUnsignedByteArray(bytes.map(unsignByte)); + } + /** + * Convert an unsigned byte array to an Address6 object + * @memberof Address6 + * @static + * @returns {Address6} + */ + static fromUnsignedByteArray(bytes) { + const BYTE_MAX = new jsbn_1.BigInteger("256", 10); + let result = new jsbn_1.BigInteger("0", 10); + let multiplier = new jsbn_1.BigInteger("1", 10); + for (let i = bytes.length - 1; i >= 0; i--) { + result = result.add(multiplier.multiply(new jsbn_1.BigInteger(bytes[i].toString(10), 10))); + multiplier = multiplier.multiply(BYTE_MAX); + } + return Address6.fromBigInteger(result); + } + /** + * Returns true if the address is in the canonical form, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + isCanonical() { + return this.addressMinusSuffix === this.canonicalForm(); + } + /** + * Returns true if the address is a link local address, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + isLinkLocal() { + if (this.getBitsBase2(0, 64) === "1111111010000000000000000000000000000000000000000000000000000000") { + return true; + } + return false; + } + /** + * Returns true if the address is a multicast address, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + isMulticast() { + return this.getType() === "Multicast"; + } + /** + * Returns true if the address is a v4-in-v6 address, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + is4() { + return this.v4; + } + /** + * Returns true if the address is a Teredo address, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + isTeredo() { + return this.isInSubnet(new Address6("2001::/32")); + } + /** + * Returns true if the address is a 6to4 address, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + is6to4() { + return this.isInSubnet(new Address6("2002::/16")); + } + /** + * Returns true if the address is a loopback address, false otherwise + * @memberof Address6 + * @instance + * @returns {boolean} + */ + isLoopback() { + return this.getType() === "Loopback"; + } + // #endregion + // #region HTML + /** + * @returns {String} the address in link form with a default port of 80 + */ + href(optionalPort) { + if (optionalPort === void 0) { + optionalPort = ""; + } else { + optionalPort = (0, sprintf_js_1.sprintf)(":%s", optionalPort); + } + return (0, sprintf_js_1.sprintf)("http://[%s]%s/", this.correctForm(), optionalPort); + } + /** + * @returns {String} a link suitable for conveying the address via a URL hash + */ + link(options2) { + if (!options2) { + options2 = {}; + } + if (options2.className === void 0) { + options2.className = ""; + } + if (options2.prefix === void 0) { + options2.prefix = "/#address="; + } + if (options2.v4 === void 0) { + options2.v4 = false; + } + let formFunction = this.correctForm; + if (options2.v4) { + formFunction = this.to4in6; + } + if (options2.className) { + return (0, sprintf_js_1.sprintf)('%2$s', options2.prefix, formFunction.call(this), options2.className); + } + return (0, sprintf_js_1.sprintf)('%2$s', options2.prefix, formFunction.call(this)); + } + /** + * Groups an address + * @returns {String} + */ + group() { + if (this.elidedGroups === 0) { + return helpers2.simpleGroup(this.address).join(":"); + } + assert2(typeof this.elidedGroups === "number"); + assert2(typeof this.elisionBegin === "number"); + const output = []; + const [left, right] = this.address.split("::"); + if (left.length) { + output.push(...helpers2.simpleGroup(left)); + } else { + output.push(""); + } + const classes = ["hover-group"]; + for (let i = this.elisionBegin; i < this.elisionBegin + this.elidedGroups; i++) { + classes.push((0, sprintf_js_1.sprintf)("group-%d", i)); + } + output.push((0, sprintf_js_1.sprintf)('', classes.join(" "))); + if (right.length) { + output.push(...helpers2.simpleGroup(right, this.elisionEnd)); + } else { + output.push(""); + } + if (this.is4()) { + assert2(this.address4 instanceof ipv4_1.Address4); + output.pop(); + output.push(this.address4.groupForV6()); + } + return output.join(":"); + } + // #endregion + // #region Regular expressions + /** + * Generate a regular expression string that can be used to find or validate + * all variations of this address + * @memberof Address6 + * @instance + * @param {boolean} substringSearch + * @returns {string} + */ + regularExpressionString(substringSearch = false) { + let output = []; + const address6 = new Address6(this.correctForm()); + if (address6.elidedGroups === 0) { + output.push((0, regular_expressions_1.simpleRegularExpression)(address6.parsedAddress)); + } else if (address6.elidedGroups === constants6.GROUPS) { + output.push((0, regular_expressions_1.possibleElisions)(constants6.GROUPS)); + } else { + const halves = address6.address.split("::"); + if (halves[0].length) { + output.push((0, regular_expressions_1.simpleRegularExpression)(halves[0].split(":"))); + } + assert2(typeof address6.elidedGroups === "number"); + output.push((0, regular_expressions_1.possibleElisions)(address6.elidedGroups, halves[0].length !== 0, halves[1].length !== 0)); + if (halves[1].length) { + output.push((0, regular_expressions_1.simpleRegularExpression)(halves[1].split(":"))); + } + output = [output.join(":")]; + } + if (!substringSearch) { + output = [ + "(?=^|", + regular_expressions_1.ADDRESS_BOUNDARY, + "|[^\\w\\:])(", + ...output, + ")(?=[^\\w\\:]|", + regular_expressions_1.ADDRESS_BOUNDARY, + "|$)" + ]; + } + return output.join(""); + } + /** + * Generate a regular expression that can be used to find or validate all + * variations of this address. + * @memberof Address6 + * @instance + * @param {boolean} substringSearch + * @returns {RegExp} + */ + regularExpression(substringSearch = false) { + return new RegExp(this.regularExpressionString(substringSearch), "i"); + } + } + ipv6.Address6 = Address6; + return ipv6; +} +var hasRequiredIpAddress; +function requireIpAddress() { + if (hasRequiredIpAddress) return ipAddress; + hasRequiredIpAddress = 1; + (function(exports) { + var __createBinding = ipAddress && ipAddress.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = ipAddress && ipAddress.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = ipAddress && ipAddress.__importStar || function(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) { + for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.v6 = exports.AddressError = exports.Address6 = exports.Address4 = void 0; + const ipv4_1 = requireIpv4(); + Object.defineProperty(exports, "Address4", { enumerable: true, get: function() { + return ipv4_1.Address4; + } }); + const ipv6_1 = requireIpv6(); + Object.defineProperty(exports, "Address6", { enumerable: true, get: function() { + return ipv6_1.Address6; + } }); + const address_error_1 = requireAddressError(); + Object.defineProperty(exports, "AddressError", { enumerable: true, get: function() { + return address_error_1.AddressError; + } }); + const helpers2 = __importStar(requireHelpers$1()); + exports.v6 = { helpers: helpers2 }; + })(ipAddress); + return ipAddress; +} +var hasRequiredHelpers; +function requireHelpers() { + if (hasRequiredHelpers) return helpers$1; + hasRequiredHelpers = 1; + Object.defineProperty(helpers$1, "__esModule", { value: true }); + helpers$1.ipToBuffer = helpers$1.int32ToIpv4 = helpers$1.ipv4ToInt32 = helpers$1.validateSocksClientChainOptions = helpers$1.validateSocksClientOptions = void 0; + const util_1 = requireUtil(); + const constants_1 = requireConstants$2(); + const stream2 = requireBrowser$h(); + const ip_address_1 = requireIpAddress(); + const net2 = require$$1$2; + function validateSocksClientOptions(options2, acceptedCommands = ["connect", "bind", "associate"]) { + if (!constants_1.SocksCommand[options2.command]) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommand, options2); + } + if (acceptedCommands.indexOf(options2.command) === -1) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandForOperation, options2); + } + if (!isValidSocksRemoteHost(options2.destination)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options2); + } + if (!isValidSocksProxy(options2.proxy)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options2); + } + validateCustomProxyAuth(options2.proxy, options2); + if (options2.timeout && !isValidTimeoutValue(options2.timeout)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options2); + } + if (options2.existing_socket && !(options2.existing_socket instanceof stream2.Duplex)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsExistingSocket, options2); + } + } + helpers$1.validateSocksClientOptions = validateSocksClientOptions; + function validateSocksClientChainOptions(options2) { + if (options2.command !== "connect") { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandChain, options2); + } + if (!isValidSocksRemoteHost(options2.destination)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options2); + } + if (!(options2.proxies && Array.isArray(options2.proxies) && options2.proxies.length >= 2)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxiesLength, options2); + } + options2.proxies.forEach((proxy) => { + if (!isValidSocksProxy(proxy)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options2); + } + validateCustomProxyAuth(proxy, options2); + }); + if (options2.timeout && !isValidTimeoutValue(options2.timeout)) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options2); + } + } + helpers$1.validateSocksClientChainOptions = validateSocksClientChainOptions; + function validateCustomProxyAuth(proxy, options2) { + if (proxy.custom_auth_method !== void 0) { + if (proxy.custom_auth_method < constants_1.SOCKS5_CUSTOM_AUTH_START || proxy.custom_auth_method > constants_1.SOCKS5_CUSTOM_AUTH_END) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthRange, options2); + } + if (proxy.custom_auth_request_handler === void 0 || typeof proxy.custom_auth_request_handler !== "function") { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options2); + } + if (proxy.custom_auth_response_size === void 0) { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options2); + } + if (proxy.custom_auth_response_handler === void 0 || typeof proxy.custom_auth_response_handler !== "function") { + throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options2); + } + } + } + function isValidSocksRemoteHost(remoteHost) { + return remoteHost && typeof remoteHost.host === "string" && typeof remoteHost.port === "number" && remoteHost.port >= 0 && remoteHost.port <= 65535; + } + function isValidSocksProxy(proxy) { + return proxy && (typeof proxy.host === "string" || typeof proxy.ipaddress === "string") && typeof proxy.port === "number" && proxy.port >= 0 && proxy.port <= 65535 && (proxy.type === 4 || proxy.type === 5); + } + function isValidTimeoutValue(value) { + return typeof value === "number" && value > 0; + } + function ipv4ToInt32(ip) { + const address = new ip_address_1.Address4(ip); + return address.toArray().reduce((acc, part) => (acc << 8) + part, 0); + } + helpers$1.ipv4ToInt32 = ipv4ToInt32; + function int32ToIpv4(int32) { + const octet1 = int32 >>> 24 & 255; + const octet2 = int32 >>> 16 & 255; + const octet3 = int32 >>> 8 & 255; + const octet4 = int32 & 255; + return [octet1, octet2, octet3, octet4].join("."); + } + helpers$1.int32ToIpv4 = int32ToIpv4; + function ipToBuffer(ip) { + if (net2.isIPv4(ip)) { + const address = new ip_address_1.Address4(ip); + return Buffer.from(address.toArray()); + } else if (net2.isIPv6(ip)) { + const address = new ip_address_1.Address6(ip); + return Buffer.from(address.canonicalForm().split(":").map((segment) => segment.padStart(4, "0")).join(""), "hex"); + } else { + throw new Error("Invalid IP address format"); + } + } + helpers$1.ipToBuffer = ipToBuffer; + return helpers$1; +} +var receivebuffer = {}; +var hasRequiredReceivebuffer; +function requireReceivebuffer() { + if (hasRequiredReceivebuffer) return receivebuffer; + hasRequiredReceivebuffer = 1; + Object.defineProperty(receivebuffer, "__esModule", { value: true }); + receivebuffer.ReceiveBuffer = void 0; + class ReceiveBuffer { + constructor(size = 4096) { + this.buffer = Buffer.allocUnsafe(size); + this.offset = 0; + this.originalSize = size; + } + get length() { + return this.offset; + } + append(data2) { + if (!Buffer.isBuffer(data2)) { + throw new Error("Attempted to append a non-buffer instance to ReceiveBuffer."); + } + if (this.offset + data2.length >= this.buffer.length) { + const tmp = this.buffer; + this.buffer = Buffer.allocUnsafe(Math.max(this.buffer.length + this.originalSize, this.buffer.length + data2.length)); + tmp.copy(this.buffer); + } + data2.copy(this.buffer, this.offset); + return this.offset += data2.length; + } + peek(length) { + if (length > this.offset) { + throw new Error("Attempted to read beyond the bounds of the managed internal data."); + } + return this.buffer.slice(0, length); + } + get(length) { + if (length > this.offset) { + throw new Error("Attempted to read beyond the bounds of the managed internal data."); + } + const value = Buffer.allocUnsafe(length); + this.buffer.slice(0, length).copy(value); + this.buffer.copyWithin(0, length, length + this.offset - length); + this.offset -= length; + return value; + } + } + receivebuffer.ReceiveBuffer = ReceiveBuffer; + return receivebuffer; +} +var hasRequiredSocksclient; +function requireSocksclient() { + if (hasRequiredSocksclient) return socksclient; + hasRequiredSocksclient = 1; + (function(exports) { + var __awaiter = socksclient && socksclient.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.SocksClientError = exports.SocksClient = void 0; + const events_1 = requireEvents(); + const net2 = require$$1$2; + const smart_buffer_1 = requireSmartbuffer(); + const constants_1 = requireConstants$2(); + const helpers_1 = requireHelpers(); + const receivebuffer_1 = requireReceivebuffer(); + const util_1 = requireUtil(); + Object.defineProperty(exports, "SocksClientError", { enumerable: true, get: function() { + return util_1.SocksClientError; + } }); + const ip_address_1 = requireIpAddress(); + class SocksClient extends events_1.EventEmitter { + constructor(options2) { + super(); + this.options = Object.assign({}, options2); + (0, helpers_1.validateSocksClientOptions)(options2); + this.setState(constants_1.SocksClientState.Created); + } + /** + * Creates a new SOCKS connection. + * + * Note: Supports callbacks and promises. Only supports the connect command. + * @param options { SocksClientOptions } Options. + * @param callback { Function } An optional callback function. + * @returns { Promise } + */ + static createConnection(options2, callback) { + return new Promise((resolve, reject) => { + try { + (0, helpers_1.validateSocksClientOptions)(options2, ["connect"]); + } catch (err) { + if (typeof callback === "function") { + callback(err); + return resolve(err); + } else { + return reject(err); + } + } + const client = new SocksClient(options2); + client.connect(options2.existing_socket); + client.once("established", (info) => { + client.removeAllListeners(); + if (typeof callback === "function") { + callback(null, info); + resolve(info); + } else { + resolve(info); + } + }); + client.once("error", (err) => { + client.removeAllListeners(); + if (typeof callback === "function") { + callback(err); + resolve(err); + } else { + reject(err); + } + }); + }); + } + /** + * Creates a new SOCKS connection chain to a destination host through 2 or more SOCKS proxies. + * + * Note: Supports callbacks and promises. Only supports the connect method. + * Note: Implemented via createConnection() factory function. + * @param options { SocksClientChainOptions } Options + * @param callback { Function } An optional callback function. + * @returns { Promise } + */ + static createConnectionChain(options2, callback) { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + try { + (0, helpers_1.validateSocksClientChainOptions)(options2); + } catch (err) { + if (typeof callback === "function") { + callback(err); + return resolve(err); + } else { + return reject(err); + } + } + if (options2.randomizeChain) { + (0, util_1.shuffleArray)(options2.proxies); + } + try { + let sock; + for (let i = 0; i < options2.proxies.length; i++) { + const nextProxy = options2.proxies[i]; + const nextDestination = i === options2.proxies.length - 1 ? options2.destination : { + host: options2.proxies[i + 1].host || options2.proxies[i + 1].ipaddress, + port: options2.proxies[i + 1].port + }; + const result = yield SocksClient.createConnection({ + command: "connect", + proxy: nextProxy, + destination: nextDestination, + existing_socket: sock + }); + sock = sock || result.socket; + } + if (typeof callback === "function") { + callback(null, { socket: sock }); + resolve({ socket: sock }); + } else { + resolve({ socket: sock }); + } + } catch (err) { + if (typeof callback === "function") { + callback(err); + resolve(err); + } else { + reject(err); + } + } + })); + } + /** + * Creates a SOCKS UDP Frame. + * @param options + */ + static createUDPFrame(options2) { + const buff = new smart_buffer_1.SmartBuffer(); + buff.writeUInt16BE(0); + buff.writeUInt8(options2.frameNumber || 0); + if (net2.isIPv4(options2.remoteHost.host)) { + buff.writeUInt8(constants_1.Socks5HostType.IPv4); + buff.writeUInt32BE((0, helpers_1.ipv4ToInt32)(options2.remoteHost.host)); + } else if (net2.isIPv6(options2.remoteHost.host)) { + buff.writeUInt8(constants_1.Socks5HostType.IPv6); + buff.writeBuffer((0, helpers_1.ipToBuffer)(options2.remoteHost.host)); + } else { + buff.writeUInt8(constants_1.Socks5HostType.Hostname); + buff.writeUInt8(Buffer.byteLength(options2.remoteHost.host)); + buff.writeString(options2.remoteHost.host); + } + buff.writeUInt16BE(options2.remoteHost.port); + buff.writeBuffer(options2.data); + return buff.toBuffer(); + } + /** + * Parses a SOCKS UDP frame. + * @param data + */ + static parseUDPFrame(data2) { + const buff = smart_buffer_1.SmartBuffer.fromBuffer(data2); + buff.readOffset = 2; + const frameNumber = buff.readUInt8(); + const hostType = buff.readUInt8(); + let remoteHost; + if (hostType === constants_1.Socks5HostType.IPv4) { + remoteHost = (0, helpers_1.int32ToIpv4)(buff.readUInt32BE()); + } else if (hostType === constants_1.Socks5HostType.IPv6) { + remoteHost = ip_address_1.Address6.fromByteArray(Array.from(buff.readBuffer(16))).canonicalForm(); + } else { + remoteHost = buff.readString(buff.readUInt8()); + } + const remotePort = buff.readUInt16BE(); + return { + frameNumber, + remoteHost: { + host: remoteHost, + port: remotePort + }, + data: buff.readBuffer() + }; + } + /** + * Internal state setter. If the SocksClient is in an error state, it cannot be changed to a non error state. + */ + setState(newState) { + if (this.state !== constants_1.SocksClientState.Error) { + this.state = newState; + } + } + /** + * Starts the connection establishment to the proxy and destination. + * @param existingSocket Connected socket to use instead of creating a new one (internal use). + */ + connect(existingSocket) { + this.onDataReceived = (data2) => this.onDataReceivedHandler(data2); + this.onClose = () => this.onCloseHandler(); + this.onError = (err) => this.onErrorHandler(err); + this.onConnect = () => this.onConnectHandler(); + const timer = setTimeout(() => this.onEstablishedTimeout(), this.options.timeout || constants_1.DEFAULT_TIMEOUT); + if (timer.unref && typeof timer.unref === "function") { + timer.unref(); + } + if (existingSocket) { + this.socket = existingSocket; + } else { + this.socket = new net2.Socket(); + } + this.socket.once("close", this.onClose); + this.socket.once("error", this.onError); + this.socket.once("connect", this.onConnect); + this.socket.on("data", this.onDataReceived); + this.setState(constants_1.SocksClientState.Connecting); + this.receiveBuffer = new receivebuffer_1.ReceiveBuffer(); + if (existingSocket) { + this.socket.emit("connect"); + } else { + this.socket.connect(this.getSocketOptions()); + if (this.options.set_tcp_nodelay !== void 0 && this.options.set_tcp_nodelay !== null) { + this.socket.setNoDelay(!!this.options.set_tcp_nodelay); + } + } + this.prependOnceListener("established", (info) => { + setImmediate(() => { + if (this.receiveBuffer.length > 0) { + const excessData = this.receiveBuffer.get(this.receiveBuffer.length); + info.socket.emit("data", excessData); + } + info.socket.resume(); + }); + }); + } + // Socket options (defaults host/port to options.proxy.host/options.proxy.port) + getSocketOptions() { + return Object.assign(Object.assign({}, this.options.socket_options), { host: this.options.proxy.host || this.options.proxy.ipaddress, port: this.options.proxy.port }); + } + /** + * Handles internal Socks timeout callback. + * Note: If the Socks client is not BoundWaitingForConnection or Established, the connection will be closed. + */ + onEstablishedTimeout() { + if (this.state !== constants_1.SocksClientState.Established && this.state !== constants_1.SocksClientState.BoundWaitingForConnection) { + this.closeSocket(constants_1.ERRORS.ProxyConnectionTimedOut); + } + } + /** + * Handles Socket connect event. + */ + onConnectHandler() { + this.setState(constants_1.SocksClientState.Connected); + if (this.options.proxy.type === 4) { + this.sendSocks4InitialHandshake(); + } else { + this.sendSocks5InitialHandshake(); + } + this.setState(constants_1.SocksClientState.SentInitialHandshake); + } + /** + * Handles Socket data event. + * @param data + */ + onDataReceivedHandler(data2) { + this.receiveBuffer.append(data2); + this.processData(); + } + /** + * Handles processing of the data we have received. + */ + processData() { + while (this.state !== constants_1.SocksClientState.Established && this.state !== constants_1.SocksClientState.Error && this.receiveBuffer.length >= this.nextRequiredPacketBufferSize) { + if (this.state === constants_1.SocksClientState.SentInitialHandshake) { + if (this.options.proxy.type === 4) { + this.handleSocks4FinalHandshakeResponse(); + } else { + this.handleInitialSocks5HandshakeResponse(); + } + } else if (this.state === constants_1.SocksClientState.SentAuthentication) { + this.handleInitialSocks5AuthenticationHandshakeResponse(); + } else if (this.state === constants_1.SocksClientState.SentFinalHandshake) { + this.handleSocks5FinalHandshakeResponse(); + } else if (this.state === constants_1.SocksClientState.BoundWaitingForConnection) { + if (this.options.proxy.type === 4) { + this.handleSocks4IncomingConnectionResponse(); + } else { + this.handleSocks5IncomingConnectionResponse(); + } + } else { + this.closeSocket(constants_1.ERRORS.InternalError); + break; + } + } + } + /** + * Handles Socket close event. + * @param had_error + */ + onCloseHandler() { + this.closeSocket(constants_1.ERRORS.SocketClosed); + } + /** + * Handles Socket error event. + * @param err + */ + onErrorHandler(err) { + this.closeSocket(err.message); + } + /** + * Removes internal event listeners on the underlying Socket. + */ + removeInternalSocketHandlers() { + this.socket.pause(); + this.socket.removeListener("data", this.onDataReceived); + this.socket.removeListener("close", this.onClose); + this.socket.removeListener("error", this.onError); + this.socket.removeListener("connect", this.onConnect); + } + /** + * Closes and destroys the underlying Socket. Emits an error event. + * @param err { String } An error string to include in error event. + */ + closeSocket(err) { + if (this.state !== constants_1.SocksClientState.Error) { + this.setState(constants_1.SocksClientState.Error); + this.socket.destroy(); + this.removeInternalSocketHandlers(); + this.emit("error", new util_1.SocksClientError(err, this.options)); + } + } + /** + * Sends initial Socks v4 handshake request. + */ + sendSocks4InitialHandshake() { + const userId = this.options.proxy.userId || ""; + const buff = new smart_buffer_1.SmartBuffer(); + buff.writeUInt8(4); + buff.writeUInt8(constants_1.SocksCommand[this.options.command]); + buff.writeUInt16BE(this.options.destination.port); + if (net2.isIPv4(this.options.destination.host)) { + buff.writeBuffer((0, helpers_1.ipToBuffer)(this.options.destination.host)); + buff.writeStringNT(userId); + } else { + buff.writeUInt8(0); + buff.writeUInt8(0); + buff.writeUInt8(0); + buff.writeUInt8(1); + buff.writeStringNT(userId); + buff.writeStringNT(this.options.destination.host); + } + this.nextRequiredPacketBufferSize = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks4Response; + this.socket.write(buff.toBuffer()); + } + /** + * Handles Socks v4 handshake response. + * @param data + */ + handleSocks4FinalHandshakeResponse() { + const data2 = this.receiveBuffer.get(8); + if (data2[1] !== constants_1.Socks4Response.Granted) { + this.closeSocket(`${constants_1.ERRORS.Socks4ProxyRejectedConnection} - (${constants_1.Socks4Response[data2[1]]})`); + } else { + if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.bind) { + const buff = smart_buffer_1.SmartBuffer.fromBuffer(data2); + buff.readOffset = 2; + const remoteHost = { + port: buff.readUInt16BE(), + host: (0, helpers_1.int32ToIpv4)(buff.readUInt32BE()) + }; + if (remoteHost.host === "0.0.0.0") { + remoteHost.host = this.options.proxy.ipaddress; + } + this.setState(constants_1.SocksClientState.BoundWaitingForConnection); + this.emit("bound", { remoteHost, socket: this.socket }); + } else { + this.setState(constants_1.SocksClientState.Established); + this.removeInternalSocketHandlers(); + this.emit("established", { socket: this.socket }); + } + } + } + /** + * Handles Socks v4 incoming connection request (BIND) + * @param data + */ + handleSocks4IncomingConnectionResponse() { + const data2 = this.receiveBuffer.get(8); + if (data2[1] !== constants_1.Socks4Response.Granted) { + this.closeSocket(`${constants_1.ERRORS.Socks4ProxyRejectedIncomingBoundConnection} - (${constants_1.Socks4Response[data2[1]]})`); + } else { + const buff = smart_buffer_1.SmartBuffer.fromBuffer(data2); + buff.readOffset = 2; + const remoteHost = { + port: buff.readUInt16BE(), + host: (0, helpers_1.int32ToIpv4)(buff.readUInt32BE()) + }; + this.setState(constants_1.SocksClientState.Established); + this.removeInternalSocketHandlers(); + this.emit("established", { remoteHost, socket: this.socket }); + } + } + /** + * Sends initial Socks v5 handshake request. + */ + sendSocks5InitialHandshake() { + const buff = new smart_buffer_1.SmartBuffer(); + const supportedAuthMethods = [constants_1.Socks5Auth.NoAuth]; + if (this.options.proxy.userId || this.options.proxy.password) { + supportedAuthMethods.push(constants_1.Socks5Auth.UserPass); + } + if (this.options.proxy.custom_auth_method !== void 0) { + supportedAuthMethods.push(this.options.proxy.custom_auth_method); + } + buff.writeUInt8(5); + buff.writeUInt8(supportedAuthMethods.length); + for (const authMethod of supportedAuthMethods) { + buff.writeUInt8(authMethod); + } + this.nextRequiredPacketBufferSize = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5InitialHandshakeResponse; + this.socket.write(buff.toBuffer()); + this.setState(constants_1.SocksClientState.SentInitialHandshake); + } + /** + * Handles initial Socks v5 handshake response. + * @param data + */ + handleInitialSocks5HandshakeResponse() { + const data2 = this.receiveBuffer.get(2); + if (data2[0] !== 5) { + this.closeSocket(constants_1.ERRORS.InvalidSocks5IntiailHandshakeSocksVersion); + } else if (data2[1] === constants_1.SOCKS5_NO_ACCEPTABLE_AUTH) { + this.closeSocket(constants_1.ERRORS.InvalidSocks5InitialHandshakeNoAcceptedAuthType); + } else { + if (data2[1] === constants_1.Socks5Auth.NoAuth) { + this.socks5ChosenAuthType = constants_1.Socks5Auth.NoAuth; + this.sendSocks5CommandRequest(); + } else if (data2[1] === constants_1.Socks5Auth.UserPass) { + this.socks5ChosenAuthType = constants_1.Socks5Auth.UserPass; + this.sendSocks5UserPassAuthentication(); + } else if (data2[1] === this.options.proxy.custom_auth_method) { + this.socks5ChosenAuthType = this.options.proxy.custom_auth_method; + this.sendSocks5CustomAuthentication(); + } else { + this.closeSocket(constants_1.ERRORS.InvalidSocks5InitialHandshakeUnknownAuthType); + } + } + } + /** + * Sends Socks v5 user & password auth handshake. + * + * Note: No auth and user/pass are currently supported. + */ + sendSocks5UserPassAuthentication() { + const userId = this.options.proxy.userId || ""; + const password = this.options.proxy.password || ""; + const buff = new smart_buffer_1.SmartBuffer(); + buff.writeUInt8(1); + buff.writeUInt8(Buffer.byteLength(userId)); + buff.writeString(userId); + buff.writeUInt8(Buffer.byteLength(password)); + buff.writeString(password); + this.nextRequiredPacketBufferSize = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5UserPassAuthenticationResponse; + this.socket.write(buff.toBuffer()); + this.setState(constants_1.SocksClientState.SentAuthentication); + } + sendSocks5CustomAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + this.nextRequiredPacketBufferSize = this.options.proxy.custom_auth_response_size; + this.socket.write(yield this.options.proxy.custom_auth_request_handler()); + this.setState(constants_1.SocksClientState.SentAuthentication); + }); + } + handleSocks5CustomAuthHandshakeResponse(data2) { + return __awaiter(this, void 0, void 0, function* () { + return yield this.options.proxy.custom_auth_response_handler(data2); + }); + } + handleSocks5AuthenticationNoAuthHandshakeResponse(data2) { + return __awaiter(this, void 0, void 0, function* () { + return data2[1] === 0; + }); + } + handleSocks5AuthenticationUserPassHandshakeResponse(data2) { + return __awaiter(this, void 0, void 0, function* () { + return data2[1] === 0; + }); + } + /** + * Handles Socks v5 auth handshake response. + * @param data + */ + handleInitialSocks5AuthenticationHandshakeResponse() { + return __awaiter(this, void 0, void 0, function* () { + this.setState(constants_1.SocksClientState.ReceivedAuthenticationResponse); + let authResult = false; + if (this.socks5ChosenAuthType === constants_1.Socks5Auth.NoAuth) { + authResult = yield this.handleSocks5AuthenticationNoAuthHandshakeResponse(this.receiveBuffer.get(2)); + } else if (this.socks5ChosenAuthType === constants_1.Socks5Auth.UserPass) { + authResult = yield this.handleSocks5AuthenticationUserPassHandshakeResponse(this.receiveBuffer.get(2)); + } else if (this.socks5ChosenAuthType === this.options.proxy.custom_auth_method) { + authResult = yield this.handleSocks5CustomAuthHandshakeResponse(this.receiveBuffer.get(this.options.proxy.custom_auth_response_size)); + } + if (!authResult) { + this.closeSocket(constants_1.ERRORS.Socks5AuthenticationFailed); + } else { + this.sendSocks5CommandRequest(); + } + }); + } + /** + * Sends Socks v5 final handshake request. + */ + sendSocks5CommandRequest() { + const buff = new smart_buffer_1.SmartBuffer(); + buff.writeUInt8(5); + buff.writeUInt8(constants_1.SocksCommand[this.options.command]); + buff.writeUInt8(0); + if (net2.isIPv4(this.options.destination.host)) { + buff.writeUInt8(constants_1.Socks5HostType.IPv4); + buff.writeBuffer((0, helpers_1.ipToBuffer)(this.options.destination.host)); + } else if (net2.isIPv6(this.options.destination.host)) { + buff.writeUInt8(constants_1.Socks5HostType.IPv6); + buff.writeBuffer((0, helpers_1.ipToBuffer)(this.options.destination.host)); + } else { + buff.writeUInt8(constants_1.Socks5HostType.Hostname); + buff.writeUInt8(this.options.destination.host.length); + buff.writeString(this.options.destination.host); + } + buff.writeUInt16BE(this.options.destination.port); + this.nextRequiredPacketBufferSize = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHeader; + this.socket.write(buff.toBuffer()); + this.setState(constants_1.SocksClientState.SentFinalHandshake); + } + /** + * Handles Socks v5 final handshake response. + * @param data + */ + handleSocks5FinalHandshakeResponse() { + const header = this.receiveBuffer.peek(5); + if (header[0] !== 5 || header[1] !== constants_1.Socks5Response.Granted) { + this.closeSocket(`${constants_1.ERRORS.InvalidSocks5FinalHandshakeRejected} - ${constants_1.Socks5Response[header[1]]}`); + } else { + const addressType = header[3]; + let remoteHost; + let buff; + if (addressType === constants_1.Socks5HostType.IPv4) { + const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv4; + if (this.receiveBuffer.length < dataNeeded) { + this.nextRequiredPacketBufferSize = dataNeeded; + return; + } + buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4)); + remoteHost = { + host: (0, helpers_1.int32ToIpv4)(buff.readUInt32BE()), + port: buff.readUInt16BE() + }; + if (remoteHost.host === "0.0.0.0") { + remoteHost.host = this.options.proxy.ipaddress; + } + } else if (addressType === constants_1.Socks5HostType.Hostname) { + const hostLength = header[4]; + const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHostname(hostLength); + if (this.receiveBuffer.length < dataNeeded) { + this.nextRequiredPacketBufferSize = dataNeeded; + return; + } + buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(5)); + remoteHost = { + host: buff.readString(hostLength), + port: buff.readUInt16BE() + }; + } else if (addressType === constants_1.Socks5HostType.IPv6) { + const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv6; + if (this.receiveBuffer.length < dataNeeded) { + this.nextRequiredPacketBufferSize = dataNeeded; + return; + } + buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4)); + remoteHost = { + host: ip_address_1.Address6.fromByteArray(Array.from(buff.readBuffer(16))).canonicalForm(), + port: buff.readUInt16BE() + }; + } + this.setState(constants_1.SocksClientState.ReceivedFinalResponse); + if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.connect) { + this.setState(constants_1.SocksClientState.Established); + this.removeInternalSocketHandlers(); + this.emit("established", { remoteHost, socket: this.socket }); + } else if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.bind) { + this.setState(constants_1.SocksClientState.BoundWaitingForConnection); + this.nextRequiredPacketBufferSize = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHeader; + this.emit("bound", { remoteHost, socket: this.socket }); + } else if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.associate) { + this.setState(constants_1.SocksClientState.Established); + this.removeInternalSocketHandlers(); + this.emit("established", { + remoteHost, + socket: this.socket + }); + } + } + } + /** + * Handles Socks v5 incoming connection request (BIND). + */ + handleSocks5IncomingConnectionResponse() { + const header = this.receiveBuffer.peek(5); + if (header[0] !== 5 || header[1] !== constants_1.Socks5Response.Granted) { + this.closeSocket(`${constants_1.ERRORS.Socks5ProxyRejectedIncomingBoundConnection} - ${constants_1.Socks5Response[header[1]]}`); + } else { + const addressType = header[3]; + let remoteHost; + let buff; + if (addressType === constants_1.Socks5HostType.IPv4) { + const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv4; + if (this.receiveBuffer.length < dataNeeded) { + this.nextRequiredPacketBufferSize = dataNeeded; + return; + } + buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4)); + remoteHost = { + host: (0, helpers_1.int32ToIpv4)(buff.readUInt32BE()), + port: buff.readUInt16BE() + }; + if (remoteHost.host === "0.0.0.0") { + remoteHost.host = this.options.proxy.ipaddress; + } + } else if (addressType === constants_1.Socks5HostType.Hostname) { + const hostLength = header[4]; + const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHostname(hostLength); + if (this.receiveBuffer.length < dataNeeded) { + this.nextRequiredPacketBufferSize = dataNeeded; + return; + } + buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(5)); + remoteHost = { + host: buff.readString(hostLength), + port: buff.readUInt16BE() + }; + } else if (addressType === constants_1.Socks5HostType.IPv6) { + const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv6; + if (this.receiveBuffer.length < dataNeeded) { + this.nextRequiredPacketBufferSize = dataNeeded; + return; + } + buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4)); + remoteHost = { + host: ip_address_1.Address6.fromByteArray(Array.from(buff.readBuffer(16))).canonicalForm(), + port: buff.readUInt16BE() + }; + } + this.setState(constants_1.SocksClientState.Established); + this.removeInternalSocketHandlers(); + this.emit("established", { remoteHost, socket: this.socket }); + } + } + get socksClientOptions() { + return Object.assign({}, this.options); + } + } + exports.SocksClient = SocksClient; + })(socksclient); + return socksclient; +} +var hasRequiredBuild; +function requireBuild() { + if (hasRequiredBuild) return build; + hasRequiredBuild = 1; + (function(exports) { + var __createBinding = build && build.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) k2 = k; + o[k2] = m[k]; + }); + var __exportStar = build && build.__exportStar || function(m, exports2) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) __createBinding(exports2, m, p); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + __exportStar(requireSocksclient(), exports); + })(build); + return build; +} +var hasRequiredAgent; +function requireAgent() { + if (hasRequiredAgent) return agent; + hasRequiredAgent = 1; + var __awaiter = agent && agent.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __importDefault = agent && agent.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(agent, "__esModule", { value: true }); + const dns_1 = __importDefault(require$$0$3); + const tls_1 = __importDefault(require$$1$1); + const url_1 = __importDefault(require$$1$5); + const debug_1 = __importDefault(requireBrowser$f()); + const agent_base_1 = requireSrc(); + const socks_1 = requireBuild(); + const debug2 = debug_1.default("socks-proxy-agent"); + function dnsLookup(host) { + return new Promise((resolve, reject) => { + dns_1.default.lookup(host, (err, res) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + }); + } + function parseSocksProxy(opts) { + let port = 0; + let lookup = false; + let type2 = 5; + const host = opts.hostname || opts.host; + if (!host) { + throw new TypeError('No "host"'); + } + if (typeof opts.port === "number") { + port = opts.port; + } else if (typeof opts.port === "string") { + port = parseInt(opts.port, 10); + } + if (!port) { + port = 1080; + } + if (opts.protocol) { + switch (opts.protocol.replace(":", "")) { + case "socks4": + lookup = true; + // pass through + case "socks4a": + type2 = 4; + break; + case "socks5": + lookup = true; + // pass through + case "socks": + // no version specified, default to 5h + case "socks5h": + type2 = 5; + break; + default: + throw new TypeError(`A "socks" protocol must be specified! Got: ${opts.protocol}`); + } + } + if (typeof opts.type !== "undefined") { + if (opts.type === 4 || opts.type === 5) { + type2 = opts.type; + } else { + throw new TypeError(`"type" must be 4 or 5, got: ${opts.type}`); + } + } + const proxy = { + host, + port, + type: type2 + }; + let userId = opts.userId || opts.username; + let password = opts.password; + if (opts.auth) { + const auth = opts.auth.split(":"); + userId = auth[0]; + password = auth[1]; + } + if (userId) { + Object.defineProperty(proxy, "userId", { + value: userId, + enumerable: false + }); + } + if (password) { + Object.defineProperty(proxy, "password", { + value: password, + enumerable: false + }); + } + return { lookup, proxy }; + } + class SocksProxyAgent2 extends agent_base_1.Agent { + constructor(_opts) { + let opts; + if (typeof _opts === "string") { + opts = url_1.default.parse(_opts); + } else { + opts = _opts; + } + if (!opts) { + throw new TypeError("a SOCKS proxy server `host` and `port` must be specified!"); + } + super(opts); + const parsedProxy = parseSocksProxy(opts); + this.lookup = parsedProxy.lookup; + this.proxy = parsedProxy.proxy; + this.tlsConnectionOptions = opts.tls || {}; + } + /** + * Initiates a SOCKS connection to the specified SOCKS proxy server, + * which in turn connects to the specified remote host and port. + * + * @api protected + */ + callback(req, opts) { + return __awaiter(this, void 0, void 0, function* () { + const { lookup, proxy } = this; + let { host, port, timeout } = opts; + if (!host) { + throw new Error("No `host` defined!"); + } + if (lookup) { + host = yield dnsLookup(host); + } + const socksOpts = { + proxy, + destination: { host, port }, + command: "connect", + timeout + }; + debug2("Creating socks proxy connection: %o", socksOpts); + const { socket } = yield socks_1.SocksClient.createConnection(socksOpts); + debug2("Successfully created socks proxy connection"); + if (opts.secureEndpoint) { + debug2("Upgrading socket connection to TLS"); + const servername = opts.servername || opts.host; + return tls_1.default.connect(Object.assign(Object.assign(Object.assign({}, omit(opts, "host", "hostname", "path", "port")), { + socket, + servername + }), this.tlsConnectionOptions)); + } + return socket; + }); + } + } + agent.default = SocksProxyAgent2; + function omit(obj, ...keys) { + const ret = {}; + let key2; + for (key2 in obj) { + if (!keys.includes(key2)) { + ret[key2] = obj[key2]; + } + } + return ret; + } + return agent; +} +var dist; +var hasRequiredDist; +function requireDist() { + if (hasRequiredDist) return dist; + hasRequiredDist = 1; + var __importDefault = dist && dist.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + const agent_1 = __importDefault(requireAgent()); + function createSocksProxyAgent(opts) { + return new agent_1.default(opts); + } + (function(createSocksProxyAgent2) { + createSocksProxyAgent2.SocksProxyAgent = agent_1.default; + createSocksProxyAgent2.prototype = agent_1.default.prototype; + })(createSocksProxyAgent || (createSocksProxyAgent = {})); + dist = createSocksProxyAgent; + return dist; +} +var distExports = requireDist(); +const ALIAS = Symbol.for("yaml.alias"); +const DOC = Symbol.for("yaml.document"); +const MAP = Symbol.for("yaml.map"); +const PAIR = Symbol.for("yaml.pair"); +const SCALAR$1 = Symbol.for("yaml.scalar"); +const SEQ = Symbol.for("yaml.seq"); +const NODE_TYPE = Symbol.for("yaml.node.type"); +const isAlias = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === ALIAS; +const isDocument = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === DOC; +const isMap = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === MAP; +const isPair = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === PAIR; +const isScalar$1 = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === SCALAR$1; +const isSeq = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === SEQ; +function isCollection$1(node2) { + if (node2 && typeof node2 === "object") + switch (node2[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; +} +function isNode(node2) { + if (node2 && typeof node2 === "object") + switch (node2[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR$1: + case SEQ: + return true; + } + return false; +} +const hasAnchor = (node2) => (isScalar$1(node2) || isCollection$1(node2)) && !!node2.anchor; +const BREAK$1 = Symbol("break visit"); +const SKIP$1 = Symbol("skip children"); +const REMOVE$1 = Symbol("remove node"); +function visit$1(node2, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node2)) { + const cd = visit_(null, node2.contents, visitor_, Object.freeze([node2])); + if (cd === REMOVE$1) + node2.contents = null; + } else + visit_(null, node2, visitor_, Object.freeze([])); +} +visit$1.BREAK = BREAK$1; +visit$1.SKIP = SKIP$1; +visit$1.REMOVE = REMOVE$1; +function visit_(key2, node2, visitor, path2) { + const ctrl = callVisitor(key2, node2, visitor, path2); + if (isNode(ctrl) || isPair(ctrl)) { + replaceNode(key2, path2, ctrl); + return visit_(key2, ctrl, visitor, path2); + } + if (typeof ctrl !== "symbol") { + if (isCollection$1(node2)) { + path2 = Object.freeze(path2.concat(node2)); + for (let i = 0; i < node2.items.length; ++i) { + const ci = visit_(i, node2.items[i], visitor, path2); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK$1) + return BREAK$1; + else if (ci === REMOVE$1) { + node2.items.splice(i, 1); + i -= 1; + } + } + } else if (isPair(node2)) { + path2 = Object.freeze(path2.concat(node2)); + const ck = visit_("key", node2.key, visitor, path2); + if (ck === BREAK$1) + return BREAK$1; + else if (ck === REMOVE$1) + node2.key = null; + const cv = visit_("value", node2.value, visitor, path2); + if (cv === BREAK$1) + return BREAK$1; + else if (cv === REMOVE$1) + node2.value = null; + } + } + return ctrl; +} +async function visitAsync(node2, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node2)) { + const cd = await visitAsync_(null, node2.contents, visitor_, Object.freeze([node2])); + if (cd === REMOVE$1) + node2.contents = null; + } else + await visitAsync_(null, node2, visitor_, Object.freeze([])); +} +visitAsync.BREAK = BREAK$1; +visitAsync.SKIP = SKIP$1; +visitAsync.REMOVE = REMOVE$1; +async function visitAsync_(key2, node2, visitor, path2) { + const ctrl = await callVisitor(key2, node2, visitor, path2); + if (isNode(ctrl) || isPair(ctrl)) { + replaceNode(key2, path2, ctrl); + return visitAsync_(key2, ctrl, visitor, path2); + } + if (typeof ctrl !== "symbol") { + if (isCollection$1(node2)) { + path2 = Object.freeze(path2.concat(node2)); + for (let i = 0; i < node2.items.length; ++i) { + const ci = await visitAsync_(i, node2.items[i], visitor, path2); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK$1) + return BREAK$1; + else if (ci === REMOVE$1) { + node2.items.splice(i, 1); + i -= 1; + } + } + } else if (isPair(node2)) { + path2 = Object.freeze(path2.concat(node2)); + const ck = await visitAsync_("key", node2.key, visitor, path2); + if (ck === BREAK$1) + return BREAK$1; + else if (ck === REMOVE$1) + node2.key = null; + const cv = await visitAsync_("value", node2.value, visitor, path2); + if (cv === BREAK$1) + return BREAK$1; + else if (cv === REMOVE$1) + node2.value = null; + } + } + return ctrl; +} +function initVisitor(visitor) { + if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { + return Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + return visitor; +} +function callVisitor(key2, node2, visitor, path2) { + var _a2, _b2, _c2, _d2, _e2; + if (typeof visitor === "function") + return visitor(key2, node2, path2); + if (isMap(node2)) + return (_a2 = visitor.Map) == null ? void 0 : _a2.call(visitor, key2, node2, path2); + if (isSeq(node2)) + return (_b2 = visitor.Seq) == null ? void 0 : _b2.call(visitor, key2, node2, path2); + if (isPair(node2)) + return (_c2 = visitor.Pair) == null ? void 0 : _c2.call(visitor, key2, node2, path2); + if (isScalar$1(node2)) + return (_d2 = visitor.Scalar) == null ? void 0 : _d2.call(visitor, key2, node2, path2); + if (isAlias(node2)) + return (_e2 = visitor.Alias) == null ? void 0 : _e2.call(visitor, key2, node2, path2); + return void 0; +} +function replaceNode(key2, path2, node2) { + const parent = path2[path2.length - 1]; + if (isCollection$1(parent)) { + parent.items[key2] = node2; + } else if (isPair(parent)) { + if (key2 === "key") + parent.key = node2; + else + parent.value = node2; + } else if (isDocument(parent)) { + parent.contents = node2; + } else { + const pt = isAlias(parent) ? "alias" : "scalar"; + throw new Error(`Cannot replace node with ${pt} parent`); + } +} +const escapeChars = { + "!": "%21", + ",": "%2C", + "[": "%5B", + "]": "%5D", + "{": "%7B", + "}": "%7D" +}; +const escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); +class Directives { + constructor(yaml2, tags) { + this.docStart = null; + this.docEnd = false; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml2); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy = new Directives(this.yaml, this.tags); + copy.docStart = this.docStart; + return copy; + } + /** + * During parsing, get a Directives instance for the current document and + * update the stream state according to the current version's spec. + */ + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case "1.1": + this.atNextDocument = true; + break; + case "1.2": + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: "1.2" + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + /** + * @param onError - May be called even if the action was successful + * @returns `true` on success + */ + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name = parts.shift(); + switch (name) { + case "%TAG": { + if (parts.length !== 2) { + onError(0, "%TAG directive should contain exactly two parts"); + if (parts.length < 2) + return false; + } + const [handle, prefix] = parts; + this.tags[handle] = prefix; + return true; + } + case "%YAML": { + this.yaml.explicit = true; + if (parts.length !== 1) { + onError(0, "%YAML directive should contain exactly one part"); + return false; + } + const [version2] = parts; + if (version2 === "1.1" || version2 === "1.2") { + this.yaml.version = version2; + return true; + } else { + const isValid = /^\d+\.\d+$/.test(version2); + onError(6, `Unsupported YAML version ${version2}`, isValid); + return false; + } + } + default: + onError(0, `Unknown directive ${name}`, true); + return false; + } + } + /** + * Resolves a tag, matching handles to those defined in %TAG directives. + * + * @returns Resolved tag, which may also be the non-specific tag `'!'` or a + * `'!local'` tag, or `null` if unresolvable. + */ + tagName(source2, onError) { + if (source2 === "!") + return "!"; + if (source2[0] !== "!") { + onError(`Not a valid tag: ${source2}`); + return null; + } + if (source2[1] === "<") { + const verbatim = source2.slice(2, -1); + if (verbatim === "!" || verbatim === "!!") { + onError(`Verbatim tags aren't resolved, so ${source2} is invalid.`); + return null; + } + if (source2[source2.length - 1] !== ">") + onError("Verbatim tags must end with a >"); + return verbatim; + } + const [, handle, suffix] = source2.match(/^(.*!)([^!]*)$/s); + if (!suffix) + onError(`The ${source2} tag has no suffix`); + const prefix = this.tags[handle]; + if (prefix) { + try { + return prefix + decodeURIComponent(suffix); + } catch (error2) { + onError(String(error2)); + return null; + } + } + if (handle === "!") + return source2; + onError(`Could not resolve tag: ${source2}`); + return null; + } + /** + * Given a fully resolved tag, returns its printable string form, + * taking into account current tag prefixes and defaults. + */ + tagString(tag) { + for (const [handle, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === "!" ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && isNode(doc.contents)) { + const tags = {}; + visit$1(doc.contents, (_key, node2) => { + if (isNode(node2) && node2.tag) + tags[node2.tag] = true; + }); + tagNames = Object.keys(tags); + } else + tagNames = []; + for (const [handle, prefix] of tagEntries) { + if (handle === "!!" && prefix === "tag:yaml.org,2002:") + continue; + if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) + lines.push(`%TAG ${handle} ${prefix}`); + } + return lines.join("\n"); + } +} +Directives.defaultYaml = { explicit: false, version: "1.2" }; +Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; +function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; +} +function anchorNames(root) { + const anchors = /* @__PURE__ */ new Set(); + visit$1(root, { + Value(_key, node2) { + if (node2.anchor) + anchors.add(node2.anchor); + } + }); + return anchors; +} +function findNewAnchor(prefix, exclude) { + for (let i = 1; true; ++i) { + const name = `${prefix}${i}`; + if (!exclude.has(name)) + return name; + } +} +function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = /* @__PURE__ */ new Map(); + let prevAnchors = null; + return { + onAnchor: (source2) => { + aliasObjects.push(source2); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + /** + * With circular references, the source node is only resolved after all + * of its child nodes are. This is why anchors are set only after all of + * the nodes have been created. + */ + setAnchors: () => { + for (const source2 of aliasObjects) { + const ref2 = sourceObjects.get(source2); + if (typeof ref2 === "object" && ref2.anchor && (isScalar$1(ref2.node) || isCollection$1(ref2.node))) { + ref2.node.anchor = ref2.anchor; + } else { + const error2 = new Error("Failed to resolve repeated object (this should not happen)"); + error2.source = source2; + throw error2; + } + } + }, + sourceObjects + }; +} +function applyReviver(reviver, obj, key2, val) { + if (val && typeof val === "object") { + if (Array.isArray(val)) { + for (let i = 0, len = val.length; i < len; ++i) { + const v0 = val[i]; + const v1 = applyReviver(reviver, val, String(i), v0); + if (v1 === void 0) + delete val[i]; + else if (v1 !== v0) + val[i] = v1; + } + } else if (val instanceof Map) { + for (const k of Array.from(val.keys())) { + const v0 = val.get(k); + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + val.delete(k); + else if (v1 !== v0) + val.set(k, v1); + } + } else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === void 0) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } else { + for (const [k, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + delete val[k]; + else if (v1 !== v0) + val[k] = v1; + } + } + } + return reviver.call(obj, key2, val); +} +function toJS(value, arg, ctx) { + if (Array.isArray(value)) + return value.map((v, i) => toJS(v, String(i), ctx)); + if (value && typeof value.toJSON === "function") { + if (!ctx || !hasAnchor(value)) + return value.toJSON(arg, ctx); + const data2 = { aliasCount: 0, count: 1, res: void 0 }; + ctx.anchors.set(value, data2); + ctx.onCreate = (res2) => { + data2.res = res2; + delete ctx.onCreate; + }; + const res = value.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep)) + return Number(value); + return value; +} +class NodeBase { + constructor(type2) { + Object.defineProperty(this, NODE_TYPE, { value: type2 }); + } + /** Create a copy of this node. */ + clone() { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** A plain JavaScript representation of this node. */ + toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + if (!isDocument(doc)) + throw new TypeError("A document argument is required"); + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc, + keep: true, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS(this, "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; + } +} +class Alias extends NodeBase { + constructor(source2) { + super(ALIAS); + this.source = source2; + Object.defineProperty(this, "tag", { + set() { + throw new Error("Alias nodes cannot have tags"); + } + }); + } + /** + * Resolve the value of this alias within `doc`, finding the last + * instance of the `source` anchor before this node. + */ + resolve(doc) { + let found = void 0; + visit$1(doc, { + Node: (_key, node2) => { + if (node2 === this) + return visit$1.BREAK; + if (node2.anchor === this.source) + found = node2; + } + }); + return found; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors, doc, maxAliasCount } = ctx; + const source2 = this.resolve(doc); + if (!source2) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + let data2 = anchors.get(source2); + if (!data2) { + toJS(source2, null, ctx); + data2 = anchors.get(source2); + } + if (!data2 || data2.res === void 0) { + const msg = "This should not happen: Alias anchor was not resolved?"; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data2.count += 1; + if (data2.aliasCount === 0) + data2.aliasCount = getAliasCount(doc, source2, anchors); + if (data2.count * data2.aliasCount > maxAliasCount) { + const msg = "Excessive alias count indicates a resource exhaustion attack"; + throw new ReferenceError(msg); + } + } + return data2.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src2 = `*${this.source}`; + if (ctx) { + anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src2} `; + } + return src2; + } +} +function getAliasCount(doc, node2, anchors) { + if (isAlias(node2)) { + const source2 = node2.resolve(doc); + const anchor = anchors && source2 && anchors.get(source2); + return anchor ? anchor.count * anchor.aliasCount : 0; + } else if (isCollection$1(node2)) { + let count = 0; + for (const item of node2.items) { + const c = getAliasCount(doc, item, anchors); + if (c > count) + count = c; + } + return count; + } else if (isPair(node2)) { + const kc = getAliasCount(doc, node2.key, anchors); + const vc = getAliasCount(doc, node2.value, anchors); + return Math.max(kc, vc); + } + return 1; +} +const isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object"; +class Scalar extends NodeBase { + constructor(value) { + super(SCALAR$1); + this.value = value; + } + toJSON(arg, ctx) { + return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } +} +Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; +Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; +Scalar.PLAIN = "PLAIN"; +Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; +Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; +const defaultTagPrefix = "tag:yaml.org,2002:"; +function findTagObject(value, tagName, tags) { + if (tagName) { + const match = tags.filter((t) => t.tag === tagName); + const tagObj = match.find((t) => !t.format) ?? match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find((t) => { + var _a2; + return ((_a2 = t.identify) == null ? void 0 : _a2.call(t, value)) && !t.format; + }); +} +function createNode(value, tagName, ctx) { + var _a2, _b2, _c2; + if (isDocument(value)) + value = value.contents; + if (isNode(value)) + return value; + if (isPair(value)) { + const map2 = (_b2 = (_a2 = ctx.schema[MAP]).createNode) == null ? void 0 : _b2.call(_a2, ctx.schema, null, ctx); + map2.items.push(value); + return map2; + } + if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt !== "undefined" && value instanceof BigInt) { + value = value.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema: schema2, sourceObjects } = ctx; + let ref2 = void 0; + if (aliasDuplicateObjects && value && typeof value === "object") { + ref2 = sourceObjects.get(value); + if (ref2) { + if (!ref2.anchor) + ref2.anchor = onAnchor(value); + return new Alias(ref2.anchor); + } else { + ref2 = { anchor: null, node: null }; + sourceObjects.set(value, ref2); + } + } + if (tagName == null ? void 0 : tagName.startsWith("!!")) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value, tagName, schema2.tags); + if (!tagObj) { + if (value && typeof value.toJSON === "function") { + value = value.toJSON(); + } + if (!value || typeof value !== "object") { + const node3 = new Scalar(value); + if (ref2) + ref2.node = node3; + return node3; + } + tagObj = value instanceof Map ? schema2[MAP] : Symbol.iterator in Object(value) ? schema2[SEQ] : schema2[MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node2 = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : typeof ((_c2 = tagObj == null ? void 0 : tagObj.nodeClass) == null ? void 0 : _c2.from) === "function" ? tagObj.nodeClass.from(ctx.schema, value, ctx) : new Scalar(value); + if (tagName) + node2.tag = tagName; + else if (!tagObj.default) + node2.tag = tagObj.tag; + if (ref2) + ref2.node = node2; + return node2; +} +function collectionFromPath(schema2, path2, value) { + let v = value; + for (let i = path2.length - 1; i >= 0; --i) { + const k = path2[i]; + if (typeof k === "number" && Number.isInteger(k) && k >= 0) { + const a = []; + a[k] = v; + v = a; + } else { + v = /* @__PURE__ */ new Map([[k, v]]); + } + } + return createNode(v, void 0, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error("This should not happen, please report a bug."); + }, + schema: schema2, + sourceObjects: /* @__PURE__ */ new Map() + }); +} +const isEmptyPath = (path2) => path2 == null || typeof path2 === "object" && !!path2[Symbol.iterator]().next().done; +class Collection extends NodeBase { + constructor(type2, schema2) { + super(type2); + Object.defineProperty(this, "schema", { + value: schema2, + configurable: true, + enumerable: false, + writable: true + }); + } + /** + * Create a copy of this collection. + * + * @param schema - If defined, overwrites the original's schema + */ + clone(schema2) { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema2) + copy.schema = schema2; + copy.items = copy.items.map((it) => isNode(it) || isPair(it) ? it.clone(schema2) : it); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** + * Adds a value to the collection. For `!!map` and `!!omap` the value must + * be a Pair instance or a `{ key, value }` object, which may not have a key + * that already exists in the map. + */ + addIn(path2, value) { + if (isEmptyPath(path2)) + this.add(value); + else { + const [key2, ...rest] = path2; + const node2 = this.get(key2, true); + if (isCollection$1(node2)) + node2.addIn(rest, value); + else if (node2 === void 0 && this.schema) + this.set(key2, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key2}. Remaining path: ${rest}`); + } + } + /** + * Removes a value from the collection. + * @returns `true` if the item was found and removed. + */ + deleteIn(path2) { + const [key2, ...rest] = path2; + if (rest.length === 0) + return this.delete(key2); + const node2 = this.get(key2, true); + if (isCollection$1(node2)) + return node2.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key2}. Remaining path: ${rest}`); + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path2, keepScalar) { + const [key2, ...rest] = path2; + const node2 = this.get(key2, true); + if (rest.length === 0) + return !keepScalar && isScalar$1(node2) ? node2.value : node2; + else + return isCollection$1(node2) ? node2.getIn(rest, keepScalar) : void 0; + } + hasAllNullValues(allowScalar) { + return this.items.every((node2) => { + if (!isPair(node2)) + return false; + const n = node2.value; + return n == null || allowScalar && isScalar$1(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag; + }); + } + /** + * Checks if the collection includes a value with the key `key`. + */ + hasIn(path2) { + const [key2, ...rest] = path2; + if (rest.length === 0) + return this.has(key2); + const node2 = this.get(key2, true); + return isCollection$1(node2) ? node2.hasIn(rest) : false; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path2, value) { + const [key2, ...rest] = path2; + if (rest.length === 0) { + this.set(key2, value); + } else { + const node2 = this.get(key2, true); + if (isCollection$1(node2)) + node2.setIn(rest, value); + else if (node2 === void 0 && this.schema) + this.set(key2, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key2}. Remaining path: ${rest}`); + } + } +} +const stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); +function indentComment(comment2, indent) { + if (/^\n+$/.test(comment2)) + return comment2.substring(1); + return indent ? comment2.replace(/^(?! *$)/gm, indent) : comment2; +} +const lineComment = (str, indent, comment2) => str.endsWith("\n") ? indentComment(comment2, indent) : comment2.includes("\n") ? "\n" + indentComment(comment2, indent) : (str.endsWith(" ") ? "" : " ") + comment2; +const FOLD_FLOW = "flow"; +const FOLD_BLOCK = "block"; +const FOLD_QUOTED = "quoted"; +function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + if (lineWidth < minContentWidth) + minContentWidth = 0; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === "number") { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = void 0; + let prev = void 0; + let overflow = false; + let i = -1; + let escStart = -1; + let escEnd = -1; + if (mode === FOLD_BLOCK) { + i = consumeMoreIndentedLines(text, i, indent.length); + if (i !== -1) + end = i + endStep; + } + for (let ch; ch = text[i += 1]; ) { + if (mode === FOLD_QUOTED && ch === "\\") { + escStart = i; + switch (text[i + 1]) { + case "x": + i += 3; + break; + case "u": + i += 5; + break; + case "U": + i += 9; + break; + default: + i += 1; + } + escEnd = i; + } + if (ch === "\n") { + if (mode === FOLD_BLOCK) + i = consumeMoreIndentedLines(text, i, indent.length); + end = i + indent.length + endStep; + split = void 0; + } else { + if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { + const next = text[i + 1]; + if (next && next !== " " && next !== "\n" && next !== " ") + split = i; + } + if (i >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = void 0; + } else if (mode === FOLD_QUOTED) { + while (prev === " " || prev === " ") { + prev = ch; + ch = text[i += 1]; + overflow = true; + } + const j = i > escEnd + 1 ? i - 2 : escStart - 1; + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = void 0; + } else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i2 = 0; i2 < folds.length; ++i2) { + const fold = folds[i2]; + const end2 = folds[i2 + 1] || text.length; + if (fold === 0) + res = ` +${indent}${text.slice(0, end2)}`; + else { + if (mode === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += ` +${indent}${text.slice(fold + 1, end2)}`; + } + } + return res; +} +function consumeMoreIndentedLines(text, i, indent) { + let end = i; + let start = i + 1; + let ch = text[start]; + while (ch === " " || ch === " ") { + if (i < start + indent) { + ch = text[++i]; + } else { + do { + ch = text[++i]; + } while (ch && ch !== "\n"); + end = i; + start = i + 1; + ch = text[start]; + } + } + return end; +} +const getFoldOptions = (ctx, isBlock2) => ({ + indentAtStart: isBlock2 ? ctx.indent.length : ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth +}); +const containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); +function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i = 0, start = 0; i < strLen; ++i) { + if (str[i] === "\n") { + if (i - start > limit) + return true; + start = i + 1; + if (strLen - start <= limit) + return false; + } + } + return true; +} +function doubleQuotedString(value, ctx) { + const json = JSON.stringify(value); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + let str = ""; + let start = 0; + for (let i = 0, ch = json[i]; ch; ch = json[++i]) { + if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") { + str += json.slice(start, i) + "\\ "; + i += 1; + start = i; + ch = "\\"; + } + if (ch === "\\") + switch (json[i + 1]) { + case "u": + { + str += json.slice(start, i); + const code = json.substr(i + 2, 4); + switch (code) { + case "0000": + str += "\\0"; + break; + case "0007": + str += "\\a"; + break; + case "000b": + str += "\\v"; + break; + case "001b": + str += "\\e"; + break; + case "0085": + str += "\\N"; + break; + case "00a0": + str += "\\_"; + break; + case "2028": + str += "\\L"; + break; + case "2029": + str += "\\P"; + break; + default: + if (code.substr(0, 2) === "00") + str += "\\x" + code.substr(2); + else + str += json.substr(i, 6); + } + i += 5; + start = i + 1; + } + break; + case "n": + if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) { + i += 1; + } else { + str += json.slice(start, i) + "\n\n"; + while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') { + str += "\n"; + i += 2; + } + str += indent; + if (json[i + 2] === " ") + str += "\\"; + i += 1; + start = i + 1; + } + break; + default: + i += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx, false)); +} +function singleQuotedString(value, ctx) { + if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value)) + return doubleQuotedString(value, ctx); + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$& +${indent}`) + "'"; + return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx, false)); +} +function quotedString(value, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value.includes('"'); + const hasSingle = value.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value, ctx); +} +let blockEndNewlines; +try { + blockEndNewlines = new RegExp("(^|(?\n"; + let chomp; + let endStart; + for (endStart = value.length; endStart > 0; --endStart) { + const ch = value[endStart - 1]; + if (ch !== "\n" && ch !== " " && ch !== " ") + break; + } + let end = value.substring(endStart); + const endNlPos = end.indexOf("\n"); + if (endNlPos === -1) { + chomp = "-"; + } else if (value === end || endNlPos !== end.length - 1) { + chomp = "+"; + if (onChompKeep) + onChompKeep(); + } else { + chomp = ""; + } + if (end) { + value = value.slice(0, -end.length); + if (end[end.length - 1] === "\n") + end = end.slice(0, -1); + end = end.replace(blockEndNewlines, `$&${indent}`); + } + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value.length; ++startEnd) { + const ch = value[startEnd]; + if (ch === " ") + startWithSpace = true; + else if (ch === "\n") + startNlPos = startEnd; + else + break; + } + let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value = value.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? "2" : "1"; + let header = (literal2 ? "|" : ">") + (startWithSpace ? indentSize : "") + chomp; + if (comment2) { + header += " " + commentString(comment2.replace(/ ?[\r\n]+/g, " ")); + if (onComment) + onComment(); + } + if (literal2) { + value = value.replace(/\n+/g, `$&${indent}`); + return `${header} +${indent}${start}${value}${end}`; + } + value = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); + const body = foldFlowLines(`${start}${value}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx, true)); + return `${header} +${indent}${body}`; +} +function plainString(item, ctx, onComment, onChompKeep) { + const { type: type2, value } = item; + const { actualString, implicitKey, indent, indentStep, inFlow } = ctx; + if (implicitKey && value.includes("\n") || inFlow && /[[\]{},]/.test(value)) { + return quotedString(value, ctx); + } + if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { + return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && !inFlow && type2 !== Scalar.PLAIN && value.includes("\n")) { + return blockString(item, ctx, onComment, onChompKeep); + } + if (containsDocumentMarker(value)) { + if (indent === "") { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } else if (implicitKey && indent === indentStep) { + return quotedString(value, ctx); + } + } + const str = value.replace(/\n+/g, `$& +${indent}`); + if (actualString) { + const test = (tag) => { + var _a2; + return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a2 = tag.test) == null ? void 0 : _a2.test(str)); + }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) + return quotedString(value, ctx); + } + return implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx, false)); +} +function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); + let { type: type2 } = item; + if (type2 !== Scalar.QUOTE_DOUBLE) { + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type2 = Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.BLOCK_FOLDED: + case Scalar.BLOCK_LITERAL: + return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type2); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t = implicitKey && defaultKeyType || defaultStringType; + res = _stringify(t); + if (res === null) + throw new Error(`Unsupported default string type ${t}`); + } + return res; +} +function createStringifyContext(doc, options2) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment, + defaultKeyType: null, + defaultStringType: "PLAIN", + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: "false", + flowCollectionPadding: true, + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: "null", + simpleKeys: false, + singleQuote: null, + trueStr: "true", + verifyAliasOrder: true + }, doc.schema.toStringOptions, options2); + let inFlow; + switch (opt.collectionStyle) { + case "block": + inFlow = false; + break; + case "flow": + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: /* @__PURE__ */ new Set(), + doc, + flowCollectionPadding: opt.flowCollectionPadding ? " " : "", + indent: "", + indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", + inFlow, + options: opt + }; +} +function getTagObject(tags, item) { + var _a2; + if (item.tag) { + const match = tags.filter((t) => t.tag === item.tag); + if (match.length > 0) + return match.find((t) => t.format === item.format) ?? match[0]; + } + let tagObj = void 0; + let obj; + if (isScalar$1(item)) { + obj = item.value; + let match = tags.filter((t) => { + var _a3; + return (_a3 = t.identify) == null ? void 0 : _a3.call(t, obj); + }); + if (match.length > 1) { + const testMatch = match.filter((t) => t.test); + if (testMatch.length > 0) + match = testMatch; + } + tagObj = match.find((t) => t.format === item.format) ?? match.find((t) => !t.format); + } else { + obj = item; + tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass); + } + if (!tagObj) { + const name = ((_a2 = obj == null ? void 0 : obj.constructor) == null ? void 0 : _a2.name) ?? typeof obj; + throw new Error(`Tag not resolved for ${name} value`); + } + return tagObj; +} +function stringifyProps(node2, tagObj, { anchors, doc }) { + if (!doc.directives) + return ""; + const props = []; + const anchor = (isScalar$1(node2) || isCollection$1(node2)) && node2.anchor; + if (anchor && anchorIsValid(anchor)) { + anchors.add(anchor); + props.push(`&${anchor}`); + } + const tag = node2.tag ? node2.tag : tagObj.default ? null : tagObj.tag; + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(" "); +} +function stringify$2(item, ctx, onComment, onChompKeep) { + var _a2; + if (isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a2 = ctx.resolvedAliases) == null ? void 0 : _a2.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = /* @__PURE__ */ new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = void 0; + const node2 = isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node2); + const props = stringifyProps(node2, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1; + const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node2, ctx, onComment, onChompKeep) : isScalar$1(node2) ? stringifyString(node2, ctx, onComment, onChompKeep) : node2.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return isScalar$1(node2) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} +${ctx.indent}${str}`; +} +function stringifyPair({ key: key2, value }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = isNode(key2) && key2.comment || null; + if (simpleKeys) { + if (keyComment) { + throw new Error("With simple keys, key nodes cannot have comments"); + } + if (isCollection$1(key2) || !isNode(key2) && typeof key2 === "object") { + const msg = "With simple keys, collection cannot be used as a key value"; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && (!key2 || keyComment && value == null && !ctx.inFlow || isCollection$1(key2) || (isScalar$1(key2) ? key2.type === Scalar.BLOCK_FOLDED || key2.type === Scalar.BLOCK_LITERAL : typeof key2 === "object")); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify$2(key2, ctx, () => keyCommentDone = true, () => chompKeep = true); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value == null) { + if (keyCommentDone && onComment) + onComment(); + return str === "" ? "?" : explicitKey ? `? ${str}` : str; + } + } else if (allNullValues && !simpleKeys || value == null && explicitKey) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += lineComment(str, ctx.indent, commentString(keyComment)); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str} +${indent}:`; + } else { + str = `${str}:`; + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + } + let vsb, vcb, valueComment; + if (isNode(value)) { + vsb = !!value.spaceBefore; + vcb = value.commentBefore; + valueComment = value.comment; + } else { + vsb = false; + vcb = null; + valueComment = null; + if (value && typeof value === "object") + value = doc.createNode(value); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && isScalar$1(value)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && isSeq(value) && !value.flow && !value.tag && !value.anchor) { + ctx.indent = ctx.indent.substring(2); + } + let valueCommentDone = false; + const valueStr = stringify$2(value, ctx, () => valueCommentDone = true, () => chompKeep = true); + let ws2 = " "; + if (keyComment || vsb || vcb) { + ws2 = vsb ? "\n" : ""; + if (vcb) { + const cs = commentString(vcb); + ws2 += ` +${indentComment(cs, ctx.indent)}`; + } + if (valueStr === "" && !ctx.inFlow) { + if (ws2 === "\n") + ws2 = "\n\n"; + } else { + ws2 += ` +${ctx.indent}`; + } + } else if (!explicitKey && isCollection$1(value)) { + const vs0 = valueStr[0]; + const nl0 = valueStr.indexOf("\n"); + const hasNewline = nl0 !== -1; + const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0; + if (hasNewline || !flow) { + let hasPropsLine = false; + if (hasNewline && (vs0 === "&" || vs0 === "!")) { + let sp0 = valueStr.indexOf(" "); + if (vs0 === "&" && sp0 !== -1 && sp0 < nl0 && valueStr[sp0 + 1] === "!") { + sp0 = valueStr.indexOf(" ", sp0 + 1); + } + if (sp0 === -1 || nl0 < sp0) + hasPropsLine = true; + } + if (!hasPropsLine) + ws2 = ` +${ctx.indent}`; + } + } else if (valueStr === "" || valueStr[0] === "\n") { + ws2 = ""; + } + str += ws2 + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } else if (valueComment && !valueCommentDone) { + str += lineComment(str, ctx.indent, commentString(valueComment)); + } else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; +} +function warn(logLevel, warning) { + if (logLevel === "debug" || logLevel === "warn") { + if (typeof process !== "undefined" && process.emitWarning) + process.emitWarning(warning); + else + console.warn(warning); + } +} +const MERGE_KEY = "<<"; +const merge = { + identify: (value) => value === MERGE_KEY || typeof value === "symbol" && value.description === MERGE_KEY, + default: "key", + tag: "tag:yaml.org,2002:merge", + test: /^<<$/, + resolve: () => Object.assign(new Scalar(Symbol(MERGE_KEY)), { + addToJSMap: addMergeToJSMap + }), + stringify: () => MERGE_KEY +}; +const isMergeKey = (ctx, key2) => (merge.identify(key2) || isScalar$1(key2) && (!key2.type || key2.type === Scalar.PLAIN) && merge.identify(key2.value)) && (ctx == null ? void 0 : ctx.doc.schema.tags.some((tag) => tag.tag === merge.tag && tag.default)); +function addMergeToJSMap(ctx, map2, value) { + value = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; + if (isSeq(value)) + for (const it of value.items) + mergeValue(ctx, map2, it); + else if (Array.isArray(value)) + for (const it of value) + mergeValue(ctx, map2, it); + else + mergeValue(ctx, map2, value); +} +function mergeValue(ctx, map2, value) { + const source2 = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; + if (!isMap(source2)) + throw new Error("Merge sources must be maps or map aliases"); + const srcMap = source2.toJSON(null, ctx, Map); + for (const [key2, value2] of srcMap) { + if (map2 instanceof Map) { + if (!map2.has(key2)) + map2.set(key2, value2); + } else if (map2 instanceof Set) { + map2.add(key2); + } else if (!Object.prototype.hasOwnProperty.call(map2, key2)) { + Object.defineProperty(map2, key2, { + value: value2, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map2; +} +function addPairToJSMap(ctx, map2, { key: key2, value }) { + if (isNode(key2) && key2.addToJSMap) + key2.addToJSMap(ctx, map2, value); + else if (isMergeKey(ctx, key2)) + addMergeToJSMap(ctx, map2, value); + else { + const jsKey = toJS(key2, "", ctx); + if (map2 instanceof Map) { + map2.set(jsKey, toJS(value, jsKey, ctx)); + } else if (map2 instanceof Set) { + map2.add(jsKey); + } else { + const stringKey = stringifyKey(key2, jsKey, ctx); + const jsValue = toJS(value, stringKey, ctx); + if (stringKey in map2) + Object.defineProperty(map2, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map2[stringKey] = jsValue; + } + } + return map2; +} +function stringifyKey(key2, jsKey, ctx) { + if (jsKey === null) + return ""; + if (typeof jsKey !== "object") + return String(jsKey); + if (isNode(key2) && (ctx == null ? void 0 : ctx.doc)) { + const strCtx = createStringifyContext(ctx.doc, {}); + strCtx.anchors = /* @__PURE__ */ new Set(); + for (const node2 of ctx.anchors.keys()) + strCtx.anchors.add(node2.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key2.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); +} +function createPair(key2, value, ctx) { + const k = createNode(key2, void 0, ctx); + const v = createNode(value, void 0, ctx); + return new Pair(k, v); +} +class Pair { + constructor(key2, value = null) { + Object.defineProperty(this, NODE_TYPE, { value: PAIR }); + this.key = key2; + this.value = value; + } + clone(schema2) { + let { key: key2, value } = this; + if (isNode(key2)) + key2 = key2.clone(schema2); + if (isNode(value)) + value = value.clone(schema2); + return new Pair(key2, value); + } + toJSON(_, ctx) { + const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + return addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return (ctx == null ? void 0 : ctx.doc) ? stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); + } +} +function stringifyCollection(collection, ctx, options2) { + const flow = ctx.inFlow ?? collection.flow; + const stringify2 = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify2(collection, ctx, options2); +} +function stringifyBlockCollection({ comment: comment2, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment3 = null; + if (isNode(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment3 = item.comment; + } else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str2 = stringify$2(item, itemCtx, () => comment3 = null, () => chompKeep = true); + if (comment3) + str2 += lineComment(str2, itemIndent, commentString(comment3)); + if (chompKeep && comment3) + chompKeep = false; + lines.push(blockItemPrefix + str2); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } else { + str = lines[0]; + for (let i = 1; i < lines.length; ++i) { + const line = lines[i]; + str += line ? ` +${indent}${line}` : "\n"; + } + } + if (comment2) { + str += "\n" + indentComment(commentString(comment2), indent); + if (onComment) + onComment(); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; +} +function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) { + const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment2 = null; + if (isNode(item)) { + if (item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment2 = item.comment; + } else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = isNode(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment2 = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } else if (item.value == null && (ik == null ? void 0 : ik.comment)) { + comment2 = ik.comment; + } + } + if (comment2) + reqNewline = true; + let str = stringify$2(item, itemCtx, () => comment2 = null); + if (i < items.length - 1) + str += ","; + if (comment2) + str += lineComment(str, itemIndent, commentString(comment2)); + if (!reqNewline && (lines.length > linesAtValue || str.includes("\n"))) + reqNewline = true; + lines.push(str); + linesAtValue = lines.length; + } + const { start, end } = flowChars; + if (lines.length === 0) { + return start + end; + } else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth; + } + if (reqNewline) { + let str = start; + for (const line of lines) + str += line ? ` +${indentStep}${indent}${line}` : "\n"; + return `${str} +${indent}${end}`; + } else { + return `${start}${fcPadding}${lines.join(" ")}${fcPadding}${end}`; + } + } +} +function addCommentBefore({ indent, options: { commentString } }, lines, comment2, chompKeep) { + if (comment2 && chompKeep) + comment2 = comment2.replace(/^\n+/, ""); + if (comment2) { + const ic = indentComment(commentString(comment2), indent); + lines.push(ic.trimStart()); + } +} +function findPair(items, key2) { + const k = isScalar$1(key2) ? key2.value : key2; + for (const it of items) { + if (isPair(it)) { + if (it.key === key2 || it.key === k) + return it; + if (isScalar$1(it.key) && it.key.value === k) + return it; + } + } + return void 0; +} +class YAMLMap extends Collection { + static get tagName() { + return "tag:yaml.org,2002:map"; + } + constructor(schema2) { + super(MAP, schema2); + this.items = []; + } + /** + * A generic collection parsing method that can be extended + * to other node classes that inherit from YAMLMap + */ + static from(schema2, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map2 = new this(schema2); + const add = (key2, value) => { + if (typeof replacer === "function") + value = replacer.call(obj, key2, value); + else if (Array.isArray(replacer) && !replacer.includes(key2)) + return; + if (value !== void 0 || keepUndefined) + map2.items.push(createPair(key2, value, ctx)); + }; + if (obj instanceof Map) { + for (const [key2, value] of obj) + add(key2, value); + } else if (obj && typeof obj === "object") { + for (const key2 of Object.keys(obj)) + add(key2, obj[key2]); + } + if (typeof schema2.sortMapEntries === "function") { + map2.items.sort(schema2.sortMapEntries); + } + return map2; + } + /** + * Adds a value to the collection. + * + * @param overwrite - If not set `true`, using a key that is already in the + * collection will throw. Otherwise, overwrites the previous value. + */ + add(pair, overwrite) { + var _a2; + let _pair; + if (isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== "object" || !("key" in pair)) { + _pair = new Pair(pair, pair == null ? void 0 : pair.value); + } else + _pair = new Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = (_a2 = this.schema) == null ? void 0 : _a2.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + if (isScalar$1(prev.value) && isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } else if (sortEntries) { + const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0); + if (i === -1) + this.items.push(_pair); + else + this.items.splice(i, 0, _pair); + } else { + this.items.push(_pair); + } + } + delete(key2) { + const it = findPair(this.items, key2); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key2, keepScalar) { + const it = findPair(this.items, key2); + const node2 = it == null ? void 0 : it.value; + return (!keepScalar && isScalar$1(node2) ? node2.value : node2) ?? void 0; + } + has(key2) { + return !!findPair(this.items, key2); + } + set(key2, value) { + this.add(new Pair(key2, value), true); + } + /** + * @param ctx - Conversion context, originally set in Document#toJS() + * @param {Class} Type - If set, forces the returned collection type + * @returns Instance of Type, Map, or Object + */ + toJSON(_, ctx, Type) { + const map2 = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const item of this.items) + addPairToJSMap(ctx, map2, item); + return map2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection(this, ctx, { + blockItemPrefix: "", + flowChars: { start: "{", end: "}" }, + itemIndent: ctx.indent || "", + onChompKeep, + onComment + }); + } +} +const map = { + collection: "map", + default: true, + nodeClass: YAMLMap, + tag: "tag:yaml.org,2002:map", + resolve(map2, onError) { + if (!isMap(map2)) + onError("Expected a mapping for this tag"); + return map2; + }, + createNode: (schema2, obj, ctx) => YAMLMap.from(schema2, obj, ctx) +}; +class YAMLSeq extends Collection { + static get tagName() { + return "tag:yaml.org,2002:seq"; + } + constructor(schema2) { + super(SEQ, schema2); + this.items = []; + } + add(value) { + this.items.push(value); + } + /** + * Removes a value from the collection. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + * + * @returns `true` if the item was found and removed. + */ + delete(key2) { + const idx = asItemIndex(key2); + if (typeof idx !== "number") + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + get(key2, keepScalar) { + const idx = asItemIndex(key2); + if (typeof idx !== "number") + return void 0; + const it = this.items[idx]; + return !keepScalar && isScalar$1(it) ? it.value : it; + } + /** + * Checks if the collection includes a value with the key `key`. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + */ + has(key2) { + const idx = asItemIndex(key2); + return typeof idx === "number" && idx < this.items.length; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + * + * If `key` does not contain a representation of an integer, this will throw. + * It may be wrapped in a `Scalar`. + */ + set(key2, value) { + const idx = asItemIndex(key2); + if (typeof idx !== "number") + throw new Error(`Expected a valid index, not ${key2}.`); + const prev = this.items[idx]; + if (isScalar$1(prev) && isScalarValue(value)) + prev.value = value; + else + this.items[idx] = value; + } + toJSON(_, ctx) { + const seq2 = []; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(seq2); + let i = 0; + for (const item of this.items) + seq2.push(toJS(item, String(i++), ctx)); + return seq2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection(this, ctx, { + blockItemPrefix: "- ", + flowChars: { start: "[", end: "]" }, + itemIndent: (ctx.indent || "") + " ", + onChompKeep, + onComment + }); + } + static from(schema2, obj, ctx) { + const { replacer } = ctx; + const seq2 = new this(schema2); + if (obj && Symbol.iterator in Object(obj)) { + let i = 0; + for (let it of obj) { + if (typeof replacer === "function") { + const key2 = obj instanceof Set ? it : String(i++); + it = replacer.call(obj, key2, it); + } + seq2.items.push(createNode(it, void 0, ctx)); + } + } + return seq2; + } +} +function asItemIndex(key2) { + let idx = isScalar$1(key2) ? key2.value : key2; + if (idx && typeof idx === "string") + idx = Number(idx); + return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; +} +const seq = { + collection: "seq", + default: true, + nodeClass: YAMLSeq, + tag: "tag:yaml.org,2002:seq", + resolve(seq2, onError) { + if (!isSeq(seq2)) + onError("Expected a sequence for this tag"); + return seq2; + }, + createNode: (schema2, obj, ctx) => YAMLSeq.from(schema2, obj, ctx) +}; +const string = { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString(item, ctx, onComment, onChompKeep); + } +}; +const nullTag = { + identify: (value) => value == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar(null), + stringify: ({ source: source2 }, ctx) => typeof source2 === "string" && nullTag.test.test(source2) ? source2 : ctx.options.nullStr +}; +const boolTag = { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: (str) => new Scalar(str[0] === "t" || str[0] === "T"), + stringify({ source: source2, value }, ctx) { + if (source2 && boolTag.test.test(source2)) { + const sv = source2[0] === "t" || source2[0] === "T"; + if (value === sv) + return source2; + } + return value ? ctx.options.trueStr : ctx.options.falseStr; + } +}; +function stringifyNumber({ format, minFractionDigits, tag, value }) { + if (typeof value === "bigint") + return String(value); + const num = typeof value === "number" ? value : Number(value); + if (!isFinite(num)) + return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; + let n = JSON.stringify(value); + if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) { + let i = n.indexOf("."); + if (i < 0) { + i = n.length; + n += "."; + } + let d = minFractionDigits - (n.length - i - 1); + while (d-- > 0) + n += "0"; + } + return n; +} +const floatNaN$1 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +const floatExp$1 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str), + stringify(node2) { + const num = Number(node2.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node2); + } +}; +const float$1 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node2 = new Scalar(parseFloat(str)); + const dot = str.indexOf("."); + if (dot !== -1 && str[str.length - 1] === "0") + node2.minFractionDigits = str.length - dot - 1; + return node2; + }, + stringify: stringifyNumber +}; +const intIdentify$2 = (value) => typeof value === "bigint" || Number.isInteger(value); +const intResolve$1 = (str, offset2, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset2), radix); +function intStringify$1(node2, radix, prefix) { + const { value } = node2; + if (intIdentify$2(value) && value >= 0) + return prefix + value.toString(radix); + return stringifyNumber(node2); +} +const intOct$1 = { + identify: (value) => intIdentify$2(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 8, opt), + stringify: (node2) => intStringify$1(node2, 8, "0o") +}; +const int$1 = { + identify: intIdentify$2, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 0, 10, opt), + stringify: stringifyNumber +}; +const intHex$1 = { + identify: (value) => intIdentify$2(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 16, opt), + stringify: (node2) => intStringify$1(node2, 16, "0x") +}; +const schema$2 = [ + map, + seq, + string, + nullTag, + boolTag, + intOct$1, + int$1, + intHex$1, + floatNaN$1, + floatExp$1, + float$1 +]; +function intIdentify$1(value) { + return typeof value === "bigint" || Number.isInteger(value); +} +const stringifyJSON = ({ value }) => JSON.stringify(value); +const jsonScalars = [ + { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify: stringifyJSON + }, + { + identify: (value) => value == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^true|false$/, + resolve: (str) => str === "true", + stringify: stringifyJSON + }, + { + identify: intIdentify$1, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value }) => intIdentify$1(value) ? value.toString() : JSON.stringify(value) + }, + { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: (str) => parseFloat(str), + stringify: stringifyJSON + } +]; +const jsonError = { + default: true, + tag: "", + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } +}; +const schema$1 = [map, seq].concat(jsonScalars, jsonError); +const binary = { + identify: (value) => value instanceof Uint8Array, + // Buffer inherits from Uint8Array + default: false, + tag: "tag:yaml.org,2002:binary", + /** + * Returns a Buffer in node and an Uint8Array in browsers + * + * To use the resulting buffer as an image, you'll want to do something like: + * + * const blob = new Blob([buffer], { type: 'image/jpeg' }) + * document.querySelector('#photo').src = URL.createObjectURL(blob) + */ + resolve(src2, onError) { + if (typeof Buffer === "function") { + return Buffer.from(src2, "base64"); + } else if (typeof atob === "function") { + const str = atob(src2.replace(/[\n\r]/g, "")); + const buffer2 = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) + buffer2[i] = str.charCodeAt(i); + return buffer2; + } else { + onError("This environment does not support reading binary tags; either Buffer or atob is required"); + return src2; + } + }, + stringify({ comment: comment2, type: type2, value }, ctx, onComment, onChompKeep) { + const buf = value; + let str; + if (typeof Buffer === "function") { + str = buf instanceof Buffer ? buf.toString("base64") : Buffer.from(buf.buffer).toString("base64"); + } else if (typeof btoa === "function") { + let s = ""; + for (let i = 0; i < buf.length; ++i) + s += String.fromCharCode(buf[i]); + str = btoa(s); + } else { + throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); + } + if (!type2) + type2 = Scalar.BLOCK_LITERAL; + if (type2 !== Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n = Math.ceil(str.length / lineWidth); + const lines = new Array(n); + for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { + lines[i] = str.substr(o, lineWidth); + } + str = lines.join(type2 === Scalar.BLOCK_LITERAL ? "\n" : " "); + } + return stringifyString({ comment: comment2, type: type2, value: str }, ctx, onComment, onChompKeep); + } +}; +function resolvePairs(seq2, onError) { + if (isSeq(seq2)) { + for (let i = 0; i < seq2.items.length; ++i) { + let item = seq2.items[i]; + if (isPair(item)) + continue; + else if (isMap(item)) { + if (item.items.length > 1) + onError("Each pair must have its own sequence indicator"); + const pair = item.items[0] || new Pair(new Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} +${pair.key.commentBefore}` : item.commentBefore; + if (item.comment) { + const cn = pair.value ?? pair.key; + cn.comment = cn.comment ? `${item.comment} +${cn.comment}` : item.comment; + } + item = pair; + } + seq2.items[i] = isPair(item) ? item : new Pair(item); + } + } else + onError("Expected a sequence for this tag"); + return seq2; +} +function createPairs(schema2, iterable, ctx) { + const { replacer } = ctx; + const pairs2 = new YAMLSeq(schema2); + pairs2.tag = "tag:yaml.org,2002:pairs"; + let i = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === "function") + it = replacer.call(iterable, String(i++), it); + let key2, value; + if (Array.isArray(it)) { + if (it.length === 2) { + key2 = it[0]; + value = it[1]; + } else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key2 = keys[0]; + value = it[key2]; + } else { + throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`); + } + } else { + key2 = it; + } + pairs2.items.push(createPair(key2, value, ctx)); + } + return pairs2; +} +const pairs = { + collection: "seq", + default: false, + tag: "tag:yaml.org,2002:pairs", + resolve: resolvePairs, + createNode: createPairs +}; +class YAMLOMap extends YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + /** + * If `ctx` is given, the return type is actually `Map`, + * but TypeScript won't allow widening the signature of a child method. + */ + toJSON(_, ctx) { + if (!ctx) + return super.toJSON(_); + const map2 = /* @__PURE__ */ new Map(); + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const pair of this.items) { + let key2, value; + if (isPair(pair)) { + key2 = toJS(pair.key, "", ctx); + value = toJS(pair.value, key2, ctx); + } else { + key2 = toJS(pair, "", ctx); + } + if (map2.has(key2)) + throw new Error("Ordered maps must not include duplicate keys"); + map2.set(key2, value); + } + return map2; + } + static from(schema2, iterable, ctx) { + const pairs2 = createPairs(schema2, iterable, ctx); + const omap2 = new this(); + omap2.items = pairs2.items; + return omap2; + } +} +YAMLOMap.tag = "tag:yaml.org,2002:omap"; +const omap = { + collection: "seq", + identify: (value) => value instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: "tag:yaml.org,2002:omap", + resolve(seq2, onError) { + const pairs2 = resolvePairs(seq2, onError); + const seenKeys = []; + for (const { key: key2 } of pairs2.items) { + if (isScalar$1(key2)) { + if (seenKeys.includes(key2.value)) { + onError(`Ordered maps must not include duplicate keys: ${key2.value}`); + } else { + seenKeys.push(key2.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs2); + }, + createNode: (schema2, iterable, ctx) => YAMLOMap.from(schema2, iterable, ctx) +}; +function boolStringify({ value, source: source2 }, ctx) { + const boolObj = value ? trueTag : falseTag; + if (source2 && boolObj.test.test(source2)) + return source2; + return value ? ctx.options.trueStr : ctx.options.falseStr; +} +const trueTag = { + identify: (value) => value === true, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar(true), + stringify: boolStringify +}; +const falseTag = { + identify: (value) => value === false, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/, + resolve: () => new Scalar(false), + stringify: boolStringify +}; +const floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +const floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, "")), + stringify(node2) { + const num = Number(node2.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node2); + } +}; +const float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node2 = new Scalar(parseFloat(str.replace(/_/g, ""))); + const dot = str.indexOf("."); + if (dot !== -1) { + const f = str.substring(dot + 1).replace(/_/g, ""); + if (f[f.length - 1] === "0") + node2.minFractionDigits = f.length; + } + return node2; + }, + stringify: stringifyNumber +}; +const intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); +function intResolve(str, offset2, radix, { intAsBigInt }) { + const sign2 = str[0]; + if (sign2 === "-" || sign2 === "+") + offset2 += 1; + str = str.substring(offset2).replace(/_/g, ""); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n2 = BigInt(str); + return sign2 === "-" ? BigInt(-1) * n2 : n2; + } + const n = parseInt(str, radix); + return sign2 === "-" ? -1 * n : n; +} +function intStringify(node2, radix, prefix) { + const { value } = node2; + if (intIdentify(value)) { + const str = value.toString(radix); + return value < 0 ? "-" + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber(node2); +} +const intBin = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "BIN", + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt), + stringify: (node2) => intStringify(node2, 2, "0b") +}; +const intOct = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt), + stringify: (node2) => intStringify(node2, 8, "0") +}; +const int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber +}; +const intHex = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node2) => intStringify(node2, 16, "0x") +}; +class YAMLSet extends YAMLMap { + constructor(schema2) { + super(schema2); + this.tag = YAMLSet.tag; + } + add(key2) { + let pair; + if (isPair(key2)) + pair = key2; + else if (key2 && typeof key2 === "object" && "key" in key2 && "value" in key2 && key2.value === null) + pair = new Pair(key2.key, null); + else + pair = new Pair(key2, null); + const prev = findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + /** + * If `keepPair` is `true`, returns the Pair matching `key`. + * Otherwise, returns the value of that Pair's key. + */ + get(key2, keepPair) { + const pair = findPair(this.items, key2); + return !keepPair && isPair(pair) ? isScalar$1(pair.key) ? pair.key.value : pair.key : pair; + } + set(key2, value) { + if (typeof value !== "boolean") + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); + const prev = findPair(this.items, key2); + if (prev && !value) { + this.items.splice(this.items.indexOf(prev), 1); + } else if (!prev && value) { + this.items.push(new Pair(key2)); + } + } + toJSON(_, ctx) { + return super.toJSON(_, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error("Set items must all have null values"); + } + static from(schema2, iterable, ctx) { + const { replacer } = ctx; + const set2 = new this(schema2); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value of iterable) { + if (typeof replacer === "function") + value = replacer.call(iterable, value, value); + set2.items.push(createPair(value, null, ctx)); + } + return set2; + } +} +YAMLSet.tag = "tag:yaml.org,2002:set"; +const set = { + collection: "map", + identify: (value) => value instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: "tag:yaml.org,2002:set", + createNode: (schema2, iterable, ctx) => YAMLSet.from(schema2, iterable, ctx), + resolve(map2, onError) { + if (isMap(map2)) { + if (map2.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map2); + else + onError("Set items must all have null values"); + } else + onError("Expected a mapping for this tag"); + return map2; + } +}; +function parseSexagesimal(str, asBigInt) { + const sign2 = str[0]; + const parts = sign2 === "-" || sign2 === "+" ? str.substring(1) : str; + const num = (n) => asBigInt ? BigInt(n) : Number(n); + const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0)); + return sign2 === "-" ? num(-1) * res : res; +} +function stringifySexagesimal(node2) { + let { value } = node2; + let num = (n) => n; + if (typeof value === "bigint") + num = (n) => BigInt(n); + else if (isNaN(value) || !isFinite(value)) + return stringifyNumber(node2); + let sign2 = ""; + if (value < 0) { + sign2 = "-"; + value *= num(-1); + } + const _60 = num(60); + const parts = [value % _60]; + if (value < 60) { + parts.unshift(0); + } else { + value = (value - parts[0]) / _60; + parts.unshift(value % _60); + if (value >= 60) { + value = (value - parts[0]) / _60; + parts.unshift(value); + } + } + return sign2 + parts.map((n) => String(n).padStart(2, "0")).join(":").replace(/000000\d*$/, ""); +} +const intTime = { + identify: (value) => typeof value === "bigint" || Number.isInteger(value), + default: true, + tag: "tag:yaml.org,2002:int", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal +}; +const floatTime = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: (str) => parseSexagesimal(str, false), + stringify: stringifySexagesimal +}; +const timestamp = { + identify: (value) => value instanceof Date, + default: true, + tag: "tag:yaml.org,2002:timestamp", + // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part + // may be omitted altogether, resulting in a date format. In such a case, the time part is + // assumed to be 00:00:00Z (start of day, UTC). + test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== "Z") { + let d = parseSexagesimal(tz, false); + if (Math.abs(d) < 30) + d *= 60; + date -= 6e4 * d; + } + return new Date(date); + }, + stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, "") +}; +const schema = [ + map, + seq, + string, + nullTag, + trueTag, + falseTag, + intBin, + intOct, + int, + intHex, + floatNaN, + floatExp, + float, + binary, + merge, + omap, + pairs, + set, + intTime, + floatTime, + timestamp +]; +const schemas = /* @__PURE__ */ new Map([ + ["core", schema$2], + ["failsafe", [map, seq, string]], + ["json", schema$1], + ["yaml11", schema], + ["yaml-1.1", schema] +]); +const tagsByName = { + binary, + bool: boolTag, + float: float$1, + floatExp: floatExp$1, + floatNaN: floatNaN$1, + floatTime, + int: int$1, + intHex: intHex$1, + intOct: intOct$1, + intTime, + map, + merge, + null: nullTag, + omap, + pairs, + seq, + set, + timestamp +}; +const coreKnownTags = { + "tag:yaml.org,2002:binary": binary, + "tag:yaml.org,2002:merge": merge, + "tag:yaml.org,2002:omap": omap, + "tag:yaml.org,2002:pairs": pairs, + "tag:yaml.org,2002:set": set, + "tag:yaml.org,2002:timestamp": timestamp +}; +function getTags(customTags, schemaName, addMergeTag) { + const schemaTags = schemas.get(schemaName); + if (schemaTags && !customTags) { + return addMergeTag && !schemaTags.includes(merge) ? schemaTags.concat(merge) : schemaTags.slice(); + } + let tags = schemaTags; + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()).filter((key2) => key2 !== "yaml11").map((key2) => JSON.stringify(key2)).join(", "); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } else if (typeof customTags === "function") { + tags = customTags(tags.slice()); + } + if (addMergeTag) + tags = tags.concat(merge); + return tags.reduce((tags2, tag) => { + const tagObj = typeof tag === "string" ? tagsByName[tag] : tag; + if (!tagObj) { + const tagName = JSON.stringify(tag); + const keys = Object.keys(tagsByName).map((key2) => JSON.stringify(key2)).join(", "); + throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`); + } + if (!tags2.includes(tagObj)) + tags2.push(tagObj); + return tags2; + }, []); +} +const sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; +class Schema { + constructor({ compat, customTags, merge: merge2, resolveKnownTags, schema: schema2, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) ? getTags(compat, "compat") : compat ? getTags(null, compat) : null; + this.name = typeof schema2 === "string" && schema2 || "core"; + this.knownTags = resolveKnownTags ? coreKnownTags : {}; + this.tags = getTags(customTags, this.name, merge2); + this.toStringOptions = toStringDefaults ?? null; + Object.defineProperty(this, MAP, { value: map }); + Object.defineProperty(this, SCALAR$1, { value: string }); + Object.defineProperty(this, SEQ, { value: seq }); + this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; + } + clone() { + const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy.tags = this.tags.slice(); + return copy; + } +} +function stringifyDocument(doc, options2) { + var _a2; + const lines = []; + let hasDirectives = options2.directives === true; + if (options2.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } else if (doc.directives.docStart) + hasDirectives = true; + } + if (hasDirectives) + lines.push("---"); + const ctx = createStringifyContext(doc, options2); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(""); + const cs = commentString(doc.commentBefore); + lines.unshift(indentComment(cs, "")); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (isNode(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(""); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(indentComment(cs, "")); + } + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? void 0 : () => chompKeep = true; + let body = stringify$2(doc.contents, ctx, () => contentComment = null, onChompKeep); + if (contentComment) + body += lineComment(body, "", commentString(contentComment)); + if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { + lines[lines.length - 1] = `--- ${body}`; + } else + lines.push(body); + } else { + lines.push(stringify$2(doc.contents, ctx)); + } + if ((_a2 = doc.directives) == null ? void 0 : _a2.docEnd) { + if (doc.comment) { + const cs = commentString(doc.comment); + if (cs.includes("\n")) { + lines.push("..."); + lines.push(indentComment(cs, "")); + } else { + lines.push(`... ${cs}`); + } + } else { + lines.push("..."); + } + } else { + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ""); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") + lines.push(""); + lines.push(indentComment(commentString(dc), "")); + } + } + return lines.join("\n") + "\n"; +} +class Document { + constructor(value, replacer, options2) { + this.commentBefore = null; + this.comment = null; + this.errors = []; + this.warnings = []; + Object.defineProperty(this, NODE_TYPE, { value: DOC }); + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options2 === void 0 && replacer) { + options2 = replacer; + replacer = void 0; + } + const opt = Object.assign({ + intAsBigInt: false, + keepSourceTokens: false, + logLevel: "warn", + prettyErrors: true, + strict: true, + stringKeys: false, + uniqueKeys: true, + version: "1.2" + }, options2); + this.options = opt; + let { version: version2 } = opt; + if (options2 == null ? void 0 : options2._directives) { + this.directives = options2._directives.atDocument(); + if (this.directives.yaml.explicit) + version2 = this.directives.yaml.version; + } else + this.directives = new Directives({ version: version2 }); + this.setSchema(version2, options2); + this.contents = value === void 0 ? null : this.createNode(value, _replacer, options2); + } + /** + * Create a deep copy of this Document and its contents. + * + * Custom Node values that inherit from `Object` still refer to their original instances. + */ + clone() { + const copy = Object.create(Document.prototype, { + [NODE_TYPE]: { value: DOC } + }); + copy.commentBefore = this.commentBefore; + copy.comment = this.comment; + copy.errors = this.errors.slice(); + copy.warnings = this.warnings.slice(); + copy.options = Object.assign({}, this.options); + if (this.directives) + copy.directives = this.directives.clone(); + copy.schema = this.schema.clone(); + copy.contents = isNode(this.contents) ? this.contents.clone(copy.schema) : this.contents; + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** Adds a value to the document. */ + add(value) { + if (assertCollection(this.contents)) + this.contents.add(value); + } + /** Adds a value to the document. */ + addIn(path2, value) { + if (assertCollection(this.contents)) + this.contents.addIn(path2, value); + } + /** + * Create a new `Alias` node, ensuring that the target `node` has the required anchor. + * + * If `node` already has an anchor, `name` is ignored. + * Otherwise, the `node.anchor` value will be set to `name`, + * or if an anchor with that name is already present in the document, + * `name` will be used as a prefix for a new unique anchor. + * If `name` is undefined, the generated anchor will use 'a' as a prefix. + */ + createAlias(node2, name) { + if (!node2.anchor) { + const prev = anchorNames(this); + node2.anchor = // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + !name || prev.has(name) ? findNewAnchor(name || "a", prev) : name; + } + return new Alias(node2.anchor); + } + createNode(value, replacer, options2) { + let _replacer = void 0; + if (typeof replacer === "function") { + value = replacer.call({ "": value }, "", value); + _replacer = replacer; + } else if (Array.isArray(replacer)) { + const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } else if (options2 === void 0 && replacer) { + options2 = replacer; + replacer = void 0; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options2 ?? {}; + const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors( + this, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + anchorPrefix || "a" + ); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects ?? true, + keepUndefined: keepUndefined ?? false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node2 = createNode(value, tag, ctx); + if (flow && isCollection$1(node2)) + node2.flow = true; + setAnchors(); + return node2; + } + /** + * Convert a key and a value into a `Pair` using the current schema, + * recursively wrapping all values as `Scalar` or `Collection` nodes. + */ + createPair(key2, value, options2 = {}) { + const k = this.createNode(key2, null, options2); + const v = this.createNode(value, null, options2); + return new Pair(k, v); + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + delete(key2) { + return assertCollection(this.contents) ? this.contents.delete(key2) : false; + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + deleteIn(path2) { + if (isEmptyPath(path2)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) ? this.contents.deleteIn(path2) : false; + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + get(key2, keepScalar) { + return isCollection$1(this.contents) ? this.contents.get(key2, keepScalar) : void 0; + } + /** + * Returns item at `path`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path2, keepScalar) { + if (isEmptyPath(path2)) + return !keepScalar && isScalar$1(this.contents) ? this.contents.value : this.contents; + return isCollection$1(this.contents) ? this.contents.getIn(path2, keepScalar) : void 0; + } + /** + * Checks if the document includes a value with the key `key`. + */ + has(key2) { + return isCollection$1(this.contents) ? this.contents.has(key2) : false; + } + /** + * Checks if the document includes a value at `path`. + */ + hasIn(path2) { + if (isEmptyPath(path2)) + return this.contents !== void 0; + return isCollection$1(this.contents) ? this.contents.hasIn(path2) : false; + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + set(key2, value) { + if (this.contents == null) { + this.contents = collectionFromPath(this.schema, [key2], value); + } else if (assertCollection(this.contents)) { + this.contents.set(key2, value); + } + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path2, value) { + if (isEmptyPath(path2)) { + this.contents = value; + } else if (this.contents == null) { + this.contents = collectionFromPath(this.schema, Array.from(path2), value); + } else if (assertCollection(this.contents)) { + this.contents.setIn(path2, value); + } + } + /** + * Change the YAML version and schema used by the document. + * A `null` version disables support for directives, explicit tags, anchors, and aliases. + * It also requires the `schema` option to be given as a `Schema` instance value. + * + * Overrides all previously set schema options. + */ + setSchema(version2, options2 = {}) { + if (typeof version2 === "number") + version2 = String(version2); + let opt; + switch (version2) { + case "1.1": + if (this.directives) + this.directives.yaml.version = "1.1"; + else + this.directives = new Directives({ version: "1.1" }); + opt = { resolveKnownTags: false, schema: "yaml-1.1" }; + break; + case "1.2": + case "next": + if (this.directives) + this.directives.yaml.version = version2; + else + this.directives = new Directives({ version: version2 }); + opt = { resolveKnownTags: true, schema: "core" }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version2); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + if (options2.schema instanceof Object) + this.schema = options2.schema; + else if (opt) + this.schema = new Schema(Object.assign(opt, options2)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + // json & jsonArg are only used from toJSON() + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS(this.contents, jsonArg ?? "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; + } + /** + * A JSON representation of the document `contents`. + * + * @param jsonArg Used by `JSON.stringify` to indicate the array index or + * property name. + */ + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + /** A YAML representation of the document. */ + toString(options2 = {}) { + if (this.errors.length > 0) + throw new Error("Document with errors cannot be stringified"); + if ("indent" in options2 && (!Number.isInteger(options2.indent) || Number(options2.indent) <= 0)) { + const s = JSON.stringify(options2.indent); + throw new Error(`"indent" option must be a positive integer, not ${s}`); + } + return stringifyDocument(this, options2); + } +} +function assertCollection(contents) { + if (isCollection$1(contents)) + return true; + throw new Error("Expected a YAML collection as document contents"); +} +class YAMLError extends Error { + constructor(name, pos, code, message) { + super(); + this.name = name; + this.code = code; + this.message = message; + this.pos = pos; + } +} +class YAMLParseError extends YAMLError { + constructor(pos, code, message) { + super("YAMLParseError", pos, code, message); + } +} +class YAMLWarning extends YAMLError { + constructor(pos, code, message) { + super("YAMLWarning", pos, code, message); + } +} +const prettifyError = (src2, lc) => (error2) => { + if (error2.pos[0] === -1) + return; + error2.linePos = error2.pos.map((pos) => lc.linePos(pos)); + const { line, col } = error2.linePos[0]; + error2.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src2.substring(lc.lineStarts[line - 1], lc.lineStarts[line]).replace(/[\n\r]+$/, ""); + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = "…" + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + "…"; + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + let prev = src2.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + "…\n"; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error2.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.max(1, Math.min(end.col - col, 80 - ci)); + } + const pointer = " ".repeat(ci) + "^".repeat(count); + error2.message += `: + +${lineStr} +${pointer} +`; + } +}; +function resolveProps(tokens, { flow, indicator, next, offset: offset2, onError, parentIndent, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment2 = ""; + let commentSep = ""; + let hasNewline = false; + let reqSpace = false; + let tab = null; + let anchor = null; + let tag = null; + let newlineAfterProp = null; + let comma = null; + let found = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== "space" && token.type !== "newline" && token.type !== "comma") + onError(token.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + reqSpace = false; + } + if (tab) { + if (atNewline && token.type !== "comment" && token.type !== "newline") { + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + } + tab = null; + } + switch (token.type) { + case "space": + if (!flow && (indicator !== "doc-start" || (next == null ? void 0 : next.type) !== "flow-collection") && token.source.includes(" ")) { + tab = token; + } + hasSpace = true; + break; + case "comment": { + if (!hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = token.source.substring(1) || " "; + if (!comment2) + comment2 = cb; + else + comment2 += commentSep + cb; + commentSep = ""; + atNewline = false; + break; + } + case "newline": + if (atNewline) { + if (comment2) + comment2 += token.source; + else + spaceBefore = true; + } else + commentSep += token.source; + atNewline = true; + hasNewline = true; + if (anchor || tag) + newlineAfterProp = token; + hasSpace = true; + break; + case "anchor": + if (anchor) + onError(token, "MULTIPLE_ANCHORS", "A node can have at most one anchor"); + if (token.source.endsWith(":")) + onError(token.offset + token.source.length - 1, "BAD_ALIAS", "Anchor ending in : is ambiguous", true); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case "tag": { + if (tag) + onError(token, "MULTIPLE_TAGS", "A node can have at most one tag"); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + if (anchor || tag) + onError(token, "BAD_PROP_ORDER", `Anchors and tags must be after the ${token.source} indicator`); + if (found) + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.source} in ${flow ?? "collection"}`); + found = token; + atNewline = indicator === "seq-item-ind" || indicator === "explicit-key-ind"; + hasSpace = false; + break; + case "comma": + if (flow) { + if (comma) + onError(token, "UNEXPECTED_TOKEN", `Unexpected , in ${flow}`); + comma = token; + atNewline = false; + hasSpace = false; + break; + } + // else fallthrough + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset2; + if (reqSpace && next && next.type !== "space" && next.type !== "newline" && next.type !== "comma" && (next.type !== "scalar" || next.source !== "")) { + onError(next.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + } + if (tab && (atNewline && tab.indent <= parentIndent || (next == null ? void 0 : next.type) === "block-map" || (next == null ? void 0 : next.type) === "block-seq")) + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + return { + comma, + found, + spaceBefore, + comment: comment2, + hasNewline, + anchor, + tag, + newlineAfterProp, + end, + start: start ?? end + }; +} +function containsNewline(key2) { + if (!key2) + return null; + switch (key2.type) { + case "alias": + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + if (key2.source.includes("\n")) + return true; + if (key2.end) { + for (const st of key2.end) + if (st.type === "newline") + return true; + } + return false; + case "flow-collection": + for (const it of key2.items) { + for (const st of it.start) + if (st.type === "newline") + return true; + if (it.sep) { + for (const st of it.sep) + if (st.type === "newline") + return true; + } + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } +} +function flowIndentCheck(indent, fc, onError) { + if ((fc == null ? void 0 : fc.type) === "flow-collection") { + const end = fc.end[0]; + if (end.indent === indent && (end.source === "]" || end.source === "}") && containsNewline(fc)) { + const msg = "Flow end indicator should be more indented than parent"; + onError(end, "BAD_INDENT", msg, true); + } + } +} +function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a, b) => a === b || isScalar$1(a) && isScalar$1(b) && a.value === b.value; + return items.some((pair) => isEqual(pair.key, search)); +} +const startColMsg = "All mapping items must start at the same column"; +function resolveBlockMap({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bm, onError, tag) { + var _a2; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLMap; + const map2 = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset2 = bm.offset; + let commentEnd = null; + for (const collItem of bm.items) { + const { start, key: key2, sep, value } = collItem; + const keyProps = resolveProps(start, { + indicator: "explicit-key-ind", + next: key2 ?? (sep == null ? void 0 : sep[0]), + offset: offset2, + onError, + parentIndent: bm.indent, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key2) { + if (key2.type === "block-seq") + onError(offset2, "BLOCK_AS_IMPLICIT_KEY", "A block sequence may not be used as an implicit map key"); + else if ("indent" in key2 && key2.indent !== bm.indent) + onError(offset2, "BAD_INDENT", startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep) { + commentEnd = keyProps.end; + if (keyProps.comment) { + if (map2.comment) + map2.comment += "\n" + keyProps.comment; + else + map2.comment = keyProps.comment; + } + continue; + } + if (keyProps.newlineAfterProp || containsNewline(key2)) { + onError(key2 ?? start[start.length - 1], "MULTILINE_IMPLICIT_KEY", "Implicit keys need to be on a single line"); + } + } else if (((_a2 = keyProps.found) == null ? void 0 : _a2.indent) !== bm.indent) { + onError(offset2, "BAD_INDENT", startColMsg); + } + ctx.atKey = true; + const keyStart = keyProps.end; + const keyNode = key2 ? composeNode2(ctx, key2, keyProps, onError) : composeEmptyNode2(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, key2, onError); + ctx.atKey = false; + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + const valueProps = resolveProps(sep ?? [], { + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: bm.indent, + startOnNewline: !key2 || key2.type === "block-scalar" + }); + offset2 = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value == null ? void 0 : value.type) === "block-map" && !valueProps.hasNewline) + onError(offset2, "BLOCK_AS_IMPLICIT_KEY", "Nested mappings are not allowed in compact mappings"); + if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024) + onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key"); + } + const valueNode = value ? composeNode2(ctx, value, valueProps, onError) : composeEmptyNode2(ctx, offset2, sep, null, valueProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, value, onError); + offset2 = valueNode.range[2]; + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } else { + if (implicitKey) + onError(keyNode.range, "MISSING_CHAR", "Implicit map keys need to be followed by map values"); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } + } + if (commentEnd && commentEnd < offset2) + onError(commentEnd, "IMPOSSIBLE", "Map comment with trailing content"); + map2.range = [bm.offset, offset2, commentEnd ?? offset2]; + return map2; +} +function resolveBlockSeq({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bs, onError, tag) { + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLSeq; + const seq2 = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset2 = bs.offset; + let commentEnd = null; + for (const { start, value } of bs.items) { + const props = resolveProps(start, { + indicator: "seq-item-ind", + next: value, + offset: offset2, + onError, + parentIndent: bs.indent, + startOnNewline: true + }); + if (!props.found) { + if (props.anchor || props.tag || value) { + if (value && value.type === "block-seq") + onError(props.end, "BAD_INDENT", "All sequence items must start at the same column"); + else + onError(offset2, "MISSING_CHAR", "Sequence item without - indicator"); + } else { + commentEnd = props.end; + if (props.comment) + seq2.comment = props.comment; + continue; + } + } + const node2 = value ? composeNode2(ctx, value, props, onError) : composeEmptyNode2(ctx, props.end, start, null, props, onError); + if (ctx.schema.compat) + flowIndentCheck(bs.indent, value, onError); + offset2 = node2.range[2]; + seq2.items.push(node2); + } + seq2.range = [bs.offset, offset2, commentEnd ?? offset2]; + return seq2; +} +function resolveEnd(end, offset2, reqSpace, onError) { + let comment2 = ""; + if (end) { + let hasSpace = false; + let sep = ""; + for (const token of end) { + const { source: source2, type: type2 } = token; + switch (type2) { + case "space": + hasSpace = true; + break; + case "comment": { + if (reqSpace && !hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = source2.substring(1) || " "; + if (!comment2) + comment2 = cb; + else + comment2 += sep + cb; + sep = ""; + break; + } + case "newline": + if (comment2) + sep += source2; + hasSpace = true; + break; + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${type2} at node end`); + } + offset2 += source2.length; + } + } + return { comment: comment2, offset: offset2 }; +} +const blockMsg = "Block collections are not allowed within flow collections"; +const isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq"); +function resolveFlowCollection({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, fc, onError, tag) { + const isMap2 = fc.start.source === "{"; + const fcName = isMap2 ? "flow map" : "flow sequence"; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? (isMap2 ? YAMLMap : YAMLSeq); + const coll = new NodeClass(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset2 = fc.offset + fc.start.source.length; + for (let i = 0; i < fc.items.length; ++i) { + const collItem = fc.items[i]; + const { start, key: key2, sep, value } = collItem; + const props = resolveProps(start, { + flow: fcName, + indicator: "explicit-key-ind", + next: key2 ?? (sep == null ? void 0 : sep[0]), + offset: offset2, + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep && !value) { + if (i === 0 && props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + else if (i < fc.items.length - 1) + onError(props.start, "UNEXPECTED_TOKEN", `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += "\n" + props.comment; + else + coll.comment = props.comment; + } + offset2 = props.end; + continue; + } + if (!isMap2 && ctx.options.strict && containsNewline(key2)) + onError( + key2, + // checked by containsNewline() + "MULTILINE_IMPLICIT_KEY", + "Implicit keys of flow sequence pairs need to be on a single line" + ); + } + if (i === 0) { + if (props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + } else { + if (!props.comma) + onError(props.start, "MISSING_CHAR", `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ""; + loop: for (const st of start) { + switch (st.type) { + case "comma": + case "space": + break; + case "comment": + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (isPair(prev)) + prev = prev.value ?? prev.key; + if (prev.comment) + prev.comment += "\n" + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap2 && !sep && !props.found) { + const valueNode = value ? composeNode2(ctx, value, props, onError) : composeEmptyNode2(ctx, props.end, sep, null, props, onError); + coll.items.push(valueNode); + offset2 = valueNode.range[2]; + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else { + ctx.atKey = true; + const keyStart = props.end; + const keyNode = key2 ? composeNode2(ctx, key2, props, onError) : composeEmptyNode2(ctx, keyStart, start, null, props, onError); + if (isBlock(key2)) + onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); + ctx.atKey = false; + const valueProps = resolveProps(sep ?? [], { + flow: fcName, + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap2 && !props.found && ctx.options.strict) { + if (sep) + for (const st of sep) { + if (st === valueProps.found) + break; + if (st.type === "newline") { + onError(st, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit flow sequence key"); + } + } else if (value) { + if ("source" in value && value.source && value.source[0] === ":") + onError(value, "MISSING_CHAR", `Missing space after : in ${fcName}`); + else + onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`); + } + const valueNode = value ? composeNode2(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode2(ctx, valueProps.end, sep, null, valueProps, onError) : null; + if (valueNode) { + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap2) { + const map2 = coll; + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + map2.items.push(pair); + } else { + const map2 = new YAMLMap(ctx.schema); + map2.flow = true; + map2.items.push(pair); + const endRange = (valueNode ?? keyNode).range; + map2.range = [keyNode.range[0], endRange[1], endRange[2]]; + coll.items.push(map2); + } + offset2 = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap2 ? "}" : "]"; + const [ce, ...ee] = fc.end; + let cePos = offset2; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot ? `${name} must end with a ${expectedEnd}` : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset2, atRoot ? "MISSING_CHAR" : "BAD_INDENT", msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += "\n" + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; +} +function resolveCollection(CN2, ctx, token, onError, tagName, tag) { + const coll = token.type === "block-map" ? resolveBlockMap(CN2, ctx, token, onError, tag) : token.type === "block-seq" ? resolveBlockSeq(CN2, ctx, token, onError, tag) : resolveFlowCollection(CN2, ctx, token, onError, tag); + const Coll = coll.constructor; + if (tagName === "!" || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + if (tagName) + coll.tag = tagName; + return coll; +} +function composeCollection(CN2, ctx, token, props, onError) { + var _a2; + const tagToken = props.tag; + const tagName = !tagToken ? null : ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)); + if (token.type === "block-seq") { + const { anchor, newlineAfterProp: nl } = props; + const lastProp = anchor && tagToken ? anchor.offset > tagToken.offset ? anchor : tagToken : anchor ?? tagToken; + if (lastProp && (!nl || nl.offset < lastProp.offset)) { + const message = "Missing newline after block sequence props"; + onError(lastProp, "MISSING_CHAR", message); + } + } + const expType = token.type === "block-map" ? "map" : token.type === "block-seq" ? "seq" : token.start.source === "{" ? "map" : "seq"; + if (!tagToken || !tagName || tagName === "!" || tagName === YAMLMap.tagName && expType === "map" || tagName === YAMLSeq.tagName && expType === "seq") { + return resolveCollection(CN2, ctx, token, onError, tagName); + } + let tag = ctx.schema.tags.find((t) => t.tag === tagName && t.collection === expType); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } else { + if (kt == null ? void 0 : kt.collection) { + onError(tagToken, "BAD_COLLECTION_TYPE", `${kt.tag} used for ${expType} collection, but expects ${kt.collection}`, true); + } else { + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, true); + } + return resolveCollection(CN2, ctx, token, onError, tagName); + } + } + const coll = resolveCollection(CN2, ctx, token, onError, tagName, tag); + const res = ((_a2 = tag.resolve) == null ? void 0 : _a2.call(tag, coll, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg), ctx.options)) ?? coll; + const node2 = isNode(res) ? res : new Scalar(res); + node2.range = coll.range; + node2.tag = tagName; + if (tag == null ? void 0 : tag.format) + node2.format = tag.format; + return node2; +} +function resolveBlockScalar(ctx, scalar, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError); + if (!header) + return { value: "", type: null, comment: "", range: [start, start, start] }; + const type2 = header.mode === ">" ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + let chompStart = lines.length; + for (let i = lines.length - 1; i >= 0; --i) { + const content = lines[i][1]; + if (content === "" || content === "\r") + chompStart = i; + else + break; + } + if (chompStart === 0) { + const value2 = header.chomp === "+" && lines.length > 0 ? "\n".repeat(Math.max(1, lines.length - 1)) : ""; + let end2 = start + header.length; + if (scalar.source) + end2 += scalar.source.length; + return { value: value2, type: type2, comment: header.comment, range: [start, end2, end2] }; + } + let trimIndent = scalar.indent + header.indent; + let offset2 = scalar.offset + header.length; + let contentStart = 0; + for (let i = 0; i < chompStart; ++i) { + const [indent, content] = lines[i]; + if (content === "" || content === "\r") { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } else { + if (indent.length < trimIndent) { + const message = "Block scalars with more-indented leading empty lines must use an explicit indentation indicator"; + onError(offset2 + indent.length, "MISSING_CHAR", message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i; + if (trimIndent === 0 && !ctx.atRoot) { + const message = "Block scalar values in collections must be indented"; + onError(offset2, "BAD_INDENT", message); + } + break; + } + offset2 += indent.length + content.length + 1; + } + for (let i = lines.length - 1; i >= chompStart; --i) { + if (lines[i][0].length > trimIndent) + chompStart = i + 1; + } + let value = ""; + let sep = ""; + let prevMoreIndented = false; + for (let i = 0; i < contentStart; ++i) + value += lines[i][0].slice(trimIndent) + "\n"; + for (let i = contentStart; i < chompStart; ++i) { + let [indent, content] = lines[i]; + offset2 += indent.length + content.length + 1; + const crlf = content[content.length - 1] === "\r"; + if (crlf) + content = content.slice(0, -1); + if (content && indent.length < trimIndent) { + const src2 = header.indent ? "explicit indentation indicator" : "first line"; + const message = `Block scalar lines must not be less indented than their ${src2}`; + onError(offset2 - content.length - (crlf ? 2 : 1), "BAD_INDENT", message); + indent = ""; + } + if (type2 === Scalar.BLOCK_LITERAL) { + value += sep + indent.slice(trimIndent) + content; + sep = "\n"; + } else if (indent.length > trimIndent || content[0] === " ") { + if (sep === " ") + sep = "\n"; + else if (!prevMoreIndented && sep === "\n") + sep = "\n\n"; + value += sep + indent.slice(trimIndent) + content; + sep = "\n"; + prevMoreIndented = true; + } else if (content === "") { + if (sep === "\n") + value += "\n"; + else + sep = "\n"; + } else { + value += sep + content; + sep = " "; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case "-": + break; + case "+": + for (let i = chompStart; i < lines.length; ++i) + value += "\n" + lines[i][0].slice(trimIndent); + if (value[value.length - 1] !== "\n") + value += "\n"; + break; + default: + value += "\n"; + } + const end = start + header.length + scalar.source.length; + return { value, type: type2, comment: header.comment, range: [start, end, end] }; +} +function parseBlockScalarHeader({ offset: offset2, props }, strict, onError) { + if (props[0].type !== "block-scalar-header") { + onError(props[0], "IMPOSSIBLE", "Block scalar header not found"); + return null; + } + const { source: source2 } = props[0]; + const mode = source2[0]; + let indent = 0; + let chomp = ""; + let error2 = -1; + for (let i = 1; i < source2.length; ++i) { + const ch = source2[i]; + if (!chomp && (ch === "-" || ch === "+")) + chomp = ch; + else { + const n = Number(ch); + if (!indent && n) + indent = n; + else if (error2 === -1) + error2 = offset2 + i; + } + } + if (error2 !== -1) + onError(error2, "UNEXPECTED_TOKEN", `Block scalar header includes extra characters: ${source2}`); + let hasSpace = false; + let comment2 = ""; + let length = source2.length; + for (let i = 1; i < props.length; ++i) { + const token = props[i]; + switch (token.type) { + case "space": + hasSpace = true; + // fallthrough + case "newline": + length += token.source.length; + break; + case "comment": + if (strict && !hasSpace) { + const message = "Comments must be separated from other tokens by white space characters"; + onError(token, "MISSING_CHAR", message); + } + length += token.source.length; + comment2 = token.source.substring(1); + break; + case "error": + onError(token, "UNEXPECTED_TOKEN", token.message); + length += token.source.length; + break; + /* istanbul ignore next should not happen */ + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, "UNEXPECTED_TOKEN", message); + const ts = token.source; + if (ts && typeof ts === "string") + length += ts.length; + } + } + } + return { mode, indent, chomp, comment: comment2, length }; +} +function splitLines(source2) { + const split = source2.split(/\n( *)/); + const first = split[0]; + const m = first.match(/^( *)/); + const line0 = (m == null ? void 0 : m[1]) ? [m[1], first.slice(m[1].length)] : ["", first]; + const lines = [line0]; + for (let i = 1; i < split.length; i += 2) + lines.push([split[i], split[i + 1]]); + return lines; +} +function resolveFlowScalar(scalar, strict, onError) { + const { offset: offset2, type: type2, source: source2, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset2 + rel, code, msg); + switch (type2) { + case "scalar": + _type = Scalar.PLAIN; + value = plainValue(source2, _onError); + break; + case "single-quoted-scalar": + _type = Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source2, _onError); + break; + case "double-quoted-scalar": + _type = Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source2, _onError); + break; + /* istanbul ignore next should not happen */ + default: + onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type2}`); + return { + value: "", + type: null, + comment: "", + range: [offset2, offset2 + source2.length, offset2 + source2.length] + }; + } + const valueEnd = offset2 + source2.length; + const re2 = resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re2.comment, + range: [offset2, valueEnd, re2.offset] + }; +} +function plainValue(source2, onError) { + let badChar = ""; + switch (source2[0]) { + /* istanbul ignore next should not happen */ + case " ": + badChar = "a tab character"; + break; + case ",": + badChar = "flow indicator character ,"; + break; + case "%": + badChar = "directive indicator character %"; + break; + case "|": + case ">": { + badChar = `block scalar indicator ${source2[0]}`; + break; + } + case "@": + case "`": { + badChar = `reserved character ${source2[0]}`; + break; + } + } + if (badChar) + onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`); + return foldLines(source2); +} +function singleQuotedValue(source2, onError) { + if (source2[source2.length - 1] !== "'" || source2.length === 1) + onError(source2.length, "MISSING_CHAR", "Missing closing 'quote"); + return foldLines(source2.slice(1, -1)).replace(/''/g, "'"); +} +function foldLines(source2) { + let first, line; + try { + first = new RegExp("(.*?)(? wsStart ? source2.slice(wsStart, i + 1) : ch; + } else { + res += ch; + } + } + if (source2[source2.length - 1] !== '"' || source2.length === 1) + onError(source2.length, "MISSING_CHAR", 'Missing closing "quote'); + return res; +} +function foldNewline(source2, offset2) { + let fold = ""; + let ch = source2[offset2 + 1]; + while (ch === " " || ch === " " || ch === "\n" || ch === "\r") { + if (ch === "\r" && source2[offset2 + 2] !== "\n") + break; + if (ch === "\n") + fold += "\n"; + offset2 += 1; + ch = source2[offset2 + 1]; + } + if (!fold) + fold = " "; + return { fold, offset: offset2 }; +} +const escapeCodes = { + "0": "\0", + // null character + a: "\x07", + // bell character + b: "\b", + // backspace + e: "\x1B", + // escape character + f: "\f", + // form feed + n: "\n", + // line feed + r: "\r", + // carriage return + t: " ", + // horizontal tab + v: "\v", + // vertical tab + N: "…", + // Unicode next line + _: " ", + // Unicode non-breaking space + L: "\u2028", + // Unicode line separator + P: "\u2029", + // Unicode paragraph separator + " ": " ", + '"': '"', + "/": "/", + "\\": "\\", + " ": " " +}; +function parseCharCode(source2, offset2, length, onError) { + const cc = source2.substr(offset2, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source2.substr(offset2 - 2, length + 2); + onError(offset2 - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); +} +function composeScalar(ctx, token, tagToken, onError) { + const { value, type: type2, comment: comment2, range: range2 } = token.type === "block-scalar" ? resolveBlockScalar(ctx, token, onError) : resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null; + let tag; + if (ctx.options.stringKeys && ctx.atKey) { + tag = ctx.schema[SCALAR$1]; + } else if (tagName) + tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError); + else if (token.type === "scalar") + tag = findScalarTagByTest(ctx, value, token, onError); + else + tag = ctx.schema[SCALAR$1]; + let scalar; + try { + const res = tag.resolve(value, (msg) => onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg), ctx.options); + scalar = isScalar$1(res) ? res : new Scalar(res); + } catch (error2) { + const msg = error2 instanceof Error ? error2.message : String(error2); + onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg); + scalar = new Scalar(value); + } + scalar.range = range2; + scalar.source = value; + if (type2) + scalar.type = type2; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment2) + scalar.comment = comment2; + return scalar; +} +function findScalarTagByName(schema2, value, tagName, tagToken, onError) { + var _a2; + if (tagName === "!") + return schema2[SCALAR$1]; + const matchWithTest = []; + for (const tag of schema2.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a2 = tag.test) == null ? void 0 : _a2.test(value)) + return tag; + const kt = schema2.knownTags[tagName]; + if (kt && !kt.collection) { + schema2.tags.push(Object.assign({}, kt, { default: false, test: void 0 })); + return kt; + } + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, tagName !== "tag:yaml.org,2002:str"); + return schema2[SCALAR$1]; +} +function findScalarTagByTest({ atKey, directives, schema: schema2 }, value, token, onError) { + const tag = schema2.tags.find((tag2) => { + var _a2; + return (tag2.default === true || atKey && tag2.default === "key") && ((_a2 = tag2.test) == null ? void 0 : _a2.test(value)); + }) || schema2[SCALAR$1]; + if (schema2.compat) { + const compat = schema2.compat.find((tag2) => { + var _a2; + return tag2.default && ((_a2 = tag2.test) == null ? void 0 : _a2.test(value)); + }) ?? schema2[SCALAR$1]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, "TAG_RESOLVE_FAILED", msg, true); + } + } + return tag; +} +function emptyScalarPosition(offset2, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i = pos - 1; i >= 0; --i) { + let st = before[i]; + switch (st.type) { + case "space": + case "comment": + case "newline": + offset2 -= st.source.length; + continue; + } + st = before[++i]; + while ((st == null ? void 0 : st.type) === "space") { + offset2 += st.source.length; + st = before[++i]; + } + break; + } + } + return offset2; +} +const CN = { composeNode, composeEmptyNode }; +function composeNode(ctx, token, props, onError) { + const atKey = ctx.atKey; + const { spaceBefore, comment: comment2, anchor, tag } = props; + let node2; + let isSrcToken = true; + switch (token.type) { + case "alias": + node2 = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, "ALIAS_PROPS", "An alias node must not specify any properties"); + break; + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "block-scalar": + node2 = composeScalar(ctx, token, tag, onError); + if (anchor) + node2.anchor = anchor.source.substring(1); + break; + case "block-map": + case "block-seq": + case "flow-collection": + node2 = composeCollection(CN, ctx, token, props, onError); + if (anchor) + node2.anchor = anchor.source.substring(1); + break; + default: { + const message = token.type === "error" ? token.message : `Unsupported token (type: ${token.type})`; + onError(token, "UNEXPECTED_TOKEN", message); + node2 = composeEmptyNode(ctx, token.offset, void 0, null, props, onError); + isSrcToken = false; + } + } + if (anchor && node2.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + if (atKey && ctx.options.stringKeys && (!isScalar$1(node2) || typeof node2.value !== "string" || node2.tag && node2.tag !== "tag:yaml.org,2002:str")) { + const msg = "With stringKeys, all keys must be strings"; + onError(tag ?? token, "NON_STRING_KEY", msg); + } + if (spaceBefore) + node2.spaceBefore = true; + if (comment2) { + if (token.type === "scalar" && token.source === "") + node2.comment = comment2; + else + node2.commentBefore = comment2; + } + if (ctx.options.keepSourceTokens && isSrcToken) + node2.srcToken = token; + return node2; +} +function composeEmptyNode(ctx, offset2, before, pos, { spaceBefore, comment: comment2, anchor, tag, end }, onError) { + const token = { + type: "scalar", + offset: emptyScalarPosition(offset2, before, pos), + indent: -1, + source: "" + }; + const node2 = composeScalar(ctx, token, tag, onError); + if (anchor) { + node2.anchor = anchor.source.substring(1); + if (node2.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + } + if (spaceBefore) + node2.spaceBefore = true; + if (comment2) { + node2.comment = comment2; + node2.range[2] = end; + } + return node2; +} +function composeAlias({ options: options2 }, { offset: offset2, source: source2, end }, onError) { + const alias = new Alias(source2.substring(1)); + if (alias.source === "") + onError(offset2, "BAD_ALIAS", "Alias cannot be an empty string"); + if (alias.source.endsWith(":")) + onError(offset2 + source2.length - 1, "BAD_ALIAS", "Alias ending in : is ambiguous", true); + const valueEnd = offset2 + source2.length; + const re2 = resolveEnd(end, valueEnd, options2.strict, onError); + alias.range = [offset2, valueEnd, re2.offset]; + if (re2.comment) + alias.comment = re2.comment; + return alias; +} +function composeDoc(options2, directives, { offset: offset2, start, value, end }, onError) { + const opts = Object.assign({ _directives: directives }, options2); + const doc = new Document(void 0, opts); + const ctx = { + atKey: false, + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps(start, { + indicator: "doc-start", + next: value ?? (end == null ? void 0 : end[0]), + offset: offset2, + onError, + parentIndent: 0, + startOnNewline: true + }); + if (props.found) { + doc.directives.docStart = true; + if (value && (value.type === "block-map" || value.type === "block-seq") && !props.hasNewline) + onError(props.end, "MISSING_CHAR", "Block collection cannot start on same line with directives-end marker"); + } + doc.contents = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re2 = resolveEnd(end, contentEnd, false, onError); + if (re2.comment) + doc.comment = re2.comment; + doc.range = [offset2, contentEnd, re2.offset]; + return doc; +} +function getErrorPos(src2) { + if (typeof src2 === "number") + return [src2, src2 + 1]; + if (Array.isArray(src2)) + return src2.length === 2 ? src2 : [src2[0], src2[1]]; + const { offset: offset2, source: source2 } = src2; + return [offset2, offset2 + (typeof source2 === "string" ? source2.length : 1)]; +} +function parsePrelude(prelude) { + var _a2; + let comment2 = ""; + let atComment = false; + let afterEmptyLine = false; + for (let i = 0; i < prelude.length; ++i) { + const source2 = prelude[i]; + switch (source2[0]) { + case "#": + comment2 += (comment2 === "" ? "" : afterEmptyLine ? "\n\n" : "\n") + (source2.substring(1) || " "); + atComment = true; + afterEmptyLine = false; + break; + case "%": + if (((_a2 = prelude[i + 1]) == null ? void 0 : _a2[0]) !== "#") + i += 1; + atComment = false; + break; + default: + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment: comment2, afterEmptyLine }; +} +class Composer { + constructor(options2 = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source2, code, message, warning) => { + const pos = getErrorPos(source2); + if (warning) + this.warnings.push(new YAMLWarning(pos, code, message)); + else + this.errors.push(new YAMLParseError(pos, code, message)); + }; + this.directives = new Directives({ version: options2.version || "1.2" }); + this.options = options2; + } + decorate(doc, afterDoc) { + const { comment: comment2, afterEmptyLine } = parsePrelude(this.prelude); + if (comment2) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment} +${comment2}` : comment2; + } else if (afterEmptyLine || doc.directives.docStart || !dc) { + doc.commentBefore = comment2; + } else if (isCollection$1(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment2} +${cb}` : comment2; + } else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment2} +${cb}` : comment2; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + /** + * Current stream status information. + * + * Mostly useful at the end of input for an empty stream. + */ + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + /** + * Compose tokens into documents. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + /** Advance the composer by one CST token. */ + *next(token) { + switch (token.type) { + case "directive": + this.directives.add(token.source, (offset2, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset2; + this.onError(pos, "BAD_DIRECTIVE", message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case "document": { + const doc = composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.docStart) + this.onError(token, "MISSING_CHAR", "Missing directives-end/doc-start indicator line"); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case "byte-order-mark": + case "space": + break; + case "comment": + case "newline": + this.prelude.push(token.source); + break; + case "error": { + const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message; + const error2 = new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg); + if (this.atDirectives || !this.doc) + this.errors.push(error2); + else + this.doc.errors.push(error2); + break; + } + case "doc-end": { + if (!this.doc) { + const msg = "Unexpected doc-end without preceding document"; + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg)); + break; + } + this.doc.directives.docEnd = true; + const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc} +${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`)); + } + } + /** + * Call at end of input to yield any remaining document. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } else if (forceDoc) { + const opts = Object.assign({ _directives: this.directives }, this.options); + const doc = new Document(void 0, opts); + if (this.atDirectives) + this.onError(endOffset, "MISSING_CHAR", "Missing directives-end indicator line"); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } +} +function resolveAsScalar(token, strict = true, onError) { + if (token) { + const _onError = (pos, code, message) => { + const offset2 = typeof pos === "number" ? pos : Array.isArray(pos) ? pos[0] : pos.offset; + if (onError) + onError(offset2, code, message); + else + throw new YAMLParseError([offset2, offset2 + 1], code, message); + }; + switch (token.type) { + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return resolveFlowScalar(token, strict, _onError); + case "block-scalar": + return resolveBlockScalar({ options: { strict } }, token, _onError); + } + } + return null; +} +function createScalarToken(value, context) { + const { implicitKey = false, indent, inFlow = false, offset: offset2 = -1, type: type2 = "PLAIN" } = context; + const source2 = stringifyString({ type: type2, value }, { + implicitKey, + indent: indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + const end = context.end ?? [ + { type: "newline", offset: -1, indent, source: "\n" } + ]; + switch (source2[0]) { + case "|": + case ">": { + const he = source2.indexOf("\n"); + const head = source2.substring(0, he); + const body = source2.substring(he + 1) + "\n"; + const props = [ + { type: "block-scalar-header", offset: offset2, indent, source: head } + ]; + if (!addEndtoBlockProps(props, end)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + return { type: "block-scalar", offset: offset2, indent, props, source: body }; + } + case '"': + return { type: "double-quoted-scalar", offset: offset2, indent, source: source2, end }; + case "'": + return { type: "single-quoted-scalar", offset: offset2, indent, source: source2, end }; + default: + return { type: "scalar", offset: offset2, indent, source: source2, end }; + } +} +function setScalarValue(token, value, context = {}) { + let { afterKey = false, implicitKey = false, inFlow = false, type: type2 } = context; + let indent = "indent" in token ? token.indent : null; + if (afterKey && typeof indent === "number") + indent += 2; + if (!type2) + switch (token.type) { + case "single-quoted-scalar": + type2 = "QUOTE_SINGLE"; + break; + case "double-quoted-scalar": + type2 = "QUOTE_DOUBLE"; + break; + case "block-scalar": { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + type2 = header.source[0] === ">" ? "BLOCK_FOLDED" : "BLOCK_LITERAL"; + break; + } + default: + type2 = "PLAIN"; + } + const source2 = stringifyString({ type: type2, value }, { + implicitKey: implicitKey || indent === null, + indent: indent !== null && indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + switch (source2[0]) { + case "|": + case ">": + setBlockScalarValue(token, source2); + break; + case '"': + setFlowScalarValue(token, source2, "double-quoted-scalar"); + break; + case "'": + setFlowScalarValue(token, source2, "single-quoted-scalar"); + break; + default: + setFlowScalarValue(token, source2, "scalar"); + } +} +function setBlockScalarValue(token, source2) { + const he = source2.indexOf("\n"); + const head = source2.substring(0, he); + const body = source2.substring(he + 1) + "\n"; + if (token.type === "block-scalar") { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + header.source = head; + token.source = body; + } else { + const { offset: offset2 } = token; + const indent = "indent" in token ? token.indent : -1; + const props = [ + { type: "block-scalar-header", offset: offset2, indent, source: head } + ]; + if (!addEndtoBlockProps(props, "end" in token ? token.end : void 0)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + for (const key2 of Object.keys(token)) + if (key2 !== "type" && key2 !== "offset") + delete token[key2]; + Object.assign(token, { type: "block-scalar", indent, props, source: body }); + } +} +function addEndtoBlockProps(props, end) { + if (end) + for (const st of end) + switch (st.type) { + case "space": + case "comment": + props.push(st); + break; + case "newline": + props.push(st); + return true; + } + return false; +} +function setFlowScalarValue(token, source2, type2) { + switch (token.type) { + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + token.type = type2; + token.source = source2; + break; + case "block-scalar": { + const end = token.props.slice(1); + let oa = source2.length; + if (token.props[0].type === "block-scalar-header") + oa -= token.props[0].source.length; + for (const tok of end) + tok.offset += oa; + delete token.props; + Object.assign(token, { type: type2, source: source2, end }); + break; + } + case "block-map": + case "block-seq": { + const offset2 = token.offset + source2.length; + const nl = { type: "newline", offset: offset2, indent: token.indent, source: "\n" }; + delete token.items; + Object.assign(token, { type: type2, source: source2, end: [nl] }); + break; + } + default: { + const indent = "indent" in token ? token.indent : -1; + const end = "end" in token && Array.isArray(token.end) ? token.end.filter((st) => st.type === "space" || st.type === "comment" || st.type === "newline") : []; + for (const key2 of Object.keys(token)) + if (key2 !== "type" && key2 !== "offset") + delete token[key2]; + Object.assign(token, { type: type2, indent, source: source2, end }); + } + } +} +const stringify$1 = (cst2) => "type" in cst2 ? stringifyToken(cst2) : stringifyItem(cst2); +function stringifyToken(token) { + switch (token.type) { + case "block-scalar": { + let res = ""; + for (const tok of token.props) + res += stringifyToken(tok); + return res + token.source; + } + case "block-map": + case "block-seq": { + let res = ""; + for (const item of token.items) + res += stringifyItem(item); + return res; + } + case "flow-collection": { + let res = token.start.source; + for (const item of token.items) + res += stringifyItem(item); + for (const st of token.end) + res += st.source; + return res; + } + case "document": { + let res = stringifyItem(token); + if (token.end) + for (const st of token.end) + res += st.source; + return res; + } + default: { + let res = token.source; + if ("end" in token && token.end) + for (const st of token.end) + res += st.source; + return res; + } + } +} +function stringifyItem({ start, key: key2, sep, value }) { + let res = ""; + for (const st of start) + res += st.source; + if (key2) + res += stringifyToken(key2); + if (sep) + for (const st of sep) + res += st.source; + if (value) + res += stringifyToken(value); + return res; +} +const BREAK = Symbol("break visit"); +const SKIP = Symbol("skip children"); +const REMOVE = Symbol("remove item"); +function visit(cst2, visitor) { + if ("type" in cst2 && cst2.type === "document") + cst2 = { start: cst2.start, value: cst2.value }; + _visit(Object.freeze([]), cst2, visitor); +} +visit.BREAK = BREAK; +visit.SKIP = SKIP; +visit.REMOVE = REMOVE; +visit.itemAtPath = (cst2, path2) => { + let item = cst2; + for (const [field, index2] of path2) { + const tok = item == null ? void 0 : item[field]; + if (tok && "items" in tok) { + item = tok.items[index2]; + } else + return void 0; + } + return item; +}; +visit.parentCollection = (cst2, path2) => { + const parent = visit.itemAtPath(cst2, path2.slice(0, -1)); + const field = path2[path2.length - 1][0]; + const coll = parent == null ? void 0 : parent[field]; + if (coll && "items" in coll) + return coll; + throw new Error("Parent collection not found"); +}; +function _visit(path2, item, visitor) { + let ctrl = visitor(item, path2); + if (typeof ctrl === "symbol") + return ctrl; + for (const field of ["key", "value"]) { + const token = item[field]; + if (token && "items" in token) { + for (let i = 0; i < token.items.length; ++i) { + const ci = _visit(Object.freeze(path2.concat([[field, i]])), token.items[i], visitor); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + token.items.splice(i, 1); + i -= 1; + } + } + if (typeof ctrl === "function" && field === "key") + ctrl = ctrl(item, path2); + } + } + return typeof ctrl === "function" ? ctrl(item, path2) : ctrl; +} +const BOM = "\uFEFF"; +const DOCUMENT = ""; +const FLOW_END = ""; +const SCALAR = ""; +const isCollection = (token) => !!token && "items" in token; +const isScalar = (token) => !!token && (token.type === "scalar" || token.type === "single-quoted-scalar" || token.type === "double-quoted-scalar" || token.type === "block-scalar"); +function prettyToken(token) { + switch (token) { + case BOM: + return ""; + case DOCUMENT: + return ""; + case FLOW_END: + return ""; + case SCALAR: + return ""; + default: + return JSON.stringify(token); + } +} +function tokenType(source2) { + switch (source2) { + case BOM: + return "byte-order-mark"; + case DOCUMENT: + return "doc-mode"; + case FLOW_END: + return "flow-error-end"; + case SCALAR: + return "scalar"; + case "---": + return "doc-start"; + case "...": + return "doc-end"; + case "": + case "\n": + case "\r\n": + return "newline"; + case "-": + return "seq-item-ind"; + case "?": + return "explicit-key-ind"; + case ":": + return "map-value-ind"; + case "{": + return "flow-map-start"; + case "}": + return "flow-map-end"; + case "[": + return "flow-seq-start"; + case "]": + return "flow-seq-end"; + case ",": + return "comma"; + } + switch (source2[0]) { + case " ": + case " ": + return "space"; + case "#": + return "comment"; + case "%": + return "directive-line"; + case "*": + return "alias"; + case "&": + return "anchor"; + case "!": + return "tag"; + case "'": + return "single-quoted-scalar"; + case '"': + return "double-quoted-scalar"; + case "|": + case ">": + return "block-scalar-header"; + } + return null; +} +const cst = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + BOM, + DOCUMENT, + FLOW_END, + SCALAR, + createScalarToken, + isCollection, + isScalar, + prettyToken, + resolveAsScalar, + setScalarValue, + stringify: stringify$1, + tokenType, + visit +}, Symbol.toStringTag, { value: "Module" })); +function isEmpty(ch) { + switch (ch) { + case void 0: + case " ": + case "\n": + case "\r": + case " ": + return true; + default: + return false; + } +} +const hexDigits = new Set("0123456789ABCDEFabcdef"); +const tagChars = new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"); +const flowIndicatorChars = new Set(",[]{}"); +const invalidAnchorChars = new Set(" ,[]{}\n\r "); +const isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch); +class Lexer { + constructor() { + this.atEnd = false; + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + this.buffer = ""; + this.flowKey = false; + this.flowLevel = 0; + this.indentNext = 0; + this.indentValue = 0; + this.lineEndPos = null; + this.next = null; + this.pos = 0; + } + /** + * Generate YAML tokens from the `source` string. If `incomplete`, + * a part of the last line may be left as a buffer for the next call. + * + * @returns A generator of lexical tokens + */ + *lex(source2, incomplete = false) { + if (source2) { + if (typeof source2 !== "string") + throw TypeError("source is not a string"); + this.buffer = this.buffer ? this.buffer + source2 : source2; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = this.next ?? "stream"; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i = this.pos; + let ch = this.buffer[i]; + while (ch === " " || ch === " ") + ch = this.buffer[++i]; + if (!ch || ch === "#" || ch === "\n") + return true; + if (ch === "\r") + return this.buffer[i + 1] === "\n"; + return false; + } + charAt(n) { + return this.buffer[this.pos + n]; + } + continueScalar(offset2) { + let ch = this.buffer[offset2]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === " ") + ch = this.buffer[++indent + offset2]; + if (ch === "\r") { + const next = this.buffer[indent + offset2 + 1]; + if (next === "\n" || !next && !this.atEnd) + return offset2 + indent + 1; + } + return ch === "\n" || indent >= this.indentNext || !ch && !this.atEnd ? offset2 + indent : -1; + } + if (ch === "-" || ch === ".") { + const dt = this.buffer.substr(offset2, 3); + if ((dt === "---" || dt === "...") && isEmpty(this.buffer[offset2 + 3])) + return -1; + } + return offset2; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== "number" || end !== -1 && end < this.pos) { + end = this.buffer.indexOf("\n", this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === "\r") + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n) { + return this.pos + n <= this.buffer.length; + } + setNext(state2) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state2; + return null; + } + peek(n) { + return this.buffer.substr(this.pos, n); + } + *parseNext(next) { + switch (next) { + case "stream": + return yield* this.parseStream(); + case "line-start": + return yield* this.parseLineStart(); + case "block-start": + return yield* this.parseBlockStart(); + case "doc": + return yield* this.parseDocument(); + case "flow": + return yield* this.parseFlowCollection(); + case "quoted-scalar": + return yield* this.parseQuotedScalar(); + case "block-scalar": + return yield* this.parseBlockScalar(); + case "plain-scalar": + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext("stream"); + if (line[0] === BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === "%") { + let dirEnd = line.length; + let cs = line.indexOf("#"); + while (cs !== -1) { + const ch = line[cs - 1]; + if (ch === " " || ch === " ") { + dirEnd = cs - 1; + break; + } else { + cs = line.indexOf("#", cs + 1); + } + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === " " || ch === " ") + dirEnd -= 1; + else + break; + } + const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n); + this.pushNewline(); + return "stream"; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return "stream"; + } + yield DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext("line-start"); + if (ch === "-" || ch === ".") { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext("line-start"); + const s = this.peek(3); + if ((s === "---" || s === "...") && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return s === "---" ? "doc" : "stream"; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext("block-start"); + if ((ch0 === "-" || ch0 === "?" || ch0 === ":") && isEmpty(ch1)) { + const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n; + return yield* this.parseBlockStart(); + } + return "doc"; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext("doc"); + let n = yield* this.pushIndicators(); + switch (line[n]) { + case "#": + yield* this.pushCount(line.length - n); + // fallthrough + case void 0: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + return "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "doc"; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case "|": + case ">": + n += yield* this.parseBlockScalarHeader(); + n += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + if (nl > 0) { + sp = yield* this.pushSpaces(false); + this.indentValue = indent = sp; + } else { + sp = 0; + } + sp += yield* this.pushSpaces(true); + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext("flow"); + if (indent !== -1 && indent < this.indentNext && line[0] !== "#" || indent === 0 && (line.startsWith("---") || line.startsWith("...")) && isEmpty(line[3])) { + const atFlowEndMarker = indent === this.indentNext - 1 && this.flowLevel === 1 && (line[0] === "]" || line[0] === "}"); + if (!atFlowEndMarker) { + this.flowLevel = 0; + yield FLOW_END; + return yield* this.parseLineStart(); + } + } + let n = 0; + while (line[n] === ",") { + n += yield* this.pushCount(1); + n += yield* this.pushSpaces(true); + this.flowKey = false; + } + n += yield* this.pushIndicators(); + switch (line[n]) { + case void 0: + return "flow"; + case "#": + yield* this.pushCount(line.length - n); + return "flow"; + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? "flow" : "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "flow"; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ":": { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ",") { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return "flow"; + } + } + // fallthrough + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote2 = this.charAt(0); + let end = this.buffer.indexOf(quote2, this.pos + 1); + if (quote2 === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } else { + while (end !== -1) { + let n = 0; + while (this.buffer[end - 1 - n] === "\\") + n += 1; + if (n % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf("\n", this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf("\n", cs); + } + if (nl !== -1) { + end = nl - (qb[nl - 1] === "\r" ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext("quoted-scalar"); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? "flow" : "doc"; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i = this.pos; + while (true) { + const ch = this.buffer[++i]; + if (ch === "+") + this.blockScalarKeep = true; + else if (ch > "0" && ch <= "9") + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== "-") + break; + } + return yield* this.pushUntil((ch) => isEmpty(ch) || ch === "#"); + } + *parseBlockScalar() { + let nl = this.pos - 1; + let indent = 0; + let ch; + loop: for (let i2 = this.pos; ch = this.buffer[i2]; ++i2) { + switch (ch) { + case " ": + indent += 1; + break; + case "\n": + nl = i2; + indent = 0; + break; + case "\r": { + const next = this.buffer[i2 + 1]; + if (!next && !this.atEnd) + return this.setNext("block-scalar"); + if (next === "\n") + break; + } + // fallthrough + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext("block-scalar"); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else { + this.indentNext = this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext); + } + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf("\n", cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext("block-scalar"); + nl = this.buffer.length; + } + } + let i = nl + 1; + ch = this.buffer[i]; + while (ch === " ") + ch = this.buffer[++i]; + if (ch === " ") { + while (ch === " " || ch === " " || ch === "\r" || ch === "\n") + ch = this.buffer[++i]; + nl = i - 1; + } else if (!this.blockScalarKeep) { + do { + let i2 = nl - 1; + let ch2 = this.buffer[i2]; + if (ch2 === "\r") + ch2 = this.buffer[--i2]; + const lastChar = i2; + while (ch2 === " ") + ch2 = this.buffer[--i2]; + if (ch2 === "\n" && i2 >= this.pos && i2 + 1 + indent > lastChar) + nl = i2; + else + break; + } while (true); + } + yield SCALAR; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i = this.pos - 1; + let ch; + while (ch = this.buffer[++i]) { + if (ch === ":") { + const next = this.buffer[i + 1]; + if (isEmpty(next) || inFlow && flowIndicatorChars.has(next)) + break; + end = i; + } else if (isEmpty(ch)) { + let next = this.buffer[i + 1]; + if (ch === "\r") { + if (next === "\n") { + i += 1; + ch = "\n"; + next = this.buffer[i + 1]; + } else + end = i; + } + if (next === "#" || inFlow && flowIndicatorChars.has(next)) + break; + if (ch === "\n") { + const cs = this.continueScalar(i + 1); + if (cs === -1) + break; + i = Math.max(i, cs - 2); + } + } else { + if (inFlow && flowIndicatorChars.has(ch)) + break; + end = i; + } + } + if (!ch && !this.atEnd) + return this.setNext("plain-scalar"); + yield SCALAR; + yield* this.pushToIndex(end + 1, true); + return inFlow ? "flow" : "doc"; + } + *pushCount(n) { + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos += n; + return n; + } + return 0; + } + *pushToIndex(i, allowEmpty) { + const s = this.buffer.slice(this.pos, i); + if (s) { + yield s; + this.pos += s.length; + return s.length; + } else if (allowEmpty) + yield ""; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case "!": + return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "&": + return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "-": + // this is an error + case "?": + // this is an error outside flow collections + case ":": { + const inFlow = this.flowLevel > 0; + const ch1 = this.charAt(1); + if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) { + if (!inFlow) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + } + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === "<") { + let i = this.pos + 2; + let ch = this.buffer[i]; + while (!isEmpty(ch) && ch !== ">") + ch = this.buffer[++i]; + return yield* this.pushToIndex(ch === ">" ? i + 1 : i, false); + } else { + let i = this.pos + 1; + let ch = this.buffer[i]; + while (ch) { + if (tagChars.has(ch)) + ch = this.buffer[++i]; + else if (ch === "%" && hexDigits.has(this.buffer[i + 1]) && hexDigits.has(this.buffer[i + 2])) { + ch = this.buffer[i += 3]; + } else + break; + } + return yield* this.pushToIndex(i, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === "\n") + return yield* this.pushCount(1); + else if (ch === "\r" && this.charAt(1) === "\n") + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i = this.pos - 1; + let ch; + do { + ch = this.buffer[++i]; + } while (ch === " " || allowTabs && ch === " "); + const n = i - this.pos; + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos = i; + } + return n; + } + *pushUntil(test) { + let i = this.pos; + let ch = this.buffer[i]; + while (!test(ch)) + ch = this.buffer[++i]; + return yield* this.pushToIndex(i, false); + } +} +class LineCounter { + constructor() { + this.lineStarts = []; + this.addNewLine = (offset2) => this.lineStarts.push(offset2); + this.linePos = (offset2) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = low + high >> 1; + if (this.lineStarts[mid] < offset2) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset2) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset2 }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset2 - start + 1 }; + }; + } +} +function includesToken(list, type2) { + for (let i = 0; i < list.length; ++i) + if (list[i].type === type2) + return true; + return false; +} +function findNonEmptyIndex(list) { + for (let i = 0; i < list.length; ++i) { + switch (list[i].type) { + case "space": + case "comment": + case "newline": + break; + default: + return i; + } + } + return -1; +} +function isFlowToken(token) { + switch (token == null ? void 0 : token.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "flow-collection": + return true; + default: + return false; + } +} +function getPrevProps(parent) { + switch (parent.type) { + case "document": + return parent.start; + case "block-map": { + const it = parent.items[parent.items.length - 1]; + return it.sep ?? it.start; + } + case "block-seq": + return parent.items[parent.items.length - 1].start; + /* istanbul ignore next should not happen */ + default: + return []; + } +} +function getFirstKeyStartProps(prev) { + var _a2; + if (prev.length === 0) + return []; + let i = prev.length; + loop: while (--i >= 0) { + switch (prev[i].type) { + case "doc-start": + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + case "newline": + break loop; + } + } + while (((_a2 = prev[++i]) == null ? void 0 : _a2.type) === "space") { + } + return prev.splice(i, prev.length); +} +function fixFlowSeqItems(fc) { + if (fc.start.type === "flow-seq-start") { + for (const it of fc.items) { + if (it.sep && !it.value && !includesToken(it.start, "explicit-key-ind") && !includesToken(it.sep, "map-value-ind")) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } +} +let Parser$1 = class Parser { + /** + * @param onNewLine - If defined, called separately with the start position of + * each new line (in `parse()`, including the start of input). + */ + constructor(onNewLine) { + this.atNewLine = true; + this.atScalar = false; + this.indent = 0; + this.offset = 0; + this.onKeyLine = false; + this.stack = []; + this.source = ""; + this.type = ""; + this.lexer = new Lexer(); + this.onNewLine = onNewLine; + } + /** + * Parse `source` as a YAML stream. + * If `incomplete`, a part of the last line may be left as a buffer for the next call. + * + * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens. + * + * @returns A generator of tokens representing each directive, document, and other structure. + */ + *parse(source2, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source2, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + /** + * Advance the parser by the `source` of one lexical token. + */ + *next(source2) { + this.source = source2; + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source2.length; + return; + } + const type2 = tokenType(source2); + if (!type2) { + const message = `Not a YAML token: ${source2}`; + yield* this.pop({ type: "error", offset: this.offset, message, source: source2 }); + this.offset += source2.length; + } else if (type2 === "scalar") { + this.atNewLine = false; + this.atScalar = true; + this.type = "scalar"; + } else { + this.type = type2; + yield* this.step(); + switch (type2) { + case "newline": + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source2.length); + break; + case "space": + if (this.atNewLine && source2[0] === " ") + this.indent += source2.length; + break; + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + if (this.atNewLine) + this.indent += source2.length; + break; + case "doc-mode": + case "flow-error-end": + return; + default: + this.atNewLine = false; + } + this.offset += source2.length; + } + } + /** Call at end of input to push out any remaining constructions */ + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === "doc-end" && (!top || top.type !== "doc-end")) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: "doc-end", + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case "document": + return yield* this.document(top); + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return yield* this.scalar(top); + case "block-scalar": + return yield* this.blockScalar(top); + case "block-map": + return yield* this.blockMap(top); + case "block-seq": + return yield* this.blockSequence(top); + case "flow-collection": + return yield* this.flowCollection(top); + case "doc-end": + return yield* this.documentEnd(top); + } + yield* this.pop(); + } + peek(n) { + return this.stack[this.stack.length - n]; + } + *pop(error2) { + const token = error2 ?? this.stack.pop(); + if (!token) { + const message = "Tried to pop an empty stack"; + yield { type: "error", offset: this.offset, source: "", message }; + } else if (this.stack.length === 0) { + yield token; + } else { + const top = this.peek(1); + if (token.type === "block-scalar") { + token.indent = "indent" in top ? top.indent : 0; + } else if (token.type === "flow-collection" && top.type === "document") { + token.indent = 0; + } + if (token.type === "flow-collection") + fixFlowSeqItems(token); + switch (top.type) { + case "document": + top.value = token; + break; + case "block-scalar": + top.props.push(token); + break; + case "block-map": { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } else if (it.sep) { + it.value = token; + } else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !it.explicitKey; + return; + } + break; + } + case "block-seq": { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case "flow-collection": { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + /* istanbul ignore next should not happen */ + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === "document" || top.type === "block-map" || top.type === "block-seq") && (token.type === "block-map" || token.type === "block-seq")) { + const last = token.items[token.items.length - 1]; + if (last && !last.sep && !last.value && last.start.length > 0 && findNonEmptyIndex(last.start) === -1 && (token.indent === 0 || last.start.every((st) => st.type !== "comment" || st.indent < token.indent))) { + if (top.type === "document") + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case "directive-line": + yield { type: "directive", offset: this.offset, source: this.source }; + return; + case "byte-order-mark": + case "space": + case "comment": + case "newline": + yield this.sourceToken; + return; + case "doc-mode": + case "doc-start": { + const doc = { + type: "document", + offset: this.offset, + start: [] + }; + if (this.type === "doc-start") + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case "doc-start": { + if (findNonEmptyIndex(doc.start) !== -1) { + yield* this.pop(); + yield* this.step(); + } else + doc.start.push(this.sourceToken); + return; + } + case "anchor": + case "tag": + case "space": + case "comment": + case "newline": + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } + } + *scalar(scalar) { + if (this.type === "map-value-ind") { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep; + if (scalar.end) { + sep = scalar.end; + sep.push(this.sourceToken); + delete scalar.end; + } else + sep = [this.sourceToken]; + const map2 = { + type: "block-map", + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case "space": + case "comment": + case "newline": + scalar.props.push(this.sourceToken); + return; + case "scalar": + scalar.source = this.source; + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + yield* this.pop(); + break; + /* istanbul ignore next should not happen */ + default: + yield* this.pop(); + yield* this.step(); + } + } + *blockMap(map2) { + var _a2; + const it = map2.items[map2.items.length - 1]; + switch (this.type) { + case "newline": + this.onKeyLine = false; + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "space": + case "comment": + if (it.value) { + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + if (this.atIndentedComment(it.start, map2.indent)) { + const prev = map2.items[map2.items.length - 2]; + const end = (_a2 = prev == null ? void 0 : prev.value) == null ? void 0 : _a2.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + } + if (this.indent >= map2.indent) { + const atMapIndent = !this.onKeyLine && this.indent === map2.indent; + const atNextItem = atMapIndent && (it.sep || it.explicitKey) && this.type !== "seq-item-ind"; + let start = []; + if (atNextItem && it.sep && !it.value) { + const nl = []; + for (let i = 0; i < it.sep.length; ++i) { + const st = it.sep[i]; + switch (st.type) { + case "newline": + nl.push(i); + break; + case "space": + break; + case "comment": + if (st.indent > map2.indent) + nl.length = 0; + break; + default: + nl.length = 0; + } + } + if (nl.length >= 2) + start = it.sep.splice(nl[1]); + } + switch (this.type) { + case "anchor": + case "tag": + if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start }); + this.onKeyLine = true; + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "explicit-key-ind": + if (!it.sep && !it.explicitKey) { + it.start.push(this.sourceToken); + it.explicitKey = true; + } else if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start, explicitKey: true }); + } else { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken], explicitKey: true }] + }); + } + this.onKeyLine = true; + return; + case "map-value-ind": + if (it.explicitKey) { + if (!it.sep) { + if (includesToken(it.start, "newline")) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else { + const start2 = getFirstKeyStartProps(it.start); + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: null, sep: [this.sourceToken] }] + }); + } + } else if (it.value) { + map2.items.push({ start: [], key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }); + } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) { + const start2 = getFirstKeyStartProps(it.start); + const key2 = it.key; + const sep = it.sep; + sep.push(this.sourceToken); + delete it.key; + delete it.sep; + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: key2, sep }] + }); + } else if (start.length > 0) { + it.sep = it.sep.concat(start, this.sourceToken); + } else { + it.sep.push(this.sourceToken); + } + } else { + if (!it.sep) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else if (it.value || atNextItem) { + map2.items.push({ start, key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + } else { + it.sep.push(this.sourceToken); + } + } + this.onKeyLine = true; + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs2 = this.flowScalar(this.type); + if (atNextItem || it.value) { + map2.items.push({ start, key: fs2, sep: [] }); + this.onKeyLine = true; + } else if (it.sep) { + this.stack.push(fs2); + } else { + Object.assign(it, { key: fs2, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map2); + if (bv) { + if (atMapIndent && bv.type !== "block-seq") { + map2.items.push({ start }); + } + this.stack.push(bv); + return; + } + } + } + } + yield* this.pop(); + yield* this.step(); + } + *blockSequence(seq2) { + var _a2; + const it = seq2.items[seq2.items.length - 1]; + switch (this.type) { + case "newline": + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + seq2.items.push({ start: [this.sourceToken] }); + } else + it.start.push(this.sourceToken); + return; + case "space": + case "comment": + if (it.value) + seq2.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq2.indent)) { + const prev = seq2.items[seq2.items.length - 2]; + const end = (_a2 = prev == null ? void 0 : prev.value) == null ? void 0 : _a2.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case "anchor": + case "tag": + if (it.value || this.indent <= seq2.indent) + break; + it.start.push(this.sourceToken); + return; + case "seq-item-ind": + if (this.indent !== seq2.indent) + break; + if (it.value || includesToken(it.start, "seq-item-ind")) + seq2.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq2.indent) { + const bv = this.startBlockValue(seq2); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); + } + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === "flow-error-end") { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === "flow-collection"); + } else if (fc.end.length === 0) { + switch (this.type) { + case "comma": + case "explicit-key-ind": + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case "map-value-ind": + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case "space": + case "comment": + case "newline": + case "anchor": + case "tag": + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs2 = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs2, sep: [] }); + else if (it.sep) + this.stack.push(fs2); + else + Object.assign(it, { key: fs2, sep: [] }); + return; + } + case "flow-map-end": + case "flow-seq-end": + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } else { + const parent = this.peek(2); + if (parent.type === "block-map" && (this.type === "map-value-ind" && parent.indent === fc.indent || this.type === "newline" && !parent.items[parent.items.length - 1].sep)) { + yield* this.pop(); + yield* this.step(); + } else if (this.type === "map-value-ind" && parent.type !== "flow-collection") { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep = fc.end.splice(1, fc.end.length); + sep.push(this.sourceToken); + const map2 = { + type: "block-map", + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else { + yield* this.lineEnd(fc); + } + } + } + flowScalar(type2) { + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + return { + type: type2, + offset: this.offset, + indent: this.indent, + source: this.source + }; + } + startBlockValue(parent) { + switch (this.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return this.flowScalar(this.type); + case "block-scalar-header": + return { + type: "block-scalar", + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: "" + }; + case "flow-map-start": + case "flow-seq-start": + return { + type: "flow-collection", + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case "seq-item-ind": + return { + type: "block-seq", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case "explicit-key-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, explicitKey: true }] + }; + } + case "map-value-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; + } + atIndentedComment(start, indent) { + if (this.type !== "comment") + return false; + if (this.indent <= indent) + return false; + return start.every((st) => st.type === "newline" || st.type === "space"); + } + *documentEnd(docEnd) { + if (this.type !== "doc-mode") { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case "comma": + case "doc-start": + case "doc-end": + case "flow-seq-end": + case "flow-map-end": + case "map-value-ind": + yield* this.pop(); + yield* this.step(); + break; + case "newline": + this.onKeyLine = false; + // fallthrough + case "space": + case "comment": + default: + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } +}; +function parseOptions(options2) { + const prettyErrors = options2.prettyErrors !== false; + const lineCounter = options2.lineCounter || prettyErrors && new LineCounter() || null; + return { lineCounter, prettyErrors }; +} +function parseAllDocuments(source2, options2 = {}) { + const { lineCounter, prettyErrors } = parseOptions(options2); + const parser2 = new Parser$1(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options2); + const docs = Array.from(composer.compose(parser2.parse(source2))); + if (prettyErrors && lineCounter) + for (const doc of docs) { + doc.errors.forEach(prettifyError(source2, lineCounter)); + doc.warnings.forEach(prettifyError(source2, lineCounter)); + } + if (docs.length > 0) + return docs; + return Object.assign([], { empty: true }, composer.streamInfo()); +} +function parseDocument(source2, options2 = {}) { + const { lineCounter, prettyErrors } = parseOptions(options2); + const parser2 = new Parser$1(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options2); + let doc = null; + for (const _doc of composer.compose(parser2.parse(source2), true, source2.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== "silent") { + doc.errors.push(new YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()")); + break; + } + } + if (prettyErrors && lineCounter) { + doc.errors.forEach(prettifyError(source2, lineCounter)); + doc.warnings.forEach(prettifyError(source2, lineCounter)); + } + return doc; +} +function parse$2(src2, reviver, options2) { + let _reviver = void 0; + if (typeof reviver === "function") { + _reviver = reviver; + } else if (options2 === void 0 && reviver && typeof reviver === "object") { + options2 = reviver; + } + const doc = parseDocument(src2, options2); + if (!doc) + return null; + doc.warnings.forEach((warning) => warn(doc.options.logLevel, warning)); + if (doc.errors.length > 0) { + if (doc.options.logLevel !== "silent") + throw doc.errors[0]; + else + doc.errors = []; + } + return doc.toJS(Object.assign({ reviver: _reviver }, options2)); +} +function stringify(value, replacer, options2) { + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options2 === void 0 && replacer) { + options2 = replacer; + } + if (typeof options2 === "string") + options2 = options2.length; + if (typeof options2 === "number") { + const indent = Math.round(options2); + options2 = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent }; + } + if (value === void 0) { + const { keepUndefined } = options2 ?? replacer ?? {}; + if (!keepUndefined) + return void 0; + } + if (isDocument(value) && !_replacer) + return value.toString(options2); + return new Document(value, _replacer, options2).toString(options2); +} +const YAML = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + Alias, + CST: cst, + Composer, + Document, + Lexer, + LineCounter, + Pair, + Parser: Parser$1, + Scalar, + Schema, + YAMLError, + YAMLMap, + YAMLParseError, + YAMLSeq, + YAMLWarning, + isAlias, + isCollection: isCollection$1, + isDocument, + isMap, + isNode, + isPair, + isScalar: isScalar$1, + isSeq, + parse: parse$2, + parseAllDocuments, + parseDocument, + stringify, + visit: visit$1, + visitAsync +}, Symbol.toStringTag, { value: "Module" })); +var browser$2; +var hasRequiredBrowser$2; +function requireBrowser$2() { + if (hasRequiredBrowser$2) return browser$2; + hasRequiredBrowser$2 = 1; + browser$2 = function() { + throw new Error( + "ws does not work in the browser. Browser clients must use the native WebSocket object" + ); + }; + return browser$2; +} +var browserExports$1 = requireBrowser$2(); +const wsLibrary = /* @__PURE__ */ getDefaultExportFromCjs(browserExports$1); +const colors$1 = colorsLibrary; +const debug$1 = debugLibrary; +const diff2 = diffLibrary; +const dotenv = dotenvLibrary; +const jpegjs$1 = jpegLibrary; +const lockfileLibrary = requireLockfile(); +const lockfile$1 = lockfileLibrary; +const mime$1 = mimeLibrary; +const minimatch = minimatchLibrary; +const open$1 = openLibrary; +const progress$1 = progressLibrary; +const yaml$1 = YAML; +const ws$1 = wsLibrary; +const wsServer = browserExports$1.WebSocketServer; +const wsReceiver$1 = browserExports$1.Receiver; +const wsSender$1 = browserExports$1.Sender; +const utilsBundleImpl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + HttpsProxyAgent: distExports$1.HttpsProxyAgent, + PNG: pngExports.PNG, + SocksProxyAgent: distExports.SocksProxyAgent, + colors: colors$1, + debug: debug$1, + diff: diff2, + dotenv, + getProxyForUrl: proxyFromEnvExports.getProxyForUrl, + jpegjs: jpegjs$1, + lockfile: lockfile$1, + mime: mime$1, + minimatch, + open: open$1, + program: commanderExports.program, + progress: progress$1, + ws: ws$1, + wsReceiver: wsReceiver$1, + wsSender: wsSender$1, + wsServer, + yaml: yaml$1 +}, Symbol.toStringTag, { value: "Module" })); +const require$$0$2 = /* @__PURE__ */ getAugmentedNamespace(utilsBundleImpl); +const colors = require$$0$2.colors; +const debug$2 = require$$0$2.debug; +require$$0$2.diff; +require$$0$2.dotenv; +const getProxyForUrl = require$$0$2.getProxyForUrl; +const HttpsProxyAgent = require$$0$2.HttpsProxyAgent; +const jpegjs = require$$0$2.jpegjs; +const lockfile = require$$0$2.lockfile; +const mime = require$$0$2.mime; +require$$0$2.minimatch; +require$$0$2.open; +const PNG = require$$0$2.PNG; +require$$0$2.program; +const progress = require$$0$2.progress; +const SocksProxyAgent = require$$0$2.SocksProxyAgent; +const yaml = require$$0$2.yaml; +const ws = require$$0$2.ws; +require$$0$2.wsServer; +const wsReceiver = require$$0$2.wsReceiver; +const wsSender = require$$0$2.wsSender; +const debugLoggerColorMap = { + "api": 45, + // cyan + "protocol": 34, + // green + "install": 34, + // green + "download": 34, + // green + "browser": 0, + // reset + "socks": 92, + // purple + "client-certificates": 92, + // purple + "error": 160, + // red, + "channel": 33, + // blue + "server": 45, + // cyan + "server:channel": 34, + // green + "server:metadata": 33, + // blue, + "recorder": 45 + // cyan +}; +class DebugLogger { + constructor() { + this._debuggers = /* @__PURE__ */ new Map(); + if (define_process_env_default.DEBUG_FILE) { + const ansiRegex = new RegExp([ + "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", + "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))" + ].join("|"), "g"); + const stream2 = fs.createWriteStream(define_process_env_default.DEBUG_FILE); + debug$2.log = (data2) => { + stream2.write(data2.replace(ansiRegex, "")); + stream2.write("\n"); + }; + } + } + log(name, message) { + let cachedDebugger = this._debuggers.get(name); + if (!cachedDebugger) { + cachedDebugger = debug$2(`pw:${name}`); + this._debuggers.set(name, cachedDebugger); + cachedDebugger.color = debugLoggerColorMap[name] || 0; + } + cachedDebugger(message); + } + isEnabled(name) { + return debug$2.enabled(`pw:${name}`); + } +} +const debugLogger = new DebugLogger(); +const kLogCount = 150; +class RecentLogsCollector { + constructor() { + this._logs = []; + } + log(message) { + this._logs.push(message); + if (this._logs.length === kLogCount * 2) + this._logs.splice(0, kLogCount); + } + recentLogs() { + if (this._logs.length > kLogCount) + return this._logs.slice(-150); + return this._logs; + } +} +function captureRawStack() { + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 50; + const error2 = new Error(); + const stack = error2.stack || ""; + Error.stackTraceLimit = stackTraceLimit; + return stack.split("\n"); +} +function parseStackFrame(text, pathSeparator, showInternalStackFrames) { + const match = text && text.match(re); + if (!match) + return null; + let fname = match[2]; + let file = match[7]; + if (!file) + return null; + if (!showInternalStackFrames && (file.startsWith("internal") || file.startsWith("node:"))) + return null; + const line = match[8]; + const column = match[9]; + const closeParen = match[11] === ")"; + const frame = { + file: "", + line: 0, + column: 0 + }; + if (line) + frame.line = Number(line); + if (column) + frame.column = Number(column); + if (closeParen && file) { + let closes = 0; + for (let i = file.length - 1; i > 0; i--) { + if (file.charAt(i) === ")") { + closes++; + } else if (file.charAt(i) === "(" && file.charAt(i - 1) === " ") { + closes--; + if (closes === -1 && file.charAt(i - 1) === " ") { + const before = file.slice(0, i - 1); + const after = file.slice(i + 1); + file = after; + fname += ` (${before}`; + break; + } + } + } + } + if (fname) { + const methodMatch = fname.match(methodRe); + if (methodMatch) + fname = methodMatch[1]; + } + if (file) { + if (file.startsWith("file://")) + file = fileURLToPath(file, pathSeparator); + frame.file = file; + } + if (fname) + frame.function = fname; + return frame; +} +function rewriteErrorMessage(e, newMessage) { + var _a2; + const lines = (((_a2 = e.stack) == null ? void 0 : _a2.split("\n")) || []).filter((l) => l.startsWith(" at ")); + e.message = newMessage; + const errorTitle = `${e.name}: ${e.message}`; + if (lines.length) + e.stack = `${errorTitle} +${lines.join("\n")}`; + return e; +} +function stringifyStackFrames(frames) { + const stackLines = []; + for (const frame of frames) { + if (frame.function) + stackLines.push(` at ${frame.function} (${frame.file}:${frame.line}:${frame.column})`); + else + stackLines.push(` at ${frame.file}:${frame.line}:${frame.column}`); + } + return stackLines; +} +function splitErrorMessage(message) { + const separationIdx = message.indexOf(":"); + return { + name: separationIdx !== -1 ? message.slice(0, separationIdx) : "", + message: separationIdx !== -1 && separationIdx + 2 <= message.length ? message.substring(separationIdx + 2) : message + }; +} +const re = new RegExp( + "^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$" +); +const methodRe = /^(.*?) \[as (.*?)\]$/; +function fileURLToPath(fileUrl, pathSeparator) { + if (!fileUrl.startsWith("file://")) + return fileUrl; + let path2 = decodeURIComponent(fileUrl.slice(7)); + if (path2.startsWith("/") && /^[a-zA-Z]:/.test(path2.slice(1))) + path2 = path2.slice(1); + return path2.replace(/\//g, pathSeparator); +} +class ManualPromise extends Promise { + constructor() { + let resolve; + let reject; + super((f, r) => { + resolve = f; + reject = r; + }); + this._isDone = false; + this._resolve = resolve; + this._reject = reject; + } + isDone() { + return this._isDone; + } + resolve(t) { + this._isDone = true; + this._resolve(t); + } + reject(e) { + this._isDone = true; + this._reject(e); + } + static get [Symbol.species]() { + return Promise; + } + get [Symbol.toStringTag]() { + return "ManualPromise"; + } +} +class LongStandingScope { + constructor() { + this._terminatePromises = /* @__PURE__ */ new Map(); + this._isClosed = false; + } + reject(error2) { + this._isClosed = true; + this._terminateError = error2; + for (const p of this._terminatePromises.keys()) + p.resolve(error2); + } + close(error2) { + this._isClosed = true; + this._closeError = error2; + for (const [p, frames] of this._terminatePromises) + p.resolve(cloneError(error2, frames)); + } + isClosed() { + return this._isClosed; + } + static async raceMultiple(scopes, promise) { + return Promise.race(scopes.map((s) => s.race(promise))); + } + async race(promise) { + return this._race(Array.isArray(promise) ? promise : [promise], false); + } + async safeRace(promise, defaultValue) { + return this._race([promise], true, defaultValue); + } + async _race(promises2, safe2, defaultValue) { + const terminatePromise = new ManualPromise(); + const frames = captureRawStack(); + if (this._terminateError) + terminatePromise.resolve(this._terminateError); + if (this._closeError) + terminatePromise.resolve(cloneError(this._closeError, frames)); + this._terminatePromises.set(terminatePromise, frames); + try { + return await Promise.race([ + terminatePromise.then((e) => safe2 ? defaultValue : Promise.reject(e)), + ...promises2 + ]); + } finally { + this._terminatePromises.delete(terminatePromise); + } + } +} +function cloneError(error2, frames) { + const clone = new Error(); + clone.name = error2.name; + clone.message = error2.message; + clone.stack = [error2.name + ":" + error2.message, ...frames].join("\n"); + return clone; +} +const version$2 = "1.53.0"; +const require$$0$1 = { + version: version$2 +}; +let didFailToReadOSRelease = false; +let osRelease; +function getLinuxDistributionInfoSync() { + if (process.platform !== "linux") + return void 0; + if (!osRelease && !didFailToReadOSRelease) { + try { + const osReleaseText = fs.readFileSync("/etc/os-release", "utf8"); + const fields = parseOSReleaseText(osReleaseText); + osRelease = { + id: fields.get("id") ?? "", + version: fields.get("version_id") ?? "" + }; + } catch (e) { + didFailToReadOSRelease = true; + } + } + return osRelease; +} +function parseOSReleaseText(osReleaseText) { + const fields = /* @__PURE__ */ new Map(); + for (const line of osReleaseText.split("\n")) { + const tokens = line.split("="); + const name = tokens.shift(); + let value = tokens.join("=").trim(); + if (value.startsWith('"') && value.endsWith('"')) + value = value.substring(1, value.length - 1); + if (!name) + continue; + fields.set(name.toLowerCase(), value); + } + return fields; +} +let cachedUserAgent; +function getUserAgent() { + if (cachedUserAgent) + return cachedUserAgent; + try { + cachedUserAgent = determineUserAgent(); + } catch (e) { + cachedUserAgent = "Playwright/unknown"; + } + return cachedUserAgent; +} +function determineUserAgent() { + let osIdentifier = "unknown"; + let osVersion = "unknown"; + if (process.platform === "win32") { + const version2 = os.release().split("."); + osIdentifier = "windows"; + osVersion = `${version2[0]}.${version2[1]}`; + } else if (process.platform === "darwin") { + const version2 = execSync().toString().trim().split("."); + osIdentifier = "macOS"; + osVersion = `${version2[0]}.${version2[1]}`; + } else if (process.platform === "linux") { + const distroInfo = getLinuxDistributionInfoSync(); + if (distroInfo) { + osIdentifier = distroInfo.id || "linux"; + osVersion = distroInfo.version || "unknown"; + } else { + osIdentifier = "linux"; + } + } + const additionalTokens = []; + if (define_process_env_default.CI) + additionalTokens.push("CI/1"); + const serializedTokens = additionalTokens.length ? " " + additionalTokens.join(" ") : ""; + const { embedderName, embedderVersion } = getEmbedderName(); + return `Playwright/${getPlaywrightVersion()} (${os.arch()}; ${osIdentifier} ${osVersion}) ${embedderName}/${embedderVersion}${serializedTokens}`; +} +function getEmbedderName() { + let embedderName = "unknown"; + let embedderVersion = "unknown"; + if (!define_process_env_default.PW_LANG_NAME) { + embedderName = "node"; + embedderVersion = process.version.substring(1).split(".").slice(0, 2).join("."); + } else if (["node", "python", "java", "csharp"].includes(define_process_env_default.PW_LANG_NAME)) { + embedderName = define_process_env_default.PW_LANG_NAME; + embedderVersion = define_process_env_default.PW_LANG_NAME_VERSION ?? "unknown"; + } + return { embedderName, embedderVersion }; +} +function getPlaywrightVersion(majorMinorOnly = false) { + const version2 = define_process_env_default.PW_VERSION_OVERRIDE || require$$0$1.version; + return majorMinorOnly ? version2.split(".").slice(0, 2).join(".") : version2; +} +var getStream = { exports: {} }; +var once = { exports: {} }; +var wrappy_1; +var hasRequiredWrappy; +function requireWrappy() { + if (hasRequiredWrappy) return wrappy_1; + hasRequiredWrappy = 1; + wrappy_1 = wrappy; + function wrappy(fn, cb) { + if (fn && cb) return wrappy(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } + } + return wrappy_1; +} +var hasRequiredOnce; +function requireOnce() { + if (hasRequiredOnce) return once.exports; + hasRequiredOnce = 1; + var wrappy = requireWrappy(); + once.exports = wrappy(once$1); + once.exports.strict = wrappy(onceStrict); + once$1.proto = once$1(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once$1(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + function once$1(fn) { + var f = function() { + if (f.called) return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; + } + function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name = fn.name || "Function wrapped with `once`"; + f.onceError = name + " shouldn't be called more than once"; + f.called = false; + return f; + } + return once.exports; +} +var endOfStream$1; +var hasRequiredEndOfStream$1; +function requireEndOfStream$1() { + if (hasRequiredEndOfStream$1) return endOfStream$1; + hasRequiredEndOfStream$1 = 1; + var once2 = requireOnce(); + var noop2 = function() { + }; + var isRequest = function(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + }; + var isChildProcess = function(stream2) { + return stream2.stdio && Array.isArray(stream2.stdio) && stream2.stdio.length === 3; + }; + var eos = function(stream2, opts, callback) { + if (typeof opts === "function") return eos(stream2, null, opts); + if (!opts) opts = {}; + callback = once2(callback || noop2); + var ws2 = stream2._writableState; + var rs = stream2._readableState; + var readable2 = opts.readable || opts.readable !== false && stream2.readable; + var writable2 = opts.writable || opts.writable !== false && stream2.writable; + var cancelled = false; + var onlegacyfinish = function() { + if (!stream2.writable) onfinish(); + }; + var onfinish = function() { + writable2 = false; + if (!readable2) callback.call(stream2); + }; + var onend = function() { + readable2 = false; + if (!writable2) callback.call(stream2); + }; + var onexit = function(exitCode) { + callback.call(stream2, exitCode ? new Error("exited with error code: " + exitCode) : null); + }; + var onerror = function(err) { + callback.call(stream2, err); + }; + var onclose = function() { + process.nextTick(onclosenexttick); + }; + var onclosenexttick = function() { + if (cancelled) return; + if (readable2 && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream2, new Error("premature close")); + if (writable2 && !(ws2 && (ws2.ended && !ws2.destroyed))) return callback.call(stream2, new Error("premature close")); + }; + var onrequest = function() { + stream2.req.on("finish", onfinish); + }; + if (isRequest(stream2)) { + stream2.on("complete", onfinish); + stream2.on("abort", onclose); + if (stream2.req) onrequest(); + else stream2.on("request", onrequest); + } else if (writable2 && !ws2) { + stream2.on("end", onlegacyfinish); + stream2.on("close", onlegacyfinish); + } + if (isChildProcess(stream2)) stream2.on("exit", onexit); + stream2.on("end", onend); + stream2.on("finish", onfinish); + if (opts.error !== false) stream2.on("error", onerror); + stream2.on("close", onclose); + return function() { + cancelled = true; + stream2.removeListener("complete", onfinish); + stream2.removeListener("abort", onclose); + stream2.removeListener("request", onrequest); + if (stream2.req) stream2.req.removeListener("finish", onfinish); + stream2.removeListener("end", onlegacyfinish); + stream2.removeListener("close", onlegacyfinish); + stream2.removeListener("finish", onfinish); + stream2.removeListener("exit", onexit); + stream2.removeListener("end", onend); + stream2.removeListener("error", onerror); + stream2.removeListener("close", onclose); + }; + }; + endOfStream$1 = eos; + return endOfStream$1; +} +var pump_1; +var hasRequiredPump; +function requirePump() { + if (hasRequiredPump) return pump_1; + hasRequiredPump = 1; + var once2 = requireOnce(); + var eos = requireEndOfStream$1(); + var fs2; + try { + fs2 = require$$2$1; + } catch (e) { + } + var noop2 = function() { + }; + var ancient = /^v?\.0/.test(process.version); + var isFn = function(fn) { + return typeof fn === "function"; + }; + var isFS = function(stream2) { + if (!ancient) return false; + if (!fs2) return false; + return (stream2 instanceof (fs2.ReadStream || noop2) || stream2 instanceof (fs2.WriteStream || noop2)) && isFn(stream2.close); + }; + var isRequest = function(stream2) { + return stream2.setHeader && isFn(stream2.abort); + }; + var destroyer = function(stream2, reading, writing, callback) { + callback = once2(callback); + var closed = false; + stream2.on("close", function() { + closed = true; + }); + eos(stream2, { readable: reading, writable: writing }, function(err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function(err) { + if (closed) return; + if (destroyed) return; + destroyed = true; + if (isFS(stream2)) return stream2.close(noop2); + if (isRequest(stream2)) return stream2.abort(); + if (isFn(stream2.destroy)) return stream2.destroy(); + callback(err || new Error("stream was destroyed")); + }; + }; + var call = function(fn) { + fn(); + }; + var pipe = function(from2, to) { + return from2.pipe(to); + }; + var pump = function() { + var streams = Array.prototype.slice.call(arguments); + var callback = isFn(streams[streams.length - 1] || noop2) && streams.pop() || noop2; + if (Array.isArray(streams[0])) streams = streams[0]; + if (streams.length < 2) throw new Error("pump requires two streams per minimum"); + var error2; + var destroys = streams.map(function(stream2, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream2, reading, writing, function(err) { + if (!error2) error2 = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error2); + }); + }); + return streams.reduce(pipe); + }; + pump_1 = pump; + return pump_1; +} +var bufferStream; +var hasRequiredBufferStream; +function requireBufferStream() { + if (hasRequiredBufferStream) return bufferStream; + hasRequiredBufferStream = 1; + const { PassThrough: PassThroughStream } = requireBrowser$h(); + bufferStream = (options2) => { + options2 = { ...options2 }; + const { array } = options2; + let { encoding: encoding2 } = options2; + const isBuffer = encoding2 === "buffer"; + let objectMode = false; + if (array) { + objectMode = !(encoding2 || isBuffer); + } else { + encoding2 = encoding2 || "utf8"; + } + if (isBuffer) { + encoding2 = null; + } + const stream2 = new PassThroughStream({ objectMode }); + if (encoding2) { + stream2.setEncoding(encoding2); + } + let length = 0; + const chunks = []; + stream2.on("data", (chunk) => { + chunks.push(chunk); + if (objectMode) { + length = chunks.length; + } else { + length += chunk.length; + } + }); + stream2.getBufferedValue = () => { + if (array) { + return chunks; + } + return isBuffer ? Buffer.concat(chunks, length) : chunks.join(""); + }; + stream2.getBufferedLength = () => length; + return stream2; + }; + return bufferStream; +} +var hasRequiredGetStream; +function requireGetStream() { + if (hasRequiredGetStream) return getStream.exports; + hasRequiredGetStream = 1; + const { constants: BufferConstants } = requireBuffer$2(); + const pump = requirePump(); + const bufferStream2 = requireBufferStream(); + class MaxBufferError extends Error { + constructor() { + super("maxBuffer exceeded"); + this.name = "MaxBufferError"; + } + } + async function getStream$1(inputStream, options2) { + if (!inputStream) { + return Promise.reject(new Error("Expected a stream")); + } + options2 = { + maxBuffer: Infinity, + ...options2 + }; + const { maxBuffer } = options2; + let stream2; + await new Promise((resolve, reject) => { + const rejectPromise = (error2) => { + if (error2 && stream2.getBufferedLength() <= BufferConstants.MAX_LENGTH) { + error2.bufferedData = stream2.getBufferedValue(); + } + reject(error2); + }; + stream2 = pump(inputStream, bufferStream2(options2), (error2) => { + if (error2) { + rejectPromise(error2); + return; + } + resolve(); + }); + stream2.on("data", () => { + if (stream2.getBufferedLength() > maxBuffer) { + rejectPromise(new MaxBufferError()); + } + }); + }); + return stream2.getBufferedValue(); + } + getStream.exports = getStream$1; + getStream.exports.default = getStream$1; + getStream.exports.buffer = (stream2, options2) => getStream$1(stream2, { ...options2, encoding: "buffer" }); + getStream.exports.array = (stream2, options2) => getStream$1(stream2, { ...options2, array: true }); + getStream.exports.MaxBufferError = MaxBufferError; + return getStream.exports; +} +var yauzl$1 = {}; +var fdSlicer = {}; +var pend; +var hasRequiredPend; +function requirePend() { + if (hasRequiredPend) return pend; + hasRequiredPend = 1; + pend = Pend; + function Pend() { + this.pending = 0; + this.max = Infinity; + this.listeners = []; + this.waiting = []; + this.error = null; + } + Pend.prototype.go = function(fn) { + if (this.pending < this.max) { + pendGo(this, fn); + } else { + this.waiting.push(fn); + } + }; + Pend.prototype.wait = function(cb) { + if (this.pending === 0) { + cb(this.error); + } else { + this.listeners.push(cb); + } + }; + Pend.prototype.hold = function() { + return pendHold(this); + }; + function pendHold(self2) { + self2.pending += 1; + var called = false; + return onCb; + function onCb(err) { + if (called) throw new Error("callback called twice"); + called = true; + self2.error = self2.error || err; + self2.pending -= 1; + if (self2.waiting.length > 0 && self2.pending < self2.max) { + pendGo(self2, self2.waiting.shift()); + } else if (self2.pending === 0) { + var listeners = self2.listeners; + self2.listeners = []; + listeners.forEach(cbListener); + } + } + function cbListener(listener) { + listener(self2.error); + } + } + function pendGo(self2, fn) { + fn(pendHold(self2)); + } + return pend; +} +var hasRequiredFdSlicer; +function requireFdSlicer() { + if (hasRequiredFdSlicer) return fdSlicer; + hasRequiredFdSlicer = 1; + var fs2 = require$$2$1; + var util2 = requireUtil$5(); + var stream2 = requireBrowser$h(); + var Readable = stream2.Readable; + var Writable = stream2.Writable; + var PassThrough = stream2.PassThrough; + var Pend = requirePend(); + var EventEmitter2 = requireEvents().EventEmitter; + fdSlicer.createFromBuffer = createFromBuffer; + fdSlicer.createFromFd = createFromFd; + fdSlicer.BufferSlicer = BufferSlicer; + fdSlicer.FdSlicer = FdSlicer; + util2.inherits(FdSlicer, EventEmitter2); + function FdSlicer(fd, options2) { + options2 = options2 || {}; + EventEmitter2.call(this); + this.fd = fd; + this.pend = new Pend(); + this.pend.max = 1; + this.refCount = 0; + this.autoClose = !!options2.autoClose; + } + FdSlicer.prototype.read = function(buffer2, offset2, length, position, callback) { + var self2 = this; + self2.pend.go(function(cb) { + fs2.read(self2.fd, buffer2, offset2, length, position, function(err, bytesRead, buffer3) { + cb(); + callback(err, bytesRead, buffer3); + }); + }); + }; + FdSlicer.prototype.write = function(buffer2, offset2, length, position, callback) { + var self2 = this; + self2.pend.go(function(cb) { + fs2.write(self2.fd, buffer2, offset2, length, position, function(err, written, buffer3) { + cb(); + callback(err, written, buffer3); + }); + }); + }; + FdSlicer.prototype.createReadStream = function(options2) { + return new ReadStream2(this, options2); + }; + FdSlicer.prototype.createWriteStream = function(options2) { + return new WriteStream2(this, options2); + }; + FdSlicer.prototype.ref = function() { + this.refCount += 1; + }; + FdSlicer.prototype.unref = function() { + var self2 = this; + self2.refCount -= 1; + if (self2.refCount > 0) return; + if (self2.refCount < 0) throw new Error("invalid unref"); + if (self2.autoClose) { + fs2.close(self2.fd, onCloseDone); + } + function onCloseDone(err) { + if (err) { + self2.emit("error", err); + } else { + self2.emit("close"); + } + } + }; + util2.inherits(ReadStream2, Readable); + function ReadStream2(context, options2) { + options2 = options2 || {}; + Readable.call(this, options2); + this.context = context; + this.context.ref(); + this.start = options2.start || 0; + this.endOffset = options2.end; + this.pos = this.start; + this.destroyed = false; + } + ReadStream2.prototype._read = function(n) { + var self2 = this; + if (self2.destroyed) return; + var toRead = Math.min(self2._readableState.highWaterMark, n); + if (self2.endOffset != null) { + toRead = Math.min(toRead, self2.endOffset - self2.pos); + } + if (toRead <= 0) { + self2.destroyed = true; + self2.push(null); + self2.context.unref(); + return; + } + self2.context.pend.go(function(cb) { + if (self2.destroyed) return cb(); + var buffer2 = Buffer.allocUnsafe(toRead); + fs2.read(self2.context.fd, buffer2, 0, toRead, self2.pos, function(err, bytesRead) { + if (err) { + self2.destroy(err); + } else if (bytesRead === 0) { + self2.destroyed = true; + self2.push(null); + self2.context.unref(); + } else { + self2.pos += bytesRead; + self2.push(buffer2.slice(0, bytesRead)); + } + cb(); + }); + }); + }; + ReadStream2.prototype.destroy = function(err) { + if (this.destroyed) return; + err = err || new Error("stream destroyed"); + this.destroyed = true; + this.emit("error", err); + this.context.unref(); + }; + util2.inherits(WriteStream2, Writable); + function WriteStream2(context, options2) { + options2 = options2 || {}; + Writable.call(this, options2); + this.context = context; + this.context.ref(); + this.start = options2.start || 0; + this.endOffset = options2.end == null ? Infinity : +options2.end; + this.bytesWritten = 0; + this.pos = this.start; + this.destroyed = false; + this.on("finish", this.destroy.bind(this)); + } + WriteStream2.prototype._write = function(buffer2, encoding2, callback) { + var self2 = this; + if (self2.destroyed) return; + if (self2.pos + buffer2.length > self2.endOffset) { + var err = new Error("maximum file length exceeded"); + err.code = "ETOOBIG"; + self2.destroy(); + callback(err); + return; + } + self2.context.pend.go(function(cb) { + if (self2.destroyed) return cb(); + fs2.write(self2.context.fd, buffer2, 0, buffer2.length, self2.pos, function(err2, bytes) { + if (err2) { + self2.destroy(); + cb(); + callback(err2); + } else { + self2.bytesWritten += bytes; + self2.pos += bytes; + self2.emit("progress"); + cb(); + callback(); + } + }); + }); + }; + WriteStream2.prototype.destroy = function() { + if (this.destroyed) return; + this.destroyed = true; + this.context.unref(); + }; + util2.inherits(BufferSlicer, EventEmitter2); + function BufferSlicer(buffer2, options2) { + EventEmitter2.call(this); + options2 = options2 || {}; + this.refCount = 0; + this.buffer = buffer2; + this.maxChunkSize = options2.maxChunkSize || Number.MAX_SAFE_INTEGER; + } + BufferSlicer.prototype.read = function(buffer2, offset2, length, position, callback) { + if (!(0 <= offset2 && offset2 <= buffer2.length)) throw new RangeError("offset outside buffer: 0 <= " + offset2 + " <= " + buffer2.length); + if (position < 0) throw new RangeError("position is negative: " + position); + if (offset2 + length > buffer2.length) { + length = buffer2.length - offset2; + } + if (position + length > this.buffer.length) { + length = this.buffer.length - position; + } + if (length <= 0) { + setImmediate(function() { + callback(null, 0); + }); + return; + } + this.buffer.copy(buffer2, offset2, position, position + length); + setImmediate(function() { + callback(null, length); + }); + }; + BufferSlicer.prototype.write = function(buffer2, offset2, length, position, callback) { + buffer2.copy(this.buffer, position, offset2, offset2 + length); + setImmediate(function() { + callback(null, length, buffer2); + }); + }; + BufferSlicer.prototype.createReadStream = function(options2) { + options2 = options2 || {}; + var readStream = new PassThrough(options2); + readStream.destroyed = false; + readStream.start = options2.start || 0; + readStream.endOffset = options2.end; + readStream.pos = readStream.endOffset || this.buffer.length; + var entireSlice = this.buffer.slice(readStream.start, readStream.pos); + var offset2 = 0; + while (true) { + var nextOffset = offset2 + this.maxChunkSize; + if (nextOffset >= entireSlice.length) { + if (offset2 < entireSlice.length) { + readStream.write(entireSlice.slice(offset2, entireSlice.length)); + } + break; + } + readStream.write(entireSlice.slice(offset2, nextOffset)); + offset2 = nextOffset; + } + readStream.end(); + readStream.destroy = function() { + readStream.destroyed = true; + }; + return readStream; + }; + BufferSlicer.prototype.createWriteStream = function(options2) { + var bufferSlicer = this; + options2 = options2 || {}; + var writeStream = new Writable(options2); + writeStream.start = options2.start || 0; + writeStream.endOffset = options2.end == null ? this.buffer.length : +options2.end; + writeStream.bytesWritten = 0; + writeStream.pos = writeStream.start; + writeStream.destroyed = false; + writeStream._write = function(buffer2, encoding2, callback) { + if (writeStream.destroyed) return; + var end = writeStream.pos + buffer2.length; + if (end > writeStream.endOffset) { + var err = new Error("maximum file length exceeded"); + err.code = "ETOOBIG"; + writeStream.destroyed = true; + callback(err); + return; + } + buffer2.copy(bufferSlicer.buffer, writeStream.pos, 0, buffer2.length); + writeStream.bytesWritten += buffer2.length; + writeStream.pos = end; + writeStream.emit("progress"); + callback(); + }; + writeStream.destroy = function() { + writeStream.destroyed = true; + }; + return writeStream; + }; + BufferSlicer.prototype.ref = function() { + this.refCount += 1; + }; + BufferSlicer.prototype.unref = function() { + this.refCount -= 1; + if (this.refCount < 0) { + throw new Error("invalid unref"); + } + }; + function createFromBuffer(buffer2, options2) { + return new BufferSlicer(buffer2, options2); + } + function createFromFd(fd, options2) { + return new FdSlicer(fd, options2); + } + return fdSlicer; +} +var bufferCrc32; +var hasRequiredBufferCrc32; +function requireBufferCrc32() { + if (hasRequiredBufferCrc32) return bufferCrc32; + hasRequiredBufferCrc32 = 1; + var Buffer2 = requireBuffer$2().Buffer; + var CRC_TABLE = [ + 0, + 1996959894, + 3993919788, + 2567524794, + 124634137, + 1886057615, + 3915621685, + 2657392035, + 249268274, + 2044508324, + 3772115230, + 2547177864, + 162941995, + 2125561021, + 3887607047, + 2428444049, + 498536548, + 1789927666, + 4089016648, + 2227061214, + 450548861, + 1843258603, + 4107580753, + 2211677639, + 325883990, + 1684777152, + 4251122042, + 2321926636, + 335633487, + 1661365465, + 4195302755, + 2366115317, + 997073096, + 1281953886, + 3579855332, + 2724688242, + 1006888145, + 1258607687, + 3524101629, + 2768942443, + 901097722, + 1119000684, + 3686517206, + 2898065728, + 853044451, + 1172266101, + 3705015759, + 2882616665, + 651767980, + 1373503546, + 3369554304, + 3218104598, + 565507253, + 1454621731, + 3485111705, + 3099436303, + 671266974, + 1594198024, + 3322730930, + 2970347812, + 795835527, + 1483230225, + 3244367275, + 3060149565, + 1994146192, + 31158534, + 2563907772, + 4023717930, + 1907459465, + 112637215, + 2680153253, + 3904427059, + 2013776290, + 251722036, + 2517215374, + 3775830040, + 2137656763, + 141376813, + 2439277719, + 3865271297, + 1802195444, + 476864866, + 2238001368, + 4066508878, + 1812370925, + 453092731, + 2181625025, + 4111451223, + 1706088902, + 314042704, + 2344532202, + 4240017532, + 1658658271, + 366619977, + 2362670323, + 4224994405, + 1303535960, + 984961486, + 2747007092, + 3569037538, + 1256170817, + 1037604311, + 2765210733, + 3554079995, + 1131014506, + 879679996, + 2909243462, + 3663771856, + 1141124467, + 855842277, + 2852801631, + 3708648649, + 1342533948, + 654459306, + 3188396048, + 3373015174, + 1466479909, + 544179635, + 3110523913, + 3462522015, + 1591671054, + 702138776, + 2966460450, + 3352799412, + 1504918807, + 783551873, + 3082640443, + 3233442989, + 3988292384, + 2596254646, + 62317068, + 1957810842, + 3939845945, + 2647816111, + 81470997, + 1943803523, + 3814918930, + 2489596804, + 225274430, + 2053790376, + 3826175755, + 2466906013, + 167816743, + 2097651377, + 4027552580, + 2265490386, + 503444072, + 1762050814, + 4150417245, + 2154129355, + 426522225, + 1852507879, + 4275313526, + 2312317920, + 282753626, + 1742555852, + 4189708143, + 2394877945, + 397917763, + 1622183637, + 3604390888, + 2714866558, + 953729732, + 1340076626, + 3518719985, + 2797360999, + 1068828381, + 1219638859, + 3624741850, + 2936675148, + 906185462, + 1090812512, + 3747672003, + 2825379669, + 829329135, + 1181335161, + 3412177804, + 3160834842, + 628085408, + 1382605366, + 3423369109, + 3138078467, + 570562233, + 1426400815, + 3317316542, + 2998733608, + 733239954, + 1555261956, + 3268935591, + 3050360625, + 752459403, + 1541320221, + 2607071920, + 3965973030, + 1969922972, + 40735498, + 2617837225, + 3943577151, + 1913087877, + 83908371, + 2512341634, + 3803740692, + 2075208622, + 213261112, + 2463272603, + 3855990285, + 2094854071, + 198958881, + 2262029012, + 4057260610, + 1759359992, + 534414190, + 2176718541, + 4139329115, + 1873836001, + 414664567, + 2282248934, + 4279200368, + 1711684554, + 285281116, + 2405801727, + 4167216745, + 1634467795, + 376229701, + 2685067896, + 3608007406, + 1308918612, + 956543938, + 2808555105, + 3495958263, + 1231636301, + 1047427035, + 2932959818, + 3654703836, + 1088359270, + 936918e3, + 2847714899, + 3736837829, + 1202900863, + 817233897, + 3183342108, + 3401237130, + 1404277552, + 615818150, + 3134207493, + 3453421203, + 1423857449, + 601450431, + 3009837614, + 3294710456, + 1567103746, + 711928724, + 3020668471, + 3272380065, + 1510334235, + 755167117 + ]; + if (typeof Int32Array !== "undefined") { + CRC_TABLE = new Int32Array(CRC_TABLE); + } + function ensureBuffer(input) { + if (Buffer2.isBuffer(input)) { + return input; + } + var hasNewBufferAPI = typeof Buffer2.alloc === "function" && typeof Buffer2.from === "function"; + if (typeof input === "number") { + return hasNewBufferAPI ? Buffer2.alloc(input) : new Buffer2(input); + } else if (typeof input === "string") { + return hasNewBufferAPI ? Buffer2.from(input) : new Buffer2(input); + } else { + throw new Error("input must be buffer, number, or string, received " + typeof input); + } + } + function bufferizeInt(num) { + var tmp = ensureBuffer(4); + tmp.writeInt32BE(num, 0); + return tmp; + } + function _crc32(buf, previous) { + buf = ensureBuffer(buf); + if (Buffer2.isBuffer(previous)) { + previous = previous.readUInt32BE(0); + } + var crc2 = ~~previous ^ -1; + for (var n = 0; n < buf.length; n++) { + crc2 = CRC_TABLE[(crc2 ^ buf[n]) & 255] ^ crc2 >>> 8; + } + return crc2 ^ -1; + } + function crc32() { + return bufferizeInt(_crc32.apply(null, arguments)); + } + crc32.signed = function() { + return _crc32.apply(null, arguments); + }; + crc32.unsigned = function() { + return _crc32.apply(null, arguments) >>> 0; + }; + bufferCrc32 = crc32; + return bufferCrc32; +} +var hasRequiredYauzl; +function requireYauzl() { + if (hasRequiredYauzl) return yauzl$1; + hasRequiredYauzl = 1; + var fs2 = require$$2$1; + var zlib = requireLib(); + var fd_slicer = requireFdSlicer(); + var crc32 = requireBufferCrc32(); + var util2 = requireUtil$5(); + var EventEmitter2 = requireEvents().EventEmitter; + var Transform = requireBrowser$h().Transform; + var PassThrough = requireBrowser$h().PassThrough; + var Writable = requireBrowser$h().Writable; + yauzl$1.open = open2; + yauzl$1.fromFd = fromFd; + yauzl$1.fromBuffer = fromBuffer; + yauzl$1.fromRandomAccessReader = fromRandomAccessReader; + yauzl$1.dosDateTimeToDate = dosDateTimeToDate; + yauzl$1.getFileNameLowLevel = getFileNameLowLevel; + yauzl$1.validateFileName = validateFileName; + yauzl$1.parseExtraFields = parseExtraFields; + yauzl$1.ZipFile = ZipFile2; + yauzl$1.Entry = Entry; + yauzl$1.LocalFileHeader = LocalFileHeader; + yauzl$1.RandomAccessReader = RandomAccessReader; + function open2(path2, options2, callback) { + if (typeof options2 === "function") { + callback = options2; + options2 = null; + } + if (options2 == null) options2 = {}; + if (options2.autoClose == null) options2.autoClose = true; + if (options2.lazyEntries == null) options2.lazyEntries = false; + if (options2.decodeStrings == null) options2.decodeStrings = true; + if (options2.validateEntrySizes == null) options2.validateEntrySizes = true; + if (options2.strictFileNames == null) options2.strictFileNames = false; + if (callback == null) callback = defaultCallback; + fs2.open(path2, "r", function(err, fd) { + if (err) return callback(err); + fromFd(fd, options2, function(err2, zipfile) { + if (err2) fs2.close(fd, defaultCallback); + callback(err2, zipfile); + }); + }); + } + function fromFd(fd, options2, callback) { + if (typeof options2 === "function") { + callback = options2; + options2 = null; + } + if (options2 == null) options2 = {}; + if (options2.autoClose == null) options2.autoClose = false; + if (options2.lazyEntries == null) options2.lazyEntries = false; + if (options2.decodeStrings == null) options2.decodeStrings = true; + if (options2.validateEntrySizes == null) options2.validateEntrySizes = true; + if (options2.strictFileNames == null) options2.strictFileNames = false; + if (callback == null) callback = defaultCallback; + fs2.fstat(fd, function(err, stats) { + if (err) return callback(err); + var reader = fd_slicer.createFromFd(fd, { autoClose: true }); + fromRandomAccessReader(reader, stats.size, options2, callback); + }); + } + function fromBuffer(buffer2, options2, callback) { + if (typeof options2 === "function") { + callback = options2; + options2 = null; + } + if (options2 == null) options2 = {}; + options2.autoClose = false; + if (options2.lazyEntries == null) options2.lazyEntries = false; + if (options2.decodeStrings == null) options2.decodeStrings = true; + if (options2.validateEntrySizes == null) options2.validateEntrySizes = true; + if (options2.strictFileNames == null) options2.strictFileNames = false; + var reader = fd_slicer.createFromBuffer(buffer2, { maxChunkSize: 65536 }); + fromRandomAccessReader(reader, buffer2.length, options2, callback); + } + function fromRandomAccessReader(reader, totalSize, options2, callback) { + if (typeof options2 === "function") { + callback = options2; + options2 = null; + } + if (options2 == null) options2 = {}; + if (options2.autoClose == null) options2.autoClose = true; + if (options2.lazyEntries == null) options2.lazyEntries = false; + if (options2.decodeStrings == null) options2.decodeStrings = true; + var decodeStrings = !!options2.decodeStrings; + if (options2.validateEntrySizes == null) options2.validateEntrySizes = true; + if (options2.strictFileNames == null) options2.strictFileNames = false; + if (callback == null) callback = defaultCallback; + if (typeof totalSize !== "number") throw new Error("expected totalSize parameter to be a number"); + if (totalSize > Number.MAX_SAFE_INTEGER) { + throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double."); + } + reader.ref(); + var eocdrWithoutCommentSize = 22; + var zip64EocdlSize = 20; + var maxCommentSize = 65535; + var bufferSize = Math.min(zip64EocdlSize + eocdrWithoutCommentSize + maxCommentSize, totalSize); + var buffer2 = newBuffer(bufferSize); + var bufferReadStart = totalSize - buffer2.length; + readAndAssertNoEof(reader, buffer2, 0, bufferSize, bufferReadStart, function(err) { + if (err) return callback(err); + for (var i = bufferSize - eocdrWithoutCommentSize; i >= 0; i -= 1) { + if (buffer2.readUInt32LE(i) !== 101010256) continue; + var eocdrBuffer = buffer2.subarray(i); + var diskNumber = eocdrBuffer.readUInt16LE(4); + var entryCount = eocdrBuffer.readUInt16LE(10); + var centralDirectoryOffset = eocdrBuffer.readUInt32LE(16); + var commentLength = eocdrBuffer.readUInt16LE(20); + var expectedCommentLength = eocdrBuffer.length - eocdrWithoutCommentSize; + if (commentLength !== expectedCommentLength) { + return callback(new Error("Invalid comment length. Expected: " + expectedCommentLength + ". Found: " + commentLength + ". Are there extra bytes at the end of the file? Or is the end of central dir signature `PK☺☻` in the comment?")); + } + var comment2 = decodeStrings ? decodeBuffer(eocdrBuffer.subarray(22), false) : eocdrBuffer.subarray(22); + if (i - zip64EocdlSize >= 0 && buffer2.readUInt32LE(i - zip64EocdlSize) === 117853008) { + var zip64EocdlBuffer = buffer2.subarray(i - zip64EocdlSize, i - zip64EocdlSize + zip64EocdlSize); + var zip64EocdrOffset = readUInt64LE(zip64EocdlBuffer, 8); + var zip64EocdrBuffer = newBuffer(56); + return readAndAssertNoEof(reader, zip64EocdrBuffer, 0, zip64EocdrBuffer.length, zip64EocdrOffset, function(err2) { + if (err2) return callback(err2); + if (zip64EocdrBuffer.readUInt32LE(0) !== 101075792) { + return callback(new Error("invalid zip64 end of central directory record signature")); + } + diskNumber = zip64EocdrBuffer.readUInt32LE(16); + if (diskNumber !== 0) { + return callback(new Error("multi-disk zip files are not supported: found disk number: " + diskNumber)); + } + entryCount = readUInt64LE(zip64EocdrBuffer, 32); + centralDirectoryOffset = readUInt64LE(zip64EocdrBuffer, 48); + return callback(null, new ZipFile2(reader, centralDirectoryOffset, totalSize, entryCount, comment2, options2.autoClose, options2.lazyEntries, decodeStrings, options2.validateEntrySizes, options2.strictFileNames)); + }); + } + if (diskNumber !== 0) { + return callback(new Error("multi-disk zip files are not supported: found disk number: " + diskNumber)); + } + return callback(null, new ZipFile2(reader, centralDirectoryOffset, totalSize, entryCount, comment2, options2.autoClose, options2.lazyEntries, decodeStrings, options2.validateEntrySizes, options2.strictFileNames)); + } + callback(new Error("End of central directory record signature not found. Either not a zip file, or file is truncated.")); + }); + } + util2.inherits(ZipFile2, EventEmitter2); + function ZipFile2(reader, centralDirectoryOffset, fileSize, entryCount, comment2, autoClose, lazyEntries, decodeStrings, validateEntrySizes, strictFileNames) { + var self2 = this; + EventEmitter2.call(self2); + self2.reader = reader; + self2.reader.on("error", function(err) { + emitError(self2, err); + }); + self2.reader.once("close", function() { + self2.emit("close"); + }); + self2.readEntryCursor = centralDirectoryOffset; + self2.fileSize = fileSize; + self2.entryCount = entryCount; + self2.comment = comment2; + self2.entriesRead = 0; + self2.autoClose = !!autoClose; + self2.lazyEntries = !!lazyEntries; + self2.decodeStrings = !!decodeStrings; + self2.validateEntrySizes = !!validateEntrySizes; + self2.strictFileNames = !!strictFileNames; + self2.isOpen = true; + self2.emittedError = false; + if (!self2.lazyEntries) self2._readEntry(); + } + ZipFile2.prototype.close = function() { + if (!this.isOpen) return; + this.isOpen = false; + this.reader.unref(); + }; + function emitErrorAndAutoClose(self2, err) { + if (self2.autoClose) self2.close(); + emitError(self2, err); + } + function emitError(self2, err) { + if (self2.emittedError) return; + self2.emittedError = true; + self2.emit("error", err); + } + ZipFile2.prototype.readEntry = function() { + if (!this.lazyEntries) throw new Error("readEntry() called without lazyEntries:true"); + this._readEntry(); + }; + ZipFile2.prototype._readEntry = function() { + var self2 = this; + if (self2.entryCount === self2.entriesRead) { + setImmediate(function() { + if (self2.autoClose) self2.close(); + if (self2.emittedError) return; + self2.emit("end"); + }); + return; + } + if (self2.emittedError) return; + var buffer2 = newBuffer(46); + readAndAssertNoEof(self2.reader, buffer2, 0, buffer2.length, self2.readEntryCursor, function(err) { + if (err) return emitErrorAndAutoClose(self2, err); + if (self2.emittedError) return; + var entry = new Entry(); + var signature2 = buffer2.readUInt32LE(0); + if (signature2 !== 33639248) return emitErrorAndAutoClose(self2, new Error("invalid central directory file header signature: 0x" + signature2.toString(16))); + entry.versionMadeBy = buffer2.readUInt16LE(4); + entry.versionNeededToExtract = buffer2.readUInt16LE(6); + entry.generalPurposeBitFlag = buffer2.readUInt16LE(8); + entry.compressionMethod = buffer2.readUInt16LE(10); + entry.lastModFileTime = buffer2.readUInt16LE(12); + entry.lastModFileDate = buffer2.readUInt16LE(14); + entry.crc32 = buffer2.readUInt32LE(16); + entry.compressedSize = buffer2.readUInt32LE(20); + entry.uncompressedSize = buffer2.readUInt32LE(24); + entry.fileNameLength = buffer2.readUInt16LE(28); + entry.extraFieldLength = buffer2.readUInt16LE(30); + entry.fileCommentLength = buffer2.readUInt16LE(32); + entry.internalFileAttributes = buffer2.readUInt16LE(36); + entry.externalFileAttributes = buffer2.readUInt32LE(38); + entry.relativeOffsetOfLocalHeader = buffer2.readUInt32LE(42); + if (entry.generalPurposeBitFlag & 64) return emitErrorAndAutoClose(self2, new Error("strong encryption is not supported")); + self2.readEntryCursor += 46; + buffer2 = newBuffer(entry.fileNameLength + entry.extraFieldLength + entry.fileCommentLength); + readAndAssertNoEof(self2.reader, buffer2, 0, buffer2.length, self2.readEntryCursor, function(err2) { + if (err2) return emitErrorAndAutoClose(self2, err2); + if (self2.emittedError) return; + entry.fileNameRaw = buffer2.subarray(0, entry.fileNameLength); + var fileCommentStart = entry.fileNameLength + entry.extraFieldLength; + entry.extraFieldRaw = buffer2.subarray(entry.fileNameLength, fileCommentStart); + entry.fileCommentRaw = buffer2.subarray(fileCommentStart, fileCommentStart + entry.fileCommentLength); + try { + entry.extraFields = parseExtraFields(entry.extraFieldRaw); + } catch (err3) { + return emitErrorAndAutoClose(self2, err3); + } + if (self2.decodeStrings) { + var isUtf8 = (entry.generalPurposeBitFlag & 2048) !== 0; + entry.fileComment = decodeBuffer(entry.fileCommentRaw, isUtf8); + entry.fileName = getFileNameLowLevel(entry.generalPurposeBitFlag, entry.fileNameRaw, entry.extraFields, self2.strictFileNames); + var errorMessage = validateFileName(entry.fileName); + if (errorMessage != null) return emitErrorAndAutoClose(self2, new Error(errorMessage)); + } else { + entry.fileComment = entry.fileCommentRaw; + entry.fileName = entry.fileNameRaw; + } + entry.comment = entry.fileComment; + self2.readEntryCursor += buffer2.length; + self2.entriesRead += 1; + for (var i = 0; i < entry.extraFields.length; i++) { + var extraField = entry.extraFields[i]; + if (extraField.id !== 1) continue; + var zip64EiefBuffer = extraField.data; + var index2 = 0; + if (entry.uncompressedSize === 4294967295) { + if (index2 + 8 > zip64EiefBuffer.length) { + return emitErrorAndAutoClose(self2, new Error("zip64 extended information extra field does not include uncompressed size")); + } + entry.uncompressedSize = readUInt64LE(zip64EiefBuffer, index2); + index2 += 8; + } + if (entry.compressedSize === 4294967295) { + if (index2 + 8 > zip64EiefBuffer.length) { + return emitErrorAndAutoClose(self2, new Error("zip64 extended information extra field does not include compressed size")); + } + entry.compressedSize = readUInt64LE(zip64EiefBuffer, index2); + index2 += 8; + } + if (entry.relativeOffsetOfLocalHeader === 4294967295) { + if (index2 + 8 > zip64EiefBuffer.length) { + return emitErrorAndAutoClose(self2, new Error("zip64 extended information extra field does not include relative header offset")); + } + entry.relativeOffsetOfLocalHeader = readUInt64LE(zip64EiefBuffer, index2); + index2 += 8; + } + break; + } + if (self2.validateEntrySizes && entry.compressionMethod === 0) { + var expectedCompressedSize = entry.uncompressedSize; + if (entry.isEncrypted()) { + expectedCompressedSize += 12; + } + if (entry.compressedSize !== expectedCompressedSize) { + var msg = "compressed/uncompressed size mismatch for stored file: " + entry.compressedSize + " != " + entry.uncompressedSize; + return emitErrorAndAutoClose(self2, new Error(msg)); + } + } + self2.emit("entry", entry); + if (!self2.lazyEntries) self2._readEntry(); + }); + }); + }; + ZipFile2.prototype.openReadStream = function(entry, options2, callback) { + var self2 = this; + var relativeStart = 0; + var relativeEnd = entry.compressedSize; + if (callback == null) { + callback = options2; + options2 = null; + } + if (options2 == null) { + options2 = {}; + } else { + if (options2.decrypt != null) { + if (!entry.isEncrypted()) { + throw new Error("options.decrypt can only be specified for encrypted entries"); + } + if (options2.decrypt !== false) throw new Error("invalid options.decrypt value: " + options2.decrypt); + if (entry.isCompressed()) { + if (options2.decompress !== false) throw new Error("entry is encrypted and compressed, and options.decompress !== false"); + } + } + if (options2.decompress != null) { + if (!entry.isCompressed()) { + throw new Error("options.decompress can only be specified for compressed entries"); + } + if (!(options2.decompress === false || options2.decompress === true)) { + throw new Error("invalid options.decompress value: " + options2.decompress); + } + } + if (options2.start != null || options2.end != null) { + if (entry.isCompressed() && options2.decompress !== false) { + throw new Error("start/end range not allowed for compressed entry without options.decompress === false"); + } + if (entry.isEncrypted() && options2.decrypt !== false) { + throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false"); + } + } + if (options2.start != null) { + relativeStart = options2.start; + if (relativeStart < 0) throw new Error("options.start < 0"); + if (relativeStart > entry.compressedSize) throw new Error("options.start > entry.compressedSize"); + } + if (options2.end != null) { + relativeEnd = options2.end; + if (relativeEnd < 0) throw new Error("options.end < 0"); + if (relativeEnd > entry.compressedSize) throw new Error("options.end > entry.compressedSize"); + if (relativeEnd < relativeStart) throw new Error("options.end < options.start"); + } + } + if (!self2.isOpen) return callback(new Error("closed")); + if (entry.isEncrypted()) { + if (options2.decrypt !== false) return callback(new Error("entry is encrypted, and options.decrypt !== false")); + } + var decompress; + if (entry.compressionMethod === 0) { + decompress = false; + } else if (entry.compressionMethod === 8) { + decompress = options2.decompress != null ? options2.decompress : true; + } else { + return callback(new Error("unsupported compression method: " + entry.compressionMethod)); + } + self2.readLocalFileHeader(entry, { minimal: true }, function(err, localFileHeader) { + if (err) return callback(err); + self2.openReadStreamLowLevel( + localFileHeader.fileDataStart, + entry.compressedSize, + relativeStart, + relativeEnd, + decompress, + entry.uncompressedSize, + callback + ); + }); + }; + ZipFile2.prototype.openReadStreamLowLevel = function(fileDataStart, compressedSize, relativeStart, relativeEnd, decompress, uncompressedSize, callback) { + var self2 = this; + var readStream = self2.reader.createReadStream({ + start: fileDataStart + relativeStart, + end: fileDataStart + relativeEnd + }); + var endpointStream = readStream; + if (decompress) { + var destroyed = false; + var inflateFilter = zlib.createInflateRaw(); + readStream.on("error", function(err) { + setImmediate(function() { + if (!destroyed) inflateFilter.emit("error", err); + }); + }); + readStream.pipe(inflateFilter); + if (self2.validateEntrySizes) { + endpointStream = new AssertByteCountStream(uncompressedSize); + inflateFilter.on("error", function(err) { + setImmediate(function() { + if (!destroyed) endpointStream.emit("error", err); + }); + }); + inflateFilter.pipe(endpointStream); + } else { + endpointStream = inflateFilter; + } + installDestroyFn(endpointStream, function() { + destroyed = true; + if (inflateFilter !== endpointStream) inflateFilter.unpipe(endpointStream); + readStream.unpipe(inflateFilter); + readStream.destroy(); + }); + } + callback(null, endpointStream); + }; + ZipFile2.prototype.readLocalFileHeader = function(entry, options2, callback) { + var self2 = this; + if (callback == null) { + callback = options2; + options2 = null; + } + if (options2 == null) options2 = {}; + self2.reader.ref(); + var buffer2 = newBuffer(30); + readAndAssertNoEof(self2.reader, buffer2, 0, buffer2.length, entry.relativeOffsetOfLocalHeader, function(err) { + try { + if (err) return callback(err); + var signature2 = buffer2.readUInt32LE(0); + if (signature2 !== 67324752) { + return callback(new Error("invalid local file header signature: 0x" + signature2.toString(16))); + } + var fileNameLength = buffer2.readUInt16LE(26); + var extraFieldLength = buffer2.readUInt16LE(28); + var fileDataStart = entry.relativeOffsetOfLocalHeader + 30 + fileNameLength + extraFieldLength; + if (fileDataStart + entry.compressedSize > self2.fileSize) { + return callback(new Error("file data overflows file bounds: " + fileDataStart + " + " + entry.compressedSize + " > " + self2.fileSize)); + } + if (options2.minimal) { + return callback(null, { fileDataStart }); + } + var localFileHeader = new LocalFileHeader(); + localFileHeader.fileDataStart = fileDataStart; + localFileHeader.versionNeededToExtract = buffer2.readUInt16LE(4); + localFileHeader.generalPurposeBitFlag = buffer2.readUInt16LE(6); + localFileHeader.compressionMethod = buffer2.readUInt16LE(8); + localFileHeader.lastModFileTime = buffer2.readUInt16LE(10); + localFileHeader.lastModFileDate = buffer2.readUInt16LE(12); + localFileHeader.crc32 = buffer2.readUInt32LE(14); + localFileHeader.compressedSize = buffer2.readUInt32LE(18); + localFileHeader.uncompressedSize = buffer2.readUInt32LE(22); + localFileHeader.fileNameLength = fileNameLength; + localFileHeader.extraFieldLength = extraFieldLength; + buffer2 = newBuffer(fileNameLength + extraFieldLength); + self2.reader.ref(); + readAndAssertNoEof(self2.reader, buffer2, 0, buffer2.length, entry.relativeOffsetOfLocalHeader + 30, function(err2) { + try { + if (err2) return callback(err2); + localFileHeader.fileName = buffer2.subarray(0, fileNameLength); + localFileHeader.extraField = buffer2.subarray(fileNameLength); + return callback(null, localFileHeader); + } finally { + self2.reader.unref(); + } + }); + } finally { + self2.reader.unref(); + } + }); + }; + function Entry() { + } + Entry.prototype.getLastModDate = function(options2) { + if (options2 == null) options2 = {}; + if (!options2.forceDosFormat) { + for (var i = 0; i < this.extraFields.length; i++) { + var extraField = this.extraFields[i]; + if (extraField.id === 21589) { + var data2 = extraField.data; + if (data2.length < 5) continue; + var flags = data2[0]; + var HAS_MTIME = 1; + if (!(flags & HAS_MTIME)) continue; + var posixTimestamp = data2.readInt32LE(1); + return new Date(posixTimestamp * 1e3); + } else if (extraField.id === 10) { + var data2 = extraField.data; + var cursor = 4; + while (cursor < data2.length + 4) { + var tag = data2.readUInt16LE(cursor); + cursor += 2; + var size = data2.readUInt16LE(cursor); + cursor += 2; + if (tag !== 1) { + cursor += size; + continue; + } + if (size < 8 || cursor + size > data2.length) break; + var hundredNanoSecondsSince1601 = 4294967296 * data2.readInt32LE(cursor + 4) + data2.readUInt32LE(cursor); + var millisecondsSince1970 = hundredNanoSecondsSince1601 / 1e4 - 116444736e5; + return new Date(millisecondsSince1970); + } + } + } + } + return dosDateTimeToDate(this.lastModFileDate, this.lastModFileTime, options2.timezone); + }; + Entry.prototype.isEncrypted = function() { + return (this.generalPurposeBitFlag & 1) !== 0; + }; + Entry.prototype.isCompressed = function() { + return this.compressionMethod === 8; + }; + function LocalFileHeader() { + } + function dosDateTimeToDate(date, time, timezone) { + var day = date & 31; + var month = (date >> 5 & 15) - 1; + var year = (date >> 9 & 127) + 1980; + var millisecond = 0; + var second = (time & 31) * 2; + var minute = time >> 5 & 63; + var hour = time >> 11 & 31; + if (timezone == null || timezone === "local") { + return new Date(year, month, day, hour, minute, second, millisecond); + } else if (timezone === "UTC") { + return new Date(Date.UTC(year, month, day, hour, minute, second, millisecond)); + } else { + throw new Error("unrecognized options.timezone: " + options.timezone); + } + } + function getFileNameLowLevel(generalPurposeBitFlag, fileNameBuffer, extraFields, strictFileNames) { + var fileName = null; + for (var i = 0; i < extraFields.length; i++) { + var extraField = extraFields[i]; + if (extraField.id === 28789) { + if (extraField.data.length < 6) { + continue; + } + if (extraField.data.readUInt8(0) !== 1) { + continue; + } + var oldNameCrc32 = extraField.data.readUInt32LE(1); + if (crc32.unsigned(fileNameBuffer) !== oldNameCrc32) { + continue; + } + fileName = decodeBuffer(extraField.data.subarray(5), true); + break; + } + } + if (fileName == null) { + var isUtf8 = (generalPurposeBitFlag & 2048) !== 0; + fileName = decodeBuffer(fileNameBuffer, isUtf8); + } + if (!strictFileNames) { + fileName = fileName.replace(/\\/g, "/"); + } + return fileName; + } + function validateFileName(fileName) { + if (fileName.indexOf("\\") !== -1) { + return "invalid characters in fileName: " + fileName; + } + if (/^[a-zA-Z]:/.test(fileName) || /^\//.test(fileName)) { + return "absolute path: " + fileName; + } + if (fileName.split("/").indexOf("..") !== -1) { + return "invalid relative path: " + fileName; + } + return null; + } + function parseExtraFields(extraFieldBuffer) { + var extraFields = []; + var i = 0; + while (i < extraFieldBuffer.length - 3) { + var headerId = extraFieldBuffer.readUInt16LE(i + 0); + var dataSize = extraFieldBuffer.readUInt16LE(i + 2); + var dataStart = i + 4; + var dataEnd = dataStart + dataSize; + if (dataEnd > extraFieldBuffer.length) throw new Error("extra field length exceeds extra field buffer size"); + var dataBuffer = extraFieldBuffer.subarray(dataStart, dataEnd); + extraFields.push({ + id: headerId, + data: dataBuffer + }); + i = dataEnd; + } + return extraFields; + } + function readAndAssertNoEof(reader, buffer2, offset2, length, position, callback) { + if (length === 0) { + return setImmediate(function() { + callback(null, newBuffer(0)); + }); + } + reader.read(buffer2, offset2, length, position, function(err, bytesRead) { + if (err) return callback(err); + if (bytesRead < length) { + return callback(new Error("unexpected EOF")); + } + callback(); + }); + } + util2.inherits(AssertByteCountStream, Transform); + function AssertByteCountStream(byteCount) { + Transform.call(this); + this.actualByteCount = 0; + this.expectedByteCount = byteCount; + } + AssertByteCountStream.prototype._transform = function(chunk, encoding2, cb) { + this.actualByteCount += chunk.length; + if (this.actualByteCount > this.expectedByteCount) { + var msg = "too many bytes in the stream. expected " + this.expectedByteCount + ". got at least " + this.actualByteCount; + return cb(new Error(msg)); + } + cb(null, chunk); + }; + AssertByteCountStream.prototype._flush = function(cb) { + if (this.actualByteCount < this.expectedByteCount) { + var msg = "not enough bytes in the stream. expected " + this.expectedByteCount + ". got only " + this.actualByteCount; + return cb(new Error(msg)); + } + cb(); + }; + util2.inherits(RandomAccessReader, EventEmitter2); + function RandomAccessReader() { + EventEmitter2.call(this); + this.refCount = 0; + } + RandomAccessReader.prototype.ref = function() { + this.refCount += 1; + }; + RandomAccessReader.prototype.unref = function() { + var self2 = this; + self2.refCount -= 1; + if (self2.refCount > 0) return; + if (self2.refCount < 0) throw new Error("invalid unref"); + self2.close(onCloseDone); + function onCloseDone(err) { + if (err) return self2.emit("error", err); + self2.emit("close"); + } + }; + RandomAccessReader.prototype.createReadStream = function(options2) { + if (options2 == null) options2 = {}; + var start = options2.start; + var end = options2.end; + if (start === end) { + var emptyStream = new PassThrough(); + setImmediate(function() { + emptyStream.end(); + }); + return emptyStream; + } + var stream2 = this._readStreamForRange(start, end); + var destroyed = false; + var refUnrefFilter = new RefUnrefFilter(this); + stream2.on("error", function(err) { + setImmediate(function() { + if (!destroyed) refUnrefFilter.emit("error", err); + }); + }); + installDestroyFn(refUnrefFilter, function() { + stream2.unpipe(refUnrefFilter); + refUnrefFilter.unref(); + stream2.destroy(); + }); + var byteCounter = new AssertByteCountStream(end - start); + refUnrefFilter.on("error", function(err) { + setImmediate(function() { + if (!destroyed) byteCounter.emit("error", err); + }); + }); + installDestroyFn(byteCounter, function() { + destroyed = true; + refUnrefFilter.unpipe(byteCounter); + refUnrefFilter.destroy(); + }); + return stream2.pipe(refUnrefFilter).pipe(byteCounter); + }; + RandomAccessReader.prototype._readStreamForRange = function(start, end) { + throw new Error("not implemented"); + }; + RandomAccessReader.prototype.read = function(buffer2, offset2, length, position, callback) { + var readStream = this.createReadStream({ start: position, end: position + length }); + var writeStream = new Writable(); + var written = 0; + writeStream._write = function(chunk, encoding2, cb) { + chunk.copy(buffer2, offset2 + written, 0, chunk.length); + written += chunk.length; + cb(); + }; + writeStream.on("finish", callback); + readStream.on("error", function(error2) { + callback(error2); + }); + readStream.pipe(writeStream); + }; + RandomAccessReader.prototype.close = function(callback) { + setImmediate(callback); + }; + util2.inherits(RefUnrefFilter, PassThrough); + function RefUnrefFilter(context) { + PassThrough.call(this); + this.context = context; + this.context.ref(); + this.unreffedYet = false; + } + RefUnrefFilter.prototype._flush = function(cb) { + this.unref(); + cb(); + }; + RefUnrefFilter.prototype.unref = function(cb) { + if (this.unreffedYet) return; + this.unreffedYet = true; + this.context.unref(); + }; + var cp437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "; + function decodeBuffer(buffer2, isUtf8) { + if (isUtf8) { + return buffer2.toString("utf8"); + } else { + var result = ""; + for (var i = 0; i < buffer2.length; i++) { + result += cp437[buffer2[i]]; + } + return result; + } + } + function readUInt64LE(buffer2, offset2) { + var lower32 = buffer2.readUInt32LE(offset2); + var upper32 = buffer2.readUInt32LE(offset2 + 4); + return upper32 * 4294967296 + lower32; + } + var newBuffer; + if (typeof Buffer.allocUnsafe === "function") { + newBuffer = function(len) { + return Buffer.allocUnsafe(len); + }; + } else { + newBuffer = function(len) { + return new Buffer(len); + }; + } + function installDestroyFn(stream2, fn) { + if (typeof stream2.destroy === "function") { + stream2._destroy = function(err, cb) { + fn(); + if (cb != null) cb(err); + }; + } else { + stream2.destroy = fn; + } + } + function defaultCallback(err) { + if (err) throw err; + } + return yauzl$1; +} +var extractZip$1; +var hasRequiredExtractZip; +function requireExtractZip() { + if (hasRequiredExtractZip) return extractZip$1; + hasRequiredExtractZip = 1; + const debug2 = requireBrowser$f()("extract-zip"); + const { createWriteStream: createWriteStream2, promises: fs2 } = require$$2$1; + const getStream2 = requireGetStream(); + const path2 = requirePath(); + const { promisify: promisify2 } = requireUtil$5(); + const stream2 = requireBrowser$h(); + const yauzl2 = requireYauzl(); + const openZip = promisify2(yauzl2.open); + const pipeline = promisify2(stream2.pipeline); + class Extractor { + constructor(zipPath, opts) { + this.zipPath = zipPath; + this.opts = opts; + } + async extract() { + debug2("opening", this.zipPath, "with opts", this.opts); + this.zipfile = await openZip(this.zipPath, { lazyEntries: true }); + this.canceled = false; + return new Promise((resolve, reject) => { + this.zipfile.on("error", (err) => { + this.canceled = true; + reject(err); + }); + this.zipfile.readEntry(); + this.zipfile.on("close", () => { + if (!this.canceled) { + debug2("zip extraction complete"); + resolve(); + } + }); + this.zipfile.on("entry", async (entry) => { + if (this.canceled) { + debug2("skipping entry", entry.fileName, { cancelled: this.canceled }); + return; + } + debug2("zipfile entry", entry.fileName); + if (entry.fileName.startsWith("__MACOSX/")) { + this.zipfile.readEntry(); + return; + } + const destDir = path2.dirname(path2.join(this.opts.dir, entry.fileName)); + try { + await fs2.mkdir(destDir, { recursive: true }); + const canonicalDestDir = await fs2.realpath(destDir); + const relativeDestDir = path2.relative(this.opts.dir, canonicalDestDir); + if (relativeDestDir.split(path2.sep).includes("..")) { + throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`); + } + await this.extractEntry(entry); + debug2("finished processing", entry.fileName); + this.zipfile.readEntry(); + } catch (err) { + this.canceled = true; + this.zipfile.close(); + reject(err); + } + }); + }); + } + async extractEntry(entry) { + if (this.canceled) { + debug2("skipping entry extraction", entry.fileName, { cancelled: this.canceled }); + return; + } + if (this.opts.onEntry) { + this.opts.onEntry(entry, this.zipfile); + } + const dest = path2.join(this.opts.dir, entry.fileName); + const mode = entry.externalFileAttributes >> 16 & 65535; + const IFMT = 61440; + const IFDIR = 16384; + const IFLNK = 40960; + const symlink2 = (mode & IFMT) === IFLNK; + let isDir = (mode & IFMT) === IFDIR; + if (!isDir && entry.fileName.endsWith("/")) { + isDir = true; + } + const madeBy = entry.versionMadeBy >> 8; + if (!isDir) isDir = madeBy === 0 && entry.externalFileAttributes === 16; + debug2("extracting entry", { filename: entry.fileName, isDir, isSymlink: symlink2 }); + const procMode = this.getExtractedMode(mode, isDir) & 511; + const destDir = isDir ? dest : path2.dirname(dest); + const mkdirOptions = { recursive: true }; + if (isDir) { + mkdirOptions.mode = procMode; + } + debug2("mkdir", { dir: destDir, ...mkdirOptions }); + await fs2.mkdir(destDir, mkdirOptions); + if (isDir) return; + debug2("opening read stream", dest); + const readStream = await promisify2(this.zipfile.openReadStream.bind(this.zipfile))(entry); + if (symlink2) { + const link2 = await getStream2(readStream); + debug2("creating symlink", link2, dest); + await fs2.symlink(link2, dest); + } else { + await pipeline(readStream, createWriteStream2(dest, { mode: procMode })); + } + } + getExtractedMode(entryMode, isDir) { + let mode = entryMode; + if (mode === 0) { + if (isDir) { + if (this.opts.defaultDirMode) { + mode = parseInt(this.opts.defaultDirMode, 10); + } + if (!mode) { + mode = 493; + } + } else { + if (this.opts.defaultFileMode) { + mode = parseInt(this.opts.defaultFileMode, 10); + } + if (!mode) { + mode = 420; + } + } + } + return mode; + } + } + extractZip$1 = async function(zipPath, opts) { + debug2("creating target directory", opts.dir); + if (!path2.isAbsolute(opts.dir)) { + throw new Error("Target directory is expected to be absolute"); + } + await fs2.mkdir(opts.dir, { recursive: true }); + opts.dir = await fs2.realpath(opts.dir); + return new Extractor(zipPath, opts).extract(); + }; + return extractZip$1; +} +var yazl$1 = {}; +var hasRequiredYazl; +function requireYazl() { + if (hasRequiredYazl) return yazl$1; + hasRequiredYazl = 1; + var fs2 = require$$2$1; + var Transform = requireBrowser$h().Transform; + var PassThrough = requireBrowser$h().PassThrough; + var zlib = requireLib(); + var util2 = requireUtil$5(); + var EventEmitter2 = requireEvents().EventEmitter; + var crc32 = requireBufferCrc32(); + yazl$1.ZipFile = ZipFile2; + yazl$1.dateToDosDateTime = dateToDosDateTime; + util2.inherits(ZipFile2, EventEmitter2); + function ZipFile2() { + this.outputStream = new PassThrough(); + this.entries = []; + this.outputStreamCursor = 0; + this.ended = false; + this.allDone = false; + this.forceZip64Eocd = false; + } + ZipFile2.prototype.addFile = function(realPath, metadataPath, options2) { + var self2 = this; + metadataPath = validateMetadataPath(metadataPath, false); + if (options2 == null) options2 = {}; + var entry = new Entry(metadataPath, false, options2); + self2.entries.push(entry); + fs2.stat(realPath, function(err, stats) { + if (err) return self2.emit("error", err); + if (!stats.isFile()) return self2.emit("error", new Error("not a file: " + realPath)); + entry.uncompressedSize = stats.size; + if (options2.mtime == null) entry.setLastModDate(stats.mtime); + if (options2.mode == null) entry.setFileAttributesMode(stats.mode); + entry.setFileDataPumpFunction(function() { + var readStream = fs2.createReadStream(realPath); + entry.state = Entry.FILE_DATA_IN_PROGRESS; + readStream.on("error", function(err2) { + self2.emit("error", err2); + }); + pumpFileDataReadStream(self2, entry, readStream); + }); + pumpEntries(self2); + }); + }; + ZipFile2.prototype.addReadStream = function(readStream, metadataPath, options2) { + var self2 = this; + metadataPath = validateMetadataPath(metadataPath, false); + if (options2 == null) options2 = {}; + var entry = new Entry(metadataPath, false, options2); + self2.entries.push(entry); + entry.setFileDataPumpFunction(function() { + entry.state = Entry.FILE_DATA_IN_PROGRESS; + pumpFileDataReadStream(self2, entry, readStream); + }); + pumpEntries(self2); + }; + ZipFile2.prototype.addBuffer = function(buffer2, metadataPath, options2) { + var self2 = this; + metadataPath = validateMetadataPath(metadataPath, false); + if (buffer2.length > 1073741823) throw new Error("buffer too large: " + buffer2.length + " > 1073741823"); + if (options2 == null) options2 = {}; + if (options2.size != null) throw new Error("options.size not allowed"); + var entry = new Entry(metadataPath, false, options2); + entry.uncompressedSize = buffer2.length; + entry.crc32 = crc32.unsigned(buffer2); + entry.crcAndFileSizeKnown = true; + self2.entries.push(entry); + if (!entry.compress) { + setCompressedBuffer(buffer2); + } else { + zlib.deflateRaw(buffer2, function(err, compressedBuffer) { + setCompressedBuffer(compressedBuffer); + }); + } + function setCompressedBuffer(compressedBuffer) { + entry.compressedSize = compressedBuffer.length; + entry.setFileDataPumpFunction(function() { + writeToOutputStream(self2, compressedBuffer); + writeToOutputStream(self2, entry.getDataDescriptor()); + entry.state = Entry.FILE_DATA_DONE; + setImmediate(function() { + pumpEntries(self2); + }); + }); + pumpEntries(self2); + } + }; + ZipFile2.prototype.addEmptyDirectory = function(metadataPath, options2) { + var self2 = this; + metadataPath = validateMetadataPath(metadataPath, true); + if (options2 == null) options2 = {}; + if (options2.size != null) throw new Error("options.size not allowed"); + if (options2.compress != null) throw new Error("options.compress not allowed"); + var entry = new Entry(metadataPath, true, options2); + self2.entries.push(entry); + entry.setFileDataPumpFunction(function() { + writeToOutputStream(self2, entry.getDataDescriptor()); + entry.state = Entry.FILE_DATA_DONE; + pumpEntries(self2); + }); + pumpEntries(self2); + }; + var eocdrSignatureBuffer = bufferFrom([80, 75, 5, 6]); + ZipFile2.prototype.end = function(options2, finalSizeCallback) { + if (typeof options2 === "function") { + finalSizeCallback = options2; + options2 = null; + } + if (options2 == null) options2 = {}; + if (this.ended) return; + this.ended = true; + this.finalSizeCallback = finalSizeCallback; + this.forceZip64Eocd = !!options2.forceZip64Format; + if (options2.comment) { + if (typeof options2.comment === "string") { + this.comment = encodeCp437(options2.comment); + } else { + this.comment = options2.comment; + } + if (this.comment.length > 65535) throw new Error("comment is too large"); + if (bufferIncludes(this.comment, eocdrSignatureBuffer)) throw new Error("comment contains end of central directory record signature"); + } else { + this.comment = EMPTY_BUFFER; + } + pumpEntries(this); + }; + function writeToOutputStream(self2, buffer2) { + self2.outputStream.write(buffer2); + self2.outputStreamCursor += buffer2.length; + } + function pumpFileDataReadStream(self2, entry, readStream) { + var crc32Watcher = new Crc32Watcher(); + var uncompressedSizeCounter = new ByteCounter(); + var compressor = entry.compress ? new zlib.DeflateRaw() : new PassThrough(); + var compressedSizeCounter = new ByteCounter(); + readStream.pipe(crc32Watcher).pipe(uncompressedSizeCounter).pipe(compressor).pipe(compressedSizeCounter).pipe(self2.outputStream, { end: false }); + compressedSizeCounter.on("end", function() { + entry.crc32 = crc32Watcher.crc32; + if (entry.uncompressedSize == null) { + entry.uncompressedSize = uncompressedSizeCounter.byteCount; + } else { + if (entry.uncompressedSize !== uncompressedSizeCounter.byteCount) return self2.emit("error", new Error("file data stream has unexpected number of bytes")); + } + entry.compressedSize = compressedSizeCounter.byteCount; + self2.outputStreamCursor += entry.compressedSize; + writeToOutputStream(self2, entry.getDataDescriptor()); + entry.state = Entry.FILE_DATA_DONE; + pumpEntries(self2); + }); + } + function pumpEntries(self2) { + if (self2.allDone) return; + if (self2.ended && self2.finalSizeCallback != null) { + var finalSize = calculateFinalSize(self2); + if (finalSize != null) { + self2.finalSizeCallback(finalSize); + self2.finalSizeCallback = null; + } + } + var entry = getFirstNotDoneEntry(); + function getFirstNotDoneEntry() { + for (var i = 0; i < self2.entries.length; i++) { + var entry2 = self2.entries[i]; + if (entry2.state < Entry.FILE_DATA_DONE) return entry2; + } + return null; + } + if (entry != null) { + if (entry.state < Entry.READY_TO_PUMP_FILE_DATA) return; + if (entry.state === Entry.FILE_DATA_IN_PROGRESS) return; + entry.relativeOffsetOfLocalHeader = self2.outputStreamCursor; + var localFileHeader = entry.getLocalFileHeader(); + writeToOutputStream(self2, localFileHeader); + entry.doFileDataPump(); + } else { + if (self2.ended) { + self2.offsetOfStartOfCentralDirectory = self2.outputStreamCursor; + self2.entries.forEach(function(entry2) { + var centralDirectoryRecord = entry2.getCentralDirectoryRecord(); + writeToOutputStream(self2, centralDirectoryRecord); + }); + writeToOutputStream(self2, getEndOfCentralDirectoryRecord(self2)); + self2.outputStream.end(); + self2.allDone = true; + } + } + } + function calculateFinalSize(self2) { + var pretendOutputCursor = 0; + var centralDirectorySize = 0; + for (var i = 0; i < self2.entries.length; i++) { + var entry = self2.entries[i]; + if (entry.compress) return -1; + if (entry.state >= Entry.READY_TO_PUMP_FILE_DATA) { + if (entry.uncompressedSize == null) return -1; + } else { + if (entry.uncompressedSize == null) return null; + } + entry.relativeOffsetOfLocalHeader = pretendOutputCursor; + var useZip64Format = entry.useZip64Format(); + pretendOutputCursor += LOCAL_FILE_HEADER_FIXED_SIZE + entry.utf8FileName.length; + pretendOutputCursor += entry.uncompressedSize; + if (!entry.crcAndFileSizeKnown) { + if (useZip64Format) { + pretendOutputCursor += ZIP64_DATA_DESCRIPTOR_SIZE; + } else { + pretendOutputCursor += DATA_DESCRIPTOR_SIZE; + } + } + centralDirectorySize += CENTRAL_DIRECTORY_RECORD_FIXED_SIZE + entry.utf8FileName.length + entry.fileComment.length; + if (useZip64Format) { + centralDirectorySize += ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE; + } + } + var endOfCentralDirectorySize = 0; + if (self2.forceZip64Eocd || self2.entries.length >= 65535 || centralDirectorySize >= 65535 || pretendOutputCursor >= 4294967295) { + endOfCentralDirectorySize += ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE + ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE; + } + endOfCentralDirectorySize += END_OF_CENTRAL_DIRECTORY_RECORD_SIZE + self2.comment.length; + return pretendOutputCursor + centralDirectorySize + endOfCentralDirectorySize; + } + var ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE = 56; + var ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE = 20; + var END_OF_CENTRAL_DIRECTORY_RECORD_SIZE = 22; + function getEndOfCentralDirectoryRecord(self2, actuallyJustTellMeHowLongItWouldBe) { + var needZip64Format = false; + var normalEntriesLength = self2.entries.length; + if (self2.forceZip64Eocd || self2.entries.length >= 65535) { + normalEntriesLength = 65535; + needZip64Format = true; + } + var sizeOfCentralDirectory = self2.outputStreamCursor - self2.offsetOfStartOfCentralDirectory; + var normalSizeOfCentralDirectory = sizeOfCentralDirectory; + if (self2.forceZip64Eocd || sizeOfCentralDirectory >= 4294967295) { + normalSizeOfCentralDirectory = 4294967295; + needZip64Format = true; + } + var normalOffsetOfStartOfCentralDirectory = self2.offsetOfStartOfCentralDirectory; + if (self2.forceZip64Eocd || self2.offsetOfStartOfCentralDirectory >= 4294967295) { + normalOffsetOfStartOfCentralDirectory = 4294967295; + needZip64Format = true; + } + var eocdrBuffer = bufferAlloc(END_OF_CENTRAL_DIRECTORY_RECORD_SIZE + self2.comment.length); + eocdrBuffer.writeUInt32LE(101010256, 0); + eocdrBuffer.writeUInt16LE(0, 4); + eocdrBuffer.writeUInt16LE(0, 6); + eocdrBuffer.writeUInt16LE(normalEntriesLength, 8); + eocdrBuffer.writeUInt16LE(normalEntriesLength, 10); + eocdrBuffer.writeUInt32LE(normalSizeOfCentralDirectory, 12); + eocdrBuffer.writeUInt32LE(normalOffsetOfStartOfCentralDirectory, 16); + eocdrBuffer.writeUInt16LE(self2.comment.length, 20); + self2.comment.copy(eocdrBuffer, 22); + if (!needZip64Format) return eocdrBuffer; + var zip64EocdrBuffer = bufferAlloc(ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE); + zip64EocdrBuffer.writeUInt32LE(101075792, 0); + writeUInt64LE(zip64EocdrBuffer, ZIP64_END_OF_CENTRAL_DIRECTORY_RECORD_SIZE - 12, 4); + zip64EocdrBuffer.writeUInt16LE(VERSION_MADE_BY, 12); + zip64EocdrBuffer.writeUInt16LE(VERSION_NEEDED_TO_EXTRACT_ZIP64, 14); + zip64EocdrBuffer.writeUInt32LE(0, 16); + zip64EocdrBuffer.writeUInt32LE(0, 20); + writeUInt64LE(zip64EocdrBuffer, self2.entries.length, 24); + writeUInt64LE(zip64EocdrBuffer, self2.entries.length, 32); + writeUInt64LE(zip64EocdrBuffer, sizeOfCentralDirectory, 40); + writeUInt64LE(zip64EocdrBuffer, self2.offsetOfStartOfCentralDirectory, 48); + var zip64EocdlBuffer = bufferAlloc(ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIZE); + zip64EocdlBuffer.writeUInt32LE(117853008, 0); + zip64EocdlBuffer.writeUInt32LE(0, 4); + writeUInt64LE(zip64EocdlBuffer, self2.outputStreamCursor, 8); + zip64EocdlBuffer.writeUInt32LE(1, 16); + return Buffer.concat([ + zip64EocdrBuffer, + zip64EocdlBuffer, + eocdrBuffer + ]); + } + function validateMetadataPath(metadataPath, isDirectory) { + if (metadataPath === "") throw new Error("empty metadataPath"); + metadataPath = metadataPath.replace(/\\/g, "/"); + if (/^[a-zA-Z]:/.test(metadataPath) || /^\//.test(metadataPath)) throw new Error("absolute path: " + metadataPath); + if (metadataPath.split("/").indexOf("..") !== -1) throw new Error("invalid relative path: " + metadataPath); + var looksLikeDirectory = /\/$/.test(metadataPath); + if (isDirectory) { + if (!looksLikeDirectory) metadataPath += "/"; + } else { + if (looksLikeDirectory) throw new Error("file path cannot end with '/': " + metadataPath); + } + return metadataPath; + } + var EMPTY_BUFFER = bufferAlloc(0); + function Entry(metadataPath, isDirectory, options2) { + this.utf8FileName = bufferFrom(metadataPath); + if (this.utf8FileName.length > 65535) throw new Error("utf8 file name too long. " + utf8FileName.length + " > 65535"); + this.isDirectory = isDirectory; + this.state = Entry.WAITING_FOR_METADATA; + this.setLastModDate(options2.mtime != null ? options2.mtime : /* @__PURE__ */ new Date()); + if (options2.mode != null) { + this.setFileAttributesMode(options2.mode); + } else { + this.setFileAttributesMode(isDirectory ? 16893 : 33204); + } + if (isDirectory) { + this.crcAndFileSizeKnown = true; + this.crc32 = 0; + this.uncompressedSize = 0; + this.compressedSize = 0; + } else { + this.crcAndFileSizeKnown = false; + this.crc32 = null; + this.uncompressedSize = null; + this.compressedSize = null; + if (options2.size != null) this.uncompressedSize = options2.size; + } + if (isDirectory) { + this.compress = false; + } else { + this.compress = true; + if (options2.compress != null) this.compress = !!options2.compress; + } + this.forceZip64Format = !!options2.forceZip64Format; + if (options2.fileComment) { + if (typeof options2.fileComment === "string") { + this.fileComment = bufferFrom(options2.fileComment, "utf-8"); + } else { + this.fileComment = options2.fileComment; + } + if (this.fileComment.length > 65535) throw new Error("fileComment is too large"); + } else { + this.fileComment = EMPTY_BUFFER; + } + } + Entry.WAITING_FOR_METADATA = 0; + Entry.READY_TO_PUMP_FILE_DATA = 1; + Entry.FILE_DATA_IN_PROGRESS = 2; + Entry.FILE_DATA_DONE = 3; + Entry.prototype.setLastModDate = function(date) { + var dosDateTime = dateToDosDateTime(date); + this.lastModFileTime = dosDateTime.time; + this.lastModFileDate = dosDateTime.date; + }; + Entry.prototype.setFileAttributesMode = function(mode) { + if ((mode & 65535) !== mode) throw new Error("invalid mode. expected: 0 <= " + mode + " <= 65535"); + this.externalFileAttributes = mode << 16 >>> 0; + }; + Entry.prototype.setFileDataPumpFunction = function(doFileDataPump) { + this.doFileDataPump = doFileDataPump; + this.state = Entry.READY_TO_PUMP_FILE_DATA; + }; + Entry.prototype.useZip64Format = function() { + return this.forceZip64Format || this.uncompressedSize != null && this.uncompressedSize > 4294967294 || this.compressedSize != null && this.compressedSize > 4294967294 || this.relativeOffsetOfLocalHeader != null && this.relativeOffsetOfLocalHeader > 4294967294; + }; + var LOCAL_FILE_HEADER_FIXED_SIZE = 30; + var VERSION_NEEDED_TO_EXTRACT_UTF8 = 20; + var VERSION_NEEDED_TO_EXTRACT_ZIP64 = 45; + var VERSION_MADE_BY = 3 << 8 | 63; + var FILE_NAME_IS_UTF8 = 1 << 11; + var UNKNOWN_CRC32_AND_FILE_SIZES = 1 << 3; + Entry.prototype.getLocalFileHeader = function() { + var crc322 = 0; + var compressedSize = 0; + var uncompressedSize = 0; + if (this.crcAndFileSizeKnown) { + crc322 = this.crc32; + compressedSize = this.compressedSize; + uncompressedSize = this.uncompressedSize; + } + var fixedSizeStuff = bufferAlloc(LOCAL_FILE_HEADER_FIXED_SIZE); + var generalPurposeBitFlag = FILE_NAME_IS_UTF8; + if (!this.crcAndFileSizeKnown) generalPurposeBitFlag |= UNKNOWN_CRC32_AND_FILE_SIZES; + fixedSizeStuff.writeUInt32LE(67324752, 0); + fixedSizeStuff.writeUInt16LE(VERSION_NEEDED_TO_EXTRACT_UTF8, 4); + fixedSizeStuff.writeUInt16LE(generalPurposeBitFlag, 6); + fixedSizeStuff.writeUInt16LE(this.getCompressionMethod(), 8); + fixedSizeStuff.writeUInt16LE(this.lastModFileTime, 10); + fixedSizeStuff.writeUInt16LE(this.lastModFileDate, 12); + fixedSizeStuff.writeUInt32LE(crc322, 14); + fixedSizeStuff.writeUInt32LE(compressedSize, 18); + fixedSizeStuff.writeUInt32LE(uncompressedSize, 22); + fixedSizeStuff.writeUInt16LE(this.utf8FileName.length, 26); + fixedSizeStuff.writeUInt16LE(0, 28); + return Buffer.concat([ + fixedSizeStuff, + // file name (variable size) + this.utf8FileName + // extra field (variable size) + // no extra fields + ]); + }; + var DATA_DESCRIPTOR_SIZE = 16; + var ZIP64_DATA_DESCRIPTOR_SIZE = 24; + Entry.prototype.getDataDescriptor = function() { + if (this.crcAndFileSizeKnown) { + return EMPTY_BUFFER; + } + if (!this.useZip64Format()) { + var buffer2 = bufferAlloc(DATA_DESCRIPTOR_SIZE); + buffer2.writeUInt32LE(134695760, 0); + buffer2.writeUInt32LE(this.crc32, 4); + buffer2.writeUInt32LE(this.compressedSize, 8); + buffer2.writeUInt32LE(this.uncompressedSize, 12); + return buffer2; + } else { + var buffer2 = bufferAlloc(ZIP64_DATA_DESCRIPTOR_SIZE); + buffer2.writeUInt32LE(134695760, 0); + buffer2.writeUInt32LE(this.crc32, 4); + writeUInt64LE(buffer2, this.compressedSize, 8); + writeUInt64LE(buffer2, this.uncompressedSize, 16); + return buffer2; + } + }; + var CENTRAL_DIRECTORY_RECORD_FIXED_SIZE = 46; + var ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE = 28; + Entry.prototype.getCentralDirectoryRecord = function() { + var fixedSizeStuff = bufferAlloc(CENTRAL_DIRECTORY_RECORD_FIXED_SIZE); + var generalPurposeBitFlag = FILE_NAME_IS_UTF8; + if (!this.crcAndFileSizeKnown) generalPurposeBitFlag |= UNKNOWN_CRC32_AND_FILE_SIZES; + var normalCompressedSize = this.compressedSize; + var normalUncompressedSize = this.uncompressedSize; + var normalRelativeOffsetOfLocalHeader = this.relativeOffsetOfLocalHeader; + var versionNeededToExtract; + var zeiefBuffer; + if (this.useZip64Format()) { + normalCompressedSize = 4294967295; + normalUncompressedSize = 4294967295; + normalRelativeOffsetOfLocalHeader = 4294967295; + versionNeededToExtract = VERSION_NEEDED_TO_EXTRACT_ZIP64; + zeiefBuffer = bufferAlloc(ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE); + zeiefBuffer.writeUInt16LE(1, 0); + zeiefBuffer.writeUInt16LE(ZIP64_EXTENDED_INFORMATION_EXTRA_FIELD_SIZE - 4, 2); + writeUInt64LE(zeiefBuffer, this.uncompressedSize, 4); + writeUInt64LE(zeiefBuffer, this.compressedSize, 12); + writeUInt64LE(zeiefBuffer, this.relativeOffsetOfLocalHeader, 20); + } else { + versionNeededToExtract = VERSION_NEEDED_TO_EXTRACT_UTF8; + zeiefBuffer = EMPTY_BUFFER; + } + fixedSizeStuff.writeUInt32LE(33639248, 0); + fixedSizeStuff.writeUInt16LE(VERSION_MADE_BY, 4); + fixedSizeStuff.writeUInt16LE(versionNeededToExtract, 6); + fixedSizeStuff.writeUInt16LE(generalPurposeBitFlag, 8); + fixedSizeStuff.writeUInt16LE(this.getCompressionMethod(), 10); + fixedSizeStuff.writeUInt16LE(this.lastModFileTime, 12); + fixedSizeStuff.writeUInt16LE(this.lastModFileDate, 14); + fixedSizeStuff.writeUInt32LE(this.crc32, 16); + fixedSizeStuff.writeUInt32LE(normalCompressedSize, 20); + fixedSizeStuff.writeUInt32LE(normalUncompressedSize, 24); + fixedSizeStuff.writeUInt16LE(this.utf8FileName.length, 28); + fixedSizeStuff.writeUInt16LE(zeiefBuffer.length, 30); + fixedSizeStuff.writeUInt16LE(this.fileComment.length, 32); + fixedSizeStuff.writeUInt16LE(0, 34); + fixedSizeStuff.writeUInt16LE(0, 36); + fixedSizeStuff.writeUInt32LE(this.externalFileAttributes, 38); + fixedSizeStuff.writeUInt32LE(normalRelativeOffsetOfLocalHeader, 42); + return Buffer.concat([ + fixedSizeStuff, + // file name (variable size) + this.utf8FileName, + // extra field (variable size) + zeiefBuffer, + // file comment (variable size) + this.fileComment + ]); + }; + Entry.prototype.getCompressionMethod = function() { + var NO_COMPRESSION = 0; + var DEFLATE_COMPRESSION = 8; + return this.compress ? DEFLATE_COMPRESSION : NO_COMPRESSION; + }; + function dateToDosDateTime(jsDate) { + var date = 0; + date |= jsDate.getDate() & 31; + date |= (jsDate.getMonth() + 1 & 15) << 5; + date |= (jsDate.getFullYear() - 1980 & 127) << 9; + var time = 0; + time |= Math.floor(jsDate.getSeconds() / 2); + time |= (jsDate.getMinutes() & 63) << 5; + time |= (jsDate.getHours() & 31) << 11; + return { date, time }; + } + function writeUInt64LE(buffer2, n, offset2) { + var high = Math.floor(n / 4294967296); + var low = n % 4294967296; + buffer2.writeUInt32LE(low, offset2); + buffer2.writeUInt32LE(high, offset2 + 4); + } + util2.inherits(ByteCounter, Transform); + function ByteCounter(options2) { + Transform.call(this, options2); + this.byteCount = 0; + } + ByteCounter.prototype._transform = function(chunk, encoding2, cb) { + this.byteCount += chunk.length; + cb(null, chunk); + }; + util2.inherits(Crc32Watcher, Transform); + function Crc32Watcher(options2) { + Transform.call(this, options2); + this.crc32 = 0; + } + Crc32Watcher.prototype._transform = function(chunk, encoding2, cb) { + this.crc32 = crc32.unsigned(chunk, this.crc32); + cb(null, chunk); + }; + var cp437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "; + if (cp437.length !== 256) throw new Error("assertion failure"); + var reverseCp437 = null; + function encodeCp437(string2) { + if (/^[\x20-\x7e]*$/.test(string2)) { + return bufferFrom(string2, "utf-8"); + } + if (reverseCp437 == null) { + reverseCp437 = {}; + for (var i = 0; i < cp437.length; i++) { + reverseCp437[cp437[i]] = i; + } + } + var result = bufferAlloc(string2.length); + for (var i = 0; i < string2.length; i++) { + var b = reverseCp437[string2[i]]; + if (b == null) throw new Error("character not encodable in CP437: " + JSON.stringify(string2[i])); + result[i] = b; + } + return result; + } + function bufferAlloc(size) { + bufferAlloc = modern; + try { + return bufferAlloc(size); + } catch (e) { + bufferAlloc = legacy2; + return bufferAlloc(size); + } + function modern(size2) { + return Buffer.allocUnsafe(size2); + } + function legacy2(size2) { + return new Buffer(size2); + } + } + function bufferFrom(something, encoding2) { + bufferFrom = modern; + try { + return bufferFrom(something, encoding2); + } catch (e) { + bufferFrom = legacy2; + return bufferFrom(something, encoding2); + } + function modern(something2, encoding3) { + return Buffer.from(something2, encoding3); + } + function legacy2(something2, encoding3) { + return new Buffer(something2, encoding3); + } + } + function bufferIncludes(buffer2, content) { + bufferIncludes = modern; + try { + return bufferIncludes(buffer2, content); + } catch (e) { + bufferIncludes = legacy2; + return bufferIncludes(buffer2, content); + } + function modern(buffer3, content2) { + return buffer3.includes(content2); + } + function legacy2(buffer3, content2) { + for (var i = 0; i <= buffer3.length - content2.length; i++) { + for (var j = 0; ; j++) { + if (j === content2.length) return true; + if (buffer3[i + j] !== content2[j]) break; + } + } + return false; + } + } + return yazl$1; +} +var yazlExports = requireYazl(); +const index$2 = /* @__PURE__ */ getDefaultExportFromCjs(yazlExports); +const index$3 = /* @__PURE__ */ _mergeNamespaces({ + __proto__: null, + default: index$2 +}, [yazlExports]); +var yauzlExports = requireYauzl(); +const index = /* @__PURE__ */ getDefaultExportFromCjs(yauzlExports); +const index$1 = /* @__PURE__ */ _mergeNamespaces({ + __proto__: null, + default: index +}, [yauzlExports]); +const extractZip = requireExtractZip(); +const extract = extractZip; +const zipBundleImpl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + extract, + yauzl: index$1, + yazl: index$3 +}, Symbol.toStringTag, { value: "Module" })); +const require$$0 = /* @__PURE__ */ getAugmentedNamespace(zipBundleImpl); +const yazl = require$$0.yazl; +const yauzl = require$$0.yauzl; +require$$0.extract; +const existsAsync = (path2) => new Promise((resolve) => fs.stat(path2, (err) => resolve(!err))); +async function mkdirIfNeeded$1(filePath) { + await fs.promises.mkdir(path.dirname(filePath), { recursive: true }).catch(() => { + }); +} +async function removeFolders(dirs) { + return await Promise.all(dirs.map( + (dir) => fs.promises.rm(dir, { recursive: true, force: true, maxRetries: 10 }).catch((e) => e) + )); +} +function canAccessFile(file) { + if (!file) + return false; + try { + fs.accessSync(file); + return true; + } catch (e) { + return false; + } +} +class SerializedFS { + constructor() { + this._buffers = /* @__PURE__ */ new Map(); + this._operations = []; + this._operationsDone = new ManualPromise(); + this._operationsDone.resolve(); + } + mkdir(dir) { + this._appendOperation({ op: "mkdir", dir }); + } + writeFile(file, content, skipIfExists) { + this._buffers.delete(file); + this._appendOperation({ op: "writeFile", file, content, skipIfExists }); + } + appendFile(file, text, flush) { + if (!this._buffers.has(file)) + this._buffers.set(file, []); + this._buffers.get(file).push(text); + if (flush) + this._flushFile(file); + } + _flushFile(file) { + const buffer2 = this._buffers.get(file); + if (buffer2 === void 0) + return; + const content = buffer2.join(""); + this._buffers.delete(file); + this._appendOperation({ op: "appendFile", file, content }); + } + copyFile(from2, to) { + this._flushFile(from2); + this._buffers.delete(to); + this._appendOperation({ op: "copyFile", from: from2, to }); + } + async syncAndGetError() { + for (const file of this._buffers.keys()) + this._flushFile(file); + await this._operationsDone; + return this._error; + } + zip(entries, zipFileName) { + for (const file of this._buffers.keys()) + this._flushFile(file); + this._appendOperation({ op: "zip", entries, zipFileName }); + } + // This method serializes all writes to the trace. + _appendOperation(op) { + const last = this._operations[this._operations.length - 1]; + if ((last == null ? void 0 : last.op) === "appendFile" && op.op === "appendFile" && last.file === op.file) { + last.content += op.content; + return; + } + this._operations.push(op); + if (this._operationsDone.isDone()) + this._performOperations(); + } + async _performOperations() { + this._operationsDone = new ManualPromise(); + while (this._operations.length) { + const op = this._operations.shift(); + if (this._error) + continue; + try { + await this._performOperation(op); + } catch (e) { + this._error = e; + } + } + this._operationsDone.resolve(); + } + async _performOperation(op) { + switch (op.op) { + case "mkdir": { + await fs.promises.mkdir(op.dir, { recursive: true }); + return; + } + case "writeFile": { + if (op.skipIfExists) + await fs.promises.writeFile(op.file, op.content, { flag: "wx" }).catch(() => { + }); + else + await fs.promises.writeFile(op.file, op.content); + return; + } + case "copyFile": { + await fs.promises.copyFile(op.from, op.to); + return; + } + case "appendFile": { + await fs.promises.appendFile(op.file, op.content); + return; + } + case "zip": { + const zipFile = new yazl.ZipFile(); + const result = new ManualPromise(); + zipFile.on("error", (error2) => result.reject(error2)); + for (const entry of op.entries) + zipFile.addFile(entry.value, entry.name); + zipFile.end(); + zipFile.outputStream.pipe(fs.createWriteStream(op.zipFileName)).on("close", () => result.resolve()).on("error", (error2) => result.reject(error2)); + await result; + return; + } + } + } +} +async function downloadBrowserWithProgressBar(title, browserDirectory, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout) { + if (await existsAsync(browserDirectoryToMarkerFilePath(browserDirectory))) { + debugLogger.log("install", `${title} is already downloaded.`); + return false; + } + const zipPath = path.join(os.tmpdir(), downloadFileName); + try { + const retryCount = 5; + for (let attempt = 1; attempt <= retryCount; ++attempt) { + debugLogger.log("install", `downloading ${title} - attempt #${attempt}`); + const url2 = downloadURLs[(attempt - 1) % downloadURLs.length]; + logPolitely(`Downloading ${title}` + colors.dim(` from ${url2}`)); + const { error: error2 } = await downloadBrowserWithProgressBarOutOfProcess(title, browserDirectory, url2, zipPath, executablePath, downloadSocketTimeout); + if (!error2) { + debugLogger.log("install", `SUCCESS installing ${title}`); + break; + } + if (await existsAsync(zipPath)) + await fs.promises.unlink(zipPath); + if (await existsAsync(browserDirectory)) + await fs.promises.rmdir(browserDirectory, { recursive: true }); + const errorMessage = (error2 == null ? void 0 : error2.message) || ""; + debugLogger.log("install", `attempt #${attempt} - ERROR: ${errorMessage}`); + if (attempt >= retryCount) + throw error2; + } + } catch (e) { + debugLogger.log("install", `FAILED installation ${title} with error: ${e}`); + process.exitCode = 1; + throw e; + } finally { + if (await existsAsync(zipPath)) + await fs.promises.unlink(zipPath); + } + logPolitely(`${title} downloaded to ${browserDirectory}`); + return true; +} +function downloadBrowserWithProgressBarOutOfProcess(title, browserDirectory, url2, zipPath, executablePath, socketTimeout) { + const cp2 = fork(path.join("playwright/packages/playwright-core/src/server/registry", "oopDownloadBrowserMain.js")); + const promise = new ManualPromise(); + const progress2 = getDownloadProgress(); + cp2.on("message", (message) => { + if ((message == null ? void 0 : message.method) === "log") + debugLogger.log("install", message.params.message); + if ((message == null ? void 0 : message.method) === "progress") + progress2(message.params.done, message.params.total); + }); + cp2.on("exit", (code) => { + if (code !== 0) { + promise.resolve({ error: new Error(`Download failure, code=${code}`) }); + return; + } + if (!fs.existsSync(browserDirectoryToMarkerFilePath(browserDirectory))) + promise.resolve({ error: new Error(`Download failure, ${browserDirectoryToMarkerFilePath(browserDirectory)} does not exist`) }); + else + promise.resolve({ error: null }); + }); + cp2.on("error", (error2) => { + promise.resolve({ error: error2 }); + }); + debugLogger.log("install", `running download:`); + debugLogger.log("install", `-- from url: ${url2}`); + debugLogger.log("install", `-- to location: ${zipPath}`); + const downloadParams = { + title, + browserDirectory, + url: url2, + zipPath, + executablePath, + socketTimeout, + userAgent: getUserAgent() + }; + cp2.send({ method: "download", params: downloadParams }); + return promise; +} +function logPolitely(toBeLogged) { + const logLevel = define_process_env_default.npm_config_loglevel; + const logLevelDisplay = ["silent", "error", "warn"].indexOf(logLevel || "") > -1; + if (!logLevelDisplay) + console.log(toBeLogged); +} +function getDownloadProgress() { + if (process.stdout.isTTY) + return getAnimatedDownloadProgress(); + return getBasicDownloadProgress(); +} +function getAnimatedDownloadProgress() { + let progressBar; + let lastDownloadedBytes = 0; + return (downloadedBytes, totalBytes) => { + if (!progressBar) { + progressBar = new progress( + `${toMegabytes( + totalBytes + )} [:bar] :percent :etas`, + { + complete: "=", + incomplete: " ", + width: 20, + total: totalBytes + } + ); + } + const delta = downloadedBytes - lastDownloadedBytes; + lastDownloadedBytes = downloadedBytes; + progressBar.tick(delta); + }; +} +function getBasicDownloadProgress() { + const totalRows = 10; + const stepWidth = 8; + let lastRow = -1; + return (downloadedBytes, totalBytes) => { + const percentage = downloadedBytes / totalBytes; + const row = Math.floor(totalRows * percentage); + if (row > lastRow) { + lastRow = row; + const percentageString = String(percentage * 100 | 0).padStart(3); + console.log(`|${"■".repeat(row * stepWidth)}${" ".repeat((totalRows - row) * stepWidth)}| ${percentageString}% of ${toMegabytes(totalBytes)}`); + } + }; +} +function toMegabytes(bytes) { + const mb = bytes / 1024 / 1024; + return `${Math.round(mb * 10) / 10} MiB`; +} +const deps = { + "ubuntu20.04-x64": { + tools: [ + "xvfb", + "fonts-noto-color-emoji", + "ttf-unifont", + "libfontconfig", + "libfreetype6", + "xfonts-cyrillic", + "xfonts-scalable", + "fonts-liberation", + "fonts-ipafont-gothic", + "fonts-wqy-zenhei", + "fonts-tlwg-loma-otf", + "ttf-ubuntu-font-family" + ], + chromium: [ + "fonts-liberation", + "libasound2", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libatspi2.0-0", + "libcairo2", + "libcups2", + "libdbus-1-3", + "libdrm2", + "libegl1", + "libgbm1", + "libglib2.0-0", + "libgtk-3-0", + "libnspr4", + "libnss3", + "libpango-1.0-0", + "libx11-6", + "libx11-xcb1", + "libxcb1", + "libxcomposite1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxrandr2", + "libxshmfence1" + ], + firefox: [ + "ffmpeg", + "libatk1.0-0", + "libcairo-gobject2", + "libcairo2", + "libdbus-1-3", + "libdbus-glib-1-2", + "libfontconfig1", + "libfreetype6", + "libgdk-pixbuf2.0-0", + "libglib2.0-0", + "libgtk-3-0", + "libpango-1.0-0", + "libpangocairo-1.0-0", + "libpangoft2-1.0-0", + "libx11-6", + "libx11-xcb1", + "libxcb-shm0", + "libxcb1", + "libxcomposite1", + "libxcursor1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxi6", + "libxrender1", + "libxt6", + "libxtst6" + ], + webkit: [ + "libenchant-2-2", + "libflite1", + "libx264-155", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libcairo2", + "libegl1", + "libenchant1c2a", + "libepoxy0", + "libevdev2", + "libfontconfig1", + "libfreetype6", + "libgdk-pixbuf2.0-0", + "libgl1", + "libgles2", + "libglib2.0-0", + "libgtk-3-0", + "libgudev-1.0-0", + "libharfbuzz-icu0", + "libharfbuzz0b", + "libhyphen0", + "libicu66", + "libjpeg-turbo8", + "libnghttp2-14", + "libnotify4", + "libopengl0", + "libopenjp2-7", + "libopus0", + "libpango-1.0-0", + "libpng16-16", + "libsecret-1-0", + "libvpx6", + "libwayland-client0", + "libwayland-egl1", + "libwayland-server0", + "libwebp6", + "libwebpdemux2", + "libwoff1", + "libx11-6", + "libxcomposite1", + "libxdamage1", + "libxkbcommon0", + "libxml2", + "libxslt1.1", + "libatomic1", + "libevent-2.1-7" + ], + lib2package: { + "libflite.so.1": "libflite1", + "libflite_usenglish.so.1": "libflite1", + "libflite_cmu_grapheme_lang.so.1": "libflite1", + "libflite_cmu_grapheme_lex.so.1": "libflite1", + "libflite_cmu_indic_lang.so.1": "libflite1", + "libflite_cmu_indic_lex.so.1": "libflite1", + "libflite_cmulex.so.1": "libflite1", + "libflite_cmu_time_awb.so.1": "libflite1", + "libflite_cmu_us_awb.so.1": "libflite1", + "libflite_cmu_us_kal16.so.1": "libflite1", + "libflite_cmu_us_kal.so.1": "libflite1", + "libflite_cmu_us_rms.so.1": "libflite1", + "libflite_cmu_us_slt.so.1": "libflite1", + "libx264.so": "libx264-155", + "libasound.so.2": "libasound2", + "libatk-1.0.so.0": "libatk1.0-0", + "libatk-bridge-2.0.so.0": "libatk-bridge2.0-0", + "libatspi.so.0": "libatspi2.0-0", + "libcairo-gobject.so.2": "libcairo-gobject2", + "libcairo.so.2": "libcairo2", + "libcups.so.2": "libcups2", + "libdbus-1.so.3": "libdbus-1-3", + "libdbus-glib-1.so.2": "libdbus-glib-1-2", + "libdrm.so.2": "libdrm2", + "libEGL.so.1": "libegl1", + "libenchant.so.1": "libenchant1c2a", + "libevdev.so.2": "libevdev2", + "libepoxy.so.0": "libepoxy0", + "libfontconfig.so.1": "libfontconfig1", + "libfreetype.so.6": "libfreetype6", + "libgbm.so.1": "libgbm1", + "libgdk_pixbuf-2.0.so.0": "libgdk-pixbuf2.0-0", + "libgdk-3.so.0": "libgtk-3-0", + "libgdk-x11-2.0.so.0": "libgtk2.0-0", + "libgio-2.0.so.0": "libglib2.0-0", + "libGL.so.1": "libgl1", + "libGLESv2.so.2": "libgles2", + "libglib-2.0.so.0": "libglib2.0-0", + "libgmodule-2.0.so.0": "libglib2.0-0", + "libgobject-2.0.so.0": "libglib2.0-0", + "libgthread-2.0.so.0": "libglib2.0-0", + "libgtk-3.so.0": "libgtk-3-0", + "libgtk-x11-2.0.so.0": "libgtk2.0-0", + "libgudev-1.0.so.0": "libgudev-1.0-0", + "libharfbuzz-icu.so.0": "libharfbuzz-icu0", + "libharfbuzz.so.0": "libharfbuzz0b", + "libhyphen.so.0": "libhyphen0", + "libicui18n.so.66": "libicu66", + "libicuuc.so.66": "libicu66", + "libjpeg.so.8": "libjpeg-turbo8", + "libnotify.so.4": "libnotify4", + "libnspr4.so": "libnspr4", + "libnss3.so": "libnss3", + "libnssutil3.so": "libnss3", + "libOpenGL.so.0": "libopengl0", + "libopenjp2.so.7": "libopenjp2-7", + "libopus.so.0": "libopus0", + "libpango-1.0.so.0": "libpango-1.0-0", + "libpangocairo-1.0.so.0": "libpangocairo-1.0-0", + "libpangoft2-1.0.so.0": "libpangoft2-1.0-0", + "libpng16.so.16": "libpng16-16", + "libsecret-1.so.0": "libsecret-1-0", + "libsmime3.so": "libnss3", + "libvpx.so.6": "libvpx6", + "libwayland-client.so.0": "libwayland-client0", + "libwayland-egl.so.1": "libwayland-egl1", + "libwayland-server.so.0": "libwayland-server0", + "libwebp.so.6": "libwebp6", + "libwebpdemux.so.2": "libwebpdemux2", + "libwoff2dec.so.1.0.2": "libwoff1", + "libX11-xcb.so.1": "libx11-xcb1", + "libX11.so.6": "libx11-6", + "libxcb-dri3.so.0": "libxcb-dri3-0", + "libxcb-shm.so.0": "libxcb-shm0", + "libxcb.so.1": "libxcb1", + "libXcomposite.so.1": "libxcomposite1", + "libXcursor.so.1": "libxcursor1", + "libXdamage.so.1": "libxdamage1", + "libXext.so.6": "libxext6", + "libXfixes.so.3": "libxfixes3", + "libXi.so.6": "libxi6", + "libxkbcommon.so.0": "libxkbcommon0", + "libxml2.so.2": "libxml2", + "libXrandr.so.2": "libxrandr2", + "libXrender.so.1": "libxrender1", + "libxslt.so.1": "libxslt1.1", + "libXt.so.6": "libxt6", + "libXtst.so.6": "libxtst6", + "libxshmfence.so.1": "libxshmfence1", + "libatomic.so.1": "libatomic1", + "libenchant-2.so.2": "libenchant-2-2", + "libevent-2.1.so.7": "libevent-2.1-7" + } + }, + "ubuntu22.04-x64": { + tools: [ + "xvfb", + "fonts-noto-color-emoji", + "fonts-unifont", + "libfontconfig1", + "libfreetype6", + "xfonts-cyrillic", + "xfonts-scalable", + "fonts-liberation", + "fonts-ipafont-gothic", + "fonts-wqy-zenhei", + "fonts-tlwg-loma-otf", + "fonts-freefont-ttf" + ], + chromium: [ + "libasound2", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libatspi2.0-0", + "libcairo2", + "libcups2", + "libdbus-1-3", + "libdrm2", + "libgbm1", + "libglib2.0-0", + "libnspr4", + "libnss3", + "libpango-1.0-0", + "libwayland-client0", + "libx11-6", + "libxcb1", + "libxcomposite1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxkbcommon0", + "libxrandr2" + ], + firefox: [ + "ffmpeg", + "libasound2", + "libatk1.0-0", + "libcairo-gobject2", + "libcairo2", + "libdbus-1-3", + "libdbus-glib-1-2", + "libfontconfig1", + "libfreetype6", + "libgdk-pixbuf-2.0-0", + "libglib2.0-0", + "libgtk-3-0", + "libpango-1.0-0", + "libpangocairo-1.0-0", + "libx11-6", + "libx11-xcb1", + "libxcb-shm0", + "libxcb1", + "libxcomposite1", + "libxcursor1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxi6", + "libxrandr2", + "libxrender1", + "libxtst6" + ], + webkit: [ + "libsoup-3.0-0", + "libenchant-2-2", + "gstreamer1.0-libav", + "gstreamer1.0-plugins-bad", + "gstreamer1.0-plugins-base", + "gstreamer1.0-plugins-good", + "libicu70", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libcairo2", + "libdbus-1-3", + "libdrm2", + "libegl1", + "libepoxy0", + "libevdev2", + "libffi7", + "libfontconfig1", + "libfreetype6", + "libgbm1", + "libgdk-pixbuf-2.0-0", + "libgles2", + "libglib2.0-0", + "libglx0", + "libgstreamer-gl1.0-0", + "libgstreamer-plugins-base1.0-0", + "libgstreamer1.0-0", + "libgtk-4-1", + "libgudev-1.0-0", + "libharfbuzz-icu0", + "libharfbuzz0b", + "libhyphen0", + "libjpeg-turbo8", + "liblcms2-2", + "libmanette-0.2-0", + "libnotify4", + "libopengl0", + "libopenjp2-7", + "libopus0", + "libpango-1.0-0", + "libpng16-16", + "libproxy1v5", + "libsecret-1-0", + "libwayland-client0", + "libwayland-egl1", + "libwayland-server0", + "libwebpdemux2", + "libwoff1", + "libx11-6", + "libxcomposite1", + "libxdamage1", + "libxkbcommon0", + "libxml2", + "libxslt1.1", + "libx264-163", + "libatomic1", + "libevent-2.1-7", + "libavif13" + ], + lib2package: { + "libavif.so.13": "libavif13", + "libsoup-3.0.so.0": "libsoup-3.0-0", + "libasound.so.2": "libasound2", + "libatk-1.0.so.0": "libatk1.0-0", + "libatk-bridge-2.0.so.0": "libatk-bridge2.0-0", + "libatspi.so.0": "libatspi2.0-0", + "libcairo-gobject.so.2": "libcairo-gobject2", + "libcairo.so.2": "libcairo2", + "libcups.so.2": "libcups2", + "libdbus-1.so.3": "libdbus-1-3", + "libdbus-glib-1.so.2": "libdbus-glib-1-2", + "libdrm.so.2": "libdrm2", + "libEGL.so.1": "libegl1", + "libepoxy.so.0": "libepoxy0", + "libevdev.so.2": "libevdev2", + "libffi.so.7": "libffi7", + "libfontconfig.so.1": "libfontconfig1", + "libfreetype.so.6": "libfreetype6", + "libgbm.so.1": "libgbm1", + "libgdk_pixbuf-2.0.so.0": "libgdk-pixbuf-2.0-0", + "libgdk-3.so.0": "libgtk-3-0", + "libgio-2.0.so.0": "libglib2.0-0", + "libGLESv2.so.2": "libgles2", + "libglib-2.0.so.0": "libglib2.0-0", + "libGLX.so.0": "libglx0", + "libgmodule-2.0.so.0": "libglib2.0-0", + "libgobject-2.0.so.0": "libglib2.0-0", + "libgstallocators-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstapp-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstaudio-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstbase-1.0.so.0": "libgstreamer1.0-0", + "libgstfft-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstgl-1.0.so.0": "libgstreamer-gl1.0-0", + "libgstpbutils-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstreamer-1.0.so.0": "libgstreamer1.0-0", + "libgsttag-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstvideo-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgtk-3.so.0": "libgtk-3-0", + "libgtk-4.so.1": "libgtk-4-1", + "libgudev-1.0.so.0": "libgudev-1.0-0", + "libharfbuzz-icu.so.0": "libharfbuzz-icu0", + "libharfbuzz.so.0": "libharfbuzz0b", + "libhyphen.so.0": "libhyphen0", + "libjpeg.so.8": "libjpeg-turbo8", + "liblcms2.so.2": "liblcms2-2", + "libmanette-0.2.so.0": "libmanette-0.2-0", + "libnotify.so.4": "libnotify4", + "libnspr4.so": "libnspr4", + "libnss3.so": "libnss3", + "libnssutil3.so": "libnss3", + "libOpenGL.so.0": "libopengl0", + "libopenjp2.so.7": "libopenjp2-7", + "libopus.so.0": "libopus0", + "libpango-1.0.so.0": "libpango-1.0-0", + "libpangocairo-1.0.so.0": "libpangocairo-1.0-0", + "libpng16.so.16": "libpng16-16", + "libproxy.so.1": "libproxy1v5", + "libsecret-1.so.0": "libsecret-1-0", + "libsmime3.so": "libnss3", + "libwayland-client.so.0": "libwayland-client0", + "libwayland-egl.so.1": "libwayland-egl1", + "libwayland-server.so.0": "libwayland-server0", + "libwebpdemux.so.2": "libwebpdemux2", + "libwoff2dec.so.1.0.2": "libwoff1", + "libX11-xcb.so.1": "libx11-xcb1", + "libX11.so.6": "libx11-6", + "libxcb-shm.so.0": "libxcb-shm0", + "libxcb.so.1": "libxcb1", + "libXcomposite.so.1": "libxcomposite1", + "libXcursor.so.1": "libxcursor1", + "libXdamage.so.1": "libxdamage1", + "libXext.so.6": "libxext6", + "libXfixes.so.3": "libxfixes3", + "libXi.so.6": "libxi6", + "libxkbcommon.so.0": "libxkbcommon0", + "libxml2.so.2": "libxml2", + "libXrandr.so.2": "libxrandr2", + "libXrender.so.1": "libxrender1", + "libxslt.so.1": "libxslt1.1", + "libXtst.so.6": "libxtst6", + "libicui18n.so.60": "libicu70", + "libicuuc.so.66": "libicu70", + "libicui18n.so.66": "libicu70", + "libwebp.so.6": "libwebp6", + "libenchant-2.so.2": "libenchant-2-2", + "libx264.so": "libx264-163", + "libvpx.so.7": "libvpx7", + "libatomic.so.1": "libatomic1", + "libevent-2.1.so.7": "libevent-2.1-7" + } + }, + "ubuntu24.04-x64": { + tools: [ + "xvfb", + "fonts-noto-color-emoji", + "fonts-unifont", + "libfontconfig1", + "libfreetype6", + "xfonts-cyrillic", + "xfonts-scalable", + "fonts-liberation", + "fonts-ipafont-gothic", + "fonts-wqy-zenhei", + "fonts-tlwg-loma-otf", + "fonts-freefont-ttf" + ], + chromium: [ + "libasound2t64", + "libatk-bridge2.0-0t64", + "libatk1.0-0t64", + "libatspi2.0-0t64", + "libcairo2", + "libcups2t64", + "libdbus-1-3", + "libdrm2", + "libgbm1", + "libglib2.0-0t64", + "libnspr4", + "libnss3", + "libpango-1.0-0", + "libx11-6", + "libxcb1", + "libxcomposite1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxkbcommon0", + "libxrandr2" + ], + firefox: [ + "libasound2t64", + "libatk1.0-0t64", + "libcairo-gobject2", + "libcairo2", + "libdbus-1-3", + "libfontconfig1", + "libfreetype6", + "libgdk-pixbuf-2.0-0", + "libglib2.0-0t64", + "libgtk-3-0t64", + "libpango-1.0-0", + "libpangocairo-1.0-0", + "libx11-6", + "libx11-xcb1", + "libxcb-shm0", + "libxcb1", + "libxcomposite1", + "libxcursor1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxi6", + "libxrandr2", + "libxrender1" + ], + webkit: [ + "gstreamer1.0-libav", + "gstreamer1.0-plugins-bad", + "gstreamer1.0-plugins-base", + "gstreamer1.0-plugins-good", + "libicu74", + "libatomic1", + "libatk-bridge2.0-0t64", + "libatk1.0-0t64", + "libcairo-gobject2", + "libcairo2", + "libdbus-1-3", + "libdrm2", + "libenchant-2-2", + "libepoxy0", + "libevent-2.1-7t64", + "libflite1", + "libfontconfig1", + "libfreetype6", + "libgbm1", + "libgdk-pixbuf-2.0-0", + "libgles2", + "libglib2.0-0t64", + "libgstreamer-gl1.0-0", + "libgstreamer-plugins-bad1.0-0", + "libgstreamer-plugins-base1.0-0", + "libgstreamer1.0-0", + "libgtk-4-1", + "libharfbuzz-icu0", + "libharfbuzz0b", + "libhyphen0", + "libicu74", + "libjpeg-turbo8", + "liblcms2-2", + "libmanette-0.2-0", + "libopus0", + "libpango-1.0-0", + "libpangocairo-1.0-0", + "libpng16-16t64", + "libsecret-1-0", + "libvpx9", + "libwayland-client0", + "libwayland-egl1", + "libwayland-server0", + "libwebp7", + "libwebpdemux2", + "libwoff1", + "libx11-6", + "libxkbcommon0", + "libxml2", + "libxslt1.1", + "libx264-164", + "libavif16" + ], + lib2package: { + "libavif.so.16": "libavif16", + "libasound.so.2": "libasound2t64", + "libatk-1.0.so.0": "libatk1.0-0t64", + "libatk-bridge-2.0.so.0": "libatk-bridge2.0-0t64", + "libatomic.so.1": "libatomic1", + "libatspi.so.0": "libatspi2.0-0t64", + "libcairo-gobject.so.2": "libcairo-gobject2", + "libcairo.so.2": "libcairo2", + "libcups.so.2": "libcups2t64", + "libdbus-1.so.3": "libdbus-1-3", + "libdrm.so.2": "libdrm2", + "libenchant-2.so.2": "libenchant-2-2", + "libepoxy.so.0": "libepoxy0", + "libevent-2.1.so.7": "libevent-2.1-7t64", + "libflite_cmu_grapheme_lang.so.1": "libflite1", + "libflite_cmu_grapheme_lex.so.1": "libflite1", + "libflite_cmu_indic_lang.so.1": "libflite1", + "libflite_cmu_indic_lex.so.1": "libflite1", + "libflite_cmu_time_awb.so.1": "libflite1", + "libflite_cmu_us_awb.so.1": "libflite1", + "libflite_cmu_us_kal.so.1": "libflite1", + "libflite_cmu_us_kal16.so.1": "libflite1", + "libflite_cmu_us_rms.so.1": "libflite1", + "libflite_cmu_us_slt.so.1": "libflite1", + "libflite_cmulex.so.1": "libflite1", + "libflite_usenglish.so.1": "libflite1", + "libflite.so.1": "libflite1", + "libfontconfig.so.1": "libfontconfig1", + "libfreetype.so.6": "libfreetype6", + "libgbm.so.1": "libgbm1", + "libgdk_pixbuf-2.0.so.0": "libgdk-pixbuf-2.0-0", + "libgdk-3.so.0": "libgtk-3-0t64", + "libgio-2.0.so.0": "libglib2.0-0t64", + "libGLESv2.so.2": "libgles2", + "libglib-2.0.so.0": "libglib2.0-0t64", + "libgmodule-2.0.so.0": "libglib2.0-0t64", + "libgobject-2.0.so.0": "libglib2.0-0t64", + "libgstallocators-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstapp-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstaudio-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstbase-1.0.so.0": "libgstreamer1.0-0", + "libgstcodecparsers-1.0.so.0": "libgstreamer-plugins-bad1.0-0", + "libgstfft-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstgl-1.0.so.0": "libgstreamer-gl1.0-0", + "libgstpbutils-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstreamer-1.0.so.0": "libgstreamer1.0-0", + "libgsttag-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstvideo-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgtk-3.so.0": "libgtk-3-0t64", + "libgtk-4.so.1": "libgtk-4-1", + "libharfbuzz-icu.so.0": "libharfbuzz-icu0", + "libharfbuzz.so.0": "libharfbuzz0b", + "libhyphen.so.0": "libhyphen0", + "libicudata.so.74": "libicu74", + "libicui18n.so.74": "libicu74", + "libicuuc.so.74": "libicu74", + "libjpeg.so.8": "libjpeg-turbo8", + "liblcms2.so.2": "liblcms2-2", + "libmanette-0.2.so.0": "libmanette-0.2-0", + "libnspr4.so": "libnspr4", + "libnss3.so": "libnss3", + "libnssutil3.so": "libnss3", + "libopus.so.0": "libopus0", + "libpango-1.0.so.0": "libpango-1.0-0", + "libpangocairo-1.0.so.0": "libpangocairo-1.0-0", + "libpng16.so.16": "libpng16-16t64", + "libsecret-1.so.0": "libsecret-1-0", + "libsmime3.so": "libnss3", + "libsoup-3.0.so.0": "libsoup-3.0-0", + "libvpx.so.9": "libvpx9", + "libwayland-client.so.0": "libwayland-client0", + "libwayland-egl.so.1": "libwayland-egl1", + "libwayland-server.so.0": "libwayland-server0", + "libwebp.so.7": "libwebp7", + "libwebpdemux.so.2": "libwebpdemux2", + "libwoff2dec.so.1.0.2": "libwoff1", + "libX11-xcb.so.1": "libx11-xcb1", + "libX11.so.6": "libx11-6", + "libxcb-shm.so.0": "libxcb-shm0", + "libxcb.so.1": "libxcb1", + "libXcomposite.so.1": "libxcomposite1", + "libXcursor.so.1": "libxcursor1", + "libXdamage.so.1": "libxdamage1", + "libXext.so.6": "libxext6", + "libXfixes.so.3": "libxfixes3", + "libXi.so.6": "libxi6", + "libxkbcommon.so.0": "libxkbcommon0", + "libxml2.so.2": "libxml2", + "libXrandr.so.2": "libxrandr2", + "libXrender.so.1": "libxrender1", + "libxslt.so.1": "libxslt1.1", + "libx264.so": "libx264-164" + } + }, + "debian11-x64": { + tools: [ + "xvfb", + "fonts-noto-color-emoji", + "fonts-unifont", + "libfontconfig1", + "libfreetype6", + "xfonts-cyrillic", + "xfonts-scalable", + "fonts-liberation", + "fonts-ipafont-gothic", + "fonts-wqy-zenhei", + "fonts-tlwg-loma-otf", + "fonts-freefont-ttf" + ], + chromium: [ + "libasound2", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libatspi2.0-0", + "libcairo2", + "libcups2", + "libdbus-1-3", + "libdrm2", + "libgbm1", + "libglib2.0-0", + "libnspr4", + "libnss3", + "libpango-1.0-0", + "libwayland-client0", + "libx11-6", + "libxcb1", + "libxcomposite1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxkbcommon0", + "libxrandr2" + ], + firefox: [ + "libasound2", + "libatk1.0-0", + "libcairo-gobject2", + "libcairo2", + "libdbus-1-3", + "libdbus-glib-1-2", + "libfontconfig1", + "libfreetype6", + "libgdk-pixbuf-2.0-0", + "libglib2.0-0", + "libgtk-3-0", + "libharfbuzz0b", + "libpango-1.0-0", + "libpangocairo-1.0-0", + "libx11-6", + "libx11-xcb1", + "libxcb-shm0", + "libxcb1", + "libxcomposite1", + "libxcursor1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxi6", + "libxrandr2", + "libxrender1", + "libxtst6" + ], + webkit: [ + "gstreamer1.0-libav", + "gstreamer1.0-plugins-bad", + "gstreamer1.0-plugins-base", + "gstreamer1.0-plugins-good", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libcairo2", + "libdbus-1-3", + "libdrm2", + "libegl1", + "libenchant-2-2", + "libepoxy0", + "libevdev2", + "libfontconfig1", + "libfreetype6", + "libgbm1", + "libgdk-pixbuf-2.0-0", + "libgles2", + "libglib2.0-0", + "libglx0", + "libgstreamer-gl1.0-0", + "libgstreamer-plugins-base1.0-0", + "libgstreamer1.0-0", + "libgtk-3-0", + "libgudev-1.0-0", + "libharfbuzz-icu0", + "libharfbuzz0b", + "libhyphen0", + "libicu67", + "libjpeg62-turbo", + "liblcms2-2", + "libmanette-0.2-0", + "libnghttp2-14", + "libnotify4", + "libopengl0", + "libopenjp2-7", + "libopus0", + "libpango-1.0-0", + "libpng16-16", + "libproxy1v5", + "libsecret-1-0", + "libwayland-client0", + "libwayland-egl1", + "libwayland-server0", + "libwebp6", + "libwebpdemux2", + "libwoff1", + "libx11-6", + "libxcomposite1", + "libxdamage1", + "libxkbcommon0", + "libxml2", + "libxslt1.1", + "libatomic1", + "libevent-2.1-7" + ], + lib2package: { + "libasound.so.2": "libasound2", + "libatk-1.0.so.0": "libatk1.0-0", + "libatk-bridge-2.0.so.0": "libatk-bridge2.0-0", + "libatspi.so.0": "libatspi2.0-0", + "libcairo-gobject.so.2": "libcairo-gobject2", + "libcairo.so.2": "libcairo2", + "libcups.so.2": "libcups2", + "libdbus-1.so.3": "libdbus-1-3", + "libdbus-glib-1.so.2": "libdbus-glib-1-2", + "libdrm.so.2": "libdrm2", + "libEGL.so.1": "libegl1", + "libenchant-2.so.2": "libenchant-2-2", + "libepoxy.so.0": "libepoxy0", + "libevdev.so.2": "libevdev2", + "libfontconfig.so.1": "libfontconfig1", + "libfreetype.so.6": "libfreetype6", + "libgbm.so.1": "libgbm1", + "libgdk_pixbuf-2.0.so.0": "libgdk-pixbuf-2.0-0", + "libgdk-3.so.0": "libgtk-3-0", + "libgio-2.0.so.0": "libglib2.0-0", + "libGLESv2.so.2": "libgles2", + "libglib-2.0.so.0": "libglib2.0-0", + "libGLX.so.0": "libglx0", + "libgmodule-2.0.so.0": "libglib2.0-0", + "libgobject-2.0.so.0": "libglib2.0-0", + "libgstallocators-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstapp-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstaudio-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstbase-1.0.so.0": "libgstreamer1.0-0", + "libgstfft-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstgl-1.0.so.0": "libgstreamer-gl1.0-0", + "libgstpbutils-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstreamer-1.0.so.0": "libgstreamer1.0-0", + "libgsttag-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgstvideo-1.0.so.0": "libgstreamer-plugins-base1.0-0", + "libgtk-3.so.0": "libgtk-3-0", + "libgudev-1.0.so.0": "libgudev-1.0-0", + "libharfbuzz-icu.so.0": "libharfbuzz-icu0", + "libharfbuzz.so.0": "libharfbuzz0b", + "libhyphen.so.0": "libhyphen0", + "libicui18n.so.67": "libicu67", + "libicuuc.so.67": "libicu67", + "libjpeg.so.62": "libjpeg62-turbo", + "liblcms2.so.2": "liblcms2-2", + "libmanette-0.2.so.0": "libmanette-0.2-0", + "libnotify.so.4": "libnotify4", + "libnspr4.so": "libnspr4", + "libnss3.so": "libnss3", + "libnssutil3.so": "libnss3", + "libOpenGL.so.0": "libopengl0", + "libopenjp2.so.7": "libopenjp2-7", + "libopus.so.0": "libopus0", + "libpango-1.0.so.0": "libpango-1.0-0", + "libpangocairo-1.0.so.0": "libpangocairo-1.0-0", + "libpng16.so.16": "libpng16-16", + "libproxy.so.1": "libproxy1v5", + "libsecret-1.so.0": "libsecret-1-0", + "libsmime3.so": "libnss3", + "libwayland-client.so.0": "libwayland-client0", + "libwayland-egl.so.1": "libwayland-egl1", + "libwayland-server.so.0": "libwayland-server0", + "libwebp.so.6": "libwebp6", + "libwebpdemux.so.2": "libwebpdemux2", + "libwoff2dec.so.1.0.2": "libwoff1", + "libX11-xcb.so.1": "libx11-xcb1", + "libX11.so.6": "libx11-6", + "libxcb-shm.so.0": "libxcb-shm0", + "libxcb.so.1": "libxcb1", + "libXcomposite.so.1": "libxcomposite1", + "libXcursor.so.1": "libxcursor1", + "libXdamage.so.1": "libxdamage1", + "libXext.so.6": "libxext6", + "libXfixes.so.3": "libxfixes3", + "libXi.so.6": "libxi6", + "libxkbcommon.so.0": "libxkbcommon0", + "libxml2.so.2": "libxml2", + "libXrandr.so.2": "libxrandr2", + "libXrender.so.1": "libxrender1", + "libxslt.so.1": "libxslt1.1", + "libXtst.so.6": "libxtst6", + "libatomic.so.1": "libatomic1", + "libevent-2.1.so.7": "libevent-2.1-7" + } + }, + "debian12-x64": { + tools: [ + "xvfb", + "fonts-noto-color-emoji", + "fonts-unifont", + "libfontconfig1", + "libfreetype6", + "xfonts-scalable", + "fonts-liberation", + "fonts-ipafont-gothic", + "fonts-wqy-zenhei", + "fonts-tlwg-loma-otf", + "fonts-freefont-ttf" + ], + chromium: [ + "libasound2", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libatspi2.0-0", + "libcairo2", + "libcups2", + "libdbus-1-3", + "libdrm2", + "libgbm1", + "libglib2.0-0", + "libnspr4", + "libnss3", + "libpango-1.0-0", + "libx11-6", + "libxcb1", + "libxcomposite1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxkbcommon0", + "libxrandr2" + ], + firefox: [ + "libasound2", + "libatk1.0-0", + "libcairo-gobject2", + "libcairo2", + "libdbus-1-3", + "libdbus-glib-1-2", + "libfontconfig1", + "libfreetype6", + "libgdk-pixbuf-2.0-0", + "libglib2.0-0", + "libgtk-3-0", + "libharfbuzz0b", + "libpango-1.0-0", + "libpangocairo-1.0-0", + "libx11-6", + "libx11-xcb1", + "libxcb-shm0", + "libxcb1", + "libxcomposite1", + "libxcursor1", + "libxdamage1", + "libxext6", + "libxfixes3", + "libxi6", + "libxrandr2", + "libxrender1", + "libxtst6" + ], + webkit: [ + "libsoup-3.0-0", + "gstreamer1.0-libav", + "gstreamer1.0-plugins-bad", + "gstreamer1.0-plugins-base", + "gstreamer1.0-plugins-good", + "libatk-bridge2.0-0", + "libatk1.0-0", + "libcairo2", + "libdbus-1-3", + "libdrm2", + "libegl1", + "libenchant-2-2", + "libepoxy0", + "libevdev2", + "libfontconfig1", + "libfreetype6", + "libgbm1", + "libgdk-pixbuf-2.0-0", + "libgles2", + "libglib2.0-0", + "libglx0", + "libgstreamer-gl1.0-0", + "libgstreamer-plugins-base1.0-0", + "libgstreamer1.0-0", + "libgtk-4-1", + "libgudev-1.0-0", + "libharfbuzz-icu0", + "libharfbuzz0b", + "libhyphen0", + "libicu72", + "libjpeg62-turbo", + "liblcms2-2", + "libmanette-0.2-0", + "libnotify4", + "libopengl0", + "libopenjp2-7", + "libopus0", + "libpango-1.0-0", + "libpng16-16", + "libproxy1v5", + "libsecret-1-0", + "libwayland-client0", + "libwayland-egl1", + "libwayland-server0", + "libwebp7", + "libwebpdemux2", + "libwoff1", + "libx11-6", + "libxcomposite1", + "libxdamage1", + "libxkbcommon0", + "libxml2", + "libxslt1.1", + "libatomic1", + "libevent-2.1-7", + "libavif15" + ], + lib2package: { + "libavif.so.15": "libavif15", + "libsoup-3.0.so.0": "libsoup-3.0-0", + "libasound.so.2": "libasound2", + "libatk-1.0.so.0": "libatk1.0-0", + "libatk-bridge-2.0.so.0": "libatk-bridge2.0-0", + "libatspi.so.0": "libatspi2.0-0", + "libcairo.so.2": "libcairo2", + "libcups.so.2": "libcups2", + "libdbus-1.so.3": "libdbus-1-3", + "libdrm.so.2": "libdrm2", + "libgbm.so.1": "libgbm1", + "libgio-2.0.so.0": "libglib2.0-0", + "libglib-2.0.so.0": "libglib2.0-0", + "libgobject-2.0.so.0": "libglib2.0-0", + "libnspr4.so": "libnspr4", + "libnss3.so": "libnss3", + "libnssutil3.so": "libnss3", + "libpango-1.0.so.0": "libpango-1.0-0", + "libsmime3.so": "libnss3", + "libX11.so.6": "libx11-6", + "libxcb.so.1": "libxcb1", + "libXcomposite.so.1": "libxcomposite1", + "libXdamage.so.1": "libxdamage1", + "libXext.so.6": "libxext6", + "libXfixes.so.3": "libxfixes3", + "libxkbcommon.so.0": "libxkbcommon0", + "libXrandr.so.2": "libxrandr2", + "libgtk-4.so.1": "libgtk-4-1" + } + } +}; +deps["ubuntu20.04-arm64"] = { + tools: [...deps["ubuntu20.04-x64"].tools], + chromium: [...deps["ubuntu20.04-x64"].chromium], + firefox: [ + ...deps["ubuntu20.04-x64"].firefox + ], + webkit: [ + ...deps["ubuntu20.04-x64"].webkit + ], + lib2package: { + ...deps["ubuntu20.04-x64"].lib2package + } +}; +deps["ubuntu22.04-arm64"] = { + tools: [...deps["ubuntu22.04-x64"].tools], + chromium: [...deps["ubuntu22.04-x64"].chromium], + firefox: [ + ...deps["ubuntu22.04-x64"].firefox + ], + webkit: [ + ...deps["ubuntu22.04-x64"].webkit + ], + lib2package: { + ...deps["ubuntu22.04-x64"].lib2package + } +}; +deps["ubuntu24.04-arm64"] = { + tools: [...deps["ubuntu24.04-x64"].tools], + chromium: [...deps["ubuntu24.04-x64"].chromium], + firefox: [ + ...deps["ubuntu24.04-x64"].firefox + ], + webkit: [ + ...deps["ubuntu24.04-x64"].webkit + ], + lib2package: { + ...deps["ubuntu24.04-x64"].lib2package + } +}; +deps["debian11-arm64"] = { + tools: [...deps["debian11-x64"].tools], + chromium: [...deps["debian11-x64"].chromium], + firefox: [ + ...deps["debian11-x64"].firefox + ], + webkit: [ + ...deps["debian11-x64"].webkit + ], + lib2package: { + ...deps["debian11-x64"].lib2package + } +}; +deps["debian12-arm64"] = { + tools: [...deps["debian12-x64"].tools], + chromium: [...deps["debian12-x64"].chromium], + firefox: [ + ...deps["debian12-x64"].firefox + ], + webkit: [ + ...deps["debian12-x64"].webkit + ], + lib2package: { + ...deps["debian12-x64"].lib2package + } +}; +function wrapInASCIIBox(text, padding = 0) { + const lines = text.split("\n"); + const maxLength = Math.max(...lines.map((line) => line.length)); + return [ + "╔" + "═".repeat(maxLength + padding * 2) + "╗", + ...lines.map((line) => "║" + " ".repeat(padding) + line + " ".repeat(maxLength - line.length + padding) + "║"), + "╚" + "═".repeat(maxLength + padding * 2) + "╝" + ].join("\n"); +} +function calculatePlatform() { + if (define_process_env_default.PLAYWRIGHT_HOST_PLATFORM_OVERRIDE) { + return { + hostPlatform: define_process_env_default.PLAYWRIGHT_HOST_PLATFORM_OVERRIDE, + isOfficiallySupportedPlatform: false + }; + } + const platform = os.platform(); + if (platform === "darwin") { + const ver = os.release().split(".").map((a) => parseInt(a, 10)); + let macVersion = ""; + if (ver[0] < 18) { + macVersion = "mac10.13"; + } else if (ver[0] === 18) { + macVersion = "mac10.14"; + } else if (ver[0] === 19) { + macVersion = "mac10.15"; + } else { + const LAST_STABLE_MACOS_MAJOR_VERSION = 15; + macVersion = "mac" + Math.min(ver[0] - 9, LAST_STABLE_MACOS_MAJOR_VERSION); + if (os.cpus().some((cpu) => cpu.model.includes("Apple"))) + macVersion += "-arm64"; + } + return { hostPlatform: macVersion, isOfficiallySupportedPlatform: true }; + } + if (platform === "linux") { + if (!["x64", "arm64"].includes(os.arch())) + return { hostPlatform: "", isOfficiallySupportedPlatform: false }; + const archSuffix = "-" + os.arch(); + const distroInfo = getLinuxDistributionInfoSync(); + if ((distroInfo == null ? void 0 : distroInfo.id) === "ubuntu" || (distroInfo == null ? void 0 : distroInfo.id) === "pop" || (distroInfo == null ? void 0 : distroInfo.id) === "neon" || (distroInfo == null ? void 0 : distroInfo.id) === "tuxedo") { + const isUbuntu = (distroInfo == null ? void 0 : distroInfo.id) === "ubuntu"; + const version2 = distroInfo == null ? void 0 : distroInfo.version; + const major = parseInt(distroInfo.version, 10); + if (major < 20) + return { hostPlatform: "ubuntu18.04" + archSuffix, isOfficiallySupportedPlatform: false }; + if (major < 22) + return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version2 === "20.04" }; + if (major < 24) + return { hostPlatform: "ubuntu22.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version2 === "22.04" }; + if (major < 26) + return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version2 === "24.04" }; + return { hostPlatform: "ubuntu" + distroInfo.version + archSuffix, isOfficiallySupportedPlatform: false }; + } + if ((distroInfo == null ? void 0 : distroInfo.id) === "linuxmint") { + const mintMajor = parseInt(distroInfo.version, 10); + if (mintMajor <= 20) + return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: false }; + if (mintMajor === 21) + return { hostPlatform: "ubuntu22.04" + archSuffix, isOfficiallySupportedPlatform: false }; + return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: false }; + } + if ((distroInfo == null ? void 0 : distroInfo.id) === "debian" || (distroInfo == null ? void 0 : distroInfo.id) === "raspbian") { + const isOfficiallySupportedPlatform2 = (distroInfo == null ? void 0 : distroInfo.id) === "debian"; + if ((distroInfo == null ? void 0 : distroInfo.version) === "11") + return { hostPlatform: "debian11" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 }; + if ((distroInfo == null ? void 0 : distroInfo.version) === "12") + return { hostPlatform: "debian12" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 }; + if ((distroInfo == null ? void 0 : distroInfo.version) === "") + return { hostPlatform: "debian12" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 }; + } + return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: false }; + } + if (platform === "win32") + return { hostPlatform: "win64", isOfficiallySupportedPlatform: true }; + return { hostPlatform: "", isOfficiallySupportedPlatform: false }; +} +const { hostPlatform, isOfficiallySupportedPlatform } = calculatePlatform(); +function spawnAsync(cmd, args, options2 = {}) { + const process2 = spawn(cmd, args, Object.assign({ windowsHide: true }, options2)); + return new Promise((resolve) => { + let stdout = ""; + let stderr = ""; + if (process2.stdout) + process2.stdout.on("data", (data2) => stdout += data2.toString()); + if (process2.stderr) + process2.stderr.on("data", (data2) => stderr += data2.toString()); + process2.on("close", (code) => resolve({ stdout, stderr, code })); + process2.on("error", (error2) => resolve({ stdout, stderr, code: 0, error: error2 })); + }); +} +const BIN_DIRECTORY = path.join("playwright/packages/playwright-core/src/server/registry", "..", "..", "..", "bin"); +const languageBindingVersion = define_process_env_default.PW_CLI_DISPLAY_VERSION || require$$0$1.version; +const dockerVersionFilePath = "/ms-playwright/.docker-info"; +function dockerVersion(dockerImageNameTemplate) { + return { + driverVersion: languageBindingVersion, + dockerImageName: dockerImageNameTemplate.replace("%version%", languageBindingVersion) + }; +} +function readDockerVersionSync() { + try { + const data2 = JSON.parse(fs.readFileSync(dockerVersionFilePath, "utf8")); + return { + ...data2, + dockerImageNameTemplate: data2.dockerImageName.replace(data2.driverVersion, "%version%") + }; + } catch (e) { + return null; + } +} +const checkExecutable = (filePath) => { + if (process.platform === "win32") + return filePath.endsWith(".exe"); + return fs.promises.access(filePath, fs.constants.X_OK).then(() => true).catch(() => false); +}; +function isSupportedWindowsVersion() { + if (os.platform() !== "win32" || os.arch() !== "x64") + return false; + const [major, minor] = os.release().split(".").map((token) => parseInt(token, 10)); + return major > 6 || major === 6 && minor > 1; +} +async function installDependenciesWindows(targets, dryRun) { + if (targets.has("chromium")) { + const command2 = "powershell.exe"; + const args = ["-ExecutionPolicy", "Bypass", "-File", path.join(BIN_DIRECTORY, "install_media_pack.ps1")]; + if (dryRun) { + console.log(`${command2} ${quoteProcessArgs(args).join(" ")}`); + return; + } + const { code } = await spawnAsync(command2, args, { cwd: BIN_DIRECTORY, stdio: "inherit" }); + if (code !== 0) + throw new Error("Failed to install windows dependencies!"); + } +} +async function installDependenciesLinux(targets, dryRun) { + const libraries = []; + const platform = hostPlatform; + if (!isOfficiallySupportedPlatform) + console.warn(`BEWARE: your OS is not officially supported by Playwright; installing dependencies for ${platform} as a fallback.`); + for (const target of targets) { + const info = deps[platform]; + if (!info) { + console.warn(`Cannot install dependencies for ${platform} with Playwright ${getPlaywrightVersion()}!`); + return; + } + libraries.push(...info[target]); + } + const uniqueLibraries = Array.from(new Set(libraries)); + if (!dryRun) + console.log(`Installing dependencies...`); + const commands = []; + commands.push("apt-get update"); + commands.push([ + "apt-get", + "install", + "-y", + "--no-install-recommends", + ...uniqueLibraries + ].join(" ")); + const { command: command2, args, elevatedPermissions } = await transformCommandsForRoot(commands); + if (dryRun) { + console.log(`${command2} ${quoteProcessArgs(args).join(" ")}`); + return; + } + if (elevatedPermissions) + console.log("Switching to root user to install dependencies..."); + const child = spawn(); + await new Promise((resolve, reject) => { + child.on("exit", (code) => code === 0 ? resolve() : reject(new Error(`Installation process exited with code: ${code}`))); + child.on("error", reject); + }); +} +async function validateDependenciesWindows(sdkLanguage, windowsExeAndDllDirectories) { + const directoryPaths = windowsExeAndDllDirectories; + const lddPaths = []; + for (const directoryPath of directoryPaths) + lddPaths.push(...await executablesOrSharedLibraries(directoryPath)); + const allMissingDeps = await Promise.all(lddPaths.map((lddPath) => missingFileDependenciesWindows(sdkLanguage, lddPath))); + const missingDeps = /* @__PURE__ */ new Set(); + for (const deps2 of allMissingDeps) { + for (const dep of deps2) + missingDeps.add(dep); + } + if (!missingDeps.size) + return; + let isCrtMissing = false; + let isMediaFoundationMissing = false; + for (const dep of missingDeps) { + if (dep.startsWith("api-ms-win-crt") || dep === "vcruntime140.dll" || dep === "vcruntime140_1.dll" || dep === "msvcp140.dll") + isCrtMissing = true; + else if (dep === "mf.dll" || dep === "mfplat.dll" || dep === "msmpeg2vdec.dll" || dep === "evr.dll" || dep === "avrt.dll") + isMediaFoundationMissing = true; + } + const details = []; + if (isCrtMissing) { + details.push( + `Some of the Universal C Runtime files cannot be found on the system. You can fix`, + `that by installing Microsoft Visual C++ Redistributable for Visual Studio from:`, + `https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads`, + `` + ); + } + if (isMediaFoundationMissing) { + details.push( + `Some of the Media Foundation files cannot be found on the system. If you are`, + `on Windows Server try fixing this by running the following command in PowerShell`, + `as Administrator:`, + ``, + ` Install-WindowsFeature Server-Media-Foundation`, + ``, + `For Windows N editions visit:`, + `https://support.microsoft.com/en-us/help/3145500/media-feature-pack-list-for-windows-n-editions`, + `` + ); + } + details.push( + `Full list of missing libraries:`, + ` ${[...missingDeps].join("\n ")}`, + `` + ); + const message = `Host system is missing dependencies! + +${details.join("\n")}`; + if (isSupportedWindowsVersion()) { + throw new Error(message); + } else { + console.warn(`WARNING: running on unsupported windows version!`); + console.warn(message); + } +} +async function validateDependenciesLinux(sdkLanguage, linuxLddDirectories, dlOpenLibraries) { + var _a2, _b2; + const directoryPaths = linuxLddDirectories; + const lddPaths = []; + for (const directoryPath of directoryPaths) + lddPaths.push(...await executablesOrSharedLibraries(directoryPath)); + const missingDepsPerFile = await Promise.all(lddPaths.map((lddPath) => missingFileDependencies(lddPath, directoryPaths))); + const missingDeps = /* @__PURE__ */ new Set(); + for (const deps2 of missingDepsPerFile) { + for (const dep of deps2) + missingDeps.add(dep); + } + for (const dep of await missingDLOPENLibraries(dlOpenLibraries)) + missingDeps.add(dep); + if (!missingDeps.size) + return; + const allMissingDeps = new Set(missingDeps); + const missingPackages = /* @__PURE__ */ new Set(); + const libraryToPackageNameMapping = deps[hostPlatform] ? { + ...((_a2 = deps[hostPlatform]) == null ? void 0 : _a2.lib2package) || {}, + ...MANUAL_LIBRARY_TO_PACKAGE_NAME_UBUNTU + } : {}; + for (const missingDep of missingDeps) { + const packageName = libraryToPackageNameMapping[missingDep]; + if (packageName) { + missingPackages.add(packageName); + missingDeps.delete(missingDep); + } + } + const maybeSudo = ((_b2 = process.getuid) == null ? void 0 : _b2.call(process)) && os.platform() !== "win32" ? "sudo " : ""; + const dockerInfo = readDockerVersionSync(); + const errorLines = [ + `Host system is missing dependencies to run browsers.` + ]; + if (dockerInfo && !dockerInfo.driverVersion.startsWith(getPlaywrightVersion( + true + /* majorMinorOnly */ + ) + ".")) { + const pwVersion = getPlaywrightVersion(); + const requiredDockerImage = dockerInfo.dockerImageName.replace(dockerInfo.driverVersion, pwVersion); + errorLines.push(...[ + `This is most likely due to Docker image version not matching Playwright version:`, + `- Playwright : ${pwVersion}`, + `- Docker image: ${dockerInfo.driverVersion}`, + ``, + `Either:`, + `- (recommended) use Docker image "${requiredDockerImage}"`, + `- (alternative 1) run the following command inside Docker to install missing dependencies:`, + ``, + ` ${maybeSudo}${buildPlaywrightCLICommand(sdkLanguage, "install-deps")}`, + ``, + `- (alternative 2) use apt inside Docker:`, + ``, + ` ${maybeSudo}apt-get install ${[...missingPackages].join("\\\n ")}`, + ``, + `<3 Playwright Team` + ]); + } else if (missingPackages.size && !missingDeps.size) { + errorLines.push(...[ + `Please install them with the following command:`, + ``, + ` ${maybeSudo}${buildPlaywrightCLICommand(sdkLanguage, "install-deps")}`, + ``, + `Alternatively, use apt:`, + ` ${maybeSudo}apt-get install ${[...missingPackages].join("\\\n ")}`, + ``, + `<3 Playwright Team` + ]); + } else { + errorLines.push(...[ + `Missing libraries:`, + ...[...allMissingDeps].map((dep) => " " + dep) + ]); + } + throw new Error("\n" + wrapInASCIIBox(errorLines.join("\n"), 1)); +} +function isSharedLib(basename) { + switch (os.platform()) { + case "linux": + return basename.endsWith(".so") || basename.includes(".so."); + case "win32": + return basename.endsWith(".dll"); + default: + return false; + } +} +async function executablesOrSharedLibraries(directoryPath) { + if (!fs.existsSync(directoryPath)) + return []; + const allPaths = (await fs.promises.readdir(directoryPath)).map((file) => path.resolve(directoryPath, file)); + const allStats = await Promise.all(allPaths.map((aPath) => fs.promises.stat(aPath))); + const filePaths = allPaths.filter((aPath, index2) => allStats[index2].isFile()); + const executablersOrLibraries = (await Promise.all(filePaths.map(async (filePath) => { + const basename = path.basename(filePath).toLowerCase(); + if (isSharedLib(basename)) + return filePath; + if (await checkExecutable(filePath)) + return filePath; + return false; + }))).filter(Boolean); + return executablersOrLibraries; +} +async function missingFileDependenciesWindows(sdkLanguage, filePath) { + const executable = registry.findExecutable("winldd").executablePathOrDie(sdkLanguage); + const dirname = path.dirname(filePath); + const { stdout, code } = await spawnAsync(executable, [filePath], { + cwd: dirname, + env: { + ...define_process_env_default, + LD_LIBRARY_PATH: define_process_env_default.LD_LIBRARY_PATH ? `${define_process_env_default.LD_LIBRARY_PATH}:${dirname}` : dirname + } + }); + if (code !== 0) + return []; + const missingDeps = stdout.split("\n").map((line) => line.trim()).filter((line) => line.endsWith("not found") && line.includes("=>")).map((line) => line.split("=>")[0].trim().toLowerCase()); + return missingDeps; +} +async function missingFileDependencies(filePath, extraLDPaths) { + const dirname = path.dirname(filePath); + let LD_LIBRARY_PATH = extraLDPaths.join(":"); + if (define_process_env_default.LD_LIBRARY_PATH) + LD_LIBRARY_PATH = `${define_process_env_default.LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}`; + const { stdout, code } = await spawnAsync("ldd", [filePath], { + cwd: dirname, + env: { + ...define_process_env_default, + LD_LIBRARY_PATH + } + }); + if (code !== 0) + return []; + const missingDeps = stdout.split("\n").map((line) => line.trim()).filter((line) => line.endsWith("not found") && line.includes("=>")).map((line) => line.split("=>")[0].trim()); + return missingDeps; +} +async function missingDLOPENLibraries(libraries) { + if (!libraries.length) + return []; + const { stdout, code, error: error2 } = await spawnAsync("/sbin/ldconfig", ["-p"], {}); + if (code !== 0 || error2) + return []; + const isLibraryAvailable = (library) => stdout.toLowerCase().includes(library.toLowerCase()); + return libraries.filter((library) => !isLibraryAvailable(library)); +} +const MANUAL_LIBRARY_TO_PACKAGE_NAME_UBUNTU = { + // libgstlibav.so (the only actual library provided by gstreamer1.0-libav) is not + // in the ldconfig cache, so we detect the actual library required for playing h.264 + // and if it's missing recommend installing missing gstreamer lib. + // gstreamer1.0-libav -> libavcodec57 -> libx264-152 + "libx264.so": "gstreamer1.0-libav" +}; +function quoteProcessArgs(args) { + return args.map((arg) => { + if (arg.includes(" ")) + return `"${arg}"`; + return arg; + }); +} +async function transformCommandsForRoot(commands) { + var _a2; + const isRoot = ((_a2 = process.getuid) == null ? void 0 : _a2.call(process)) === 0; + if (isRoot) + return { command: "sh", args: ["-c", `${commands.join("&& ")}`], elevatedPermissions: false }; + const sudoExists = await spawnAsync("which", ["sudo"]); + if (sudoExists.code === 0) + return { command: "sudo", args: ["--", "sh", "-c", `${commands.join("&& ")}`], elevatedPermissions: true }; + return { command: "su", args: ["root", "-c", `${commands.join("&& ")}`], elevatedPermissions: true }; +} +function assert(value, message) { + if (!value) + throw new Error(message || "Assertion error"); +} +function headersObjectToArray(headers, separator, setCookieSeparator) { + if (!setCookieSeparator) + setCookieSeparator = separator; + const result = []; + for (const name in headers) { + const values = headers[name]; + if (values === void 0) + continue; + if (separator) { + const sep = name.toLowerCase() === "set-cookie" ? setCookieSeparator : separator; + for (const value of values.split(sep)) + result.push({ name, value: value.trim() }); + } else { + result.push({ name, value: values }); + } + } + return result; +} +function headersArrayToObject(headers, lowerCase) { + const result = {}; + for (const { name, value } of headers) + result[lowerCase ? name.toLowerCase() : name] = value; + return result; +} +const between = function(num, first, last) { + return num >= first && num <= last; +}; +function digit(code) { + return between(code, 48, 57); +} +function hexdigit(code) { + return digit(code) || between(code, 65, 70) || between(code, 97, 102); +} +function uppercaseletter(code) { + return between(code, 65, 90); +} +function lowercaseletter(code) { + return between(code, 97, 122); +} +function letter(code) { + return uppercaseletter(code) || lowercaseletter(code); +} +function nonascii(code) { + return code >= 128; +} +function namestartchar(code) { + return letter(code) || nonascii(code) || code === 95; +} +function namechar(code) { + return namestartchar(code) || digit(code) || code === 45; +} +function nonprintable(code) { + return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127; +} +function newline(code) { + return code === 10; +} +function whitespace(code) { + return newline(code) || code === 9 || code === 32; +} +const maximumallowedcodepoint = 1114111; +class InvalidCharacterError extends Error { + constructor(message) { + super(message); + this.name = "InvalidCharacterError"; + } +} +function preprocess(str) { + const codepoints = []; + for (let i = 0; i < str.length; i++) { + let code = str.charCodeAt(i); + if (code === 13 && str.charCodeAt(i + 1) === 10) { + code = 10; + i++; + } + if (code === 13 || code === 12) + code = 10; + if (code === 0) + code = 65533; + if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) { + const lead = code - 55296; + const trail = str.charCodeAt(i + 1) - 56320; + code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail; + i++; + } + codepoints.push(code); + } + return codepoints; +} +function stringFromCode(code) { + if (code <= 65535) + return String.fromCharCode(code); + code -= Math.pow(2, 16); + const lead = Math.floor(code / Math.pow(2, 10)) + 55296; + const trail = code % Math.pow(2, 10) + 56320; + return String.fromCharCode(lead) + String.fromCharCode(trail); +} +function tokenize2(str1) { + const str = preprocess(str1); + let i = -1; + const tokens = []; + let code; + const codepoint = function(i2) { + if (i2 >= str.length) + return -1; + return str[i2]; + }; + const next = function(num) { + if (num === void 0) + num = 1; + if (num > 3) + throw "Spec Error: no more than three codepoints of lookahead."; + return codepoint(i + num); + }; + const consume = function(num) { + if (num === void 0) + num = 1; + i += num; + code = codepoint(i); + return true; + }; + const reconsume = function() { + i -= 1; + return true; + }; + const eof = function(codepoint2) { + if (codepoint2 === void 0) + codepoint2 = code; + return codepoint2 === -1; + }; + const consumeAToken = function() { + consumeComments(); + consume(); + if (whitespace(code)) { + while (whitespace(next())) + consume(); + return new WhitespaceToken(); + } else if (code === 34) { + return consumeAStringToken(); + } else if (code === 35) { + if (namechar(next()) || areAValidEscape(next(1), next(2))) { + const token = new HashToken(""); + if (wouldStartAnIdentifier(next(1), next(2), next(3))) + token.type = "id"; + token.value = consumeAName(); + return token; + } else { + return new DelimToken(code); + } + } else if (code === 36) { + if (next() === 61) { + consume(); + return new SuffixMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 39) { + return consumeAStringToken(); + } else if (code === 40) { + return new OpenParenToken(); + } else if (code === 41) { + return new CloseParenToken(); + } else if (code === 42) { + if (next() === 61) { + consume(); + return new SubstringMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 43) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else { + return new DelimToken(code); + } + } else if (code === 44) { + return new CommaToken(); + } else if (code === 45) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else if (next(1) === 45 && next(2) === 62) { + consume(2); + return new CDCToken(); + } else if (startsWithAnIdentifier()) { + reconsume(); + return consumeAnIdentlikeToken(); + } else { + return new DelimToken(code); + } + } else if (code === 46) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else { + return new DelimToken(code); + } + } else if (code === 58) { + return new ColonToken(); + } else if (code === 59) { + return new SemicolonToken(); + } else if (code === 60) { + if (next(1) === 33 && next(2) === 45 && next(3) === 45) { + consume(3); + return new CDOToken(); + } else { + return new DelimToken(code); + } + } else if (code === 64) { + if (wouldStartAnIdentifier(next(1), next(2), next(3))) + return new AtKeywordToken(consumeAName()); + else + return new DelimToken(code); + } else if (code === 91) { + return new OpenSquareToken(); + } else if (code === 92) { + if (startsWithAValidEscape()) { + reconsume(); + return consumeAnIdentlikeToken(); + } else { + return new DelimToken(code); + } + } else if (code === 93) { + return new CloseSquareToken(); + } else if (code === 94) { + if (next() === 61) { + consume(); + return new PrefixMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 123) { + return new OpenCurlyToken(); + } else if (code === 124) { + if (next() === 61) { + consume(); + return new DashMatchToken(); + } else if (next() === 124) { + consume(); + return new ColumnToken(); + } else { + return new DelimToken(code); + } + } else if (code === 125) { + return new CloseCurlyToken(); + } else if (code === 126) { + if (next() === 61) { + consume(); + return new IncludeMatchToken(); + } else { + return new DelimToken(code); + } + } else if (digit(code)) { + reconsume(); + return consumeANumericToken(); + } else if (namestartchar(code)) { + reconsume(); + return consumeAnIdentlikeToken(); + } else if (eof()) { + return new EOFToken(); + } else { + return new DelimToken(code); + } + }; + const consumeComments = function() { + while (next(1) === 47 && next(2) === 42) { + consume(2); + while (true) { + consume(); + if (code === 42 && next() === 47) { + consume(); + break; + } else if (eof()) { + return; + } + } + } + }; + const consumeANumericToken = function() { + const num = consumeANumber(); + if (wouldStartAnIdentifier(next(1), next(2), next(3))) { + const token = new DimensionToken(); + token.value = num.value; + token.repr = num.repr; + token.type = num.type; + token.unit = consumeAName(); + return token; + } else if (next() === 37) { + consume(); + const token = new PercentageToken(); + token.value = num.value; + token.repr = num.repr; + return token; + } else { + const token = new NumberToken(); + token.value = num.value; + token.repr = num.repr; + token.type = num.type; + return token; + } + }; + const consumeAnIdentlikeToken = function() { + const str2 = consumeAName(); + if (str2.toLowerCase() === "url" && next() === 40) { + consume(); + while (whitespace(next(1)) && whitespace(next(2))) + consume(); + if (next() === 34 || next() === 39) + return new FunctionToken(str2); + else if (whitespace(next()) && (next(2) === 34 || next(2) === 39)) + return new FunctionToken(str2); + else + return consumeAURLToken(); + } else if (next() === 40) { + consume(); + return new FunctionToken(str2); + } else { + return new IdentToken(str2); + } + }; + const consumeAStringToken = function(endingCodePoint) { + if (endingCodePoint === void 0) + endingCodePoint = code; + let string2 = ""; + while (consume()) { + if (code === endingCodePoint || eof()) { + return new StringToken(string2); + } else if (newline(code)) { + reconsume(); + return new BadStringToken(); + } else if (code === 92) { + if (eof(next())) + ; + else if (newline(next())) + consume(); + else + string2 += stringFromCode(consumeEscape()); + } else { + string2 += stringFromCode(code); + } + } + throw new Error("Internal error"); + }; + const consumeAURLToken = function() { + const token = new URLToken(""); + while (whitespace(next())) + consume(); + if (eof(next())) + return token; + while (consume()) { + if (code === 41 || eof()) { + return token; + } else if (whitespace(code)) { + while (whitespace(next())) + consume(); + if (next() === 41 || eof(next())) { + consume(); + return token; + } else { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } + } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } else if (code === 92) { + if (startsWithAValidEscape()) { + token.value += stringFromCode(consumeEscape()); + } else { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } + } else { + token.value += stringFromCode(code); + } + } + throw new Error("Internal error"); + }; + const consumeEscape = function() { + consume(); + if (hexdigit(code)) { + const digits = [code]; + for (let total = 0; total < 5; total++) { + if (hexdigit(next())) { + consume(); + digits.push(code); + } else { + break; + } + } + if (whitespace(next())) + consume(); + let value = parseInt(digits.map(function(x) { + return String.fromCharCode(x); + }).join(""), 16); + if (value > maximumallowedcodepoint) + value = 65533; + return value; + } else if (eof()) { + return 65533; + } else { + return code; + } + }; + const areAValidEscape = function(c1, c2) { + if (c1 !== 92) + return false; + if (newline(c2)) + return false; + return true; + }; + const startsWithAValidEscape = function() { + return areAValidEscape(code, next()); + }; + const wouldStartAnIdentifier = function(c1, c2, c3) { + if (c1 === 45) + return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3); + else if (namestartchar(c1)) + return true; + else if (c1 === 92) + return areAValidEscape(c1, c2); + else + return false; + }; + const startsWithAnIdentifier = function() { + return wouldStartAnIdentifier(code, next(1), next(2)); + }; + const wouldStartANumber = function(c1, c2, c3) { + if (c1 === 43 || c1 === 45) { + if (digit(c2)) + return true; + if (c2 === 46 && digit(c3)) + return true; + return false; + } else if (c1 === 46) { + if (digit(c2)) + return true; + return false; + } else if (digit(c1)) { + return true; + } else { + return false; + } + }; + const startsWithANumber = function() { + return wouldStartANumber(code, next(1), next(2)); + }; + const consumeAName = function() { + let result = ""; + while (consume()) { + if (namechar(code)) { + result += stringFromCode(code); + } else if (startsWithAValidEscape()) { + result += stringFromCode(consumeEscape()); + } else { + reconsume(); + return result; + } + } + throw new Error("Internal parse error"); + }; + const consumeANumber = function() { + let repr = ""; + let type2 = "integer"; + if (next() === 43 || next() === 45) { + consume(); + repr += stringFromCode(code); + } + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + if (next(1) === 46 && digit(next(2))) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type2 = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } + const c1 = next(1), c2 = next(2), c3 = next(3); + if ((c1 === 69 || c1 === 101) && digit(c2)) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type2 = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type2 = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } + const value = convertAStringToANumber(repr); + return { type: type2, value, repr }; + }; + const convertAStringToANumber = function(string2) { + return +string2; + }; + const consumeTheRemnantsOfABadURL = function() { + while (consume()) { + if (code === 41 || eof()) { + return; + } else if (startsWithAValidEscape()) { + consumeEscape(); + } else ; + } + }; + let iterationCount = 0; + while (!eof(next())) { + tokens.push(consumeAToken()); + iterationCount++; + if (iterationCount > str.length * 2) + throw new Error("I'm infinite-looping!"); + } + return tokens; +} +class CSSParserToken { + constructor() { + this.tokenType = ""; + } + toJSON() { + return { token: this.tokenType }; + } + toString() { + return this.tokenType; + } + toSource() { + return "" + this; + } +} +class BadStringToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "BADSTRING"; + } +} +class BadURLToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "BADURL"; + } +} +class WhitespaceToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "WHITESPACE"; + } + toString() { + return "WS"; + } + toSource() { + return " "; + } +} +class CDOToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "CDO"; + } + toSource() { + return ""; + } +} +class ColonToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ":"; + } +} +class SemicolonToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ";"; + } +} +class CommaToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ","; + } +} +class GroupingToken extends CSSParserToken { + constructor() { + super(...arguments); + this.value = ""; + this.mirror = ""; + } +} +class OpenCurlyToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "{"; + this.value = "{"; + this.mirror = "}"; + } +} +class CloseCurlyToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "}"; + this.value = "}"; + this.mirror = "{"; + } +} +class OpenSquareToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "["; + this.value = "["; + this.mirror = "]"; + } +} +class CloseSquareToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "]"; + this.value = "]"; + this.mirror = "["; + } +} +class OpenParenToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "("; + this.value = "("; + this.mirror = ")"; + } +} +class CloseParenToken extends GroupingToken { + constructor() { + super(); + this.tokenType = ")"; + this.value = ")"; + this.mirror = "("; + } +} +class IncludeMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "~="; + } +} +class DashMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "|="; + } +} +class PrefixMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "^="; + } +} +class SuffixMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "$="; + } +} +class SubstringMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "*="; + } +} +class ColumnToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "||"; + } +} +class EOFToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "EOF"; + } + toSource() { + return ""; + } +} +class DelimToken extends CSSParserToken { + constructor(code) { + super(); + this.tokenType = "DELIM"; + this.value = ""; + this.value = stringFromCode(code); + } + toString() { + return "DELIM(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + return json; + } + toSource() { + if (this.value === "\\") + return "\\\n"; + else + return this.value; + } +} +class StringValuedToken extends CSSParserToken { + constructor() { + super(...arguments); + this.value = ""; + } + ASCIIMatch(str) { + return this.value.toLowerCase() === str.toLowerCase(); + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + return json; + } +} +class IdentToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "IDENT"; + this.value = val; + } + toString() { + return "IDENT(" + this.value + ")"; + } + toSource() { + return escapeIdent(this.value); + } +} +class FunctionToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "FUNCTION"; + this.value = val; + this.mirror = ")"; + } + toString() { + return "FUNCTION(" + this.value + ")"; + } + toSource() { + return escapeIdent(this.value) + "("; + } +} +class AtKeywordToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "AT-KEYWORD"; + this.value = val; + } + toString() { + return "AT(" + this.value + ")"; + } + toSource() { + return "@" + escapeIdent(this.value); + } +} +class HashToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "HASH"; + this.value = val; + this.type = "unrestricted"; + } + toString() { + return "HASH(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.type = this.type; + return json; + } + toSource() { + if (this.type === "id") + return "#" + escapeIdent(this.value); + else + return "#" + escapeHash(this.value); + } +} +class StringToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "STRING"; + this.value = val; + } + toString() { + return '"' + escapeString(this.value) + '"'; + } +} +class URLToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "URL"; + this.value = val; + } + toString() { + return "URL(" + this.value + ")"; + } + toSource() { + return 'url("' + escapeString(this.value) + '")'; + } +} +class NumberToken extends CSSParserToken { + constructor() { + super(); + this.tokenType = "NUMBER"; + this.type = "integer"; + this.repr = ""; + } + toString() { + if (this.type === "integer") + return "INT(" + this.value + ")"; + return "NUMBER(" + this.value + ")"; + } + toJSON() { + const json = super.toJSON(); + json.value = this.value; + json.type = this.type; + json.repr = this.repr; + return json; + } + toSource() { + return this.repr; + } +} +class PercentageToken extends CSSParserToken { + constructor() { + super(); + this.tokenType = "PERCENTAGE"; + this.repr = ""; + } + toString() { + return "PERCENTAGE(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.repr = this.repr; + return json; + } + toSource() { + return this.repr + "%"; + } +} +class DimensionToken extends CSSParserToken { + constructor() { + super(); + this.tokenType = "DIMENSION"; + this.type = "integer"; + this.repr = ""; + this.unit = ""; + } + toString() { + return "DIM(" + this.value + "," + this.unit + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.type = this.type; + json.repr = this.repr; + json.unit = this.unit; + return json; + } + toSource() { + const source2 = this.repr; + let unit = escapeIdent(this.unit); + if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) { + unit = "\\65 " + unit.slice(1, unit.length); + } + return source2 + unit; + } +} +function escapeIdent(string2) { + string2 = "" + string2; + let result = ""; + const firstcode = string2.charCodeAt(0); + for (let i = 0; i < string2.length; i++) { + const code = string2.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45) + result += "\\" + code.toString(16) + " "; + else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122)) + result += string2[i]; + else + result += "\\" + string2[i]; + } + return result; +} +function escapeHash(string2) { + string2 = "" + string2; + let result = ""; + for (let i = 0; i < string2.length; i++) { + const code = string2.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122)) + result += string2[i]; + else + result += "\\" + code.toString(16) + " "; + } + return result; +} +function escapeString(string2) { + string2 = "" + string2; + let result = ""; + for (let i = 0; i < string2.length; i++) { + const code = string2.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (between(code, 1, 31) || code === 127) + result += "\\" + code.toString(16) + " "; + else if (code === 34 || code === 92) + result += "\\" + string2[i]; + else + result += string2[i]; + } + return result; +} +class InvalidSelectorError extends Error { +} +function isInvalidSelectorError(error2) { + return error2 instanceof InvalidSelectorError; +} +function parseCSS(selector, customNames) { + let tokens; + try { + tokens = tokenize2(selector); + if (!(tokens[tokens.length - 1] instanceof EOFToken)) + tokens.push(new EOFToken()); + } catch (e) { + const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`; + const index2 = (e.stack || "").indexOf(e.message); + if (index2 !== -1) + e.stack = e.stack.substring(0, index2) + newMessage + e.stack.substring(index2 + e.message.length); + e.message = newMessage; + throw e; + } + const unsupportedToken = tokens.find((token) => { + return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings. + // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz } + // Or this way :xpath( {complex-xpath-goes-here("hello")} ) + token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings? + token instanceof URLToken || token instanceof PercentageToken; + }); + if (unsupportedToken) + throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + let pos = 0; + const names = /* @__PURE__ */ new Set(); + function unexpected() { + return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + } + function skipWhitespace() { + while (tokens[pos] instanceof WhitespaceToken) + pos++; + } + function isIdent(p = pos) { + return tokens[p] instanceof IdentToken; + } + function isString2(p = pos) { + return tokens[p] instanceof StringToken; + } + function isNumber(p = pos) { + return tokens[p] instanceof NumberToken; + } + function isComma(p = pos) { + return tokens[p] instanceof CommaToken; + } + function isOpenParen(p = pos) { + return tokens[p] instanceof OpenParenToken; + } + function isCloseParen(p = pos) { + return tokens[p] instanceof CloseParenToken; + } + function isFunction(p = pos) { + return tokens[p] instanceof FunctionToken; + } + function isStar(p = pos) { + return tokens[p] instanceof DelimToken && tokens[p].value === "*"; + } + function isEOF(p = pos) { + return tokens[p] instanceof EOFToken; + } + function isClauseCombinator(p = pos) { + return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value); + } + function isSelectorClauseEnd(p = pos) { + return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken; + } + function consumeFunctionArguments() { + const result2 = [consumeArgument()]; + while (true) { + skipWhitespace(); + if (!isComma()) + break; + pos++; + result2.push(consumeArgument()); + } + return result2; + } + function consumeArgument() { + skipWhitespace(); + if (isNumber()) + return tokens[pos++].value; + if (isString2()) + return tokens[pos++].value; + return consumeComplexSelector(); + } + function consumeComplexSelector() { + const result2 = { simples: [] }; + skipWhitespace(); + if (isClauseCombinator()) { + result2.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" }); + } else { + result2.simples.push({ selector: consumeSimpleSelector(), combinator: "" }); + } + while (true) { + skipWhitespace(); + if (isClauseCombinator()) { + result2.simples[result2.simples.length - 1].combinator = tokens[pos++].value; + skipWhitespace(); + } else if (isSelectorClauseEnd()) { + break; + } + result2.simples.push({ combinator: "", selector: consumeSimpleSelector() }); + } + return result2; + } + function consumeSimpleSelector() { + let rawCSSString = ""; + const functions = []; + while (!isSelectorClauseEnd()) { + if (isIdent() || isStar()) { + rawCSSString += tokens[pos++].toSource(); + } else if (tokens[pos] instanceof HashToken) { + rawCSSString += tokens[pos++].toSource(); + } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") { + pos++; + if (isIdent()) + rawCSSString += "." + tokens[pos++].toSource(); + else + throw unexpected(); + } else if (tokens[pos] instanceof ColonToken) { + pos++; + if (isIdent()) { + if (!customNames.has(tokens[pos].value.toLowerCase())) { + rawCSSString += ":" + tokens[pos++].toSource(); + } else { + const name = tokens[pos++].value.toLowerCase(); + functions.push({ name, args: [] }); + names.add(name); + } + } else if (isFunction()) { + const name = tokens[pos++].value.toLowerCase(); + if (!customNames.has(name)) { + rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`; + } else { + functions.push({ name, args: consumeFunctionArguments() }); + names.add(name); + } + skipWhitespace(); + if (!isCloseParen()) + throw unexpected(); + pos++; + } else { + throw unexpected(); + } + } else if (tokens[pos] instanceof OpenSquareToken) { + rawCSSString += "["; + pos++; + while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF()) + rawCSSString += tokens[pos++].toSource(); + if (!(tokens[pos] instanceof CloseSquareToken)) + throw unexpected(); + rawCSSString += "]"; + pos++; + } else { + throw unexpected(); + } + } + if (!rawCSSString && !functions.length) + throw unexpected(); + return { css: rawCSSString || void 0, functions }; + } + function consumeBuiltinFunctionArguments() { + let s = ""; + let balance = 1; + while (!isEOF()) { + if (isOpenParen() || isFunction()) + balance++; + if (isCloseParen()) + balance--; + if (!balance) + break; + s += tokens[pos++].toSource(); + } + return s; + } + const result = consumeFunctionArguments(); + if (!isEOF()) + throw unexpected(); + if (result.some((arg) => typeof arg !== "object" || !("simples" in arg))) + throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + return { selector: result, names: Array.from(names) }; +} +const kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]); +const kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]); +const customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]); +function parseSelector(selector) { + const parsedStrings = parseSelectorString(selector); + const parts = []; + for (const part of parsedStrings.parts) { + if (part.name === "css" || part.name === "css:light") { + if (part.name === "css:light") + part.body = ":light(" + part.body + ")"; + const parsedCSS = parseCSS(part.body, customCSSNames); + parts.push({ + name: "css", + body: parsedCSS.selector, + source: part.body + }); + continue; + } + if (kNestedSelectorNames.has(part.name)) { + let innerSelector; + let distance; + try { + const unescaped = JSON.parse("[" + part.body + "]"); + if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string") + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + innerSelector = unescaped[0]; + if (unescaped.length === 2) { + if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name)) + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + distance = unescaped[1]; + } + } catch (e) { + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + } + const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } }; + const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame"); + const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1; + if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1))) + nested.body.parsed.parts.splice(0, lastFrameIndex + 1); + parts.push(nested); + continue; + } + parts.push({ ...part, source: part.body }); + } + if (kNestedSelectorNames.has(parts[0].name)) + throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`); + return { + capture: parsedStrings.capture, + parts + }; +} +function splitSelectorByFrame(selectorText) { + const selector = parseSelector(selectorText); + const result = []; + let chunk = { + parts: [] + }; + let chunkStartIndex = 0; + for (let i = 0; i < selector.parts.length; ++i) { + const part = selector.parts[i]; + if (part.name === "internal:control" && part.body === "enter-frame") { + if (!chunk.parts.length) + throw new InvalidSelectorError("Selector cannot start with entering frame, select the iframe first"); + result.push(chunk); + chunk = { parts: [] }; + chunkStartIndex = i + 1; + continue; + } + if (selector.capture === i) + chunk.capture = i - chunkStartIndex; + chunk.parts.push(part); + } + if (!chunk.parts.length) + throw new InvalidSelectorError(`Selector cannot end with entering frame, while parsing selector ${selectorText}`); + result.push(chunk); + if (typeof selector.capture === "number" && typeof result[result.length - 1].capture !== "number") + throw new InvalidSelectorError(`Can not capture the selector before diving into the frame. Only use * after the last frame has been selected`); + return result; +} +function selectorPartsEqual(list1, list2) { + return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 }); +} +function stringifySelector(selector, forceEngineName) { + if (typeof selector === "string") + return selector; + return selector.parts.map((p, i) => { + let includeEngine = true; + if (!forceEngineName && i !== selector.capture) { + if (p.name === "css") + includeEngine = false; + else if (p.name === "xpath" && p.source.startsWith("//") || p.source.startsWith("..")) + includeEngine = false; + } + const prefix = includeEngine ? p.name + "=" : ""; + return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`; + }).join(" >> "); +} +function visitAllSelectorParts(selector, visitor) { + const visit2 = (selector2, nested) => { + for (const part of selector2.parts) { + visitor(part, nested); + if (kNestedSelectorNames.has(part.name)) + visit2(part.body.parsed, true); + } + }; + visit2(selector, false); +} +function parseSelectorString(selector) { + let index2 = 0; + let quote2; + let start = 0; + const result = { parts: [] }; + const append = () => { + const part = selector.substring(start, index2).trim(); + const eqIndex = part.indexOf("="); + let name; + let body; + if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) { + name = part.substring(0, eqIndex).trim(); + body = part.substring(eqIndex + 1); + } else if (part.length > 1 && part[0] === '"' && part[part.length - 1] === '"') { + name = "text"; + body = part; + } else if (part.length > 1 && part[0] === "'" && part[part.length - 1] === "'") { + name = "text"; + body = part; + } else if (/^\(*\/\//.test(part) || part.startsWith("..")) { + name = "xpath"; + body = part; + } else { + name = "css"; + body = part; + } + let capture = false; + if (name[0] === "*") { + capture = true; + name = name.substring(1); + } + result.parts.push({ name, body }); + if (capture) { + if (result.capture !== void 0) + throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`); + result.capture = result.parts.length - 1; + } + }; + if (!selector.includes(">>")) { + index2 = selector.length; + append(); + return result; + } + const shouldIgnoreTextSelectorQuote = () => { + const prefix = selector.substring(start, index2); + const match = prefix.match(/^\s*text\s*=(.*)$/); + return !!match && !!match[1]; + }; + while (index2 < selector.length) { + const c = selector[index2]; + if (c === "\\" && index2 + 1 < selector.length) { + index2 += 2; + } else if (c === quote2) { + quote2 = void 0; + index2++; + } else if (!quote2 && (c === '"' || c === "'" || c === "`") && !shouldIgnoreTextSelectorQuote()) { + quote2 = c; + index2++; + } else if (!quote2 && c === ">" && selector[index2 + 1] === ">") { + append(); + index2 += 2; + start = index2; + } else { + index2++; + } + } + append(); + return result; +} +function parseAttributeSelector(selector, allowUnquotedStrings) { + let wp = 0; + let EOL = selector.length === 0; + const next = () => selector[wp] || ""; + const eat1 = () => { + const result2 = next(); + ++wp; + EOL = wp >= selector.length; + return result2; + }; + const syntaxError = (stage) => { + if (EOL) + throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \`${selector}\``); + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : "")); + }; + function skipSpaces() { + while (!EOL && /\s/.test(next())) + eat1(); + } + function isCSSNameChar(char) { + return char >= "€" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-"; + } + function readIdentifier() { + let result2 = ""; + skipSpaces(); + while (!EOL && isCSSNameChar(next())) + result2 += eat1(); + return result2; + } + function readQuotedString(quote2) { + let result2 = eat1(); + if (result2 !== quote2) + syntaxError("parsing quoted string"); + while (!EOL && next() !== quote2) { + if (next() === "\\") + eat1(); + result2 += eat1(); + } + if (next() !== quote2) + syntaxError("parsing quoted string"); + result2 += eat1(); + return result2; + } + function readRegularExpression() { + if (eat1() !== "/") + syntaxError("parsing regular expression"); + let source2 = ""; + let inClass = false; + while (!EOL) { + if (next() === "\\") { + source2 += eat1(); + if (EOL) + syntaxError("parsing regular expression"); + } else if (inClass && next() === "]") { + inClass = false; + } else if (!inClass && next() === "[") { + inClass = true; + } else if (!inClass && next() === "/") { + break; + } + source2 += eat1(); + } + if (eat1() !== "/") + syntaxError("parsing regular expression"); + let flags = ""; + while (!EOL && next().match(/[dgimsuy]/)) + flags += eat1(); + try { + return new RegExp(source2, flags); + } catch (e) { + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\`: ${e.message}`); + } + } + function readAttributeToken() { + let token = ""; + skipSpaces(); + if (next() === `'` || next() === `"`) + token = readQuotedString(next()).slice(1, -1); + else + token = readIdentifier(); + if (!token) + syntaxError("parsing property path"); + return token; + } + function readOperator() { + skipSpaces(); + let op = ""; + if (!EOL) + op += eat1(); + if (!EOL && op !== "=") + op += eat1(); + if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op)) + syntaxError("parsing operator"); + return op; + } + function readAttribute() { + eat1(); + const jsonPath = []; + jsonPath.push(readAttributeToken()); + skipSpaces(); + while (next() === ".") { + eat1(); + jsonPath.push(readAttributeToken()); + skipSpaces(); + } + if (next() === "]") { + eat1(); + return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false }; + } + const operator = readOperator(); + let value = void 0; + let caseSensitive = true; + skipSpaces(); + if (next() === "/") { + if (operator !== "=") + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with regular expression`); + value = readRegularExpression(); + } else if (next() === `'` || next() === `"`) { + value = readQuotedString(next()).slice(1, -1); + skipSpaces(); + if (next() === "i" || next() === "I") { + caseSensitive = false; + eat1(); + } else if (next() === "s" || next() === "S") { + caseSensitive = true; + eat1(); + } + } else { + value = ""; + while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === ".")) + value += eat1(); + if (value === "true") { + value = true; + } else if (value === "false") { + value = false; + } else ; + } + skipSpaces(); + if (next() !== "]") + syntaxError("parsing attribute value"); + eat1(); + if (operator !== "=" && typeof value !== "string") + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with non-string matching value - ${value}`); + return { name: jsonPath.join("."), jsonPath, op: operator, value, caseSensitive }; + } + const result = { + name: "", + attributes: [] + }; + result.name = readIdentifier(); + skipSpaces(); + while (next() === "[") { + result.attributes.push(readAttribute()); + skipSpaces(); + } + if (!EOL) + syntaxError(void 0); + if (!result.name && !result.attributes.length) + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - selector cannot be empty`); + return result; +} +function escapeWithQuotes(text, char = "'") { + const stringified = JSON.stringify(text); + const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\"/g, '"'); + if (char === "'") + return char + escapedText.replace(/[']/g, "\\'") + char; + if (char === '"') + return char + escapedText.replace(/["]/g, '\\"') + char; + if (char === "`") + return char + escapedText.replace(/[`]/g, "`") + char; + throw new Error("Invalid escape char"); +} +function isString(obj) { + return typeof obj === "string" || obj instanceof String; +} +function toTitleCase(name) { + return name.charAt(0).toUpperCase() + name.substring(1); +} +function toSnakeCase(name) { + return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase(); +} +function quoteCSSAttributeValue(text) { + return `"${text.replace(/["\\]/g, (char) => "\\" + char)}"`; +} +function normalizeEscapedRegexQuotes(source2) { + return source2.replace(/(^|[^\\])(\\\\)*\\(['"`])/g, "$1$2$3"); +} +function escapeRegexForSelector(re2) { + if (re2.unicode || re2.unicodeSets) + return String(re2); + return String(re2).replace(/(^|[^\\])(\\\\)*(["'`])/g, "$1$2\\$3").replace(/>>/g, "\\>\\>"); +} +function escapeForTextSelector(text, exact) { + if (typeof text !== "string") + return escapeRegexForSelector(text); + return `${JSON.stringify(text)}${exact ? "s" : "i"}`; +} +function escapeForAttributeSelector(value, exact) { + if (typeof value !== "string") + return escapeRegexForSelector(value); + return `"${value.replace(/\\/g, "\\\\").replace(/["]/g, '\\"')}"${exact ? "s" : "i"}`; +} +function trimString(input, cap, suffix = "") { + if (input.length <= cap) + return input; + const chars = [...input]; + if (chars.length > cap) + return chars.slice(0, cap - suffix.length).join("") + suffix; + return chars.join(""); +} +function trimStringWithEllipsis(input, cap) { + return trimString(input, cap, "…"); +} +const escaped = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }; +function escapeHTML(s) { + return s.replace(/[&<]/ug, (char) => escaped[char]); +} +function asLocator(lang, selector, isFrameLocator = false) { + return asLocators(lang, selector, isFrameLocator, 1)[0]; +} +function asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) { + try { + return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize); + } catch (e) { + return [selector]; + } +} +function innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) { + const parts = [...parsed.parts]; + const tokens = []; + let nextBase = isFrameLocator ? "frame-locator" : "page"; + for (let index2 = 0; index2 < parts.length; index2++) { + const part = parts[index2]; + const base2 = nextBase; + nextBase = "locator"; + if (part.name === "internal:describe") + continue; + if (part.name === "nth") { + if (part.body === "0") + tokens.push([factory.generateLocator(base2, "first", ""), factory.generateLocator(base2, "nth", "0")]); + else if (part.body === "-1") + tokens.push([factory.generateLocator(base2, "last", ""), factory.generateLocator(base2, "nth", "-1")]); + else + tokens.push([factory.generateLocator(base2, "nth", part.body)]); + continue; + } + if (part.name === "visible") { + tokens.push([factory.generateLocator(base2, "visible", part.body), factory.generateLocator(base2, "default", `visible=${part.body}`)]); + continue; + } + if (part.name === "internal:text") { + const { exact, text } = detectExact(part.body); + tokens.push([factory.generateLocator(base2, "text", text, { exact })]); + continue; + } + if (part.name === "internal:has-text") { + const { exact, text } = detectExact(part.body); + if (!exact) { + tokens.push([factory.generateLocator(base2, "has-text", text, { exact })]); + continue; + } + } + if (part.name === "internal:has-not-text") { + const { exact, text } = detectExact(part.body); + if (!exact) { + tokens.push([factory.generateLocator(base2, "has-not-text", text, { exact })]); + continue; + } + } + if (part.name === "internal:has") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base2, "has", inner))); + continue; + } + if (part.name === "internal:has-not") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base2, "hasNot", inner))); + continue; + } + if (part.name === "internal:and") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base2, "and", inner))); + continue; + } + if (part.name === "internal:or") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base2, "or", inner))); + continue; + } + if (part.name === "internal:chain") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base2, "chain", inner))); + continue; + } + if (part.name === "internal:label") { + const { exact, text } = detectExact(part.body); + tokens.push([factory.generateLocator(base2, "label", text, { exact })]); + continue; + } + if (part.name === "internal:role") { + const attrSelector = parseAttributeSelector(part.body); + const options2 = { attrs: [] }; + for (const attr of attrSelector.attributes) { + if (attr.name === "name") { + options2.exact = attr.caseSensitive; + options2.name = attr.value; + } else { + if (attr.name === "level" && typeof attr.value === "string") + attr.value = +attr.value; + options2.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value }); + } + } + tokens.push([factory.generateLocator(base2, "role", attrSelector.name, options2)]); + continue; + } + if (part.name === "internal:testid") { + const attrSelector = parseAttributeSelector(part.body); + const { value } = attrSelector.attributes[0]; + tokens.push([factory.generateLocator(base2, "test-id", value)]); + continue; + } + if (part.name === "internal:attr") { + const attrSelector = parseAttributeSelector(part.body); + const { name, value, caseSensitive } = attrSelector.attributes[0]; + const text = value; + const exact = !!caseSensitive; + if (name === "placeholder") { + tokens.push([factory.generateLocator(base2, "placeholder", text, { exact })]); + continue; + } + if (name === "alt") { + tokens.push([factory.generateLocator(base2, "alt", text, { exact })]); + continue; + } + if (name === "title") { + tokens.push([factory.generateLocator(base2, "title", text, { exact })]); + continue; + } + } + if (part.name === "internal:control" && part.body === "enter-frame") { + const lastTokens = tokens[tokens.length - 1]; + const lastPart = parts[index2 - 1]; + const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base2, "frame", "")])); + if (["xpath", "css"].includes(lastPart.name)) { + transformed.push( + factory.generateLocator(base2, "frame-locator", stringifySelector({ parts: [lastPart] })), + factory.generateLocator(base2, "frame-locator", stringifySelector({ parts: [lastPart] }, true)) + ); + } + lastTokens.splice(0, lastTokens.length, ...transformed); + nextBase = "frame-locator"; + continue; + } + const nextPart = parts[index2 + 1]; + const selectorPart = stringifySelector({ parts: [part] }); + const locatorPart = factory.generateLocator(base2, "default", selectorPart); + if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) { + const { exact, text } = detectExact(nextPart.body); + if (!exact) { + const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text, { exact }); + const options2 = {}; + if (nextPart.name === "internal:has-text") + options2.hasText = text; + else + options2.hasNotText = text; + const combinedPart = factory.generateLocator(base2, "default", selectorPart, options2); + tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]); + index2++; + continue; + } + } + let locatorPartWithEngine; + if (["xpath", "css"].includes(part.name)) { + const selectorPart2 = stringifySelector( + { parts: [part] }, + /* forceEngineName */ + true + ); + locatorPartWithEngine = factory.generateLocator(base2, "default", selectorPart2); + } + tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean)); + } + return combineTokens(factory, tokens, maxOutputSize); +} +function combineTokens(factory, tokens, maxOutputSize) { + const currentTokens = tokens.map(() => ""); + const result = []; + const visit2 = (index2) => { + if (index2 === tokens.length) { + result.push(factory.chainLocators(currentTokens)); + return result.length < maxOutputSize; + } + for (const taken of tokens[index2]) { + currentTokens[index2] = taken; + if (!visit2(index2 + 1)) + return false; + } + return true; + }; + visit2(0); + return result; +} +function detectExact(text) { + let exact = false; + const match = text.match(/^\/(.*)\/([igm]*)$/); + if (match) + return { text: new RegExp(match[1], match[2]) }; + if (text.endsWith('"')) { + text = JSON.parse(text); + exact = true; + } else if (text.endsWith('"s')) { + text = JSON.parse(text.substring(0, text.length - 1)); + exact = true; + } else if (text.endsWith('"i')) { + text = JSON.parse(text.substring(0, text.length - 1)); + exact = false; + } + return { exact, text }; +} +class JavaScriptLocatorFactory { + constructor(preferredQuote) { + this.preferredQuote = preferredQuote; + } + generateLocator(base2, kind, body, options2 = {}) { + switch (kind) { + case "default": + if (options2.hasText !== void 0) + return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options2.hasText)} })`; + if (options2.hasNotText !== void 0) + return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options2.hasNotText)} })`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frameLocator(${this.quote(body)})`; + case "frame": + return `contentFrame()`; + case "nth": + return `nth(${body})`; + case "first": + return `first()`; + case "last": + return `last()`; + case "visible": + return `filter({ visible: ${body === "true" ? "true" : "false"} })`; + case "role": + const attrs = []; + if (isRegExp$5(options2.name)) { + attrs.push(`name: ${this.regexToSourceString(options2.name)}`); + } else if (typeof options2.name === "string") { + attrs.push(`name: ${this.quote(options2.name)}`); + if (options2.exact) + attrs.push(`exact: true`); + } + for (const { name, value } of options2.attrs) + attrs.push(`${name}: ${typeof value === "string" ? this.quote(value) : value}`); + const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : ""; + return `getByRole(${this.quote(body)}${attrString})`; + case "has-text": + return `filter({ hasText: ${this.toHasText(body)} })`; + case "has-not-text": + return `filter({ hasNotText: ${this.toHasText(body)} })`; + case "has": + return `filter({ has: ${body} })`; + case "hasNot": + return `filter({ hasNot: ${body} })`; + case "and": + return `and(${body})`; + case "or": + return `or(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `getByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("getByText", body, !!options2.exact); + case "alt": + return this.toCallWithExact("getByAltText", body, !!options2.exact); + case "placeholder": + return this.toCallWithExact("getByPlaceholder", body, !!options2.exact); + case "label": + return this.toCallWithExact("getByLabel", body, !!options2.exact); + case "title": + return this.toCallWithExact("getByTitle", body, !!options2.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToSourceString(re2) { + return normalizeEscapedRegexQuotes(String(re2)); + } + toCallWithExact(method, body, exact) { + if (isRegExp$5(body)) + return `${method}(${this.regexToSourceString(body)})`; + return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp$5(body)) + return this.regexToSourceString(body); + return this.quote(body); + } + toTestIdValue(value) { + if (isRegExp$5(value)) + return this.regexToSourceString(value); + return this.quote(value); + } + quote(text) { + return escapeWithQuotes(text, this.preferredQuote ?? "'"); + } +} +class PythonLocatorFactory { + generateLocator(base2, kind, body, options2 = {}) { + switch (kind) { + case "default": + if (options2.hasText !== void 0) + return `locator(${this.quote(body)}, has_text=${this.toHasText(options2.hasText)})`; + if (options2.hasNotText !== void 0) + return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options2.hasNotText)})`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frame_locator(${this.quote(body)})`; + case "frame": + return `content_frame`; + case "nth": + return `nth(${body})`; + case "first": + return `first`; + case "last": + return `last`; + case "visible": + return `filter(visible=${body === "true" ? "True" : "False"})`; + case "role": + const attrs = []; + if (isRegExp$5(options2.name)) { + attrs.push(`name=${this.regexToString(options2.name)}`); + } else if (typeof options2.name === "string") { + attrs.push(`name=${this.quote(options2.name)}`); + if (options2.exact) + attrs.push(`exact=True`); + } + for (const { name, value } of options2.attrs) { + let valueString = typeof value === "string" ? this.quote(value) : value; + if (typeof value === "boolean") + valueString = value ? "True" : "False"; + attrs.push(`${toSnakeCase(name)}=${valueString}`); + } + const attrString = attrs.length ? `, ${attrs.join(", ")}` : ""; + return `get_by_role(${this.quote(body)}${attrString})`; + case "has-text": + return `filter(has_text=${this.toHasText(body)})`; + case "has-not-text": + return `filter(has_not_text=${this.toHasText(body)})`; + case "has": + return `filter(has=${body})`; + case "hasNot": + return `filter(has_not=${body})`; + case "and": + return `and_(${body})`; + case "or": + return `or_(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `get_by_test_id(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("get_by_text", body, !!options2.exact); + case "alt": + return this.toCallWithExact("get_by_alt_text", body, !!options2.exact); + case "placeholder": + return this.toCallWithExact("get_by_placeholder", body, !!options2.exact); + case "label": + return this.toCallWithExact("get_by_label", body, !!options2.exact); + case "title": + return this.toCallWithExact("get_by_title", body, !!options2.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : ""; + return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\//, "/").replace(/"/g, '\\"')}"${suffix})`; + } + toCallWithExact(method, body, exact) { + if (isRegExp$5(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, exact=True)`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp$5(body)) + return this.regexToString(body); + return `${this.quote(body)}`; + } + toTestIdValue(value) { + if (isRegExp$5(value)) + return this.regexToString(value); + return this.quote(value); + } + quote(text) { + return escapeWithQuotes(text, '"'); + } +} +class JavaLocatorFactory { + generateLocator(base2, kind, body, options2 = {}) { + let clazz; + switch (base2) { + case "page": + clazz = "Page"; + break; + case "frame-locator": + clazz = "FrameLocator"; + break; + case "locator": + clazz = "Locator"; + break; + } + switch (kind) { + case "default": + if (options2.hasText !== void 0) + return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options2.hasText)}))`; + if (options2.hasNotText !== void 0) + return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options2.hasNotText)}))`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frameLocator(${this.quote(body)})`; + case "frame": + return `contentFrame()`; + case "nth": + return `nth(${body})`; + case "first": + return `first()`; + case "last": + return `last()`; + case "visible": + return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`; + case "role": + const attrs = []; + if (isRegExp$5(options2.name)) { + attrs.push(`.setName(${this.regexToString(options2.name)})`); + } else if (typeof options2.name === "string") { + attrs.push(`.setName(${this.quote(options2.name)})`); + if (options2.exact) + attrs.push(`.setExact(true)`); + } + for (const { name, value } of options2.attrs) + attrs.push(`.set${toTitleCase(name)}(${typeof value === "string" ? this.quote(value) : value})`); + const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : ""; + return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`; + case "has-text": + return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`; + case "has-not-text": + return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`; + case "has": + return `filter(new ${clazz}.FilterOptions().setHas(${body}))`; + case "hasNot": + return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`; + case "and": + return `and(${body})`; + case "or": + return `or(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `getByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact(clazz, "getByText", body, !!options2.exact); + case "alt": + return this.toCallWithExact(clazz, "getByAltText", body, !!options2.exact); + case "placeholder": + return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options2.exact); + case "label": + return this.toCallWithExact(clazz, "getByLabel", body, !!options2.exact); + case "title": + return this.toCallWithExact(clazz, "getByTitle", body, !!options2.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : ""; + return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`; + } + toCallWithExact(clazz, method, body, exact) { + if (isRegExp$5(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp$5(body)) + return this.regexToString(body); + return this.quote(body); + } + toTestIdValue(value) { + if (isRegExp$5(value)) + return this.regexToString(value); + return this.quote(value); + } + quote(text) { + return escapeWithQuotes(text, '"'); + } +} +class CSharpLocatorFactory { + generateLocator(base2, kind, body, options2 = {}) { + switch (kind) { + case "default": + if (options2.hasText !== void 0) + return `Locator(${this.quote(body)}, new() { ${this.toHasText(options2.hasText)} })`; + if (options2.hasNotText !== void 0) + return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options2.hasNotText)} })`; + return `Locator(${this.quote(body)})`; + case "frame-locator": + return `FrameLocator(${this.quote(body)})`; + case "frame": + return `ContentFrame`; + case "nth": + return `Nth(${body})`; + case "first": + return `First`; + case "last": + return `Last`; + case "visible": + return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`; + case "role": + const attrs = []; + if (isRegExp$5(options2.name)) { + attrs.push(`NameRegex = ${this.regexToString(options2.name)}`); + } else if (typeof options2.name === "string") { + attrs.push(`Name = ${this.quote(options2.name)}`); + if (options2.exact) + attrs.push(`Exact = true`); + } + for (const { name, value } of options2.attrs) + attrs.push(`${toTitleCase(name)} = ${typeof value === "string" ? this.quote(value) : value}`); + const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : ""; + return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`; + case "has-text": + return `Filter(new() { ${this.toHasText(body)} })`; + case "has-not-text": + return `Filter(new() { ${this.toHasNotText(body)} })`; + case "has": + return `Filter(new() { Has = ${body} })`; + case "hasNot": + return `Filter(new() { HasNot = ${body} })`; + case "and": + return `And(${body})`; + case "or": + return `Or(${body})`; + case "chain": + return `Locator(${body})`; + case "test-id": + return `GetByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("GetByText", body, !!options2.exact); + case "alt": + return this.toCallWithExact("GetByAltText", body, !!options2.exact); + case "placeholder": + return this.toCallWithExact("GetByPlaceholder", body, !!options2.exact); + case "label": + return this.toCallWithExact("GetByLabel", body, !!options2.exact); + case "title": + return this.toCallWithExact("GetByTitle", body, !!options2.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : ""; + return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`; + } + toCallWithExact(method, body, exact) { + if (isRegExp$5(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, new() { Exact = true })`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp$5(body)) + return `HasTextRegex = ${this.regexToString(body)}`; + return `HasText = ${this.quote(body)}`; + } + toTestIdValue(value) { + if (isRegExp$5(value)) + return this.regexToString(value); + return this.quote(value); + } + toHasNotText(body) { + if (isRegExp$5(body)) + return `HasNotTextRegex = ${this.regexToString(body)}`; + return `HasNotText = ${this.quote(body)}`; + } + quote(text) { + return escapeWithQuotes(text, '"'); + } +} +class JsonlLocatorFactory { + generateLocator(base2, kind, body, options2 = {}) { + return JSON.stringify({ + kind, + body, + options: options2 + }); + } + chainLocators(locators) { + const objects = locators.map((l) => JSON.parse(l)); + for (let i = 0; i < objects.length - 1; ++i) + objects[i].next = objects[i + 1]; + return JSON.stringify(objects[0]); + } +} +const generators = { + javascript: JavaScriptLocatorFactory, + python: PythonLocatorFactory, + java: JavaLocatorFactory, + csharp: CSharpLocatorFactory, + jsonl: JsonlLocatorFactory +}; +function isRegExp$5(obj) { + return obj instanceof RegExp; +} +function isTextualMimeType(mimeType) { + return !!mimeType.match(/^(text\/.*?|application\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\/svg(\+xml)?|application\/.*?(\+json|\+xml))(;\s*charset=.*)?$/); +} +function getMimeTypeForPath(path2) { + const dotIndex = path2.lastIndexOf("."); + if (dotIndex === -1) + return null; + const extension = path2.substring(dotIndex + 1); + return types$2.get(extension) || null; +} +const types$2 = /* @__PURE__ */ new Map([ + ["ez", "application/andrew-inset"], + ["aw", "application/applixware"], + ["atom", "application/atom+xml"], + ["atomcat", "application/atomcat+xml"], + ["atomdeleted", "application/atomdeleted+xml"], + ["atomsvc", "application/atomsvc+xml"], + ["dwd", "application/atsc-dwd+xml"], + ["held", "application/atsc-held+xml"], + ["rsat", "application/atsc-rsat+xml"], + ["bdoc", "application/bdoc"], + ["xcs", "application/calendar+xml"], + ["ccxml", "application/ccxml+xml"], + ["cdfx", "application/cdfx+xml"], + ["cdmia", "application/cdmi-capability"], + ["cdmic", "application/cdmi-container"], + ["cdmid", "application/cdmi-domain"], + ["cdmio", "application/cdmi-object"], + ["cdmiq", "application/cdmi-queue"], + ["cu", "application/cu-seeme"], + ["mpd", "application/dash+xml"], + ["davmount", "application/davmount+xml"], + ["dbk", "application/docbook+xml"], + ["dssc", "application/dssc+der"], + ["xdssc", "application/dssc+xml"], + ["ecma", "application/ecmascript"], + ["es", "application/ecmascript"], + ["emma", "application/emma+xml"], + ["emotionml", "application/emotionml+xml"], + ["epub", "application/epub+zip"], + ["exi", "application/exi"], + ["exp", "application/express"], + ["fdt", "application/fdt+xml"], + ["pfr", "application/font-tdpfr"], + ["geojson", "application/geo+json"], + ["gml", "application/gml+xml"], + ["gpx", "application/gpx+xml"], + ["gxf", "application/gxf"], + ["gz", "application/gzip"], + ["hjson", "application/hjson"], + ["stk", "application/hyperstudio"], + ["ink", "application/inkml+xml"], + ["inkml", "application/inkml+xml"], + ["ipfix", "application/ipfix"], + ["its", "application/its+xml"], + ["ear", "application/java-archive"], + ["jar", "application/java-archive"], + ["war", "application/java-archive"], + ["ser", "application/java-serialized-object"], + ["class", "application/java-vm"], + ["js", "application/javascript"], + ["mjs", "application/javascript"], + ["json", "application/json"], + ["map", "application/json"], + ["json5", "application/json5"], + ["jsonml", "application/jsonml+json"], + ["jsonld", "application/ld+json"], + ["lgr", "application/lgr+xml"], + ["lostxml", "application/lost+xml"], + ["hqx", "application/mac-binhex40"], + ["cpt", "application/mac-compactpro"], + ["mads", "application/mads+xml"], + ["webmanifest", "application/manifest+json"], + ["mrc", "application/marc"], + ["mrcx", "application/marcxml+xml"], + ["ma", "application/mathematica"], + ["mb", "application/mathematica"], + ["nb", "application/mathematica"], + ["mathml", "application/mathml+xml"], + ["mbox", "application/mbox"], + ["mscml", "application/mediaservercontrol+xml"], + ["metalink", "application/metalink+xml"], + ["meta4", "application/metalink4+xml"], + ["mets", "application/mets+xml"], + ["maei", "application/mmt-aei+xml"], + ["musd", "application/mmt-usd+xml"], + ["mods", "application/mods+xml"], + ["m21", "application/mp21"], + ["mp21", "application/mp21"], + ["m4p", "application/mp4"], + ["mp4s", "application/mp4"], + ["doc", "application/msword"], + ["dot", "application/msword"], + ["mxf", "application/mxf"], + ["nq", "application/n-quads"], + ["nt", "application/n-triples"], + ["cjs", "application/node"], + ["bin", "application/octet-stream"], + ["bpk", "application/octet-stream"], + ["buffer", "application/octet-stream"], + ["deb", "application/octet-stream"], + ["deploy", "application/octet-stream"], + ["dist", "application/octet-stream"], + ["distz", "application/octet-stream"], + ["dll", "application/octet-stream"], + ["dmg", "application/octet-stream"], + ["dms", "application/octet-stream"], + ["dump", "application/octet-stream"], + ["elc", "application/octet-stream"], + ["exe", "application/octet-stream"], + ["img", "application/octet-stream"], + ["iso", "application/octet-stream"], + ["lrf", "application/octet-stream"], + ["mar", "application/octet-stream"], + ["msi", "application/octet-stream"], + ["msm", "application/octet-stream"], + ["msp", "application/octet-stream"], + ["pkg", "application/octet-stream"], + ["so", "application/octet-stream"], + ["oda", "application/oda"], + ["opf", "application/oebps-package+xml"], + ["ogx", "application/ogg"], + ["omdoc", "application/omdoc+xml"], + ["onepkg", "application/onenote"], + ["onetmp", "application/onenote"], + ["onetoc", "application/onenote"], + ["onetoc2", "application/onenote"], + ["oxps", "application/oxps"], + ["relo", "application/p2p-overlay+xml"], + ["xer", "application/patch-ops-error+xml"], + ["pdf", "application/pdf"], + ["pgp", "application/pgp-encrypted"], + ["asc", "application/pgp-signature"], + ["sig", "application/pgp-signature"], + ["prf", "application/pics-rules"], + ["p10", "application/pkcs10"], + ["p7c", "application/pkcs7-mime"], + ["p7m", "application/pkcs7-mime"], + ["p7s", "application/pkcs7-signature"], + ["p8", "application/pkcs8"], + ["ac", "application/pkix-attr-cert"], + ["cer", "application/pkix-cert"], + ["crl", "application/pkix-crl"], + ["pkipath", "application/pkix-pkipath"], + ["pki", "application/pkixcmp"], + ["pls", "application/pls+xml"], + ["ai", "application/postscript"], + ["eps", "application/postscript"], + ["ps", "application/postscript"], + ["provx", "application/provenance+xml"], + ["pskcxml", "application/pskc+xml"], + ["raml", "application/raml+yaml"], + ["owl", "application/rdf+xml"], + ["rdf", "application/rdf+xml"], + ["rif", "application/reginfo+xml"], + ["rnc", "application/relax-ng-compact-syntax"], + ["rl", "application/resource-lists+xml"], + ["rld", "application/resource-lists-diff+xml"], + ["rs", "application/rls-services+xml"], + ["rapd", "application/route-apd+xml"], + ["sls", "application/route-s-tsid+xml"], + ["rusd", "application/route-usd+xml"], + ["gbr", "application/rpki-ghostbusters"], + ["mft", "application/rpki-manifest"], + ["roa", "application/rpki-roa"], + ["rsd", "application/rsd+xml"], + ["rss", "application/rss+xml"], + ["rtf", "application/rtf"], + ["sbml", "application/sbml+xml"], + ["scq", "application/scvp-cv-request"], + ["scs", "application/scvp-cv-response"], + ["spq", "application/scvp-vp-request"], + ["spp", "application/scvp-vp-response"], + ["sdp", "application/sdp"], + ["senmlx", "application/senml+xml"], + ["sensmlx", "application/sensml+xml"], + ["setpay", "application/set-payment-initiation"], + ["setreg", "application/set-registration-initiation"], + ["shf", "application/shf+xml"], + ["sieve", "application/sieve"], + ["siv", "application/sieve"], + ["smi", "application/smil+xml"], + ["smil", "application/smil+xml"], + ["rq", "application/sparql-query"], + ["srx", "application/sparql-results+xml"], + ["gram", "application/srgs"], + ["grxml", "application/srgs+xml"], + ["sru", "application/sru+xml"], + ["ssdl", "application/ssdl+xml"], + ["ssml", "application/ssml+xml"], + ["swidtag", "application/swid+xml"], + ["tei", "application/tei+xml"], + ["teicorpus", "application/tei+xml"], + ["tfi", "application/thraud+xml"], + ["tsd", "application/timestamped-data"], + ["toml", "application/toml"], + ["trig", "application/trig"], + ["ttml", "application/ttml+xml"], + ["ubj", "application/ubjson"], + ["rsheet", "application/urc-ressheet+xml"], + ["td", "application/urc-targetdesc+xml"], + ["vxml", "application/voicexml+xml"], + ["wasm", "application/wasm"], + ["wgt", "application/widget"], + ["hlp", "application/winhlp"], + ["wsdl", "application/wsdl+xml"], + ["wspolicy", "application/wspolicy+xml"], + ["xaml", "application/xaml+xml"], + ["xav", "application/xcap-att+xml"], + ["xca", "application/xcap-caps+xml"], + ["xdf", "application/xcap-diff+xml"], + ["xel", "application/xcap-el+xml"], + ["xns", "application/xcap-ns+xml"], + ["xenc", "application/xenc+xml"], + ["xht", "application/xhtml+xml"], + ["xhtml", "application/xhtml+xml"], + ["xlf", "application/xliff+xml"], + ["rng", "application/xml"], + ["xml", "application/xml"], + ["xsd", "application/xml"], + ["xsl", "application/xml"], + ["dtd", "application/xml-dtd"], + ["xop", "application/xop+xml"], + ["xpl", "application/xproc+xml"], + ["*xsl", "application/xslt+xml"], + ["xslt", "application/xslt+xml"], + ["xspf", "application/xspf+xml"], + ["mxml", "application/xv+xml"], + ["xhvml", "application/xv+xml"], + ["xvm", "application/xv+xml"], + ["xvml", "application/xv+xml"], + ["yang", "application/yang"], + ["yin", "application/yin+xml"], + ["zip", "application/zip"], + ["*3gpp", "audio/3gpp"], + ["adp", "audio/adpcm"], + ["amr", "audio/amr"], + ["au", "audio/basic"], + ["snd", "audio/basic"], + ["kar", "audio/midi"], + ["mid", "audio/midi"], + ["midi", "audio/midi"], + ["rmi", "audio/midi"], + ["mxmf", "audio/mobile-xmf"], + ["*mp3", "audio/mp3"], + ["m4a", "audio/mp4"], + ["mp4a", "audio/mp4"], + ["m2a", "audio/mpeg"], + ["m3a", "audio/mpeg"], + ["mp2", "audio/mpeg"], + ["mp2a", "audio/mpeg"], + ["mp3", "audio/mpeg"], + ["mpga", "audio/mpeg"], + ["oga", "audio/ogg"], + ["ogg", "audio/ogg"], + ["opus", "audio/ogg"], + ["spx", "audio/ogg"], + ["s3m", "audio/s3m"], + ["sil", "audio/silk"], + ["wav", "audio/wav"], + ["*wav", "audio/wave"], + ["weba", "audio/webm"], + ["xm", "audio/xm"], + ["ttc", "font/collection"], + ["otf", "font/otf"], + ["ttf", "font/ttf"], + ["woff", "font/woff"], + ["woff2", "font/woff2"], + ["exr", "image/aces"], + ["apng", "image/apng"], + ["avif", "image/avif"], + ["bmp", "image/bmp"], + ["cgm", "image/cgm"], + ["drle", "image/dicom-rle"], + ["emf", "image/emf"], + ["fits", "image/fits"], + ["g3", "image/g3fax"], + ["gif", "image/gif"], + ["heic", "image/heic"], + ["heics", "image/heic-sequence"], + ["heif", "image/heif"], + ["heifs", "image/heif-sequence"], + ["hej2", "image/hej2k"], + ["hsj2", "image/hsj2"], + ["ief", "image/ief"], + ["jls", "image/jls"], + ["jp2", "image/jp2"], + ["jpg2", "image/jp2"], + ["jpe", "image/jpeg"], + ["jpeg", "image/jpeg"], + ["jpg", "image/jpeg"], + ["jph", "image/jph"], + ["jhc", "image/jphc"], + ["jpm", "image/jpm"], + ["jpf", "image/jpx"], + ["jpx", "image/jpx"], + ["jxr", "image/jxr"], + ["jxra", "image/jxra"], + ["jxrs", "image/jxrs"], + ["jxs", "image/jxs"], + ["jxsc", "image/jxsc"], + ["jxsi", "image/jxsi"], + ["jxss", "image/jxss"], + ["ktx", "image/ktx"], + ["ktx2", "image/ktx2"], + ["png", "image/png"], + ["sgi", "image/sgi"], + ["svg", "image/svg+xml"], + ["svgz", "image/svg+xml"], + ["t38", "image/t38"], + ["tif", "image/tiff"], + ["tiff", "image/tiff"], + ["tfx", "image/tiff-fx"], + ["webp", "image/webp"], + ["wmf", "image/wmf"], + ["disposition-notification", "message/disposition-notification"], + ["u8msg", "message/global"], + ["u8dsn", "message/global-delivery-status"], + ["u8mdn", "message/global-disposition-notification"], + ["u8hdr", "message/global-headers"], + ["eml", "message/rfc822"], + ["mime", "message/rfc822"], + ["3mf", "model/3mf"], + ["gltf", "model/gltf+json"], + ["glb", "model/gltf-binary"], + ["iges", "model/iges"], + ["igs", "model/iges"], + ["mesh", "model/mesh"], + ["msh", "model/mesh"], + ["silo", "model/mesh"], + ["mtl", "model/mtl"], + ["obj", "model/obj"], + ["stpx", "model/step+xml"], + ["stpz", "model/step+zip"], + ["stpxz", "model/step-xml+zip"], + ["stl", "model/stl"], + ["vrml", "model/vrml"], + ["wrl", "model/vrml"], + ["*x3db", "model/x3d+binary"], + ["x3dbz", "model/x3d+binary"], + ["x3db", "model/x3d+fastinfoset"], + ["*x3dv", "model/x3d+vrml"], + ["x3dvz", "model/x3d+vrml"], + ["x3d", "model/x3d+xml"], + ["x3dz", "model/x3d+xml"], + ["x3dv", "model/x3d-vrml"], + ["appcache", "text/cache-manifest"], + ["manifest", "text/cache-manifest"], + ["ics", "text/calendar"], + ["ifb", "text/calendar"], + ["coffee", "text/coffeescript"], + ["litcoffee", "text/coffeescript"], + ["css", "text/css"], + ["csv", "text/csv"], + ["htm", "text/html"], + ["html", "text/html"], + ["shtml", "text/html"], + ["jade", "text/jade"], + ["jsx", "text/jsx"], + ["less", "text/less"], + ["markdown", "text/markdown"], + ["md", "text/markdown"], + ["mml", "text/mathml"], + ["mdx", "text/mdx"], + ["n3", "text/n3"], + ["conf", "text/plain"], + ["def", "text/plain"], + ["in", "text/plain"], + ["ini", "text/plain"], + ["list", "text/plain"], + ["log", "text/plain"], + ["text", "text/plain"], + ["txt", "text/plain"], + ["rtx", "text/richtext"], + ["*rtf", "text/rtf"], + ["sgm", "text/sgml"], + ["sgml", "text/sgml"], + ["shex", "text/shex"], + ["slim", "text/slim"], + ["slm", "text/slim"], + ["spdx", "text/spdx"], + ["styl", "text/stylus"], + ["stylus", "text/stylus"], + ["tsv", "text/tab-separated-values"], + ["man", "text/troff"], + ["me", "text/troff"], + ["ms", "text/troff"], + ["roff", "text/troff"], + ["t", "text/troff"], + ["tr", "text/troff"], + ["ttl", "text/turtle"], + ["uri", "text/uri-list"], + ["uris", "text/uri-list"], + ["urls", "text/uri-list"], + ["vcard", "text/vcard"], + ["vtt", "text/vtt"], + ["*xml", "text/xml"], + ["yaml", "text/yaml"], + ["yml", "text/yaml"], + ["3gp", "video/3gpp"], + ["3gpp", "video/3gpp"], + ["3g2", "video/3gpp2"], + ["h261", "video/h261"], + ["h263", "video/h263"], + ["h264", "video/h264"], + ["m4s", "video/iso.segment"], + ["jpgv", "video/jpeg"], + ["jpm", "video/jpm"], + ["jpgm", "video/jpm"], + ["mj2", "video/mj2"], + ["mjp2", "video/mj2"], + ["ts", "video/mp2t"], + ["mp4", "video/mp4"], + ["mp4v", "video/mp4"], + ["mpg4", "video/mp4"], + ["m1v", "video/mpeg"], + ["m2v", "video/mpeg"], + ["mpe", "video/mpeg"], + ["mpeg", "video/mpeg"], + ["mpg", "video/mpeg"], + ["ogv", "video/ogg"], + ["mov", "video/quicktime"], + ["qt", "video/quicktime"], + ["webm", "video/webm"] +]); +class MultiMap { + constructor() { + this._map = /* @__PURE__ */ new Map(); + } + set(key2, value) { + let values = this._map.get(key2); + if (!values) { + values = []; + this._map.set(key2, values); + } + values.push(value); + } + get(key2) { + return this._map.get(key2) || []; + } + has(key2) { + return this._map.has(key2); + } + delete(key2, value) { + const values = this._map.get(key2); + if (!values) + return; + if (values.includes(value)) + this._map.set(key2, values.filter((v) => value !== v)); + } + deleteAll(key2) { + this._map.delete(key2); + } + hasValue(key2, value) { + const values = this._map.get(key2); + if (!values) + return false; + return values.includes(value); + } + get size() { + return this._map.size; + } + [Symbol.iterator]() { + return this._map[Symbol.iterator](); + } + keys() { + return this._map.keys(); + } + values() { + const result = []; + for (const key2 of this.keys()) + result.push(...this.get(key2)); + return result; + } + clear() { + this._map.clear(); + } +} +const methodMetainfo = /* @__PURE__ */ new Map([ + ["APIRequestContext.fetch", { title: 'Fetch "{url}"' }], + ["APIRequestContext.fetchResponseBody", { internal: true }], + ["APIRequestContext.fetchLog", { internal: true }], + ["APIRequestContext.storageState", { internal: true }], + ["APIRequestContext.disposeAPIResponse", { internal: true }], + ["APIRequestContext.dispose", { internal: true }], + ["LocalUtils.zip", { internal: true }], + ["LocalUtils.harOpen", { internal: true }], + ["LocalUtils.harLookup", { internal: true }], + ["LocalUtils.harClose", { internal: true }], + ["LocalUtils.harUnzip", { internal: true }], + ["LocalUtils.connect", { internal: true }], + ["LocalUtils.tracingStarted", { internal: true }], + ["LocalUtils.addStackToTracingNoReply", { internal: true }], + ["LocalUtils.traceDiscarded", { internal: true }], + ["LocalUtils.globToRegex", { internal: true }], + ["Root.initialize", { internal: true }], + ["Playwright.newRequest", { title: "Create request context" }], + ["DebugController.initialize", { internal: true }], + ["DebugController.setReportStateChanged", { internal: true }], + ["DebugController.resetForReuse", { internal: true }], + ["DebugController.navigate", { internal: true }], + ["DebugController.setRecorderMode", { internal: true }], + ["DebugController.highlight", { internal: true }], + ["DebugController.hideHighlight", { internal: true }], + ["DebugController.resume", { internal: true }], + ["DebugController.kill", { internal: true }], + ["DebugController.closeAllBrowsers", { internal: true }], + ["SocksSupport.socksConnected", { internal: true }], + ["SocksSupport.socksFailed", { internal: true }], + ["SocksSupport.socksData", { internal: true }], + ["SocksSupport.socksError", { internal: true }], + ["SocksSupport.socksEnd", { internal: true }], + ["BrowserType.launch", { title: "Launch browser" }], + ["BrowserType.launchPersistentContext", { title: "Launch persistent context" }], + ["BrowserType.connectOverCDP", { title: "Connect over CDP" }], + ["Browser.close", { title: "Close browser" }], + ["Browser.killForTests", { internal: true }], + ["Browser.defaultUserAgentForTest", { internal: true }], + ["Browser.newContext", { title: "Create context" }], + ["Browser.newContextForReuse", { internal: true }], + ["Browser.stopPendingOperations", { internal: true, title: "Stop pending operations" }], + ["Browser.newBrowserCDPSession", { internal: true, title: "Create CDP session" }], + ["Browser.startTracing", { internal: true }], + ["Browser.stopTracing", { internal: true }], + ["EventTarget.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }], + ["BrowserContext.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }], + ["Page.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }], + ["WebSocket.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }], + ["ElectronApplication.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }], + ["AndroidDevice.waitForEventInfo", { title: 'Wait for event "{info.event}"', snapshot: true }], + ["BrowserContext.addCookies", { title: "Add cookies" }], + ["BrowserContext.addInitScript", { title: "Add init script" }], + ["BrowserContext.clearCookies", { title: "Clear cookies" }], + ["BrowserContext.clearPermissions", { title: "Clear permissions" }], + ["BrowserContext.close", { title: "Close context" }], + ["BrowserContext.cookies", { title: "Get cookies" }], + ["BrowserContext.exposeBinding", { title: "Expose binding" }], + ["BrowserContext.grantPermissions", { title: "Grant permissions" }], + ["BrowserContext.newPage", { title: "Create page" }], + ["BrowserContext.registerSelectorEngine", { internal: true }], + ["BrowserContext.setTestIdAttributeName", { internal: true }], + ["BrowserContext.setExtraHTTPHeaders", { title: "Set extra HTTP headers" }], + ["BrowserContext.setGeolocation", { title: "Set geolocation" }], + ["BrowserContext.setHTTPCredentials", { title: "Set HTTP credentials" }], + ["BrowserContext.setNetworkInterceptionPatterns", { internal: true }], + ["BrowserContext.setWebSocketInterceptionPatterns", { internal: true }], + ["BrowserContext.setOffline", { title: "Set offline mode" }], + ["BrowserContext.storageState", { title: "Get storage state" }], + ["BrowserContext.pause", { title: "Pause" }], + ["BrowserContext.enableRecorder", { internal: true }], + ["BrowserContext.newCDPSession", { internal: true }], + ["BrowserContext.harStart", { internal: true }], + ["BrowserContext.harExport", { internal: true }], + ["BrowserContext.createTempFiles", { internal: true }], + ["BrowserContext.updateSubscription", { internal: true }], + ["BrowserContext.clockFastForward", { title: 'Fast forward clock "{ticksNumber}{ticksString}"' }], + ["BrowserContext.clockInstall", { title: 'Install clock "{timeNumber}{timeString}"' }], + ["BrowserContext.clockPauseAt", { title: 'Pause clock "{timeNumber}{timeString}"' }], + ["BrowserContext.clockResume", { title: "Resume clock" }], + ["BrowserContext.clockRunFor", { title: 'Run clock "{ticksNumber}{ticksString}"' }], + ["BrowserContext.clockSetFixedTime", { title: 'Set fixed time "{timeNumber}{timeString}"' }], + ["BrowserContext.clockSetSystemTime", { title: 'Set system time "{timeNumber}{timeString}"' }], + ["Page.addInitScript", {}], + ["Page.close", { title: "Close" }], + ["Page.emulateMedia", { title: "Emulate media", snapshot: true }], + ["Page.exposeBinding", { title: "Expose binding" }], + ["Page.goBack", { title: "Go back", slowMo: true, snapshot: true }], + ["Page.goForward", { title: "Go forward", slowMo: true, snapshot: true }], + ["Page.requestGC", { title: "Request garbage collection" }], + ["Page.registerLocatorHandler", { title: "Register locator handler" }], + ["Page.resolveLocatorHandlerNoReply", { internal: true }], + ["Page.unregisterLocatorHandler", { title: "Unregister locator handler" }], + ["Page.reload", { title: "Reload", slowMo: true, snapshot: true }], + ["Page.expectScreenshot", { title: "Expect screenshot", snapshot: true }], + ["Page.screenshot", { title: "Screenshot", snapshot: true }], + ["Page.setExtraHTTPHeaders", { title: "Set extra HTTP headers" }], + ["Page.setNetworkInterceptionPatterns", { internal: true }], + ["Page.setWebSocketInterceptionPatterns", { internal: true }], + ["Page.setViewportSize", { title: "Set viewport size", snapshot: true }], + ["Page.keyboardDown", { title: 'Key down "{key}"', slowMo: true, snapshot: true }], + ["Page.keyboardUp", { title: 'Key up "{key}"', slowMo: true, snapshot: true }], + ["Page.keyboardInsertText", { title: 'Insert "{text}"', slowMo: true, snapshot: true }], + ["Page.keyboardType", { title: 'Type "{text}"', slowMo: true, snapshot: true }], + ["Page.keyboardPress", { title: 'Press "{key}"', slowMo: true, snapshot: true }], + ["Page.mouseMove", { title: "Mouse move", slowMo: true, snapshot: true }], + ["Page.mouseDown", { title: "Mouse down", slowMo: true, snapshot: true }], + ["Page.mouseUp", { title: "Mouse up", slowMo: true, snapshot: true }], + ["Page.mouseClick", { title: "Click", slowMo: true, snapshot: true }], + ["Page.mouseWheel", { title: "Mouse wheel", slowMo: true, snapshot: true }], + ["Page.touchscreenTap", { title: "Tap", slowMo: true, snapshot: true }], + ["Page.accessibilitySnapshot", { internal: true, snapshot: true }], + ["Page.pdf", { title: "PDF" }], + ["Page.snapshotForAI", { internal: true, snapshot: true }], + ["Page.startJSCoverage", { internal: true }], + ["Page.stopJSCoverage", { internal: true }], + ["Page.startCSSCoverage", { internal: true }], + ["Page.stopCSSCoverage", { internal: true }], + ["Page.bringToFront", { title: "Bring to front" }], + ["Page.updateSubscription", { internal: true }], + ["Frame.evalOnSelector", { title: "Evaluate", snapshot: true }], + ["Frame.evalOnSelectorAll", { title: "Evaluate", snapshot: true }], + ["Frame.addScriptTag", { title: "Add script tag", snapshot: true }], + ["Frame.addStyleTag", { title: "Add style tag", snapshot: true }], + ["Frame.ariaSnapshot", { title: "Aria snapshot", snapshot: true }], + ["Frame.blur", { title: "Blur", slowMo: true, snapshot: true }], + ["Frame.check", { title: "Check", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.click", { title: "Click", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.content", { title: "Get content", snapshot: true }], + ["Frame.dragAndDrop", { title: "Drag and drop", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.dblclick", { title: "Double click", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.dispatchEvent", { title: 'Dispatch "{type}"', slowMo: true, snapshot: true }], + ["Frame.evaluateExpression", { title: "Evaluate", snapshot: true }], + ["Frame.evaluateExpressionHandle", { title: "Evaluate", snapshot: true }], + ["Frame.fill", { title: 'Fill "{value}"', slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.focus", { title: "Focus", slowMo: true, snapshot: true }], + ["Frame.frameElement", { internal: true }], + ["Frame.highlight", { internal: true }], + ["Frame.getAttribute", { internal: true, snapshot: true }], + ["Frame.goto", { title: 'Navigate to "{url}"', slowMo: true, snapshot: true }], + ["Frame.hover", { title: "Hover", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.innerHTML", { title: "Get HTML", snapshot: true }], + ["Frame.innerText", { title: "Get inner text", snapshot: true }], + ["Frame.inputValue", { title: "Get input value", snapshot: true }], + ["Frame.isChecked", { title: "Is checked", snapshot: true }], + ["Frame.isDisabled", { title: "Is disabled", snapshot: true }], + ["Frame.isEnabled", { title: "Is enabled", snapshot: true }], + ["Frame.isHidden", { title: "Is hidden", snapshot: true }], + ["Frame.isVisible", { title: "Is visible", snapshot: true }], + ["Frame.isEditable", { title: "Is editable", snapshot: true }], + ["Frame.press", { title: 'Press "{key}"', slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.querySelector", { title: "Query selector", snapshot: true }], + ["Frame.querySelectorAll", { title: "Query selector all", snapshot: true }], + ["Frame.queryCount", { title: "Query count", snapshot: true }], + ["Frame.selectOption", { title: "Select option", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.setContent", { title: "Set content", snapshot: true }], + ["Frame.setInputFiles", { title: "Set input files", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.tap", { title: "Tap", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.textContent", { title: "Get text content", snapshot: true }], + ["Frame.title", { internal: true }], + ["Frame.type", { title: "Type", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.uncheck", { title: "Uncheck", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["Frame.waitForTimeout", { title: "Wait for timeout", snapshot: true }], + ["Frame.waitForFunction", { title: "Wait for function", snapshot: true }], + ["Frame.waitForSelector", { title: "Wait for selector", snapshot: true }], + ["Frame.expect", { title: 'Expect "{expression}"', snapshot: true }], + ["Worker.evaluateExpression", { title: "Evaluate" }], + ["Worker.evaluateExpressionHandle", { title: "Evaluate" }], + ["JSHandle.dispose", {}], + ["ElementHandle.dispose", {}], + ["JSHandle.evaluateExpression", { title: "Evaluate", snapshot: true }], + ["ElementHandle.evaluateExpression", { title: "Evaluate", snapshot: true }], + ["JSHandle.evaluateExpressionHandle", { title: "Evaluate", snapshot: true }], + ["ElementHandle.evaluateExpressionHandle", { title: "Evaluate", snapshot: true }], + ["JSHandle.getPropertyList", { internal: true }], + ["ElementHandle.getPropertyList", { internal: true }], + ["JSHandle.getProperty", { internal: true }], + ["ElementHandle.getProperty", { internal: true }], + ["JSHandle.jsonValue", { internal: true }], + ["ElementHandle.jsonValue", { internal: true }], + ["ElementHandle.evalOnSelector", { title: "Evaluate", snapshot: true }], + ["ElementHandle.evalOnSelectorAll", { title: "Evaluate", snapshot: true }], + ["ElementHandle.boundingBox", { title: "Get bounding box", snapshot: true }], + ["ElementHandle.check", { title: "Check", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.click", { title: "Click", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.contentFrame", { internal: true, snapshot: true }], + ["ElementHandle.dblclick", { title: "Double click", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.dispatchEvent", { title: "Dispatch event", slowMo: true, snapshot: true }], + ["ElementHandle.fill", { title: 'Fill "{value}"', slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.focus", { title: "Focus", slowMo: true, snapshot: true }], + ["ElementHandle.generateLocatorString", { internal: true }], + ["ElementHandle.getAttribute", { internal: true }], + ["ElementHandle.hover", { title: "Hover", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.innerHTML", { title: "Get HTML", snapshot: true }], + ["ElementHandle.innerText", { title: "Get inner text", snapshot: true }], + ["ElementHandle.inputValue", { title: "Get input value", snapshot: true }], + ["ElementHandle.isChecked", { title: "Is checked", snapshot: true }], + ["ElementHandle.isDisabled", { title: "Is disabled", snapshot: true }], + ["ElementHandle.isEditable", { title: "Is editable", snapshot: true }], + ["ElementHandle.isEnabled", { title: "Is enabled", snapshot: true }], + ["ElementHandle.isHidden", { title: "Is hidden", snapshot: true }], + ["ElementHandle.isVisible", { title: "Is visible", snapshot: true }], + ["ElementHandle.ownerFrame", { title: "Get owner frame" }], + ["ElementHandle.press", { title: 'Press "{key}"', slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.querySelector", { title: "Query selector", snapshot: true }], + ["ElementHandle.querySelectorAll", { title: "Query selector all", snapshot: true }], + ["ElementHandle.screenshot", { title: "Screenshot", snapshot: true }], + ["ElementHandle.scrollIntoViewIfNeeded", { title: "Scroll into view", slowMo: true, snapshot: true }], + ["ElementHandle.selectOption", { title: "Select option", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.selectText", { title: "Select text", slowMo: true, snapshot: true }], + ["ElementHandle.setInputFiles", { title: "Set input files", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.tap", { title: "Tap", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.textContent", { title: "Get text content", snapshot: true }], + ["ElementHandle.type", { title: "Type", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.uncheck", { title: "Uncheck", slowMo: true, snapshot: true, pausesBeforeInput: true }], + ["ElementHandle.waitForElementState", { title: "Wait for state", snapshot: true }], + ["ElementHandle.waitForSelector", { title: "Wait for selector", snapshot: true }], + ["Request.response", { internal: true }], + ["Request.rawRequestHeaders", { internal: true }], + ["Route.redirectNavigationRequest", { internal: true }], + ["Route.abort", {}], + ["Route.continue", { internal: true }], + ["Route.fulfill", { internal: true }], + ["WebSocketRoute.connect", { internal: true }], + ["WebSocketRoute.ensureOpened", { internal: true }], + ["WebSocketRoute.sendToPage", { internal: true }], + ["WebSocketRoute.sendToServer", { internal: true }], + ["WebSocketRoute.closePage", { internal: true }], + ["WebSocketRoute.closeServer", { internal: true }], + ["Response.body", { internal: true }], + ["Response.securityDetails", { internal: true }], + ["Response.serverAddr", { internal: true }], + ["Response.rawResponseHeaders", { internal: true }], + ["Response.sizes", { internal: true }], + ["BindingCall.reject", { internal: true }], + ["BindingCall.resolve", { internal: true }], + ["Dialog.accept", { title: "Accept dialog" }], + ["Dialog.dismiss", { title: "Dismiss dialog" }], + ["Tracing.tracingStart", { internal: true }], + ["Tracing.tracingStartChunk", { internal: true }], + ["Tracing.tracingGroup", { title: 'Trace "{name}"' }], + ["Tracing.tracingGroupEnd", { title: "Group end" }], + ["Tracing.tracingStopChunk", { internal: true }], + ["Tracing.tracingStop", { internal: true }], + ["Artifact.pathAfterFinished", { internal: true }], + ["Artifact.saveAs", { internal: true }], + ["Artifact.saveAsStream", { internal: true }], + ["Artifact.failure", { internal: true }], + ["Artifact.stream", { internal: true }], + ["Artifact.cancel", { internal: true }], + ["Artifact.delete", { internal: true }], + ["Stream.read", { internal: true }], + ["Stream.close", { internal: true }], + ["WritableStream.write", { internal: true }], + ["WritableStream.close", { internal: true }], + ["CDPSession.send", { internal: true }], + ["CDPSession.detach", { internal: true }], + ["Electron.launch", { title: "Launch electron" }], + ["ElectronApplication.browserWindow", { internal: true }], + ["ElectronApplication.evaluateExpression", { title: "Evaluate" }], + ["ElectronApplication.evaluateExpressionHandle", { title: "Evaluate" }], + ["ElectronApplication.updateSubscription", { internal: true }], + ["Android.devices", { internal: true }], + ["AndroidSocket.write", { internal: true }], + ["AndroidSocket.close", { internal: true }], + ["AndroidDevice.wait", {}], + ["AndroidDevice.fill", { title: 'Fill "{text}"' }], + ["AndroidDevice.tap", { title: "Tap" }], + ["AndroidDevice.drag", { title: "Drag" }], + ["AndroidDevice.fling", { title: "Fling" }], + ["AndroidDevice.longTap", { title: "Long tap" }], + ["AndroidDevice.pinchClose", { title: "Pinch close" }], + ["AndroidDevice.pinchOpen", { title: "Pinch open" }], + ["AndroidDevice.scroll", { title: "Scroll" }], + ["AndroidDevice.swipe", { title: "Swipe" }], + ["AndroidDevice.info", { internal: true }], + ["AndroidDevice.screenshot", { title: "Screenshot" }], + ["AndroidDevice.inputType", { title: "Type" }], + ["AndroidDevice.inputPress", { title: "Press" }], + ["AndroidDevice.inputTap", { title: "Tap" }], + ["AndroidDevice.inputSwipe", { title: "Swipe" }], + ["AndroidDevice.inputDrag", { title: "Drag" }], + ["AndroidDevice.launchBrowser", { title: "Launch browser" }], + ["AndroidDevice.open", { title: "Open app" }], + ["AndroidDevice.shell", { internal: true }], + ["AndroidDevice.installApk", { title: "Install apk" }], + ["AndroidDevice.push", { title: "Push" }], + ["AndroidDevice.connectToWebView", { internal: true }], + ["AndroidDevice.close", { internal: true }], + ["JsonPipe.send", { internal: true }], + ["JsonPipe.close", { internal: true }] +]); +function formatProtocolParam(params, name) { + if (!params) + return ""; + if (name === "url") { + try { + const urlObject = new URL(params[name]); + if (urlObject.protocol === "data:") + return urlObject.protocol; + if (urlObject.protocol === "about:") + return params[name]; + return urlObject.pathname + urlObject.search; + } catch (error2) { + return params[name]; + } + } + if (name === "timeNumber") { + return new Date(params[name]).toString(); + } + return deepParam(params, name); +} +function deepParam(params, name) { + const tokens = name.split("."); + let current2 = params; + for (const token of tokens) { + if (typeof current2 !== "object" || current2 === null) + return ""; + current2 = current2[token]; + } + if (current2 === void 0) + return ""; + return String(current2); +} +function renderTitleForCall(metadata) { + var _a2; + const titleFormat = metadata.title ?? ((_a2 = methodMetainfo.get(metadata.type + "." + metadata.method)) == null ? void 0 : _a2.title) ?? metadata.method; + return titleFormat.replace(/\{([^}]+)\}/g, (_, p1) => { + return formatProtocolParam(metadata.params, p1); + }); +} +function isRegExp$4(obj) { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; +} +function isObject(obj) { + return typeof obj === "object" && obj !== null; +} +function isError$2(obj) { + var _a2; + return obj instanceof Error || obj && ((_a2 = Object.getPrototypeOf(obj)) == null ? void 0 : _a2.name) === "Error"; +} +let _timeShift = 0; +function monotonicTime() { + return Math.floor((performance.now() + _timeShift) * 1e3) / 1e3; +} +const DEFAULT_PLAYWRIGHT_TIMEOUT = 3e4; +const DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT = 3 * 60 * 1e3; +async function raceAgainstDeadline(cb, deadline) { + let timer; + return Promise.race([ + cb().then((result) => { + return { result, timedOut: false }; + }), + new Promise((resolve) => { + const kMaxDeadline = 2147483647; + const timeout = (deadline || kMaxDeadline) - monotonicTime(); + timer = setTimeout(() => resolve({ timedOut: true }), timeout); + }) + ]).finally(() => { + clearTimeout(timer); + }); +} +const escapedChars = /* @__PURE__ */ new Set(["$", "^", "+", ".", "*", "(", ")", "|", "\\", "?", "{", "}", "[", "]"]); +function globToRegexPattern(glob) { + const tokens = ["^"]; + let inGroup = false; + for (let i = 0; i < glob.length; ++i) { + const c = glob[i]; + if (c === "\\" && i + 1 < glob.length) { + const char = glob[++i]; + tokens.push(escapedChars.has(char) ? "\\" + char : char); + continue; + } + if (c === "*") { + const beforeDeep = glob[i - 1]; + let starCount = 1; + while (glob[i + 1] === "*") { + starCount++; + i++; + } + const afterDeep = glob[i + 1]; + const isDeep = starCount > 1 && (beforeDeep === "/" || beforeDeep === void 0) && (afterDeep === "/" || afterDeep === void 0); + if (isDeep) { + tokens.push("((?:[^/]*(?:/|$))*)"); + i++; + } else { + tokens.push("([^/]*)"); + } + continue; + } + switch (c) { + case "{": + inGroup = true; + tokens.push("("); + break; + case "}": + inGroup = false; + tokens.push(")"); + break; + case ",": + if (inGroup) { + tokens.push("|"); + break; + } + tokens.push("\\" + c); + break; + default: + tokens.push(escapedChars.has(c) ? "\\" + c : c); + } + } + tokens.push("$"); + return tokens.join(""); +} +function isRegExp$3(obj) { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; +} +function urlMatchesEqual(match1, match2) { + if (isRegExp$3(match1) && isRegExp$3(match2)) + return match1.source === match2.source && match1.flags === match2.flags; + return match1 === match2; +} +function urlMatches(baseURL, urlString, match, webSocketUrl) { + if (match === void 0 || match === "") + return true; + if (isString(match)) + match = new RegExp(resolveGlobToRegexPattern(baseURL, match, webSocketUrl)); + if (isRegExp$3(match)) { + const r = match.test(urlString); + return r; + } + const url2 = parseURL$1(urlString); + if (!url2) + return false; + if (typeof match !== "function") + throw new Error("url parameter should be string, RegExp or function"); + return match(url2); +} +function resolveGlobToRegexPattern(baseURL, glob, webSocketUrl) { + if (webSocketUrl) + baseURL = toWebSocketBaseUrl(baseURL); + glob = resolveGlobBase(baseURL, glob); + return globToRegexPattern(glob); +} +function toWebSocketBaseUrl(baseURL) { + if (baseURL && /^https?:\/\//.test(baseURL)) + baseURL = baseURL.replace(/^http/, "ws"); + return baseURL; +} +function resolveGlobBase(baseURL, match) { + if (!match.startsWith("*")) { + let mapToken = function(original, replacement) { + if (original.length === 0) + return ""; + tokenMap.set(replacement, original); + return replacement; + }; + const tokenMap = /* @__PURE__ */ new Map(); + match = match.replaceAll(/\\\\\?/g, "?"); + const relativePath = match.split("/").map((token, index2) => { + if (token === "." || token === ".." || token === "") + return token; + if (index2 === 0 && token.endsWith(":")) + return mapToken(token, "http:"); + const questionIndex = token.indexOf("?"); + if (questionIndex === -1) + return mapToken(token, `$_${index2}_$`); + const newPrefix = mapToken(token.substring(0, questionIndex), `$_${index2}_$`); + const newSuffix = mapToken(token.substring(questionIndex), `?$_${index2}_$`); + return newPrefix + newSuffix; + }).join("/"); + let resolved = constructURLBasedOnBaseURL(baseURL, relativePath); + for (const [token, original] of tokenMap) + resolved = resolved.replace(token, original); + match = resolved; + } + return match; +} +function parseURL$1(url2) { + try { + return new URL(url2); + } catch (e) { + return null; + } +} +function constructURLBasedOnBaseURL(baseURL, givenURL) { + try { + return new URL(givenURL, baseURL).toString(); + } catch (e) { + return givenURL; + } +} +function blendWithWhite(c, a) { + return 255 + (c - 255) * a; +} +function rgb2gray(r, g, b) { + return 77 * r + 150 * g + 29 * b + 128 >> 8; +} +function colorDeltaE94(rgb1, rgb2) { + const [l1, a1, b1] = xyz2lab(srgb2xyz(rgb1)); + const [l2, a2, b2] = xyz2lab(srgb2xyz(rgb2)); + const deltaL = l1 - l2; + const deltaA = a1 - a2; + const deltaB = b1 - b2; + const c1 = Math.sqrt(a1 ** 2 + b1 ** 2); + const c2 = Math.sqrt(a2 ** 2 + b2 ** 2); + const deltaC = c1 - c2; + let deltaH = deltaA ** 2 + deltaB ** 2 - deltaC ** 2; + deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH); + const k1 = 0.045; + const k2 = 0.015; + const kL = 1; + const kC = 1; + const kH = 1; + const sC = 1 + k1 * c1; + const sH = 1 + k2 * c1; + const sL = 1; + return Math.sqrt((deltaL / sL / kL) ** 2 + (deltaC / sC / kC) ** 2 + (deltaH / sH / kH) ** 2); +} +function srgb2xyz(rgb) { + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; + r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; + g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92; + b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; + return [ + r * 0.4124 + g * 0.3576 + b * 0.1805, + r * 0.2126 + g * 0.7152 + b * 0.0722, + r * 0.0193 + g * 0.1192 + b * 0.9505 + ]; +} +const sigma_pow2 = 6 * 6 / 29 / 29; +const sigma_pow3 = 6 * 6 * 6 / 29 / 29 / 29; +function xyz2lab(xyz) { + const x = xyz[0] / 0.950489; + const y = xyz[1]; + const z = xyz[2] / 1.08884; + const fx = x > sigma_pow3 ? x ** (1 / 3) : x / 3 / sigma_pow2 + 4 / 29; + const fy = y > sigma_pow3 ? y ** (1 / 3) : y / 3 / sigma_pow2 + 4 / 29; + const fz = z > sigma_pow3 ? z ** (1 / 3) : z / 3 / sigma_pow2 + 4 / 29; + const l = 116 * fy - 16; + const a = 500 * (fx - fy); + const b = 200 * (fy - fz); + return [l, a, b]; +} +class ImageChannel { + static intoRGB(width, height, data2, options2 = {}) { + const { + paddingSize = 0, + paddingColorOdd = [255, 0, 255], + paddingColorEven = [0, 255, 0] + } = options2; + const newWidth = width + 2 * paddingSize; + const newHeight = height + 2 * paddingSize; + const r = new Uint8Array(newWidth * newHeight); + const g = new Uint8Array(newWidth * newHeight); + const b = new Uint8Array(newWidth * newHeight); + for (let y = 0; y < newHeight; ++y) { + for (let x = 0; x < newWidth; ++x) { + const index2 = y * newWidth + x; + if (y >= paddingSize && y < newHeight - paddingSize && x >= paddingSize && x < newWidth - paddingSize) { + const offset2 = ((y - paddingSize) * width + (x - paddingSize)) * 4; + const alpha = data2[offset2 + 3] === 255 ? 1 : data2[offset2 + 3] / 255; + r[index2] = blendWithWhite(data2[offset2], alpha); + g[index2] = blendWithWhite(data2[offset2 + 1], alpha); + b[index2] = blendWithWhite(data2[offset2 + 2], alpha); + } else { + const color = (y + x) % 2 === 0 ? paddingColorEven : paddingColorOdd; + r[index2] = color[0]; + g[index2] = color[1]; + b[index2] = color[2]; + } + } + } + return [ + new ImageChannel(newWidth, newHeight, r), + new ImageChannel(newWidth, newHeight, g), + new ImageChannel(newWidth, newHeight, b) + ]; + } + constructor(width, height, data2) { + this.data = data2; + this.width = width; + this.height = height; + } + get(x, y) { + return this.data[y * this.width + x]; + } + boundXY(x, y) { + return [ + Math.min(Math.max(x, 0), this.width - 1), + Math.min(Math.max(y, 0), this.height - 1) + ]; + } +} +const DYNAMIC_RANGE = 2 ** 8 - 1; +function ssim(stats, x1, y1, x2, y2) { + const mean1 = stats.meanC1(x1, y1, x2, y2); + const mean2 = stats.meanC2(x1, y1, x2, y2); + const var1 = stats.varianceC1(x1, y1, x2, y2); + const var2 = stats.varianceC2(x1, y1, x2, y2); + const cov = stats.covariance(x1, y1, x2, y2); + const c1 = (0.01 * DYNAMIC_RANGE) ** 2; + const c2 = (0.03 * DYNAMIC_RANGE) ** 2; + return (2 * mean1 * mean2 + c1) * (2 * cov + c2) / (mean1 ** 2 + mean2 ** 2 + c1) / (var1 + var2 + c2); +} +class FastStats { + constructor(c1, c2) { + this.c1 = c1; + this.c2 = c2; + const { width, height } = c1; + this._partialSumC1 = new Array(width * height); + this._partialSumC2 = new Array(width * height); + this._partialSumSq1 = new Array(width * height); + this._partialSumSq2 = new Array(width * height); + this._partialSumMult = new Array(width * height); + const recalc = (mx, idx, initial, x, y) => { + mx[idx] = initial; + if (y > 0) + mx[idx] += mx[(y - 1) * width + x]; + if (x > 0) + mx[idx] += mx[y * width + x - 1]; + if (x > 0 && y > 0) + mx[idx] -= mx[(y - 1) * width + x - 1]; + }; + for (let y = 0; y < height; ++y) { + for (let x = 0; x < width; ++x) { + const idx = y * width + x; + recalc(this._partialSumC1, idx, this.c1.data[idx], x, y); + recalc(this._partialSumC2, idx, this.c2.data[idx], x, y); + recalc(this._partialSumSq1, idx, this.c1.data[idx] * this.c1.data[idx], x, y); + recalc(this._partialSumSq2, idx, this.c2.data[idx] * this.c2.data[idx], x, y); + recalc(this._partialSumMult, idx, this.c1.data[idx] * this.c2.data[idx], x, y); + } + } + } + _sum(partialSum, x1, y1, x2, y2) { + const width = this.c1.width; + let result = partialSum[y2 * width + x2]; + if (y1 > 0) + result -= partialSum[(y1 - 1) * width + x2]; + if (x1 > 0) + result -= partialSum[y2 * width + x1 - 1]; + if (x1 > 0 && y1 > 0) + result += partialSum[(y1 - 1) * width + x1 - 1]; + return result; + } + meanC1(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return this._sum(this._partialSumC1, x1, y1, x2, y2) / N; + } + meanC2(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return this._sum(this._partialSumC2, x1, y1, x2, y2) / N; + } + varianceC1(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return (this._sum(this._partialSumSq1, x1, y1, x2, y2) - this._sum(this._partialSumC1, x1, y1, x2, y2) ** 2 / N) / N; + } + varianceC2(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return (this._sum(this._partialSumSq2, x1, y1, x2, y2) - this._sum(this._partialSumC2, x1, y1, x2, y2) ** 2 / N) / N; + } + covariance(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return (this._sum(this._partialSumMult, x1, y1, x2, y2) - this._sum(this._partialSumC1, x1, y1, x2, y2) * this._sum(this._partialSumC2, x1, y1, x2, y2) / N) / N; + } +} +const SSIM_WINDOW_RADIUS = 15; +const VARIANCE_WINDOW_RADIUS = 1; +function drawPixel(width, data2, x, y, r, g, b) { + const idx = (y * width + x) * 4; + data2[idx + 0] = r; + data2[idx + 1] = g; + data2[idx + 2] = b; + data2[idx + 3] = 255; +} +function compare(actual, expected, diff3, width, height, options2 = {}) { + const { + maxColorDeltaE94 = 1 + } = options2; + const paddingSize = Math.max(VARIANCE_WINDOW_RADIUS, SSIM_WINDOW_RADIUS); + const paddingColorEven = [255, 0, 255]; + const paddingColorOdd = [0, 255, 0]; + const [r1, g1, b1] = ImageChannel.intoRGB(width, height, expected, { + paddingSize, + paddingColorEven, + paddingColorOdd + }); + const [r2, g2, b2] = ImageChannel.intoRGB(width, height, actual, { + paddingSize, + paddingColorEven, + paddingColorOdd + }); + const noop2 = (x, y) => { + }; + const drawRedPixel = diff3 ? (x, y) => drawPixel(width, diff3, x - paddingSize, y - paddingSize, 255, 0, 0) : noop2; + const drawYellowPixel = diff3 ? (x, y) => drawPixel(width, diff3, x - paddingSize, y - paddingSize, 255, 255, 0) : noop2; + const drawGrayPixel = diff3 ? (x, y) => { + const gray = rgb2gray(r1.get(x, y), g1.get(x, y), b1.get(x, y)); + const value = blendWithWhite(gray, 0.1); + drawPixel(width, diff3, x - paddingSize, y - paddingSize, value, value, value); + } : noop2; + let fastR, fastG, fastB; + let diffCount = 0; + for (let y = paddingSize; y < r1.height - paddingSize; ++y) { + for (let x = paddingSize; x < r1.width - paddingSize; ++x) { + if (r1.get(x, y) === r2.get(x, y) && g1.get(x, y) === g2.get(x, y) && b1.get(x, y) === b2.get(x, y)) { + drawGrayPixel(x, y); + continue; + } + const delta = colorDeltaE94( + [r1.get(x, y), g1.get(x, y), b1.get(x, y)], + [r2.get(x, y), g2.get(x, y), b2.get(x, y)] + ); + if (delta <= maxColorDeltaE94) { + drawGrayPixel(x, y); + continue; + } + if (!fastR || !fastG || !fastB) { + fastR = new FastStats(r1, r2); + fastG = new FastStats(g1, g2); + fastB = new FastStats(b1, b2); + } + const [varX1, varY1] = r1.boundXY(x - VARIANCE_WINDOW_RADIUS, y - VARIANCE_WINDOW_RADIUS); + const [varX2, varY2] = r1.boundXY(x + VARIANCE_WINDOW_RADIUS, y + VARIANCE_WINDOW_RADIUS); + const var1 = fastR.varianceC1(varX1, varY1, varX2, varY2) + fastG.varianceC1(varX1, varY1, varX2, varY2) + fastB.varianceC1(varX1, varY1, varX2, varY2); + const var2 = fastR.varianceC2(varX1, varY1, varX2, varY2) + fastG.varianceC2(varX1, varY1, varX2, varY2) + fastB.varianceC2(varX1, varY1, varX2, varY2); + if (var1 === 0 || var2 === 0) { + drawRedPixel(x, y); + ++diffCount; + continue; + } + const [ssimX1, ssimY1] = r1.boundXY(x - SSIM_WINDOW_RADIUS, y - SSIM_WINDOW_RADIUS); + const [ssimX2, ssimY2] = r1.boundXY(x + SSIM_WINDOW_RADIUS, y + SSIM_WINDOW_RADIUS); + const ssimRGB = (ssim(fastR, ssimX1, ssimY1, ssimX2, ssimY2) + ssim(fastG, ssimX1, ssimY1, ssimX2, ssimY2) + ssim(fastB, ssimX1, ssimY1, ssimX2, ssimY2)) / 3; + const isAntialiased = ssimRGB >= 0.99; + if (isAntialiased) { + drawYellowPixel(x, y); + } else { + drawRedPixel(x, y); + ++diffCount; + } + } + } + return diffCount; +} +var pixelmatch_1; +var hasRequiredPixelmatch; +function requirePixelmatch() { + if (hasRequiredPixelmatch) return pixelmatch_1; + hasRequiredPixelmatch = 1; + pixelmatch_1 = pixelmatch2; + const defaultOptions2 = { + threshold: 0.1, + // matching threshold (0 to 1); smaller is more sensitive + includeAA: false, + // whether to skip anti-aliasing detection + alpha: 0.1, + // opacity of original image in diff output + aaColor: [255, 255, 0], + // color of anti-aliased pixels in diff output + diffColor: [255, 0, 0], + // color of different pixels in diff output + diffColorAlt: null, + // whether to detect dark on light differences between img1 and img2 and set an alternative color to differentiate between the two + diffMask: false + // draw the diff over a transparent background (a mask) + }; + function pixelmatch2(img1, img2, output, width, height, options2) { + if (!isPixelData(img1) || !isPixelData(img2) || output && !isPixelData(output)) + throw new Error("Image data: Uint8Array, Uint8ClampedArray or Buffer expected."); + if (img1.length !== img2.length || output && output.length !== img1.length) + throw new Error("Image sizes do not match."); + if (img1.length !== width * height * 4) throw new Error("Image data size does not match width/height."); + options2 = Object.assign({}, defaultOptions2, options2); + const len = width * height; + const a32 = new Uint32Array(img1.buffer, img1.byteOffset, len); + const b32 = new Uint32Array(img2.buffer, img2.byteOffset, len); + let identical = true; + for (let i = 0; i < len; i++) { + if (a32[i] !== b32[i]) { + identical = false; + break; + } + } + if (identical) { + if (output && !options2.diffMask) { + for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options2.alpha, output); + } + return 0; + } + const maxDelta = 35215 * options2.threshold * options2.threshold; + let diff3 = 0; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const pos = (y * width + x) * 4; + const delta = colorDelta(img1, img2, pos, pos); + if (Math.abs(delta) > maxDelta) { + if (!options2.includeAA && (antialiased(img1, x, y, width, height, img2) || antialiased(img2, x, y, width, height, img1))) { + if (output && !options2.diffMask) drawPixel2(output, pos, ...options2.aaColor); + } else { + if (output) { + drawPixel2(output, pos, ...delta < 0 && options2.diffColorAlt || options2.diffColor); + } + diff3++; + } + } else if (output) { + if (!options2.diffMask) drawGrayPixel(img1, pos, options2.alpha, output); + } + } + } + return diff3; + } + function isPixelData(arr) { + return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1; + } + function antialiased(img, x1, y1, width, height, img2) { + const x0 = Math.max(x1 - 1, 0); + const y0 = Math.max(y1 - 1, 0); + const x2 = Math.min(x1 + 1, width - 1); + const y2 = Math.min(y1 + 1, height - 1); + const pos = (y1 * width + x1) * 4; + let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0; + let min2 = 0; + let max2 = 0; + let minX, minY, maxX, maxY; + for (let x = x0; x <= x2; x++) { + for (let y = y0; y <= y2; y++) { + if (x === x1 && y === y1) continue; + const delta = colorDelta(img, img, pos, (y * width + x) * 4, true); + if (delta === 0) { + zeroes++; + if (zeroes > 2) return false; + } else if (delta < min2) { + min2 = delta; + minX = x; + minY = y; + } else if (delta > max2) { + max2 = delta; + maxX = x; + maxY = y; + } + } + } + if (min2 === 0 || max2 === 0) return false; + return hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height) || hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height); + } + function hasManySiblings(img, x1, y1, width, height) { + const x0 = Math.max(x1 - 1, 0); + const y0 = Math.max(y1 - 1, 0); + const x2 = Math.min(x1 + 1, width - 1); + const y2 = Math.min(y1 + 1, height - 1); + const pos = (y1 * width + x1) * 4; + let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0; + for (let x = x0; x <= x2; x++) { + for (let y = y0; y <= y2; y++) { + if (x === x1 && y === y1) continue; + const pos2 = (y * width + x) * 4; + if (img[pos] === img[pos2] && img[pos + 1] === img[pos2 + 1] && img[pos + 2] === img[pos2 + 2] && img[pos + 3] === img[pos2 + 3]) zeroes++; + if (zeroes > 2) return true; + } + } + return false; + } + function colorDelta(img1, img2, k, m, yOnly) { + let r1 = img1[k + 0]; + let g1 = img1[k + 1]; + let b1 = img1[k + 2]; + let a1 = img1[k + 3]; + let r2 = img2[m + 0]; + let g2 = img2[m + 1]; + let b2 = img2[m + 2]; + let a2 = img2[m + 3]; + if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0; + if (a1 < 255) { + a1 /= 255; + r1 = blend(r1, a1); + g1 = blend(g1, a1); + b1 = blend(b1, a1); + } + if (a2 < 255) { + a2 /= 255; + r2 = blend(r2, a2); + g2 = blend(g2, a2); + b2 = blend(b2, a2); + } + const y1 = rgb2y(r1, g1, b1); + const y2 = rgb2y(r2, g2, b2); + const y = y1 - y2; + if (yOnly) return y; + const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2); + const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2); + const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q; + return y1 > y2 ? -delta : delta; + } + function rgb2y(r, g, b) { + return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; + } + function rgb2i(r, g, b) { + return r * 0.59597799 - g * 0.2741761 - b * 0.32180189; + } + function rgb2q(r, g, b) { + return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; + } + function blend(c, a) { + return 255 + (c - 255) * a; + } + function drawPixel2(output, pos, r, g, b) { + output[pos + 0] = r; + output[pos + 1] = g; + output[pos + 2] = b; + output[pos + 3] = 255; + } + function drawGrayPixel(img, i, alpha, output) { + const r = img[i + 0]; + const g = img[i + 1]; + const b = img[i + 2]; + const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255); + drawPixel2(output, i, val, val, val); + } + return pixelmatch_1; +} +var pixelmatchExports = requirePixelmatch(); +const pixelmatch = /* @__PURE__ */ getDefaultExportFromCjs(pixelmatchExports); +function getComparator(mimeType) { + return compareImages.bind(null, "image/png"); +} +const JPEG_JS_MAX_BUFFER_SIZE_IN_MB = 5 * 1024; +function compareImages(mimeType, actualBuffer, expectedBuffer, options2 = {}) { + if (!actualBuffer || !(actualBuffer instanceof Buffer)) + return { errorMessage: "Actual result should be a Buffer." }; + validateBuffer(expectedBuffer, mimeType); + let actual = mimeType === "image/png" ? PNG.sync.read(actualBuffer) : jpegjs.decode(actualBuffer, { maxMemoryUsageInMB: JPEG_JS_MAX_BUFFER_SIZE_IN_MB }); + let expected = mimeType === "image/png" ? PNG.sync.read(expectedBuffer) : jpegjs.decode(expectedBuffer, { maxMemoryUsageInMB: JPEG_JS_MAX_BUFFER_SIZE_IN_MB }); + const size = { width: Math.max(expected.width, actual.width), height: Math.max(expected.height, actual.height) }; + let sizesMismatchError = ""; + if (expected.width !== actual.width || expected.height !== actual.height) { + sizesMismatchError = `Expected an image ${expected.width}px by ${expected.height}px, received ${actual.width}px by ${actual.height}px. `; + actual = resizeImage(actual, size); + expected = resizeImage(expected, size); + } + const diff22 = new PNG({ width: size.width, height: size.height }); + let count; + if (options2.comparator === "ssim-cie94") { + count = compare(expected.data, actual.data, diff22.data, size.width, size.height, { + // All ΔE* formulae are originally designed to have the difference of 1.0 stand for a "just noticeable difference" (JND). + // See https://en.wikipedia.org/wiki/Color_difference#CIELAB_%CE%94E* + maxColorDeltaE94: 1 + }); + } else if ((options2.comparator ?? "pixelmatch") === "pixelmatch") { + count = pixelmatch(expected.data, actual.data, diff22.data, size.width, size.height, { + threshold: options2.threshold ?? 0.2 + }); + } else { + throw new Error(`Configuration specifies unknown comparator "${options2.comparator}"`); + } + const maxDiffPixels1 = options2.maxDiffPixels; + const maxDiffPixels2 = options2.maxDiffPixelRatio !== void 0 ? expected.width * expected.height * options2.maxDiffPixelRatio : void 0; + let maxDiffPixels; + if (maxDiffPixels1 !== void 0 && maxDiffPixels2 !== void 0) + maxDiffPixels = Math.min(maxDiffPixels1, maxDiffPixels2); + else + maxDiffPixels = maxDiffPixels1 ?? maxDiffPixels2 ?? 0; + const ratio = Math.ceil(count / (expected.width * expected.height) * 100) / 100; + const pixelsMismatchError = count > maxDiffPixels ? `${count} pixels (ratio ${ratio.toFixed(2)} of all image pixels) are different.` : ""; + if (pixelsMismatchError || sizesMismatchError) + return { errorMessage: sizesMismatchError + pixelsMismatchError, diff: PNG.sync.write(diff22) }; + return null; +} +function validateBuffer(buffer2, mimeType) { + if (mimeType === "image/png") { + const pngMagicNumber = [137, 80, 78, 71, 13, 10, 26, 10]; + if (buffer2.length < pngMagicNumber.length || !pngMagicNumber.every((byte, index2) => buffer2[index2] === byte)) + throw new Error("could not decode image as PNG."); + } else if (mimeType === "image/jpeg") { + const jpegMagicNumber = [255, 216]; + if (buffer2.length < jpegMagicNumber.length || !jpegMagicNumber.every((byte, index2) => buffer2[index2] === byte)) + throw new Error("could not decode image as JPEG."); + } +} +function resizeImage(image, size) { + if (image.width === size.width && image.height === size.height) + return image; + const buffer2 = new Uint8Array(size.width * size.height * 4); + for (let y = 0; y < size.height; y++) { + for (let x = 0; x < size.width; x++) { + const to = (y * size.width + x) * 4; + if (y < image.height && x < image.width) { + const from2 = (y * image.width + x) * 4; + buffer2[to] = image.data[from2]; + buffer2[to + 1] = image.data[from2 + 1]; + buffer2[to + 2] = image.data[from2 + 2]; + buffer2[to + 3] = image.data[from2 + 3]; + } else { + buffer2[to] = 0; + buffer2[to + 1] = 0; + buffer2[to + 2] = 0; + buffer2[to + 3] = 0; + } + } + } + return { data: Buffer.from(buffer2), width: size.width, height: size.height }; +} +var cryptoBrowserifyExports = requireCryptoBrowserify(); +const crypto = /* @__PURE__ */ getDefaultExportFromCjs(cryptoBrowserifyExports); +function createGuid() { + return crypto.randomBytes(16).toString("hex"); +} +function calculateSha1(buffer2) { + const hash2 = crypto.createHash("sha1"); + hash2.update(buffer2); + return hash2.digest("hex"); +} +function encodeBase128(value) { + const bytes = []; + do { + let byte = value & 127; + value >>>= 7; + if (bytes.length > 0) + byte |= 128; + bytes.push(byte); + } while (value > 0); + return Buffer.from(bytes.reverse()); +} +class DER { + static encodeSequence(data2) { + return this._encode(48, Buffer.concat(data2)); + } + static encodeInteger(data2) { + assert(data2 >= -128 && data2 <= 127); + return this._encode(2, Buffer.from([data2])); + } + static encodeObjectIdentifier(oid) { + const parts = oid.split(".").map((v) => Number(v)); + const output = [encodeBase128(40 * parts[0] + parts[1])]; + for (let i = 2; i < parts.length; i++) + output.push(encodeBase128(parts[i])); + return this._encode(6, Buffer.concat(output)); + } + static encodeNull() { + return Buffer.from([5, 0]); + } + static encodeSet(data2) { + assert(data2.length === 1, "Only one item in the set is supported. We'd need to sort the data to support more."); + return this._encode(49, Buffer.concat(data2)); + } + static encodeExplicitContextDependent(tag, data2) { + return this._encode(160 + tag, data2); + } + static encodePrintableString(data2) { + return this._encode(19, Buffer.from(data2)); + } + static encodeBitString(data2) { + const unusedBits = 0; + const content = Buffer.concat([Buffer.from([unusedBits]), data2]); + return this._encode(3, content); + } + static encodeDate(date) { + const year = date.getUTCFullYear(); + const isGeneralizedTime = year >= 2050; + const parts = [ + isGeneralizedTime ? year.toString() : year.toString().slice(-2), + (date.getUTCMonth() + 1).toString().padStart(2, "0"), + date.getUTCDate().toString().padStart(2, "0"), + date.getUTCHours().toString().padStart(2, "0"), + date.getUTCMinutes().toString().padStart(2, "0"), + date.getUTCSeconds().toString().padStart(2, "0") + ]; + const encodedDate = parts.join("") + "Z"; + const tag = isGeneralizedTime ? 24 : 23; + return this._encode(tag, Buffer.from(encodedDate)); + } + static _encode(tag, data2) { + const lengthBytes = this._encodeLength(data2.length); + return Buffer.concat([Buffer.from([tag]), lengthBytes, data2]); + } + static _encodeLength(length) { + if (length < 128) { + return Buffer.from([length]); + } else { + const lengthBytes = []; + while (length > 0) { + lengthBytes.unshift(length & 255); + length >>= 8; + } + return Buffer.from([128 | lengthBytes.length, ...lengthBytes]); + } + } +} +function generateSelfSignedCertificate() { + const { privateKey, publicKey } = crypto.generateKeyPairSync("rsa", { modulusLength: 2048 }); + const publicKeyDer = publicKey.export({ type: "pkcs1", format: "der" }); + const oneYearInMilliseconds = 365 * 24 * 60 * 60 * 1e3; + const notBefore = new Date((/* @__PURE__ */ new Date()).getTime() - oneYearInMilliseconds); + const notAfter = new Date((/* @__PURE__ */ new Date()).getTime() + oneYearInMilliseconds); + const tbsCertificate = DER.encodeSequence([ + DER.encodeExplicitContextDependent(0, DER.encodeInteger(1)), + // version + DER.encodeInteger(1), + // serialNumber + DER.encodeSequence([ + DER.encodeObjectIdentifier("1.2.840.113549.1.1.11"), + // sha256WithRSAEncryption PKCS #1 + DER.encodeNull() + ]), + // signature + DER.encodeSequence([ + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.3"), + // commonName X.520 DN component + DER.encodePrintableString("localhost") + ]) + ]), + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.10"), + // organizationName X.520 DN component + DER.encodePrintableString("Playwright Client Certificate Support") + ]) + ]) + ]), + // issuer + DER.encodeSequence([ + DER.encodeDate(notBefore), + // notBefore + DER.encodeDate(notAfter) + // notAfter + ]), + // validity + DER.encodeSequence([ + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.3"), + // commonName X.520 DN component + DER.encodePrintableString("localhost") + ]) + ]), + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.10"), + // organizationName X.520 DN component + DER.encodePrintableString("Playwright Client Certificate Support") + ]) + ]) + ]), + // subject + DER.encodeSequence([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("1.2.840.113549.1.1.1"), + // rsaEncryption PKCS #1 + DER.encodeNull() + ]), + DER.encodeBitString(publicKeyDer) + ]) + // SubjectPublicKeyInfo + ]); + const signature2 = crypto.sign("sha256", tbsCertificate, privateKey); + const certificate2 = DER.encodeSequence([ + tbsCertificate, + DER.encodeSequence([ + DER.encodeObjectIdentifier("1.2.840.113549.1.1.11"), + // sha256WithRSAEncryption PKCS #1 + DER.encodeNull() + ]), + DER.encodeBitString(signature2) + ]); + const certPem = [ + "-----BEGIN CERTIFICATE-----", + // Split the base64 string into lines of 64 characters + certificate2.toString("base64").match(/.{1,64}/g).join("\n"), + "-----END CERTIFICATE-----" + ].join("\n"); + return { + cert: certPem, + key: privateKey.export({ type: "pkcs1", format: "pem" }) + }; +} +function getFromENV(name) { + let value = define_process_env_default[name]; + value = value === void 0 ? define_process_env_default[`npm_config_${name.toLowerCase()}`] : value; + value = value === void 0 ? define_process_env_default[`npm_package_config_${name.toLowerCase()}`] : value; + return value; +} +function getAsBooleanFromENV(name, defaultValue) { + const value = getFromENV(name); + if (value === "false" || value === "0") + return false; + if (value) + return true; + return false; +} +function getPackageManager() { + const env = define_process_env_default.npm_config_user_agent || ""; + if (env.includes("yarn")) + return "yarn"; + if (env.includes("pnpm")) + return "pnpm"; + return "npm"; +} +function getPackageManagerExecCommand() { + const packageManager = getPackageManager(); + if (packageManager === "yarn") + return "yarn"; + if (packageManager === "pnpm") + return "pnpm exec"; + return "npx"; +} +const _debugMode = getFromENV("PWDEBUG") || ""; +function debugMode() { + if (_debugMode === "console") + return "console"; + if (_debugMode === "0" || _debugMode === "false") + return ""; + return _debugMode ? "inspector" : ""; +} +let _isUnderTest = getAsBooleanFromENV("PWTEST_UNDER_TEST"); +function setUnderTest() { + _isUnderTest = true; +} +function isUnderTest() { + return _isUnderTest; +} +class EventsHelper { + static addEventListener(emitter, eventName, handler) { + emitter.on(eventName, handler); + return { emitter, eventName, handler }; + } + static removeEventListeners(listeners) { + for (const listener of listeners) + listener.emitter.removeListener(listener.eventName, listener.handler); + listeners.splice(0, listeners.length); + } +} +const eventsHelper = EventsHelper; +function serializeExpectedTextValues(items, options2 = {}) { + return items.map((i) => ({ + string: isString(i) ? i : void 0, + regexSource: isRegExp$4(i) ? i.source : void 0, + regexFlags: isRegExp$4(i) ? i.flags : void 0, + matchSubstring: options2.matchSubstring, + ignoreCase: options2.ignoreCase, + normalizeWhiteSpace: options2.normalizeWhiteSpace + })); +} +var streamHttp = {}; +var request = { exports: {} }; +var capability = {}; +var hasRequiredCapability; +function requireCapability() { + if (hasRequiredCapability) return capability; + hasRequiredCapability = 1; + (function(exports) { + exports.fetch = isFunction(commonjsGlobal.fetch) && isFunction(commonjsGlobal.ReadableStream); + exports.writableStream = isFunction(commonjsGlobal.WritableStream); + exports.abortController = isFunction(commonjsGlobal.AbortController); + var xhr; + function getXHR() { + if (xhr !== void 0) return xhr; + if (commonjsGlobal.XMLHttpRequest) { + xhr = new commonjsGlobal.XMLHttpRequest(); + try { + xhr.open("GET", commonjsGlobal.XDomainRequest ? "/" : "https://example.com"); + } catch (e) { + xhr = null; + } + } else { + xhr = null; + } + return xhr; + } + function checkTypeSupport(type2) { + var xhr2 = getXHR(); + if (!xhr2) return false; + try { + xhr2.responseType = type2; + return xhr2.responseType === type2; + } catch (e) { + } + return false; + } + exports.arraybuffer = exports.fetch || checkTypeSupport("arraybuffer"); + exports.msstream = !exports.fetch && checkTypeSupport("ms-stream"); + exports.mozchunkedarraybuffer = !exports.fetch && checkTypeSupport("moz-chunked-arraybuffer"); + exports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false); + function isFunction(value) { + return typeof value === "function"; + } + xhr = null; + })(capability); + return capability; +} +var response = {}; +var readableBrowser = { exports: {} }; +var streamBrowser; +var hasRequiredStreamBrowser; +function requireStreamBrowser() { + if (hasRequiredStreamBrowser) return streamBrowser; + hasRequiredStreamBrowser = 1; + streamBrowser = requireEvents().EventEmitter; + return streamBrowser; +} +var buffer_list; +var hasRequiredBuffer_list; +function requireBuffer_list() { + if (hasRequiredBuffer_list) return buffer_list; + hasRequiredBuffer_list = 1; + function ownKeys2(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function(sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source2 = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys2(Object(source2), true).forEach(function(key2) { + _defineProperty2(target, key2, source2[key2]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source2)) : ownKeys2(Object(source2)).forEach(function(key2) { + Object.defineProperty(target, key2, Object.getOwnPropertyDescriptor(source2, key2)); + }); + } + return target; + } + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, _toPropertyKey2(descriptor.key), descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + Object.defineProperty(Constructor, "prototype", { writable: false }); + return Constructor; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return typeof key2 === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return String(input); + } + var _require = requireBuffer$2(), Buffer2 = _require.Buffer; + var _require2 = require$$3, inspect = _require2.inspect; + var custom = inspect && inspect.custom || "inspect"; + function copyBuffer(src2, target, offset2) { + Buffer2.prototype.copy.call(src2, target, offset2); + } + buffer_list = /* @__PURE__ */ function() { + function BufferList() { + _classCallCheck(this, BufferList); + this.head = null; + this.tail = null; + this.length = 0; + } + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join2(s) { + if (this.length === 0) return ""; + var p = this.head; + var ret = "" + p.data; + while (p = p.next) ret += s + p.data; + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer2.alloc(0); + var ret = Buffer2.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + } + // Consumes a specified amount of bytes or characters from the buffered data. + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + if (n < this.head.data.length) { + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + ret = this.shift(); + } else { + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } + // Consumes a specified amount of characters from the buffered data. + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str; + else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + this.length -= c; + return ret; + } + // Consumes a specified amount of bytes from the buffered data. + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer2.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + this.length -= c; + return ret; + } + // Make sure the linked list only shows the minimal necessary information. + }, { + key: custom, + value: function value(_, options2) { + return inspect(this, _objectSpread(_objectSpread({}, options2), {}, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + return BufferList; + }(); + return buffer_list; +} +var destroy_1; +var hasRequiredDestroy; +function requireDestroy() { + if (hasRequiredDestroy) return destroy_1; + hasRequiredDestroy = 1; + function destroy(err, cb) { + var _this = this; + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + return this; + } + if (this._readableState) { + this._readableState.destroyed = true; + } + if (this._writableState) { + this._writableState.destroyed = true; + } + this._destroy(err || null, function(err2) { + if (!cb && err2) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err2); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err2); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err2); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + return this; + } + function emitErrorAndCloseNT(self2, err) { + emitErrorNT(self2, err); + emitCloseNT(self2); + } + function emitCloseNT(self2) { + if (self2._writableState && !self2._writableState.emitClose) return; + if (self2._readableState && !self2._readableState.emitClose) return; + self2.emit("close"); + } + function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } + } + function emitErrorNT(self2, err) { + self2.emit("error", err); + } + function errorOrDestroy(stream2, err) { + var rState = stream2._readableState; + var wState = stream2._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream2.destroy(err); + else stream2.emit("error", err); + } + destroy_1 = { + destroy, + undestroy, + errorOrDestroy + }; + return destroy_1; +} +var errorsBrowser = {}; +var hasRequiredErrorsBrowser; +function requireErrorsBrowser() { + if (hasRequiredErrorsBrowser) return errorsBrowser; + hasRequiredErrorsBrowser = 1; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + var codes = {}; + function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + function getMessage(arg1, arg2, arg3) { + if (typeof message === "string") { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + var NodeError = /* @__PURE__ */ function(_Base) { + _inheritsLoose(NodeError2, _Base); + function NodeError2(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + return NodeError2; + }(Base); + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; + } + function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function(i) { + return String(i); + }); + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(", "), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } + } + function startsWith(str, search, pos) { + return str.substr(0, search.length) === search; + } + function endsWith(str, search, this_len) { + if (this_len === void 0 || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; + } + function includes(str, search, start) { + if (typeof start !== "number") { + start = 0; + } + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } + } + createErrorType("ERR_INVALID_OPT_VALUE", function(name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; + }, TypeError); + createErrorType("ERR_INVALID_ARG_TYPE", function(name, expected, actual) { + var determiner; + if (typeof expected === "string" && startsWith(expected, "not ")) { + determiner = "must not be"; + expected = expected.replace(/^not /, ""); + } else { + determiner = "must be"; + } + var msg; + if (endsWith(name, " argument")) { + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } else { + var type2 = includes(name, ".") ? "property" : "argument"; + msg = 'The "'.concat(name, '" ').concat(type2, " ").concat(determiner, " ").concat(oneOf(expected, "type")); + } + msg += ". Received type ".concat(typeof actual); + return msg; + }, TypeError); + createErrorType("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF"); + createErrorType("ERR_METHOD_NOT_IMPLEMENTED", function(name) { + return "The " + name + " method is not implemented"; + }); + createErrorType("ERR_STREAM_PREMATURE_CLOSE", "Premature close"); + createErrorType("ERR_STREAM_DESTROYED", function(name) { + return "Cannot call " + name + " after a stream was destroyed"; + }); + createErrorType("ERR_MULTIPLE_CALLBACK", "Callback called multiple times"); + createErrorType("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable"); + createErrorType("ERR_STREAM_WRITE_AFTER_END", "write after end"); + createErrorType("ERR_STREAM_NULL_VALUES", "May not write null values to stream", TypeError); + createErrorType("ERR_UNKNOWN_ENCODING", function(arg) { + return "Unknown encoding: " + arg; + }, TypeError); + createErrorType("ERR_STREAM_UNSHIFT_AFTER_END_EVENT", "stream.unshift() after end event"); + errorsBrowser.codes = codes; + return errorsBrowser; +} +var state; +var hasRequiredState; +function requireState() { + if (hasRequiredState) return state; + hasRequiredState = 1; + var ERR_INVALID_OPT_VALUE = requireErrorsBrowser().codes.ERR_INVALID_OPT_VALUE; + function highWaterMarkFrom(options2, isDuplex, duplexKey) { + return options2.highWaterMark != null ? options2.highWaterMark : isDuplex ? options2[duplexKey] : null; + } + function getHighWaterMark(state2, options2, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options2, isDuplex, duplexKey); + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : "highWaterMark"; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + return Math.floor(hwm); + } + return state2.objectMode ? 16 : 16 * 1024; + } + state = { + getHighWaterMark + }; + return state; +} +var _stream_writable; +var hasRequired_stream_writable; +function require_stream_writable() { + if (hasRequired_stream_writable) return _stream_writable; + hasRequired_stream_writable = 1; + _stream_writable = Writable; + function CorkedRequest(state2) { + var _this = this; + this.next = null; + this.entry = null; + this.finish = function() { + onCorkedFinish(_this, state2); + }; + } + var Duplex; + Writable.WritableState = WritableState; + var internalUtil = { + deprecate: requireBrowser$d() + }; + var Stream2 = requireStreamBrowser(); + var Buffer2 = requireBuffer$2().Buffer; + var OurUint8Array = (typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var destroyImpl = requireDestroy(); + var _require = requireState(), getHighWaterMark = _require.getHighWaterMark; + var _require$codes = requireErrorsBrowser().codes, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + var errorOrDestroy = destroyImpl.errorOrDestroy; + requireInherits_browser$1()(Writable, Stream2); + function nop() { + } + function WritableState(options2, stream2, isDuplex) { + Duplex = Duplex || require_stream_duplex(); + options2 = options2 || {}; + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof Duplex; + this.objectMode = !!options2.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options2.writableObjectMode; + this.highWaterMark = getHighWaterMark(this, options2, "writableHighWaterMark", isDuplex); + this.finalCalled = false; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + this.destroyed = false; + var noDecode = options2.decodeStrings === false; + this.decodeStrings = !noDecode; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = function(er) { + onwrite(stream2, er); + }; + this.writecb = null; + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; + this.pendingcb = 0; + this.prefinished = false; + this.errorEmitted = false; + this.emitClose = options2.emitClose !== false; + this.autoDestroy = !!options2.autoDestroy; + this.bufferedRequestCount = 0; + this.corkedRequestsFree = new CorkedRequest(this); + } + WritableState.prototype.getBuffer = function getBuffer() { + var current2 = this.bufferedRequest; + var out = []; + while (current2) { + out.push(current2); + current2 = current2.next; + } + return out; + }; + (function() { + try { + Object.defineProperty(WritableState.prototype, "buffer", { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") + }); + } catch (_) { + } + })(); + var realHasInstance; + if (typeof Symbol === "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === "function") { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); + } else { + realHasInstance = function realHasInstance2(object) { + return object instanceof this; + }; + } + function Writable(options2) { + Duplex = Duplex || require_stream_duplex(); + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options2); + this._writableState = new WritableState(options2, this, isDuplex); + this.writable = true; + if (options2) { + if (typeof options2.write === "function") this._write = options2.write; + if (typeof options2.writev === "function") this._writev = options2.writev; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + if (typeof options2.final === "function") this._final = options2.final; + } + Stream2.call(this); + } + Writable.prototype.pipe = function() { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); + }; + function writeAfterEnd(stream2, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); + errorOrDestroy(stream2, er); + process.nextTick(cb, er); + } + function validChunk(stream2, state2, chunk, cb) { + var er; + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== "string" && !state2.objectMode) { + er = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer"], chunk); + } + if (er) { + errorOrDestroy(stream2, er); + process.nextTick(cb, er); + return false; + } + return true; + } + Writable.prototype.write = function(chunk, encoding2, cb) { + var state2 = this._writableState; + var ret = false; + var isBuf = !state2.objectMode && _isUint8Array(chunk); + if (isBuf && !Buffer2.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + if (isBuf) encoding2 = "buffer"; + else if (!encoding2) encoding2 = state2.defaultEncoding; + if (typeof cb !== "function") cb = nop; + if (state2.ending) writeAfterEnd(this, cb); + else if (isBuf || validChunk(this, state2, chunk, cb)) { + state2.pendingcb++; + ret = writeOrBuffer(this, state2, isBuf, chunk, encoding2, cb); + } + return ret; + }; + Writable.prototype.cork = function() { + this._writableState.corked++; + }; + Writable.prototype.uncork = function() { + var state2 = this._writableState; + if (state2.corked) { + state2.corked--; + if (!state2.writing && !state2.corked && !state2.bufferProcessing && state2.bufferedRequest) clearBuffer(this, state2); + } + }; + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding2) { + if (typeof encoding2 === "string") encoding2 = encoding2.toLowerCase(); + if (!(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((encoding2 + "").toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding2); + this._writableState.defaultEncoding = encoding2; + return this; + }; + Object.defineProperty(Writable.prototype, "writableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState && this._writableState.getBuffer(); + } + }); + function decodeChunk(state2, chunk, encoding2) { + if (!state2.objectMode && state2.decodeStrings !== false && typeof chunk === "string") { + chunk = Buffer2.from(chunk, encoding2); + } + return chunk; + } + Object.defineProperty(Writable.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.highWaterMark; + } + }); + function writeOrBuffer(stream2, state2, isBuf, chunk, encoding2, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state2, chunk, encoding2); + if (chunk !== newChunk) { + isBuf = true; + encoding2 = "buffer"; + chunk = newChunk; + } + } + var len = state2.objectMode ? 1 : chunk.length; + state2.length += len; + var ret = state2.length < state2.highWaterMark; + if (!ret) state2.needDrain = true; + if (state2.writing || state2.corked) { + var last = state2.lastBufferedRequest; + state2.lastBufferedRequest = { + chunk, + encoding: encoding2, + isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state2.lastBufferedRequest; + } else { + state2.bufferedRequest = state2.lastBufferedRequest; + } + state2.bufferedRequestCount += 1; + } else { + doWrite(stream2, state2, false, len, chunk, encoding2, cb); + } + return ret; + } + function doWrite(stream2, state2, writev2, len, chunk, encoding2, cb) { + state2.writelen = len; + state2.writecb = cb; + state2.writing = true; + state2.sync = true; + if (state2.destroyed) state2.onwrite(new ERR_STREAM_DESTROYED("write")); + else if (writev2) stream2._writev(chunk, state2.onwrite); + else stream2._write(chunk, encoding2, state2.onwrite); + state2.sync = false; + } + function onwriteError(stream2, state2, sync, er, cb) { + --state2.pendingcb; + if (sync) { + process.nextTick(cb, er); + process.nextTick(finishMaybe, stream2, state2); + stream2._writableState.errorEmitted = true; + errorOrDestroy(stream2, er); + } else { + cb(er); + stream2._writableState.errorEmitted = true; + errorOrDestroy(stream2, er); + finishMaybe(stream2, state2); + } + } + function onwriteStateUpdate(state2) { + state2.writing = false; + state2.writecb = null; + state2.length -= state2.writelen; + state2.writelen = 0; + } + function onwrite(stream2, er) { + var state2 = stream2._writableState; + var sync = state2.sync; + var cb = state2.writecb; + if (typeof cb !== "function") throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state2); + if (er) onwriteError(stream2, state2, sync, er, cb); + else { + var finished = needFinish(state2) || stream2.destroyed; + if (!finished && !state2.corked && !state2.bufferProcessing && state2.bufferedRequest) { + clearBuffer(stream2, state2); + } + if (sync) { + process.nextTick(afterWrite, stream2, state2, finished, cb); + } else { + afterWrite(stream2, state2, finished, cb); + } + } + } + function afterWrite(stream2, state2, finished, cb) { + if (!finished) onwriteDrain(stream2, state2); + state2.pendingcb--; + cb(); + finishMaybe(stream2, state2); + } + function onwriteDrain(stream2, state2) { + if (state2.length === 0 && state2.needDrain) { + state2.needDrain = false; + stream2.emit("drain"); + } + } + function clearBuffer(stream2, state2) { + state2.bufferProcessing = true; + var entry = state2.bufferedRequest; + if (stream2._writev && entry && entry.next) { + var l = state2.bufferedRequestCount; + var buffer2 = new Array(l); + var holder = state2.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + while (entry) { + buffer2[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer2.allBuffers = allBuffers; + doWrite(stream2, state2, true, state2.length, buffer2, "", holder.finish); + state2.pendingcb++; + state2.lastBufferedRequest = null; + if (holder.next) { + state2.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state2.corkedRequestsFree = new CorkedRequest(state2); + } + state2.bufferedRequestCount = 0; + } else { + while (entry) { + var chunk = entry.chunk; + var encoding2 = entry.encoding; + var cb = entry.callback; + var len = state2.objectMode ? 1 : chunk.length; + doWrite(stream2, state2, false, len, chunk, encoding2, cb); + entry = entry.next; + state2.bufferedRequestCount--; + if (state2.writing) { + break; + } + } + if (entry === null) state2.lastBufferedRequest = null; + } + state2.bufferedRequest = entry; + state2.bufferProcessing = false; + } + Writable.prototype._write = function(chunk, encoding2, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED("_write()")); + }; + Writable.prototype._writev = null; + Writable.prototype.end = function(chunk, encoding2, cb) { + var state2 = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding2 = null; + } else if (typeof encoding2 === "function") { + cb = encoding2; + encoding2 = null; + } + if (chunk !== null && chunk !== void 0) this.write(chunk, encoding2); + if (state2.corked) { + state2.corked = 1; + this.uncork(); + } + if (!state2.ending) endWritable(this, state2, cb); + return this; + }; + Object.defineProperty(Writable.prototype, "writableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.length; + } + }); + function needFinish(state2) { + return state2.ending && state2.length === 0 && state2.bufferedRequest === null && !state2.finished && !state2.writing; + } + function callFinal(stream2, state2) { + stream2._final(function(err) { + state2.pendingcb--; + if (err) { + errorOrDestroy(stream2, err); + } + state2.prefinished = true; + stream2.emit("prefinish"); + finishMaybe(stream2, state2); + }); + } + function prefinish(stream2, state2) { + if (!state2.prefinished && !state2.finalCalled) { + if (typeof stream2._final === "function" && !state2.destroyed) { + state2.pendingcb++; + state2.finalCalled = true; + process.nextTick(callFinal, stream2, state2); + } else { + state2.prefinished = true; + stream2.emit("prefinish"); + } + } + } + function finishMaybe(stream2, state2) { + var need = needFinish(state2); + if (need) { + prefinish(stream2, state2); + if (state2.pendingcb === 0) { + state2.finished = true; + stream2.emit("finish"); + if (state2.autoDestroy) { + var rState = stream2._readableState; + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream2.destroy(); + } + } + } + } + return need; + } + function endWritable(stream2, state2, cb) { + state2.ending = true; + finishMaybe(stream2, state2); + if (cb) { + if (state2.finished) process.nextTick(cb); + else stream2.once("finish", cb); + } + state2.ended = true; + stream2.writable = false; + } + function onCorkedFinish(corkReq, state2, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state2.pendingcb--; + cb(err); + entry = entry.next; + } + state2.corkedRequestsFree.next = corkReq; + } + Object.defineProperty(Writable.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._writableState === void 0) { + return false; + } + return this._writableState.destroyed; + }, + set: function set2(value) { + if (!this._writableState) { + return; + } + this._writableState.destroyed = value; + } + }); + Writable.prototype.destroy = destroyImpl.destroy; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function(err, cb) { + cb(err); + }; + return _stream_writable; +} +var _stream_duplex; +var hasRequired_stream_duplex; +function require_stream_duplex() { + if (hasRequired_stream_duplex) return _stream_duplex; + hasRequired_stream_duplex = 1; + var objectKeys2 = Object.keys || function(obj) { + var keys2 = []; + for (var key2 in obj) keys2.push(key2); + return keys2; + }; + _stream_duplex = Duplex; + var Readable = require_stream_readable(); + var Writable = require_stream_writable(); + requireInherits_browser$1()(Duplex, Readable); + { + var keys = objectKeys2(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + } + function Duplex(options2) { + if (!(this instanceof Duplex)) return new Duplex(options2); + Readable.call(this, options2); + Writable.call(this, options2); + this.allowHalfOpen = true; + if (options2) { + if (options2.readable === false) this.readable = false; + if (options2.writable === false) this.writable = false; + if (options2.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once("end", onend); + } + } + } + Object.defineProperty(Duplex.prototype, "writableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.highWaterMark; + } + }); + Object.defineProperty(Duplex.prototype, "writableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState && this._writableState.getBuffer(); + } + }); + Object.defineProperty(Duplex.prototype, "writableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._writableState.length; + } + }); + function onend() { + if (this._writableState.ended) return; + process.nextTick(onEndNT, this); + } + function onEndNT(self2) { + self2.end(); + } + Object.defineProperty(Duplex.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._readableState === void 0 || this._writableState === void 0) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set2(value) { + if (this._readableState === void 0 || this._writableState === void 0) { + return; + } + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }); + return _stream_duplex; +} +var endOfStream; +var hasRequiredEndOfStream; +function requireEndOfStream() { + if (hasRequiredEndOfStream) return endOfStream; + hasRequiredEndOfStream = 1; + var ERR_STREAM_PREMATURE_CLOSE = requireErrorsBrowser().codes.ERR_STREAM_PREMATURE_CLOSE; + function once2(callback) { + var called = false; + return function() { + if (called) return; + called = true; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + callback.apply(this, args); + }; + } + function noop2() { + } + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + function eos(stream2, opts, callback) { + if (typeof opts === "function") return eos(stream2, null, opts); + if (!opts) opts = {}; + callback = once2(callback || noop2); + var readable2 = opts.readable || opts.readable !== false && stream2.readable; + var writable2 = opts.writable || opts.writable !== false && stream2.writable; + var onlegacyfinish = function onlegacyfinish2() { + if (!stream2.writable) onfinish(); + }; + var writableEnded = stream2._writableState && stream2._writableState.finished; + var onfinish = function onfinish2() { + writable2 = false; + writableEnded = true; + if (!readable2) callback.call(stream2); + }; + var readableEnded = stream2._readableState && stream2._readableState.endEmitted; + var onend = function onend2() { + readable2 = false; + readableEnded = true; + if (!writable2) callback.call(stream2); + }; + var onerror = function onerror2(err) { + callback.call(stream2, err); + }; + var onclose = function onclose2() { + var err; + if (readable2 && !readableEnded) { + if (!stream2._readableState || !stream2._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream2, err); + } + if (writable2 && !writableEnded) { + if (!stream2._writableState || !stream2._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream2, err); + } + }; + var onrequest = function onrequest2() { + stream2.req.on("finish", onfinish); + }; + if (isRequest(stream2)) { + stream2.on("complete", onfinish); + stream2.on("abort", onclose); + if (stream2.req) onrequest(); + else stream2.on("request", onrequest); + } else if (writable2 && !stream2._writableState) { + stream2.on("end", onlegacyfinish); + stream2.on("close", onlegacyfinish); + } + stream2.on("end", onend); + stream2.on("finish", onfinish); + if (opts.error !== false) stream2.on("error", onerror); + stream2.on("close", onclose); + return function() { + stream2.removeListener("complete", onfinish); + stream2.removeListener("abort", onclose); + stream2.removeListener("request", onrequest); + if (stream2.req) stream2.req.removeListener("finish", onfinish); + stream2.removeListener("end", onlegacyfinish); + stream2.removeListener("close", onlegacyfinish); + stream2.removeListener("finish", onfinish); + stream2.removeListener("end", onend); + stream2.removeListener("error", onerror); + stream2.removeListener("close", onclose); + }; + } + endOfStream = eos; + return endOfStream; +} +var async_iterator; +var hasRequiredAsync_iterator; +function requireAsync_iterator() { + if (hasRequiredAsync_iterator) return async_iterator; + hasRequiredAsync_iterator = 1; + var _Object$setPrototypeO; + function _defineProperty2(obj, key2, value) { + key2 = _toPropertyKey2(key2); + if (key2 in obj) { + Object.defineProperty(obj, key2, { value, enumerable: true, configurable: true, writable: true }); + } else { + obj[key2] = value; + } + return obj; + } + function _toPropertyKey2(arg) { + var key2 = _toPrimitive2(arg, "string"); + return typeof key2 === "symbol" ? key2 : String(key2); + } + function _toPrimitive2(input, hint) { + if (typeof input !== "object" || input === null) return input; + var prim = input[Symbol.toPrimitive]; + if (prim !== void 0) { + var res = prim.call(input, hint); + if (typeof res !== "object") return res; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return (hint === "string" ? String : Number)(input); + } + var finished = requireEndOfStream(); + var kLastResolve = Symbol("lastResolve"); + var kLastReject = Symbol("lastReject"); + var kError = Symbol("error"); + var kEnded = Symbol("ended"); + var kLastPromise = Symbol("lastPromise"); + var kHandlePromise = Symbol("handlePromise"); + var kStream = Symbol("stream"); + function createIterResult(value, done) { + return { + value, + done + }; + } + function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + if (resolve !== null) { + var data2 = iter[kStream].read(); + if (data2 !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data2, false)); + } + } + } + function onReadable(iter) { + process.nextTick(readAndResolve, iter); + } + function wrapForNext(lastPromise, iter) { + return function(resolve, reject) { + lastPromise.then(function() { + if (iter[kEnded]) { + resolve(createIterResult(void 0, true)); + return; + } + iter[kHandlePromise](resolve, reject); + }, reject); + }; + } + var AsyncIteratorPrototype = Object.getPrototypeOf(function() { + }); + var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + next: function next() { + var _this = this; + var error2 = this[kError]; + if (error2 !== null) { + return Promise.reject(error2); + } + if (this[kEnded]) { + return Promise.resolve(createIterResult(void 0, true)); + } + if (this[kStream].destroyed) { + return new Promise(function(resolve, reject) { + process.nextTick(function() { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(void 0, true)); + } + }); + }); + } + var lastPromise = this[kLastPromise]; + var promise; + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + var data2 = this[kStream].read(); + if (data2 !== null) { + return Promise.resolve(createIterResult(data2, false)); + } + promise = new Promise(this[kHandlePromise]); + } + this[kLastPromise] = promise; + return promise; + } + }, _defineProperty2(_Object$setPrototypeO, Symbol.asyncIterator, function() { + return this; + }), _defineProperty2(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + return new Promise(function(resolve, reject) { + _this2[kStream].destroy(null, function(err) { + if (err) { + reject(err); + return; + } + resolve(createIterResult(void 0, true)); + }); + }); + }), _Object$setPrototypeO), AsyncIteratorPrototype); + var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator2(stream2) { + var _Object$create; + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty2(_Object$create, kStream, { + value: stream2, + writable: true + }), _defineProperty2(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty2(_Object$create, kEnded, { + value: stream2._readableState.endEmitted, + writable: true + }), _defineProperty2(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data2 = iterator[kStream].read(); + if (data2) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data2, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream2, function(err) { + if (err && err.code !== "ERR_STREAM_PREMATURE_CLOSE") { + var reject = iterator[kLastReject]; + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + iterator[kError] = err; + return; + } + var resolve = iterator[kLastResolve]; + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(void 0, true)); + } + iterator[kEnded] = true; + }); + stream2.on("readable", onReadable.bind(null, iterator)); + return iterator; + }; + async_iterator = createReadableStreamAsyncIterator; + return async_iterator; +} +var fromBrowser; +var hasRequiredFromBrowser; +function requireFromBrowser() { + if (hasRequiredFromBrowser) return fromBrowser; + hasRequiredFromBrowser = 1; + fromBrowser = function() { + throw new Error("Readable.from is not available in the browser"); + }; + return fromBrowser; +} +var _stream_readable; +var hasRequired_stream_readable; +function require_stream_readable() { + if (hasRequired_stream_readable) return _stream_readable; + hasRequired_stream_readable = 1; + _stream_readable = Readable; + var Duplex; + Readable.ReadableState = ReadableState; + requireEvents().EventEmitter; + var EElistenerCount = function EElistenerCount2(emitter, type2) { + return emitter.listeners(type2).length; + }; + var Stream2 = requireStreamBrowser(); + var Buffer2 = requireBuffer$2().Buffer; + var OurUint8Array = (typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var debugUtil = require$$3; + var debug2; + if (debugUtil && debugUtil.debuglog) { + debug2 = debugUtil.debuglog("stream"); + } else { + debug2 = function debug3() { + }; + } + var BufferList = requireBuffer_list(); + var destroyImpl = requireDestroy(); + var _require = requireState(), getHighWaterMark = _require.getHighWaterMark; + var _require$codes = requireErrorsBrowser().codes, ERR_INVALID_ARG_TYPE2 = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; + var StringDecoder; + var createReadableStreamAsyncIterator; + var from2; + requireInherits_browser$1()(Readable, Stream2); + var errorOrDestroy = destroyImpl.errorOrDestroy; + var kProxyEvents = ["error", "close", "destroy", "pause", "resume"]; + function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === "function") return emitter.prependListener(event, fn); + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn); + else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn); + else emitter._events[event] = [fn, emitter._events[event]]; + } + function ReadableState(options2, stream2, isDuplex) { + Duplex = Duplex || require_stream_duplex(); + options2 = options2 || {}; + if (typeof isDuplex !== "boolean") isDuplex = stream2 instanceof Duplex; + this.objectMode = !!options2.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options2.readableObjectMode; + this.highWaterMark = getHighWaterMark(this, options2, "readableHighWaterMark", isDuplex); + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + this.sync = true; + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; + this.emitClose = options2.emitClose !== false; + this.autoDestroy = !!options2.autoDestroy; + this.destroyed = false; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.awaitDrain = 0; + this.readingMore = false; + this.decoder = null; + this.encoding = null; + if (options2.encoding) { + if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder; + this.decoder = new StringDecoder(options2.encoding); + this.encoding = options2.encoding; + } + } + function Readable(options2) { + Duplex = Duplex || require_stream_duplex(); + if (!(this instanceof Readable)) return new Readable(options2); + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options2, this, isDuplex); + this.readable = true; + if (options2) { + if (typeof options2.read === "function") this._read = options2.read; + if (typeof options2.destroy === "function") this._destroy = options2.destroy; + } + Stream2.call(this); + } + Object.defineProperty(Readable.prototype, "destroyed", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + if (this._readableState === void 0) { + return false; + } + return this._readableState.destroyed; + }, + set: function set2(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + } + }); + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function(err, cb) { + cb(err); + }; + Readable.prototype.push = function(chunk, encoding2) { + var state2 = this._readableState; + var skipChunkCheck; + if (!state2.objectMode) { + if (typeof chunk === "string") { + encoding2 = encoding2 || state2.defaultEncoding; + if (encoding2 !== state2.encoding) { + chunk = Buffer2.from(chunk, encoding2); + encoding2 = ""; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + return readableAddChunk(this, chunk, encoding2, false, skipChunkCheck); + }; + Readable.prototype.unshift = function(chunk) { + return readableAddChunk(this, chunk, null, true, false); + }; + function readableAddChunk(stream2, chunk, encoding2, addToFront, skipChunkCheck) { + debug2("readableAddChunk", chunk); + var state2 = stream2._readableState; + if (chunk === null) { + state2.reading = false; + onEofChunk(stream2, state2); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state2, chunk); + if (er) { + errorOrDestroy(stream2, er); + } else if (state2.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== "string" && !state2.objectMode && Object.getPrototypeOf(chunk) !== Buffer2.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (addToFront) { + if (state2.endEmitted) errorOrDestroy(stream2, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else addChunk(stream2, state2, chunk, true); + } else if (state2.ended) { + errorOrDestroy(stream2, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state2.destroyed) { + return false; + } else { + state2.reading = false; + if (state2.decoder && !encoding2) { + chunk = state2.decoder.write(chunk); + if (state2.objectMode || chunk.length !== 0) addChunk(stream2, state2, chunk, false); + else maybeReadMore(stream2, state2); + } else { + addChunk(stream2, state2, chunk, false); + } + } + } else if (!addToFront) { + state2.reading = false; + maybeReadMore(stream2, state2); + } + } + return !state2.ended && (state2.length < state2.highWaterMark || state2.length === 0); + } + function addChunk(stream2, state2, chunk, addToFront) { + if (state2.flowing && state2.length === 0 && !state2.sync) { + state2.awaitDrain = 0; + stream2.emit("data", chunk); + } else { + state2.length += state2.objectMode ? 1 : chunk.length; + if (addToFront) state2.buffer.unshift(chunk); + else state2.buffer.push(chunk); + if (state2.needReadable) emitReadable(stream2); + } + maybeReadMore(stream2, state2); + } + function chunkInvalid(state2, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== "string" && chunk !== void 0 && !state2.objectMode) { + er = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + return er; + } + Readable.prototype.isPaused = function() { + return this._readableState.flowing === false; + }; + Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) StringDecoder = requireString_decoder().StringDecoder; + var decoder2 = new StringDecoder(enc); + this._readableState.decoder = decoder2; + this._readableState.encoding = this._readableState.decoder.encoding; + var p = this._readableState.buffer.head; + var content = ""; + while (p !== null) { + content += decoder2.write(p.data); + p = p.next; + } + this._readableState.buffer.clear(); + if (content !== "") this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; + }; + var MAX_HWM = 1073741824; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + function howMuchToRead(n, state2) { + if (n <= 0 || state2.length === 0 && state2.ended) return 0; + if (state2.objectMode) return 1; + if (n !== n) { + if (state2.flowing && state2.length) return state2.buffer.head.data.length; + else return state2.length; + } + if (n > state2.highWaterMark) state2.highWaterMark = computeNewHighWaterMark(n); + if (n <= state2.length) return n; + if (!state2.ended) { + state2.needReadable = true; + return 0; + } + return state2.length; + } + Readable.prototype.read = function(n) { + debug2("read", n); + n = parseInt(n, 10); + var state2 = this._readableState; + var nOrig = n; + if (n !== 0) state2.emittedReadable = false; + if (n === 0 && state2.needReadable && ((state2.highWaterMark !== 0 ? state2.length >= state2.highWaterMark : state2.length > 0) || state2.ended)) { + debug2("read: emitReadable", state2.length, state2.ended); + if (state2.length === 0 && state2.ended) endReadable(this); + else emitReadable(this); + return null; + } + n = howMuchToRead(n, state2); + if (n === 0 && state2.ended) { + if (state2.length === 0) endReadable(this); + return null; + } + var doRead = state2.needReadable; + debug2("need readable", doRead); + if (state2.length === 0 || state2.length - n < state2.highWaterMark) { + doRead = true; + debug2("length less than watermark", doRead); + } + if (state2.ended || state2.reading) { + doRead = false; + debug2("reading or ended", doRead); + } else if (doRead) { + debug2("do read"); + state2.reading = true; + state2.sync = true; + if (state2.length === 0) state2.needReadable = true; + this._read(state2.highWaterMark); + state2.sync = false; + if (!state2.reading) n = howMuchToRead(nOrig, state2); + } + var ret; + if (n > 0) ret = fromList(n, state2); + else ret = null; + if (ret === null) { + state2.needReadable = state2.length <= state2.highWaterMark; + n = 0; + } else { + state2.length -= n; + state2.awaitDrain = 0; + } + if (state2.length === 0) { + if (!state2.ended) state2.needReadable = true; + if (nOrig !== n && state2.ended) endReadable(this); + } + if (ret !== null) this.emit("data", ret); + return ret; + }; + function onEofChunk(stream2, state2) { + debug2("onEofChunk"); + if (state2.ended) return; + if (state2.decoder) { + var chunk = state2.decoder.end(); + if (chunk && chunk.length) { + state2.buffer.push(chunk); + state2.length += state2.objectMode ? 1 : chunk.length; + } + } + state2.ended = true; + if (state2.sync) { + emitReadable(stream2); + } else { + state2.needReadable = false; + if (!state2.emittedReadable) { + state2.emittedReadable = true; + emitReadable_(stream2); + } + } + } + function emitReadable(stream2) { + var state2 = stream2._readableState; + debug2("emitReadable", state2.needReadable, state2.emittedReadable); + state2.needReadable = false; + if (!state2.emittedReadable) { + debug2("emitReadable", state2.flowing); + state2.emittedReadable = true; + process.nextTick(emitReadable_, stream2); + } + } + function emitReadable_(stream2) { + var state2 = stream2._readableState; + debug2("emitReadable_", state2.destroyed, state2.length, state2.ended); + if (!state2.destroyed && (state2.length || state2.ended)) { + stream2.emit("readable"); + state2.emittedReadable = false; + } + state2.needReadable = !state2.flowing && !state2.ended && state2.length <= state2.highWaterMark; + flow(stream2); + } + function maybeReadMore(stream2, state2) { + if (!state2.readingMore) { + state2.readingMore = true; + process.nextTick(maybeReadMore_, stream2, state2); + } + } + function maybeReadMore_(stream2, state2) { + while (!state2.reading && !state2.ended && (state2.length < state2.highWaterMark || state2.flowing && state2.length === 0)) { + var len = state2.length; + debug2("maybeReadMore read 0"); + stream2.read(0); + if (len === state2.length) + break; + } + state2.readingMore = false; + } + Readable.prototype._read = function(n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED("_read()")); + }; + Readable.prototype.pipe = function(dest, pipeOpts) { + var src2 = this; + var state2 = this._readableState; + switch (state2.pipesCount) { + case 0: + state2.pipes = dest; + break; + case 1: + state2.pipes = [state2.pipes, dest]; + break; + default: + state2.pipes.push(dest); + break; + } + state2.pipesCount += 1; + debug2("pipe count=%d opts=%j", state2.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state2.endEmitted) process.nextTick(endFn); + else src2.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable2, unpipeInfo) { + debug2("onunpipe"); + if (readable2 === src2) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + function onend() { + debug2("onend"); + dest.end(); + } + var ondrain = pipeOnDrain(src2); + dest.on("drain", ondrain); + var cleanedUp = false; + function cleanup() { + debug2("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + dest.removeListener("drain", ondrain); + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src2.removeListener("end", onend); + src2.removeListener("end", unpipe); + src2.removeListener("data", ondata); + cleanedUp = true; + if (state2.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + src2.on("data", ondata); + function ondata(chunk) { + debug2("ondata"); + var ret = dest.write(chunk); + debug2("dest.write", ret); + if (ret === false) { + if ((state2.pipesCount === 1 && state2.pipes === dest || state2.pipesCount > 1 && indexOf(state2.pipes, dest) !== -1) && !cleanedUp) { + debug2("false write response, pause", state2.awaitDrain); + state2.awaitDrain++; + } + src2.pause(); + } + } + function onerror(er) { + debug2("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (EElistenerCount(dest, "error") === 0) errorOrDestroy(dest, er); + } + prependListener(dest, "error", onerror); + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug2("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + debug2("unpipe"); + src2.unpipe(dest); + } + dest.emit("pipe", src2); + if (!state2.flowing) { + debug2("pipe resume"); + src2.resume(); + } + return dest; + }; + function pipeOnDrain(src2) { + return function pipeOnDrainFunctionResult() { + var state2 = src2._readableState; + debug2("pipeOnDrain", state2.awaitDrain); + if (state2.awaitDrain) state2.awaitDrain--; + if (state2.awaitDrain === 0 && EElistenerCount(src2, "data")) { + state2.flowing = true; + flow(src2); + } + }; + } + Readable.prototype.unpipe = function(dest) { + var state2 = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; + if (state2.pipesCount === 0) return this; + if (state2.pipesCount === 1) { + if (dest && dest !== state2.pipes) return this; + if (!dest) dest = state2.pipes; + state2.pipes = null; + state2.pipesCount = 0; + state2.flowing = false; + if (dest) dest.emit("unpipe", this, unpipeInfo); + return this; + } + if (!dest) { + var dests = state2.pipes; + var len = state2.pipesCount; + state2.pipes = null; + state2.pipesCount = 0; + state2.flowing = false; + for (var i = 0; i < len; i++) dests[i].emit("unpipe", this, { + hasUnpiped: false + }); + return this; + } + var index2 = indexOf(state2.pipes, dest); + if (index2 === -1) return this; + state2.pipes.splice(index2, 1); + state2.pipesCount -= 1; + if (state2.pipesCount === 1) state2.pipes = state2.pipes[0]; + dest.emit("unpipe", this, unpipeInfo); + return this; + }; + Readable.prototype.on = function(ev, fn) { + var res = Stream2.prototype.on.call(this, ev, fn); + var state2 = this._readableState; + if (ev === "data") { + state2.readableListening = this.listenerCount("readable") > 0; + if (state2.flowing !== false) this.resume(); + } else if (ev === "readable") { + if (!state2.endEmitted && !state2.readableListening) { + state2.readableListening = state2.needReadable = true; + state2.flowing = false; + state2.emittedReadable = false; + debug2("on readable", state2.length, state2.reading); + if (state2.length) { + emitReadable(this); + } else if (!state2.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + Readable.prototype.removeListener = function(ev, fn) { + var res = Stream2.prototype.removeListener.call(this, ev, fn); + if (ev === "readable") { + process.nextTick(updateReadableListening, this); + } + return res; + }; + Readable.prototype.removeAllListeners = function(ev) { + var res = Stream2.prototype.removeAllListeners.apply(this, arguments); + if (ev === "readable" || ev === void 0) { + process.nextTick(updateReadableListening, this); + } + return res; + }; + function updateReadableListening(self2) { + var state2 = self2._readableState; + state2.readableListening = self2.listenerCount("readable") > 0; + if (state2.resumeScheduled && !state2.paused) { + state2.flowing = true; + } else if (self2.listenerCount("data") > 0) { + self2.resume(); + } + } + function nReadingNextTick(self2) { + debug2("readable nexttick read 0"); + self2.read(0); + } + Readable.prototype.resume = function() { + var state2 = this._readableState; + if (!state2.flowing) { + debug2("resume"); + state2.flowing = !state2.readableListening; + resume(this, state2); + } + state2.paused = false; + return this; + }; + function resume(stream2, state2) { + if (!state2.resumeScheduled) { + state2.resumeScheduled = true; + process.nextTick(resume_, stream2, state2); + } + } + function resume_(stream2, state2) { + debug2("resume", state2.reading); + if (!state2.reading) { + stream2.read(0); + } + state2.resumeScheduled = false; + stream2.emit("resume"); + flow(stream2); + if (state2.flowing && !state2.reading) stream2.read(0); + } + Readable.prototype.pause = function() { + debug2("call pause flowing=%j", this._readableState.flowing); + if (this._readableState.flowing !== false) { + debug2("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + this._readableState.paused = true; + return this; + }; + function flow(stream2) { + var state2 = stream2._readableState; + debug2("flow", state2.flowing); + while (state2.flowing && stream2.read() !== null) ; + } + Readable.prototype.wrap = function(stream2) { + var _this = this; + var state2 = this._readableState; + var paused = false; + stream2.on("end", function() { + debug2("wrapped end"); + if (state2.decoder && !state2.ended) { + var chunk = state2.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + _this.push(null); + }); + stream2.on("data", function(chunk) { + debug2("wrapped data"); + if (state2.decoder) chunk = state2.decoder.write(chunk); + if (state2.objectMode && (chunk === null || chunk === void 0)) return; + else if (!state2.objectMode && (!chunk || !chunk.length)) return; + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream2.pause(); + } + }); + for (var i in stream2) { + if (this[i] === void 0 && typeof stream2[i] === "function") { + this[i] = /* @__PURE__ */ function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream2[method].apply(stream2, arguments); + }; + }(i); + } + } + for (var n = 0; n < kProxyEvents.length; n++) { + stream2.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + this._read = function(n2) { + debug2("wrapped _read", n2); + if (paused) { + paused = false; + stream2.resume(); + } + }; + return this; + }; + if (typeof Symbol === "function") { + Readable.prototype[Symbol.asyncIterator] = function() { + if (createReadableStreamAsyncIterator === void 0) { + createReadableStreamAsyncIterator = requireAsync_iterator(); + } + return createReadableStreamAsyncIterator(this); + }; + } + Object.defineProperty(Readable.prototype, "readableHighWaterMark", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.highWaterMark; + } + }); + Object.defineProperty(Readable.prototype, "readableBuffer", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState && this._readableState.buffer; + } + }); + Object.defineProperty(Readable.prototype, "readableFlowing", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.flowing; + }, + set: function set2(state2) { + if (this._readableState) { + this._readableState.flowing = state2; + } + } + }); + Readable._fromList = fromList; + Object.defineProperty(Readable.prototype, "readableLength", { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get2() { + return this._readableState.length; + } + }); + function fromList(n, state2) { + if (state2.length === 0) return null; + var ret; + if (state2.objectMode) ret = state2.buffer.shift(); + else if (!n || n >= state2.length) { + if (state2.decoder) ret = state2.buffer.join(""); + else if (state2.buffer.length === 1) ret = state2.buffer.first(); + else ret = state2.buffer.concat(state2.length); + state2.buffer.clear(); + } else { + ret = state2.buffer.consume(n, state2.decoder); + } + return ret; + } + function endReadable(stream2) { + var state2 = stream2._readableState; + debug2("endReadable", state2.endEmitted); + if (!state2.endEmitted) { + state2.ended = true; + process.nextTick(endReadableNT, state2, stream2); + } + } + function endReadableNT(state2, stream2) { + debug2("endReadableNT", state2.endEmitted, state2.length); + if (!state2.endEmitted && state2.length === 0) { + state2.endEmitted = true; + stream2.readable = false; + stream2.emit("end"); + if (state2.autoDestroy) { + var wState = stream2._writableState; + if (!wState || wState.autoDestroy && wState.finished) { + stream2.destroy(); + } + } + } + } + if (typeof Symbol === "function") { + Readable.from = function(iterable, opts) { + if (from2 === void 0) { + from2 = requireFromBrowser(); + } + return from2(Readable, iterable, opts); + }; + } + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; + } + return _stream_readable; +} +var _stream_transform; +var hasRequired_stream_transform; +function require_stream_transform() { + if (hasRequired_stream_transform) return _stream_transform; + hasRequired_stream_transform = 1; + _stream_transform = Transform; + var _require$codes = requireErrorsBrowser().codes, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + var Duplex = require_stream_duplex(); + requireInherits_browser$1()(Transform, Duplex); + function afterTransform(er, data2) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + if (cb === null) { + return this.emit("error", new ERR_MULTIPLE_CALLBACK()); + } + ts.writechunk = null; + ts.writecb = null; + if (data2 != null) + this.push(data2); + cb(er); + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } + } + function Transform(options2) { + if (!(this instanceof Transform)) return new Transform(options2); + Duplex.call(this, options2); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + this._readableState.needReadable = true; + this._readableState.sync = false; + if (options2) { + if (typeof options2.transform === "function") this._transform = options2.transform; + if (typeof options2.flush === "function") this._flush = options2.flush; + } + this.on("prefinish", prefinish); + } + function prefinish() { + var _this = this; + if (typeof this._flush === "function" && !this._readableState.destroyed) { + this._flush(function(er, data2) { + done(_this, er, data2); + }); + } else { + done(this, null, null); + } + } + Transform.prototype.push = function(chunk, encoding2) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding2); + }; + Transform.prototype._transform = function(chunk, encoding2, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED("_transform()")); + }; + Transform.prototype._write = function(chunk, encoding2, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding2; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } + }; + Transform.prototype._read = function(n) { + var ts = this._transformState; + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + ts.needTransform = true; + } + }; + Transform.prototype._destroy = function(err, cb) { + Duplex.prototype._destroy.call(this, err, function(err2) { + cb(err2); + }); + }; + function done(stream2, er, data2) { + if (er) return stream2.emit("error", er); + if (data2 != null) + stream2.push(data2); + if (stream2._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream2._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream2.push(null); + } + return _stream_transform; +} +var _stream_passthrough; +var hasRequired_stream_passthrough; +function require_stream_passthrough() { + if (hasRequired_stream_passthrough) return _stream_passthrough; + hasRequired_stream_passthrough = 1; + _stream_passthrough = PassThrough; + var Transform = require_stream_transform(); + requireInherits_browser$1()(PassThrough, Transform); + function PassThrough(options2) { + if (!(this instanceof PassThrough)) return new PassThrough(options2); + Transform.call(this, options2); + } + PassThrough.prototype._transform = function(chunk, encoding2, cb) { + cb(null, chunk); + }; + return _stream_passthrough; +} +var pipeline_1; +var hasRequiredPipeline; +function requirePipeline() { + if (hasRequiredPipeline) return pipeline_1; + hasRequiredPipeline = 1; + var eos; + function once2(callback) { + var called = false; + return function() { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; + } + var _require$codes = requireErrorsBrowser().codes, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + function noop2(err) { + if (err) throw err; + } + function isRequest(stream2) { + return stream2.setHeader && typeof stream2.abort === "function"; + } + function destroyer(stream2, reading, writing, callback) { + callback = once2(callback); + var closed = false; + stream2.on("close", function() { + closed = true; + }); + if (eos === void 0) eos = requireEndOfStream(); + eos(stream2, { + readable: reading, + writable: writing + }, function(err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function(err) { + if (closed) return; + if (destroyed) return; + destroyed = true; + if (isRequest(stream2)) return stream2.abort(); + if (typeof stream2.destroy === "function") return stream2.destroy(); + callback(err || new ERR_STREAM_DESTROYED("pipe")); + }; + } + function call(fn) { + fn(); + } + function pipe(from2, to) { + return from2.pipe(to); + } + function popCallback(streams) { + if (!streams.length) return noop2; + if (typeof streams[streams.length - 1] !== "function") return noop2; + return streams.pop(); + } + function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + if (streams.length < 2) { + throw new ERR_MISSING_ARGS("streams"); + } + var error2; + var destroys = streams.map(function(stream2, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream2, reading, writing, function(err) { + if (!error2) error2 = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error2); + }); + }); + return streams.reduce(pipe); + } + pipeline_1 = pipeline; + return pipeline_1; +} +var hasRequiredReadableBrowser; +function requireReadableBrowser() { + if (hasRequiredReadableBrowser) return readableBrowser.exports; + hasRequiredReadableBrowser = 1; + (function(module, exports) { + exports = module.exports = require_stream_readable(); + exports.Stream = exports; + exports.Readable = exports; + exports.Writable = require_stream_writable(); + exports.Duplex = require_stream_duplex(); + exports.Transform = require_stream_transform(); + exports.PassThrough = require_stream_passthrough(); + exports.finished = requireEndOfStream(); + exports.pipeline = requirePipeline(); + })(readableBrowser, readableBrowser.exports); + return readableBrowser.exports; +} +var hasRequiredResponse; +function requireResponse() { + if (hasRequiredResponse) return response; + hasRequiredResponse = 1; + var capability2 = requireCapability(); + var inherits = requireInherits_browser$1(); + var stream2 = requireReadableBrowser(); + var rStates = response.readyStates = { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4 + }; + var IncomingMessage = response.IncomingMessage = function(xhr, response2, mode, resetTimers) { + var self2 = this; + stream2.Readable.call(self2); + self2._mode = mode; + self2.headers = {}; + self2.rawHeaders = []; + self2.trailers = {}; + self2.rawTrailers = []; + self2.on("end", function() { + process.nextTick(function() { + self2.emit("close"); + }); + }); + if (mode === "fetch") { + let read2 = function() { + reader.read().then(function(result) { + if (self2._destroyed) + return; + resetTimers(result.done); + if (result.done) { + self2.push(null); + return; + } + self2.push(Buffer.from(result.value)); + read2(); + }).catch(function(err) { + resetTimers(true); + if (!self2._destroyed) + self2.emit("error", err); + }); + }; + self2._fetchResponse = response2; + self2.url = response2.url; + self2.statusCode = response2.status; + self2.statusMessage = response2.statusText; + response2.headers.forEach(function(header, key2) { + self2.headers[key2.toLowerCase()] = header; + self2.rawHeaders.push(key2, header); + }); + if (capability2.writableStream) { + var writable2 = new WritableStream({ + write: function(chunk) { + resetTimers(false); + return new Promise(function(resolve, reject) { + if (self2._destroyed) { + reject(); + } else if (self2.push(Buffer.from(chunk))) { + resolve(); + } else { + self2._resumeFetch = resolve; + } + }); + }, + close: function() { + resetTimers(true); + if (!self2._destroyed) + self2.push(null); + }, + abort: function(err) { + resetTimers(true); + if (!self2._destroyed) + self2.emit("error", err); + } + }); + try { + response2.body.pipeTo(writable2).catch(function(err) { + resetTimers(true); + if (!self2._destroyed) + self2.emit("error", err); + }); + return; + } catch (e) { + } + } + var reader = response2.body.getReader(); + read2(); + } else { + self2._xhr = xhr; + self2._pos = 0; + self2.url = xhr.responseURL; + self2.statusCode = xhr.status; + self2.statusMessage = xhr.statusText; + var headers = xhr.getAllResponseHeaders().split(/\r?\n/); + headers.forEach(function(header) { + var matches = header.match(/^([^:]+):\s*(.*)/); + if (matches) { + var key2 = matches[1].toLowerCase(); + if (key2 === "set-cookie") { + if (self2.headers[key2] === void 0) { + self2.headers[key2] = []; + } + self2.headers[key2].push(matches[2]); + } else if (self2.headers[key2] !== void 0) { + self2.headers[key2] += ", " + matches[2]; + } else { + self2.headers[key2] = matches[2]; + } + self2.rawHeaders.push(matches[1], matches[2]); + } + }); + self2._charset = "x-user-defined"; + if (!capability2.overrideMimeType) { + var mimeType = self2.rawHeaders["mime-type"]; + if (mimeType) { + var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/); + if (charsetMatch) { + self2._charset = charsetMatch[1].toLowerCase(); + } + } + if (!self2._charset) + self2._charset = "utf-8"; + } + } + }; + inherits(IncomingMessage, stream2.Readable); + IncomingMessage.prototype._read = function() { + var self2 = this; + var resolve = self2._resumeFetch; + if (resolve) { + self2._resumeFetch = null; + resolve(); + } + }; + IncomingMessage.prototype._onXHRProgress = function(resetTimers) { + var self2 = this; + var xhr = self2._xhr; + var response2 = null; + switch (self2._mode) { + case "text": + response2 = xhr.responseText; + if (response2.length > self2._pos) { + var newData = response2.substr(self2._pos); + if (self2._charset === "x-user-defined") { + var buffer2 = Buffer.alloc(newData.length); + for (var i = 0; i < newData.length; i++) + buffer2[i] = newData.charCodeAt(i) & 255; + self2.push(buffer2); + } else { + self2.push(newData, self2._charset); + } + self2._pos = response2.length; + } + break; + case "arraybuffer": + if (xhr.readyState !== rStates.DONE || !xhr.response) + break; + response2 = xhr.response; + self2.push(Buffer.from(new Uint8Array(response2))); + break; + case "moz-chunked-arraybuffer": + response2 = xhr.response; + if (xhr.readyState !== rStates.LOADING || !response2) + break; + self2.push(Buffer.from(new Uint8Array(response2))); + break; + case "ms-stream": + response2 = xhr.response; + if (xhr.readyState !== rStates.LOADING) + break; + var reader = new commonjsGlobal.MSStreamReader(); + reader.onprogress = function() { + if (reader.result.byteLength > self2._pos) { + self2.push(Buffer.from(new Uint8Array(reader.result.slice(self2._pos)))); + self2._pos = reader.result.byteLength; + } + }; + reader.onload = function() { + resetTimers(true); + self2.push(null); + }; + reader.readAsArrayBuffer(response2); + break; + } + if (self2._xhr.readyState === rStates.DONE && self2._mode !== "ms-stream") { + resetTimers(true); + self2.push(null); + } + }; + return response; +} +var hasRequiredRequest; +function requireRequest() { + if (hasRequiredRequest) return request.exports; + hasRequiredRequest = 1; + var capability2 = requireCapability(); + var inherits = requireInherits_browser$1(); + var response2 = requireResponse(); + var stream2 = requireReadableBrowser(); + var IncomingMessage = response2.IncomingMessage; + var rStates = response2.readyStates; + function decideMode(preferBinary, useFetch) { + if (capability2.fetch && useFetch) { + return "fetch"; + } else if (capability2.mozchunkedarraybuffer) { + return "moz-chunked-arraybuffer"; + } else if (capability2.msstream) { + return "ms-stream"; + } else if (capability2.arraybuffer && preferBinary) { + return "arraybuffer"; + } else { + return "text"; + } + } + var ClientRequest = request.exports = function(opts) { + var self2 = this; + stream2.Writable.call(self2); + self2._opts = opts; + self2._body = []; + self2._headers = {}; + if (opts.auth) + self2.setHeader("Authorization", "Basic " + Buffer.from(opts.auth).toString("base64")); + Object.keys(opts.headers).forEach(function(name) { + self2.setHeader(name, opts.headers[name]); + }); + var preferBinary; + var useFetch = true; + if (opts.mode === "disable-fetch" || "requestTimeout" in opts && !capability2.abortController) { + useFetch = false; + preferBinary = true; + } else if (opts.mode === "prefer-streaming") { + preferBinary = false; + } else if (opts.mode === "allow-wrong-content-type") { + preferBinary = !capability2.overrideMimeType; + } else if (!opts.mode || opts.mode === "default" || opts.mode === "prefer-fast") { + preferBinary = true; + } else { + throw new Error("Invalid value for opts.mode"); + } + self2._mode = decideMode(preferBinary, useFetch); + self2._fetchTimer = null; + self2._socketTimeout = null; + self2._socketTimer = null; + self2.on("finish", function() { + self2._onFinish(); + }); + }; + inherits(ClientRequest, stream2.Writable); + ClientRequest.prototype.setHeader = function(name, value) { + var self2 = this; + var lowerName = name.toLowerCase(); + if (unsafeHeaders.indexOf(lowerName) !== -1) + return; + self2._headers[lowerName] = { + name, + value + }; + }; + ClientRequest.prototype.getHeader = function(name) { + var header = this._headers[name.toLowerCase()]; + if (header) + return header.value; + return null; + }; + ClientRequest.prototype.removeHeader = function(name) { + var self2 = this; + delete self2._headers[name.toLowerCase()]; + }; + ClientRequest.prototype._onFinish = function() { + var self2 = this; + if (self2._destroyed) + return; + var opts = self2._opts; + if ("timeout" in opts && opts.timeout !== 0) { + self2.setTimeout(opts.timeout); + } + var headersObj = self2._headers; + var body = null; + if (opts.method !== "GET" && opts.method !== "HEAD") { + body = new Blob(self2._body, { + type: (headersObj["content-type"] || {}).value || "" + }); + } + var headersList = []; + Object.keys(headersObj).forEach(function(keyName) { + var name = headersObj[keyName].name; + var value = headersObj[keyName].value; + if (Array.isArray(value)) { + value.forEach(function(v) { + headersList.push([name, v]); + }); + } else { + headersList.push([name, value]); + } + }); + if (self2._mode === "fetch") { + var signal = null; + if (capability2.abortController) { + var controller = new AbortController(); + signal = controller.signal; + self2._fetchAbortController = controller; + if ("requestTimeout" in opts && opts.requestTimeout !== 0) { + self2._fetchTimer = commonjsGlobal.setTimeout(function() { + self2.emit("requestTimeout"); + if (self2._fetchAbortController) + self2._fetchAbortController.abort(); + }, opts.requestTimeout); + } + } + commonjsGlobal.fetch(self2._opts.url, { + method: self2._opts.method, + headers: headersList, + body: body || void 0, + mode: "cors", + credentials: opts.withCredentials ? "include" : "same-origin", + signal + }).then(function(response3) { + self2._fetchResponse = response3; + self2._resetTimers(false); + self2._connect(); + }, function(reason) { + self2._resetTimers(true); + if (!self2._destroyed) + self2.emit("error", reason); + }); + } else { + var xhr = self2._xhr = new commonjsGlobal.XMLHttpRequest(); + try { + xhr.open(self2._opts.method, self2._opts.url, true); + } catch (err) { + process.nextTick(function() { + self2.emit("error", err); + }); + return; + } + if ("responseType" in xhr) + xhr.responseType = self2._mode; + if ("withCredentials" in xhr) + xhr.withCredentials = !!opts.withCredentials; + if (self2._mode === "text" && "overrideMimeType" in xhr) + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + if ("requestTimeout" in opts) { + xhr.timeout = opts.requestTimeout; + xhr.ontimeout = function() { + self2.emit("requestTimeout"); + }; + } + headersList.forEach(function(header) { + xhr.setRequestHeader(header[0], header[1]); + }); + self2._response = null; + xhr.onreadystatechange = function() { + switch (xhr.readyState) { + case rStates.LOADING: + case rStates.DONE: + self2._onXHRProgress(); + break; + } + }; + if (self2._mode === "moz-chunked-arraybuffer") { + xhr.onprogress = function() { + self2._onXHRProgress(); + }; + } + xhr.onerror = function() { + if (self2._destroyed) + return; + self2._resetTimers(true); + self2.emit("error", new Error("XHR error")); + }; + try { + xhr.send(body); + } catch (err) { + process.nextTick(function() { + self2.emit("error", err); + }); + return; + } + } + }; + function statusValid(xhr) { + try { + var status = xhr.status; + return status !== null && status !== 0; + } catch (e) { + return false; + } + } + ClientRequest.prototype._onXHRProgress = function() { + var self2 = this; + self2._resetTimers(false); + if (!statusValid(self2._xhr) || self2._destroyed) + return; + if (!self2._response) + self2._connect(); + self2._response._onXHRProgress(self2._resetTimers.bind(self2)); + }; + ClientRequest.prototype._connect = function() { + var self2 = this; + if (self2._destroyed) + return; + self2._response = new IncomingMessage(self2._xhr, self2._fetchResponse, self2._mode, self2._resetTimers.bind(self2)); + self2._response.on("error", function(err) { + self2.emit("error", err); + }); + self2.emit("response", self2._response); + }; + ClientRequest.prototype._write = function(chunk, encoding2, cb) { + var self2 = this; + self2._body.push(chunk); + cb(); + }; + ClientRequest.prototype._resetTimers = function(done) { + var self2 = this; + commonjsGlobal.clearTimeout(self2._socketTimer); + self2._socketTimer = null; + if (done) { + commonjsGlobal.clearTimeout(self2._fetchTimer); + self2._fetchTimer = null; + } else if (self2._socketTimeout) { + self2._socketTimer = commonjsGlobal.setTimeout(function() { + self2.emit("timeout"); + }, self2._socketTimeout); + } + }; + ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function(err) { + var self2 = this; + self2._destroyed = true; + self2._resetTimers(true); + if (self2._response) + self2._response._destroyed = true; + if (self2._xhr) + self2._xhr.abort(); + else if (self2._fetchAbortController) + self2._fetchAbortController.abort(); + if (err) + self2.emit("error", err); + }; + ClientRequest.prototype.end = function(data2, encoding2, cb) { + var self2 = this; + if (typeof data2 === "function") { + cb = data2; + data2 = void 0; + } + stream2.Writable.prototype.end.call(self2, data2, encoding2, cb); + }; + ClientRequest.prototype.setTimeout = function(timeout, cb) { + var self2 = this; + if (cb) + self2.once("timeout", cb); + self2._socketTimeout = timeout; + self2._resetTimers(false); + }; + ClientRequest.prototype.flushHeaders = function() { + }; + ClientRequest.prototype.setNoDelay = function() { + }; + ClientRequest.prototype.setSocketKeepAlive = function() { + }; + var unsafeHeaders = [ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "cookie", + "cookie2", + "date", + "dnt", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "via" + ]; + return request.exports; +} +var immutable; +var hasRequiredImmutable; +function requireImmutable() { + if (hasRequiredImmutable) return immutable; + hasRequiredImmutable = 1; + immutable = extend2; + var hasOwnProperty2 = Object.prototype.hasOwnProperty; + function extend2() { + var target = {}; + for (var i = 0; i < arguments.length; i++) { + var source2 = arguments[i]; + for (var key2 in source2) { + if (hasOwnProperty2.call(source2, key2)) { + target[key2] = source2[key2]; + } + } + } + return target; + } + return immutable; +} +var browser$1; +var hasRequiredBrowser$1; +function requireBrowser$1() { + if (hasRequiredBrowser$1) return browser$1; + hasRequiredBrowser$1 = 1; + browser$1 = { + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Unordered Collection", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" + }; + return browser$1; +} +var hasRequiredStreamHttp; +function requireStreamHttp() { + if (hasRequiredStreamHttp) return streamHttp; + hasRequiredStreamHttp = 1; + (function(exports) { + var ClientRequest = requireRequest(); + var response2 = requireResponse(); + var extend2 = requireImmutable(); + var statusCodes = requireBrowser$1(); + var url2 = require$$1$5; + var http2 = exports; + http2.request = function(opts, cb) { + if (typeof opts === "string") + opts = url2.parse(opts); + else + opts = extend2(opts); + var defaultProtocol = commonjsGlobal.location.protocol.search(/^https?:$/) === -1 ? "http:" : ""; + var protocol = opts.protocol || defaultProtocol; + var host = opts.hostname || opts.host; + var port = opts.port; + var path2 = opts.path || "/"; + if (host && host.indexOf(":") !== -1) + host = "[" + host + "]"; + opts.url = (host ? protocol + "//" + host : "") + (port ? ":" + port : "") + path2; + opts.method = (opts.method || "GET").toUpperCase(); + opts.headers = opts.headers || {}; + var req = new ClientRequest(opts); + if (cb) + req.on("response", cb); + return req; + }; + http2.get = function get2(opts, cb) { + var req = http2.request(opts, cb); + req.end(); + return req; + }; + http2.ClientRequest = ClientRequest; + http2.IncomingMessage = response2.IncomingMessage; + http2.Agent = function() { + }; + http2.Agent.defaultMaxSockets = 4; + http2.globalAgent = new http2.Agent(); + http2.STATUS_CODES = statusCodes; + http2.METHODS = [ + "CHECKOUT", + "CONNECT", + "COPY", + "DELETE", + "GET", + "HEAD", + "LOCK", + "M-SEARCH", + "MERGE", + "MKACTIVITY", + "MKCOL", + "MOVE", + "NOTIFY", + "OPTIONS", + "PATCH", + "POST", + "PROPFIND", + "PROPPATCH", + "PURGE", + "PUT", + "REPORT", + "SEARCH", + "SUBSCRIBE", + "TRACE", + "UNLOCK", + "UNSUBSCRIBE" + ]; + })(streamHttp); + return streamHttp; +} +var streamHttpExports = requireStreamHttp(); +const http = /* @__PURE__ */ getDefaultExportFromCjs(streamHttpExports); +var httpsBrowserify = { exports: {} }; +var hasRequiredHttpsBrowserify; +function requireHttpsBrowserify() { + if (hasRequiredHttpsBrowserify) return httpsBrowserify.exports; + hasRequiredHttpsBrowserify = 1; + (function(module) { + var http2 = requireStreamHttp(); + var url2 = require$$1$5; + var https2 = module.exports; + for (var key2 in http2) { + if (http2.hasOwnProperty(key2)) https2[key2] = http2[key2]; + } + https2.request = function(params, cb) { + params = validateParams(params); + return http2.request.call(this, params, cb); + }; + https2.get = function(params, cb) { + params = validateParams(params); + return http2.get.call(this, params, cb); + }; + function validateParams(params) { + if (typeof params === "string") { + params = url2.parse(params); + } + if (!params.protocol) { + params.protocol = "https:"; + } + if (params.protocol !== "https:") { + throw new Error('Protocol "' + params.protocol + '" not supported. Expected "https:"'); + } + return params; + } + })(httpsBrowserify); + return httpsBrowserify.exports; +} +var httpsBrowserifyExports = requireHttpsBrowserify(); +const https = /* @__PURE__ */ getDefaultExportFromCjs(httpsBrowserifyExports); +const connectionAttemptDelayMs = 300; +const kDNSLookupAt = Symbol("kDNSLookupAt"); +const kTCPConnectionAt = Symbol("kTCPConnectionAt"); +class HttpHappyEyeballsAgent extends http.Agent { + createConnection(options2, oncreate) { + if (net.isIP(clientRequestArgsToHostName(options2))) + return net.createConnection(options2); + createConnectionAsync( + options2, + oncreate, + /* useTLS */ + false + ).catch((err) => oncreate == null ? void 0 : oncreate(err)); + } +} +class HttpsHappyEyeballsAgent extends https.Agent { + createConnection(options2, oncreate) { + if (net.isIP(clientRequestArgsToHostName(options2))) + return tls.connect(options2); + createConnectionAsync( + options2, + oncreate, + /* useTLS */ + true + ).catch((err) => oncreate == null ? void 0 : oncreate(err)); + } +} +const httpsHappyEyeballsAgent = new HttpsHappyEyeballsAgent({ keepAlive: true }); +const httpHappyEyeballsAgent = new HttpHappyEyeballsAgent({ keepAlive: true }); +async function createSocket(host, port) { + return new Promise((resolve, reject) => { + if (net.isIP(host)) { + const socket = net.createConnection({ host, port }); + socket.on("connect", () => resolve(socket)); + socket.on("error", (error2) => reject(error2)); + } else { + createConnectionAsync( + { host, port }, + (err, socket) => { + if (err) + reject(err); + if (socket) + resolve(socket); + }, + /* useTLS */ + false + ).catch((err) => reject(err)); + } + }); +} +async function createTLSSocket(options2) { + return new Promise((resolve, reject) => { + assert(options2.host, "host is required"); + if (net.isIP(options2.host)) { + const socket = tls.connect(options2); + socket.on("secureConnect", () => resolve(socket)); + socket.on("error", (error2) => reject(error2)); + } else { + createConnectionAsync(options2, (err, socket) => { + if (err) + reject(err); + if (socket) { + socket.on("secureConnect", () => resolve(socket)); + socket.on("error", (error2) => reject(error2)); + } + }, true).catch((err) => reject(err)); + } + }); +} +async function createConnectionAsync(options2, oncreate, useTLS) { + const lookup = options2.__testHookLookup || lookupAddresses; + const hostname = clientRequestArgsToHostName(options2); + const addresses = await lookup(hostname); + const dnsLookupAt = monotonicTime(); + const sockets = /* @__PURE__ */ new Set(); + let firstError; + let errorCount = 0; + const handleError = (socket, err) => { + if (!sockets.delete(socket)) + return; + ++errorCount; + firstError ?? (firstError = err); + if (errorCount === addresses.length) + oncreate == null ? void 0 : oncreate(firstError); + }; + const connected = new ManualPromise(); + for (const { address } of addresses) { + const socket = useTLS ? tls.connect({ + ...options2, + port: options2.port, + host: address, + servername: hostname + }) : net.createConnection({ + ...options2, + port: options2.port, + host: address + }); + socket[kDNSLookupAt] = dnsLookupAt; + socket.on("connect", () => { + socket[kTCPConnectionAt] = monotonicTime(); + connected.resolve(); + oncreate == null ? void 0 : oncreate(null, socket); + sockets.delete(socket); + for (const s of sockets) + s.destroy(); + sockets.clear(); + }); + socket.on("timeout", () => { + socket.destroy(); + handleError(socket, new Error("Connection timeout")); + }); + socket.on("error", (e) => handleError(socket, e)); + sockets.add(socket); + await Promise.race([ + connected, + new Promise((f) => setTimeout(f, connectionAttemptDelayMs)) + ]); + if (connected.isDone()) + break; + } +} +async function lookupAddresses(hostname) { + const addresses = await promises.promises.lookup(hostname, { all: true, family: 0, verbatim: true }); + let firstFamily = addresses.filter(({ family }) => family === 6); + let secondFamily = addresses.filter(({ family }) => family === 4); + if (firstFamily.length && firstFamily[0] !== addresses[0]) { + const tmp = firstFamily; + firstFamily = secondFamily; + secondFamily = tmp; + } + const result = []; + for (let i = 0; i < Math.max(firstFamily.length, secondFamily.length); i++) { + if (firstFamily[i]) + result.push(firstFamily[i]); + if (secondFamily[i]) + result.push(secondFamily[i]); + } + return result; +} +function clientRequestArgsToHostName(options2) { + if (options2.hostname) + return options2.hostname; + if (options2.host) + return options2.host; + throw new Error("Either options.hostname or options.host must be provided"); +} +function timingForSocket(socket) { + return { + dnsLookupAt: socket[kDNSLookupAt], + tcpConnectionAt: socket[kTCPConnectionAt] + }; +} +const NET_DEFAULT_TIMEOUT = 3e4; +function httpRequest(params, onResponse, onError) { + const parsedUrl = url.parse(params.url); + let options2 = { + ...parsedUrl, + agent: parsedUrl.protocol === "https:" ? httpsHappyEyeballsAgent : httpHappyEyeballsAgent, + method: params.method || "GET", + headers: params.headers + }; + if (params.rejectUnauthorized !== void 0) + options2.rejectUnauthorized = params.rejectUnauthorized; + const timeout = params.timeout ?? NET_DEFAULT_TIMEOUT; + const proxyURL = getProxyForUrl(params.url); + if (proxyURL) { + const parsedProxyURL = url.parse(proxyURL); + if (params.url.startsWith("http:")) { + options2 = { + path: parsedUrl.href, + host: parsedProxyURL.hostname, + port: parsedProxyURL.port, + headers: options2.headers, + method: options2.method + }; + } else { + parsedProxyURL.secureProxy = parsedProxyURL.protocol === "https:"; + options2.agent = new HttpsProxyAgent(parsedProxyURL); + options2.rejectUnauthorized = false; + } + } + const requestCallback = (res) => { + const statusCode = res.statusCode || 0; + if (statusCode >= 300 && statusCode < 400 && res.headers.location) { + request2.destroy(); + httpRequest({ ...params, url: new URL(res.headers.location, params.url).toString() }, onResponse, onError); + } else { + onResponse(res); + } + }; + const request2 = options2.protocol === "https:" ? https.request(options2, requestCallback) : http.request(options2, requestCallback); + request2.on("error", onError); + if (timeout !== void 0) { + const rejectOnTimeout = () => { + onError(new Error(`Request to ${params.url} timed out after ${timeout}ms`)); + request2.abort(); + }; + if (timeout <= 0) { + rejectOnTimeout(); + return; + } + request2.setTimeout(timeout, rejectOnTimeout); + } + request2.end(params.data); +} +function fetchData(params, onError) { + return new Promise((resolve, reject) => { + httpRequest(params, async (response2) => { + if (response2.statusCode !== 200) { + const error2 = onError ? await onError(params, response2) : new Error(`fetch failed: server returned code ${response2.statusCode}. URL: ${params.url}`); + reject(error2); + return; + } + let body = ""; + response2.on("data", (chunk) => body += chunk); + response2.on("error", (error2) => reject(error2)); + response2.on("end", () => resolve(body)); + }, reject); + }); +} +function shouldBypassProxy(url2, bypass) { + if (!bypass) + return false; + const domains = bypass.split(",").map((s) => { + s = s.trim(); + if (!s.startsWith(".")) + s = "." + s; + return s; + }); + const domain = "." + url2.hostname; + return domains.some((d) => domain.endsWith(d)); +} +function createProxyAgent(proxy, forUrl) { + var _a2; + if (!proxy) + return; + if (forUrl && proxy.bypass && shouldBypassProxy(forUrl, proxy.bypass)) + return; + let proxyServer = proxy.server.trim(); + if (!/^\w+:\/\//.test(proxyServer)) + proxyServer = "http://" + proxyServer; + const proxyOpts = url.parse(proxyServer); + if ((_a2 = proxyOpts.protocol) == null ? void 0 : _a2.startsWith("socks")) { + return new SocksProxyAgent({ + host: proxyOpts.hostname, + port: proxyOpts.port || void 0 + }); + } + if (proxy.username) + proxyOpts.auth = `${proxy.username}:${proxy.password || ""}`; + if (forUrl && ["ws:", "wss:"].includes(forUrl.protocol)) { + return new HttpsProxyAgent(proxyOpts); + } + return new HttpsProxyAgent(proxyOpts); +} +var browser; +var hasRequiredBrowser; +function requireBrowser() { + if (hasRequiredBrowser) return browser; + hasRequiredBrowser = 1; + var global2 = /* @__PURE__ */ function() { + return this; + }(); + var WebSocket2 = global2.WebSocket || global2.MozWebSocket; + browser = WebSocket2 ? ws2 : null; + function ws2(uri2, protocols, opts) { + var instance; + if (protocols) { + instance = new WebSocket2(uri2, protocols); + } else { + instance = new WebSocket2(uri2); + } + return instance; + } + if (WebSocket2) ws2.prototype = WebSocket2.prototype; + return browser; +} +var endpoint; +var hasRequiredEndpoint; +function requireEndpoint() { + if (hasRequiredEndpoint) return endpoint; + hasRequiredEndpoint = 1; + var Writable = requireBrowser$h().Writable; + var inherits = requireInherits_browser$1(); + function Endpoint(options2, callback) { + if (!(this instanceof Endpoint)) return new Endpoint(options2, callback); + if (typeof options2 === "function") { + callback = options2; + options2 = {}; + } + Writable.call(this, options2); + var self2 = this; + this._objectMode = !!options2.objectMode; + this._buffers = []; + var sources = []; + function cleanup() { + self2.removeListener("pipe", onpipe); + self2.removeListener("error", error2); + self2.removeListener("finish", finish); + for (var i = 0, l = sources.length; i < l; i++) { + sources[i].removeListener("error", error2); + } + } + function finish() { + cleanup(); + callback(null, self2.buffer); + } + function error2(err) { + cleanup(); + callback(err, self2.buffer); + } + function onpipe(source2) { + sources.push(source2); + source2.once("error", error2); + } + function onunpipe(source2) { + var index2 = sources.indexOf(source2); + if (index2 !== -1) { + sources.splice(index2, 1); + source2.removeListener("error", error2); + } + } + this.once("finish", finish); + this.once("error", error2); + this.on("pipe", onpipe); + this.on("unpipe", onunpipe); + } + endpoint = Endpoint; + inherits(Endpoint, Writable); + Endpoint.prototype._write = function(data2, encodeing, callback) { + this._buffers.push(data2); + return callback(null); + }; + Object.defineProperty(Endpoint.prototype, "buffer", { + get: function() { + if (this._objectMode) { + return this._buffers; + } else { + var total = Buffer.concat(this._buffers); + this._buffers = [total]; + return total; + } + }, + enumerable: true, + configurable: true + }); + return endpoint; +} +var inspector; +var hasRequiredInspector; +function requireInspector() { + if (hasRequiredInspector) return inspector; + hasRequiredInspector = 1; + var fs2 = require$$2$1; + var path2 = requirePath(); + var util2 = requireUtil$5(); + var http2 = requireStreamHttp(); + var events2 = requireEvents(); + var WebSocket2 = requireBrowser(); + var endpoint2 = requireEndpoint(); + var library = {}; + fs2.readdirSync(path2.resolve(__dirname, "lib")).filter(function(filename) { + return filename[0] !== "."; + }).forEach(function(filename) { + var filepath = path2.resolve(__dirname, "lib", filename); + library[path2.basename(filename, ".js")] = commonjsRequire(filepath); + }); + function WebKitInspector(port, host, href, callback) { + if (!(this instanceof WebKitInspector)) { + return new WebKitInspector(port, host, href, callback); + } + this.closed = false; + this._callbacks = {}; + this._id = 0; + this.debug = false; + var domains = Object.keys(library); + for (var i = 0, l = domains.length; i < l; i++) { + this[domains[i]] = new library[domains[i]](this); + } + if (typeof port !== "number") { + throw new Error("A port number must be speficed"); + } + if (typeof host !== "string") { + throw new Error("A host name must be speficed"); + } + if (typeof href !== "string") { + throw new Error("A page url must be speficed"); + } + if (callback) this.once("connect", callback); + this._tryConnect(port, host, href, 0, 2e3); + } + util2.inherits(WebKitInspector, events2.EventEmitter); + inspector = WebKitInspector; + WebKitInspector.prototype._tryConnect = function(port, host, href, use, timeout) { + var self2 = this; + var time = Date.now(); + var req = http2.get("http://" + host + ":" + port + "/json", function(res) { + res.pipe(endpoint2(function(err, buffer2) { + if (err) return self2.emit("error", err); + if (self2.closed) return; + var wsUrl = null; + var pages = JSON.parse(buffer2.toString()); + for (var i = 0, l = pages.length; i < l; i++) { + if (pages[i].url === href) { + wsUrl = pages[i].webSocketDebuggerUrl || false; + break; + } + } + if (wsUrl === null) { + return self2.emit("error", new Error("No page with the given url was found")); + } + if (wsUrl === false) { + return self2.emit("error", new Error("Another inspector is already listning")); + } + self2._ws = new WebSocket2(wsUrl); + self2._ws.on("message", self2._respond.bind(self2)); + self2._ws.on("error", self2.emit.bind(self2, "error")); + self2._ws.once("open", self2.emit.bind(self2, "connect")); + self2._ws.once("close", self2.close.bind(self2)); + })); + }); + req.on("error", function(err) { + var timeUse = time - Date.now() + use; + if (err.code === "ECONNREFUSED" && timeUse + 100 < timeout && self2.closed === false) { + setTimeout(function() { + self2._tryConnect(port, host, href, timeUse, timeout); + }, 100); + return; + } + self2.emit("error", err); + }); + }; + WebKitInspector.prototype._splitArgs = function(argsList) { + var args = [], callback; + if (args.length === 1) { + callback = argsList[0]; + } else { + for (var i = 0, l = argsList.length; i < l; i++) { + args.push(argsList[i]); + } + callback = args.pop(); + } + if (typeof callback !== "function") { + throw new Error("missing callback"); + } + return { args, callback }; + }; + WebKitInspector.prototype._request = function(method, params, callback) { + var self2 = this; + var newId = ++this._id; + var request2 = { + "id": newId, + "method": method, + "params": params + }; + this._callbacks[newId] = callback; + if (this.debug) { + console.log("=== Send request #" + newId + " ==="); + console.log(util2.inspect(request2, false, Infinity, true)); + console.log("=== message end ==="); + } + this._ws.send(JSON.stringify(request2), function(err) { + if (err) { + delete self2._callbacks[newId]; + callback(err, null); + } + }); + }; + WebKitInspector.prototype._respond = function(message) { + message = JSON.parse(message); + if (message.id) { + if (this.debug) { + console.log("=== Got response #" + message.id + " ==="); + console.log(util2.inspect(message, false, Infinity, true)); + console.log("=== message end ==="); + } + var callback = this._callbacks[message.id]; + if (callback === void 0) { + this.emit("error", new Error("atempt to fire a missing callback")); + return; + } + delete this._callbacks[message.id]; + if (message.error) { + var err = new Error(message.error.message); + err.code = message.error.code; + callback.call(null, err, null); + } else { + callback.call(null, null, message.result); + } + } else { + if (this.debug) { + console.log("=== Got event ::" + message.method + " ==="); + console.log(util2.inspect(message, false, Infinity, true)); + console.log("=== message end ==="); + } + var method = message.method.split("."); + this[method[0]].emit(method[1], message.params); + } + }; + WebKitInspector.prototype.close = function(callback) { + var self2 = this; + if (this.closed) return; + this.closed = true; + if (typeof callback === "function") this.once("close", callback); + if (this._ws && this._ws.readyState !== WebSocket2.CLOSED) { + this._ws.once("close", function() { + self2.emit("close"); + }); + this._ws.close(); + } else { + this.emit("close"); + } + }; + return inspector; +} +var browserExports = requireBrowser$h(); +const stream = /* @__PURE__ */ getDefaultExportFromCjs(browserExports); +var eventsExports = requireEvents(); +const EventEmitter$1 = /* @__PURE__ */ getDefaultExportFromCjs(eventsExports); +class AsyncLocalStorage { + constructor() { + __publicField(this, "lastZoneId", 0); + __publicField(this, "_zones", /* @__PURE__ */ new Map()); + __publicField(this, "_current"); + } + getStore() { + return this._current; + } + run(store, func) { + let id; + if (store) { + id = this.lastZoneId++; + this._zones.set(id, store); + this._current = store; + Object.defineProperty(func, "name", { value: `__PWZONE__[${id}]-${store.type}` }); + } + return runWithFinally(() => func(), () => { + if (id) + this._zones.delete(id); + if (store) + this._current = store.previous; + }); + } +} +function runWithFinally(func, finallyFunc) { + try { + const result = func(); + if (result instanceof Promise) { + return result.then((r) => { + finallyFunc(); + return r; + }).catch((e) => { + finallyFunc(); + throw e; + }); + } + finallyFunc(); + return result; + } catch (e) { + finallyFunc(); + throw e; + } +} +const asyncLocalStorage = new AsyncLocalStorage(); +class Zone { + constructor(asyncLocalStorage2, store) { + this._asyncLocalStorage = asyncLocalStorage2; + this._data = store; + } + with(type2, data2) { + return new Zone(this._asyncLocalStorage, new Map(this._data).set(type2, data2)); + } + without(type2) { + const data2 = type2 ? new Map(this._data) : /* @__PURE__ */ new Map(); + data2.delete(type2); + return new Zone(this._asyncLocalStorage, data2); + } + run(func) { + return this._asyncLocalStorage.run(this, func); + } + data(type2) { + return this._data.get(type2); + } +} +const emptyZone = new Zone(asyncLocalStorage, /* @__PURE__ */ new Map()); +function currentZone() { + return asyncLocalStorage.getStore() ?? emptyZone; +} +const pipelineAsync = utilExports.promisify(browserExports.pipeline); +class NodeZone { + constructor(zone) { + this._zone = zone; + } + push(data2) { + return new NodeZone(this._zone.with("apiZone", data2)); + } + pop() { + return new NodeZone(this._zone.without("apiZone")); + } + run(func) { + return this._zone.run(func); + } + data() { + return this._zone.data("apiZone"); + } +} +let boxedStackPrefixes = []; +const coreDir = path.dirname(Boolean("../../../package.json")); +const nodePlatform = { + name: "node", + boxedStackPrefixes: () => { + if (define_process_env_default.PWDEBUGIMPL) + return []; + return [coreDir, ...boxedStackPrefixes]; + }, + calculateSha1: (text) => { + const sha12 = crypto.createHash("sha1"); + sha12.update(text); + return Promise.resolve(sha12.digest("hex")); + }, + colors, + coreDir, + createGuid: () => crypto.randomBytes(16).toString("hex"), + defaultMaxListeners: () => eventsExports.EventEmitter.defaultMaxListeners, + fs: () => fs, + env: define_process_env_default, + inspectCustom: utilExports.inspect.custom, + isDebugMode: () => !!debugMode(), + isJSDebuggerAttached: () => !!requireInspector().url(), + isLogEnabled(name) { + return debugLogger.isEnabled(name); + }, + isUnderTest: () => isUnderTest(), + log(name, message) { + debugLogger.log(name, message); + }, + path: () => path, + pathSeparator: path.sep, + showInternalStackFrames: () => !!define_process_env_default.PWDEBUGIMPL, + async streamFile(path2, stream2) { + await pipelineAsync(fs.createReadStream(path2), stream2); + }, + streamReadable: (channel) => { + return new ReadableStreamImpl(channel); + }, + streamWritable: (channel) => { + return new WritableStreamImpl(channel); + }, + zones: { + current: () => new NodeZone(currentZone()), + empty: new NodeZone(emptyZone) + } +}; +class ReadableStreamImpl extends browserExports.Readable { + constructor(channel) { + super(); + this._channel = channel; + } + async _read() { + const result = await this._channel.read({ size: 1024 * 1024 }); + if (result.binary.byteLength) + this.push(result.binary); + else + this.push(null); + } + _destroy(error2, callback) { + this._channel.close().catch((e) => null); + super._destroy(error2, callback); + } +} +class WritableStreamImpl extends browserExports.Writable { + constructor(channel) { + super(); + this._channel = channel; + } + async _write(chunk, encoding2, callback) { + const error2 = await this._channel.write({ binary: typeof chunk === "string" ? Buffer.from(chunk) : chunk }).catch((e) => e); + callback(error2 || null); + } + async _final(callback) { + const error2 = await this._channel.close().catch((e) => e); + callback(error2 || null); + } +} +function noop() { +} +const createInterface = noop; +const gracefullyCloseSet = /* @__PURE__ */ new Set(); +const killSet = /* @__PURE__ */ new Set(); +async function gracefullyCloseAll() { + await Promise.all(Array.from(gracefullyCloseSet).map((gracefullyClose) => gracefullyClose().catch((e) => { + }))); +} +function gracefullyProcessExitDoNotHang(code) { + setTimeout(() => process.exit(code), 3e4); + gracefullyCloseAll().then(() => { + process.exit(code); + }); +} +function exitHandler() { + for (const kill of killSet) + kill(); +} +let sigintHandlerCalled = false; +function sigintHandler() { + const exitWithCode130 = () => { + if (isUnderTest()) { + setTimeout(() => process.exit(130), 1e3); + } else { + process.exit(130); + } + }; + if (sigintHandlerCalled) { + process.off("SIGINT", sigintHandler); + for (const kill of killSet) + kill(); + exitWithCode130(); + } else { + sigintHandlerCalled = true; + gracefullyCloseAll().then(() => exitWithCode130()); + } +} +function sigtermHandler() { + gracefullyCloseAll(); +} +function sighupHandler() { + gracefullyCloseAll(); +} +const installedHandlers = /* @__PURE__ */ new Set(); +const processHandlers = { + exit: exitHandler, + SIGINT: sigintHandler, + SIGTERM: sigtermHandler, + SIGHUP: sighupHandler +}; +function addProcessHandlerIfNeeded(name) { + if (!installedHandlers.has(name)) { + installedHandlers.add(name); + process.on(name, processHandlers[name]); + } +} +function removeProcessHandlersIfNeeded() { + if (killSet.size) + return; + for (const handler of installedHandlers) + process.off(handler, processHandlers[handler]); + installedHandlers.clear(); +} +async function launchProcess(options2) { + options2.stdio === "pipe" ? ["ignore", "pipe", "pipe", "pipe", "pipe"] : ["pipe", "pipe", "pipe"]; + options2.log(` ${options2.command} ${options2.args ? options2.args.join(" ") : ""}`); + ({ + // On non-windows platforms, `detached: true` makes child process a leader of a new + // process group, making it possible to kill child process tree with `.kill(-pid)` command. + // @see https://nodejs.org/api/child_process.html#child_process_options_detached + detached: process.platform !== "win32", + env: options2.env, + cwd: options2.cwd, + shell: options2.shell + }); + const spawnedProcess = spawn(options2.command, options2.args || []); + const cleanup = async () => { + options2.log(`[pid=${spawnedProcess.pid || "N/A"}] starting temporary directories cleanup`); + const errors2 = await removeFolders(options2.tempDirectories); + for (let i = 0; i < options2.tempDirectories.length; ++i) { + if (errors2[i]) + options2.log(`[pid=${spawnedProcess.pid || "N/A"}] exception while removing ${options2.tempDirectories[i]}: ${errors2[i]}`); + } + options2.log(`[pid=${spawnedProcess.pid || "N/A"}] finished temporary directories cleanup`); + }; + spawnedProcess.on("error", () => { + }); + if (!spawnedProcess.pid) { + let failed; + const failedPromise = new Promise((f, r) => failed = f); + spawnedProcess.once("error", (error2) => { + failed(new Error("Failed to launch: " + error2)); + }); + return cleanup().then(() => failedPromise).then((e) => Promise.reject(e)); + } + options2.log(` pid=${spawnedProcess.pid}`); + const stdout = createInterface({ input: spawnedProcess.stdout }); + stdout.on("line", (data2) => { + options2.log(`[pid=${spawnedProcess.pid}][out] ` + data2); + }); + const stderr = createInterface({ input: spawnedProcess.stderr }); + stderr.on("line", (data2) => { + options2.log(`[pid=${spawnedProcess.pid}][err] ` + data2); + }); + let processClosed = false; + let fulfillCleanup = () => { + }; + const waitForCleanup = new Promise((f) => fulfillCleanup = f); + spawnedProcess.once("close", (exitCode, signal) => { + options2.log(`[pid=${spawnedProcess.pid}] `); + processClosed = true; + gracefullyCloseSet.delete(gracefullyClose); + killSet.delete(killProcessAndCleanup); + removeProcessHandlersIfNeeded(); + options2.onExit(exitCode, signal); + cleanup().then(fulfillCleanup); + }); + addProcessHandlerIfNeeded("exit"); + if (options2.handleSIGINT) + addProcessHandlerIfNeeded("SIGINT"); + if (options2.handleSIGTERM) + addProcessHandlerIfNeeded("SIGTERM"); + if (options2.handleSIGHUP) + addProcessHandlerIfNeeded("SIGHUP"); + gracefullyCloseSet.add(gracefullyClose); + killSet.add(killProcessAndCleanup); + let gracefullyClosing = false; + async function gracefullyClose() { + if (gracefullyClosing) { + options2.log(`[pid=${spawnedProcess.pid}] `); + killProcess(); + await waitForCleanup; + return; + } + gracefullyClosing = true; + options2.log(`[pid=${spawnedProcess.pid}] `); + await options2.attemptToGracefullyClose().catch(() => killProcess()); + await waitForCleanup; + options2.log(`[pid=${spawnedProcess.pid}] `); + } + function killProcess() { + gracefullyCloseSet.delete(gracefullyClose); + killSet.delete(killProcessAndCleanup); + removeProcessHandlersIfNeeded(); + options2.log(`[pid=${spawnedProcess.pid}] `); + if (spawnedProcess.pid && !spawnedProcess.killed && !processClosed) { + options2.log(`[pid=${spawnedProcess.pid}] `); + try { + if (process.platform === "win32") { + const taskkillProcess = spawnSync(`taskkill /pid ${spawnedProcess.pid} /T /F`, { shell: true }); + const [stdout2, stderr2] = [taskkillProcess.stdout.toString(), taskkillProcess.stderr.toString()]; + if (stdout2) + options2.log(`[pid=${spawnedProcess.pid}] taskkill stdout: ${stdout2}`); + if (stderr2) + options2.log(`[pid=${spawnedProcess.pid}] taskkill stderr: ${stderr2}`); + } else { + process.kill(-spawnedProcess.pid, "SIGKILL"); + } + } catch (e) { + options2.log(`[pid=${spawnedProcess.pid}] exception while trying to kill process: ${e}`); + } + } else { + options2.log(`[pid=${spawnedProcess.pid}] `); + } + } + function killProcessAndCleanup() { + killProcess(); + options2.log(`[pid=${spawnedProcess.pid || "N/A"}] starting temporary directories cleanup`); + for (const dir of options2.tempDirectories) { + try { + fs.rmSync(dir, { force: true, recursive: true, maxRetries: 5 }); + } catch (e) { + options2.log(`[pid=${spawnedProcess.pid || "N/A"}] exception while removing ${dir}: ${e}`); + } + } + options2.log(`[pid=${spawnedProcess.pid || "N/A"}] finished temporary directories cleanup`); + } + function killAndWait() { + killProcess(); + return waitForCleanup; + } + return { launchedProcess: spawnedProcess, gracefullyClose, kill: killAndWait }; +} +function envArrayToObject(env) { + const result = {}; + for (const { name, value } of env) + result[name] = value; + return result; +} +define_process_env_default.PWTEST_PROFILE_DIR || ""; +class SocksConnection { + constructor(uid, socket, client) { + this._buffer = Buffer.from([]); + this._offset = 0; + this._fence = 0; + this._uid = uid; + this._socket = socket; + this._client = client; + this._boundOnData = this._onData.bind(this); + socket.on("data", this._boundOnData); + socket.on("close", () => this._onClose()); + socket.on("end", () => this._onClose()); + socket.on("error", () => this._onClose()); + this._run().catch(() => this._socket.end()); + } + async _run() { + assert(await this._authenticate()); + const { command: command2, host, port } = await this._parseRequest(); + if (command2 !== 1) { + this._writeBytes(Buffer.from([ + 5, + 7, + 0, + // RSV + 1, + // IPv4 + 0, + 0, + 0, + 0, + // Address + 0, + 0 + // Port + ])); + return; + } + this._socket.off("data", this._boundOnData); + this._client.onSocketRequested({ uid: this._uid, host, port }); + } + async _authenticate() { + const version2 = await this._readByte(); + assert(version2 === 5, "The VER field must be set to x05 for this version of the protocol, was " + version2); + const nMethods = await this._readByte(); + assert(nMethods, "No authentication methods specified"); + const methods = await this._readBytes(nMethods); + for (const method of methods) { + if (method === 0) { + this._writeBytes(Buffer.from([version2, method])); + return true; + } + } + this._writeBytes(Buffer.from([ + version2, + 255 + /* NO_ACCEPTABLE_METHODS */ + ])); + return false; + } + async _parseRequest() { + const version2 = await this._readByte(); + assert(version2 === 5, "The VER field must be set to x05 for this version of the protocol, was " + version2); + const command2 = await this._readByte(); + await this._readByte(); + const addressType = await this._readByte(); + let host = ""; + switch (addressType) { + case 1: + host = (await this._readBytes(4)).join("."); + break; + case 3: + const length = await this._readByte(); + host = (await this._readBytes(length)).toString(); + break; + case 4: + const bytes = await this._readBytes(16); + const tokens = []; + for (let i = 0; i < 8; ++i) + tokens.push(bytes.readUInt16BE(i * 2).toString(16)); + host = tokens.join(":"); + break; + } + const port = (await this._readBytes(2)).readUInt16BE(0); + this._buffer = Buffer.from([]); + this._offset = 0; + this._fence = 0; + return { + command: command2, + host, + port + }; + } + async _readByte() { + const buffer2 = await this._readBytes(1); + return buffer2[0]; + } + async _readBytes(length) { + this._fence = this._offset + length; + if (!this._buffer || this._buffer.length < this._fence) + await new Promise((f) => this._fenceCallback = f); + this._offset += length; + return this._buffer.slice(this._offset - length, this._offset); + } + _writeBytes(buffer2) { + if (this._socket.writable) + this._socket.write(buffer2); + } + _onClose() { + this._client.onSocketClosed({ uid: this._uid }); + } + _onData(buffer2) { + this._buffer = Buffer.concat([this._buffer, buffer2]); + if (this._fenceCallback && this._buffer.length >= this._fence) { + const callback = this._fenceCallback; + this._fenceCallback = void 0; + callback(); + } + } + socketConnected(host, port) { + this._writeBytes(Buffer.from([ + 5, + 0, + 0, + // RSV + ...ipToSocksAddress(host), + // ATYP, Address + port >> 8, + port & 255 + // Port + ])); + this._socket.on("data", (data2) => this._client.onSocketData({ uid: this._uid, data: data2 })); + } + socketFailed(errorCode) { + const buffer2 = Buffer.from([ + 5, + 0, + 0, + // RSV + ...ipToSocksAddress("0.0.0.0"), + // ATYP, Address + 0, + 0 + // Port + ]); + switch (errorCode) { + case "ENOENT": + case "ENOTFOUND": + case "ETIMEDOUT": + case "EHOSTUNREACH": + buffer2[1] = 4; + break; + case "ENETUNREACH": + buffer2[1] = 3; + break; + case "ECONNREFUSED": + buffer2[1] = 5; + break; + case "ERULESET": + buffer2[1] = 2; + break; + } + this._writeBytes(buffer2); + this._socket.end(); + } + sendData(data2) { + this._socket.write(data2); + } + end() { + this._socket.end(); + } + error(error2) { + this._socket.destroy(new Error(error2)); + } +} +function hexToNumber(hex) { + return [...hex].reduce((value, digit2) => { + const code = digit2.charCodeAt(0); + if (code >= 48 && code <= 57) + return value + code; + if (code >= 97 && code <= 102) + return value + (code - 97) + 10; + if (code >= 65 && code <= 70) + return value + (code - 65) + 10; + throw new Error("Invalid IPv6 token " + hex); + }, 0); +} +function ipToSocksAddress(address) { + if (net.isIPv4(address)) { + return [ + 1, + // IPv4 + ...address.split(".", 4).map((t) => +t & 255) + // Address + ]; + } + if (net.isIPv6(address)) { + const result = [4]; + const tokens = address.split(":", 8); + while (tokens.length < 8) + tokens.unshift(""); + for (const token of tokens) { + const value = hexToNumber(token); + result.push(value >> 8 & 255, value & 255); + } + return result; + } + throw new Error("Only IPv4 and IPv6 addresses are supported"); +} +function starMatchToRegex(pattern) { + const source2 = pattern.split("*").map((s) => { + return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + }).join(".*"); + return new RegExp("^" + source2 + "$"); +} +function parsePattern(pattern) { + if (!pattern) + return () => false; + const matchers = pattern.split(",").map((token) => { + const match = token.match(/^(.*?)(?::(\d+))?$/); + if (!match) + throw new Error(`Unsupported token "${token}" in pattern "${pattern}"`); + const tokenPort = match[2] ? +match[2] : void 0; + const portMatches = (port) => tokenPort === void 0 || tokenPort === port; + let tokenHost = match[1]; + if (tokenHost === "") { + return (host, port) => { + if (!portMatches(port)) + return false; + return host === "localhost" || host.endsWith(".localhost") || host === "127.0.0.1" || host === "[::1]"; + }; + } + if (tokenHost === "*") + return (host, port) => portMatches(port); + if (net.isIPv4(tokenHost) || net.isIPv6(tokenHost)) + return (host, port) => host === tokenHost && portMatches(port); + if (tokenHost[0] === ".") + tokenHost = "*" + tokenHost; + const tokenRegex = starMatchToRegex(tokenHost); + return (host, port) => { + if (!portMatches(port)) + return false; + if (net.isIPv4(host) || net.isIPv6(host)) + return false; + return !!host.match(tokenRegex); + }; + }); + return (host, port) => matchers.some((matcher) => matcher(host, port)); +} +const _SocksProxy = class _SocksProxy2 extends EventEmitter$1 { + constructor() { + super(); + this._connections = /* @__PURE__ */ new Map(); + this._sockets = /* @__PURE__ */ new Set(); + this._closed = false; + this._patternMatcher = () => false; + this._directSockets = /* @__PURE__ */ new Map(); + this._server = new net.Server((socket) => { + const uid = createGuid(); + const connection = new SocksConnection(uid, socket, this); + this._connections.set(uid, connection); + }); + this._server.on("connection", (socket) => { + if (this._closed) { + socket.destroy(); + return; + } + this._sockets.add(socket); + socket.once("close", () => this._sockets.delete(socket)); + }); + } + setPattern(pattern) { + try { + this._patternMatcher = parsePattern(pattern); + } catch (e) { + this._patternMatcher = () => false; + } + } + async _handleDirect(request2) { + var _a2, _b2; + try { + const socket = await createSocket(request2.host, request2.port); + socket.on("data", (data2) => { + var _a3; + return (_a3 = this._connections.get(request2.uid)) == null ? void 0 : _a3.sendData(data2); + }); + socket.on("error", (error2) => { + var _a3; + (_a3 = this._connections.get(request2.uid)) == null ? void 0 : _a3.error(error2.message); + this._directSockets.delete(request2.uid); + }); + socket.on("end", () => { + var _a3; + (_a3 = this._connections.get(request2.uid)) == null ? void 0 : _a3.end(); + this._directSockets.delete(request2.uid); + }); + const localAddress = socket.localAddress; + const localPort = socket.localPort; + this._directSockets.set(request2.uid, socket); + (_a2 = this._connections.get(request2.uid)) == null ? void 0 : _a2.socketConnected(localAddress, localPort); + } catch (error2) { + (_b2 = this._connections.get(request2.uid)) == null ? void 0 : _b2.socketFailed(error2.code); + } + } + port() { + return this._port; + } + async listen(port, hostname) { + return new Promise((f) => { + this._server.listen(port, hostname, () => { + const port2 = this._server.address().port; + this._port = port2; + f(port2); + }); + }); + } + async close() { + if (this._closed) + return; + this._closed = true; + for (const socket of this._sockets) + socket.destroy(); + this._sockets.clear(); + await new Promise((f) => this._server.close(f)); + } + onSocketRequested(payload) { + if (!this._patternMatcher(payload.host, payload.port)) { + this._handleDirect(payload); + return; + } + this.emit(_SocksProxy2.Events.SocksRequested, payload); + } + onSocketData(payload) { + const direct = this._directSockets.get(payload.uid); + if (direct) { + direct.write(payload.data); + return; + } + this.emit(_SocksProxy2.Events.SocksData, payload); + } + onSocketClosed(payload) { + const direct = this._directSockets.get(payload.uid); + if (direct) { + direct.destroy(); + this._directSockets.delete(payload.uid); + return; + } + this.emit(_SocksProxy2.Events.SocksClosed, payload); + } + socketConnected({ uid, host, port }) { + var _a2; + (_a2 = this._connections.get(uid)) == null ? void 0 : _a2.socketConnected(host, port); + } + socketFailed({ uid, errorCode }) { + var _a2; + (_a2 = this._connections.get(uid)) == null ? void 0 : _a2.socketFailed(errorCode); + } + sendSocketData({ uid, data: data2 }) { + var _a2; + (_a2 = this._connections.get(uid)) == null ? void 0 : _a2.sendData(data2); + } + sendSocketEnd({ uid }) { + var _a2; + (_a2 = this._connections.get(uid)) == null ? void 0 : _a2.end(); + } + sendSocketError({ uid, error: error2 }) { + var _a2; + (_a2 = this._connections.get(uid)) == null ? void 0 : _a2.error(error2); + } +}; +_SocksProxy.Events = { + SocksRequested: "socksRequested", + SocksData: "socksData", + SocksClosed: "socksClosed" +}; +let SocksProxy = _SocksProxy; +const _SocksProxyHandler = class _SocksProxyHandler2 extends EventEmitter$1 { + constructor(pattern, redirectPortForTest) { + super(); + this._sockets = /* @__PURE__ */ new Map(); + this._patternMatcher = () => false; + this._patternMatcher = parsePattern(pattern); + this._redirectPortForTest = redirectPortForTest; + } + cleanup() { + for (const uid of this._sockets.keys()) + this.socketClosed({ uid }); + } + async socketRequested({ uid, host, port }) { + debugLogger.log("socks", `[${uid}] => request ${host}:${port}`); + if (!this._patternMatcher(host, port)) { + const payload = { uid, errorCode: "ERULESET" }; + debugLogger.log("socks", `[${uid}] <= pattern error ${payload.errorCode}`); + this.emit(_SocksProxyHandler2.Events.SocksFailed, payload); + return; + } + if (host === "local.playwright") + host = "localhost"; + try { + if (this._redirectPortForTest) + port = this._redirectPortForTest; + const socket = await createSocket(host, port); + socket.on("data", (data2) => { + const payload2 = { uid, data: data2 }; + this.emit(_SocksProxyHandler2.Events.SocksData, payload2); + }); + socket.on("error", (error2) => { + const payload2 = { uid, error: error2.message }; + debugLogger.log("socks", `[${uid}] <= network socket error ${payload2.error}`); + this.emit(_SocksProxyHandler2.Events.SocksError, payload2); + this._sockets.delete(uid); + }); + socket.on("end", () => { + const payload2 = { uid }; + debugLogger.log("socks", `[${uid}] <= network socket closed`); + this.emit(_SocksProxyHandler2.Events.SocksEnd, payload2); + this._sockets.delete(uid); + }); + const localAddress = socket.localAddress; + const localPort = socket.localPort; + this._sockets.set(uid, socket); + const payload = { uid, host: localAddress, port: localPort }; + debugLogger.log("socks", `[${uid}] <= connected to network ${payload.host}:${payload.port}`); + this.emit(_SocksProxyHandler2.Events.SocksConnected, payload); + } catch (error2) { + const payload = { uid, errorCode: error2.code }; + debugLogger.log("socks", `[${uid}] <= connect error ${payload.errorCode}`); + this.emit(_SocksProxyHandler2.Events.SocksFailed, payload); + } + } + sendSocketData({ uid, data: data2 }) { + var _a2; + (_a2 = this._sockets.get(uid)) == null ? void 0 : _a2.write(data2); + } + socketClosed({ uid }) { + var _a2; + debugLogger.log("socks", `[${uid}] <= browser socket closed`); + (_a2 = this._sockets.get(uid)) == null ? void 0 : _a2.destroy(); + this._sockets.delete(uid); + } +}; +_SocksProxyHandler.Events = { + SocksConnected: "socksConnected", + SocksData: "socksData", + SocksError: "socksError", + SocksFailed: "socksFailed", + SocksEnd: "socksEnd" +}; +let SocksProxyHandler = _SocksProxyHandler; +function makeWaitForNextTask() { + if (process.versions.electron) + return (callback) => setTimeout(callback, 0); + if (parseInt(process.versions.node, 10) >= 11) + return setImmediate; + let spinning = false; + const callbacks = []; + const loop = () => { + const callback = callbacks.shift(); + if (!callback) { + spinning = false; + return; + } + setImmediate(loop); + callback(); + }; + return (callback) => { + callbacks.push(callback); + if (!spinning) { + spinning = true; + setImmediate(loop); + } + }; +} +class ZipFile { + constructor(fileName) { + this._entries = /* @__PURE__ */ new Map(); + this._fileName = fileName; + this._openedPromise = this._open(); + } + async _open() { + await new Promise((fulfill, reject) => { + yauzl.open(this._fileName, { autoClose: false }, (e, z) => { + if (e) { + reject(e); + return; + } + this._zipFile = z; + this._zipFile.on("entry", (entry) => { + this._entries.set(entry.fileName, entry); + }); + this._zipFile.on("end", fulfill); + }); + }); + } + async entries() { + await this._openedPromise; + return [...this._entries.keys()]; + } + async read(entryPath) { + await this._openedPromise; + const entry = this._entries.get(entryPath); + if (!entry) + throw new Error(`${entryPath} not found in file ${this._fileName}`); + return new Promise((resolve, reject) => { + this._zipFile.openReadStream(entry, (error2, readStream) => { + if (error2 || !readStream) { + reject(error2 || "Entry not found"); + return; + } + const buffers = []; + readStream.on("data", (data2) => buffers.push(data2)); + readStream.on("end", () => resolve(Buffer.concat(buffers))); + }); + }); + } + close() { + var _a2; + (_a2 = this._zipFile) == null ? void 0 : _a2.close(); + } +} +const PACKAGE_PATH = path.join("playwright/packages/playwright-core/src/server/registry", "..", "..", ".."); +const BIN_PATH = path.join("playwright/packages/playwright-core/src/server/registry", "..", "..", "..", "bin"); +const PLAYWRIGHT_CDN_MIRRORS = [ + "https://cdn.playwright.dev/dbazure/download/playwright", + // ESRP CDN + "https://playwright.download.prss.microsoft.com/dbazure/download/playwright", + // Directly hit ESRP CDN + "https://cdn.playwright.dev" + // Hit the Storage Bucket directly +]; +if (define_process_env_default.PW_TEST_CDN_THAT_SHOULD_WORK) { + for (let i = 0; i < PLAYWRIGHT_CDN_MIRRORS.length; i++) { + const cdn = PLAYWRIGHT_CDN_MIRRORS[i]; + if (cdn !== define_process_env_default.PW_TEST_CDN_THAT_SHOULD_WORK) { + const parsedCDN = new URL(cdn); + parsedCDN.hostname = parsedCDN.hostname + ".does-not-resolve.playwright.dev"; + PLAYWRIGHT_CDN_MIRRORS[i] = parsedCDN.toString(); + } + } +} +const EXECUTABLE_PATHS = { + "chromium": { + "linux": ["chrome-linux", "chrome"], + "mac": ["chrome-mac", "Chromium.app", "Contents", "MacOS", "Chromium"], + "win": ["chrome-win", "chrome.exe"] + }, + "chromium-headless-shell": { + "linux": ["chrome-linux", "headless_shell"], + "mac": ["chrome-mac", "headless_shell"], + "win": ["chrome-win", "headless_shell.exe"] + }, + "firefox": { + "linux": ["firefox", "firefox"], + "mac": ["firefox", "Nightly.app", "Contents", "MacOS", "firefox"], + "win": ["firefox", "firefox.exe"] + }, + "webkit": { + "linux": ["pw_run.sh"], + "mac": ["pw_run.sh"], + "win": ["Playwright.exe"] + }, + "ffmpeg": { + "linux": ["ffmpeg-linux"], + "mac": ["ffmpeg-mac"], + "win": ["ffmpeg-win64.exe"] + }, + "winldd": { + "linux": void 0, + "mac": void 0, + "win": ["PrintDeps.exe"] + } +}; +const DOWNLOAD_PATHS = { + "chromium": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/chromium/%s/chromium-linux.zip", + "ubuntu22.04-x64": "builds/chromium/%s/chromium-linux.zip", + "ubuntu24.04-x64": "builds/chromium/%s/chromium-linux.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", + "ubuntu22.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", + "ubuntu24.04-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", + "debian11-x64": "builds/chromium/%s/chromium-linux.zip", + "debian11-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", + "debian12-x64": "builds/chromium/%s/chromium-linux.zip", + "debian12-arm64": "builds/chromium/%s/chromium-linux-arm64.zip", + "mac10.13": "builds/chromium/%s/chromium-mac.zip", + "mac10.14": "builds/chromium/%s/chromium-mac.zip", + "mac10.15": "builds/chromium/%s/chromium-mac.zip", + "mac11": "builds/chromium/%s/chromium-mac.zip", + "mac11-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", + "mac12": "builds/chromium/%s/chromium-mac.zip", + "mac12-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", + "mac13": "builds/chromium/%s/chromium-mac.zip", + "mac13-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", + "mac14": "builds/chromium/%s/chromium-mac.zip", + "mac14-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", + "mac15": "builds/chromium/%s/chromium-mac.zip", + "mac15-arm64": "builds/chromium/%s/chromium-mac-arm64.zip", + "win64": "builds/chromium/%s/chromium-win64.zip" + }, + "chromium-headless-shell": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", + "ubuntu22.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", + "ubuntu24.04-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", + "ubuntu22.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", + "ubuntu24.04-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", + "debian11-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", + "debian11-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", + "debian12-x64": "builds/chromium/%s/chromium-headless-shell-linux.zip", + "debian12-arm64": "builds/chromium/%s/chromium-headless-shell-linux-arm64.zip", + "mac10.13": void 0, + "mac10.14": void 0, + "mac10.15": void 0, + "mac11": "builds/chromium/%s/chromium-headless-shell-mac.zip", + "mac11-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", + "mac12": "builds/chromium/%s/chromium-headless-shell-mac.zip", + "mac12-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", + "mac13": "builds/chromium/%s/chromium-headless-shell-mac.zip", + "mac13-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", + "mac14": "builds/chromium/%s/chromium-headless-shell-mac.zip", + "mac14-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", + "mac15": "builds/chromium/%s/chromium-headless-shell-mac.zip", + "mac15-arm64": "builds/chromium/%s/chromium-headless-shell-mac-arm64.zip", + "win64": "builds/chromium/%s/chromium-headless-shell-win64.zip" + }, + "chromium-tip-of-tree": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", + "ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", + "ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", + "ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", + "ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", + "debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", + "debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", + "debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip", + "debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip", + "mac10.13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac10.14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac10.15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", + "mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", + "mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", + "mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", + "mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac.zip", + "mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-mac-arm64.zip", + "win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-win64.zip" + }, + "chromium-tip-of-tree-headless-shell": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", + "ubuntu22.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", + "ubuntu24.04-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", + "ubuntu22.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", + "ubuntu24.04-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", + "debian11-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", + "debian11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", + "debian12-x64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux.zip", + "debian12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-linux-arm64.zip", + "mac10.13": void 0, + "mac10.14": void 0, + "mac10.15": void 0, + "mac11": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", + "mac11-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", + "mac12": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", + "mac12-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", + "mac13": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", + "mac13-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", + "mac14": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", + "mac14-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", + "mac15": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac.zip", + "mac15-arm64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-mac-arm64.zip", + "win64": "builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-headless-shell-win64.zip" + }, + "firefox": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/firefox/%s/firefox-ubuntu-20.04.zip", + "ubuntu22.04-x64": "builds/firefox/%s/firefox-ubuntu-22.04.zip", + "ubuntu24.04-x64": "builds/firefox/%s/firefox-ubuntu-24.04.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/firefox/%s/firefox-ubuntu-20.04-arm64.zip", + "ubuntu22.04-arm64": "builds/firefox/%s/firefox-ubuntu-22.04-arm64.zip", + "ubuntu24.04-arm64": "builds/firefox/%s/firefox-ubuntu-24.04-arm64.zip", + "debian11-x64": "builds/firefox/%s/firefox-debian-11.zip", + "debian11-arm64": "builds/firefox/%s/firefox-debian-11-arm64.zip", + "debian12-x64": "builds/firefox/%s/firefox-debian-12.zip", + "debian12-arm64": "builds/firefox/%s/firefox-debian-12-arm64.zip", + "mac10.13": "builds/firefox/%s/firefox-mac.zip", + "mac10.14": "builds/firefox/%s/firefox-mac.zip", + "mac10.15": "builds/firefox/%s/firefox-mac.zip", + "mac11": "builds/firefox/%s/firefox-mac.zip", + "mac11-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", + "mac12": "builds/firefox/%s/firefox-mac.zip", + "mac12-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", + "mac13": "builds/firefox/%s/firefox-mac.zip", + "mac13-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", + "mac14": "builds/firefox/%s/firefox-mac.zip", + "mac14-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", + "mac15": "builds/firefox/%s/firefox-mac.zip", + "mac15-arm64": "builds/firefox/%s/firefox-mac-arm64.zip", + "win64": "builds/firefox/%s/firefox-win64.zip" + }, + "firefox-beta": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip", + "ubuntu22.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-22.04.zip", + "ubuntu24.04-x64": "builds/firefox-beta/%s/firefox-beta-ubuntu-24.04.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": void 0, + "ubuntu22.04-arm64": "builds/firefox-beta/%s/firefox-beta-ubuntu-22.04-arm64.zip", + "ubuntu24.04-arm64": "builds/firefox-beta/%s/firefox-beta-ubuntu-24.04-arm64.zip", + "debian11-x64": "builds/firefox-beta/%s/firefox-beta-debian-11.zip", + "debian11-arm64": "builds/firefox-beta/%s/firefox-beta-debian-11-arm64.zip", + "debian12-x64": "builds/firefox-beta/%s/firefox-beta-debian-12.zip", + "debian12-arm64": "builds/firefox-beta/%s/firefox-beta-debian-12-arm64.zip", + "mac10.13": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac10.14": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac10.15": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac11": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac11-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", + "mac12": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac12-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", + "mac13": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac13-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", + "mac14": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac14-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", + "mac15": "builds/firefox-beta/%s/firefox-beta-mac.zip", + "mac15-arm64": "builds/firefox-beta/%s/firefox-beta-mac-arm64.zip", + "win64": "builds/firefox-beta/%s/firefox-beta-win64.zip" + }, + "webkit": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/webkit/%s/webkit-ubuntu-20.04.zip", + "ubuntu22.04-x64": "builds/webkit/%s/webkit-ubuntu-22.04.zip", + "ubuntu24.04-x64": "builds/webkit/%s/webkit-ubuntu-24.04.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/webkit/%s/webkit-ubuntu-20.04-arm64.zip", + "ubuntu22.04-arm64": "builds/webkit/%s/webkit-ubuntu-22.04-arm64.zip", + "ubuntu24.04-arm64": "builds/webkit/%s/webkit-ubuntu-24.04-arm64.zip", + "debian11-x64": "builds/webkit/%s/webkit-debian-11.zip", + "debian11-arm64": "builds/webkit/%s/webkit-debian-11-arm64.zip", + "debian12-x64": "builds/webkit/%s/webkit-debian-12.zip", + "debian12-arm64": "builds/webkit/%s/webkit-debian-12-arm64.zip", + "mac10.13": void 0, + "mac10.14": "builds/deprecated-webkit-mac-10.14/%s/deprecated-webkit-mac-10.14.zip", + "mac10.15": "builds/deprecated-webkit-mac-10.15/%s/deprecated-webkit-mac-10.15.zip", + "mac11": "builds/webkit/%s/webkit-mac-11.zip", + "mac11-arm64": "builds/webkit/%s/webkit-mac-11-arm64.zip", + "mac12": "builds/webkit/%s/webkit-mac-12.zip", + "mac12-arm64": "builds/webkit/%s/webkit-mac-12-arm64.zip", + "mac13": "builds/webkit/%s/webkit-mac-13.zip", + "mac13-arm64": "builds/webkit/%s/webkit-mac-13-arm64.zip", + "mac14": "builds/webkit/%s/webkit-mac-14.zip", + "mac14-arm64": "builds/webkit/%s/webkit-mac-14-arm64.zip", + "mac15": "builds/webkit/%s/webkit-mac-15.zip", + "mac15-arm64": "builds/webkit/%s/webkit-mac-15-arm64.zip", + "win64": "builds/webkit/%s/webkit-win64.zip" + }, + "ffmpeg": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", + "ubuntu22.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", + "ubuntu24.04-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", + "ubuntu22.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", + "ubuntu24.04-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", + "debian11-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", + "debian11-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", + "debian12-x64": "builds/ffmpeg/%s/ffmpeg-linux.zip", + "debian12-arm64": "builds/ffmpeg/%s/ffmpeg-linux-arm64.zip", + "mac10.13": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac10.14": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac10.15": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac11": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac11-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", + "mac12": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac12-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", + "mac13": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac13-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", + "mac14": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac14-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", + "mac15": "builds/ffmpeg/%s/ffmpeg-mac.zip", + "mac15-arm64": "builds/ffmpeg/%s/ffmpeg-mac-arm64.zip", + "win64": "builds/ffmpeg/%s/ffmpeg-win64.zip" + }, + "winldd": { + "": void 0, + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": void 0, + "ubuntu22.04-x64": void 0, + "ubuntu24.04-x64": void 0, + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": void 0, + "ubuntu22.04-arm64": void 0, + "ubuntu24.04-arm64": void 0, + "debian11-x64": void 0, + "debian11-arm64": void 0, + "debian12-x64": void 0, + "debian12-arm64": void 0, + "mac10.13": void 0, + "mac10.14": void 0, + "mac10.15": void 0, + "mac11": void 0, + "mac11-arm64": void 0, + "mac12": void 0, + "mac12-arm64": void 0, + "mac13": void 0, + "mac13-arm64": void 0, + "mac14": void 0, + "mac14-arm64": void 0, + "mac15": void 0, + "mac15-arm64": void 0, + "win64": "builds/winldd/%s/winldd-win64.zip" + }, + "android": { + "": "builds/android/%s/android.zip", + "ubuntu18.04-x64": void 0, + "ubuntu20.04-x64": "builds/android/%s/android.zip", + "ubuntu22.04-x64": "builds/android/%s/android.zip", + "ubuntu24.04-x64": "builds/android/%s/android.zip", + "ubuntu18.04-arm64": void 0, + "ubuntu20.04-arm64": "builds/android/%s/android.zip", + "ubuntu22.04-arm64": "builds/android/%s/android.zip", + "ubuntu24.04-arm64": "builds/android/%s/android.zip", + "debian11-x64": "builds/android/%s/android.zip", + "debian11-arm64": "builds/android/%s/android.zip", + "debian12-x64": "builds/android/%s/android.zip", + "debian12-arm64": "builds/android/%s/android.zip", + "mac10.13": "builds/android/%s/android.zip", + "mac10.14": "builds/android/%s/android.zip", + "mac10.15": "builds/android/%s/android.zip", + "mac11": "builds/android/%s/android.zip", + "mac11-arm64": "builds/android/%s/android.zip", + "mac12": "builds/android/%s/android.zip", + "mac12-arm64": "builds/android/%s/android.zip", + "mac13": "builds/android/%s/android.zip", + "mac13-arm64": "builds/android/%s/android.zip", + "mac14": "builds/android/%s/android.zip", + "mac14-arm64": "builds/android/%s/android.zip", + "mac15": "builds/android/%s/android.zip", + "mac15-arm64": "builds/android/%s/android.zip", + "win64": "builds/android/%s/android.zip" + }, + // TODO(bidi): implement downloads. + "bidi": {} +}; +const registryDirectory = (() => { + let result; + const envDefined = getFromENV("PLAYWRIGHT_BROWSERS_PATH"); + if (envDefined === "0") { + result = path.join("playwright/packages/playwright-core/src/server/registry", "..", "..", "..", ".local-browsers"); + } else if (envDefined) { + result = envDefined; + } else { + let cacheDirectory; + if (process.platform === "linux") + cacheDirectory = define_process_env_default.XDG_CACHE_HOME || path.join(os.homedir(), ".cache"); + else if (process.platform === "darwin") + cacheDirectory = path.join(os.homedir(), "Library", "Caches"); + else if (process.platform === "win32") + cacheDirectory = define_process_env_default.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Local"); + else + throw new Error("Unsupported platform: " + process.platform); + result = path.join(cacheDirectory, "ms-playwright"); + } + if (!path.isAbsolute(result)) { + result = path.resolve(getFromENV("INIT_CWD") || process.cwd(), result); + } + return result; +})(); +function isBrowserDirectory(browserDirectory) { + const baseName = path.basename(browserDirectory); + for (const browserName of allDownloadable) { + if (baseName.startsWith(browserName.replace(/-/g, "_") + "-")) + return true; + } + return false; +} +function readDescriptors(browsersJSON) { + return browsersJSON["browsers"].map((obj) => { + const name = obj.name; + const revisionOverride = (obj.revisionOverrides || {})[hostPlatform]; + const revision = revisionOverride || obj.revision; + const browserDirectoryPrefix = revisionOverride ? `${name}_${hostPlatform}_special` : `${name}`; + const descriptor = { + name, + revision, + hasRevisionOverride: !!revisionOverride, + // We only put browser version for the supported operating systems. + browserVersion: revisionOverride ? void 0 : obj.browserVersion, + installByDefault: !!obj.installByDefault, + // Method `isBrowserDirectory` determines directory to be browser iff + // it starts with some browser name followed by '-'. Some browser names + // are prefixes of others, e.g. 'webkit' is a prefix of `webkit-technology-preview`. + // To avoid older registries erroneously removing 'webkit-technology-preview', we have to + // ensure that browser folders to never include dashes inside. + dir: path.join(registryDirectory, browserDirectoryPrefix.replace(/-/g, "_") + "-" + revision) + }; + return descriptor; + }); +} +const allDownloadable = ["android", "chromium", "firefox", "webkit", "ffmpeg", "firefox-beta", "chromium-tip-of-tree", "chromium-headless-shell", "chromium-tip-of-tree-headless-shell"]; +class Registry { + constructor(browsersJSON) { + const descriptors = readDescriptors(browsersJSON); + const findExecutablePath = (dir, name) => { + let tokens = void 0; + if (process.platform === "linux") + tokens = EXECUTABLE_PATHS[name]["linux"]; + else if (process.platform === "darwin") + tokens = EXECUTABLE_PATHS[name]["mac"]; + else if (process.platform === "win32") + tokens = EXECUTABLE_PATHS[name]["win"]; + return tokens ? path.join(dir, ...tokens) : void 0; + }; + const executablePathOrDie = (name, e, installByDefault, sdkLanguage) => { + if (!e) + throw new Error(`${name} is not supported on ${hostPlatform}`); + const installCommand = buildPlaywrightCLICommand(sdkLanguage, `install${installByDefault ? "" : " " + name}`); + if (!canAccessFile(e)) { + const currentDockerVersion = readDockerVersionSync(); + const preferredDockerVersion = currentDockerVersion ? dockerVersion(currentDockerVersion.dockerImageNameTemplate) : null; + const isOutdatedDockerImage = currentDockerVersion && preferredDockerVersion && currentDockerVersion.dockerImageName !== preferredDockerVersion.dockerImageName; + const prettyMessage = isOutdatedDockerImage ? [ + `Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just updated to ${preferredDockerVersion.driverVersion}.`, + `Please update docker image as well.`, + `- current: ${currentDockerVersion.dockerImageName}`, + `- required: ${preferredDockerVersion.dockerImageName}`, + ``, + `<3 Playwright Team` + ].join("\n") : [ + `Looks like ${sdkLanguage === "javascript" ? "Playwright Test or " : ""}Playwright was just installed or updated.`, + `Please run the following command to download new browser${installByDefault ? "s" : ""}:`, + ``, + ` ${installCommand}`, + ``, + `<3 Playwright Team` + ].join("\n"); + throw new Error(`Executable doesn't exist at ${e} +${wrapInASCIIBox(prettyMessage, 1)}`); + } + return e; + }; + this._executables = []; + const chromium = descriptors.find((d) => d.name === "chromium"); + const chromiumExecutable = findExecutablePath(chromium.dir, "chromium"); + this._executables.push({ + type: "browser", + name: "chromium", + browserName: "chromium", + directory: chromium.dir, + executablePath: () => chromiumExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage), + installType: chromium.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]), + downloadURLs: this._downloadURLs(chromium), + browserVersion: chromium.browserVersion, + _install: () => this._downloadExecutable(chromium, chromiumExecutable), + _dependencyGroup: "chromium", + _isHermeticInstallation: true + }); + const chromiumHeadlessShell = descriptors.find((d) => d.name === "chromium-headless-shell"); + const chromiumHeadlessShellExecutable = findExecutablePath(chromiumHeadlessShell.dir, "chromium-headless-shell"); + this._executables.push({ + type: "channel", + name: "chromium-headless-shell", + browserName: "chromium", + directory: chromiumHeadlessShell.dir, + executablePath: () => chromiumHeadlessShellExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumHeadlessShellExecutable, chromiumHeadlessShell.installByDefault, sdkLanguage), + installType: chromiumHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]), + downloadURLs: this._downloadURLs(chromiumHeadlessShell), + browserVersion: chromium.browserVersion, + _install: () => this._downloadExecutable(chromiumHeadlessShell, chromiumHeadlessShellExecutable), + _dependencyGroup: "chromium", + _isHermeticInstallation: true + }); + const chromiumTipOfTreeHeadlessShell = descriptors.find((d) => d.name === "chromium-tip-of-tree-headless-shell"); + const chromiumTipOfTreeHeadlessShellExecutable = findExecutablePath(chromiumTipOfTreeHeadlessShell.dir, "chromium-headless-shell"); + this._executables.push({ + type: "channel", + name: "chromium-tip-of-tree-headless-shell", + browserName: "chromium", + directory: chromiumTipOfTreeHeadlessShell.dir, + executablePath: () => chromiumTipOfTreeHeadlessShellExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumTipOfTreeHeadlessShellExecutable, chromiumTipOfTreeHeadlessShell.installByDefault, sdkLanguage), + installType: chromiumTipOfTreeHeadlessShell.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTreeHeadlessShell.dir, ["chrome-linux"], [], ["chrome-win"]), + downloadURLs: this._downloadURLs(chromiumTipOfTreeHeadlessShell), + browserVersion: chromium.browserVersion, + _install: () => this._downloadExecutable(chromiumTipOfTreeHeadlessShell, chromiumTipOfTreeHeadlessShellExecutable), + _dependencyGroup: "chromium", + _isHermeticInstallation: true + }); + const chromiumTipOfTree = descriptors.find((d) => d.name === "chromium-tip-of-tree"); + const chromiumTipOfTreeExecutable = findExecutablePath(chromiumTipOfTree.dir, "chromium"); + this._executables.push({ + type: "tool", + name: "chromium-tip-of-tree", + browserName: "chromium", + directory: chromiumTipOfTree.dir, + executablePath: () => chromiumTipOfTreeExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium-tip-of-tree", chromiumTipOfTreeExecutable, chromiumTipOfTree.installByDefault, sdkLanguage), + installType: chromiumTipOfTree.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromiumTipOfTree.dir, ["chrome-linux"], [], ["chrome-win"]), + downloadURLs: this._downloadURLs(chromiumTipOfTree), + browserVersion: chromiumTipOfTree.browserVersion, + _install: () => this._downloadExecutable(chromiumTipOfTree, chromiumTipOfTreeExecutable), + _dependencyGroup: "chromium", + _isHermeticInstallation: true + }); + this._executables.push(this._createChromiumChannel("chrome", { + "linux": "/opt/google/chrome/chrome", + "darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "win32": `\\Google\\Chrome\\Application\\chrome.exe` + }, () => this._installChromiumChannel("chrome", { + "linux": "reinstall_chrome_stable_linux.sh", + "darwin": "reinstall_chrome_stable_mac.sh", + "win32": "reinstall_chrome_stable_win.ps1" + }))); + this._executables.push(this._createChromiumChannel("chrome-beta", { + "linux": "/opt/google/chrome-beta/chrome", + "darwin": "/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta", + "win32": `\\Google\\Chrome Beta\\Application\\chrome.exe` + }, () => this._installChromiumChannel("chrome-beta", { + "linux": "reinstall_chrome_beta_linux.sh", + "darwin": "reinstall_chrome_beta_mac.sh", + "win32": "reinstall_chrome_beta_win.ps1" + }))); + this._executables.push(this._createChromiumChannel("chrome-dev", { + "linux": "/opt/google/chrome-unstable/chrome", + "darwin": "/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev", + "win32": `\\Google\\Chrome Dev\\Application\\chrome.exe` + })); + this._executables.push(this._createChromiumChannel("chrome-canary", { + "linux": "", + "darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", + "win32": `\\Google\\Chrome SxS\\Application\\chrome.exe` + })); + this._executables.push(this._createChromiumChannel("msedge", { + "linux": "/opt/microsoft/msedge/msedge", + "darwin": "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge", + "win32": `\\Microsoft\\Edge\\Application\\msedge.exe` + }, () => this._installMSEdgeChannel("msedge", { + "linux": "reinstall_msedge_stable_linux.sh", + "darwin": "reinstall_msedge_stable_mac.sh", + "win32": "reinstall_msedge_stable_win.ps1" + }))); + this._executables.push(this._createChromiumChannel("msedge-beta", { + "linux": "/opt/microsoft/msedge-beta/msedge", + "darwin": "/Applications/Microsoft Edge Beta.app/Contents/MacOS/Microsoft Edge Beta", + "win32": `\\Microsoft\\Edge Beta\\Application\\msedge.exe` + }, () => this._installMSEdgeChannel("msedge-beta", { + "darwin": "reinstall_msedge_beta_mac.sh", + "linux": "reinstall_msedge_beta_linux.sh", + "win32": "reinstall_msedge_beta_win.ps1" + }))); + this._executables.push(this._createChromiumChannel("msedge-dev", { + "linux": "/opt/microsoft/msedge-dev/msedge", + "darwin": "/Applications/Microsoft Edge Dev.app/Contents/MacOS/Microsoft Edge Dev", + "win32": `\\Microsoft\\Edge Dev\\Application\\msedge.exe` + }, () => this._installMSEdgeChannel("msedge-dev", { + "darwin": "reinstall_msedge_dev_mac.sh", + "linux": "reinstall_msedge_dev_linux.sh", + "win32": "reinstall_msedge_dev_win.ps1" + }))); + this._executables.push(this._createChromiumChannel("msedge-canary", { + "linux": "", + "darwin": "/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary", + "win32": `\\Microsoft\\Edge SxS\\Application\\msedge.exe` + })); + this._executables.push(this._createBidiFirefoxChannel("moz-firefox", { + "linux": "/snap/bin/firefox", + "darwin": "/Applications/Firefox.app/Contents/MacOS/firefox", + "win32": "\\Mozilla Firefox\\firefox.exe" + })); + this._executables.push(this._createBidiFirefoxChannel("moz-firefox-beta", { + "linux": "/opt/firefox-beta/firefox", + "darwin": "/Applications/Firefox.app/Contents/MacOS/firefox", + "win32": "\\Mozilla Firefox\\firefox.exe" + })); + this._executables.push(this._createBidiFirefoxChannel("moz-firefox-nightly", { + "linux": "/opt/firefox-nightly/firefox", + "darwin": "/Applications/Firefox Nightly.app/Contents/MacOS/firefox", + "win32": "\\Mozilla Firefox\\firefox.exe" + })); + this._executables.push(this._createBidiChromiumChannel("bidi-chrome-stable", { + "linux": "/opt/google/chrome/chrome", + "darwin": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "win32": `\\Google\\Chrome\\Application\\chrome.exe` + })); + this._executables.push(this._createBidiChromiumChannel("bidi-chrome-canary", { + "linux": "", + "darwin": "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", + "win32": `\\Google\\Chrome SxS\\Application\\chrome.exe` + })); + this._executables.push({ + type: "browser", + name: "bidi-chromium", + browserName: "bidi", + directory: chromium.dir, + executablePath: () => chromiumExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("chromium", chromiumExecutable, chromium.installByDefault, sdkLanguage), + installType: "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, chromium.dir, ["chrome-linux"], [], ["chrome-win"]), + downloadURLs: this._downloadURLs(chromium), + browserVersion: chromium.browserVersion, + _install: () => this._downloadExecutable(chromium, chromiumExecutable), + _dependencyGroup: "chromium", + _isHermeticInstallation: true + }); + const firefox = descriptors.find((d) => d.name === "firefox"); + const firefoxExecutable = findExecutablePath(firefox.dir, "firefox"); + this._executables.push({ + type: "browser", + name: "firefox", + browserName: "firefox", + directory: firefox.dir, + executablePath: () => firefoxExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("firefox", firefoxExecutable, firefox.installByDefault, sdkLanguage), + installType: firefox.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefox.dir, ["firefox"], [], ["firefox"]), + downloadURLs: this._downloadURLs(firefox), + browserVersion: firefox.browserVersion, + _install: () => this._downloadExecutable(firefox, firefoxExecutable), + _dependencyGroup: "firefox", + _isHermeticInstallation: true + }); + const firefoxBeta = descriptors.find((d) => d.name === "firefox-beta"); + const firefoxBetaExecutable = findExecutablePath(firefoxBeta.dir, "firefox"); + this._executables.push({ + type: "tool", + name: "firefox-beta", + browserName: "firefox", + directory: firefoxBeta.dir, + executablePath: () => firefoxBetaExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("firefox-beta", firefoxBetaExecutable, firefoxBeta.installByDefault, sdkLanguage), + installType: firefoxBeta.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, firefoxBeta.dir, ["firefox"], [], ["firefox"]), + downloadURLs: this._downloadURLs(firefoxBeta), + browserVersion: firefoxBeta.browserVersion, + _install: () => this._downloadExecutable(firefoxBeta, firefoxBetaExecutable), + _dependencyGroup: "firefox", + _isHermeticInstallation: true + }); + const webkit = descriptors.find((d) => d.name === "webkit"); + const webkitExecutable = findExecutablePath(webkit.dir, "webkit"); + const webkitLinuxLddDirectories = [ + path.join("minibrowser-gtk"), + path.join("minibrowser-gtk", "bin"), + path.join("minibrowser-gtk", "lib"), + path.join("minibrowser-gtk", "sys", "lib"), + path.join("minibrowser-wpe"), + path.join("minibrowser-wpe", "bin"), + path.join("minibrowser-wpe", "lib"), + path.join("minibrowser-wpe", "sys", "lib") + ]; + this._executables.push({ + type: "browser", + name: "webkit", + browserName: "webkit", + directory: webkit.dir, + executablePath: () => webkitExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("webkit", webkitExecutable, webkit.installByDefault, sdkLanguage), + installType: webkit.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: (sdkLanguage) => this._validateHostRequirements(sdkLanguage, webkit.dir, webkitLinuxLddDirectories, ["libGLESv2.so.2", "libx264.so"], [""]), + downloadURLs: this._downloadURLs(webkit), + browserVersion: webkit.browserVersion, + _install: () => this._downloadExecutable(webkit, webkitExecutable), + _dependencyGroup: "webkit", + _isHermeticInstallation: true + }); + const ffmpeg = descriptors.find((d) => d.name === "ffmpeg"); + const ffmpegExecutable = findExecutablePath(ffmpeg.dir, "ffmpeg"); + this._executables.push({ + type: "tool", + name: "ffmpeg", + browserName: void 0, + directory: ffmpeg.dir, + executablePath: () => ffmpegExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("ffmpeg", ffmpegExecutable, ffmpeg.installByDefault, sdkLanguage), + installType: ffmpeg.installByDefault ? "download-by-default" : "download-on-demand", + _validateHostRequirements: () => Promise.resolve(), + downloadURLs: this._downloadURLs(ffmpeg), + _install: () => this._downloadExecutable(ffmpeg, ffmpegExecutable), + _dependencyGroup: "tools", + _isHermeticInstallation: true + }); + const winldd = descriptors.find((d) => d.name === "winldd"); + const winlddExecutable = findExecutablePath(winldd.dir, "winldd"); + this._executables.push({ + type: "tool", + name: "winldd", + browserName: void 0, + directory: winldd.dir, + executablePath: () => winlddExecutable, + executablePathOrDie: (sdkLanguage) => executablePathOrDie("winldd", winlddExecutable, winldd.installByDefault, sdkLanguage), + installType: process.platform === "win32" ? "download-by-default" : "none", + _validateHostRequirements: () => Promise.resolve(), + downloadURLs: this._downloadURLs(winldd), + _install: () => this._downloadExecutable(winldd, winlddExecutable), + _dependencyGroup: "tools", + _isHermeticInstallation: true + }); + const android = descriptors.find((d) => d.name === "android"); + this._executables.push({ + type: "tool", + name: "android", + browserName: void 0, + directory: android.dir, + executablePath: () => void 0, + executablePathOrDie: () => "", + installType: "download-on-demand", + _validateHostRequirements: () => Promise.resolve(), + downloadURLs: this._downloadURLs(android), + _install: () => this._downloadExecutable(android), + _dependencyGroup: "tools", + _isHermeticInstallation: true + }); + this._executables.push({ + type: "browser", + name: "bidi", + browserName: "bidi", + directory: void 0, + executablePath: () => void 0, + executablePathOrDie: () => "", + installType: "none", + _validateHostRequirements: () => Promise.resolve(), + downloadURLs: [], + _install: () => Promise.resolve(), + _dependencyGroup: "tools", + _isHermeticInstallation: true + }); + } + _createChromiumChannel(name, lookAt, install) { + const executablePath = (sdkLanguage, shouldThrow) => { + const suffix = lookAt[process.platform]; + if (!suffix) { + if (shouldThrow) + throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`); + return void 0; + } + const prefixes = process.platform === "win32" ? [ + define_process_env_default.LOCALAPPDATA, + define_process_env_default.PROGRAMFILES, + define_process_env_default["PROGRAMFILES(X86)"], + // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set. + define_process_env_default.HOMEDRIVE + "\\Program Files", + define_process_env_default.HOMEDRIVE + "\\Program Files (x86)" + ].filter(Boolean) : [""]; + for (const prefix of prefixes) { + const executablePath2 = path.join(prefix, suffix); + if (canAccessFile(executablePath2)) + return executablePath2; + } + if (!shouldThrow) + return void 0; + const location2 = prefixes.length ? ` at ${path.join(prefixes[0], suffix)}` : ``; + const installation = install ? ` +Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : ""; + throw new Error(`Chromium distribution '${name}' is not found${location2}${installation}`); + }; + return { + type: "channel", + name, + browserName: "chromium", + directory: void 0, + executablePath: (sdkLanguage) => executablePath(sdkLanguage, false), + executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true), + installType: install ? "install-script" : "none", + _validateHostRequirements: () => Promise.resolve(), + _isHermeticInstallation: false, + _install: install + }; + } + _createBidiFirefoxChannel(name, lookAt, install) { + const executablePath = (sdkLanguage, shouldThrow) => { + const suffix = lookAt[process.platform]; + if (!suffix) { + if (shouldThrow) + throw new Error(`Firefox distribution '${name}' is not supported on ${process.platform}`); + return void 0; + } + const prefixes = process.platform === "win32" ? [ + define_process_env_default.LOCALAPPDATA, + define_process_env_default.PROGRAMFILES, + define_process_env_default["PROGRAMFILES(X86)"], + // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set. + define_process_env_default.HOMEDRIVE + "\\Program Files", + define_process_env_default.HOMEDRIVE + "\\Program Files (x86)" + ].filter(Boolean) : [""]; + for (const prefix of prefixes) { + const executablePath2 = path.join(prefix, suffix); + if (canAccessFile(executablePath2)) + return executablePath2; + } + if (shouldThrow) + throw new Error(`Cannot find Firefox installation for channel '${name}' at the standard system paths.`); + return void 0; + }; + return { + type: "channel", + name, + browserName: "bidi", + directory: void 0, + executablePath: (sdkLanguage) => executablePath(sdkLanguage, false), + executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true), + installType: "none", + _validateHostRequirements: () => Promise.resolve(), + _isHermeticInstallation: true, + _install: install + }; + } + _createBidiChromiumChannel(name, lookAt, install) { + const executablePath = (sdkLanguage, shouldThrow) => { + const suffix = lookAt[process.platform]; + if (!suffix) { + if (shouldThrow) + throw new Error(`Firefox distribution '${name}' is not supported on ${process.platform}`); + return void 0; + } + const prefixes = process.platform === "win32" ? [ + define_process_env_default.LOCALAPPDATA, + define_process_env_default.PROGRAMFILES, + define_process_env_default["PROGRAMFILES(X86)"], + // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set. + define_process_env_default.HOMEDRIVE + "\\Program Files", + define_process_env_default.HOMEDRIVE + "\\Program Files (x86)" + ].filter(Boolean) : [""]; + for (const prefix of prefixes) { + const executablePath2 = path.join(prefix, suffix); + if (canAccessFile(executablePath2)) + return executablePath2; + } + if (!shouldThrow) + return void 0; + const location2 = prefixes.length ? ` at ${path.join(prefixes[0], suffix)}` : ``; + const installation = install ? ` +Run "${buildPlaywrightCLICommand(sdkLanguage, "install " + name)}"` : ""; + throw new Error(`Chromium distribution '${name}' is not found${location2}${installation}`); + }; + return { + type: "channel", + name, + browserName: "bidi", + directory: void 0, + executablePath: (sdkLanguage) => executablePath(sdkLanguage, false), + executablePathOrDie: (sdkLanguage) => executablePath(sdkLanguage, true), + installType: install ? "install-script" : "none", + _validateHostRequirements: () => Promise.resolve(), + _isHermeticInstallation: false, + _install: install + }; + } + executables() { + return this._executables; + } + findExecutable(name) { + return this._executables.find((b) => b.name === name); + } + defaultExecutables() { + return this._executables.filter((e) => e.installType === "download-by-default"); + } + _dedupe(executables) { + return Array.from(new Set(executables)); + } + async _validateHostRequirements(sdkLanguage, browserDirectory, linuxLddDirectories, dlOpenLibraries, windowsExeAndDllDirectories) { + if (os.platform() === "linux") + return await validateDependenciesLinux(sdkLanguage, linuxLddDirectories.map((d) => path.join(browserDirectory, d)), dlOpenLibraries); + if (os.platform() === "win32" && os.arch() === "x64") + return await validateDependenciesWindows(sdkLanguage, windowsExeAndDllDirectories.map((d) => path.join(browserDirectory, d))); + } + async installDeps(executablesToInstallDeps, dryRun) { + const executables = this._dedupe(executablesToInstallDeps); + const targets = /* @__PURE__ */ new Set(); + for (const executable of executables) { + if (executable._dependencyGroup) + targets.add(executable._dependencyGroup); + } + targets.add("tools"); + if (os.platform() === "win32") + return await installDependenciesWindows(targets, dryRun); + if (os.platform() === "linux") + return await installDependenciesLinux(targets, dryRun); + } + async install(executablesToInstall, forceReinstall) { + const executables = this._dedupe(executablesToInstall); + await fs.promises.mkdir(registryDirectory, { recursive: true }); + const lockfilePath = path.join(registryDirectory, "__dirlock"); + const linksDir = path.join(registryDirectory, ".links"); + let releaseLock; + try { + releaseLock = await lockfile.lock(registryDirectory, { + retries: { + // Retry 20 times during 10 minutes with + // exponential back-off. + // See documentation at: https://www.npmjs.com/package/retry#retrytimeoutsoptions + retries: 20, + factor: 1.27579 + }, + onCompromised: (err) => { + throw new Error(`${err.message} Path: ${lockfilePath}`); + }, + lockfilePath + }); + await fs.promises.mkdir(linksDir, { recursive: true }); + await fs.promises.writeFile(path.join(linksDir, calculateSha1(PACKAGE_PATH)), PACKAGE_PATH); + if (!getAsBooleanFromENV("PLAYWRIGHT_SKIP_BROWSER_GC")) + await this._validateInstallationCache(linksDir); + for (const executable of executables) { + if (!executable._install) + throw new Error(`ERROR: Playwright does not support installing ${executable.name}`); + const { embedderName } = getEmbedderName(); + if (!getAsBooleanFromENV("CI") && !executable._isHermeticInstallation && !forceReinstall && executable.executablePath(embedderName)) { + const command2 = buildPlaywrightCLICommand(embedderName, "install --force " + executable.name); + process.stderr.write("\n" + wrapInASCIIBox([ + `ATTENTION: "${executable.name}" is already installed on the system!`, + ``, + `"${executable.name}" installation is not hermetic; installing newer version`, + `requires *removal* of a current installation first.`, + ``, + `To *uninstall* current version and re-install latest "${executable.name}":`, + ``, + `- Close all running instances of "${executable.name}", if any`, + `- Use "--force" to install browser:`, + ``, + ` ${command2}`, + ``, + `<3 Playwright Team` + ].join("\n"), 1) + "\n\n"); + return; + } + await executable._install(); + } + } catch (e) { + if (e.code === "ELOCKED") { + const rmCommand = process.platform === "win32" ? "rm -R" : "rm -rf"; + throw new Error("\n" + wrapInASCIIBox([ + `An active lockfile is found at:`, + ``, + ` ${lockfilePath}`, + ``, + `Either:`, + `- wait a few minutes if other Playwright is installing browsers in parallel`, + `- remove lock manually with:`, + ``, + ` ${rmCommand} ${lockfilePath}`, + ``, + `<3 Playwright Team` + ].join("\n"), 1)); + } else { + throw e; + } + } finally { + if (releaseLock) + await releaseLock(); + } + } + async uninstall(all) { + const linksDir = path.join(registryDirectory, ".links"); + if (all) { + const links = await fs.promises.readdir(linksDir).catch(() => []); + for (const link2 of links) + await fs.promises.unlink(path.join(linksDir, link2)); + } else { + await fs.promises.unlink(path.join(linksDir, calculateSha1(PACKAGE_PATH))).catch(() => { + }); + } + await this._validateInstallationCache(linksDir); + return { + numberOfBrowsersLeft: (await fs.promises.readdir(registryDirectory).catch(() => [])).filter((browserDirectory) => isBrowserDirectory(browserDirectory)).length + }; + } + async validateHostRequirementsForExecutablesIfNeeded(executables, sdkLanguage) { + if (getAsBooleanFromENV("PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS")) { + process.stderr.write("Skipping host requirements validation logic because `PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS` env variable is set.\n"); + return; + } + for (const executable of executables) + await this._validateHostRequirementsForExecutableIfNeeded(executable, sdkLanguage); + } + async _validateHostRequirementsForExecutableIfNeeded(executable, sdkLanguage) { + const kMaximumReValidationPeriod = 30 * 24 * 60 * 60 * 1e3; + if (!executable.directory) + return; + const markerFile = path.join(executable.directory, "DEPENDENCIES_VALIDATED"); + if (await fs.promises.stat(markerFile).then((stat2) => Date.now() - stat2.mtime.getTime() < kMaximumReValidationPeriod).catch(() => false)) + return; + debugLogger.log("install", `validating host requirements for "${executable.name}"`); + try { + await executable._validateHostRequirements(sdkLanguage); + debugLogger.log("install", `validation passed for ${executable.name}`); + } catch (error2) { + debugLogger.log("install", `validation failed for ${executable.name}`); + throw error2; + } + await fs.promises.writeFile(markerFile, "").catch(() => { + }); + } + _downloadURLs(descriptor) { + const paths = DOWNLOAD_PATHS[descriptor.name]; + const downloadPathTemplate = paths[hostPlatform] || paths[""]; + if (!downloadPathTemplate) + return []; + const downloadPath = utilExports.format(downloadPathTemplate, descriptor.revision); + let downloadURLs = PLAYWRIGHT_CDN_MIRRORS.map((mirror) => `${mirror}/${downloadPath}`); + let downloadHostEnv; + if (descriptor.name.startsWith("chromium")) + downloadHostEnv = "PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST"; + else if (descriptor.name.startsWith("firefox")) + downloadHostEnv = "PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST"; + else if (descriptor.name.startsWith("webkit")) + downloadHostEnv = "PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST"; + const customHostOverride = downloadHostEnv && getFromENV(downloadHostEnv) || getFromENV("PLAYWRIGHT_DOWNLOAD_HOST"); + if (customHostOverride) + downloadURLs = [`${customHostOverride}/${downloadPath}`]; + return downloadURLs; + } + async _downloadExecutable(descriptor, executablePath) { + const downloadURLs = this._downloadURLs(descriptor); + if (!downloadURLs.length) + throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}`); + if (!isOfficiallySupportedPlatform) + logPolitely(`BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ${hostPlatform}.`); + if (descriptor.hasRevisionOverride) { + const message = `You are using a frozen ${descriptor.name} browser which does not receive updates anymore on ${hostPlatform}. Please update to the latest version of your operating system to test up-to-date browsers.`; + if (define_process_env_default.GITHUB_ACTIONS) + console.log(`::warning title=Playwright::${message}`); + else + logPolitely(message); + } + const displayName = descriptor.name.split("-").map((word) => { + return word === "ffmpeg" ? "FFMPEG" : word.charAt(0).toUpperCase() + word.slice(1); + }).join(" "); + const title = descriptor.browserVersion ? `${displayName} ${descriptor.browserVersion} (playwright build v${descriptor.revision})` : `${displayName} playwright build v${descriptor.revision}`; + const downloadFileName = `playwright-download-${descriptor.name}-${hostPlatform}-${descriptor.revision}.zip`; + const downloadSocketTimeoutEnv = getFromENV("PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT"); + const downloadSocketTimeout = +(downloadSocketTimeoutEnv || "0") || NET_DEFAULT_TIMEOUT; + await downloadBrowserWithProgressBar(title, descriptor.dir, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout).catch((e) => { + throw new Error(`Failed to download ${title}, caused by +${e.stack}`); + }); + } + async _installMSEdgeChannel(channel, scripts) { + const scriptArgs = []; + if (process.platform !== "linux") { + const products = lowercaseAllKeys(JSON.parse(await fetchData({ url: "https://edgeupdates.microsoft.com/api/products" }))); + const productName = { + "msedge": "Stable", + "msedge-beta": "Beta", + "msedge-dev": "Dev" + }[channel]; + const product = products.find((product2) => product2.product === productName); + const searchConfig = { + darwin: { platform: "MacOS", arch: "universal", artifact: "pkg" }, + win32: { platform: "Windows", arch: "x64", artifact: "msi" } + }[process.platform]; + const release = searchConfig ? product.releases.find((release2) => release2.platform === searchConfig.platform && release2.architecture === searchConfig.arch && release2.artifacts.length > 0) : null; + const artifact = release ? release.artifacts.find((artifact2) => artifact2.artifactname === searchConfig.artifact) : null; + if (artifact) + scriptArgs.push( + artifact.location + /* url */ + ); + else + throw new Error(`Cannot install ${channel} on ${process.platform}`); + } + await this._installChromiumChannel(channel, scripts, scriptArgs); + } + async _installChromiumChannel(channel, scripts, scriptArgs = []) { + const scriptName = scripts[process.platform]; + if (!scriptName) + throw new Error(`Cannot install ${channel} on ${process.platform}`); + const cwd = BIN_PATH; + const isPowerShell = scriptName.endsWith(".ps1"); + if (isPowerShell) { + const args = [ + "-ExecutionPolicy", + "Bypass", + "-File", + path.join(BIN_PATH, scriptName), + ...scriptArgs + ]; + const { code } = await spawnAsync("powershell.exe", args, { cwd, stdio: "inherit" }); + if (code !== 0) + throw new Error(`Failed to install ${channel}`); + } else { + const { command: command2, args, elevatedPermissions } = await transformCommandsForRoot([`bash "${path.join(BIN_PATH, scriptName)}" ${scriptArgs.join("")}`]); + if (elevatedPermissions) + console.log("Switching to root user to install dependencies..."); + const { code } = await spawnAsync(command2, args, { cwd, stdio: "inherit" }); + if (code !== 0) + throw new Error(`Failed to install ${channel}`); + } + } + async listInstalledBrowsers() { + const linksDir = path.join(registryDirectory, ".links"); + const { browsers: browsers2 } = await this._traverseBrowserInstallations(linksDir); + return browsers2.filter((browser2) => fs.existsSync(browser2.browserPath)); + } + async _validateInstallationCache(linksDir) { + const { browsers: browsers2, brokenLinks } = await this._traverseBrowserInstallations(linksDir); + await this._deleteStaleBrowsers(browsers2); + await this._deleteBrokenInstallations(brokenLinks); + } + async _traverseBrowserInstallations(linksDir) { + const browserList = []; + const brokenLinks = []; + for (const fileName of await fs.promises.readdir(linksDir)) { + const linkPath = path.join(linksDir, fileName); + let linkTarget = ""; + try { + linkTarget = (await fs.promises.readFile(linkPath)).toString(); + const browsersJSON = commonjsRequire(path.join(linkTarget, "browsers.json")); + const descriptors = readDescriptors(browsersJSON); + for (const browserName of allDownloadable) { + const descriptor = descriptors.find((d) => d.name === browserName); + if (!descriptor) + continue; + const browserPath = descriptor.dir; + const browserVersion = parseInt(descriptor.revision, 10); + browserList.push({ + browserName, + browserVersion, + browserPath, + referenceDir: linkTarget + }); + } + } catch (e) { + brokenLinks.push(linkPath); + } + } + return { browsers: browserList, brokenLinks }; + } + async _deleteStaleBrowsers(browserList) { + const usedBrowserPaths = /* @__PURE__ */ new Set(); + for (const browser2 of browserList) { + const { browserName, browserVersion, browserPath } = browser2; + const shouldHaveMarkerFile = browserName === "chromium" && (browserVersion >= 786218 || browserVersion < 3e5) || browserName === "firefox" && browserVersion >= 1128 || browserName === "webkit" && browserVersion >= 1307 || // All new applications have a marker file right away. + browserName !== "firefox" && browserName !== "chromium" && browserName !== "webkit"; + if (!shouldHaveMarkerFile || await existsAsync(browserDirectoryToMarkerFilePath(browserPath))) + usedBrowserPaths.add(browserPath); + } + let downloadedBrowsers = (await fs.promises.readdir(registryDirectory)).map((file) => path.join(registryDirectory, file)); + downloadedBrowsers = downloadedBrowsers.filter((file) => isBrowserDirectory(file)); + const directories = new Set(downloadedBrowsers); + for (const browserDirectory of usedBrowserPaths) + directories.delete(browserDirectory); + for (const directory of directories) + logPolitely("Removing unused browser at " + directory); + await removeFolders([...directories]); + } + async _deleteBrokenInstallations(brokenLinks) { + for (const linkPath of brokenLinks) + await fs.promises.unlink(linkPath).catch((e) => { + }); + } +} +function browserDirectoryToMarkerFilePath(browserDirectory) { + return path.join(browserDirectory, "INSTALLATION_COMPLETE"); +} +function buildPlaywrightCLICommand(sdkLanguage, parameters) { + switch (sdkLanguage) { + case "python": + return `playwright ${parameters}`; + case "java": + return `mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="${parameters}"`; + case "csharp": + return `pwsh bin/Debug/netX/playwright.ps1 ${parameters}`; + default: { + const packageManagerCommand = getPackageManagerExecCommand(); + return `${packageManagerCommand} playwright ${parameters}`; + } + } +} +function findChromiumChannel(sdkLanguage) { + let channel = null; + for (const name of ["chromium", "chrome", "msedge"]) { + try { + registry.findExecutable(name).executablePathOrDie(sdkLanguage); + channel = name === "chromium" ? void 0 : name; + break; + } catch (e) { + } + } + if (channel === null) { + const installCommand = buildPlaywrightCLICommand(sdkLanguage, `install chromium`); + const prettyMessage = [ + `No chromium-based browser found on the system.`, + `Please run the following command to download one:`, + ``, + ` ${installCommand}`, + ``, + `<3 Playwright Team` + ].join("\n"); + throw new Error("\n" + wrapInASCIIBox(prettyMessage, 1)); + } + return channel; +} +function lowercaseAllKeys(json) { + if (typeof json !== "object" || !json) + return json; + if (Array.isArray(json)) + return json.map(lowercaseAllKeys); + const result = {}; + for (const [key2, value] of Object.entries(json)) + result[key2.toLowerCase()] = lowercaseAllKeys(value); + return result; +} +const registry = new Registry(require$$0$5); +function parseSerializedValue(value, handles) { + return innerParseSerializedValue(value, handles, /* @__PURE__ */ new Map(), []); +} +function innerParseSerializedValue(value, handles, refs, accessChain) { + if (value.ref !== void 0) + return refs.get(value.ref); + if (value.n !== void 0) + return value.n; + if (value.s !== void 0) + return value.s; + if (value.b !== void 0) + return value.b; + if (value.v !== void 0) { + if (value.v === "undefined") + return void 0; + if (value.v === "null") + return null; + if (value.v === "NaN") + return NaN; + if (value.v === "Infinity") + return Infinity; + if (value.v === "-Infinity") + return -Infinity; + if (value.v === "-0") + return -0; + } + if (value.d !== void 0) + return new Date(value.d); + if (value.u !== void 0) + return new URL(value.u); + if (value.bi !== void 0) + return BigInt(value.bi); + if (value.e !== void 0) { + const error2 = new Error(value.e.m); + error2.name = value.e.n; + error2.stack = value.e.s; + return error2; + } + if (value.r !== void 0) + return new RegExp(value.r.p, value.r.f); + if (value.ta !== void 0) { + const ctor = typedArrayKindToConstructor[value.ta.k]; + return new ctor(value.ta.b.buffer, value.ta.b.byteOffset, value.ta.b.length / ctor.BYTES_PER_ELEMENT); + } + if (value.a !== void 0) { + const result = []; + refs.set(value.id, result); + for (let i = 0; i < value.a.length; i++) + result.push(innerParseSerializedValue(value.a[i], handles, refs, [...accessChain, i])); + return result; + } + if (value.o !== void 0) { + const result = {}; + refs.set(value.id, result); + for (const { k, v } of value.o) + result[k] = innerParseSerializedValue(v, handles, refs, [...accessChain, k]); + return result; + } + if (value.h !== void 0) { + if (handles === void 0) + throw new Error("Unexpected handle"); + return handles[value.h]; + } + throw new Error(`Attempting to deserialize unexpected value${accessChainToDisplayString(accessChain)}: ${value}`); +} +function serializeValue(value, handleSerializer) { + return innerSerializeValue(value, handleSerializer, { lastId: 0, visited: /* @__PURE__ */ new Map() }, []); +} +function innerSerializeValue(value, handleSerializer, visitorInfo, accessChain) { + const handle = handleSerializer(value); + if ("fallThrough" in handle) + value = handle.fallThrough; + else + return handle; + if (typeof value === "symbol") + return { v: "undefined" }; + if (Object.is(value, void 0)) + return { v: "undefined" }; + if (Object.is(value, null)) + return { v: "null" }; + if (Object.is(value, NaN)) + return { v: "NaN" }; + if (Object.is(value, Infinity)) + return { v: "Infinity" }; + if (Object.is(value, -Infinity)) + return { v: "-Infinity" }; + if (Object.is(value, -0)) + return { v: "-0" }; + if (typeof value === "boolean") + return { b: value }; + if (typeof value === "number") + return { n: value }; + if (typeof value === "string") + return { s: value }; + if (typeof value === "bigint") + return { bi: value.toString() }; + if (isError$1(value)) + return { e: { n: value.name, m: value.message, s: value.stack || "" } }; + if (isDate$2(value)) + return { d: value.toJSON() }; + if (isURL$1(value)) + return { u: value.toJSON() }; + if (isRegExp$2(value)) + return { r: { p: value.source, f: value.flags } }; + const typedArrayKind = constructorToTypedArrayKind.get(value.constructor); + if (typedArrayKind) + return { ta: { b: Buffer.from(value.buffer, value.byteOffset, value.byteLength), k: typedArrayKind } }; + const id = visitorInfo.visited.get(value); + if (id) + return { ref: id }; + if (Array.isArray(value)) { + const a = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value, id2); + for (let i = 0; i < value.length; ++i) + a.push(innerSerializeValue(value[i], handleSerializer, visitorInfo, [...accessChain, i])); + return { a, id: id2 }; + } + if (typeof value === "object") { + const o = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value, id2); + for (const name of Object.keys(value)) + o.push({ k: name, v: innerSerializeValue(value[name], handleSerializer, visitorInfo, [...accessChain, name]) }); + return { o, id: id2 }; + } + throw new Error(`Attempting to serialize unexpected value${accessChainToDisplayString(accessChain)}: ${value}`); +} +function accessChainToDisplayString(accessChain) { + const chainString = accessChain.map((accessor, i) => { + if (typeof accessor === "string") + return i ? `.${accessor}` : accessor; + return `[${accessor}]`; + }).join(""); + return chainString.length > 0 ? ` at position "${chainString}"` : ""; +} +function isRegExp$2(obj) { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; +} +function isDate$2(obj) { + return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]"; +} +function isURL$1(obj) { + return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]"; +} +function isError$1(obj) { + const proto = obj ? Object.getPrototypeOf(obj) : null; + return obj instanceof Error || (proto == null ? void 0 : proto.name) === "Error" || proto && isError$1(proto); +} +const typedArrayKindToConstructor = { + i8: Int8Array, + ui8: Uint8Array, + ui8c: Uint8ClampedArray, + i16: Int16Array, + ui16: Uint16Array, + i32: Int32Array, + ui32: Uint32Array, + f32: Float32Array, + f64: Float64Array, + bi64: BigInt64Array, + bui64: BigUint64Array +}; +const constructorToTypedArrayKind = new Map(Object.entries(typedArrayKindToConstructor).map(([k, v]) => [v, k])); +class CustomError extends Error { + constructor(message) { + super(message); + this.name = this.constructor.name; + } +} +let TimeoutError$1 = class TimeoutError extends CustomError { +}; +let TargetClosedError$1 = class TargetClosedError extends CustomError { + constructor(cause, logs) { + super((cause || "Target page, context or browser has been closed") + (logs || "")); + } +}; +function isTargetClosedError$1(error2) { + return error2 instanceof TargetClosedError$1 || error2.name === "TargetClosedError"; +} +function serializeError$1(e) { + if (isError$2(e)) + return { error: { message: e.message, stack: e.stack, name: e.name } }; + return { value: serializeValue(e, (value) => ({ fallThrough: value })) }; +} +function parseError$1(error2) { + if (!error2.error) { + if (error2.value === void 0) + throw new Error("Serialized error must have either an error or a value"); + return parseSerializedValue(error2.value, void 0); + } + const e = new Error(error2.error.message); + e.stack = error2.error.stack || ""; + e.name = error2.error.name; + return e; +} +class SdkObject extends eventsExports.EventEmitter { + constructor(parent, guidPrefix, guid) { + super(); + this.guid = guid || `${guidPrefix || ""}@${createGuid()}`; + this.setMaxListeners(0); + this.attribution = { ...parent.attribution }; + this.instrumentation = parent.instrumentation; + } +} +function createInstrumentation$1() { + const listeners = /* @__PURE__ */ new Map(); + return new Proxy({}, { + get: (obj, prop) => { + if (typeof prop !== "string") + return obj[prop]; + if (prop === "addListener") + return (listener, context) => listeners.set(listener, context); + if (prop === "removeListener") + return (listener) => listeners.delete(listener); + if (!prop.startsWith("on")) + return obj[prop]; + return async (sdkObject, ...params) => { + var _a2; + for (const [listener, context] of listeners) { + if (!context || sdkObject.attribution.context === context) + await ((_a2 = listener[prop]) == null ? void 0 : _a2.call(listener, sdkObject, ...params)); + } + }; + } + }); +} +function serverSideCallMetadata() { + return { + id: "", + startTime: 0, + endTime: 0, + type: "Internal", + method: "", + params: {}, + log: [], + isServerSide: true + }; +} +class ProtocolError extends Error { + constructor(type2, method, logs) { + super(); + this.type = type2; + this.method = method; + this.logs = logs; + } + setMessage(message) { + rewriteErrorMessage(this, `Protocol error (${this.method}): ${message}`); + } + browserLogMessage() { + return this.logs ? "\nBrowser logs:\n" + this.logs : ""; + } +} +function isProtocolError(e) { + return e instanceof ProtocolError; +} +function isSessionClosedError(e) { + return e instanceof ProtocolError && (e.type === "closed" || e.type === "crashed"); +} +function compressCallLog(log) { + const lines = []; + for (const block of findRepeatedSubsequences(log)) { + for (let i = 0; i < block.sequence.length; i++) { + const line = block.sequence[i]; + const leadingWhitespace = line.match(/^\s*/); + const whitespacePrefix = " " + (leadingWhitespace == null ? void 0 : leadingWhitespace[0]) || ""; + const countPrefix = `${block.count} × `; + if (block.count > 1 && i === 0) + lines.push(whitespacePrefix + countPrefix + line.trim()); + else if (block.count > 1) + lines.push(whitespacePrefix + " ".repeat(countPrefix.length - 2) + "- " + line.trim()); + else + lines.push(whitespacePrefix + "- " + line.trim()); + } + } + return lines; +} +function findRepeatedSubsequences(s) { + const n = s.length; + const result = []; + let i = 0; + const arraysEqual = (a1, a2) => { + if (a1.length !== a2.length) + return false; + for (let j = 0; j < a1.length; j++) { + if (a1[j] !== a2[j]) + return false; + } + return true; + }; + while (i < n) { + let maxRepeatCount = 1; + let maxRepeatSubstr = [s[i]]; + let maxRepeatLength = 1; + for (let p = 1; p <= n - i; p++) { + const substr = s.slice(i, i + p); + let k = 1; + while (i + p * k <= n && arraysEqual(s.slice(i + p * (k - 1), i + p * k), substr)) + k += 1; + k -= 1; + if (k > 1 && k * p > maxRepeatCount * maxRepeatLength) { + maxRepeatCount = k; + maxRepeatSubstr = substr; + maxRepeatLength = p; + } + } + result.push({ sequence: maxRepeatSubstr, count: maxRepeatCount }); + i += maxRepeatLength * maxRepeatCount; + } + return result; +} +const metadataValidator = createMetadataValidator(); +function maxDispatchersForBucket(gcBucket) { + return { + "JSHandle": 1e5, + "ElementHandle": 1e5 + }[gcBucket] ?? 1e4; +} +class Dispatcher extends eventsExports.EventEmitter { + constructor(parent, object, type2, initializer, gcBucket) { + super(); + this._dispatchers = /* @__PURE__ */ new Map(); + this._disposed = false; + this._eventListeners = []; + this._openScope = new LongStandingScope(); + this.connection = parent instanceof DispatcherConnection ? parent : parent.connection; + this._parent = parent instanceof DispatcherConnection ? void 0 : parent; + const guid = object.guid; + this._guid = guid; + this._type = type2; + this._object = object; + this._gcBucket = gcBucket ?? type2; + this.connection.registerDispatcher(this); + if (this._parent) { + assert(!this._parent._dispatchers.has(guid)); + this._parent._dispatchers.set(guid, this); + } + if (this._parent) + this.connection.sendCreate(this._parent, type2, guid, initializer); + this.connection.maybeDisposeStaleDispatchers(this._gcBucket); + } + parentScope() { + return this._parent; + } + addObjectListener(eventName, handler) { + this._eventListeners.push(eventsHelper.addEventListener(this._object, eventName, handler)); + } + adopt(child) { + if (child._parent === this) + return; + const oldParent = child._parent; + oldParent._dispatchers.delete(child._guid); + this._dispatchers.set(child._guid, child); + child._parent = this; + this.connection.sendAdopt(this, child); + } + async _handleCommand(callMetadata, method, validParams) { + const commandPromise = this[method](validParams, callMetadata); + try { + return await this._openScope.race(commandPromise); + } catch (e) { + if (callMetadata.potentiallyClosesScope && isTargetClosedError$1(e)) + return await commandPromise; + throw e; + } + } + _dispatchEvent(method, params) { + if (this._disposed) { + if (isUnderTest()) + throw new Error(`${this._guid} is sending "${String(method)}" event after being disposed`); + return; + } + this.connection.sendEvent(this, method, params); + } + _dispose(reason) { + this._disposeRecursively(new TargetClosedError$1()); + this.connection.sendDispose(this, reason); + } + _onDispose() { + } + _disposeRecursively(error2) { + var _a2; + assert(!this._disposed, `${this._guid} is disposed more than once`); + this._onDispose(); + this._disposed = true; + eventsHelper.removeEventListeners(this._eventListeners); + (_a2 = this._parent) == null ? void 0 : _a2._dispatchers.delete(this._guid); + const list = this.connection._dispatchersByBucket.get(this._gcBucket); + list == null ? void 0 : list.delete(this._guid); + this.connection._dispatcherByGuid.delete(this._guid); + this.connection._dispatcherByObject.delete(this._object); + for (const dispatcher of [...this._dispatchers.values()]) + dispatcher._disposeRecursively(error2); + this._dispatchers.clear(); + this._openScope.close(error2); + } + _debugScopeState() { + return { + _guid: this._guid, + objects: Array.from(this._dispatchers.values()).map((o) => o._debugScopeState()) + }; + } + async waitForEventInfo() { + } +} +class RootDispatcher extends Dispatcher { + constructor(connection, createPlaywright) { + super(connection, { guid: "" }, "Root", {}); + this.createPlaywright = createPlaywright; + this._initialized = false; + } + async initialize(params) { + assert(this.createPlaywright); + assert(!this._initialized); + this._initialized = true; + return { + playwright: await this.createPlaywright(this, params) + }; + } +} +class DispatcherConnection { + constructor(isLocal) { + this._dispatcherByGuid = /* @__PURE__ */ new Map(); + this._dispatcherByObject = /* @__PURE__ */ new Map(); + this._dispatchersByBucket = /* @__PURE__ */ new Map(); + this.onmessage = (message) => { + }; + this._waitOperations = /* @__PURE__ */ new Map(); + this._isLocal = !!isLocal; + } + sendEvent(dispatcher, event, params) { + const validator = findValidator(dispatcher._type, event, "Event"); + params = validator(params, "", this._validatorToWireContext()); + this.onmessage({ guid: dispatcher._guid, method: event, params }); + } + sendCreate(parent, type2, guid, initializer) { + const validator = findValidator(type2, "", "Initializer"); + initializer = validator(initializer, "", this._validatorToWireContext()); + this.onmessage({ guid: parent._guid, method: "__create__", params: { type: type2, initializer, guid } }); + } + sendAdopt(parent, dispatcher) { + this.onmessage({ guid: parent._guid, method: "__adopt__", params: { guid: dispatcher._guid } }); + } + sendDispose(dispatcher, reason) { + this.onmessage({ guid: dispatcher._guid, method: "__dispose__", params: { reason } }); + } + _validatorToWireContext() { + return { + tChannelImpl: this._tChannelImplToWire.bind(this), + binary: this._isLocal ? "buffer" : "toBase64", + isUnderTest + }; + } + _validatorFromWireContext() { + return { + tChannelImpl: this._tChannelImplFromWire.bind(this), + binary: this._isLocal ? "buffer" : "fromBase64", + isUnderTest + }; + } + _tChannelImplFromWire(names, arg, path2, context) { + if (arg && typeof arg === "object" && typeof arg.guid === "string") { + const guid = arg.guid; + const dispatcher = this._dispatcherByGuid.get(guid); + if (!dispatcher) + throw new ValidationError(`${path2}: no object with guid ${guid}`); + if (names !== "*" && !names.includes(dispatcher._type)) + throw new ValidationError(`${path2}: object with guid ${guid} has type ${dispatcher._type}, expected ${names.toString()}`); + return dispatcher; + } + throw new ValidationError(`${path2}: expected guid for ${names.toString()}`); + } + _tChannelImplToWire(names, arg, path2, context) { + if (arg instanceof Dispatcher) { + if (names !== "*" && !names.includes(arg._type)) + throw new ValidationError(`${path2}: dispatcher with guid ${arg._guid} has type ${arg._type}, expected ${names.toString()}`); + return { guid: arg._guid }; + } + throw new ValidationError(`${path2}: expected dispatcher ${names.toString()}`); + } + existingDispatcher(object) { + return this._dispatcherByObject.get(object); + } + registerDispatcher(dispatcher) { + assert(!this._dispatcherByGuid.has(dispatcher._guid)); + this._dispatcherByGuid.set(dispatcher._guid, dispatcher); + this._dispatcherByObject.set(dispatcher._object, dispatcher); + let list = this._dispatchersByBucket.get(dispatcher._gcBucket); + if (!list) { + list = /* @__PURE__ */ new Set(); + this._dispatchersByBucket.set(dispatcher._gcBucket, list); + } + list.add(dispatcher._guid); + } + maybeDisposeStaleDispatchers(gcBucket) { + const maxDispatchers = maxDispatchersForBucket(gcBucket); + const list = this._dispatchersByBucket.get(gcBucket); + if (!list || list.size <= maxDispatchers) + return; + const dispatchersArray = [...list]; + const disposeCount = maxDispatchers / 10 | 0; + this._dispatchersByBucket.set(gcBucket, new Set(dispatchersArray.slice(disposeCount))); + for (let i = 0; i < disposeCount; ++i) { + const d = this._dispatcherByGuid.get(dispatchersArray[i]); + if (!d) + continue; + d._dispose("gc"); + } + } + async dispatch(message) { + var _a2, _b2, _c2, _d2, _e2, _f2; + const { id, guid, method, params, metadata } = message; + const dispatcher = this._dispatcherByGuid.get(guid); + if (!dispatcher) { + this.onmessage({ id, error: serializeError$1(new TargetClosedError$1()) }); + return; + } + let validParams; + let validMetadata; + try { + const validator = findValidator(dispatcher._type, method, "Params"); + const validatorContext = this._validatorFromWireContext(); + validParams = validator(params, "", validatorContext); + validMetadata = metadataValidator(metadata, "", validatorContext); + if (typeof dispatcher[method] !== "function") + throw new Error(`Mismatching dispatcher: "${dispatcher._type}" does not implement "${method}"`); + } catch (e) { + this.onmessage({ id, error: serializeError$1(e) }); + return; + } + if ((_a2 = methodMetainfo.get(dispatcher._type + "." + method)) == null ? void 0 : _a2.internal) { + validMetadata.internal = true; + } + const sdkObject = dispatcher._object instanceof SdkObject ? dispatcher._object : void 0; + const callMetadata = { + id: `call@${id}`, + location: validMetadata.location, + title: validMetadata.title, + internal: validMetadata.internal, + stepId: validMetadata.stepId, + objectId: sdkObject == null ? void 0 : sdkObject.guid, + pageId: (_c2 = (_b2 = sdkObject == null ? void 0 : sdkObject.attribution) == null ? void 0 : _b2.page) == null ? void 0 : _c2.guid, + frameId: (_e2 = (_d2 = sdkObject == null ? void 0 : sdkObject.attribution) == null ? void 0 : _d2.frame) == null ? void 0 : _e2.guid, + startTime: monotonicTime(), + endTime: 0, + type: dispatcher._type, + method, + params: params || {}, + log: [] + }; + if (sdkObject && ((_f2 = params == null ? void 0 : params.info) == null ? void 0 : _f2.waitId)) { + const info = params.info; + switch (info.phase) { + case "before": { + this._waitOperations.set(info.waitId, callMetadata); + await sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata); + this.onmessage({ id }); + return; + } + case "log": { + const originalMetadata = this._waitOperations.get(info.waitId); + originalMetadata.log.push(info.message); + sdkObject.instrumentation.onCallLog(sdkObject, originalMetadata, "api", info.message); + this.onmessage({ id }); + return; + } + case "after": { + const originalMetadata = this._waitOperations.get(info.waitId); + originalMetadata.endTime = monotonicTime(); + originalMetadata.error = info.error ? { error: { name: "Error", message: info.error } } : void 0; + this._waitOperations.delete(info.waitId); + await sdkObject.instrumentation.onAfterCall(sdkObject, originalMetadata); + this.onmessage({ id }); + return; + } + } + } + await (sdkObject == null ? void 0 : sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata)); + const response2 = { id }; + try { + const result = await dispatcher._handleCommand(callMetadata, method, validParams); + const validator = findValidator(dispatcher._type, method, "Result"); + response2.result = validator(result, "", this._validatorToWireContext()); + callMetadata.result = result; + } catch (e) { + if (isTargetClosedError$1(e) && sdkObject) { + const reason = closeReason(sdkObject); + if (reason) + rewriteErrorMessage(e, reason); + } else if (isProtocolError(e)) { + if (e.type === "closed") { + const reason = sdkObject ? closeReason(sdkObject) : void 0; + e = new TargetClosedError$1(reason, e.browserLogMessage()); + } else if (e.type === "crashed") { + rewriteErrorMessage(e, "Target crashed " + e.browserLogMessage()); + } + } + response2.error = serializeError$1(e); + callMetadata.error = response2.error; + } finally { + callMetadata.endTime = monotonicTime(); + await (sdkObject == null ? void 0 : sdkObject.instrumentation.onAfterCall(sdkObject, callMetadata)); + } + if (response2.error) + response2.log = compressCallLog(callMetadata.log); + this.onmessage(response2); + } +} +function closeReason(sdkObject) { + var _a2, _b2, _c2; + return ((_a2 = sdkObject.attribution.page) == null ? void 0 : _a2.closeReason) || ((_b2 = sdkObject.attribution.context) == null ? void 0 : _b2._closeReason) || ((_c2 = sdkObject.attribution.browser) == null ? void 0 : _c2._closeReason); +} +var libExports = requireLib(); +const source$6 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/clock.ts\nvar clock_exports = {};\n__export(clock_exports, {\n ClockController: () => ClockController,\n createClock: () => createClock,\n inject: () => inject,\n install: () => install\n});\nmodule.exports = __toCommonJS(clock_exports);\nvar ClockController = class {\n constructor(embedder) {\n this._duringTick = false;\n this._uniqueTimerId = idCounterStart;\n this.disposables = [];\n this._log = [];\n this._timers = /* @__PURE__ */ new Map();\n this._now = { time: asWallTime(0), isFixedTime: false, ticks: 0, origin: asWallTime(-1) };\n this._embedder = embedder;\n }\n uninstall() {\n this.disposables.forEach((dispose) => dispose());\n this.disposables.length = 0;\n }\n now() {\n this._replayLogOnce();\n this._syncRealTime();\n return this._now.time;\n }\n install(time) {\n this._replayLogOnce();\n this._innerSetTime(asWallTime(time));\n }\n setSystemTime(time) {\n this._replayLogOnce();\n this._innerSetTime(asWallTime(time));\n }\n setFixedTime(time) {\n this._replayLogOnce();\n this._innerSetFixedTime(asWallTime(time));\n }\n performanceNow() {\n this._replayLogOnce();\n this._syncRealTime();\n return this._now.ticks;\n }\n _syncRealTime() {\n if (!this._realTime)\n return;\n const now = this._embedder.performanceNow();\n const sinceLastSync = now - this._realTime.lastSyncTicks;\n if (sinceLastSync > 0) {\n this._advanceNow(shiftTicks(this._now.ticks, sinceLastSync));\n this._realTime.lastSyncTicks = now;\n }\n }\n _innerSetTime(time) {\n this._now.time = time;\n this._now.isFixedTime = false;\n if (this._now.origin < 0)\n this._now.origin = this._now.time;\n }\n _innerSetFixedTime(time) {\n this._innerSetTime(time);\n this._now.isFixedTime = true;\n }\n _advanceNow(to) {\n if (!this._now.isFixedTime)\n this._now.time = asWallTime(this._now.time + to - this._now.ticks);\n this._now.ticks = to;\n }\n async log(type, time, param) {\n this._log.push({ type, time, param });\n }\n async runFor(ticks) {\n this._replayLogOnce();\n if (ticks < 0)\n throw new TypeError("Negative ticks are not supported");\n await this._runTo(shiftTicks(this._now.ticks, ticks));\n }\n async _runTo(to) {\n to = Math.ceil(to);\n if (this._now.ticks > to)\n return;\n let firstException;\n while (true) {\n const result = await this._callFirstTimer(to);\n if (!result.timerFound)\n break;\n firstException = firstException || result.error;\n }\n this._advanceNow(to);\n if (firstException)\n throw firstException;\n }\n async pauseAt(time) {\n this._replayLogOnce();\n this._innerPause();\n const toConsume = time - this._now.time;\n await this._innerFastForwardTo(shiftTicks(this._now.ticks, toConsume));\n return toConsume;\n }\n _innerPause() {\n this._realTime = void 0;\n this._updateRealTimeTimer();\n }\n resume() {\n this._replayLogOnce();\n this._innerResume();\n }\n _innerResume() {\n const now = this._embedder.performanceNow();\n this._realTime = { startTicks: now, lastSyncTicks: now };\n this._updateRealTimeTimer();\n }\n _updateRealTimeTimer() {\n var _a;\n if (!this._realTime) {\n (_a = this._currentRealTimeTimer) == null ? void 0 : _a.dispose();\n this._currentRealTimeTimer = void 0;\n return;\n }\n const firstTimer = this._firstTimer();\n const callAt = Math.min(firstTimer ? firstTimer.callAt : this._now.ticks + maxTimeout, this._now.ticks + 100);\n if (this._currentRealTimeTimer && this._currentRealTimeTimer.callAt < callAt)\n return;\n if (this._currentRealTimeTimer) {\n this._currentRealTimeTimer.dispose();\n this._currentRealTimeTimer = void 0;\n }\n this._currentRealTimeTimer = {\n callAt,\n dispose: this._embedder.setTimeout(() => {\n this._currentRealTimeTimer = void 0;\n this._syncRealTime();\n void this._runTo(this._now.ticks).catch((e) => console.error(e)).then(() => this._updateRealTimeTimer());\n }, callAt - this._now.ticks)\n };\n }\n async fastForward(ticks) {\n this._replayLogOnce();\n await this._innerFastForwardTo(shiftTicks(this._now.ticks, ticks | 0));\n }\n async _innerFastForwardTo(to) {\n if (to < this._now.ticks)\n throw new Error("Cannot fast-forward to the past");\n for (const timer of this._timers.values()) {\n if (to > timer.callAt)\n timer.callAt = to;\n }\n await this._runTo(to);\n }\n addTimer(options) {\n this._replayLogOnce();\n if (options.type === "AnimationFrame" /* AnimationFrame */ && !options.func)\n throw new Error("Callback must be provided to requestAnimationFrame calls");\n if (options.type === "IdleCallback" /* IdleCallback */ && !options.func)\n throw new Error("Callback must be provided to requestIdleCallback calls");\n if (["Timeout" /* Timeout */, "Interval" /* Interval */].includes(options.type) && !options.func && options.delay === void 0)\n throw new Error("Callback must be provided to timer calls");\n let delay = options.delay ? +options.delay : 0;\n if (!Number.isFinite(delay))\n delay = 0;\n delay = delay > maxTimeout ? 1 : delay;\n delay = Math.max(0, delay);\n const timer = {\n type: options.type,\n func: options.func,\n args: options.args || [],\n delay,\n callAt: shiftTicks(this._now.ticks, delay || (this._duringTick ? 1 : 0)),\n createdAt: this._now.ticks,\n id: this._uniqueTimerId++,\n error: new Error()\n };\n this._timers.set(timer.id, timer);\n if (this._realTime)\n this._updateRealTimeTimer();\n return timer.id;\n }\n countTimers() {\n return this._timers.size;\n }\n _firstTimer(beforeTick) {\n let firstTimer = null;\n for (const timer of this._timers.values()) {\n const isInRange = beforeTick === void 0 || timer.callAt <= beforeTick;\n if (isInRange && (!firstTimer || compareTimers(firstTimer, timer) === 1))\n firstTimer = timer;\n }\n return firstTimer;\n }\n _takeFirstTimer(beforeTick) {\n const timer = this._firstTimer(beforeTick);\n if (!timer)\n return null;\n this._advanceNow(timer.callAt);\n if (timer.type === "Interval" /* Interval */)\n timer.callAt = shiftTicks(timer.callAt, timer.delay);\n else\n this._timers.delete(timer.id);\n return timer;\n }\n async _callFirstTimer(beforeTick) {\n const timer = this._takeFirstTimer(beforeTick);\n if (!timer)\n return { timerFound: false };\n this._duringTick = true;\n try {\n if (typeof timer.func !== "function") {\n let error2;\n try {\n (() => {\n globalThis.eval(timer.func);\n })();\n } catch (e) {\n error2 = e;\n }\n await new Promise((f) => this._embedder.setTimeout(f));\n return { timerFound: true, error: error2 };\n }\n let args = timer.args;\n if (timer.type === "AnimationFrame" /* AnimationFrame */)\n args = [this._now.ticks];\n else if (timer.type === "IdleCallback" /* IdleCallback */)\n args = [{ didTimeout: false, timeRemaining: () => 0 }];\n let error;\n try {\n timer.func.apply(null, args);\n } catch (e) {\n error = e;\n }\n await new Promise((f) => this._embedder.setTimeout(f));\n return { timerFound: true, error };\n } finally {\n this._duringTick = false;\n }\n }\n getTimeToNextFrame() {\n return 16 - this._now.ticks % 16;\n }\n clearTimer(timerId, type) {\n this._replayLogOnce();\n if (!timerId) {\n return;\n }\n const id = Number(timerId);\n if (Number.isNaN(id) || id < idCounterStart) {\n const handlerName = getClearHandler(type);\n new Error(`Clock: ${handlerName} was invoked to clear a native timer instead of one created by the clock library.`);\n }\n const timer = this._timers.get(id);\n if (timer) {\n if (timer.type === type || timer.type === "Timeout" && type === "Interval" || timer.type === "Interval" && type === "Timeout") {\n this._timers.delete(id);\n } else {\n const clear = getClearHandler(type);\n const schedule = getScheduleHandler(timer.type);\n throw new Error(\n `Cannot clear timer: timer created with ${schedule}() but cleared with ${clear}()`\n );\n }\n }\n }\n _replayLogOnce() {\n if (!this._log.length)\n return;\n let lastLogTime = -1;\n let isPaused = false;\n for (const { type, time, param } of this._log) {\n if (!isPaused && lastLogTime !== -1)\n this._advanceNow(shiftTicks(this._now.ticks, time - lastLogTime));\n lastLogTime = time;\n if (type === "install") {\n this._innerSetTime(asWallTime(param));\n } else if (type === "fastForward" || type === "runFor") {\n this._advanceNow(shiftTicks(this._now.ticks, param));\n } else if (type === "pauseAt") {\n isPaused = true;\n this._innerPause();\n this._innerSetTime(asWallTime(param));\n } else if (type === "resume") {\n this._innerResume();\n isPaused = false;\n } else if (type === "setFixedTime") {\n this._innerSetFixedTime(asWallTime(param));\n } else if (type === "setSystemTime") {\n this._innerSetTime(asWallTime(param));\n }\n }\n if (!isPaused && lastLogTime > 0)\n this._advanceNow(shiftTicks(this._now.ticks, this._embedder.dateNow() - lastLogTime));\n this._log.length = 0;\n }\n};\nfunction mirrorDateProperties(target, source) {\n for (const prop in source) {\n if (source.hasOwnProperty(prop))\n target[prop] = source[prop];\n }\n target.toString = () => source.toString();\n target.prototype = source.prototype;\n target.parse = source.parse;\n target.UTC = source.UTC;\n target.prototype.toUTCString = source.prototype.toUTCString;\n target.isFake = true;\n return target;\n}\nfunction createDate(clock, NativeDate) {\n function ClockDate(year, month, date, hour, minute, second, ms) {\n if (!(this instanceof ClockDate))\n return new NativeDate(clock.now()).toString();\n switch (arguments.length) {\n case 0:\n return new NativeDate(clock.now());\n case 1:\n return new NativeDate(year);\n case 2:\n return new NativeDate(year, month);\n case 3:\n return new NativeDate(year, month, date);\n case 4:\n return new NativeDate(year, month, date, hour);\n case 5:\n return new NativeDate(year, month, date, hour, minute);\n case 6:\n return new NativeDate(\n year,\n month,\n date,\n hour,\n minute,\n second\n );\n default:\n return new NativeDate(\n year,\n month,\n date,\n hour,\n minute,\n second,\n ms\n );\n }\n }\n ClockDate.now = () => clock.now();\n return mirrorDateProperties(ClockDate, NativeDate);\n}\nfunction createIntl(clock, NativeIntl) {\n const ClockIntl = {};\n for (const key of Object.getOwnPropertyNames(NativeIntl))\n ClockIntl[key] = NativeIntl[key];\n ClockIntl.DateTimeFormat = function(...args) {\n const realFormatter = new NativeIntl.DateTimeFormat(...args);\n const formatter = {\n formatRange: realFormatter.formatRange.bind(realFormatter),\n formatRangeToParts: realFormatter.formatRangeToParts.bind(realFormatter),\n resolvedOptions: realFormatter.resolvedOptions.bind(realFormatter),\n format: (date) => realFormatter.format(date || clock.now()),\n formatToParts: (date) => realFormatter.formatToParts(date || clock.now())\n };\n return formatter;\n };\n ClockIntl.DateTimeFormat.prototype = Object.create(\n NativeIntl.DateTimeFormat.prototype\n );\n ClockIntl.DateTimeFormat.supportedLocalesOf = NativeIntl.DateTimeFormat.supportedLocalesOf;\n return ClockIntl;\n}\nfunction compareTimers(a, b) {\n if (a.callAt < b.callAt)\n return -1;\n if (a.callAt > b.callAt)\n return 1;\n if (a.type === "Immediate" /* Immediate */ && b.type !== "Immediate" /* Immediate */)\n return -1;\n if (a.type !== "Immediate" /* Immediate */ && b.type === "Immediate" /* Immediate */)\n return 1;\n if (a.createdAt < b.createdAt)\n return -1;\n if (a.createdAt > b.createdAt)\n return 1;\n if (a.id < b.id)\n return -1;\n if (a.id > b.id)\n return 1;\n}\nvar maxTimeout = Math.pow(2, 31) - 1;\nvar idCounterStart = 1e12;\nfunction platformOriginals(globalObject) {\n const raw = {\n setTimeout: globalObject.setTimeout,\n clearTimeout: globalObject.clearTimeout,\n setInterval: globalObject.setInterval,\n clearInterval: globalObject.clearInterval,\n requestAnimationFrame: globalObject.requestAnimationFrame ? globalObject.requestAnimationFrame : void 0,\n cancelAnimationFrame: globalObject.cancelAnimationFrame ? globalObject.cancelAnimationFrame : void 0,\n requestIdleCallback: globalObject.requestIdleCallback ? globalObject.requestIdleCallback : void 0,\n cancelIdleCallback: globalObject.cancelIdleCallback ? globalObject.cancelIdleCallback : void 0,\n Date: globalObject.Date,\n performance: globalObject.performance,\n Intl: globalObject.Intl\n };\n const bound = { ...raw };\n for (const key of Object.keys(bound)) {\n if (key !== "Date" && typeof bound[key] === "function")\n bound[key] = bound[key].bind(globalObject);\n }\n return { raw, bound };\n}\nfunction getScheduleHandler(type) {\n if (type === "IdleCallback" || type === "AnimationFrame")\n return `request${type}`;\n return `set${type}`;\n}\nfunction createApi(clock, originals) {\n return {\n setTimeout: (func, timeout, ...args) => {\n const delay = timeout ? +timeout : timeout;\n return clock.addTimer({\n type: "Timeout" /* Timeout */,\n func,\n args,\n delay\n });\n },\n clearTimeout: (timerId) => {\n if (timerId)\n clock.clearTimer(timerId, "Timeout" /* Timeout */);\n },\n setInterval: (func, timeout, ...args) => {\n const delay = timeout ? +timeout : timeout;\n return clock.addTimer({\n type: "Interval" /* Interval */,\n func,\n args,\n delay\n });\n },\n clearInterval: (timerId) => {\n if (timerId)\n return clock.clearTimer(timerId, "Interval" /* Interval */);\n },\n requestAnimationFrame: (callback) => {\n return clock.addTimer({\n type: "AnimationFrame" /* AnimationFrame */,\n func: callback,\n delay: clock.getTimeToNextFrame()\n });\n },\n cancelAnimationFrame: (timerId) => {\n if (timerId)\n return clock.clearTimer(timerId, "AnimationFrame" /* AnimationFrame */);\n },\n requestIdleCallback: (callback, options) => {\n let timeToNextIdlePeriod = 0;\n if (clock.countTimers() > 0)\n timeToNextIdlePeriod = 50;\n return clock.addTimer({\n type: "IdleCallback" /* IdleCallback */,\n func: callback,\n delay: (options == null ? void 0 : options.timeout) ? Math.min(options == null ? void 0 : options.timeout, timeToNextIdlePeriod) : timeToNextIdlePeriod\n });\n },\n cancelIdleCallback: (timerId) => {\n if (timerId)\n return clock.clearTimer(timerId, "IdleCallback" /* IdleCallback */);\n },\n Intl: originals.Intl ? createIntl(clock, originals.Intl) : void 0,\n Date: createDate(clock, originals.Date),\n performance: originals.performance ? fakePerformance(clock, originals.performance) : void 0\n };\n}\nfunction getClearHandler(type) {\n if (type === "IdleCallback" || type === "AnimationFrame")\n return `cancel${type}`;\n return `clear${type}`;\n}\nfunction fakePerformance(clock, performance) {\n const result = {\n now: () => clock.performanceNow()\n };\n result.__defineGetter__("timeOrigin", () => clock._now.origin || 0);\n for (const key of Object.keys(performance.__proto__)) {\n if (key === "now" || key === "timeOrigin")\n continue;\n if (key === "getEntries" || key === "getEntriesByName" || key === "getEntriesByType")\n result[key] = () => [];\n else\n result[key] = () => {\n };\n }\n return result;\n}\nfunction createClock(globalObject) {\n const originals = platformOriginals(globalObject);\n const embedder = {\n dateNow: () => originals.raw.Date.now(),\n performanceNow: () => Math.ceil(originals.raw.performance.now()),\n setTimeout: (task, timeout) => {\n const timerId = originals.bound.setTimeout(task, timeout);\n return () => originals.bound.clearTimeout(timerId);\n },\n setInterval: (task, delay) => {\n const intervalId = originals.bound.setInterval(task, delay);\n return () => originals.bound.clearInterval(intervalId);\n }\n };\n const clock = new ClockController(embedder);\n const api = createApi(clock, originals.bound);\n return { clock, api, originals: originals.raw };\n}\nfunction install(globalObject, config = {}) {\n var _a, _b;\n if ((_a = globalObject.Date) == null ? void 0 : _a.isFake) {\n throw new TypeError(`Can\'t install fake timers twice on the same global object.`);\n }\n const { clock, api, originals } = createClock(globalObject);\n const toFake = ((_b = config.toFake) == null ? void 0 : _b.length) ? config.toFake : Object.keys(originals);\n for (const method of toFake) {\n if (method === "Date") {\n globalObject.Date = mirrorDateProperties(api.Date, globalObject.Date);\n } else if (method === "Intl") {\n globalObject.Intl = api[method];\n } else if (method === "performance") {\n globalObject.performance = api[method];\n const kEventTimeStamp = Symbol("playwrightEventTimeStamp");\n Object.defineProperty(Event.prototype, "timeStamp", {\n get() {\n var _a2;\n if (!this[kEventTimeStamp])\n this[kEventTimeStamp] = (_a2 = api.performance) == null ? void 0 : _a2.now();\n return this[kEventTimeStamp];\n }\n });\n } else {\n globalObject[method] = (...args) => {\n return api[method].apply(api, args);\n };\n }\n clock.disposables.push(() => {\n globalObject[method] = originals[method];\n });\n }\n return { clock, api, originals };\n}\nfunction inject(globalObject) {\n const builtins = platformOriginals(globalObject).bound;\n const { clock: controller } = install(globalObject);\n controller.resume();\n return {\n controller,\n builtins\n };\n}\nfunction asWallTime(n) {\n return n;\n}\nfunction shiftTicks(ticks, ms) {\n return ticks + ms;\n}\n'; +let Clock$1 = class Clock { + constructor(browserContext) { + this._initScripts = []; + this._browserContext = browserContext; + } + async resetForReuse() { + await this._browserContext.removeInitScripts(this._initScripts); + this._initScripts = []; + } + async fastForward(ticks) { + await this._installIfNeeded(); + const ticksMillis = parseTicks$1(ticks); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('fastForward', ${Date.now()}, ${ticksMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.fastForward(${ticksMillis})`); + } + async install(time) { + await this._installIfNeeded(); + const timeMillis = time !== void 0 ? parseTime$1(time) : Date.now(); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('install', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.install(${timeMillis})`); + } + async pauseAt(ticks) { + await this._installIfNeeded(); + const timeMillis = parseTime$1(ticks); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('pauseAt', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.pauseAt(${timeMillis})`); + } + async resume() { + await this._installIfNeeded(); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('resume', ${Date.now()})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`); + } + async setFixedTime(time) { + await this._installIfNeeded(); + const timeMillis = parseTime$1(time); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('setFixedTime', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.setFixedTime(${timeMillis})`); + } + async setSystemTime(time) { + await this._installIfNeeded(); + const timeMillis = parseTime$1(time); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('setSystemTime', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.setSystemTime(${timeMillis})`); + } + async runFor(ticks) { + await this._installIfNeeded(); + const ticksMillis = parseTicks$1(ticks); + this._initScripts.push(await this._browserContext.addInitScript(`globalThis.__pwClock.controller.log('runFor', ${Date.now()}, ${ticksMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.runFor(${ticksMillis})`); + } + async _installIfNeeded() { + if (this._initScripts.length) + return; + const script = `(() => { + const module = {}; + ${source$6} + globalThis.__pwClock = (module.exports.inject())(globalThis); + })();`; + this._initScripts.push(await this._browserContext.addInitScript(script)); + await this._evaluateInFrames(script); + } + async _evaluateInFrames(script) { + await this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: true }); + } +}; +function parseTicks$1(value) { + if (typeof value === "number") + return value; + if (!value) + return 0; + const str = value; + const strings = str.split(":"); + const l = strings.length; + let i = l; + let ms2 = 0; + let parsed; + if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { + throw new Error( + `Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'` + ); + } + while (i--) { + parsed = parseInt(strings[i], 10); + if (parsed >= 60) + throw new Error(`Invalid time ${str}`); + ms2 += parsed * Math.pow(60, l - i - 1); + } + return ms2 * 1e3; +} +function parseTime$1(epoch) { + if (!epoch) + return 0; + if (typeof epoch === "number") + return epoch; + const parsed = new Date(epoch); + if (!isFinite(parsed.getTime())) + throw new Error(`Invalid date: ${epoch}`); + return parsed.getTime(); +} +const symbol = Symbol("Debugger"); +const _Debugger = class _Debugger2 extends eventsExports.EventEmitter { + constructor(context) { + super(); + this._pauseOnNextStatement = false; + this._pausedCallsMetadata = /* @__PURE__ */ new Map(); + this._muted = false; + this._context = context; + this._context[symbol] = this; + this._enabled = debugMode() === "inspector"; + if (this._enabled) + this.pauseOnNextStatement(); + context.instrumentation.addListener(this, context); + this._context.once(BrowserContext$1.Events.Close, () => { + this._context.instrumentation.removeListener(this); + }); + this._slowMo = this._context._browser.options.slowMo; + } + async setMuted(muted) { + this._muted = muted; + if (muted) this.resume(false); + } + async onBeforeCall(sdkObject, metadata) { + if (this._muted) + return; + if (shouldPauseOnCall(sdkObject, metadata) || this._pauseOnNextStatement && shouldPauseBeforeStep(metadata)) + await this.pause(sdkObject, metadata); + } + async _doSlowMo() { + await new Promise((f) => setTimeout(f, this._slowMo)); + } + async onAfterCall(sdkObject, metadata) { + if (this._slowMo && shouldSlowMo(metadata)) + await this._doSlowMo(); + } + async onBeforeInputAction(sdkObject, metadata) { + if (this._muted) + return; + if (metadata.playing) + return; + if (this._enabled && this._pauseOnNextStatement) + await this.pause(sdkObject, metadata); + } + async pause(sdkObject, metadata) { + if (this._muted) + return; + this._enabled = true; + metadata.pauseStartTime = monotonicTime(); + const result = new Promise((resolve) => { + this._pausedCallsMetadata.set(metadata, { resolve, sdkObject }); + }); + this.emit(_Debugger2.Events.PausedStateChanged); + return result; + } + resume(step) { + if (!this.isPaused()) + return; + this._pauseOnNextStatement = step; + const endTime = monotonicTime(); + for (const [metadata, { resolve }] of this._pausedCallsMetadata) { + metadata.pauseEndTime = endTime; + resolve(); + } + this._pausedCallsMetadata.clear(); + this.emit(_Debugger2.Events.PausedStateChanged); + } + pauseOnNextStatement() { + this._pauseOnNextStatement = true; + } + isPaused(metadata) { + if (metadata) + return this._pausedCallsMetadata.has(metadata); + return !!this._pausedCallsMetadata.size; + } + pausedDetails() { + const result = []; + for (const [metadata, { sdkObject }] of this._pausedCallsMetadata) + result.push({ metadata, sdkObject }); + return result; + } +}; +_Debugger.Events = { + PausedStateChanged: "pausedstatechanged" +}; +let Debugger = _Debugger; +function shouldPauseOnCall(sdkObject, metadata) { + var _a2; + if (sdkObject.attribution.playwright.options.isServer) + return false; + if (!((_a2 = sdkObject.attribution.browser) == null ? void 0 : _a2.options.headful) && !isUnderTest()) + return false; + return metadata.method === "pause"; +} +function shouldPauseBeforeStep(metadata) { + if (metadata.playing) + return true; + if (metadata.internal) + return false; + if (metadata.method === "close") + return true; + if (metadata.method === "waitForSelector" || metadata.method === "waitForEventInfo" || metadata.method === "querySelector" || metadata.method === "querySelectorAll") + return false; + const step = metadata.type + "." + metadata.method; + const metainfo = methodMetainfo.get(step); + if (metainfo == null ? void 0 : metainfo.internal) + return false; + return !!(metainfo == null ? void 0 : metainfo.snapshot) && !metainfo.pausesBeforeInput; +} +function shouldSlowMo(metadata) { + const metainfo = methodMetainfo.get(metadata.type + "." + metadata.method); + return !!(metainfo == null ? void 0 : metainfo.slowMo); +} +let Dialog$1 = class Dialog extends SdkObject { + constructor(page, type2, message, onHandle, defaultValue) { + super(page, "dialog"); + this._handled = false; + this._page = page; + this._type = type2; + this._message = message; + this._onHandle = onHandle; + this._defaultValue = defaultValue || ""; + } + page() { + return this._page; + } + type() { + return this._type; + } + message() { + return this._message; + } + defaultValue() { + return this._defaultValue; + } + async accept(promptText) { + assert(!this._handled, "Cannot accept dialog which is already handled!"); + this._handled = true; + this._page.browserContext.dialogManager.dialogWillClose(this); + await this._onHandle(true, promptText); + } + async dismiss() { + assert(!this._handled, "Cannot dismiss dialog which is already handled!"); + this._handled = true; + this._page.browserContext.dialogManager.dialogWillClose(this); + await this._onHandle(false); + } + async close() { + if (this._type === "beforeunload") + await this.accept(); + else + await this.dismiss(); + } +}; +class DialogManager { + constructor(instrumentation) { + this._dialogHandlers = /* @__PURE__ */ new Set(); + this._openedDialogs = /* @__PURE__ */ new Set(); + this._instrumentation = instrumentation; + } + dialogDidOpen(dialog) { + for (const frame of dialog.page().frameManager.frames()) + frame._invalidateNonStallingEvaluations("JavaScript dialog interrupted evaluation"); + this._openedDialogs.add(dialog); + this._instrumentation.onDialog(dialog); + let hasHandlers = false; + for (const handler of this._dialogHandlers) { + if (handler(dialog)) + hasHandlers = true; + } + if (!hasHandlers) + dialog.close().then(() => { + }); + } + dialogWillClose(dialog) { + this._openedDialogs.delete(dialog); + } + addDialogHandler(handler) { + this._dialogHandlers.add(handler); + } + removeDialogHandler(handler) { + this._dialogHandlers.delete(handler); + if (!this._dialogHandlers.size) { + for (const dialog of this._openedDialogs) + dialog.close().catch(() => { + }); + } + } + hasOpenDialogsForPage(page) { + return [...this._openedDialogs].some((dialog) => dialog.page() === page); + } + async closeBeforeUnloadDialogs() { + await Promise.all([...this._openedDialogs].map(async (dialog) => { + if (dialog.type() === "beforeunload") + await dialog.dismiss(); + })); + } +} +let Artifact$1 = class Artifact extends SdkObject { + constructor(parent, localPath, unaccessibleErrorMessage, cancelCallback) { + super(parent, "artifact"); + this._finishedPromise = new ManualPromise(); + this._saveCallbacks = []; + this._finished = false; + this._deleted = false; + this._localPath = localPath; + this._unaccessibleErrorMessage = unaccessibleErrorMessage; + this._cancelCallback = cancelCallback; + } + finishedPromise() { + return this._finishedPromise; + } + localPath() { + return this._localPath; + } + async localPathAfterFinished() { + if (this._unaccessibleErrorMessage) + throw new Error(this._unaccessibleErrorMessage); + await this._finishedPromise; + if (this._failureError) + throw this._failureError; + return this._localPath; + } + saveAs(saveCallback) { + if (this._unaccessibleErrorMessage) + throw new Error(this._unaccessibleErrorMessage); + if (this._deleted) + throw new Error(`File already deleted. Save before deleting.`); + if (this._failureError) + throw this._failureError; + if (this._finished) { + saveCallback(this._localPath).catch(() => { + }); + return; + } + this._saveCallbacks.push(saveCallback); + } + async failureError() { + var _a2; + if (this._unaccessibleErrorMessage) + return this._unaccessibleErrorMessage; + await this._finishedPromise; + return ((_a2 = this._failureError) == null ? void 0 : _a2.message) || null; + } + async cancel() { + assert(this._cancelCallback !== void 0); + return this._cancelCallback(); + } + async delete() { + if (this._unaccessibleErrorMessage) + return; + const fileName = await this.localPathAfterFinished(); + if (this._deleted) + return; + this._deleted = true; + if (fileName) + await fs.promises.unlink(fileName).catch((e) => { + }); + } + async deleteOnContextClose() { + if (this._deleted) + return; + this._deleted = true; + if (!this._unaccessibleErrorMessage) + await fs.promises.unlink(this._localPath).catch((e) => { + }); + await this.reportFinished(new TargetClosedError$1()); + } + async reportFinished(error2) { + if (this._finished) + return; + this._finished = true; + this._failureError = error2; + if (error2) { + for (const callback of this._saveCallbacks) + await callback("", error2); + } else { + for (const callback of this._saveCallbacks) + await callback(this._localPath); + } + this._saveCallbacks = []; + this._finishedPromise.resolve(); + } +}; +const source$5 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/utilityScript.ts\nvar utilityScript_exports = {};\n__export(utilityScript_exports, {\n UtilityScript: () => UtilityScript\n});\nmodule.exports = __toCommonJS(utilityScript_exports);\n\n// packages/playwright-core/src/utils/isomorphic/utilityScriptSerializers.ts\nfunction isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction base64ToTypedArray(base64, TypedArrayConstructor) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n return new TypedArrayConstructor(bytes.buffer);\n}\nfunction parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value) {\n return new Date(value.d);\n }\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a)\n result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ("o" in value) {\n const result = {};\n refs.set(value.id, result);\n for (const { k, v } of value.o) {\n if (k === "__proto__")\n continue;\n result[k] = parseEvaluationResultValue(v, handles, refs);\n }\n return result;\n }\n if ("h" in value)\n return handles[value.h];\n if ("ta" in value)\n return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]);\n }\n return value;\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n}\n\n// packages/injected/src/utilityScript.ts\nvar UtilityScript = class {\n // eslint-disable-next-line no-restricted-globals\n constructor(global, isUnderTest) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.global = global;\n this.isUnderTest = isUnderTest;\n if (global.__pwClock) {\n this.builtins = global.__pwClock.builtins;\n } else {\n this.builtins = {\n setTimeout: (_a = global.setTimeout) == null ? void 0 : _a.bind(global),\n clearTimeout: (_b = global.clearTimeout) == null ? void 0 : _b.bind(global),\n setInterval: (_c = global.setInterval) == null ? void 0 : _c.bind(global),\n clearInterval: (_d = global.clearInterval) == null ? void 0 : _d.bind(global),\n requestAnimationFrame: (_e = global.requestAnimationFrame) == null ? void 0 : _e.bind(global),\n cancelAnimationFrame: (_f = global.cancelAnimationFrame) == null ? void 0 : _f.bind(global),\n requestIdleCallback: (_g = global.requestIdleCallback) == null ? void 0 : _g.bind(global),\n cancelIdleCallback: (_h = global.cancelIdleCallback) == null ? void 0 : _h.bind(global),\n performance: global.performance,\n Intl: global.Intl,\n Date: global.Date\n };\n }\n if (this.isUnderTest)\n global.builtins = this.builtins;\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = parseEvaluationResultValue(args[i], handles);\n let result = this.global.eval(expression);\n if (isFunction === true) {\n result = result(...parameters);\n } else if (isFunction === false) {\n result = result;\n } else {\n if (typeof result === "function")\n result = result(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result) : result;\n }\n jsonValue(returnByValue, value) {\n if (value === void 0)\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n};\n'; +function isRegExp$1(obj) { + try { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; + } catch (error2) { + return false; + } +} +function isDate$1(obj) { + try { + return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]"; + } catch (error2) { + return false; + } +} +function isURL(obj) { + try { + return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]"; + } catch (error2) { + return false; + } +} +function isError(obj) { + var _a2; + try { + return obj instanceof Error || obj && ((_a2 = Object.getPrototypeOf(obj)) == null ? void 0 : _a2.name) === "Error"; + } catch (error2) { + return false; + } +} +function isTypedArray(obj, constructor) { + try { + return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`; + } catch (error2) { + return false; + } +} +const typedArrayConstructors = { + i8: Int8Array, + ui8: Uint8Array, + ui8c: Uint8ClampedArray, + i16: Int16Array, + ui16: Uint16Array, + i32: Int32Array, + ui32: Uint32Array, + // TODO: add Float16Array once it's in baseline + f32: Float32Array, + f64: Float64Array, + bi64: BigInt64Array, + bui64: BigUint64Array +}; +function typedArrayToBase64(array) { + if ("toBase64" in array) + return array.toBase64(); + const binary2 = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join(""); + return btoa(binary2); +} +function base64ToTypedArray(base64, TypedArrayConstructor) { + const binary2 = atob(base64); + const bytes = new Uint8Array(binary2.length); + for (let i = 0; i < binary2.length; i++) + bytes[i] = binary2.charCodeAt(i); + return new TypedArrayConstructor(bytes.buffer); +} +function parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) { + if (Object.is(value, void 0)) + return void 0; + if (typeof value === "object" && value) { + if ("ref" in value) + return refs.get(value.ref); + if ("v" in value) { + if (value.v === "undefined") + return void 0; + if (value.v === "null") + return null; + if (value.v === "NaN") + return NaN; + if (value.v === "Infinity") + return Infinity; + if (value.v === "-Infinity") + return -Infinity; + if (value.v === "-0") + return -0; + return void 0; + } + if ("d" in value) { + return new Date(value.d); + } + if ("u" in value) + return new URL(value.u); + if ("bi" in value) + return BigInt(value.bi); + if ("e" in value) { + const error2 = new Error(value.e.m); + error2.name = value.e.n; + error2.stack = value.e.s; + return error2; + } + if ("r" in value) + return new RegExp(value.r.p, value.r.f); + if ("a" in value) { + const result = []; + refs.set(value.id, result); + for (const a of value.a) + result.push(parseEvaluationResultValue(a, handles, refs)); + return result; + } + if ("o" in value) { + const result = {}; + refs.set(value.id, result); + for (const { k, v } of value.o) { + if (k === "__proto__") + continue; + result[k] = parseEvaluationResultValue(v, handles, refs); + } + return result; + } + if ("h" in value) + return handles[value.h]; + if ("ta" in value) + return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]); + } + return value; +} +function serializeAsCallArgument(value, handleSerializer) { + return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 }); +} +function serialize(value, handleSerializer, visitorInfo) { + if (value && typeof value === "object") { + if (typeof globalThis.Window === "function" && value instanceof globalThis.Window) + return "ref: "; + if (typeof globalThis.Document === "function" && value instanceof globalThis.Document) + return "ref: "; + if (typeof globalThis.Node === "function" && value instanceof globalThis.Node) + return "ref: "; + } + return innerSerialize(value, handleSerializer, visitorInfo); +} +function innerSerialize(value, handleSerializer, visitorInfo) { + var _a2; + const result = handleSerializer(value); + if ("fallThrough" in result) + value = result.fallThrough; + else + return result; + if (typeof value === "symbol") + return { v: "undefined" }; + if (Object.is(value, void 0)) + return { v: "undefined" }; + if (Object.is(value, null)) + return { v: "null" }; + if (Object.is(value, NaN)) + return { v: "NaN" }; + if (Object.is(value, Infinity)) + return { v: "Infinity" }; + if (Object.is(value, -Infinity)) + return { v: "-Infinity" }; + if (Object.is(value, -0)) + return { v: "-0" }; + if (typeof value === "boolean") + return value; + if (typeof value === "number") + return value; + if (typeof value === "string") + return value; + if (typeof value === "bigint") + return { bi: value.toString() }; + if (isError(value)) { + let stack; + if ((_a2 = value.stack) == null ? void 0 : _a2.startsWith(value.name + ": " + value.message)) { + stack = value.stack; + } else { + stack = `${value.name}: ${value.message} +${value.stack}`; + } + return { e: { n: value.name, m: value.message, s: stack } }; + } + if (isDate$1(value)) + return { d: value.toJSON() }; + if (isURL(value)) + return { u: value.toJSON() }; + if (isRegExp$1(value)) + return { r: { p: value.source, f: value.flags } }; + for (const [k, ctor] of Object.entries(typedArrayConstructors)) { + if (isTypedArray(value, ctor)) + return { ta: { b: typedArrayToBase64(value), k } }; + } + const id = visitorInfo.visited.get(value); + if (id) + return { ref: id }; + if (Array.isArray(value)) { + const a = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value, id2); + for (let i = 0; i < value.length; ++i) + a.push(serialize(value[i], handleSerializer, visitorInfo)); + return { a, id: id2 }; + } + if (typeof value === "object") { + const o = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value, id2); + for (const name of Object.keys(value)) { + let item; + try { + item = value[name]; + } catch (e) { + continue; + } + if (name === "toJSON" && typeof item === "function") + o.push({ k: name, v: { o: [], id: 0 } }); + else + o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) }); + } + let jsonWrapper; + try { + if (o.length === 0 && value.toJSON && typeof value.toJSON === "function") + jsonWrapper = { value: value.toJSON() }; + } catch (e) { + } + if (jsonWrapper) + return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo); + return { o, id: id2 }; + } +} +class ExecutionContext extends SdkObject { + constructor(parent, delegate, worldNameForTest) { + super(parent, "execution-context"); + this._contextDestroyedScope = new LongStandingScope(); + this.worldNameForTest = worldNameForTest; + this.delegate = delegate; + } + contextDestroyed(reason) { + this._contextDestroyedScope.close(new Error(reason)); + } + async _raceAgainstContextDestroyed(promise) { + return this._contextDestroyedScope.race(promise); + } + rawEvaluateJSON(expression) { + return this._raceAgainstContextDestroyed(this.delegate.rawEvaluateJSON(expression)); + } + rawEvaluateHandle(expression) { + return this._raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, expression)); + } + async evaluateWithArguments(expression, returnByValue, values, handles) { + const utilityScript = await this.utilityScript(); + return this._raceAgainstContextDestroyed(this.delegate.evaluateWithArguments(expression, returnByValue, utilityScript, values, handles)); + } + getProperties(object) { + return this._raceAgainstContextDestroyed(this.delegate.getProperties(object)); + } + releaseHandle(handle) { + return this.delegate.releaseHandle(handle); + } + adoptIfNeeded(handle) { + return null; + } + utilityScript() { + if (!this._utilityScriptPromise) { + const source2 = ` + (() => { + const module = {}; + ${source$5} + return new (module.exports.UtilityScript())(globalThis, ${isUnderTest()}); + })();`; + this._utilityScriptPromise = this._raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, source2)).then((handle) => { + handle._setPreview("UtilityScript"); + return handle; + }); + } + return this._utilityScriptPromise; + } + async doSlowMo() { + } +} +let JSHandle$1 = class JSHandle extends SdkObject { + constructor(context, type2, preview, objectId, value) { + super(context, "handle"); + this.__jshandle = true; + this._disposed = false; + this._context = context; + this._objectId = objectId; + this._value = value; + this._objectType = type2; + this._preview = this._objectId ? preview || `JSHandle@${this._objectType}` : String(value); + if (this._objectId && globalThis.leakedJSHandles) + globalThis.leakedJSHandles.set(this, new Error("Leaked JSHandle")); + } + async evaluate(pageFunction, arg) { + return evaluate(this._context, true, pageFunction, this, arg); + } + async evaluateHandle(pageFunction, arg) { + return evaluate(this._context, false, pageFunction, this, arg); + } + async evaluateExpression(expression, options2, arg) { + const value = await evaluateExpression(this._context, expression, { ...options2, returnByValue: true }, this, arg); + await this._context.doSlowMo(); + return value; + } + async evaluateExpressionHandle(expression, options2, arg) { + const value = await evaluateExpression(this._context, expression, { ...options2, returnByValue: false }, this, arg); + await this._context.doSlowMo(); + return value; + } + async getProperty(propertyName) { + const objectHandle = await this.evaluateHandle((object, propertyName2) => { + const result2 = { __proto__: null }; + result2[propertyName2] = object[propertyName2]; + return result2; + }, propertyName); + const properties = await objectHandle.getProperties(); + const result = properties.get(propertyName); + objectHandle.dispose(); + return result; + } + async getProperties() { + if (!this._objectId) + return /* @__PURE__ */ new Map(); + return this._context.getProperties(this); + } + rawValue() { + return this._value; + } + async jsonValue() { + if (!this._objectId) + return this._value; + const script = `(utilityScript, ...args) => utilityScript.jsonValue(...args)`; + return this._context.evaluateWithArguments(script, true, [true], [this]); + } + asElement() { + return null; + } + dispose() { + if (this._disposed) + return; + this._disposed = true; + if (this._objectId) { + this._context.releaseHandle(this).catch((e) => { + }); + if (globalThis.leakedJSHandles) + globalThis.leakedJSHandles.delete(this); + } + } + toString() { + return this._preview; + } + _setPreviewCallback(callback) { + this._previewCallback = callback; + } + preview() { + return this._preview; + } + worldNameForTest() { + return this._context.worldNameForTest; + } + _setPreview(preview) { + this._preview = preview; + if (this._previewCallback) + this._previewCallback(preview); + } +}; +async function evaluate(context, returnByValue, pageFunction, ...args) { + return evaluateExpression(context, String(pageFunction), { returnByValue, isFunction: typeof pageFunction === "function" }, ...args); +} +async function evaluateExpression(context, expression, options2, ...args) { + expression = normalizeEvaluationExpression(expression, options2.isFunction); + const handles = []; + const toDispose = []; + const pushHandle = (handle) => { + handles.push(handle); + return handles.length - 1; + }; + args = args.map((arg) => serializeAsCallArgument(arg, (handle) => { + if (handle instanceof JSHandle$1) { + if (!handle._objectId) + return { fallThrough: handle._value }; + if (handle._disposed) + throw new JavaScriptErrorInEvaluate("JSHandle is disposed!"); + const adopted = context.adoptIfNeeded(handle); + if (adopted === null) + return { h: pushHandle(Promise.resolve(handle)) }; + toDispose.push(adopted); + return { h: pushHandle(adopted) }; + } + return { fallThrough: handle }; + })); + const utilityScriptObjects = []; + for (const handle of await Promise.all(handles)) { + if (handle._context !== context) + throw new JavaScriptErrorInEvaluate("JSHandles can be evaluated only in the context they were created!"); + utilityScriptObjects.push(handle); + } + const utilityScriptValues = [options2.isFunction, options2.returnByValue, expression, args.length, ...args]; + const script = `(utilityScript, ...args) => utilityScript.evaluate(...args)`; + try { + return await context.evaluateWithArguments(script, options2.returnByValue || false, utilityScriptValues, utilityScriptObjects); + } finally { + toDispose.map((handlePromise) => handlePromise.then((handle) => handle.dispose())); + } +} +function parseUnserializableValue(unserializableValue) { + if (unserializableValue === "NaN") + return NaN; + if (unserializableValue === "Infinity") + return Infinity; + if (unserializableValue === "-Infinity") + return -Infinity; + if (unserializableValue === "-0") + return -0; +} +function normalizeEvaluationExpression(expression, isFunction) { + expression = expression.trim(); + if (isFunction) { + try { + new Function("(" + expression + ")"); + } catch (e1) { + if (!(e1 instanceof EvalError) || !e1.message.includes("unsafe-eval")) { + if (expression.startsWith("async ")) + expression = "async function " + expression.substring("async ".length); + else + expression = "function " + expression; + try { + new Function("(" + expression + ")"); + } catch (e2) { + throw new Error("Passed function is not well-serializable!"); + } + } + } + } + if (/^(async)?\s*function(\s|\()/.test(expression)) + expression = "(" + expression + ")"; + return expression; +} +class JavaScriptErrorInEvaluate extends Error { +} +function isJavaScriptErrorInEvaluate(error2) { + return error2 instanceof JavaScriptErrorInEvaluate; +} +function sparseArrayToString(entries) { + const arrayEntries = []; + for (const { name, value } of entries) { + const index2 = +name; + if (isNaN(index2) || index2 < 0) + continue; + arrayEntries.push({ index: index2, value }); + } + arrayEntries.sort((a, b) => a.index - b.index); + let lastIndex = -1; + const tokens = []; + for (const { index: index2, value } of arrayEntries) { + const emptyItems = index2 - lastIndex - 1; + if (emptyItems === 1) + tokens.push(`empty`); + else if (emptyItems > 1) + tokens.push(`empty x ${emptyItems}`); + tokens.push(String(value)); + lastIndex = index2; + } + return "[" + tokens.join(", ") + "]"; +} +class ProgressController { + constructor(metadata, sdkObject) { + this._forceAbortPromise = new ManualPromise(); + this._cleanups = []; + this._logName = "api"; + this._state = "before"; + this._deadline = 0; + this._timeout = 0; + this.metadata = metadata; + this.sdkObject = sdkObject; + this.instrumentation = sdkObject.instrumentation; + this._forceAbortPromise.catch((e) => null); + } + setLogName(logName) { + this._logName = logName; + } + abort(error2) { + this._forceAbortPromise.reject(error2); + } + async run(task, timeout) { + var _a2, _b2; + if (timeout) { + this._timeout = timeout; + this._deadline = timeout ? monotonicTime() + timeout : 0; + } + assert(this._state === "before"); + this._state = "running"; + (_a2 = this.sdkObject.attribution.context) == null ? void 0 : _a2._activeProgressControllers.add(this); + const progress2 = { + log: (message) => { + if (this._state === "running") + this.metadata.log.push(message); + this.instrumentation.onCallLog(this.sdkObject, this.metadata, this._logName, message); + }, + timeUntilDeadline: () => this._deadline ? this._deadline - monotonicTime() : 2147483647, + // 2^31-1 safe setTimeout in Node. + isRunning: () => this._state === "running", + cleanupWhenAborted: (cleanup) => { + if (this._state === "running") + this._cleanups.push(cleanup); + else + runCleanup(cleanup); + }, + throwIfAborted: () => { + if (this._state === "aborted") + throw new AbortedError(); + }, + metadata: this.metadata + }; + const timeoutError = new TimeoutError$1(`Timeout ${this._timeout}ms exceeded.`); + const timer = setTimeout(() => this._forceAbortPromise.reject(timeoutError), progress2.timeUntilDeadline()); + try { + const promise = task(progress2); + const result = await Promise.race([promise, this._forceAbortPromise]); + this._state = "finished"; + return result; + } catch (e) { + this._state = "aborted"; + await Promise.all(this._cleanups.splice(0).map(runCleanup)); + throw e; + } finally { + (_b2 = this.sdkObject.attribution.context) == null ? void 0 : _b2._activeProgressControllers.delete(this); + clearTimeout(timer); + } + } +} +async function runCleanup(cleanup) { + try { + await cleanup(); + } catch (e) { + } +} +class AbortedError extends Error { +} +const fileUploadSizeLimit$1 = 50 * 1024 * 1024; +async function filesExceedUploadLimit(files) { + const sizes = await Promise.all(files.map(async (file) => (await fs.promises.stat(file)).size)); + return sizes.reduce((total, size) => total + size, 0) >= fileUploadSizeLimit$1; +} +async function prepareFilesForUpload(frame, params) { + const { payloads, streams, directoryStream } = params; + let { localPaths, localDirectory } = params; + if ([payloads, localPaths, localDirectory, streams, directoryStream].filter(Boolean).length !== 1) + throw new Error("Exactly one of payloads, localPaths and streams must be provided"); + if (streams) + localPaths = streams.map((c) => c.path()); + if (directoryStream) + localDirectory = directoryStream.path(); + if (localPaths) { + for (const p of localPaths) + assert(path.isAbsolute(p) && path.resolve(p) === p, "Paths provided to localPaths must be absolute and fully resolved."); + } + let fileBuffers = payloads; + if (!frame._page.browserContext._browser._isCollocatedWithServer) { + if (localPaths) { + if (await filesExceedUploadLimit(localPaths)) + throw new Error("Cannot transfer files larger than 50Mb to a browser not co-located with the server"); + fileBuffers = await Promise.all(localPaths.map(async (item) => { + return { + name: path.basename(item), + buffer: await fs.promises.readFile(item), + lastModifiedMs: (await fs.promises.stat(item)).mtimeMs + }; + })); + localPaths = void 0; + } + } + const filePayloads = fileBuffers == null ? void 0 : fileBuffers.map((payload) => ({ + name: payload.name, + mimeType: payload.mimeType || mime.getType(payload.name) || "application/octet-stream", + buffer: payload.buffer.toString("base64"), + lastModifiedMs: payload.lastModifiedMs + })); + return { localPaths, localDirectory, filePayloads }; +} +const source$4 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/injectedScript.ts\nvar injectedScript_exports = {};\n__export(injectedScript_exports, {\n InjectedScript: () => InjectedScript\n});\nmodule.exports = __toCommonJS(injectedScript_exports);\n\n// packages/playwright-core/src/utils/isomorphic/ariaSnapshot.ts\nfunction parseAriaSnapshot(yaml, text, options = {}) {\n var _a;\n const lineCounter = new yaml.LineCounter();\n const parseOptions = {\n keepSourceTokens: true,\n lineCounter,\n ...options\n };\n const yamlDoc = yaml.parseDocument(text, parseOptions);\n const errors = [];\n const convertRange = (range) => {\n return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])];\n };\n const addError = (error) => {\n errors.push({\n message: error.message,\n range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])]\n });\n };\n const convertSeq = (container, seq) => {\n for (const item of seq.items) {\n const itemIsString = item instanceof yaml.Scalar && typeof item.value === "string";\n if (itemIsString) {\n const childNode = KeyParser.parse(item, parseOptions, errors);\n if (childNode) {\n container.children = container.children || [];\n container.children.push(childNode);\n }\n continue;\n }\n const itemIsMap = item instanceof yaml.YAMLMap;\n if (itemIsMap) {\n convertMap(container, item);\n continue;\n }\n errors.push({\n message: "Sequence items should be strings or maps",\n range: convertRange(item.range || seq.range)\n });\n }\n };\n const convertMap = (container, map) => {\n var _a2;\n for (const entry of map.items) {\n container.children = container.children || [];\n const keyIsString = entry.key instanceof yaml.Scalar && typeof entry.key.value === "string";\n if (!keyIsString) {\n errors.push({\n message: "Only string keys are supported",\n range: convertRange(entry.key.range || map.range)\n });\n continue;\n }\n const key = entry.key;\n const value = entry.value;\n if (key.value === "text") {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString) {\n errors.push({\n message: "Text value should be a string",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.children.push({\n kind: "text",\n text: valueOrRegex(value.value)\n });\n continue;\n }\n if (key.value === "/children") {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString || value.value !== "contain" && value.value !== "equal" && value.value !== "deep-equal") {\n errors.push({\n message: \'Strict value should be "contain", "equal" or "deep-equal"\',\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.containerMode = value.value;\n continue;\n }\n if (key.value.startsWith("/")) {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString) {\n errors.push({\n message: "Property value should be a string",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.props = (_a2 = container.props) != null ? _a2 : {};\n container.props[key.value.slice(1)] = valueOrRegex(value.value);\n continue;\n }\n const childNode = KeyParser.parse(key, parseOptions, errors);\n if (!childNode)\n continue;\n const valueIsScalar = value instanceof yaml.Scalar;\n if (valueIsScalar) {\n const type = typeof value.value;\n if (type !== "string" && type !== "number" && type !== "boolean") {\n errors.push({\n message: "Node value should be a string or a sequence",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.children.push({\n ...childNode,\n children: [{\n kind: "text",\n text: valueOrRegex(String(value.value))\n }]\n });\n continue;\n }\n const valueIsSequence = value instanceof yaml.YAMLSeq;\n if (valueIsSequence) {\n container.children.push(childNode);\n convertSeq(childNode, value);\n continue;\n }\n errors.push({\n message: "Map values should be strings or sequences",\n range: convertRange(entry.value.range || map.range)\n });\n }\n };\n const fragment = { kind: "role", role: "fragment" };\n yamlDoc.errors.forEach(addError);\n if (errors.length)\n return { errors, fragment };\n if (!(yamlDoc.contents instanceof yaml.YAMLSeq)) {\n errors.push({\n message: \'Aria snapshot must be a YAML sequence, elements starting with " -"\',\n range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }]\n });\n }\n if (errors.length)\n return { errors, fragment };\n convertSeq(fragment, yamlDoc.contents);\n if (errors.length)\n return { errors, fragment: emptyFragment };\n if (((_a = fragment.children) == null ? void 0 : _a.length) === 1)\n return { fragment: fragment.children[0], errors };\n return { fragment, errors };\n}\nvar emptyFragment = { kind: "role", role: "fragment" };\nfunction normalizeWhitespace(text) {\n return text.replace(/[\\u200b\\u00ad]/g, "").replace(/[\\r\\n\\s\\t]+/g, " ").trim();\n}\nfunction valueOrRegex(value) {\n return value.startsWith("/") && value.endsWith("/") && value.length > 1 ? { pattern: value.slice(1, -1) } : normalizeWhitespace(value);\n}\nvar KeyParser = class _KeyParser {\n static parse(text, options, errors) {\n try {\n return new _KeyParser(text.value)._parse();\n } catch (e) {\n if (e instanceof ParserError) {\n const message = options.prettyErrors === false ? e.message : e.message + ":\\n\\n" + text.value + "\\n" + " ".repeat(e.pos) + "^\\n";\n errors.push({\n message,\n range: [options.lineCounter.linePos(text.range[0]), options.lineCounter.linePos(text.range[0] + e.pos)]\n });\n return null;\n }\n throw e;\n }\n }\n constructor(input) {\n this._input = input;\n this._pos = 0;\n this._length = input.length;\n }\n _peek() {\n return this._input[this._pos] || "";\n }\n _next() {\n if (this._pos < this._length)\n return this._input[this._pos++];\n return null;\n }\n _eof() {\n return this._pos >= this._length;\n }\n _isWhitespace() {\n return !this._eof() && /\\s/.test(this._peek());\n }\n _skipWhitespace() {\n while (this._isWhitespace())\n this._pos++;\n }\n _readIdentifier(type) {\n if (this._eof())\n this._throwError(`Unexpected end of input when expecting ${type}`);\n const start = this._pos;\n while (!this._eof() && /[a-zA-Z]/.test(this._peek()))\n this._pos++;\n return this._input.slice(start, this._pos);\n }\n _readString() {\n let result = "";\n let escaped = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === "\\\\") {\n escaped = true;\n } else if (ch === \'"\') {\n return result;\n } else {\n result += ch;\n }\n }\n this._throwError("Unterminated string");\n }\n _throwError(message, offset = 0) {\n throw new ParserError(message, offset || this._pos);\n }\n _readRegex() {\n let result = "";\n let escaped = false;\n let insideClass = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === "\\\\") {\n escaped = true;\n result += ch;\n } else if (ch === "/" && !insideClass) {\n return { pattern: result };\n } else if (ch === "[") {\n insideClass = true;\n result += ch;\n } else if (ch === "]" && insideClass) {\n result += ch;\n insideClass = false;\n } else {\n result += ch;\n }\n }\n this._throwError("Unterminated regex");\n }\n _readStringOrRegex() {\n const ch = this._peek();\n if (ch === \'"\') {\n this._next();\n return normalizeWhitespace(this._readString());\n }\n if (ch === "/") {\n this._next();\n return this._readRegex();\n }\n return null;\n }\n _readAttributes(result) {\n let errorPos = this._pos;\n while (true) {\n this._skipWhitespace();\n if (this._peek() === "[") {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n const flagName = this._readIdentifier("attribute");\n this._skipWhitespace();\n let flagValue = "";\n if (this._peek() === "=") {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n while (this._peek() !== "]" && !this._isWhitespace() && !this._eof())\n flagValue += this._next();\n }\n this._skipWhitespace();\n if (this._peek() !== "]")\n this._throwError("Expected ]");\n this._next();\n this._applyAttribute(result, flagName, flagValue || "true", errorPos);\n } else {\n break;\n }\n }\n }\n _parse() {\n this._skipWhitespace();\n const role = this._readIdentifier("role");\n this._skipWhitespace();\n const name = this._readStringOrRegex() || "";\n const result = { kind: "role", role, name };\n this._readAttributes(result);\n this._skipWhitespace();\n if (!this._eof())\n this._throwError("Unexpected input");\n return result;\n }\n _applyAttribute(node, key, value, errorPos) {\n if (key === "checked") {\n this._assert(value === "true" || value === "false" || value === "mixed", \'Value of "checked" attribute must be a boolean or "mixed"\', errorPos);\n node.checked = value === "true" ? true : value === "false" ? false : "mixed";\n return;\n }\n if (key === "disabled") {\n this._assert(value === "true" || value === "false", \'Value of "disabled" attribute must be a boolean\', errorPos);\n node.disabled = value === "true";\n return;\n }\n if (key === "expanded") {\n this._assert(value === "true" || value === "false", \'Value of "expanded" attribute must be a boolean\', errorPos);\n node.expanded = value === "true";\n return;\n }\n if (key === "level") {\n this._assert(!isNaN(Number(value)), \'Value of "level" attribute must be a number\', errorPos);\n node.level = Number(value);\n return;\n }\n if (key === "pressed") {\n this._assert(value === "true" || value === "false" || value === "mixed", \'Value of "pressed" attribute must be a boolean or "mixed"\', errorPos);\n node.pressed = value === "true" ? true : value === "false" ? false : "mixed";\n return;\n }\n if (key === "selected") {\n this._assert(value === "true" || value === "false", \'Value of "selected" attribute must be a boolean\', errorPos);\n node.selected = value === "true";\n return;\n }\n this._assert(false, `Unsupported attribute [${key}]`, errorPos);\n }\n _assert(value, message, valuePos) {\n if (!value)\n this._throwError(message || "Assertion error", valuePos);\n }\n};\nvar ParserError = class extends Error {\n constructor(message, pos) {\n super(message);\n this.pos = pos;\n }\n};\n\n// packages/playwright-core/src/utils/isomorphic/cssTokenizer.ts\nvar between = function(num, first, last) {\n return num >= first && num <= last;\n};\nfunction digit(code) {\n return between(code, 48, 57);\n}\nfunction hexdigit(code) {\n return digit(code) || between(code, 65, 70) || between(code, 97, 102);\n}\nfunction uppercaseletter(code) {\n return between(code, 65, 90);\n}\nfunction lowercaseletter(code) {\n return between(code, 97, 122);\n}\nfunction letter(code) {\n return uppercaseletter(code) || lowercaseletter(code);\n}\nfunction nonascii(code) {\n return code >= 128;\n}\nfunction namestartchar(code) {\n return letter(code) || nonascii(code) || code === 95;\n}\nfunction namechar(code) {\n return namestartchar(code) || digit(code) || code === 45;\n}\nfunction nonprintable(code) {\n return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127;\n}\nfunction newline(code) {\n return code === 10;\n}\nfunction whitespace(code) {\n return newline(code) || code === 9 || code === 32;\n}\nvar maximumallowedcodepoint = 1114111;\nvar InvalidCharacterError = class extends Error {\n constructor(message) {\n super(message);\n this.name = "InvalidCharacterError";\n }\n};\nfunction preprocess(str) {\n const codepoints = [];\n for (let i = 0; i < str.length; i++) {\n let code = str.charCodeAt(i);\n if (code === 13 && str.charCodeAt(i + 1) === 10) {\n code = 10;\n i++;\n }\n if (code === 13 || code === 12)\n code = 10;\n if (code === 0)\n code = 65533;\n if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) {\n const lead = code - 55296;\n const trail = str.charCodeAt(i + 1) - 56320;\n code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail;\n i++;\n }\n codepoints.push(code);\n }\n return codepoints;\n}\nfunction stringFromCode(code) {\n if (code <= 65535)\n return String.fromCharCode(code);\n code -= Math.pow(2, 16);\n const lead = Math.floor(code / Math.pow(2, 10)) + 55296;\n const trail = code % Math.pow(2, 10) + 56320;\n return String.fromCharCode(lead) + String.fromCharCode(trail);\n}\nfunction tokenize(str1) {\n const str = preprocess(str1);\n let i = -1;\n const tokens = [];\n let code;\n let line = 0;\n let column = 0;\n let lastLineLength = 0;\n const incrLineno = function() {\n line += 1;\n lastLineLength = column;\n column = 0;\n };\n const locStart = { line, column };\n const codepoint = function(i2) {\n if (i2 >= str.length)\n return -1;\n return str[i2];\n };\n const next = function(num) {\n if (num === void 0)\n num = 1;\n if (num > 3)\n throw "Spec Error: no more than three codepoints of lookahead.";\n return codepoint(i + num);\n };\n const consume = function(num) {\n if (num === void 0)\n num = 1;\n i += num;\n code = codepoint(i);\n if (newline(code))\n incrLineno();\n else\n column += num;\n return true;\n };\n const reconsume = function() {\n i -= 1;\n if (newline(code)) {\n line -= 1;\n column = lastLineLength;\n } else {\n column -= 1;\n }\n locStart.line = line;\n locStart.column = column;\n return true;\n };\n const eof = function(codepoint2) {\n if (codepoint2 === void 0)\n codepoint2 = code;\n return codepoint2 === -1;\n };\n const donothing = function() {\n };\n const parseerror = function() {\n };\n const consumeAToken = function() {\n consumeComments();\n consume();\n if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n return new WhitespaceToken();\n } else if (code === 34) {\n return consumeAStringToken();\n } else if (code === 35) {\n if (namechar(next()) || areAValidEscape(next(1), next(2))) {\n const token = new HashToken("");\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n token.type = "id";\n token.value = consumeAName();\n return token;\n } else {\n return new DelimToken(code);\n }\n } else if (code === 36) {\n if (next() === 61) {\n consume();\n return new SuffixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 39) {\n return consumeAStringToken();\n } else if (code === 40) {\n return new OpenParenToken();\n } else if (code === 41) {\n return new CloseParenToken();\n } else if (code === 42) {\n if (next() === 61) {\n consume();\n return new SubstringMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 43) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 44) {\n return new CommaToken();\n } else if (code === 45) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else if (next(1) === 45 && next(2) === 62) {\n consume(2);\n return new CDCToken();\n } else if (startsWithAnIdentifier()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 46) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 58) {\n return new ColonToken();\n } else if (code === 59) {\n return new SemicolonToken();\n } else if (code === 60) {\n if (next(1) === 33 && next(2) === 45 && next(3) === 45) {\n consume(3);\n return new CDOToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 64) {\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n return new AtKeywordToken(consumeAName());\n else\n return new DelimToken(code);\n } else if (code === 91) {\n return new OpenSquareToken();\n } else if (code === 92) {\n if (startsWithAValidEscape()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n parseerror();\n return new DelimToken(code);\n }\n } else if (code === 93) {\n return new CloseSquareToken();\n } else if (code === 94) {\n if (next() === 61) {\n consume();\n return new PrefixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 123) {\n return new OpenCurlyToken();\n } else if (code === 124) {\n if (next() === 61) {\n consume();\n return new DashMatchToken();\n } else if (next() === 124) {\n consume();\n return new ColumnToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 125) {\n return new CloseCurlyToken();\n } else if (code === 126) {\n if (next() === 61) {\n consume();\n return new IncludeMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (digit(code)) {\n reconsume();\n return consumeANumericToken();\n } else if (namestartchar(code)) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else if (eof()) {\n return new EOFToken();\n } else {\n return new DelimToken(code);\n }\n };\n const consumeComments = function() {\n while (next(1) === 47 && next(2) === 42) {\n consume(2);\n while (true) {\n consume();\n if (code === 42 && next() === 47) {\n consume();\n break;\n } else if (eof()) {\n parseerror();\n return;\n }\n }\n }\n };\n const consumeANumericToken = function() {\n const num = consumeANumber();\n if (wouldStartAnIdentifier(next(1), next(2), next(3))) {\n const token = new DimensionToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n token.unit = consumeAName();\n return token;\n } else if (next() === 37) {\n consume();\n const token = new PercentageToken();\n token.value = num.value;\n token.repr = num.repr;\n return token;\n } else {\n const token = new NumberToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n return token;\n }\n };\n const consumeAnIdentlikeToken = function() {\n const str2 = consumeAName();\n if (str2.toLowerCase() === "url" && next() === 40) {\n consume();\n while (whitespace(next(1)) && whitespace(next(2)))\n consume();\n if (next() === 34 || next() === 39)\n return new FunctionToken(str2);\n else if (whitespace(next()) && (next(2) === 34 || next(2) === 39))\n return new FunctionToken(str2);\n else\n return consumeAURLToken();\n } else if (next() === 40) {\n consume();\n return new FunctionToken(str2);\n } else {\n return new IdentToken(str2);\n }\n };\n const consumeAStringToken = function(endingCodePoint) {\n if (endingCodePoint === void 0)\n endingCodePoint = code;\n let string = "";\n while (consume()) {\n if (code === endingCodePoint || eof()) {\n return new StringToken(string);\n } else if (newline(code)) {\n parseerror();\n reconsume();\n return new BadStringToken();\n } else if (code === 92) {\n if (eof(next()))\n donothing();\n else if (newline(next()))\n consume();\n else\n string += stringFromCode(consumeEscape());\n } else {\n string += stringFromCode(code);\n }\n }\n throw new Error("Internal error");\n };\n const consumeAURLToken = function() {\n const token = new URLToken("");\n while (whitespace(next()))\n consume();\n if (eof(next()))\n return token;\n while (consume()) {\n if (code === 41 || eof()) {\n return token;\n } else if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n if (next() === 41 || eof(next())) {\n consume();\n return token;\n } else {\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n } else if (code === 92) {\n if (startsWithAValidEscape()) {\n token.value += stringFromCode(consumeEscape());\n } else {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else {\n token.value += stringFromCode(code);\n }\n }\n throw new Error("Internal error");\n };\n const consumeEscape = function() {\n consume();\n if (hexdigit(code)) {\n const digits = [code];\n for (let total = 0; total < 5; total++) {\n if (hexdigit(next())) {\n consume();\n digits.push(code);\n } else {\n break;\n }\n }\n if (whitespace(next()))\n consume();\n let value = parseInt(digits.map(function(x) {\n return String.fromCharCode(x);\n }).join(""), 16);\n if (value > maximumallowedcodepoint)\n value = 65533;\n return value;\n } else if (eof()) {\n return 65533;\n } else {\n return code;\n }\n };\n const areAValidEscape = function(c1, c2) {\n if (c1 !== 92)\n return false;\n if (newline(c2))\n return false;\n return true;\n };\n const startsWithAValidEscape = function() {\n return areAValidEscape(code, next());\n };\n const wouldStartAnIdentifier = function(c1, c2, c3) {\n if (c1 === 45)\n return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3);\n else if (namestartchar(c1))\n return true;\n else if (c1 === 92)\n return areAValidEscape(c1, c2);\n else\n return false;\n };\n const startsWithAnIdentifier = function() {\n return wouldStartAnIdentifier(code, next(1), next(2));\n };\n const wouldStartANumber = function(c1, c2, c3) {\n if (c1 === 43 || c1 === 45) {\n if (digit(c2))\n return true;\n if (c2 === 46 && digit(c3))\n return true;\n return false;\n } else if (c1 === 46) {\n if (digit(c2))\n return true;\n return false;\n } else if (digit(c1)) {\n return true;\n } else {\n return false;\n }\n };\n const startsWithANumber = function() {\n return wouldStartANumber(code, next(1), next(2));\n };\n const consumeAName = function() {\n let result = "";\n while (consume()) {\n if (namechar(code)) {\n result += stringFromCode(code);\n } else if (startsWithAValidEscape()) {\n result += stringFromCode(consumeEscape());\n } else {\n reconsume();\n return result;\n }\n }\n throw new Error("Internal parse error");\n };\n const consumeANumber = function() {\n let repr = "";\n let type = "integer";\n if (next() === 43 || next() === 45) {\n consume();\n repr += stringFromCode(code);\n }\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n if (next(1) === 46 && digit(next(2))) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const c1 = next(1), c2 = next(2), c3 = next(3);\n if ((c1 === 69 || c1 === 101) && digit(c2)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const value = convertAStringToANumber(repr);\n return { type, value, repr };\n };\n const convertAStringToANumber = function(string) {\n return +string;\n };\n const consumeTheRemnantsOfABadURL = function() {\n while (consume()) {\n if (code === 41 || eof()) {\n return;\n } else if (startsWithAValidEscape()) {\n consumeEscape();\n donothing();\n } else {\n donothing();\n }\n }\n };\n let iterationCount = 0;\n while (!eof(next())) {\n tokens.push(consumeAToken());\n iterationCount++;\n if (iterationCount > str.length * 2)\n throw new Error("I\'m infinite-looping!");\n }\n return tokens;\n}\nvar CSSParserToken = class {\n constructor() {\n this.tokenType = "";\n }\n toJSON() {\n return { token: this.tokenType };\n }\n toString() {\n return this.tokenType;\n }\n toSource() {\n return "" + this;\n }\n};\nvar BadStringToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "BADSTRING";\n }\n};\nvar BadURLToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "BADURL";\n }\n};\nvar WhitespaceToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "WHITESPACE";\n }\n toString() {\n return "WS";\n }\n toSource() {\n return " ";\n }\n};\nvar CDOToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "CDO";\n }\n toSource() {\n return "";\n }\n};\nvar ColonToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ":";\n }\n};\nvar SemicolonToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ";";\n }\n};\nvar CommaToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ",";\n }\n};\nvar GroupingToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.value = "";\n this.mirror = "";\n }\n};\nvar OpenCurlyToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "{";\n this.value = "{";\n this.mirror = "}";\n }\n};\nvar CloseCurlyToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "}";\n this.value = "}";\n this.mirror = "{";\n }\n};\nvar OpenSquareToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "[";\n this.value = "[";\n this.mirror = "]";\n }\n};\nvar CloseSquareToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "]";\n this.value = "]";\n this.mirror = "[";\n }\n};\nvar OpenParenToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "(";\n this.value = "(";\n this.mirror = ")";\n }\n};\nvar CloseParenToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = ")";\n this.value = ")";\n this.mirror = "(";\n }\n};\nvar IncludeMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "~=";\n }\n};\nvar DashMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "|=";\n }\n};\nvar PrefixMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "^=";\n }\n};\nvar SuffixMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "$=";\n }\n};\nvar SubstringMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "*=";\n }\n};\nvar ColumnToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "||";\n }\n};\nvar EOFToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "EOF";\n }\n toSource() {\n return "";\n }\n};\nvar DelimToken = class extends CSSParserToken {\n constructor(code) {\n super();\n this.tokenType = "DELIM";\n this.value = "";\n this.value = stringFromCode(code);\n }\n toString() {\n return "DELIM(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n toSource() {\n if (this.value === "\\\\")\n return "\\\\\\n";\n else\n return this.value;\n }\n};\nvar StringValuedToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.value = "";\n }\n ASCIIMatch(str) {\n return this.value.toLowerCase() === str.toLowerCase();\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n};\nvar IdentToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "IDENT";\n this.value = val;\n }\n toString() {\n return "IDENT(" + this.value + ")";\n }\n toSource() {\n return escapeIdent(this.value);\n }\n};\nvar FunctionToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "FUNCTION";\n this.value = val;\n this.mirror = ")";\n }\n toString() {\n return "FUNCTION(" + this.value + ")";\n }\n toSource() {\n return escapeIdent(this.value) + "(";\n }\n};\nvar AtKeywordToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "AT-KEYWORD";\n this.value = val;\n }\n toString() {\n return "AT(" + this.value + ")";\n }\n toSource() {\n return "@" + escapeIdent(this.value);\n }\n};\nvar HashToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "HASH";\n this.value = val;\n this.type = "unrestricted";\n }\n toString() {\n return "HASH(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n return json;\n }\n toSource() {\n if (this.type === "id")\n return "#" + escapeIdent(this.value);\n else\n return "#" + escapeHash(this.value);\n }\n};\nvar StringToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "STRING";\n this.value = val;\n }\n toString() {\n return \'"\' + escapeString(this.value) + \'"\';\n }\n};\nvar URLToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "URL";\n this.value = val;\n }\n toString() {\n return "URL(" + this.value + ")";\n }\n toSource() {\n return \'url("\' + escapeString(this.value) + \'")\';\n }\n};\nvar NumberToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "NUMBER";\n this.type = "integer";\n this.repr = "";\n }\n toString() {\n if (this.type === "integer")\n return "INT(" + this.value + ")";\n return "NUMBER(" + this.value + ")";\n }\n toJSON() {\n const json = super.toJSON();\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n return json;\n }\n toSource() {\n return this.repr;\n }\n};\nvar PercentageToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "PERCENTAGE";\n this.repr = "";\n }\n toString() {\n return "PERCENTAGE(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.repr = this.repr;\n return json;\n }\n toSource() {\n return this.repr + "%";\n }\n};\nvar DimensionToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "DIMENSION";\n this.type = "integer";\n this.repr = "";\n this.unit = "";\n }\n toString() {\n return "DIM(" + this.value + "," + this.unit + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n json.unit = this.unit;\n return json;\n }\n toSource() {\n const source = this.repr;\n let unit = escapeIdent(this.unit);\n if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) {\n unit = "\\\\65 " + unit.slice(1, unit.length);\n }\n return source + unit;\n }\n};\nfunction escapeIdent(string) {\n string = "" + string;\n let result = "";\n const firstcode = string.charCodeAt(0);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45)\n result += "\\\\" + code.toString(16) + " ";\n else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))\n result += string[i];\n else\n result += "\\\\" + string[i];\n }\n return result;\n}\nfunction escapeHash(string) {\n string = "" + string;\n let result = "";\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))\n result += string[i];\n else\n result += "\\\\" + code.toString(16) + " ";\n }\n return result;\n}\nfunction escapeString(string) {\n string = "" + string;\n let result = "";\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (between(code, 1, 31) || code === 127)\n result += "\\\\" + code.toString(16) + " ";\n else if (code === 34 || code === 92)\n result += "\\\\" + string[i];\n else\n result += string[i];\n }\n return result;\n}\n\n// packages/playwright-core/src/utils/isomorphic/cssParser.ts\nvar InvalidSelectorError = class extends Error {\n};\nfunction parseCSS(selector, customNames) {\n let tokens;\n try {\n tokens = tokenize(selector);\n if (!(tokens[tokens.length - 1] instanceof EOFToken))\n tokens.push(new EOFToken());\n } catch (e) {\n const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`;\n const index = (e.stack || "").indexOf(e.message);\n if (index !== -1)\n e.stack = e.stack.substring(0, index) + newMessage + e.stack.substring(index + e.message.length);\n e.message = newMessage;\n throw e;\n }\n const unsupportedToken = tokens.find((token) => {\n return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings.\n // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz }\n // Or this way :xpath( {complex-xpath-goes-here("hello")} )\n token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings?\n token instanceof URLToken || token instanceof PercentageToken;\n });\n if (unsupportedToken)\n throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n let pos = 0;\n const names = /* @__PURE__ */ new Set();\n function unexpected() {\n return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n }\n function skipWhitespace() {\n while (tokens[pos] instanceof WhitespaceToken)\n pos++;\n }\n function isIdent(p = pos) {\n return tokens[p] instanceof IdentToken;\n }\n function isString(p = pos) {\n return tokens[p] instanceof StringToken;\n }\n function isNumber(p = pos) {\n return tokens[p] instanceof NumberToken;\n }\n function isComma(p = pos) {\n return tokens[p] instanceof CommaToken;\n }\n function isOpenParen(p = pos) {\n return tokens[p] instanceof OpenParenToken;\n }\n function isCloseParen(p = pos) {\n return tokens[p] instanceof CloseParenToken;\n }\n function isFunction(p = pos) {\n return tokens[p] instanceof FunctionToken;\n }\n function isStar(p = pos) {\n return tokens[p] instanceof DelimToken && tokens[p].value === "*";\n }\n function isEOF(p = pos) {\n return tokens[p] instanceof EOFToken;\n }\n function isClauseCombinator(p = pos) {\n return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value);\n }\n function isSelectorClauseEnd(p = pos) {\n return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken;\n }\n function consumeFunctionArguments() {\n const result2 = [consumeArgument()];\n while (true) {\n skipWhitespace();\n if (!isComma())\n break;\n pos++;\n result2.push(consumeArgument());\n }\n return result2;\n }\n function consumeArgument() {\n skipWhitespace();\n if (isNumber())\n return tokens[pos++].value;\n if (isString())\n return tokens[pos++].value;\n return consumeComplexSelector();\n }\n function consumeComplexSelector() {\n const result2 = { simples: [] };\n skipWhitespace();\n if (isClauseCombinator()) {\n result2.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" });\n } else {\n result2.simples.push({ selector: consumeSimpleSelector(), combinator: "" });\n }\n while (true) {\n skipWhitespace();\n if (isClauseCombinator()) {\n result2.simples[result2.simples.length - 1].combinator = tokens[pos++].value;\n skipWhitespace();\n } else if (isSelectorClauseEnd()) {\n break;\n }\n result2.simples.push({ combinator: "", selector: consumeSimpleSelector() });\n }\n return result2;\n }\n function consumeSimpleSelector() {\n let rawCSSString = "";\n const functions = [];\n while (!isSelectorClauseEnd()) {\n if (isIdent() || isStar()) {\n rawCSSString += tokens[pos++].toSource();\n } else if (tokens[pos] instanceof HashToken) {\n rawCSSString += tokens[pos++].toSource();\n } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") {\n pos++;\n if (isIdent())\n rawCSSString += "." + tokens[pos++].toSource();\n else\n throw unexpected();\n } else if (tokens[pos] instanceof ColonToken) {\n pos++;\n if (isIdent()) {\n if (!customNames.has(tokens[pos].value.toLowerCase())) {\n rawCSSString += ":" + tokens[pos++].toSource();\n } else {\n const name = tokens[pos++].value.toLowerCase();\n functions.push({ name, args: [] });\n names.add(name);\n }\n } else if (isFunction()) {\n const name = tokens[pos++].value.toLowerCase();\n if (!customNames.has(name)) {\n rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`;\n } else {\n functions.push({ name, args: consumeFunctionArguments() });\n names.add(name);\n }\n skipWhitespace();\n if (!isCloseParen())\n throw unexpected();\n pos++;\n } else {\n throw unexpected();\n }\n } else if (tokens[pos] instanceof OpenSquareToken) {\n rawCSSString += "[";\n pos++;\n while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF())\n rawCSSString += tokens[pos++].toSource();\n if (!(tokens[pos] instanceof CloseSquareToken))\n throw unexpected();\n rawCSSString += "]";\n pos++;\n } else {\n throw unexpected();\n }\n }\n if (!rawCSSString && !functions.length)\n throw unexpected();\n return { css: rawCSSString || void 0, functions };\n }\n function consumeBuiltinFunctionArguments() {\n let s = "";\n let balance = 1;\n while (!isEOF()) {\n if (isOpenParen() || isFunction())\n balance++;\n if (isCloseParen())\n balance--;\n if (!balance)\n break;\n s += tokens[pos++].toSource();\n }\n return s;\n }\n const result = consumeFunctionArguments();\n if (!isEOF())\n throw unexpected();\n if (result.some((arg) => typeof arg !== "object" || !("simples" in arg)))\n throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n return { selector: result, names: Array.from(names) };\n}\n\n// packages/playwright-core/src/utils/isomorphic/selectorParser.ts\nvar kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]);\nvar kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]);\nvar customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]);\nfunction parseSelector(selector) {\n const parsedStrings = parseSelectorString(selector);\n const parts = [];\n for (const part of parsedStrings.parts) {\n if (part.name === "css" || part.name === "css:light") {\n if (part.name === "css:light")\n part.body = ":light(" + part.body + ")";\n const parsedCSS = parseCSS(part.body, customCSSNames);\n parts.push({\n name: "css",\n body: parsedCSS.selector,\n source: part.body\n });\n continue;\n }\n if (kNestedSelectorNames.has(part.name)) {\n let innerSelector;\n let distance;\n try {\n const unescaped = JSON.parse("[" + part.body + "]");\n if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string")\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n innerSelector = unescaped[0];\n if (unescaped.length === 2) {\n if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name))\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n distance = unescaped[1];\n }\n } catch (e) {\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n }\n const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } };\n const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame");\n const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1;\n if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1)))\n nested.body.parsed.parts.splice(0, lastFrameIndex + 1);\n parts.push(nested);\n continue;\n }\n parts.push({ ...part, source: part.body });\n }\n if (kNestedSelectorNames.has(parts[0].name))\n throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`);\n return {\n capture: parsedStrings.capture,\n parts\n };\n}\nfunction selectorPartsEqual(list1, list2) {\n return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 });\n}\nfunction stringifySelector(selector, forceEngineName) {\n if (typeof selector === "string")\n return selector;\n return selector.parts.map((p, i) => {\n let includeEngine = true;\n if (!forceEngineName && i !== selector.capture) {\n if (p.name === "css")\n includeEngine = false;\n else if (p.name === "xpath" && p.source.startsWith("//") || p.source.startsWith(".."))\n includeEngine = false;\n }\n const prefix = includeEngine ? p.name + "=" : "";\n return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`;\n }).join(" >> ");\n}\nfunction visitAllSelectorParts(selector, visitor) {\n const visit = (selector2, nested) => {\n for (const part of selector2.parts) {\n visitor(part, nested);\n if (kNestedSelectorNames.has(part.name))\n visit(part.body.parsed, true);\n }\n };\n visit(selector, false);\n}\nfunction parseSelectorString(selector) {\n let index = 0;\n let quote;\n let start = 0;\n const result = { parts: [] };\n const append = () => {\n const part = selector.substring(start, index).trim();\n const eqIndex = part.indexOf("=");\n let name;\n let body;\n if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) {\n name = part.substring(0, eqIndex).trim();\n body = part.substring(eqIndex + 1);\n } else if (part.length > 1 && part[0] === \'"\' && part[part.length - 1] === \'"\') {\n name = "text";\n body = part;\n } else if (part.length > 1 && part[0] === "\'" && part[part.length - 1] === "\'") {\n name = "text";\n body = part;\n } else if (/^\\(*\\/\\//.test(part) || part.startsWith("..")) {\n name = "xpath";\n body = part;\n } else {\n name = "css";\n body = part;\n }\n let capture = false;\n if (name[0] === "*") {\n capture = true;\n name = name.substring(1);\n }\n result.parts.push({ name, body });\n if (capture) {\n if (result.capture !== void 0)\n throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`);\n result.capture = result.parts.length - 1;\n }\n };\n if (!selector.includes(">>")) {\n index = selector.length;\n append();\n return result;\n }\n const shouldIgnoreTextSelectorQuote = () => {\n const prefix = selector.substring(start, index);\n const match = prefix.match(/^\\s*text\\s*=(.*)$/);\n return !!match && !!match[1];\n };\n while (index < selector.length) {\n const c = selector[index];\n if (c === "\\\\" && index + 1 < selector.length) {\n index += 2;\n } else if (c === quote) {\n quote = void 0;\n index++;\n } else if (!quote && (c === \'"\' || c === "\'" || c === "`") && !shouldIgnoreTextSelectorQuote()) {\n quote = c;\n index++;\n } else if (!quote && c === ">" && selector[index + 1] === ">") {\n append();\n index += 2;\n start = index;\n } else {\n index++;\n }\n }\n append();\n return result;\n}\nfunction parseAttributeSelector(selector, allowUnquotedStrings) {\n let wp = 0;\n let EOL = selector.length === 0;\n const next = () => selector[wp] || "";\n const eat1 = () => {\n const result2 = next();\n ++wp;\n EOL = wp >= selector.length;\n return result2;\n };\n const syntaxError = (stage) => {\n if (EOL)\n throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \\`${selector}\\``);\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : ""));\n };\n function skipSpaces() {\n while (!EOL && /\\s/.test(next()))\n eat1();\n }\n function isCSSNameChar(char) {\n return char >= "\\x80" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-";\n }\n function readIdentifier() {\n let result2 = "";\n skipSpaces();\n while (!EOL && isCSSNameChar(next()))\n result2 += eat1();\n return result2;\n }\n function readQuotedString(quote) {\n let result2 = eat1();\n if (result2 !== quote)\n syntaxError("parsing quoted string");\n while (!EOL && next() !== quote) {\n if (next() === "\\\\")\n eat1();\n result2 += eat1();\n }\n if (next() !== quote)\n syntaxError("parsing quoted string");\n result2 += eat1();\n return result2;\n }\n function readRegularExpression() {\n if (eat1() !== "/")\n syntaxError("parsing regular expression");\n let source = "";\n let inClass = false;\n while (!EOL) {\n if (next() === "\\\\") {\n source += eat1();\n if (EOL)\n syntaxError("parsing regular expression");\n } else if (inClass && next() === "]") {\n inClass = false;\n } else if (!inClass && next() === "[") {\n inClass = true;\n } else if (!inClass && next() === "/") {\n break;\n }\n source += eat1();\n }\n if (eat1() !== "/")\n syntaxError("parsing regular expression");\n let flags = "";\n while (!EOL && next().match(/[dgimsuy]/))\n flags += eat1();\n try {\n return new RegExp(source, flags);\n } catch (e) {\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\`: ${e.message}`);\n }\n }\n function readAttributeToken() {\n let token = "";\n skipSpaces();\n if (next() === `\'` || next() === `"`)\n token = readQuotedString(next()).slice(1, -1);\n else\n token = readIdentifier();\n if (!token)\n syntaxError("parsing property path");\n return token;\n }\n function readOperator() {\n skipSpaces();\n let op = "";\n if (!EOL)\n op += eat1();\n if (!EOL && op !== "=")\n op += eat1();\n if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op))\n syntaxError("parsing operator");\n return op;\n }\n function readAttribute() {\n eat1();\n const jsonPath = [];\n jsonPath.push(readAttributeToken());\n skipSpaces();\n while (next() === ".") {\n eat1();\n jsonPath.push(readAttributeToken());\n skipSpaces();\n }\n if (next() === "]") {\n eat1();\n return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false };\n }\n const operator = readOperator();\n let value = void 0;\n let caseSensitive = true;\n skipSpaces();\n if (next() === "/") {\n if (operator !== "=")\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - cannot use ${operator} in attribute with regular expression`);\n value = readRegularExpression();\n } else if (next() === `\'` || next() === `"`) {\n value = readQuotedString(next()).slice(1, -1);\n skipSpaces();\n if (next() === "i" || next() === "I") {\n caseSensitive = false;\n eat1();\n } else if (next() === "s" || next() === "S") {\n caseSensitive = true;\n eat1();\n }\n } else {\n value = "";\n while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === "."))\n value += eat1();\n if (value === "true") {\n value = true;\n } else if (value === "false") {\n value = false;\n } else {\n if (!allowUnquotedStrings) {\n value = +value;\n if (Number.isNaN(value))\n syntaxError("parsing attribute value");\n }\n }\n }\n skipSpaces();\n if (next() !== "]")\n syntaxError("parsing attribute value");\n eat1();\n if (operator !== "=" && typeof value !== "string")\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - cannot use ${operator} in attribute with non-string matching value - ${value}`);\n return { name: jsonPath.join("."), jsonPath, op: operator, value, caseSensitive };\n }\n const result = {\n name: "",\n attributes: []\n };\n result.name = readIdentifier();\n skipSpaces();\n while (next() === "[") {\n result.attributes.push(readAttribute());\n skipSpaces();\n }\n if (!EOL)\n syntaxError(void 0);\n if (!result.name && !result.attributes.length)\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - selector cannot be empty`);\n return result;\n}\n\n// packages/playwright-core/src/utils/isomorphic/stringUtils.ts\nfunction escapeWithQuotes(text, char = "\'") {\n const stringified = JSON.stringify(text);\n const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\\\"/g, \'"\');\n if (char === "\'")\n return char + escapedText.replace(/[\']/g, "\\\\\'") + char;\n if (char === \'"\')\n return char + escapedText.replace(/["]/g, \'\\\\"\') + char;\n if (char === "`")\n return char + escapedText.replace(/[`]/g, "`") + char;\n throw new Error("Invalid escape char");\n}\nfunction toTitleCase(name) {\n return name.charAt(0).toUpperCase() + name.substring(1);\n}\nfunction toSnakeCase(name) {\n return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase();\n}\nfunction quoteCSSAttributeValue(text) {\n return `"${text.replace(/["\\\\]/g, (char) => "\\\\" + char)}"`;\n}\nvar normalizedWhitespaceCache;\nfunction cacheNormalizedWhitespaces() {\n normalizedWhitespaceCache = /* @__PURE__ */ new Map();\n}\nfunction normalizeWhiteSpace(text) {\n let result = normalizedWhitespaceCache == null ? void 0 : normalizedWhitespaceCache.get(text);\n if (result === void 0) {\n result = text.replace(/[\\u200b\\u00ad]/g, "").trim().replace(/\\s+/g, " ");\n normalizedWhitespaceCache == null ? void 0 : normalizedWhitespaceCache.set(text, result);\n }\n return result;\n}\nfunction normalizeEscapedRegexQuotes(source) {\n return source.replace(/(^|[^\\\\])(\\\\\\\\)*\\\\([\'"`])/g, "$1$2$3");\n}\nfunction escapeRegexForSelector(re) {\n if (re.unicode || re.unicodeSets)\n return String(re);\n return String(re).replace(/(^|[^\\\\])(\\\\\\\\)*(["\'`])/g, "$1$2\\\\$3").replace(/>>/g, "\\\\>\\\\>");\n}\nfunction escapeForTextSelector(text, exact) {\n if (typeof text !== "string")\n return escapeRegexForSelector(text);\n return `${JSON.stringify(text)}${exact ? "s" : "i"}`;\n}\nfunction escapeForAttributeSelector(value, exact) {\n if (typeof value !== "string")\n return escapeRegexForSelector(value);\n return `"${value.replace(/\\\\/g, "\\\\\\\\").replace(/["]/g, \'\\\\"\')}"${exact ? "s" : "i"}`;\n}\nfunction trimString(input, cap, suffix = "") {\n if (input.length <= cap)\n return input;\n const chars = [...input];\n if (chars.length > cap)\n return chars.slice(0, cap - suffix.length).join("") + suffix;\n return chars.join("");\n}\nfunction trimStringWithEllipsis(input, cap) {\n return trimString(input, cap, "\\u2026");\n}\nfunction escapeRegExp(s) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&");\n}\nfunction longestCommonSubstring(s1, s2) {\n const n = s1.length;\n const m = s2.length;\n let maxLen = 0;\n let endingIndex = 0;\n const dp = Array(n + 1).fill(null).map(() => Array(m + 1).fill(0));\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (s1[i - 1] === s2[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n if (dp[i][j] > maxLen) {\n maxLen = dp[i][j];\n endingIndex = i;\n }\n }\n }\n }\n return s1.slice(endingIndex - maxLen, endingIndex);\n}\n\n// packages/playwright-core/src/utils/isomorphic/locatorGenerators.ts\nfunction asLocator(lang, selector, isFrameLocator = false) {\n return asLocators(lang, selector, isFrameLocator, 1)[0];\n}\nfunction asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) {\n try {\n return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize);\n } catch (e) {\n return [selector];\n }\n}\nfunction innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) {\n const parts = [...parsed.parts];\n const tokens = [];\n let nextBase = isFrameLocator ? "frame-locator" : "page";\n for (let index = 0; index < parts.length; index++) {\n const part = parts[index];\n const base = nextBase;\n nextBase = "locator";\n if (part.name === "internal:describe")\n continue;\n if (part.name === "nth") {\n if (part.body === "0")\n tokens.push([factory.generateLocator(base, "first", ""), factory.generateLocator(base, "nth", "0")]);\n else if (part.body === "-1")\n tokens.push([factory.generateLocator(base, "last", ""), factory.generateLocator(base, "nth", "-1")]);\n else\n tokens.push([factory.generateLocator(base, "nth", part.body)]);\n continue;\n }\n if (part.name === "visible") {\n tokens.push([factory.generateLocator(base, "visible", part.body), factory.generateLocator(base, "default", `visible=${part.body}`)]);\n continue;\n }\n if (part.name === "internal:text") {\n const { exact, text } = detectExact(part.body);\n tokens.push([factory.generateLocator(base, "text", text, { exact })]);\n continue;\n }\n if (part.name === "internal:has-text") {\n const { exact, text } = detectExact(part.body);\n if (!exact) {\n tokens.push([factory.generateLocator(base, "has-text", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:has-not-text") {\n const { exact, text } = detectExact(part.body);\n if (!exact) {\n tokens.push([factory.generateLocator(base, "has-not-text", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:has") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "has", inner)));\n continue;\n }\n if (part.name === "internal:has-not") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "hasNot", inner)));\n continue;\n }\n if (part.name === "internal:and") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "and", inner)));\n continue;\n }\n if (part.name === "internal:or") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "or", inner)));\n continue;\n }\n if (part.name === "internal:chain") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "chain", inner)));\n continue;\n }\n if (part.name === "internal:label") {\n const { exact, text } = detectExact(part.body);\n tokens.push([factory.generateLocator(base, "label", text, { exact })]);\n continue;\n }\n if (part.name === "internal:role") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const options = { attrs: [] };\n for (const attr of attrSelector.attributes) {\n if (attr.name === "name") {\n options.exact = attr.caseSensitive;\n options.name = attr.value;\n } else {\n if (attr.name === "level" && typeof attr.value === "string")\n attr.value = +attr.value;\n options.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value });\n }\n }\n tokens.push([factory.generateLocator(base, "role", attrSelector.name, options)]);\n continue;\n }\n if (part.name === "internal:testid") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const { value } = attrSelector.attributes[0];\n tokens.push([factory.generateLocator(base, "test-id", value)]);\n continue;\n }\n if (part.name === "internal:attr") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const { name, value, caseSensitive } = attrSelector.attributes[0];\n const text = value;\n const exact = !!caseSensitive;\n if (name === "placeholder") {\n tokens.push([factory.generateLocator(base, "placeholder", text, { exact })]);\n continue;\n }\n if (name === "alt") {\n tokens.push([factory.generateLocator(base, "alt", text, { exact })]);\n continue;\n }\n if (name === "title") {\n tokens.push([factory.generateLocator(base, "title", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:control" && part.body === "enter-frame") {\n const lastTokens = tokens[tokens.length - 1];\n const lastPart = parts[index - 1];\n const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base, "frame", "")]));\n if (["xpath", "css"].includes(lastPart.name)) {\n transformed.push(\n factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] })),\n factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] }, true))\n );\n }\n lastTokens.splice(0, lastTokens.length, ...transformed);\n nextBase = "frame-locator";\n continue;\n }\n const nextPart = parts[index + 1];\n const selectorPart = stringifySelector({ parts: [part] });\n const locatorPart = factory.generateLocator(base, "default", selectorPart);\n if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) {\n const { exact, text } = detectExact(nextPart.body);\n if (!exact) {\n const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text, { exact });\n const options = {};\n if (nextPart.name === "internal:has-text")\n options.hasText = text;\n else\n options.hasNotText = text;\n const combinedPart = factory.generateLocator(base, "default", selectorPart, options);\n tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]);\n index++;\n continue;\n }\n }\n let locatorPartWithEngine;\n if (["xpath", "css"].includes(part.name)) {\n const selectorPart2 = stringifySelector(\n { parts: [part] },\n /* forceEngineName */\n true\n );\n locatorPartWithEngine = factory.generateLocator(base, "default", selectorPart2);\n }\n tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean));\n }\n return combineTokens(factory, tokens, maxOutputSize);\n}\nfunction combineTokens(factory, tokens, maxOutputSize) {\n const currentTokens = tokens.map(() => "");\n const result = [];\n const visit = (index) => {\n if (index === tokens.length) {\n result.push(factory.chainLocators(currentTokens));\n return result.length < maxOutputSize;\n }\n for (const taken of tokens[index]) {\n currentTokens[index] = taken;\n if (!visit(index + 1))\n return false;\n }\n return true;\n };\n visit(0);\n return result;\n}\nfunction detectExact(text) {\n let exact = false;\n const match = text.match(/^\\/(.*)\\/([igm]*)$/);\n if (match)\n return { text: new RegExp(match[1], match[2]) };\n if (text.endsWith(\'"\')) {\n text = JSON.parse(text);\n exact = true;\n } else if (text.endsWith(\'"s\')) {\n text = JSON.parse(text.substring(0, text.length - 1));\n exact = true;\n } else if (text.endsWith(\'"i\')) {\n text = JSON.parse(text.substring(0, text.length - 1));\n exact = false;\n }\n return { exact, text };\n}\nvar JavaScriptLocatorFactory = class {\n constructor(preferredQuote) {\n this.preferredQuote = preferredQuote;\n }\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options.hasText)} })`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options.hasNotText)} })`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frameLocator(${this.quote(body)})`;\n case "frame":\n return `contentFrame()`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first()`;\n case "last":\n return `last()`;\n case "visible":\n return `filter({ visible: ${body === "true" ? "true" : "false"} })`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name)) {\n attrs.push(`name: ${this.regexToSourceString(options.name)}`);\n } else if (typeof options.name === "string") {\n attrs.push(`name: ${this.quote(options.name)}`);\n if (options.exact)\n attrs.push(`exact: true`);\n }\n for (const { name, value } of options.attrs)\n attrs.push(`${name}: ${typeof value === "string" ? this.quote(value) : value}`);\n const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : "";\n return `getByRole(${this.quote(body)}${attrString})`;\n case "has-text":\n return `filter({ hasText: ${this.toHasText(body)} })`;\n case "has-not-text":\n return `filter({ hasNotText: ${this.toHasText(body)} })`;\n case "has":\n return `filter({ has: ${body} })`;\n case "hasNot":\n return `filter({ hasNot: ${body} })`;\n case "and":\n return `and(${body})`;\n case "or":\n return `or(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `getByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("getByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("getByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("getByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("getByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact("getByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToSourceString(re) {\n return normalizeEscapedRegexQuotes(String(re));\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToSourceString(body)})`;\n return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToSourceString(body);\n return this.quote(body);\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToSourceString(value);\n return this.quote(value);\n }\n quote(text) {\n var _a;\n return escapeWithQuotes(text, (_a = this.preferredQuote) != null ? _a : "\'");\n }\n};\nvar PythonLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, has_text=${this.toHasText(options.hasText)})`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options.hasNotText)})`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frame_locator(${this.quote(body)})`;\n case "frame":\n return `content_frame`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first`;\n case "last":\n return `last`;\n case "visible":\n return `filter(visible=${body === "true" ? "True" : "False"})`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name)) {\n attrs.push(`name=${this.regexToString(options.name)}`);\n } else if (typeof options.name === "string") {\n attrs.push(`name=${this.quote(options.name)}`);\n if (options.exact)\n attrs.push(`exact=True`);\n }\n for (const { name, value } of options.attrs) {\n let valueString = typeof value === "string" ? this.quote(value) : value;\n if (typeof value === "boolean")\n valueString = value ? "True" : "False";\n attrs.push(`${toSnakeCase(name)}=${valueString}`);\n }\n const attrString = attrs.length ? `, ${attrs.join(", ")}` : "";\n return `get_by_role(${this.quote(body)}${attrString})`;\n case "has-text":\n return `filter(has_text=${this.toHasText(body)})`;\n case "has-not-text":\n return `filter(has_not_text=${this.toHasText(body)})`;\n case "has":\n return `filter(has=${body})`;\n case "hasNot":\n return `filter(has_not=${body})`;\n case "and":\n return `and_(${body})`;\n case "or":\n return `or_(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `get_by_test_id(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("get_by_text", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("get_by_alt_text", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("get_by_placeholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("get_by_label", body, !!options.exact);\n case "title":\n return this.toCallWithExact("get_by_title", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : "";\n return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\\\\//, "/").replace(/"/g, \'\\\\"\')}"${suffix})`;\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, exact=True)`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToString(body);\n return `${this.quote(body)}`;\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar JavaLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n let clazz;\n switch (base) {\n case "page":\n clazz = "Page";\n break;\n case "frame-locator":\n clazz = "FrameLocator";\n break;\n case "locator":\n clazz = "Locator";\n break;\n }\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options.hasText)}))`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options.hasNotText)}))`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frameLocator(${this.quote(body)})`;\n case "frame":\n return `contentFrame()`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first()`;\n case "last":\n return `last()`;\n case "visible":\n return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name)) {\n attrs.push(`.setName(${this.regexToString(options.name)})`);\n } else if (typeof options.name === "string") {\n attrs.push(`.setName(${this.quote(options.name)})`);\n if (options.exact)\n attrs.push(`.setExact(true)`);\n }\n for (const { name, value } of options.attrs)\n attrs.push(`.set${toTitleCase(name)}(${typeof value === "string" ? this.quote(value) : value})`);\n const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : "";\n return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`;\n case "has-text":\n return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`;\n case "has-not-text":\n return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`;\n case "has":\n return `filter(new ${clazz}.FilterOptions().setHas(${body}))`;\n case "hasNot":\n return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`;\n case "and":\n return `and(${body})`;\n case "or":\n return `or(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `getByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact(clazz, "getByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact(clazz, "getByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact(clazz, "getByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact(clazz, "getByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : "";\n return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;\n }\n toCallWithExact(clazz, method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToString(body);\n return this.quote(body);\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar CSharpLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `Locator(${this.quote(body)}, new() { ${this.toHasText(options.hasText)} })`;\n if (options.hasNotText !== void 0)\n return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options.hasNotText)} })`;\n return `Locator(${this.quote(body)})`;\n case "frame-locator":\n return `FrameLocator(${this.quote(body)})`;\n case "frame":\n return `ContentFrame`;\n case "nth":\n return `Nth(${body})`;\n case "first":\n return `First`;\n case "last":\n return `Last`;\n case "visible":\n return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name)) {\n attrs.push(`NameRegex = ${this.regexToString(options.name)}`);\n } else if (typeof options.name === "string") {\n attrs.push(`Name = ${this.quote(options.name)}`);\n if (options.exact)\n attrs.push(`Exact = true`);\n }\n for (const { name, value } of options.attrs)\n attrs.push(`${toTitleCase(name)} = ${typeof value === "string" ? this.quote(value) : value}`);\n const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : "";\n return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`;\n case "has-text":\n return `Filter(new() { ${this.toHasText(body)} })`;\n case "has-not-text":\n return `Filter(new() { ${this.toHasNotText(body)} })`;\n case "has":\n return `Filter(new() { Has = ${body} })`;\n case "hasNot":\n return `Filter(new() { HasNot = ${body} })`;\n case "and":\n return `And(${body})`;\n case "or":\n return `Or(${body})`;\n case "chain":\n return `Locator(${body})`;\n case "test-id":\n return `GetByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("GetByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("GetByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("GetByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("GetByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact("GetByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : "";\n return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, new() { Exact = true })`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return `HasTextRegex = ${this.regexToString(body)}`;\n return `HasText = ${this.quote(body)}`;\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n toHasNotText(body) {\n if (isRegExp(body))\n return `HasNotTextRegex = ${this.regexToString(body)}`;\n return `HasNotText = ${this.quote(body)}`;\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar JsonlLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n return JSON.stringify({\n kind,\n body,\n options\n });\n }\n chainLocators(locators) {\n const objects = locators.map((l) => JSON.parse(l));\n for (let i = 0; i < objects.length - 1; ++i)\n objects[i].next = objects[i + 1];\n return JSON.stringify(objects[0]);\n }\n};\nvar generators = {\n javascript: JavaScriptLocatorFactory,\n python: PythonLocatorFactory,\n java: JavaLocatorFactory,\n csharp: CSharpLocatorFactory,\n jsonl: JsonlLocatorFactory\n};\nfunction isRegExp(obj) {\n return obj instanceof RegExp;\n}\n\n// packages/injected/src/domUtils.ts\nvar globalOptions = {};\nfunction setGlobalOptions(options) {\n globalOptions = options;\n}\nfunction getGlobalOptions() {\n return globalOptions;\n}\nfunction isInsideScope(scope, element) {\n while (element) {\n if (scope.contains(element))\n return true;\n element = enclosingShadowHost(element);\n }\n return false;\n}\nfunction parentElementOrShadowHost(element) {\n if (element.parentElement)\n return element.parentElement;\n if (!element.parentNode)\n return;\n if (element.parentNode.nodeType === 11 && element.parentNode.host)\n return element.parentNode.host;\n}\nfunction enclosingShadowRootOrDocument(element) {\n let node = element;\n while (node.parentNode)\n node = node.parentNode;\n if (node.nodeType === 11 || node.nodeType === 9)\n return node;\n}\nfunction enclosingShadowHost(element) {\n while (element.parentElement)\n element = element.parentElement;\n return parentElementOrShadowHost(element);\n}\nfunction closestCrossShadow(element, css, scope) {\n while (element) {\n const closest = element.closest(css);\n if (scope && closest !== scope && (closest == null ? void 0 : closest.contains(scope)))\n return;\n if (closest)\n return closest;\n element = enclosingShadowHost(element);\n }\n}\nfunction getElementComputedStyle(element, pseudo) {\n return element.ownerDocument && element.ownerDocument.defaultView ? element.ownerDocument.defaultView.getComputedStyle(element, pseudo) : void 0;\n}\nfunction isElementStyleVisibilityVisible(element, style) {\n style = style != null ? style : getElementComputedStyle(element);\n if (!style)\n return true;\n if (Element.prototype.checkVisibility && globalOptions.browserNameForWorkarounds !== "webkit") {\n if (!element.checkVisibility())\n return false;\n } else {\n const detailsOrSummary = element.closest("details,summary");\n if (detailsOrSummary !== element && (detailsOrSummary == null ? void 0 : detailsOrSummary.nodeName) === "DETAILS" && !detailsOrSummary.open)\n return false;\n }\n if (style.visibility !== "visible")\n return false;\n return true;\n}\nfunction box(element) {\n const style = getElementComputedStyle(element);\n if (!style)\n return { visible: true };\n if (style.display === "contents") {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 && isElementVisible(child))\n return { visible: true, style };\n if (child.nodeType === 3 && isVisibleTextNode(child))\n return { visible: true, style };\n }\n return { visible: false, style };\n }\n if (!isElementStyleVisibilityVisible(element, style))\n return { style, visible: false };\n const rect = element.getBoundingClientRect();\n return { rect, style, visible: rect.width > 0 && rect.height > 0 };\n}\nfunction isElementVisible(element) {\n return box(element).visible;\n}\nfunction isVisibleTextNode(node) {\n const range = node.ownerDocument.createRange();\n range.selectNode(node);\n const rect = range.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\nfunction elementSafeTagName(element) {\n if (element instanceof HTMLFormElement)\n return "FORM";\n return element.tagName.toUpperCase();\n}\n\n// packages/injected/src/roleUtils.ts\nfunction hasExplicitAccessibleName(e) {\n return e.hasAttribute("aria-label") || e.hasAttribute("aria-labelledby");\n}\nvar kAncestorPreventingLandmark = "article:not([role]), aside:not([role]), main:not([role]), nav:not([role]), section:not([role]), [role=article], [role=complementary], [role=main], [role=navigation], [role=region]";\nvar kGlobalAriaAttributes = [\n ["aria-atomic", void 0],\n ["aria-busy", void 0],\n ["aria-controls", void 0],\n ["aria-current", void 0],\n ["aria-describedby", void 0],\n ["aria-details", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-disabled\', undefined],\n ["aria-dropeffect", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-errormessage\', undefined],\n ["aria-flowto", void 0],\n ["aria-grabbed", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-haspopup\', undefined],\n ["aria-hidden", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-invalid\', undefined],\n ["aria-keyshortcuts", void 0],\n ["aria-label", ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]],\n ["aria-labelledby", ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]],\n ["aria-live", void 0],\n ["aria-owns", void 0],\n ["aria-relevant", void 0],\n ["aria-roledescription", ["generic"]]\n];\nfunction hasGlobalAriaAttribute(element, forRole) {\n return kGlobalAriaAttributes.some(([attr, prohibited]) => {\n return !(prohibited == null ? void 0 : prohibited.includes(forRole || "")) && element.hasAttribute(attr);\n });\n}\nfunction hasTabIndex(element) {\n return !Number.isNaN(Number(String(element.getAttribute("tabindex"))));\n}\nfunction isFocusable(element) {\n return !isNativelyDisabled(element) && (isNativelyFocusable(element) || hasTabIndex(element));\n}\nfunction isNativelyFocusable(element) {\n const tagName = elementSafeTagName(element);\n if (["BUTTON", "DETAILS", "SELECT", "TEXTAREA"].includes(tagName))\n return true;\n if (tagName === "A" || tagName === "AREA")\n return element.hasAttribute("href");\n if (tagName === "INPUT")\n return !element.hidden;\n return false;\n}\nvar kImplicitRoleByTagName = {\n "A": (e) => {\n return e.hasAttribute("href") ? "link" : null;\n },\n "AREA": (e) => {\n return e.hasAttribute("href") ? "link" : null;\n },\n "ARTICLE": () => "article",\n "ASIDE": () => "complementary",\n "BLOCKQUOTE": () => "blockquote",\n "BUTTON": () => "button",\n "CAPTION": () => "caption",\n "CODE": () => "code",\n "DATALIST": () => "listbox",\n "DD": () => "definition",\n "DEL": () => "deletion",\n "DETAILS": () => "group",\n "DFN": () => "term",\n "DIALOG": () => "dialog",\n "DT": () => "term",\n "EM": () => "emphasis",\n "FIELDSET": () => "group",\n "FIGURE": () => "figure",\n "FOOTER": (e) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : "contentinfo",\n "FORM": (e) => hasExplicitAccessibleName(e) ? "form" : null,\n "H1": () => "heading",\n "H2": () => "heading",\n "H3": () => "heading",\n "H4": () => "heading",\n "H5": () => "heading",\n "H6": () => "heading",\n "HEADER": (e) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : "banner",\n "HR": () => "separator",\n "HTML": () => "document",\n "IMG": (e) => e.getAttribute("alt") === "" && !e.getAttribute("title") && !hasGlobalAriaAttribute(e) && !hasTabIndex(e) ? "presentation" : "img",\n "INPUT": (e) => {\n const type = e.type.toLowerCase();\n if (type === "search")\n return e.hasAttribute("list") ? "combobox" : "searchbox";\n if (["email", "tel", "text", "url", ""].includes(type)) {\n const list = getIdRefs(e, e.getAttribute("list"))[0];\n return list && elementSafeTagName(list) === "DATALIST" ? "combobox" : "textbox";\n }\n if (type === "hidden")\n return null;\n if (type === "file" && !getGlobalOptions().inputFileRoleTextbox)\n return "button";\n return inputTypeToRole[type] || "textbox";\n },\n "INS": () => "insertion",\n "LI": () => "listitem",\n "MAIN": () => "main",\n "MARK": () => "mark",\n "MATH": () => "math",\n "MENU": () => "list",\n "METER": () => "meter",\n "NAV": () => "navigation",\n "OL": () => "list",\n "OPTGROUP": () => "group",\n "OPTION": () => "option",\n "OUTPUT": () => "status",\n "P": () => "paragraph",\n "PROGRESS": () => "progressbar",\n "SECTION": (e) => hasExplicitAccessibleName(e) ? "region" : null,\n "SELECT": (e) => e.hasAttribute("multiple") || e.size > 1 ? "listbox" : "combobox",\n "STRONG": () => "strong",\n "SUB": () => "subscript",\n "SUP": () => "superscript",\n // For we default to Chrome behavior:\n // - Chrome reports \'img\'.\n // - Firefox reports \'diagram\' that is not in official ARIA spec yet.\n // - Safari reports \'no role\', but still computes accessible name.\n "SVG": () => "img",\n "TABLE": () => "table",\n "TBODY": () => "rowgroup",\n "TD": (e) => {\n const table = closestCrossShadow(e, "table");\n const role = table ? getExplicitAriaRole(table) : "";\n return role === "grid" || role === "treegrid" ? "gridcell" : "cell";\n },\n "TEXTAREA": () => "textbox",\n "TFOOT": () => "rowgroup",\n "TH": (e) => {\n if (e.getAttribute("scope") === "col")\n return "columnheader";\n if (e.getAttribute("scope") === "row")\n return "rowheader";\n const table = closestCrossShadow(e, "table");\n const role = table ? getExplicitAriaRole(table) : "";\n return role === "grid" || role === "treegrid" ? "gridcell" : "cell";\n },\n "THEAD": () => "rowgroup",\n "TIME": () => "time",\n "TR": () => "row",\n "UL": () => "list"\n};\nvar kPresentationInheritanceParents = {\n "DD": ["DL", "DIV"],\n "DIV": ["DL"],\n "DT": ["DL", "DIV"],\n "LI": ["OL", "UL"],\n "TBODY": ["TABLE"],\n "TD": ["TR"],\n "TFOOT": ["TABLE"],\n "TH": ["TR"],\n "THEAD": ["TABLE"],\n "TR": ["THEAD", "TBODY", "TFOOT", "TABLE"]\n};\nfunction getImplicitAriaRole(element) {\n var _a;\n const implicitRole = ((_a = kImplicitRoleByTagName[elementSafeTagName(element)]) == null ? void 0 : _a.call(kImplicitRoleByTagName, element)) || "";\n if (!implicitRole)\n return null;\n let ancestor = element;\n while (ancestor) {\n const parent = parentElementOrShadowHost(ancestor);\n const parents = kPresentationInheritanceParents[elementSafeTagName(ancestor)];\n if (!parents || !parent || !parents.includes(elementSafeTagName(parent)))\n break;\n const parentExplicitRole = getExplicitAriaRole(parent);\n if ((parentExplicitRole === "none" || parentExplicitRole === "presentation") && !hasPresentationConflictResolution(parent, parentExplicitRole))\n return parentExplicitRole;\n ancestor = parent;\n }\n return implicitRole;\n}\nvar validRoles = [\n "alert",\n "alertdialog",\n "application",\n "article",\n "banner",\n "blockquote",\n "button",\n "caption",\n "cell",\n "checkbox",\n "code",\n "columnheader",\n "combobox",\n "complementary",\n "contentinfo",\n "definition",\n "deletion",\n "dialog",\n "directory",\n "document",\n "emphasis",\n "feed",\n "figure",\n "form",\n "generic",\n "grid",\n "gridcell",\n "group",\n "heading",\n "img",\n "insertion",\n "link",\n "list",\n "listbox",\n "listitem",\n "log",\n "main",\n "mark",\n "marquee",\n "math",\n "meter",\n "menu",\n "menubar",\n "menuitem",\n "menuitemcheckbox",\n "menuitemradio",\n "navigation",\n "none",\n "note",\n "option",\n "paragraph",\n "presentation",\n "progressbar",\n "radio",\n "radiogroup",\n "region",\n "row",\n "rowgroup",\n "rowheader",\n "scrollbar",\n "search",\n "searchbox",\n "separator",\n "slider",\n "spinbutton",\n "status",\n "strong",\n "subscript",\n "superscript",\n "switch",\n "tab",\n "table",\n "tablist",\n "tabpanel",\n "term",\n "textbox",\n "time",\n "timer",\n "toolbar",\n "tooltip",\n "tree",\n "treegrid",\n "treeitem"\n];\nfunction getExplicitAriaRole(element) {\n const roles = (element.getAttribute("role") || "").split(" ").map((role) => role.trim());\n return roles.find((role) => validRoles.includes(role)) || null;\n}\nfunction hasPresentationConflictResolution(element, role) {\n return hasGlobalAriaAttribute(element, role) || isFocusable(element);\n}\nfunction getAriaRole(element) {\n const explicitRole = getExplicitAriaRole(element);\n if (!explicitRole)\n return getImplicitAriaRole(element);\n if (explicitRole === "none" || explicitRole === "presentation") {\n const implicitRole = getImplicitAriaRole(element);\n if (hasPresentationConflictResolution(element, implicitRole))\n return implicitRole;\n }\n return explicitRole;\n}\nfunction getAriaBoolean(attr) {\n return attr === null ? void 0 : attr.toLowerCase() === "true";\n}\nfunction isElementIgnoredForAria(element) {\n return ["STYLE", "SCRIPT", "NOSCRIPT", "TEMPLATE"].includes(elementSafeTagName(element));\n}\nfunction isElementHiddenForAria(element) {\n if (isElementIgnoredForAria(element))\n return true;\n const style = getElementComputedStyle(element);\n const isSlot = element.nodeName === "SLOT";\n if ((style == null ? void 0 : style.display) === "contents" && !isSlot) {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 && !isElementHiddenForAria(child))\n return false;\n if (child.nodeType === 3 && isVisibleTextNode(child))\n return false;\n }\n return true;\n }\n const isOptionInsideSelect = element.nodeName === "OPTION" && !!element.closest("select");\n if (!isOptionInsideSelect && !isSlot && !isElementStyleVisibilityVisible(element, style))\n return true;\n return belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element);\n}\nfunction belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element) {\n let hidden = cacheIsHidden == null ? void 0 : cacheIsHidden.get(element);\n if (hidden === void 0) {\n hidden = false;\n if (element.parentElement && element.parentElement.shadowRoot && !element.assignedSlot)\n hidden = true;\n if (!hidden) {\n const style = getElementComputedStyle(element);\n hidden = !style || style.display === "none" || getAriaBoolean(element.getAttribute("aria-hidden")) === true;\n }\n if (!hidden) {\n const parent = parentElementOrShadowHost(element);\n if (parent)\n hidden = belongsToDisplayNoneOrAriaHiddenOrNonSlotted(parent);\n }\n cacheIsHidden == null ? void 0 : cacheIsHidden.set(element, hidden);\n }\n return hidden;\n}\nfunction getIdRefs(element, ref) {\n if (!ref)\n return [];\n const root = enclosingShadowRootOrDocument(element);\n if (!root)\n return [];\n try {\n const ids = ref.split(" ").filter((id) => !!id);\n const result = [];\n for (const id of ids) {\n const firstElement = root.querySelector("#" + CSS.escape(id));\n if (firstElement && !result.includes(firstElement))\n result.push(firstElement);\n }\n return result;\n } catch (e) {\n return [];\n }\n}\nfunction trimFlatString(s) {\n return s.trim();\n}\nfunction asFlatString(s) {\n return s.split("\\xA0").map((chunk) => chunk.replace(/\\r\\n/g, "\\n").replace(/[\\u200b\\u00ad]/g, "").replace(/\\s\\s*/g, " ")).join("\\xA0").trim();\n}\nfunction queryInAriaOwned(element, selector) {\n const result = [...element.querySelectorAll(selector)];\n for (const owned of getIdRefs(element, element.getAttribute("aria-owns"))) {\n if (owned.matches(selector))\n result.push(owned);\n result.push(...owned.querySelectorAll(selector));\n }\n return result;\n}\nfunction getCSSContent(element, pseudo) {\n const cache = pseudo === "::before" ? cachePseudoContentBefore : pseudo === "::after" ? cachePseudoContentAfter : cachePseudoContent;\n if (cache == null ? void 0 : cache.has(element))\n return cache == null ? void 0 : cache.get(element);\n const style = getElementComputedStyle(element, pseudo);\n let content;\n if (style && style.display !== "none" && style.visibility !== "hidden") {\n content = parseCSSContentPropertyAsString(element, style.content, !!pseudo);\n }\n if (pseudo && content !== void 0) {\n const display = (style == null ? void 0 : style.display) || "inline";\n if (display !== "inline")\n content = " " + content + " ";\n }\n if (cache)\n cache.set(element, content);\n return content;\n}\nfunction parseCSSContentPropertyAsString(element, content, isPseudo) {\n if (!content || content === "none" || content === "normal") {\n return;\n }\n try {\n let tokens = tokenize(content).filter((token) => !(token instanceof WhitespaceToken));\n const delimIndex = tokens.findIndex((token) => token instanceof DelimToken && token.value === "/");\n if (delimIndex !== -1) {\n tokens = tokens.slice(delimIndex + 1);\n } else if (!isPseudo) {\n return;\n }\n const accumulated = [];\n let index = 0;\n while (index < tokens.length) {\n if (tokens[index] instanceof StringToken) {\n accumulated.push(tokens[index].value);\n index++;\n } else if (index + 2 < tokens.length && tokens[index] instanceof FunctionToken && tokens[index].value === "attr" && tokens[index + 1] instanceof IdentToken && tokens[index + 2] instanceof CloseParenToken) {\n const attrName = tokens[index + 1].value;\n accumulated.push(element.getAttribute(attrName) || "");\n index += 3;\n } else {\n return;\n }\n }\n return accumulated.join("");\n } catch {\n }\n}\nfunction getAriaLabelledByElements(element) {\n const ref = element.getAttribute("aria-labelledby");\n if (ref === null)\n return null;\n const refs = getIdRefs(element, ref);\n return refs.length ? refs : null;\n}\nfunction allowsNameFromContent(role, targetDescendant) {\n const alwaysAllowsNameFromContent = ["button", "cell", "checkbox", "columnheader", "gridcell", "heading", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "row", "rowheader", "switch", "tab", "tooltip", "treeitem"].includes(role);\n const descendantAllowsNameFromContent = targetDescendant && ["", "caption", "code", "contentinfo", "definition", "deletion", "emphasis", "insertion", "list", "listitem", "mark", "none", "paragraph", "presentation", "region", "row", "rowgroup", "section", "strong", "subscript", "superscript", "table", "term", "time"].includes(role);\n return alwaysAllowsNameFromContent || descendantAllowsNameFromContent;\n}\nfunction getElementAccessibleName(element, includeHidden) {\n const cache = includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName;\n let accessibleName = cache == null ? void 0 : cache.get(element);\n if (accessibleName === void 0) {\n accessibleName = "";\n const elementProhibitsNaming = ["caption", "code", "definition", "deletion", "emphasis", "generic", "insertion", "mark", "paragraph", "presentation", "strong", "subscript", "suggestion", "superscript", "term", "time"].includes(getAriaRole(element) || "");\n if (!elementProhibitsNaming) {\n accessibleName = asFlatString(getTextAlternativeInternal(element, {\n includeHidden,\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInTargetElement: "self"\n }));\n }\n cache == null ? void 0 : cache.set(element, accessibleName);\n }\n return accessibleName;\n}\nfunction getElementAccessibleDescription(element, includeHidden) {\n const cache = includeHidden ? cacheAccessibleDescriptionHidden : cacheAccessibleDescription;\n let accessibleDescription = cache == null ? void 0 : cache.get(element);\n if (accessibleDescription === void 0) {\n accessibleDescription = "";\n if (element.hasAttribute("aria-describedby")) {\n const describedBy = getIdRefs(element, element.getAttribute("aria-describedby"));\n accessibleDescription = asFlatString(describedBy.map((ref) => getTextAlternativeInternal(ref, {\n includeHidden,\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInDescribedBy: { element: ref, hidden: isElementHiddenForAria(ref) }\n })).join(" "));\n } else if (element.hasAttribute("aria-description")) {\n accessibleDescription = asFlatString(element.getAttribute("aria-description") || "");\n } else {\n accessibleDescription = asFlatString(element.getAttribute("title") || "");\n }\n cache == null ? void 0 : cache.set(element, accessibleDescription);\n }\n return accessibleDescription;\n}\nfunction getAriaInvalid(element) {\n const ariaInvalid = element.getAttribute("aria-invalid");\n if (!ariaInvalid || ariaInvalid.trim() === "" || ariaInvalid.toLocaleLowerCase() === "false")\n return "false";\n if (ariaInvalid === "true" || ariaInvalid === "grammar" || ariaInvalid === "spelling")\n return ariaInvalid;\n return "true";\n}\nfunction getValidityInvalid(element) {\n if ("validity" in element) {\n const validity = element.validity;\n return (validity == null ? void 0 : validity.valid) === false;\n }\n return false;\n}\nfunction getElementAccessibleErrorMessage(element) {\n const cache = cacheAccessibleErrorMessage;\n let accessibleErrorMessage = cacheAccessibleErrorMessage == null ? void 0 : cacheAccessibleErrorMessage.get(element);\n if (accessibleErrorMessage === void 0) {\n accessibleErrorMessage = "";\n const isAriaInvalid = getAriaInvalid(element) !== "false";\n const isValidityInvalid = getValidityInvalid(element);\n if (isAriaInvalid || isValidityInvalid) {\n const errorMessageId = element.getAttribute("aria-errormessage");\n const errorMessages = getIdRefs(element, errorMessageId);\n const parts = errorMessages.map((errorMessage) => asFlatString(\n getTextAlternativeInternal(errorMessage, {\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInDescribedBy: { element: errorMessage, hidden: isElementHiddenForAria(errorMessage) }\n })\n ));\n accessibleErrorMessage = parts.join(" ").trim();\n }\n cache == null ? void 0 : cache.set(element, accessibleErrorMessage);\n }\n return accessibleErrorMessage;\n}\nfunction getTextAlternativeInternal(element, options) {\n var _a, _b, _c, _d;\n if (options.visitedElements.has(element))\n return "";\n const childOptions = {\n ...options,\n embeddedInTargetElement: options.embeddedInTargetElement === "self" ? "descendant" : options.embeddedInTargetElement\n };\n if (!options.includeHidden) {\n const isEmbeddedInHiddenReferenceTraversal = !!((_a = options.embeddedInLabelledBy) == null ? void 0 : _a.hidden) || !!((_b = options.embeddedInDescribedBy) == null ? void 0 : _b.hidden) || !!((_c = options.embeddedInNativeTextAlternative) == null ? void 0 : _c.hidden) || !!((_d = options.embeddedInLabel) == null ? void 0 : _d.hidden);\n if (isElementIgnoredForAria(element) || !isEmbeddedInHiddenReferenceTraversal && isElementHiddenForAria(element)) {\n options.visitedElements.add(element);\n return "";\n }\n }\n const labelledBy = getAriaLabelledByElements(element);\n if (!options.embeddedInLabelledBy) {\n const accessibleName = (labelledBy || []).map((ref) => getTextAlternativeInternal(ref, {\n ...options,\n embeddedInLabelledBy: { element: ref, hidden: isElementHiddenForAria(ref) },\n embeddedInDescribedBy: void 0,\n embeddedInTargetElement: void 0,\n embeddedInLabel: void 0,\n embeddedInNativeTextAlternative: void 0\n })).join(" ");\n if (accessibleName)\n return accessibleName;\n }\n const role = getAriaRole(element) || "";\n const tagName = elementSafeTagName(element);\n if (!!options.embeddedInLabel || !!options.embeddedInLabelledBy || options.embeddedInTargetElement === "descendant") {\n const isOwnLabel = [...element.labels || []].includes(element);\n const isOwnLabelledBy = (labelledBy || []).includes(element);\n if (!isOwnLabel && !isOwnLabelledBy) {\n if (role === "textbox") {\n options.visitedElements.add(element);\n if (tagName === "INPUT" || tagName === "TEXTAREA")\n return element.value;\n return element.textContent || "";\n }\n if (["combobox", "listbox"].includes(role)) {\n options.visitedElements.add(element);\n let selectedOptions;\n if (tagName === "SELECT") {\n selectedOptions = [...element.selectedOptions];\n if (!selectedOptions.length && element.options.length)\n selectedOptions.push(element.options[0]);\n } else {\n const listbox = role === "combobox" ? queryInAriaOwned(element, "*").find((e) => getAriaRole(e) === "listbox") : element;\n selectedOptions = listbox ? queryInAriaOwned(listbox, \'[aria-selected="true"]\').filter((e) => getAriaRole(e) === "option") : [];\n }\n if (!selectedOptions.length && tagName === "INPUT") {\n return element.value;\n }\n return selectedOptions.map((option) => getTextAlternativeInternal(option, childOptions)).join(" ");\n }\n if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) {\n options.visitedElements.add(element);\n if (element.hasAttribute("aria-valuetext"))\n return element.getAttribute("aria-valuetext") || "";\n if (element.hasAttribute("aria-valuenow"))\n return element.getAttribute("aria-valuenow") || "";\n return element.getAttribute("value") || "";\n }\n if (["menu"].includes(role)) {\n options.visitedElements.add(element);\n return "";\n }\n }\n }\n const ariaLabel = element.getAttribute("aria-label") || "";\n if (trimFlatString(ariaLabel)) {\n options.visitedElements.add(element);\n return ariaLabel;\n }\n if (!["presentation", "none"].includes(role)) {\n if (tagName === "INPUT" && ["button", "submit", "reset"].includes(element.type)) {\n options.visitedElements.add(element);\n const value = element.value || "";\n if (trimFlatString(value))\n return value;\n if (element.type === "submit")\n return "Submit";\n if (element.type === "reset")\n return "Reset";\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (!getGlobalOptions().inputFileRoleTextbox && tagName === "INPUT" && element.type === "file") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return "Choose File";\n }\n if (tagName === "INPUT" && element.type === "image") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return alt;\n const title = element.getAttribute("title") || "";\n if (trimFlatString(title))\n return title;\n return "Submit";\n }\n if (!labelledBy && tagName === "BUTTON") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n }\n if (!labelledBy && tagName === "OUTPUT") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return element.getAttribute("title") || "";\n }\n if (!labelledBy && (tagName === "TEXTAREA" || tagName === "SELECT" || tagName === "INPUT")) {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const usePlaceholder = tagName === "INPUT" && ["text", "password", "search", "tel", "email", "url"].includes(element.type) || tagName === "TEXTAREA";\n const placeholder = element.getAttribute("placeholder") || "";\n const title = element.getAttribute("title") || "";\n if (!usePlaceholder || title)\n return title;\n return placeholder;\n }\n if (!labelledBy && tagName === "FIELDSET") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "LEGEND") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (!labelledBy && tagName === "FIGURE") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "FIGCAPTION") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "IMG") {\n options.visitedElements.add(element);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return alt;\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "TABLE") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "CAPTION") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const summary = element.getAttribute("summary") || "";\n if (summary)\n return summary;\n }\n if (tagName === "AREA") {\n options.visitedElements.add(element);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return alt;\n const title = element.getAttribute("title") || "";\n return title;\n }\n if (tagName === "SVG" || element.ownerSVGElement) {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "TITLE" && child.ownerSVGElement) {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInLabelledBy: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n }\n if (element.ownerSVGElement && tagName === "A") {\n const title = element.getAttribute("xlink:title") || "";\n if (trimFlatString(title)) {\n options.visitedElements.add(element);\n return title;\n }\n }\n }\n const shouldNameFromContentForSummary = tagName === "SUMMARY" && !["presentation", "none"].includes(role);\n if (allowsNameFromContent(role, options.embeddedInTargetElement === "descendant") || shouldNameFromContentForSummary || !!options.embeddedInLabelledBy || !!options.embeddedInDescribedBy || !!options.embeddedInLabel || !!options.embeddedInNativeTextAlternative) {\n options.visitedElements.add(element);\n const accessibleName = innerAccumulatedElementText(element, childOptions);\n const maybeTrimmedAccessibleName = options.embeddedInTargetElement === "self" ? trimFlatString(accessibleName) : accessibleName;\n if (maybeTrimmedAccessibleName)\n return accessibleName;\n }\n if (!["presentation", "none"].includes(role) || tagName === "IFRAME") {\n options.visitedElements.add(element);\n const title = element.getAttribute("title") || "";\n if (trimFlatString(title))\n return title;\n }\n options.visitedElements.add(element);\n return "";\n}\nfunction innerAccumulatedElementText(element, options) {\n const tokens = [];\n const visit = (node, skipSlotted) => {\n var _a;\n if (skipSlotted && node.assignedSlot)\n return;\n if (node.nodeType === 1) {\n const display = ((_a = getElementComputedStyle(node)) == null ? void 0 : _a.display) || "inline";\n let token = getTextAlternativeInternal(node, options);\n if (display !== "inline" || node.nodeName === "BR")\n token = " " + token + " ";\n tokens.push(token);\n } else if (node.nodeType === 3) {\n tokens.push(node.textContent || "");\n }\n };\n tokens.push(getCSSContent(element, "::before") || "");\n const content = getCSSContent(element);\n if (content !== void 0) {\n tokens.push(content);\n } else {\n const assignedNodes = element.nodeName === "SLOT" ? element.assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(child, false);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling)\n visit(child, true);\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(child, true);\n }\n for (const owned of getIdRefs(element, element.getAttribute("aria-owns")))\n visit(owned, true);\n }\n }\n tokens.push(getCSSContent(element, "::after") || "");\n return tokens.join("");\n}\nvar kAriaSelectedRoles = ["gridcell", "option", "row", "tab", "rowheader", "columnheader", "treeitem"];\nfunction getAriaSelected(element) {\n if (elementSafeTagName(element) === "OPTION")\n return element.selected;\n if (kAriaSelectedRoles.includes(getAriaRole(element) || ""))\n return getAriaBoolean(element.getAttribute("aria-selected")) === true;\n return false;\n}\nvar kAriaCheckedRoles = ["checkbox", "menuitemcheckbox", "option", "radio", "switch", "menuitemradio", "treeitem"];\nfunction getAriaChecked(element) {\n const result = getChecked(element, true);\n return result === "error" ? false : result;\n}\nfunction getCheckedAllowMixed(element) {\n return getChecked(element, true);\n}\nfunction getCheckedWithoutMixed(element) {\n const result = getChecked(element, false);\n return result;\n}\nfunction getChecked(element, allowMixed) {\n const tagName = elementSafeTagName(element);\n if (allowMixed && tagName === "INPUT" && element.indeterminate)\n return "mixed";\n if (tagName === "INPUT" && ["checkbox", "radio"].includes(element.type))\n return element.checked;\n if (kAriaCheckedRoles.includes(getAriaRole(element) || "")) {\n const checked = element.getAttribute("aria-checked");\n if (checked === "true")\n return true;\n if (allowMixed && checked === "mixed")\n return "mixed";\n return false;\n }\n return "error";\n}\nvar kAriaReadonlyRoles = ["checkbox", "combobox", "grid", "gridcell", "listbox", "radiogroup", "slider", "spinbutton", "textbox", "columnheader", "rowheader", "searchbox", "switch", "treegrid"];\nfunction getReadonly(element) {\n const tagName = elementSafeTagName(element);\n if (["INPUT", "TEXTAREA", "SELECT"].includes(tagName))\n return element.hasAttribute("readonly");\n if (kAriaReadonlyRoles.includes(getAriaRole(element) || ""))\n return element.getAttribute("aria-readonly") === "true";\n if (element.isContentEditable)\n return false;\n return "error";\n}\nvar kAriaPressedRoles = ["button"];\nfunction getAriaPressed(element) {\n if (kAriaPressedRoles.includes(getAriaRole(element) || "")) {\n const pressed = element.getAttribute("aria-pressed");\n if (pressed === "true")\n return true;\n if (pressed === "mixed")\n return "mixed";\n }\n return false;\n}\nvar kAriaExpandedRoles = ["application", "button", "checkbox", "combobox", "gridcell", "link", "listbox", "menuitem", "row", "rowheader", "tab", "treeitem", "columnheader", "menuitemcheckbox", "menuitemradio", "rowheader", "switch"];\nfunction getAriaExpanded(element) {\n if (elementSafeTagName(element) === "DETAILS")\n return element.open;\n if (kAriaExpandedRoles.includes(getAriaRole(element) || "")) {\n const expanded = element.getAttribute("aria-expanded");\n if (expanded === null)\n return void 0;\n if (expanded === "true")\n return true;\n return false;\n }\n return void 0;\n}\nvar kAriaLevelRoles = ["heading", "listitem", "row", "treeitem"];\nfunction getAriaLevel(element) {\n const native = { "H1": 1, "H2": 2, "H3": 3, "H4": 4, "H5": 5, "H6": 6 }[elementSafeTagName(element)];\n if (native)\n return native;\n if (kAriaLevelRoles.includes(getAriaRole(element) || "")) {\n const attr = element.getAttribute("aria-level");\n const value = attr === null ? Number.NaN : Number(attr);\n if (Number.isInteger(value) && value >= 1)\n return value;\n }\n return 0;\n}\nvar kAriaDisabledRoles = ["application", "button", "composite", "gridcell", "group", "input", "link", "menuitem", "scrollbar", "separator", "tab", "checkbox", "columnheader", "combobox", "grid", "listbox", "menu", "menubar", "menuitemcheckbox", "menuitemradio", "option", "radio", "radiogroup", "row", "rowheader", "searchbox", "select", "slider", "spinbutton", "switch", "tablist", "textbox", "toolbar", "tree", "treegrid", "treeitem"];\nfunction getAriaDisabled(element) {\n return isNativelyDisabled(element) || hasExplicitAriaDisabled(element);\n}\nfunction isNativelyDisabled(element) {\n const isNativeFormControl = ["BUTTON", "INPUT", "SELECT", "TEXTAREA", "OPTION", "OPTGROUP"].includes(element.tagName);\n return isNativeFormControl && (element.hasAttribute("disabled") || belongsToDisabledFieldSet(element));\n}\nfunction belongsToDisabledFieldSet(element) {\n const fieldSetElement = element == null ? void 0 : element.closest("FIELDSET[DISABLED]");\n if (!fieldSetElement)\n return false;\n const legendElement = fieldSetElement.querySelector(":scope > LEGEND");\n return !legendElement || !legendElement.contains(element);\n}\nfunction hasExplicitAriaDisabled(element, isAncestor = false) {\n if (!element)\n return false;\n if (isAncestor || kAriaDisabledRoles.includes(getAriaRole(element) || "")) {\n const attribute = (element.getAttribute("aria-disabled") || "").toLowerCase();\n if (attribute === "true")\n return true;\n if (attribute === "false")\n return false;\n return hasExplicitAriaDisabled(parentElementOrShadowHost(element), true);\n }\n return false;\n}\nfunction getAccessibleNameFromAssociatedLabels(labels, options) {\n return [...labels].map((label) => getTextAlternativeInternal(label, {\n ...options,\n embeddedInLabel: { element: label, hidden: isElementHiddenForAria(label) },\n embeddedInNativeTextAlternative: void 0,\n embeddedInLabelledBy: void 0,\n embeddedInDescribedBy: void 0,\n embeddedInTargetElement: void 0\n })).filter((accessibleName) => !!accessibleName).join(" ");\n}\nfunction receivesPointerEvents(element) {\n const cache = cachePointerEvents;\n let e = element;\n let result;\n const parents = [];\n for (; e; e = parentElementOrShadowHost(e)) {\n const cached = cache.get(e);\n if (cached !== void 0) {\n result = cached;\n break;\n }\n parents.push(e);\n const style = getElementComputedStyle(e);\n if (!style) {\n result = true;\n break;\n }\n const value = style.pointerEvents;\n if (value) {\n result = value !== "none";\n break;\n }\n }\n if (result === void 0)\n result = true;\n for (const parent of parents)\n cache.set(parent, result);\n return result;\n}\nvar cacheAccessibleName;\nvar cacheAccessibleNameHidden;\nvar cacheAccessibleDescription;\nvar cacheAccessibleDescriptionHidden;\nvar cacheAccessibleErrorMessage;\nvar cacheIsHidden;\nvar cachePseudoContent;\nvar cachePseudoContentBefore;\nvar cachePseudoContentAfter;\nvar cachePointerEvents;\nvar cachesCounter = 0;\nfunction beginAriaCaches() {\n ++cachesCounter;\n cacheAccessibleName != null ? cacheAccessibleName : cacheAccessibleName = /* @__PURE__ */ new Map();\n cacheAccessibleNameHidden != null ? cacheAccessibleNameHidden : cacheAccessibleNameHidden = /* @__PURE__ */ new Map();\n cacheAccessibleDescription != null ? cacheAccessibleDescription : cacheAccessibleDescription = /* @__PURE__ */ new Map();\n cacheAccessibleDescriptionHidden != null ? cacheAccessibleDescriptionHidden : cacheAccessibleDescriptionHidden = /* @__PURE__ */ new Map();\n cacheAccessibleErrorMessage != null ? cacheAccessibleErrorMessage : cacheAccessibleErrorMessage = /* @__PURE__ */ new Map();\n cacheIsHidden != null ? cacheIsHidden : cacheIsHidden = /* @__PURE__ */ new Map();\n cachePseudoContent != null ? cachePseudoContent : cachePseudoContent = /* @__PURE__ */ new Map();\n cachePseudoContentBefore != null ? cachePseudoContentBefore : cachePseudoContentBefore = /* @__PURE__ */ new Map();\n cachePseudoContentAfter != null ? cachePseudoContentAfter : cachePseudoContentAfter = /* @__PURE__ */ new Map();\n cachePointerEvents != null ? cachePointerEvents : cachePointerEvents = /* @__PURE__ */ new Map();\n}\nfunction endAriaCaches() {\n if (!--cachesCounter) {\n cacheAccessibleName = void 0;\n cacheAccessibleNameHidden = void 0;\n cacheAccessibleDescription = void 0;\n cacheAccessibleDescriptionHidden = void 0;\n cacheAccessibleErrorMessage = void 0;\n cacheIsHidden = void 0;\n cachePseudoContent = void 0;\n cachePseudoContentBefore = void 0;\n cachePseudoContentAfter = void 0;\n cachePointerEvents = void 0;\n }\n}\nvar inputTypeToRole = {\n "button": "button",\n "checkbox": "checkbox",\n "image": "button",\n "number": "spinbutton",\n "radio": "radio",\n "range": "slider",\n "reset": "button",\n "submit": "button"\n};\n\n// packages/injected/src/yaml.ts\nfunction yamlEscapeKeyIfNeeded(str) {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return `\'` + str.replace(/\'/g, `\'\'`) + `\'`;\n}\nfunction yamlEscapeValueIfNeeded(str) {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return \'"\' + str.replace(/[\\\\"\\x00-\\x1f\\x7f-\\x9f]/g, (c) => {\n switch (c) {\n case "\\\\":\n return "\\\\\\\\";\n case \'"\':\n return \'\\\\"\';\n case "\\b":\n return "\\\\b";\n case "\\f":\n return "\\\\f";\n case "\\n":\n return "\\\\n";\n case "\\r":\n return "\\\\r";\n case " ":\n return "\\\\t";\n default:\n const code = c.charCodeAt(0);\n return "\\\\x" + code.toString(16).padStart(2, "0");\n }\n }) + \'"\';\n}\nfunction yamlStringNeedsQuotes(str) {\n if (str.length === 0)\n return true;\n if (/^\\s|\\s$/.test(str))\n return true;\n if (/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/.test(str))\n return true;\n if (/^-/.test(str))\n return true;\n if (/[\\n:](\\s|$)/.test(str))\n return true;\n if (/\\s#/.test(str))\n return true;\n if (/[\\n\\r]/.test(str))\n return true;\n if (/^[&*\\],?!>|@"\'#%]/.test(str))\n return true;\n if (/[{}`]/.test(str))\n return true;\n if (/^\\[/.test(str))\n return true;\n if (!isNaN(Number(str)) || ["y", "n", "yes", "no", "true", "false", "on", "off", "null"].includes(str.toLowerCase()))\n return true;\n return false;\n}\n\n// packages/injected/src/ariaSnapshot.ts\nvar lastRef = 0;\nfunction generateAriaTree(rootElement, options) {\n const visited = /* @__PURE__ */ new Set();\n const snapshot = {\n root: { role: "fragment", name: "", children: [], element: rootElement, props: {}, box: box(rootElement), receivesPointerEvents: true },\n elements: /* @__PURE__ */ new Map()\n };\n const visit = (ariaNode, node) => {\n if (visited.has(node))\n return;\n visited.add(node);\n if (node.nodeType === Node.TEXT_NODE && node.nodeValue) {\n const text = node.nodeValue;\n if (ariaNode.role !== "textbox" && text)\n ariaNode.children.push(node.nodeValue || "");\n return;\n }\n if (node.nodeType !== Node.ELEMENT_NODE)\n return;\n const element = node;\n let isVisible = !isElementHiddenForAria(element);\n if (options == null ? void 0 : options.forAI)\n isVisible = isVisible || isElementVisible(element);\n if (!isVisible)\n return;\n const ariaChildren = [];\n if (element.hasAttribute("aria-owns")) {\n const ids = element.getAttribute("aria-owns").split(/\\s+/);\n for (const id of ids) {\n const ownedElement = rootElement.ownerDocument.getElementById(id);\n if (ownedElement)\n ariaChildren.push(ownedElement);\n }\n }\n const childAriaNode = toAriaNode(element, options);\n if (childAriaNode) {\n if (childAriaNode.ref)\n snapshot.elements.set(childAriaNode.ref, element);\n ariaNode.children.push(childAriaNode);\n }\n processElement(childAriaNode || ariaNode, element, ariaChildren);\n };\n function processElement(ariaNode, element, ariaChildren = []) {\n var _a;\n const display = ((_a = getElementComputedStyle(element)) == null ? void 0 : _a.display) || "inline";\n const treatAsBlock = display !== "inline" || element.nodeName === "BR" ? " " : "";\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n ariaNode.children.push(getCSSContent(element, "::before") || "");\n const assignedNodes = element.nodeName === "SLOT" ? element.assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(ariaNode, child);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (!child.assignedSlot)\n visit(ariaNode, child);\n }\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(ariaNode, child);\n }\n }\n for (const child of ariaChildren)\n visit(ariaNode, child);\n ariaNode.children.push(getCSSContent(element, "::after") || "");\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n if (ariaNode.children.length === 1 && ariaNode.name === ariaNode.children[0])\n ariaNode.children = [];\n if (ariaNode.role === "link" && element.hasAttribute("href")) {\n const href = element.getAttribute("href");\n ariaNode.props["url"] = href;\n }\n }\n beginAriaCaches();\n try {\n visit(snapshot.root, rootElement);\n } finally {\n endAriaCaches();\n }\n normalizeStringChildren(snapshot.root);\n normalizeGenericRoles(snapshot.root);\n return snapshot;\n}\nfunction ariaRef(element, role, name, options) {\n var _a;\n if (!(options == null ? void 0 : options.forAI))\n return void 0;\n let ariaRef2;\n ariaRef2 = element._ariaRef;\n if (!ariaRef2 || ariaRef2.role !== role || ariaRef2.name !== name) {\n ariaRef2 = { role, name, ref: ((_a = options == null ? void 0 : options.refPrefix) != null ? _a : "") + "e" + ++lastRef };\n element._ariaRef = ariaRef2;\n }\n return ariaRef2.ref;\n}\nfunction toAriaNode(element, options) {\n var _a;\n if (element.nodeName === "IFRAME") {\n return {\n role: "iframe",\n name: "",\n ref: ariaRef(element, "iframe", "", options),\n children: [],\n props: {},\n element,\n box: box(element),\n receivesPointerEvents: true\n };\n }\n const defaultRole = (options == null ? void 0 : options.forAI) ? "generic" : null;\n const role = (_a = getAriaRole(element)) != null ? _a : defaultRole;\n if (!role || role === "presentation" || role === "none")\n return null;\n const name = normalizeWhiteSpace(getElementAccessibleName(element, false) || "");\n const receivesPointerEvents3 = receivesPointerEvents(element);\n const result = {\n role,\n name,\n ref: ariaRef(element, role, name, options),\n children: [],\n props: {},\n element,\n box: box(element),\n receivesPointerEvents: receivesPointerEvents3\n };\n if (kAriaCheckedRoles.includes(role))\n result.checked = getAriaChecked(element);\n if (kAriaDisabledRoles.includes(role))\n result.disabled = getAriaDisabled(element);\n if (kAriaExpandedRoles.includes(role))\n result.expanded = getAriaExpanded(element);\n if (kAriaLevelRoles.includes(role))\n result.level = getAriaLevel(element);\n if (kAriaPressedRoles.includes(role))\n result.pressed = getAriaPressed(element);\n if (kAriaSelectedRoles.includes(role))\n result.selected = getAriaSelected(element);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element.type !== "checkbox" && element.type !== "radio" && (element.type !== "file" || getGlobalOptions().inputFileRoleTextbox))\n result.children = [element.value];\n }\n return result;\n}\nfunction normalizeGenericRoles(node) {\n const normalizeChildren = (node2) => {\n const result = [];\n for (const child of node2.children || []) {\n if (typeof child === "string") {\n result.push(child);\n continue;\n }\n const normalized = normalizeChildren(child);\n result.push(...normalized);\n }\n const removeSelf = node2.role === "generic" && result.length <= 1 && result.every((c) => typeof c !== "string" && receivesPointerEvents2(c));\n if (removeSelf)\n return result;\n node2.children = result;\n return [node2];\n };\n normalizeChildren(node);\n}\nfunction normalizeStringChildren(rootA11yNode) {\n const flushChildren = (buffer, normalizedChildren) => {\n if (!buffer.length)\n return;\n const text = normalizeWhiteSpace(buffer.join(""));\n if (text)\n normalizedChildren.push(text);\n buffer.length = 0;\n };\n const visit = (ariaNode) => {\n const normalizedChildren = [];\n const buffer = [];\n for (const child of ariaNode.children || []) {\n if (typeof child === "string") {\n buffer.push(child);\n } else {\n flushChildren(buffer, normalizedChildren);\n visit(child);\n normalizedChildren.push(child);\n }\n }\n flushChildren(buffer, normalizedChildren);\n ariaNode.children = normalizedChildren.length ? normalizedChildren : [];\n if (ariaNode.children.length === 1 && ariaNode.children[0] === ariaNode.name)\n ariaNode.children = [];\n };\n visit(rootA11yNode);\n}\nfunction matchesText(text, template) {\n if (!template)\n return true;\n if (!text)\n return false;\n if (typeof template === "string")\n return text === template;\n return !!text.match(new RegExp(template.pattern));\n}\nfunction matchesTextNode(text, template) {\n return matchesText(text, template.text);\n}\nfunction matchesName(text, template) {\n return matchesText(text, template.name);\n}\nfunction matchesAriaTree(rootElement, template) {\n const snapshot = generateAriaTree(rootElement);\n const matches = matchesNodeDeep(snapshot.root, template, false, false);\n return {\n matches,\n received: {\n raw: renderAriaTree(snapshot, { mode: "raw" }),\n regex: renderAriaTree(snapshot, { mode: "regex" })\n }\n };\n}\nfunction getAllByAria(rootElement, template) {\n const root = generateAriaTree(rootElement).root;\n const matches = matchesNodeDeep(root, template, true, false);\n return matches.map((n) => n.element);\n}\nfunction matchesNode(node, template, isDeepEqual) {\n var _a;\n if (typeof node === "string" && template.kind === "text")\n return matchesTextNode(node, template);\n if (node === null || typeof node !== "object" || template.kind !== "role")\n return false;\n if (template.role !== "fragment" && template.role !== node.role)\n return false;\n if (template.checked !== void 0 && template.checked !== node.checked)\n return false;\n if (template.disabled !== void 0 && template.disabled !== node.disabled)\n return false;\n if (template.expanded !== void 0 && template.expanded !== node.expanded)\n return false;\n if (template.level !== void 0 && template.level !== node.level)\n return false;\n if (template.pressed !== void 0 && template.pressed !== node.pressed)\n return false;\n if (template.selected !== void 0 && template.selected !== node.selected)\n return false;\n if (!matchesName(node.name, template))\n return false;\n if (!matchesText(node.props.url, (_a = template.props) == null ? void 0 : _a.url))\n return false;\n if (template.containerMode === "contain")\n return containsList(node.children || [], template.children || []);\n if (template.containerMode === "equal")\n return listEqual(node.children || [], template.children || [], false);\n if (template.containerMode === "deep-equal" || isDeepEqual)\n return listEqual(node.children || [], template.children || [], true);\n return containsList(node.children || [], template.children || []);\n}\nfunction listEqual(children, template, isDeepEqual) {\n if (template.length !== children.length)\n return false;\n for (let i = 0; i < template.length; ++i) {\n if (!matchesNode(children[i], template[i], isDeepEqual))\n return false;\n }\n return true;\n}\nfunction containsList(children, template) {\n if (template.length > children.length)\n return false;\n const cc = children.slice();\n const tt = template.slice();\n for (const t of tt) {\n let c = cc.shift();\n while (c) {\n if (matchesNode(c, t, false))\n break;\n c = cc.shift();\n }\n if (!c)\n return false;\n }\n return true;\n}\nfunction matchesNodeDeep(root, template, collectAll, isDeepEqual) {\n const results = [];\n const visit = (node, parent) => {\n if (matchesNode(node, template, isDeepEqual)) {\n const result = typeof node === "string" ? parent : node;\n if (result)\n results.push(result);\n return !collectAll;\n }\n if (typeof node === "string")\n return false;\n for (const child of node.children || []) {\n if (visit(child, node))\n return true;\n }\n return false;\n };\n visit(root, null);\n return results;\n}\nfunction renderAriaTree(ariaSnapshot, options) {\n const lines = [];\n const includeText = (options == null ? void 0 : options.mode) === "regex" ? textContributesInfo : () => true;\n const renderString = (options == null ? void 0 : options.mode) === "regex" ? convertToBestGuessRegex : (str) => str;\n const visit = (ariaNode2, parentAriaNode, indent) => {\n if (typeof ariaNode2 === "string") {\n if (parentAriaNode && !includeText(parentAriaNode, ariaNode2))\n return;\n const text = yamlEscapeValueIfNeeded(renderString(ariaNode2));\n if (text)\n lines.push(indent + "- text: " + text);\n return;\n }\n let key = ariaNode2.role;\n if (ariaNode2.name && ariaNode2.name.length <= 900) {\n const name = renderString(ariaNode2.name);\n if (name) {\n const stringifiedName = name.startsWith("/") && name.endsWith("/") ? name : JSON.stringify(name);\n key += " " + stringifiedName;\n }\n }\n if (ariaNode2.checked === "mixed")\n key += ` [checked=mixed]`;\n if (ariaNode2.checked === true)\n key += ` [checked]`;\n if (ariaNode2.disabled)\n key += ` [disabled]`;\n if (ariaNode2.expanded)\n key += ` [expanded]`;\n if (ariaNode2.level)\n key += ` [level=${ariaNode2.level}]`;\n if (ariaNode2.pressed === "mixed")\n key += ` [pressed=mixed]`;\n if (ariaNode2.pressed === true)\n key += ` [pressed]`;\n if (ariaNode2.selected === true)\n key += ` [selected]`;\n if ((options == null ? void 0 : options.forAI) && receivesPointerEvents2(ariaNode2)) {\n const ref = ariaNode2.ref;\n const cursor = hasPointerCursor(ariaNode2) ? " [cursor=pointer]" : "";\n if (ref)\n key += ` [ref=${ref}]${cursor}`;\n }\n const escapedKey = indent + "- " + yamlEscapeKeyIfNeeded(key);\n const hasProps = !!Object.keys(ariaNode2.props).length;\n if (!ariaNode2.children.length && !hasProps) {\n lines.push(escapedKey);\n } else if (ariaNode2.children.length === 1 && typeof ariaNode2.children[0] === "string" && !hasProps) {\n const text = includeText(ariaNode2, ariaNode2.children[0]) ? renderString(ariaNode2.children[0]) : null;\n if (text)\n lines.push(escapedKey + ": " + yamlEscapeValueIfNeeded(text));\n else\n lines.push(escapedKey);\n } else {\n lines.push(escapedKey + ":");\n for (const [name, value] of Object.entries(ariaNode2.props))\n lines.push(indent + " - /" + name + ": " + yamlEscapeValueIfNeeded(value));\n for (const child of ariaNode2.children || [])\n visit(child, ariaNode2, indent + " ");\n }\n };\n const ariaNode = ariaSnapshot.root;\n if (ariaNode.role === "fragment") {\n for (const child of ariaNode.children || [])\n visit(child, ariaNode, "");\n } else {\n visit(ariaNode, null, "");\n }\n return lines.join("\\n");\n}\nfunction convertToBestGuessRegex(text) {\n const dynamicContent = [\n // 2mb\n { regex: /\\b[\\d,.]+[bkmBKM]+\\b/, replacement: "[\\\\d,.]+[bkmBKM]+" },\n // 2ms, 20s\n { regex: /\\b\\d+[hmsp]+\\b/, replacement: "\\\\d+[hmsp]+" },\n { regex: /\\b[\\d,.]+[hmsp]+\\b/, replacement: "[\\\\d,.]+[hmsp]+" },\n // Do not replace single digits with regex by default.\n // 2+ digits: [Issue 22, 22.3, 2.33, 2,333]\n { regex: /\\b\\d+,\\d+\\b/, replacement: "\\\\d+,\\\\d+" },\n { regex: /\\b\\d+\\.\\d{2,}\\b/, replacement: "\\\\d+\\\\.\\\\d+" },\n { regex: /\\b\\d{2,}\\.\\d+\\b/, replacement: "\\\\d+\\\\.\\\\d+" },\n { regex: /\\b\\d{2,}\\b/, replacement: "\\\\d+" }\n ];\n let pattern = "";\n let lastIndex = 0;\n const combinedRegex = new RegExp(dynamicContent.map((r) => "(" + r.regex.source + ")").join("|"), "g");\n text.replace(combinedRegex, (match, ...args) => {\n const offset = args[args.length - 2];\n const groups = args.slice(0, -2);\n pattern += escapeRegExp(text.slice(lastIndex, offset));\n for (let i = 0; i < groups.length; i++) {\n if (groups[i]) {\n const { replacement } = dynamicContent[i];\n pattern += replacement;\n break;\n }\n }\n lastIndex = offset + match.length;\n return match;\n });\n if (!pattern)\n return text;\n pattern += escapeRegExp(text.slice(lastIndex));\n return String(new RegExp(pattern));\n}\nfunction textContributesInfo(node, text) {\n if (!text.length)\n return false;\n if (!node.name)\n return true;\n if (node.name.length > text.length)\n return false;\n const substr = text.length <= 200 && node.name.length <= 200 ? longestCommonSubstring(text, node.name) : "";\n let filtered = text;\n while (substr && filtered.includes(substr))\n filtered = filtered.replace(substr, "");\n return filtered.trim().length / text.length > 0.1;\n}\nfunction receivesPointerEvents2(ariaNode) {\n return ariaNode.box.visible && ariaNode.receivesPointerEvents;\n}\nfunction hasPointerCursor(ariaNode) {\n var _a;\n return ((_a = ariaNode.box.style) == null ? void 0 : _a.cursor) === "pointer";\n}\n\n// packages/injected/src/highlight.css?inline\nvar highlight_default = ":host{font-size:13px;font-family:system-ui,Ubuntu,Droid Sans,sans-serif;color:#333}svg{position:absolute;height:0}x-pw-tooltip{backdrop-filter:blur(5px);background-color:#fff;border-radius:6px;box-shadow:0 .5rem 1.2rem #0000004d;display:none;font-size:12.8px;font-weight:400;left:0;line-height:1.5;max-width:600px;position:absolute;top:0;padding:0;flex-direction:column;overflow:hidden}x-pw-tooltip-line{display:flex;max-width:600px;padding:6px;user-select:none;cursor:pointer}x-pw-tooltip-line.selectable:hover{background-color:#f2f2f2;overflow:hidden}x-pw-tooltip-footer{display:flex;max-width:600px;padding:6px;user-select:none;color:#777}x-pw-dialog{background-color:#fff;pointer-events:auto;border-radius:6px;box-shadow:0 .5rem 1.2rem #0000004d;display:flex;flex-direction:column;position:absolute;width:400px;height:150px;z-index:10;font-size:13px}x-pw-dialog-body{display:flex;flex-direction:column;flex:auto}x-pw-dialog-body label{margin:5px 8px;display:flex;flex-direction:row;align-items:center}x-pw-highlight{position:absolute;top:0;left:0;width:0;height:0}x-pw-action-point{position:absolute;width:20px;height:20px;background:red;border-radius:10px;margin:-10px 0 0 -10px;z-index:2}x-pw-separator{height:1px;margin:6px 9px;background:#949494e5}x-pw-tool-gripper{height:28px;width:24px;margin:2px 0;cursor:grab}x-pw-tool-gripper:active{cursor:grabbing}x-pw-tool-gripper>x-div{width:16px;height:16px;margin:6px 4px;clip-path:url(#icon-gripper);background-color:#555}x-pw-tools-list>label{display:flex;align-items:center;margin:0 10px;user-select:none}x-pw-tools-list{display:flex;width:100%;border-bottom:1px solid #dddddd}x-pw-tool-item{pointer-events:auto;height:28px;width:28px;border-radius:3px}x-pw-tool-item:not(.disabled){cursor:pointer}x-pw-tool-item:not(.disabled):hover{background-color:#dbdbdb}x-pw-tool-item.toggled{background-color:#8acae480}x-pw-tool-item.toggled:not(.disabled):hover{background-color:#8acae4c4}x-pw-tool-item>x-div{width:16px;height:16px;margin:6px;background-color:#3a3a3a}x-pw-tool-item.disabled>x-div{background-color:#61616180;cursor:default}x-pw-tool-item.record.toggled{background-color:transparent}x-pw-tool-item.record.toggled:not(.disabled):hover{background-color:#dbdbdb}x-pw-tool-item.record.toggled>x-div{background-color:#a1260d}x-pw-tool-item.record.disabled.toggled>x-div{opacity:.8}x-pw-tool-item.accept>x-div{background-color:#388a34}x-pw-tool-item.record>x-div{clip-path:url(#icon-circle-large-filled)}x-pw-tool-item.pick-locator>x-div{clip-path:url(#icon-inspect)}x-pw-tool-item.text>x-div{clip-path:url(#icon-whole-word)}x-pw-tool-item.visibility>x-div{clip-path:url(#icon-eye)}x-pw-tool-item.value>x-div{clip-path:url(#icon-symbol-constant)}x-pw-tool-item.snapshot>x-div{clip-path:url(#icon-gist)}x-pw-tool-item.accept>x-div{clip-path:url(#icon-check)}x-pw-tool-item.cancel>x-div{clip-path:url(#icon-close)}x-pw-tool-item.succeeded>x-div{clip-path:url(#icon-pass);background-color:#388a34!important}x-pw-overlay{position:absolute;top:0;max-width:min-content;z-index:2147483647;background:transparent;pointer-events:auto}x-pw-overlay x-pw-tools-list{background-color:#fffd;box-shadow:#0000001a 0 5px 5px;border-radius:3px;border-bottom:none}x-pw-overlay x-pw-tool-item{margin:2px}textarea.text-editor{font-family:system-ui,Ubuntu,Droid Sans,sans-serif;flex:auto;border:none;margin:6px 10px;color:#333;outline:1px solid transparent!important;resize:none;padding:0;font-size:13px}textarea.text-editor.does-not-match{outline:1px solid red!important}x-div{display:block}x-spacer{flex:auto}*{box-sizing:border-box}*[hidden]{display:none!important}x-locator-editor{flex:none;width:100%;height:60px;padding:4px;border-bottom:1px solid #dddddd;outline:1px solid transparent}x-locator-editor.does-not-match{outline:1px solid red}.CodeMirror{width:100%!important;height:100%!important}\\n";\n\n// packages/injected/src/highlight.ts\nvar Highlight = class {\n constructor(injectedScript) {\n this._renderedEntries = [];\n this._language = "javascript";\n this._injectedScript = injectedScript;\n const document = injectedScript.document;\n this._isUnderTest = injectedScript.isUnderTest;\n this._glassPaneElement = document.createElement("x-pw-glass");\n this._glassPaneElement.style.position = "fixed";\n this._glassPaneElement.style.top = "0";\n this._glassPaneElement.style.right = "0";\n this._glassPaneElement.style.bottom = "0";\n this._glassPaneElement.style.left = "0";\n this._glassPaneElement.style.zIndex = "2147483646";\n this._glassPaneElement.style.pointerEvents = "none";\n this._glassPaneElement.style.display = "flex";\n this._glassPaneElement.style.backgroundColor = "transparent";\n for (const eventName of ["click", "auxclick", "dragstart", "input", "keydown", "keyup", "pointerdown", "pointerup", "mousedown", "mouseup", "mouseleave", "focus", "scroll"]) {\n this._glassPaneElement.addEventListener(eventName, (e) => {\n e.stopPropagation();\n e.stopImmediatePropagation();\n });\n }\n this._actionPointElement = document.createElement("x-pw-action-point");\n this._actionPointElement.setAttribute("hidden", "true");\n this._glassPaneShadow = this._glassPaneElement.attachShadow({ mode: this._isUnderTest ? "open" : "closed" });\n if (typeof this._glassPaneShadow.adoptedStyleSheets.push === "function") {\n const sheet = new this._injectedScript.window.CSSStyleSheet();\n sheet.replaceSync(highlight_default);\n this._glassPaneShadow.adoptedStyleSheets.push(sheet);\n } else {\n const styleElement = this._injectedScript.document.createElement("style");\n styleElement.textContent = highlight_default;\n this._glassPaneShadow.appendChild(styleElement);\n }\n this._glassPaneShadow.appendChild(this._actionPointElement);\n }\n install() {\n if (this._injectedScript.document.documentElement && !this._injectedScript.document.documentElement.contains(this._glassPaneElement))\n this._injectedScript.document.documentElement.appendChild(this._glassPaneElement);\n }\n setLanguage(language) {\n this._language = language;\n }\n runHighlightOnRaf(selector) {\n if (this._rafRequest)\n this._injectedScript.utils.builtins.cancelAnimationFrame(this._rafRequest);\n const elements = this._injectedScript.querySelectorAll(selector, this._injectedScript.document.documentElement);\n const locator = asLocator(this._language, stringifySelector(selector));\n const color = elements.length > 1 ? "#f6b26b7f" : "#6fa8dc7f";\n this.updateHighlight(elements.map((element, index) => {\n const suffix = elements.length > 1 ? ` [${index + 1} of ${elements.length}]` : "";\n return { element, color, tooltipText: locator + suffix };\n }));\n this._rafRequest = this._injectedScript.utils.builtins.requestAnimationFrame(() => this.runHighlightOnRaf(selector));\n }\n uninstall() {\n if (this._rafRequest)\n this._injectedScript.utils.builtins.cancelAnimationFrame(this._rafRequest);\n this._glassPaneElement.remove();\n }\n showActionPoint(x, y) {\n this._actionPointElement.style.top = y + "px";\n this._actionPointElement.style.left = x + "px";\n this._actionPointElement.hidden = false;\n }\n hideActionPoint() {\n this._actionPointElement.hidden = true;\n }\n clearHighlight() {\n var _a, _b;\n for (const entry of this._renderedEntries) {\n (_a = entry.highlightElement) == null ? void 0 : _a.remove();\n (_b = entry.tooltipElement) == null ? void 0 : _b.remove();\n }\n this._renderedEntries = [];\n }\n maskElements(elements, color) {\n this.updateHighlight(elements.map((element) => ({ element, color })));\n }\n updateHighlight(entries) {\n if (this._highlightIsUpToDate(entries))\n return;\n this.clearHighlight();\n for (const entry of entries) {\n const highlightElement = this._createHighlightElement();\n this._glassPaneShadow.appendChild(highlightElement);\n let tooltipElement;\n if (entry.tooltipText) {\n tooltipElement = this._injectedScript.document.createElement("x-pw-tooltip");\n this._glassPaneShadow.appendChild(tooltipElement);\n tooltipElement.style.top = "0";\n tooltipElement.style.left = "0";\n tooltipElement.style.display = "flex";\n const lineElement = this._injectedScript.document.createElement("x-pw-tooltip-line");\n lineElement.textContent = entry.tooltipText;\n tooltipElement.appendChild(lineElement);\n }\n this._renderedEntries.push({ targetElement: entry.element, color: entry.color, tooltipElement, highlightElement });\n }\n for (const entry of this._renderedEntries) {\n entry.box = entry.targetElement.getBoundingClientRect();\n if (!entry.tooltipElement)\n continue;\n const { anchorLeft, anchorTop } = this.tooltipPosition(entry.box, entry.tooltipElement);\n entry.tooltipTop = anchorTop;\n entry.tooltipLeft = anchorLeft;\n }\n for (const entry of this._renderedEntries) {\n if (entry.tooltipElement) {\n entry.tooltipElement.style.top = entry.tooltipTop + "px";\n entry.tooltipElement.style.left = entry.tooltipLeft + "px";\n }\n const box2 = entry.box;\n entry.highlightElement.style.backgroundColor = entry.color;\n entry.highlightElement.style.left = box2.x + "px";\n entry.highlightElement.style.top = box2.y + "px";\n entry.highlightElement.style.width = box2.width + "px";\n entry.highlightElement.style.height = box2.height + "px";\n entry.highlightElement.style.display = "block";\n if (this._isUnderTest)\n console.error("Highlight box for test: " + JSON.stringify({ x: box2.x, y: box2.y, width: box2.width, height: box2.height }));\n }\n }\n firstBox() {\n var _a;\n return (_a = this._renderedEntries[0]) == null ? void 0 : _a.box;\n }\n tooltipPosition(box2, tooltipElement) {\n const tooltipWidth = tooltipElement.offsetWidth;\n const tooltipHeight = tooltipElement.offsetHeight;\n const totalWidth = this._glassPaneElement.offsetWidth;\n const totalHeight = this._glassPaneElement.offsetHeight;\n let anchorLeft = box2.left;\n if (anchorLeft + tooltipWidth > totalWidth - 5)\n anchorLeft = totalWidth - tooltipWidth - 5;\n let anchorTop = box2.bottom + 5;\n if (anchorTop + tooltipHeight > totalHeight - 5) {\n if (box2.top > tooltipHeight + 5) {\n anchorTop = box2.top - tooltipHeight - 5;\n } else {\n anchorTop = totalHeight - 5 - tooltipHeight;\n }\n }\n return { anchorLeft, anchorTop };\n }\n _highlightIsUpToDate(entries) {\n if (entries.length !== this._renderedEntries.length)\n return false;\n for (let i = 0; i < this._renderedEntries.length; ++i) {\n if (entries[i].element !== this._renderedEntries[i].targetElement)\n return false;\n if (entries[i].color !== this._renderedEntries[i].color)\n return false;\n const oldBox = this._renderedEntries[i].box;\n if (!oldBox)\n return false;\n const box2 = entries[i].element.getBoundingClientRect();\n if (box2.top !== oldBox.top || box2.right !== oldBox.right || box2.bottom !== oldBox.bottom || box2.left !== oldBox.left)\n return false;\n }\n return true;\n }\n _createHighlightElement() {\n return this._injectedScript.document.createElement("x-pw-highlight");\n }\n appendChild(element) {\n this._glassPaneShadow.appendChild(element);\n }\n};\n\n// packages/injected/src/layoutSelectorUtils.ts\nfunction boxRightOf(box1, box2, maxDistance) {\n const distance = box1.left - box2.right;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box2.bottom - box1.bottom, 0) + Math.max(box1.top - box2.top, 0);\n}\nfunction boxLeftOf(box1, box2, maxDistance) {\n const distance = box2.left - box1.right;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box2.bottom - box1.bottom, 0) + Math.max(box1.top - box2.top, 0);\n}\nfunction boxAbove(box1, box2, maxDistance) {\n const distance = box2.top - box1.bottom;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box1.left - box2.left, 0) + Math.max(box2.right - box1.right, 0);\n}\nfunction boxBelow(box1, box2, maxDistance) {\n const distance = box1.top - box2.bottom;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box1.left - box2.left, 0) + Math.max(box2.right - box1.right, 0);\n}\nfunction boxNear(box1, box2, maxDistance) {\n const kThreshold = maxDistance === void 0 ? 50 : maxDistance;\n let score = 0;\n if (box1.left - box2.right >= 0)\n score += box1.left - box2.right;\n if (box2.left - box1.right >= 0)\n score += box2.left - box1.right;\n if (box2.top - box1.bottom >= 0)\n score += box2.top - box1.bottom;\n if (box1.top - box2.bottom >= 0)\n score += box1.top - box2.bottom;\n return score > kThreshold ? void 0 : score;\n}\nvar kLayoutSelectorNames = ["left-of", "right-of", "above", "below", "near"];\nfunction layoutSelectorScore(name, element, inner, maxDistance) {\n const box2 = element.getBoundingClientRect();\n const scorer = { "left-of": boxLeftOf, "right-of": boxRightOf, "above": boxAbove, "below": boxBelow, "near": boxNear }[name];\n let bestScore;\n for (const e of inner) {\n if (e === element)\n continue;\n const score = scorer(box2, e.getBoundingClientRect(), maxDistance);\n if (score === void 0)\n continue;\n if (bestScore === void 0 || score < bestScore)\n bestScore = score;\n }\n return bestScore;\n}\n\n// packages/injected/src/selectorUtils.ts\nfunction matchesComponentAttribute(obj, attr) {\n for (const token of attr.jsonPath) {\n if (obj !== void 0 && obj !== null)\n obj = obj[token];\n }\n return matchesAttributePart(obj, attr);\n}\nfunction matchesAttributePart(value, attr) {\n const objValue = typeof value === "string" && !attr.caseSensitive ? value.toUpperCase() : value;\n const attrValue = typeof attr.value === "string" && !attr.caseSensitive ? attr.value.toUpperCase() : attr.value;\n if (attr.op === "")\n return !!objValue;\n if (attr.op === "=") {\n if (attrValue instanceof RegExp)\n return typeof objValue === "string" && !!objValue.match(attrValue);\n return objValue === attrValue;\n }\n if (typeof objValue !== "string" || typeof attrValue !== "string")\n return false;\n if (attr.op === "*=")\n return objValue.includes(attrValue);\n if (attr.op === "^=")\n return objValue.startsWith(attrValue);\n if (attr.op === "$=")\n return objValue.endsWith(attrValue);\n if (attr.op === "|=")\n return objValue === attrValue || objValue.startsWith(attrValue + "-");\n if (attr.op === "~=")\n return objValue.split(" ").includes(attrValue);\n return false;\n}\nfunction shouldSkipForTextMatching(element) {\n const document = element.ownerDocument;\n return element.nodeName === "SCRIPT" || element.nodeName === "NOSCRIPT" || element.nodeName === "STYLE" || document.head && document.head.contains(element);\n}\nfunction elementText(cache, root) {\n let value = cache.get(root);\n if (value === void 0) {\n value = { full: "", normalized: "", immediate: [] };\n if (!shouldSkipForTextMatching(root)) {\n let currentImmediate = "";\n if (root instanceof HTMLInputElement && (root.type === "submit" || root.type === "button")) {\n value = { full: root.value, normalized: normalizeWhiteSpace(root.value), immediate: [root.value] };\n } else {\n for (let child = root.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === Node.TEXT_NODE) {\n value.full += child.nodeValue || "";\n currentImmediate += child.nodeValue || "";\n } else if (child.nodeType === Node.COMMENT_NODE) {\n continue;\n } else {\n if (currentImmediate)\n value.immediate.push(currentImmediate);\n currentImmediate = "";\n if (child.nodeType === Node.ELEMENT_NODE)\n value.full += elementText(cache, child).full;\n }\n }\n if (currentImmediate)\n value.immediate.push(currentImmediate);\n if (root.shadowRoot)\n value.full += elementText(cache, root.shadowRoot).full;\n if (value.full)\n value.normalized = normalizeWhiteSpace(value.full);\n }\n }\n cache.set(root, value);\n }\n return value;\n}\nfunction elementMatchesText(cache, element, matcher) {\n if (shouldSkipForTextMatching(element))\n return "none";\n if (!matcher(elementText(cache, element)))\n return "none";\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === Node.ELEMENT_NODE && matcher(elementText(cache, child)))\n return "selfAndChildren";\n }\n if (element.shadowRoot && matcher(elementText(cache, element.shadowRoot)))\n return "selfAndChildren";\n return "self";\n}\nfunction getElementLabels(textCache, element) {\n const labels = getAriaLabelledByElements(element);\n if (labels)\n return labels.map((label) => elementText(textCache, label));\n const ariaLabel = element.getAttribute("aria-label");\n if (ariaLabel !== null && !!ariaLabel.trim())\n return [{ full: ariaLabel, normalized: normalizeWhiteSpace(ariaLabel), immediate: [ariaLabel] }];\n const isNonHiddenInput = element.nodeName === "INPUT" && element.type !== "hidden";\n if (["BUTTON", "METER", "OUTPUT", "PROGRESS", "SELECT", "TEXTAREA"].includes(element.nodeName) || isNonHiddenInput) {\n const labels2 = element.labels;\n if (labels2)\n return [...labels2].map((label) => elementText(textCache, label));\n }\n return [];\n}\n\n// packages/injected/src/reactSelectorEngine.ts\nfunction getFunctionComponentName(component) {\n return component.displayName || component.name || "Anonymous";\n}\nfunction getComponentName(reactElement) {\n if (reactElement.type) {\n switch (typeof reactElement.type) {\n case "function":\n return getFunctionComponentName(reactElement.type);\n case "string":\n return reactElement.type;\n case "object":\n return reactElement.type.displayName || (reactElement.type.render ? getFunctionComponentName(reactElement.type.render) : "");\n }\n }\n if (reactElement._currentElement) {\n const elementType = reactElement._currentElement.type;\n if (typeof elementType === "string")\n return elementType;\n if (typeof elementType === "function")\n return elementType.displayName || elementType.name || "Anonymous";\n }\n return "";\n}\nfunction getComponentKey(reactElement) {\n var _a, _b;\n return (_b = reactElement.key) != null ? _b : (_a = reactElement._currentElement) == null ? void 0 : _a.key;\n}\nfunction getChildren(reactElement) {\n if (reactElement.child) {\n const children = [];\n for (let child = reactElement.child; child; child = child.sibling)\n children.push(child);\n return children;\n }\n if (!reactElement._currentElement)\n return [];\n const isKnownElement = (reactElement2) => {\n var _a;\n const elementType = (_a = reactElement2._currentElement) == null ? void 0 : _a.type;\n return typeof elementType === "function" || typeof elementType === "string";\n };\n if (reactElement._renderedComponent) {\n const child = reactElement._renderedComponent;\n return isKnownElement(child) ? [child] : [];\n }\n if (reactElement._renderedChildren)\n return [...Object.values(reactElement._renderedChildren)].filter(isKnownElement);\n return [];\n}\nfunction getProps(reactElement) {\n var _a;\n const props = (\n // React 16+\n reactElement.memoizedProps || // React 15\n ((_a = reactElement._currentElement) == null ? void 0 : _a.props)\n );\n if (!props || typeof props === "string")\n return props;\n const result = { ...props };\n delete result.children;\n return result;\n}\nfunction buildComponentsTree(reactElement) {\n var _a;\n const treeNode = {\n key: getComponentKey(reactElement),\n name: getComponentName(reactElement),\n children: getChildren(reactElement).map(buildComponentsTree),\n rootElements: [],\n props: getProps(reactElement)\n };\n const rootElement = (\n // React 16+\n // @see https://github.com/baruchvlz/resq/blob/5c15a5e04d3f7174087248f5a158c3d6dcc1ec72/src/utils.js#L29\n reactElement.stateNode || // React 15\n reactElement._hostNode || ((_a = reactElement._renderedComponent) == null ? void 0 : _a._hostNode)\n );\n if (rootElement instanceof Element) {\n treeNode.rootElements.push(rootElement);\n } else {\n for (const child of treeNode.children)\n treeNode.rootElements.push(...child.rootElements);\n }\n return treeNode;\n}\nfunction filterComponentsTree(treeNode, searchFn, result = []) {\n if (searchFn(treeNode))\n result.push(treeNode);\n for (const child of treeNode.children)\n filterComponentsTree(child, searchFn, result);\n return result;\n}\nfunction findReactRoots(root, roots = []) {\n const document = root.ownerDocument || root;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n do {\n const node = walker.currentNode;\n const reactNode = node;\n const rootKey = Object.keys(reactNode).find((key) => key.startsWith("__reactContainer") && reactNode[key] !== null);\n if (rootKey) {\n roots.push(reactNode[rootKey].stateNode.current);\n } else {\n const legacyRootKey = "_reactRootContainer";\n if (reactNode.hasOwnProperty(legacyRootKey) && reactNode[legacyRootKey] !== null) {\n roots.push(reactNode[legacyRootKey]._internalRoot.current);\n }\n }\n if (node instanceof Element && node.hasAttribute("data-reactroot")) {\n for (const key of Object.keys(node)) {\n if (key.startsWith("__reactInternalInstance") || key.startsWith("__reactFiber"))\n roots.push(node[key]);\n }\n }\n const shadowRoot = node instanceof Element ? node.shadowRoot : null;\n if (shadowRoot)\n findReactRoots(shadowRoot, roots);\n } while (walker.nextNode());\n return roots;\n}\nvar createReactEngine = () => ({\n queryAll(scope, selector) {\n const { name, attributes } = parseAttributeSelector(selector, false);\n const reactRoots = findReactRoots(scope.ownerDocument || scope);\n const trees = reactRoots.map((reactRoot) => buildComponentsTree(reactRoot));\n const treeNodes = trees.map((tree) => filterComponentsTree(tree, (treeNode) => {\n var _a;\n const props = (_a = treeNode.props) != null ? _a : {};\n if (treeNode.key !== void 0)\n props.key = treeNode.key;\n if (name && treeNode.name !== name)\n return false;\n if (treeNode.rootElements.some((domNode) => !isInsideScope(scope, domNode)))\n return false;\n for (const attr of attributes) {\n if (!matchesComponentAttribute(props, attr))\n return false;\n }\n return true;\n })).flat();\n const allRootElements = /* @__PURE__ */ new Set();\n for (const treeNode of treeNodes) {\n for (const domNode of treeNode.rootElements)\n allRootElements.add(domNode);\n }\n return [...allRootElements];\n }\n});\n\n// packages/injected/src/roleSelectorEngine.ts\nvar kSupportedAttributes = ["selected", "checked", "pressed", "expanded", "level", "disabled", "name", "include-hidden"];\nkSupportedAttributes.sort();\nfunction validateSupportedRole(attr, roles, role) {\n if (!roles.includes(role))\n throw new Error(`"${attr}" attribute is only supported for roles: ${roles.slice().sort().map((role2) => `"${role2}"`).join(", ")}`);\n}\nfunction validateSupportedValues(attr, values) {\n if (attr.op !== "" && !values.includes(attr.value))\n throw new Error(`"${attr.name}" must be one of ${values.map((v) => JSON.stringify(v)).join(", ")}`);\n}\nfunction validateSupportedOp(attr, ops) {\n if (!ops.includes(attr.op))\n throw new Error(`"${attr.name}" does not support "${attr.op}" matcher`);\n}\nfunction validateAttributes(attrs, role) {\n const options = { role };\n for (const attr of attrs) {\n switch (attr.name) {\n case "checked": {\n validateSupportedRole(attr.name, kAriaCheckedRoles, role);\n validateSupportedValues(attr, [true, false, "mixed"]);\n validateSupportedOp(attr, ["", "="]);\n options.checked = attr.op === "" ? true : attr.value;\n break;\n }\n case "pressed": {\n validateSupportedRole(attr.name, kAriaPressedRoles, role);\n validateSupportedValues(attr, [true, false, "mixed"]);\n validateSupportedOp(attr, ["", "="]);\n options.pressed = attr.op === "" ? true : attr.value;\n break;\n }\n case "selected": {\n validateSupportedRole(attr.name, kAriaSelectedRoles, role);\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.selected = attr.op === "" ? true : attr.value;\n break;\n }\n case "expanded": {\n validateSupportedRole(attr.name, kAriaExpandedRoles, role);\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.expanded = attr.op === "" ? true : attr.value;\n break;\n }\n case "level": {\n validateSupportedRole(attr.name, kAriaLevelRoles, role);\n if (typeof attr.value === "string")\n attr.value = +attr.value;\n if (attr.op !== "=" || typeof attr.value !== "number" || Number.isNaN(attr.value))\n throw new Error(`"level" attribute must be compared to a number`);\n options.level = attr.value;\n break;\n }\n case "disabled": {\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.disabled = attr.op === "" ? true : attr.value;\n break;\n }\n case "name": {\n if (attr.op === "")\n throw new Error(`"name" attribute must have a value`);\n if (typeof attr.value !== "string" && !(attr.value instanceof RegExp))\n throw new Error(`"name" attribute must be a string or a regular expression`);\n options.name = attr.value;\n options.nameOp = attr.op;\n options.exact = attr.caseSensitive;\n break;\n }\n case "include-hidden": {\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.includeHidden = attr.op === "" ? true : attr.value;\n break;\n }\n default: {\n throw new Error(`Unknown attribute "${attr.name}", must be one of ${kSupportedAttributes.map((a) => `"${a}"`).join(", ")}.`);\n }\n }\n }\n return options;\n}\nfunction queryRole(scope, options, internal) {\n const result = [];\n const match = (element) => {\n if (getAriaRole(element) !== options.role)\n return;\n if (options.selected !== void 0 && getAriaSelected(element) !== options.selected)\n return;\n if (options.checked !== void 0 && getAriaChecked(element) !== options.checked)\n return;\n if (options.pressed !== void 0 && getAriaPressed(element) !== options.pressed)\n return;\n if (options.expanded !== void 0 && getAriaExpanded(element) !== options.expanded)\n return;\n if (options.level !== void 0 && getAriaLevel(element) !== options.level)\n return;\n if (options.disabled !== void 0 && getAriaDisabled(element) !== options.disabled)\n return;\n if (!options.includeHidden) {\n const isHidden = isElementHiddenForAria(element);\n if (isHidden)\n return;\n }\n if (options.name !== void 0) {\n const accessibleName = normalizeWhiteSpace(getElementAccessibleName(element, !!options.includeHidden));\n if (typeof options.name === "string")\n options.name = normalizeWhiteSpace(options.name);\n if (internal && !options.exact && options.nameOp === "=")\n options.nameOp = "*=";\n if (!matchesAttributePart(accessibleName, { name: "", jsonPath: [], op: options.nameOp || "=", value: options.name, caseSensitive: !!options.exact }))\n return;\n }\n result.push(element);\n };\n const query = (root) => {\n const shadows = [];\n if (root.shadowRoot)\n shadows.push(root.shadowRoot);\n for (const element of root.querySelectorAll("*")) {\n match(element);\n if (element.shadowRoot)\n shadows.push(element.shadowRoot);\n }\n shadows.forEach(query);\n };\n query(scope);\n return result;\n}\nfunction createRoleEngine(internal) {\n return {\n queryAll: (scope, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n const role = parsed.name.toLowerCase();\n if (!role)\n throw new Error(`Role must not be empty`);\n const options = validateAttributes(parsed.attributes, role);\n beginAriaCaches();\n try {\n return queryRole(scope, options, internal);\n } finally {\n endAriaCaches();\n }\n }\n };\n}\n\n// packages/injected/src/selectorEvaluator.ts\nvar SelectorEvaluatorImpl = class {\n constructor() {\n this._retainCacheCounter = 0;\n this._cacheText = /* @__PURE__ */ new Map();\n this._cacheQueryCSS = /* @__PURE__ */ new Map();\n this._cacheMatches = /* @__PURE__ */ new Map();\n this._cacheQuery = /* @__PURE__ */ new Map();\n this._cacheMatchesSimple = /* @__PURE__ */ new Map();\n this._cacheMatchesParents = /* @__PURE__ */ new Map();\n this._cacheCallMatches = /* @__PURE__ */ new Map();\n this._cacheCallQuery = /* @__PURE__ */ new Map();\n this._cacheQuerySimple = /* @__PURE__ */ new Map();\n this._engines = /* @__PURE__ */ new Map();\n this._engines.set("not", notEngine);\n this._engines.set("is", isEngine);\n this._engines.set("where", isEngine);\n this._engines.set("has", hasEngine);\n this._engines.set("scope", scopeEngine);\n this._engines.set("light", lightEngine);\n this._engines.set("visible", visibleEngine);\n this._engines.set("text", textEngine);\n this._engines.set("text-is", textIsEngine);\n this._engines.set("text-matches", textMatchesEngine);\n this._engines.set("has-text", hasTextEngine);\n this._engines.set("right-of", createLayoutEngine("right-of"));\n this._engines.set("left-of", createLayoutEngine("left-of"));\n this._engines.set("above", createLayoutEngine("above"));\n this._engines.set("below", createLayoutEngine("below"));\n this._engines.set("near", createLayoutEngine("near"));\n this._engines.set("nth-match", nthMatchEngine);\n const allNames = [...this._engines.keys()];\n allNames.sort();\n const parserNames = [...customCSSNames];\n parserNames.sort();\n if (allNames.join("|") !== parserNames.join("|"))\n throw new Error(`Please keep customCSSNames in sync with evaluator engines: ${allNames.join("|")} vs ${parserNames.join("|")}`);\n }\n begin() {\n ++this._retainCacheCounter;\n }\n end() {\n --this._retainCacheCounter;\n if (!this._retainCacheCounter) {\n this._cacheQueryCSS.clear();\n this._cacheMatches.clear();\n this._cacheQuery.clear();\n this._cacheMatchesSimple.clear();\n this._cacheMatchesParents.clear();\n this._cacheCallMatches.clear();\n this._cacheCallQuery.clear();\n this._cacheQuerySimple.clear();\n this._cacheText.clear();\n }\n }\n _cached(cache, main, rest, cb) {\n if (!cache.has(main))\n cache.set(main, []);\n const entries = cache.get(main);\n const entry = entries.find((e) => rest.every((value, index) => e.rest[index] === value));\n if (entry)\n return entry.result;\n const result = cb();\n entries.push({ rest, result });\n return result;\n }\n _checkSelector(s) {\n const wellFormed = typeof s === "object" && s && (Array.isArray(s) || "simples" in s && s.simples.length);\n if (!wellFormed)\n throw new Error(`Malformed selector "${s}"`);\n return s;\n }\n matches(element, s, context) {\n const selector = this._checkSelector(s);\n this.begin();\n try {\n return this._cached(this._cacheMatches, element, [selector, context.scope, context.pierceShadow, context.originalScope], () => {\n if (Array.isArray(selector))\n return this._matchesEngine(isEngine, element, selector, context);\n if (this._hasScopeClause(selector))\n context = this._expandContextForScopeMatching(context);\n if (!this._matchesSimple(element, selector.simples[selector.simples.length - 1].selector, context))\n return false;\n return this._matchesParents(element, selector, selector.simples.length - 2, context);\n });\n } finally {\n this.end();\n }\n }\n query(context, s) {\n const selector = this._checkSelector(s);\n this.begin();\n try {\n return this._cached(this._cacheQuery, selector, [context.scope, context.pierceShadow, context.originalScope], () => {\n if (Array.isArray(selector))\n return this._queryEngine(isEngine, context, selector);\n if (this._hasScopeClause(selector))\n context = this._expandContextForScopeMatching(context);\n const previousScoreMap = this._scoreMap;\n this._scoreMap = /* @__PURE__ */ new Map();\n let elements = this._querySimple(context, selector.simples[selector.simples.length - 1].selector);\n elements = elements.filter((element) => this._matchesParents(element, selector, selector.simples.length - 2, context));\n if (this._scoreMap.size) {\n elements.sort((a, b) => {\n const aScore = this._scoreMap.get(a);\n const bScore = this._scoreMap.get(b);\n if (aScore === bScore)\n return 0;\n if (aScore === void 0)\n return 1;\n if (bScore === void 0)\n return -1;\n return aScore - bScore;\n });\n }\n this._scoreMap = previousScoreMap;\n return elements;\n });\n } finally {\n this.end();\n }\n }\n _markScore(element, score) {\n if (this._scoreMap)\n this._scoreMap.set(element, score);\n }\n _hasScopeClause(selector) {\n return selector.simples.some((simple) => simple.selector.functions.some((f) => f.name === "scope"));\n }\n _expandContextForScopeMatching(context) {\n if (context.scope.nodeType !== 1)\n return context;\n const scope = parentElementOrShadowHost(context.scope);\n if (!scope)\n return context;\n return { ...context, scope, originalScope: context.originalScope || context.scope };\n }\n _matchesSimple(element, simple, context) {\n return this._cached(this._cacheMatchesSimple, element, [simple, context.scope, context.pierceShadow, context.originalScope], () => {\n if (element === context.scope)\n return false;\n if (simple.css && !this._matchesCSS(element, simple.css))\n return false;\n for (const func of simple.functions) {\n if (!this._matchesEngine(this._getEngine(func.name), element, func.args, context))\n return false;\n }\n return true;\n });\n }\n _querySimple(context, simple) {\n if (!simple.functions.length)\n return this._queryCSS(context, simple.css || "*");\n return this._cached(this._cacheQuerySimple, simple, [context.scope, context.pierceShadow, context.originalScope], () => {\n let css = simple.css;\n const funcs = simple.functions;\n if (css === "*" && funcs.length)\n css = void 0;\n let elements;\n let firstIndex = -1;\n if (css !== void 0) {\n elements = this._queryCSS(context, css);\n } else {\n firstIndex = funcs.findIndex((func) => this._getEngine(func.name).query !== void 0);\n if (firstIndex === -1)\n firstIndex = 0;\n elements = this._queryEngine(this._getEngine(funcs[firstIndex].name), context, funcs[firstIndex].args);\n }\n for (let i = 0; i < funcs.length; i++) {\n if (i === firstIndex)\n continue;\n const engine = this._getEngine(funcs[i].name);\n if (engine.matches !== void 0)\n elements = elements.filter((e) => this._matchesEngine(engine, e, funcs[i].args, context));\n }\n for (let i = 0; i < funcs.length; i++) {\n if (i === firstIndex)\n continue;\n const engine = this._getEngine(funcs[i].name);\n if (engine.matches === void 0)\n elements = elements.filter((e) => this._matchesEngine(engine, e, funcs[i].args, context));\n }\n return elements;\n });\n }\n _matchesParents(element, complex, index, context) {\n if (index < 0)\n return true;\n return this._cached(this._cacheMatchesParents, element, [complex, index, context.scope, context.pierceShadow, context.originalScope], () => {\n const { selector: simple, combinator } = complex.simples[index];\n if (combinator === ">") {\n const parent = parentElementOrShadowHostInContext(element, context);\n if (!parent || !this._matchesSimple(parent, simple, context))\n return false;\n return this._matchesParents(parent, complex, index - 1, context);\n }\n if (combinator === "+") {\n const previousSibling = previousSiblingInContext(element, context);\n if (!previousSibling || !this._matchesSimple(previousSibling, simple, context))\n return false;\n return this._matchesParents(previousSibling, complex, index - 1, context);\n }\n if (combinator === "") {\n let parent = parentElementOrShadowHostInContext(element, context);\n while (parent) {\n if (this._matchesSimple(parent, simple, context)) {\n if (this._matchesParents(parent, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "")\n break;\n }\n parent = parentElementOrShadowHostInContext(parent, context);\n }\n return false;\n }\n if (combinator === "~") {\n let previousSibling = previousSiblingInContext(element, context);\n while (previousSibling) {\n if (this._matchesSimple(previousSibling, simple, context)) {\n if (this._matchesParents(previousSibling, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "~")\n break;\n }\n previousSibling = previousSiblingInContext(previousSibling, context);\n }\n return false;\n }\n if (combinator === ">=") {\n let parent = element;\n while (parent) {\n if (this._matchesSimple(parent, simple, context)) {\n if (this._matchesParents(parent, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "")\n break;\n }\n parent = parentElementOrShadowHostInContext(parent, context);\n }\n return false;\n }\n throw new Error(`Unsupported combinator "${combinator}"`);\n });\n }\n _matchesEngine(engine, element, args, context) {\n if (engine.matches)\n return this._callMatches(engine, element, args, context);\n if (engine.query)\n return this._callQuery(engine, args, context).includes(element);\n throw new Error(`Selector engine should implement "matches" or "query"`);\n }\n _queryEngine(engine, context, args) {\n if (engine.query)\n return this._callQuery(engine, args, context);\n if (engine.matches)\n return this._queryCSS(context, "*").filter((element) => this._callMatches(engine, element, args, context));\n throw new Error(`Selector engine should implement "matches" or "query"`);\n }\n _callMatches(engine, element, args, context) {\n return this._cached(this._cacheCallMatches, element, [engine, context.scope, context.pierceShadow, context.originalScope, ...args], () => {\n return engine.matches(element, args, context, this);\n });\n }\n _callQuery(engine, args, context) {\n return this._cached(this._cacheCallQuery, engine, [context.scope, context.pierceShadow, context.originalScope, ...args], () => {\n return engine.query(context, args, this);\n });\n }\n _matchesCSS(element, css) {\n return element.matches(css);\n }\n _queryCSS(context, css) {\n return this._cached(this._cacheQueryCSS, css, [context.scope, context.pierceShadow, context.originalScope], () => {\n let result = [];\n function query(root) {\n result = result.concat([...root.querySelectorAll(css)]);\n if (!context.pierceShadow)\n return;\n if (root.shadowRoot)\n query(root.shadowRoot);\n for (const element of root.querySelectorAll("*")) {\n if (element.shadowRoot)\n query(element.shadowRoot);\n }\n }\n query(context.scope);\n return result;\n });\n }\n _getEngine(name) {\n const engine = this._engines.get(name);\n if (!engine)\n throw new Error(`Unknown selector engine "${name}"`);\n return engine;\n }\n};\nvar isEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"is" engine expects non-empty selector list`);\n return args.some((selector) => evaluator.matches(element, selector, context));\n },\n query(context, args, evaluator) {\n if (args.length === 0)\n throw new Error(`"is" engine expects non-empty selector list`);\n let elements = [];\n for (const arg of args)\n elements = elements.concat(evaluator.query(context, arg));\n return args.length === 1 ? elements : sortInDOMOrder(elements);\n }\n};\nvar hasEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"has" engine expects non-empty selector list`);\n return evaluator.query({ ...context, scope: element }, args).length > 0;\n }\n // TODO: we can implement efficient "query" by matching "args" and returning\n // all parents/descendants, just have to be careful with the ":scope" matching.\n};\nvar scopeEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 0)\n throw new Error(`"scope" engine expects no arguments`);\n const actualScope = context.originalScope || context.scope;\n if (actualScope.nodeType === 9)\n return element === actualScope.documentElement;\n return element === actualScope;\n },\n query(context, args, evaluator) {\n if (args.length !== 0)\n throw new Error(`"scope" engine expects no arguments`);\n const actualScope = context.originalScope || context.scope;\n if (actualScope.nodeType === 9) {\n const root = actualScope.documentElement;\n return root ? [root] : [];\n }\n if (actualScope.nodeType === 1)\n return [actualScope];\n return [];\n }\n};\nvar notEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"not" engine expects non-empty selector list`);\n return !evaluator.matches(element, args, context);\n }\n};\nvar lightEngine = {\n query(context, args, evaluator) {\n return evaluator.query({ ...context, pierceShadow: false }, args);\n },\n matches(element, args, context, evaluator) {\n return evaluator.matches(element, args, { ...context, pierceShadow: false });\n }\n};\nvar visibleEngine = {\n matches(element, args, context, evaluator) {\n if (args.length)\n throw new Error(`"visible" engine expects no arguments`);\n return isElementVisible(element);\n }\n};\nvar textEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"text" engine expects a single string`);\n const text = normalizeWhiteSpace(args[0]).toLowerCase();\n const matcher = (elementText2) => elementText2.normalized.toLowerCase().includes(text);\n return elementMatchesText(evaluator._cacheText, element, matcher) === "self";\n }\n};\nvar textIsEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"text-is" engine expects a single string`);\n const text = normalizeWhiteSpace(args[0]);\n const matcher = (elementText2) => {\n if (!text && !elementText2.immediate.length)\n return true;\n return elementText2.immediate.some((s) => normalizeWhiteSpace(s) === text);\n };\n return elementMatchesText(evaluator._cacheText, element, matcher) !== "none";\n }\n};\nvar textMatchesEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0 || typeof args[0] !== "string" || args.length > 2 || args.length === 2 && typeof args[1] !== "string")\n throw new Error(`"text-matches" engine expects a regexp body and optional regexp flags`);\n const re = new RegExp(args[0], args.length === 2 ? args[1] : void 0);\n const matcher = (elementText2) => re.test(elementText2.full);\n return elementMatchesText(evaluator._cacheText, element, matcher) === "self";\n }\n};\nvar hasTextEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"has-text" engine expects a single string`);\n if (shouldSkipForTextMatching(element))\n return false;\n const text = normalizeWhiteSpace(args[0]).toLowerCase();\n const matcher = (elementText2) => elementText2.normalized.toLowerCase().includes(text);\n return matcher(elementText(evaluator._cacheText, element));\n }\n};\nfunction createLayoutEngine(name) {\n return {\n matches(element, args, context, evaluator) {\n const maxDistance = args.length && typeof args[args.length - 1] === "number" ? args[args.length - 1] : void 0;\n const queryArgs = maxDistance === void 0 ? args : args.slice(0, args.length - 1);\n if (args.length < 1 + (maxDistance === void 0 ? 0 : 1))\n throw new Error(`"${name}" engine expects a selector list and optional maximum distance in pixels`);\n const inner = evaluator.query(context, queryArgs);\n const score = layoutSelectorScore(name, element, inner, maxDistance);\n if (score === void 0)\n return false;\n evaluator._markScore(element, score);\n return true;\n }\n };\n}\nvar nthMatchEngine = {\n query(context, args, evaluator) {\n let index = args[args.length - 1];\n if (args.length < 2)\n throw new Error(`"nth-match" engine expects non-empty selector list and an index argument`);\n if (typeof index !== "number" || index < 1)\n throw new Error(`"nth-match" engine expects a one-based index as the last argument`);\n const elements = isEngine.query(context, args.slice(0, args.length - 1), evaluator);\n index--;\n return index < elements.length ? [elements[index]] : [];\n }\n};\nfunction parentElementOrShadowHostInContext(element, context) {\n if (element === context.scope)\n return;\n if (!context.pierceShadow)\n return element.parentElement || void 0;\n return parentElementOrShadowHost(element);\n}\nfunction previousSiblingInContext(element, context) {\n if (element === context.scope)\n return;\n return element.previousElementSibling || void 0;\n}\nfunction sortInDOMOrder(elements) {\n const elementToEntry = /* @__PURE__ */ new Map();\n const roots = [];\n const result = [];\n function append(element) {\n let entry = elementToEntry.get(element);\n if (entry)\n return entry;\n const parent = parentElementOrShadowHost(element);\n if (parent) {\n const parentEntry = append(parent);\n parentEntry.children.push(element);\n } else {\n roots.push(element);\n }\n entry = { children: [], taken: false };\n elementToEntry.set(element, entry);\n return entry;\n }\n for (const e of elements)\n append(e).taken = true;\n function visit(element) {\n const entry = elementToEntry.get(element);\n if (entry.taken)\n result.push(element);\n if (entry.children.length > 1) {\n const set = new Set(entry.children);\n entry.children = [];\n let child = element.firstElementChild;\n while (child && entry.children.length < set.size) {\n if (set.has(child))\n entry.children.push(child);\n child = child.nextElementSibling;\n }\n child = element.shadowRoot ? element.shadowRoot.firstElementChild : null;\n while (child && entry.children.length < set.size) {\n if (set.has(child))\n entry.children.push(child);\n child = child.nextElementSibling;\n }\n }\n entry.children.forEach(visit);\n }\n roots.forEach(visit);\n return result;\n}\n\n// packages/injected/src/selectorGenerator.ts\nvar kTextScoreRange = 10;\nvar kExactPenalty = kTextScoreRange / 2;\nvar kTestIdScore = 1;\nvar kOtherTestIdScore = 2;\nvar kIframeByAttributeScore = 10;\nvar kBeginPenalizedScore = 50;\nvar kRoleWithNameScore = 100;\nvar kPlaceholderScore = 120;\nvar kLabelScore = 140;\nvar kAltTextScore = 160;\nvar kTextScore = 180;\nvar kTitleScore = 200;\nvar kTextScoreRegex = 250;\nvar kPlaceholderScoreExact = kPlaceholderScore + kExactPenalty;\nvar kLabelScoreExact = kLabelScore + kExactPenalty;\nvar kRoleWithNameScoreExact = kRoleWithNameScore + kExactPenalty;\nvar kAltTextScoreExact = kAltTextScore + kExactPenalty;\nvar kTextScoreExact = kTextScore + kExactPenalty;\nvar kTitleScoreExact = kTitleScore + kExactPenalty;\nvar kEndPenalizedScore = 300;\nvar kCSSIdScore = 500;\nvar kRoleWithoutNameScore = 510;\nvar kCSSInputTypeNameScore = 520;\nvar kCSSTagNameScore = 530;\nvar kNthScore = 1e4;\nvar kCSSFallbackScore = 1e7;\nvar kScoreThresholdForTextExpect = 1e3;\nfunction generateSelector(injectedScript, targetElement, options) {\n var _a;\n injectedScript._evaluator.begin();\n const cache = { allowText: /* @__PURE__ */ new Map(), disallowText: /* @__PURE__ */ new Map() };\n beginAriaCaches();\n try {\n let selectors = [];\n if (options.forTextExpect) {\n let targetTokens = cssFallback(injectedScript, targetElement.ownerDocument.documentElement, options);\n for (let element = targetElement; element; element = parentElementOrShadowHost(element)) {\n const tokens = generateSelectorFor(cache, injectedScript, element, { ...options, noText: true });\n if (!tokens)\n continue;\n const score = combineScores(tokens);\n if (score <= kScoreThresholdForTextExpect) {\n targetTokens = tokens;\n break;\n }\n }\n selectors = [joinTokens(targetTokens)];\n } else {\n if (!targetElement.matches("input,textarea,select") && !targetElement.isContentEditable) {\n const interactiveParent = closestCrossShadow(targetElement, "button,select,input,[role=button],[role=checkbox],[role=radio],a,[role=link]", options.root);\n if (interactiveParent && isElementVisible(interactiveParent))\n targetElement = interactiveParent;\n }\n if (options.multiple) {\n const withText = generateSelectorFor(cache, injectedScript, targetElement, options);\n const withoutText = generateSelectorFor(cache, injectedScript, targetElement, { ...options, noText: true });\n let tokens = [withText, withoutText];\n cache.allowText.clear();\n cache.disallowText.clear();\n if (withText && hasCSSIdToken(withText))\n tokens.push(generateSelectorFor(cache, injectedScript, targetElement, { ...options, noCSSId: true }));\n if (withoutText && hasCSSIdToken(withoutText))\n tokens.push(generateSelectorFor(cache, injectedScript, targetElement, { ...options, noText: true, noCSSId: true }));\n tokens = tokens.filter(Boolean);\n if (!tokens.length) {\n const css = cssFallback(injectedScript, targetElement, options);\n tokens.push(css);\n if (hasCSSIdToken(css))\n tokens.push(cssFallback(injectedScript, targetElement, { ...options, noCSSId: true }));\n }\n selectors = [...new Set(tokens.map((t) => joinTokens(t)))];\n } else {\n const targetTokens = generateSelectorFor(cache, injectedScript, targetElement, options) || cssFallback(injectedScript, targetElement, options);\n selectors = [joinTokens(targetTokens)];\n }\n }\n const selector = selectors[0];\n const parsedSelector = injectedScript.parseSelector(selector);\n return {\n selector,\n selectors,\n elements: injectedScript.querySelectorAll(parsedSelector, (_a = options.root) != null ? _a : targetElement.ownerDocument)\n };\n } finally {\n endAriaCaches();\n injectedScript._evaluator.end();\n }\n}\nfunction filterRegexTokens(textCandidates) {\n return textCandidates.filter((c) => c[0].selector[0] !== "/");\n}\nfunction generateSelectorFor(cache, injectedScript, targetElement, options) {\n if (options.root && !isInsideScope(options.root, targetElement))\n throw new Error(`Target element must belong to the root\'s subtree`);\n if (targetElement === options.root)\n return [{ engine: "css", selector: ":scope", score: 1 }];\n if (targetElement.ownerDocument.documentElement === targetElement)\n return [{ engine: "css", selector: "html", score: 1 }];\n const calculate = (element, allowText) => {\n var _a;\n const allowNthMatch = element === targetElement;\n let textCandidates = allowText ? buildTextCandidates(injectedScript, element, element === targetElement) : [];\n if (element !== targetElement) {\n textCandidates = filterRegexTokens(textCandidates);\n }\n const noTextCandidates = buildNoTextCandidates(injectedScript, element, options).filter((token) => !options.omitInternalEngines || !token.engine.startsWith("internal:")).map((token) => [token]);\n let result = chooseFirstSelector(injectedScript, (_a = options.root) != null ? _a : targetElement.ownerDocument, element, [...textCandidates, ...noTextCandidates], allowNthMatch);\n textCandidates = filterRegexTokens(textCandidates);\n const checkWithText = (textCandidatesToUse) => {\n const allowParentText = allowText && !textCandidatesToUse.length;\n const candidates = [...textCandidatesToUse, ...noTextCandidates].filter((c) => {\n if (!result)\n return true;\n return combineScores(c) < combineScores(result);\n });\n let bestPossibleInParent = candidates[0];\n if (!bestPossibleInParent)\n return;\n for (let parent = parentElementOrShadowHost(element); parent && parent !== options.root; parent = parentElementOrShadowHost(parent)) {\n const parentTokens = calculateCached(parent, allowParentText);\n if (!parentTokens)\n continue;\n if (result && combineScores([...parentTokens, ...bestPossibleInParent]) >= combineScores(result))\n continue;\n bestPossibleInParent = chooseFirstSelector(injectedScript, parent, element, candidates, allowNthMatch);\n if (!bestPossibleInParent)\n return;\n const combined = [...parentTokens, ...bestPossibleInParent];\n if (!result || combineScores(combined) < combineScores(result))\n result = combined;\n }\n };\n checkWithText(textCandidates);\n if (element === targetElement && textCandidates.length)\n checkWithText([]);\n return result;\n };\n const calculateCached = (element, allowText) => {\n const map = allowText ? cache.allowText : cache.disallowText;\n let value = map.get(element);\n if (value === void 0) {\n value = calculate(element, allowText);\n map.set(element, value);\n }\n return value;\n };\n return calculate(targetElement, !options.noText);\n}\nfunction buildNoTextCandidates(injectedScript, element, options) {\n const candidates = [];\n {\n for (const attr of ["data-testid", "data-test-id", "data-test"]) {\n if (attr !== options.testIdAttributeName && element.getAttribute(attr))\n candidates.push({ engine: "css", selector: `[${attr}=${quoteCSSAttributeValue(element.getAttribute(attr))}]`, score: kOtherTestIdScore });\n }\n if (!options.noCSSId) {\n const idAttr = element.getAttribute("id");\n if (idAttr && !isGuidLike(idAttr))\n candidates.push({ engine: "css", selector: makeSelectorForId(idAttr), score: kCSSIdScore });\n }\n candidates.push({ engine: "css", selector: escapeNodeName(element), score: kCSSTagNameScore });\n }\n if (element.nodeName === "IFRAME") {\n for (const attribute of ["name", "title"]) {\n if (element.getAttribute(attribute))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[${attribute}=${quoteCSSAttributeValue(element.getAttribute(attribute))}]`, score: kIframeByAttributeScore });\n }\n if (element.getAttribute(options.testIdAttributeName))\n candidates.push({ engine: "css", selector: `[${options.testIdAttributeName}=${quoteCSSAttributeValue(element.getAttribute(options.testIdAttributeName))}]`, score: kTestIdScore });\n penalizeScoreForLength([candidates]);\n return candidates;\n }\n if (element.getAttribute(options.testIdAttributeName))\n candidates.push({ engine: "internal:testid", selector: `[${options.testIdAttributeName}=${escapeForAttributeSelector(element.getAttribute(options.testIdAttributeName), true)}]`, score: kTestIdScore });\n if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") {\n const input = element;\n if (input.placeholder) {\n candidates.push({ engine: "internal:attr", selector: `[placeholder=${escapeForAttributeSelector(input.placeholder, true)}]`, score: kPlaceholderScoreExact });\n for (const alternative of suitableTextAlternatives(input.placeholder))\n candidates.push({ engine: "internal:attr", selector: `[placeholder=${escapeForAttributeSelector(alternative.text, false)}]`, score: kPlaceholderScore - alternative.scoreBonus });\n }\n }\n const labels = getElementLabels(injectedScript._evaluator._cacheText, element);\n for (const label of labels) {\n const labelText = label.normalized;\n candidates.push({ engine: "internal:label", selector: escapeForTextSelector(labelText, true), score: kLabelScoreExact });\n for (const alternative of suitableTextAlternatives(labelText))\n candidates.push({ engine: "internal:label", selector: escapeForTextSelector(alternative.text, false), score: kLabelScore - alternative.scoreBonus });\n }\n const ariaRole = getAriaRole(element);\n if (ariaRole && !["none", "presentation"].includes(ariaRole))\n candidates.push({ engine: "internal:role", selector: ariaRole, score: kRoleWithoutNameScore });\n if (element.getAttribute("name") && ["BUTTON", "FORM", "FIELDSET", "FRAME", "IFRAME", "INPUT", "KEYGEN", "OBJECT", "OUTPUT", "SELECT", "TEXTAREA", "MAP", "META", "PARAM"].includes(element.nodeName))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[name=${quoteCSSAttributeValue(element.getAttribute("name"))}]`, score: kCSSInputTypeNameScore });\n if (["INPUT", "TEXTAREA"].includes(element.nodeName) && element.getAttribute("type") !== "hidden") {\n if (element.getAttribute("type"))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[type=${quoteCSSAttributeValue(element.getAttribute("type"))}]`, score: kCSSInputTypeNameScore });\n }\n if (["INPUT", "TEXTAREA", "SELECT"].includes(element.nodeName) && element.getAttribute("type") !== "hidden")\n candidates.push({ engine: "css", selector: escapeNodeName(element), score: kCSSInputTypeNameScore + 1 });\n penalizeScoreForLength([candidates]);\n return candidates;\n}\nfunction buildTextCandidates(injectedScript, element, isTargetNode) {\n if (element.nodeName === "SELECT")\n return [];\n const candidates = [];\n const title = element.getAttribute("title");\n if (title) {\n candidates.push([{ engine: "internal:attr", selector: `[title=${escapeForAttributeSelector(title, true)}]`, score: kTitleScoreExact }]);\n for (const alternative of suitableTextAlternatives(title))\n candidates.push([{ engine: "internal:attr", selector: `[title=${escapeForAttributeSelector(alternative.text, false)}]`, score: kTitleScore - alternative.scoreBonus }]);\n }\n const alt = element.getAttribute("alt");\n if (alt && ["APPLET", "AREA", "IMG", "INPUT"].includes(element.nodeName)) {\n candidates.push([{ engine: "internal:attr", selector: `[alt=${escapeForAttributeSelector(alt, true)}]`, score: kAltTextScoreExact }]);\n for (const alternative of suitableTextAlternatives(alt))\n candidates.push([{ engine: "internal:attr", selector: `[alt=${escapeForAttributeSelector(alternative.text, false)}]`, score: kAltTextScore - alternative.scoreBonus }]);\n }\n const text = elementText(injectedScript._evaluator._cacheText, element).normalized;\n const textAlternatives = text ? suitableTextAlternatives(text) : [];\n if (text) {\n if (isTargetNode) {\n if (text.length <= 80)\n candidates.push([{ engine: "internal:text", selector: escapeForTextSelector(text, true), score: kTextScoreExact }]);\n for (const alternative of textAlternatives)\n candidates.push([{ engine: "internal:text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n }\n const cssToken = { engine: "css", selector: escapeNodeName(element), score: kCSSTagNameScore };\n for (const alternative of textAlternatives)\n candidates.push([cssToken, { engine: "internal:has-text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n if (text.length <= 80) {\n const re = new RegExp("^" + escapeRegExp(text) + "$");\n candidates.push([cssToken, { engine: "internal:has-text", selector: escapeForTextSelector(re, false), score: kTextScoreRegex }]);\n }\n }\n const ariaRole = getAriaRole(element);\n if (ariaRole && !["none", "presentation"].includes(ariaRole)) {\n const ariaName = getElementAccessibleName(element, false);\n if (ariaName) {\n const roleToken = { engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(ariaName, true)}]`, score: kRoleWithNameScoreExact };\n candidates.push([roleToken]);\n for (const alternative of suitableTextAlternatives(ariaName))\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(alternative.text, false)}]`, score: kRoleWithNameScore - alternative.scoreBonus }]);\n } else {\n const roleToken = { engine: "internal:role", selector: `${ariaRole}`, score: kRoleWithoutNameScore };\n for (const alternative of textAlternatives)\n candidates.push([roleToken, { engine: "internal:has-text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n if (text.length <= 80) {\n const re = new RegExp("^" + escapeRegExp(text) + "$");\n candidates.push([roleToken, { engine: "internal:has-text", selector: escapeForTextSelector(re, false), score: kTextScoreRegex }]);\n }\n }\n }\n penalizeScoreForLength(candidates);\n return candidates;\n}\nfunction makeSelectorForId(id) {\n return /^[a-zA-Z][a-zA-Z0-9\\-\\_]+$/.test(id) ? "#" + id : `[id=${quoteCSSAttributeValue(id)}]`;\n}\nfunction hasCSSIdToken(tokens) {\n return tokens.some((token) => token.engine === "css" && (token.selector.startsWith("#") || token.selector.startsWith(\'[id="\')));\n}\nfunction cssFallback(injectedScript, targetElement, options) {\n var _a;\n const root = (_a = options.root) != null ? _a : targetElement.ownerDocument;\n const tokens = [];\n function uniqueCSSSelector(prefix) {\n const path = tokens.slice();\n if (prefix)\n path.unshift(prefix);\n const selector = path.join(" > ");\n const parsedSelector = injectedScript.parseSelector(selector);\n const node = injectedScript.querySelector(parsedSelector, root, false);\n return node === targetElement ? selector : void 0;\n }\n function makeStrict(selector) {\n const token = { engine: "css", selector, score: kCSSFallbackScore };\n const parsedSelector = injectedScript.parseSelector(selector);\n const elements = injectedScript.querySelectorAll(parsedSelector, root);\n if (elements.length === 1)\n return [token];\n const nth = { engine: "nth", selector: String(elements.indexOf(targetElement)), score: kNthScore };\n return [token, nth];\n }\n for (let element = targetElement; element && element !== root; element = parentElementOrShadowHost(element)) {\n let bestTokenForLevel = "";\n if (element.id && !options.noCSSId) {\n const token = makeSelectorForId(element.id);\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n bestTokenForLevel = token;\n }\n const parent = element.parentNode;\n const classes = [...element.classList].map(escapeClassName);\n for (let i = 0; i < classes.length; ++i) {\n const token = "." + classes.slice(0, i + 1).join(".");\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n if (!bestTokenForLevel && parent) {\n const sameClassSiblings = parent.querySelectorAll(token);\n if (sameClassSiblings.length === 1)\n bestTokenForLevel = token;\n }\n }\n if (parent) {\n const siblings = [...parent.children];\n const nodeName = element.nodeName;\n const sameTagSiblings = siblings.filter((sibling) => sibling.nodeName === nodeName);\n const token = sameTagSiblings.indexOf(element) === 0 ? escapeNodeName(element) : `${escapeNodeName(element)}:nth-child(${1 + siblings.indexOf(element)})`;\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n if (!bestTokenForLevel)\n bestTokenForLevel = token;\n } else if (!bestTokenForLevel) {\n bestTokenForLevel = escapeNodeName(element);\n }\n tokens.unshift(bestTokenForLevel);\n }\n return makeStrict(uniqueCSSSelector());\n}\nfunction penalizeScoreForLength(groups) {\n for (const group of groups) {\n for (const token of group) {\n if (token.score > kBeginPenalizedScore && token.score < kEndPenalizedScore)\n token.score += Math.min(kTextScoreRange, token.selector.length / 10 | 0);\n }\n }\n}\nfunction joinTokens(tokens) {\n const parts = [];\n let lastEngine = "";\n for (const { engine, selector } of tokens) {\n if (parts.length && (lastEngine !== "css" || engine !== "css" || selector.startsWith(":nth-match(")))\n parts.push(">>");\n lastEngine = engine;\n if (engine === "css")\n parts.push(selector);\n else\n parts.push(`${engine}=${selector}`);\n }\n return parts.join(" ");\n}\nfunction combineScores(tokens) {\n let score = 0;\n for (let i = 0; i < tokens.length; i++)\n score += tokens[i].score * (tokens.length - i);\n return score;\n}\nfunction chooseFirstSelector(injectedScript, scope, targetElement, selectors, allowNthMatch) {\n const joined = selectors.map((tokens) => ({ tokens, score: combineScores(tokens) }));\n joined.sort((a, b) => a.score - b.score);\n let bestWithIndex = null;\n for (const { tokens } of joined) {\n const parsedSelector = injectedScript.parseSelector(joinTokens(tokens));\n const result = injectedScript.querySelectorAll(parsedSelector, scope);\n if (result[0] === targetElement && result.length === 1) {\n return tokens;\n }\n const index = result.indexOf(targetElement);\n if (!allowNthMatch || bestWithIndex || index === -1 || result.length > 5)\n continue;\n const nth = { engine: "nth", selector: String(index), score: kNthScore };\n bestWithIndex = [...tokens, nth];\n }\n return bestWithIndex;\n}\nfunction isGuidLike(id) {\n let lastCharacterType;\n let transitionCount = 0;\n for (let i = 0; i < id.length; ++i) {\n const c = id[i];\n let characterType;\n if (c === "-" || c === "_")\n continue;\n if (c >= "a" && c <= "z")\n characterType = "lower";\n else if (c >= "A" && c <= "Z")\n characterType = "upper";\n else if (c >= "0" && c <= "9")\n characterType = "digit";\n else\n characterType = "other";\n if (characterType === "lower" && lastCharacterType === "upper") {\n lastCharacterType = characterType;\n continue;\n }\n if (lastCharacterType && lastCharacterType !== characterType)\n ++transitionCount;\n lastCharacterType = characterType;\n }\n return transitionCount >= id.length / 4;\n}\nfunction trimWordBoundary(text, maxLength) {\n if (text.length <= maxLength)\n return text;\n text = text.substring(0, maxLength);\n const match = text.match(/^(.*)\\b(.+?)$/);\n if (!match)\n return "";\n return match[1].trimEnd();\n}\nfunction suitableTextAlternatives(text) {\n let result = [];\n {\n const match = text.match(/^([\\d.,]+)[^.,\\w]/);\n const leadingNumberLength = match ? match[1].length : 0;\n if (leadingNumberLength) {\n const alt = trimWordBoundary(text.substring(leadingNumberLength).trimStart(), 80);\n result.push({ text: alt, scoreBonus: alt.length <= 30 ? 2 : 1 });\n }\n }\n {\n const match = text.match(/[^.,\\w]([\\d.,]+)$/);\n const trailingNumberLength = match ? match[1].length : 0;\n if (trailingNumberLength) {\n const alt = trimWordBoundary(text.substring(0, text.length - trailingNumberLength).trimEnd(), 80);\n result.push({ text: alt, scoreBonus: alt.length <= 30 ? 2 : 1 });\n }\n }\n if (text.length <= 30) {\n result.push({ text, scoreBonus: 0 });\n } else {\n result.push({ text: trimWordBoundary(text, 80), scoreBonus: 0 });\n result.push({ text: trimWordBoundary(text, 30), scoreBonus: 1 });\n }\n result = result.filter((r) => r.text);\n if (!result.length)\n result.push({ text: text.substring(0, 80), scoreBonus: 0 });\n return result;\n}\nfunction escapeNodeName(node) {\n return node.nodeName.toLocaleLowerCase().replace(/[:\\.]/g, (char) => "\\\\" + char);\n}\nfunction escapeClassName(className) {\n let result = "";\n for (let i = 0; i < className.length; i++)\n result += cssEscapeCharacter(className, i);\n return result;\n}\nfunction cssEscapeCharacter(s, i) {\n const c = s.charCodeAt(i);\n if (c === 0)\n return "\\uFFFD";\n if (c >= 1 && c <= 31 || c >= 48 && c <= 57 && (i === 0 || i === 1 && s.charCodeAt(0) === 45))\n return "\\\\" + c.toString(16) + " ";\n if (i === 0 && c === 45 && s.length === 1)\n return "\\\\" + s.charAt(i);\n if (c >= 128 || c === 45 || c === 95 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122)\n return s.charAt(i);\n return "\\\\" + s.charAt(i);\n}\n\n// packages/injected/src/vueSelectorEngine.ts\nfunction basename(filename, ext) {\n const normalized = filename.replace(/^[a-zA-Z]:/, "").replace(/\\\\/g, "/");\n let result = normalized.substring(normalized.lastIndexOf("/") + 1);\n if (ext && result.endsWith(ext))\n result = result.substring(0, result.length - ext.length);\n return result;\n}\nfunction toUpper(_, c) {\n return c ? c.toUpperCase() : "";\n}\nvar classifyRE = /(?:^|[-_/])(\\w)/g;\nvar classify = (str) => {\n return str && str.replace(classifyRE, toUpper);\n};\nfunction buildComponentsTreeVue3(instance) {\n function getComponentTypeName(options) {\n const name = options.name || options._componentTag || options.__playwright_guessedName;\n if (name)\n return name;\n const file = options.__file;\n if (file)\n return classify(basename(file, ".vue"));\n }\n function saveComponentName(instance2, key) {\n instance2.type.__playwright_guessedName = key;\n return key;\n }\n function getInstanceName(instance2) {\n var _a, _b, _c, _d;\n const name = getComponentTypeName(instance2.type || {});\n if (name)\n return name;\n if (instance2.root === instance2)\n return "Root";\n for (const key in (_b = (_a = instance2.parent) == null ? void 0 : _a.type) == null ? void 0 : _b.components) {\n if (((_c = instance2.parent) == null ? void 0 : _c.type.components[key]) === instance2.type)\n return saveComponentName(instance2, key);\n }\n for (const key in (_d = instance2.appContext) == null ? void 0 : _d.components) {\n if (instance2.appContext.components[key] === instance2.type)\n return saveComponentName(instance2, key);\n }\n return "Anonymous Component";\n }\n function isBeingDestroyed(instance2) {\n return instance2._isBeingDestroyed || instance2.isUnmounted;\n }\n function isFragment(instance2) {\n return instance2.subTree.type.toString() === "Symbol(Fragment)";\n }\n function getInternalInstanceChildren(subTree) {\n const list = [];\n if (subTree.component)\n list.push(subTree.component);\n if (subTree.suspense)\n list.push(...getInternalInstanceChildren(subTree.suspense.activeBranch));\n if (Array.isArray(subTree.children)) {\n subTree.children.forEach((childSubTree) => {\n if (childSubTree.component)\n list.push(childSubTree.component);\n else\n list.push(...getInternalInstanceChildren(childSubTree));\n });\n }\n return list.filter((child) => {\n var _a;\n return !isBeingDestroyed(child) && !((_a = child.type.devtools) == null ? void 0 : _a.hide);\n });\n }\n function getRootElementsFromComponentInstance(instance2) {\n if (isFragment(instance2))\n return getFragmentRootElements(instance2.subTree);\n return [instance2.subTree.el];\n }\n function getFragmentRootElements(vnode) {\n if (!vnode.children)\n return [];\n const list = [];\n for (let i = 0, l = vnode.children.length; i < l; i++) {\n const childVnode = vnode.children[i];\n if (childVnode.component)\n list.push(...getRootElementsFromComponentInstance(childVnode.component));\n else if (childVnode.el)\n list.push(childVnode.el);\n }\n return list;\n }\n function buildComponentsTree2(instance2) {\n return {\n name: getInstanceName(instance2),\n children: getInternalInstanceChildren(instance2.subTree).map(buildComponentsTree2),\n rootElements: getRootElementsFromComponentInstance(instance2),\n props: instance2.props\n };\n }\n return buildComponentsTree2(instance);\n}\nfunction buildComponentsTreeVue2(instance) {\n function getComponentName2(options) {\n const name = options.displayName || options.name || options._componentTag;\n if (name)\n return name;\n const file = options.__file;\n if (file)\n return classify(basename(file, ".vue"));\n }\n function getInstanceName(instance2) {\n const name = getComponentName2(instance2.$options || instance2.fnOptions || {});\n if (name)\n return name;\n return instance2.$root === instance2 ? "Root" : "Anonymous Component";\n }\n function getInternalInstanceChildren(instance2) {\n if (instance2.$children)\n return instance2.$children;\n if (Array.isArray(instance2.subTree.children))\n return instance2.subTree.children.filter((vnode) => !!vnode.component).map((vnode) => vnode.component);\n return [];\n }\n function buildComponentsTree2(instance2) {\n return {\n name: getInstanceName(instance2),\n children: getInternalInstanceChildren(instance2).map(buildComponentsTree2),\n rootElements: [instance2.$el],\n props: instance2._props\n };\n }\n return buildComponentsTree2(instance);\n}\nfunction filterComponentsTree2(treeNode, searchFn, result = []) {\n if (searchFn(treeNode))\n result.push(treeNode);\n for (const child of treeNode.children)\n filterComponentsTree2(child, searchFn, result);\n return result;\n}\nfunction findVueRoots(root, roots = []) {\n const document = root.ownerDocument || root;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const vue2Roots = /* @__PURE__ */ new Set();\n do {\n const node = walker.currentNode;\n if (node.__vue__)\n vue2Roots.add(node.__vue__.$root);\n if (node.__vue_app__ && node._vnode && node._vnode.component)\n roots.push({ root: node._vnode.component, version: 3 });\n const shadowRoot = node instanceof Element ? node.shadowRoot : null;\n if (shadowRoot)\n findVueRoots(shadowRoot, roots);\n } while (walker.nextNode());\n for (const vue2root of vue2Roots) {\n roots.push({\n version: 2,\n root: vue2root\n });\n }\n return roots;\n}\nvar createVueEngine = () => ({\n queryAll(scope, selector) {\n const document = scope.ownerDocument || scope;\n const { name, attributes } = parseAttributeSelector(selector, false);\n const vueRoots = findVueRoots(document);\n const trees = vueRoots.map((vueRoot) => vueRoot.version === 3 ? buildComponentsTreeVue3(vueRoot.root) : buildComponentsTreeVue2(vueRoot.root));\n const treeNodes = trees.map((tree) => filterComponentsTree2(tree, (treeNode) => {\n if (name && treeNode.name !== name)\n return false;\n if (treeNode.rootElements.some((rootElement) => !isInsideScope(scope, rootElement)))\n return false;\n for (const attr of attributes) {\n if (!matchesComponentAttribute(treeNode.props, attr))\n return false;\n }\n return true;\n })).flat();\n const allRootElements = /* @__PURE__ */ new Set();\n for (const treeNode of treeNodes) {\n for (const rootElement of treeNode.rootElements)\n allRootElements.add(rootElement);\n }\n return [...allRootElements];\n }\n});\n\n// packages/injected/src/xpathSelectorEngine.ts\nvar XPathEngine = {\n queryAll(root, selector) {\n if (selector.startsWith("/") && root.nodeType !== Node.DOCUMENT_NODE)\n selector = "." + selector;\n const result = [];\n const document = root.ownerDocument || root;\n if (!document)\n return result;\n const it = document.evaluate(selector, root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE);\n for (let node = it.iterateNext(); node; node = it.iterateNext()) {\n if (node.nodeType === Node.ELEMENT_NODE)\n result.push(node);\n }\n return result;\n }\n};\n\n// packages/playwright-core/src/utils/isomorphic/locatorUtils.ts\nfunction getByAttributeTextSelector(attrName, text, options) {\n return `internal:attr=[${attrName}=${escapeForAttributeSelector(text, (options == null ? void 0 : options.exact) || false)}]`;\n}\nfunction getByTestIdSelector(testIdAttributeName, testId) {\n return `internal:testid=[${testIdAttributeName}=${escapeForAttributeSelector(testId, true)}]`;\n}\nfunction getByLabelSelector(text, options) {\n return "internal:label=" + escapeForTextSelector(text, !!(options == null ? void 0 : options.exact));\n}\nfunction getByAltTextSelector(text, options) {\n return getByAttributeTextSelector("alt", text, options);\n}\nfunction getByTitleSelector(text, options) {\n return getByAttributeTextSelector("title", text, options);\n}\nfunction getByPlaceholderSelector(text, options) {\n return getByAttributeTextSelector("placeholder", text, options);\n}\nfunction getByTextSelector(text, options) {\n return "internal:text=" + escapeForTextSelector(text, !!(options == null ? void 0 : options.exact));\n}\nfunction getByRoleSelector(role, options = {}) {\n const props = [];\n if (options.checked !== void 0)\n props.push(["checked", String(options.checked)]);\n if (options.disabled !== void 0)\n props.push(["disabled", String(options.disabled)]);\n if (options.selected !== void 0)\n props.push(["selected", String(options.selected)]);\n if (options.expanded !== void 0)\n props.push(["expanded", String(options.expanded)]);\n if (options.includeHidden !== void 0)\n props.push(["include-hidden", String(options.includeHidden)]);\n if (options.level !== void 0)\n props.push(["level", String(options.level)]);\n if (options.name !== void 0)\n props.push(["name", escapeForAttributeSelector(options.name, !!options.exact)]);\n if (options.pressed !== void 0)\n props.push(["pressed", String(options.pressed)]);\n return `internal:role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join("")}`;\n}\n\n// packages/injected/src/consoleApi.ts\nvar selectorSymbol = Symbol("selector");\nselectorSymbol;\nvar _Locator = class _Locator {\n constructor(injectedScript, selector, options) {\n if (options == null ? void 0 : options.hasText)\n selector += ` >> internal:has-text=${escapeForTextSelector(options.hasText, false)}`;\n if (options == null ? void 0 : options.hasNotText)\n selector += ` >> internal:has-not-text=${escapeForTextSelector(options.hasNotText, false)}`;\n if (options == null ? void 0 : options.has)\n selector += ` >> internal:has=` + JSON.stringify(options.has[selectorSymbol]);\n if (options == null ? void 0 : options.hasNot)\n selector += ` >> internal:has-not=` + JSON.stringify(options.hasNot[selectorSymbol]);\n if ((options == null ? void 0 : options.visible) !== void 0)\n selector += ` >> visible=${options.visible ? "true" : "false"}`;\n this[selectorSymbol] = selector;\n if (selector) {\n const parsed = injectedScript.parseSelector(selector);\n this.element = injectedScript.querySelector(parsed, injectedScript.document, false);\n this.elements = injectedScript.querySelectorAll(parsed, injectedScript.document);\n }\n const selectorBase = selector;\n const self = this;\n self.locator = (selector2, options2) => {\n return new _Locator(injectedScript, selectorBase ? selectorBase + " >> " + selector2 : selector2, options2);\n };\n self.getByTestId = (testId) => self.locator(getByTestIdSelector(injectedScript.testIdAttributeNameForStrictErrorAndConsoleCodegen(), testId));\n self.getByAltText = (text, options2) => self.locator(getByAltTextSelector(text, options2));\n self.getByLabel = (text, options2) => self.locator(getByLabelSelector(text, options2));\n self.getByPlaceholder = (text, options2) => self.locator(getByPlaceholderSelector(text, options2));\n self.getByText = (text, options2) => self.locator(getByTextSelector(text, options2));\n self.getByTitle = (text, options2) => self.locator(getByTitleSelector(text, options2));\n self.getByRole = (role, options2 = {}) => self.locator(getByRoleSelector(role, options2));\n self.filter = (options2) => new _Locator(injectedScript, selector, options2);\n self.first = () => self.locator("nth=0");\n self.last = () => self.locator("nth=-1");\n self.nth = (index) => self.locator(`nth=${index}`);\n self.and = (locator) => new _Locator(injectedScript, selectorBase + ` >> internal:and=` + JSON.stringify(locator[selectorSymbol]));\n self.or = (locator) => new _Locator(injectedScript, selectorBase + ` >> internal:or=` + JSON.stringify(locator[selectorSymbol]));\n }\n};\nvar Locator = _Locator;\nvar ConsoleAPI = class {\n constructor(injectedScript) {\n this._injectedScript = injectedScript;\n }\n install() {\n if (this._injectedScript.window.playwright)\n return;\n this._injectedScript.window.playwright = {\n $: (selector, strict) => this._querySelector(selector, !!strict),\n $$: (selector) => this._querySelectorAll(selector),\n inspect: (selector) => this._inspect(selector),\n selector: (element) => this._selector(element),\n generateLocator: (element, language) => this._generateLocator(element, language),\n ariaSnapshot: (element, options) => {\n return this._injectedScript.ariaSnapshot(element || this._injectedScript.document.body, options);\n },\n resume: () => this._resume(),\n ...new Locator(this._injectedScript, "")\n };\n delete this._injectedScript.window.playwright.filter;\n delete this._injectedScript.window.playwright.first;\n delete this._injectedScript.window.playwright.last;\n delete this._injectedScript.window.playwright.nth;\n delete this._injectedScript.window.playwright.and;\n delete this._injectedScript.window.playwright.or;\n }\n _querySelector(selector, strict) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.query(\'Playwright >> selector\').`);\n const parsed = this._injectedScript.parseSelector(selector);\n return this._injectedScript.querySelector(parsed, this._injectedScript.document, strict);\n }\n _querySelectorAll(selector) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.$$(\'Playwright >> selector\').`);\n const parsed = this._injectedScript.parseSelector(selector);\n return this._injectedScript.querySelectorAll(parsed, this._injectedScript.document);\n }\n _inspect(selector) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.inspect(\'Playwright >> selector\').`);\n this._injectedScript.window.inspect(this._querySelector(selector, false));\n }\n _selector(element) {\n if (!(element instanceof Element))\n throw new Error(`Usage: playwright.selector(element).`);\n return this._injectedScript.generateSelectorSimple(element);\n }\n _generateLocator(element, language) {\n if (!(element instanceof Element))\n throw new Error(`Usage: playwright.locator(element).`);\n const selector = this._injectedScript.generateSelectorSimple(element);\n return asLocator(language || "javascript", selector);\n }\n _resume() {\n this._injectedScript.window.__pw_resume().catch(() => {\n });\n }\n};\n\n// packages/playwright-core/src/utils/isomorphic/utilityScriptSerializers.ts\nfunction isRegExp2(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction base64ToTypedArray(base64, TypedArrayConstructor) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n return new TypedArrayConstructor(bytes.buffer);\n}\nfunction parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value) {\n return new Date(value.d);\n }\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a)\n result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ("o" in value) {\n const result = {};\n refs.set(value.id, result);\n for (const { k, v } of value.o) {\n if (k === "__proto__")\n continue;\n result[k] = parseEvaluationResultValue(v, handles, refs);\n }\n return result;\n }\n if ("h" in value)\n return handles[value.h];\n if ("ta" in value)\n return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]);\n }\n return value;\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp2(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n}\n\n// packages/injected/src/utilityScript.ts\nvar UtilityScript = class {\n // eslint-disable-next-line no-restricted-globals\n constructor(global, isUnderTest) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.global = global;\n this.isUnderTest = isUnderTest;\n if (global.__pwClock) {\n this.builtins = global.__pwClock.builtins;\n } else {\n this.builtins = {\n setTimeout: (_a = global.setTimeout) == null ? void 0 : _a.bind(global),\n clearTimeout: (_b = global.clearTimeout) == null ? void 0 : _b.bind(global),\n setInterval: (_c = global.setInterval) == null ? void 0 : _c.bind(global),\n clearInterval: (_d = global.clearInterval) == null ? void 0 : _d.bind(global),\n requestAnimationFrame: (_e = global.requestAnimationFrame) == null ? void 0 : _e.bind(global),\n cancelAnimationFrame: (_f = global.cancelAnimationFrame) == null ? void 0 : _f.bind(global),\n requestIdleCallback: (_g = global.requestIdleCallback) == null ? void 0 : _g.bind(global),\n cancelIdleCallback: (_h = global.cancelIdleCallback) == null ? void 0 : _h.bind(global),\n performance: global.performance,\n Intl: global.Intl,\n Date: global.Date\n };\n }\n if (this.isUnderTest)\n global.builtins = this.builtins;\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = parseEvaluationResultValue(args[i], handles);\n let result = this.global.eval(expression);\n if (isFunction === true) {\n result = result(...parameters);\n } else if (isFunction === false) {\n result = result;\n } else {\n if (typeof result === "function")\n result = result(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result) : result;\n }\n jsonValue(returnByValue, value) {\n if (value === void 0)\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n};\n\n// packages/injected/src/injectedScript.ts\nvar InjectedScript = class {\n // eslint-disable-next-line no-restricted-globals\n constructor(window, options) {\n this._testIdAttributeNameForStrictErrorAndConsoleCodegen = "data-testid";\n // Recorder must use any external dependencies through InjectedScript.\n // Otherwise it will end up with a copy of all modules it uses, and any\n // module-level globals will be duplicated, which leads to subtle bugs.\n this.utils = {\n asLocator,\n cacheNormalizedWhitespaces,\n elementText,\n getAriaRole,\n getElementAccessibleDescription,\n getElementAccessibleName,\n isElementVisible,\n isInsideScope,\n normalizeWhiteSpace,\n parseAriaSnapshot,\n // Builtins protect injected code from clock emulation.\n builtins: null\n };\n this.window = window;\n this.document = window.document;\n this.isUnderTest = options.isUnderTest;\n this.utils.builtins = new UtilityScript(window, options.isUnderTest).builtins;\n this._sdkLanguage = options.sdkLanguage;\n this._testIdAttributeNameForStrictErrorAndConsoleCodegen = options.testIdAttributeName;\n this._evaluator = new SelectorEvaluatorImpl();\n this.consoleApi = new ConsoleAPI(this);\n this.onGlobalListenersRemoved = /* @__PURE__ */ new Set();\n this._autoClosingTags = /* @__PURE__ */ new Set(["AREA", "BASE", "BR", "COL", "COMMAND", "EMBED", "HR", "IMG", "INPUT", "KEYGEN", "LINK", "MENUITEM", "META", "PARAM", "SOURCE", "TRACK", "WBR"]);\n this._booleanAttributes = /* @__PURE__ */ new Set(["checked", "selected", "disabled", "readonly", "multiple"]);\n this._eventTypes = /* @__PURE__ */ new Map([\n ["auxclick", "mouse"],\n ["click", "mouse"],\n ["dblclick", "mouse"],\n ["mousedown", "mouse"],\n ["mouseeenter", "mouse"],\n ["mouseleave", "mouse"],\n ["mousemove", "mouse"],\n ["mouseout", "mouse"],\n ["mouseover", "mouse"],\n ["mouseup", "mouse"],\n ["mouseleave", "mouse"],\n ["mousewheel", "mouse"],\n ["keydown", "keyboard"],\n ["keyup", "keyboard"],\n ["keypress", "keyboard"],\n ["textInput", "keyboard"],\n ["touchstart", "touch"],\n ["touchmove", "touch"],\n ["touchend", "touch"],\n ["touchcancel", "touch"],\n ["pointerover", "pointer"],\n ["pointerout", "pointer"],\n ["pointerenter", "pointer"],\n ["pointerleave", "pointer"],\n ["pointerdown", "pointer"],\n ["pointerup", "pointer"],\n ["pointermove", "pointer"],\n ["pointercancel", "pointer"],\n ["gotpointercapture", "pointer"],\n ["lostpointercapture", "pointer"],\n ["focus", "focus"],\n ["blur", "focus"],\n ["drag", "drag"],\n ["dragstart", "drag"],\n ["dragend", "drag"],\n ["dragover", "drag"],\n ["dragenter", "drag"],\n ["dragleave", "drag"],\n ["dragexit", "drag"],\n ["drop", "drag"],\n ["wheel", "wheel"],\n ["deviceorientation", "deviceorientation"],\n ["deviceorientationabsolute", "deviceorientation"],\n ["devicemotion", "devicemotion"]\n ]);\n this._hoverHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["mousemove"]);\n this._tapHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["pointerdown", "pointerup", "touchstart", "touchend", "touchcancel"]);\n this._mouseHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["mousedown", "mouseup", "pointerdown", "pointerup", "click", "auxclick", "dblclick", "contextmenu"]);\n this._allHitTargetInterceptorEvents = /* @__PURE__ */ new Set([...this._hoverHitTargetInterceptorEvents, ...this._tapHitTargetInterceptorEvents, ...this._mouseHitTargetInterceptorEvents]);\n this._engines = /* @__PURE__ */ new Map();\n this._engines.set("xpath", XPathEngine);\n this._engines.set("xpath:light", XPathEngine);\n this._engines.set("_react", createReactEngine());\n this._engines.set("_vue", createVueEngine());\n this._engines.set("role", createRoleEngine(false));\n this._engines.set("text", this._createTextEngine(true, false));\n this._engines.set("text:light", this._createTextEngine(false, false));\n this._engines.set("id", this._createAttributeEngine("id", true));\n this._engines.set("id:light", this._createAttributeEngine("id", false));\n this._engines.set("data-testid", this._createAttributeEngine("data-testid", true));\n this._engines.set("data-testid:light", this._createAttributeEngine("data-testid", false));\n this._engines.set("data-test-id", this._createAttributeEngine("data-test-id", true));\n this._engines.set("data-test-id:light", this._createAttributeEngine("data-test-id", false));\n this._engines.set("data-test", this._createAttributeEngine("data-test", true));\n this._engines.set("data-test:light", this._createAttributeEngine("data-test", false));\n this._engines.set("css", this._createCSSEngine());\n this._engines.set("nth", { queryAll: () => [] });\n this._engines.set("visible", this._createVisibleEngine());\n this._engines.set("internal:control", this._createControlEngine());\n this._engines.set("internal:has", this._createHasEngine());\n this._engines.set("internal:has-not", this._createHasNotEngine());\n this._engines.set("internal:and", { queryAll: () => [] });\n this._engines.set("internal:or", { queryAll: () => [] });\n this._engines.set("internal:chain", this._createInternalChainEngine());\n this._engines.set("internal:label", this._createInternalLabelEngine());\n this._engines.set("internal:text", this._createTextEngine(true, true));\n this._engines.set("internal:has-text", this._createInternalHasTextEngine());\n this._engines.set("internal:has-not-text", this._createInternalHasNotTextEngine());\n this._engines.set("internal:attr", this._createNamedAttributeEngine());\n this._engines.set("internal:testid", this._createNamedAttributeEngine());\n this._engines.set("internal:role", createRoleEngine(true));\n this._engines.set("internal:describe", this._createDescribeEngine());\n this._engines.set("aria-ref", this._createAriaRefEngine());\n for (const { name, source } of options.customEngines)\n this._engines.set(name, this.eval(source));\n this._stableRafCount = options.stableRafCount;\n this._browserName = options.browserName;\n setGlobalOptions({ browserNameForWorkarounds: options.browserName, inputFileRoleTextbox: options.inputFileRoleTextbox });\n this._setupGlobalListenersRemovalDetection();\n this._setupHitTargetInterceptors();\n if (this.isUnderTest)\n this.window.__injectedScript = this;\n }\n eval(expression) {\n return this.window.eval(expression);\n }\n testIdAttributeNameForStrictErrorAndConsoleCodegen() {\n return this._testIdAttributeNameForStrictErrorAndConsoleCodegen;\n }\n parseSelector(selector) {\n const result = parseSelector(selector);\n visitAllSelectorParts(result, (part) => {\n if (!this._engines.has(part.name))\n throw this.createStacklessError(`Unknown engine "${part.name}" while parsing selector ${selector}`);\n });\n return result;\n }\n generateSelector(targetElement, options) {\n return generateSelector(this, targetElement, options);\n }\n generateSelectorSimple(targetElement, options) {\n return generateSelector(this, targetElement, { ...options, testIdAttributeName: this._testIdAttributeNameForStrictErrorAndConsoleCodegen }).selector;\n }\n querySelector(selector, root, strict) {\n const result = this.querySelectorAll(selector, root);\n if (strict && result.length > 1)\n throw this.strictModeViolationError(selector, result);\n return result[0];\n }\n _queryNth(elements, part) {\n const list = [...elements];\n let nth = +part.body;\n if (nth === -1)\n nth = list.length - 1;\n return new Set(list.slice(nth, nth + 1));\n }\n _queryLayoutSelector(elements, part, originalRoot) {\n const name = part.name;\n const body = part.body;\n const result = [];\n const inner = this.querySelectorAll(body.parsed, originalRoot);\n for (const element of elements) {\n const score = layoutSelectorScore(name, element, inner, body.distance);\n if (score !== void 0)\n result.push({ element, score });\n }\n result.sort((a, b) => a.score - b.score);\n return new Set(result.map((r) => r.element));\n }\n ariaSnapshot(node, options) {\n if (node.nodeType !== Node.ELEMENT_NODE)\n throw this.createStacklessError("Can only capture aria snapshot of Element nodes.");\n this._lastAriaSnapshot = generateAriaTree(node, options);\n return renderAriaTree(this._lastAriaSnapshot, options);\n }\n getAllByAria(document, template) {\n return getAllByAria(document.documentElement, template);\n }\n querySelectorAll(selector, root) {\n if (selector.capture !== void 0) {\n if (selector.parts.some((part) => part.name === "nth"))\n throw this.createStacklessError(`Can\'t query n-th element in a request with the capture.`);\n const withHas = { parts: selector.parts.slice(0, selector.capture + 1) };\n if (selector.capture < selector.parts.length - 1) {\n const parsed = { parts: selector.parts.slice(selector.capture + 1) };\n const has = { name: "internal:has", body: { parsed }, source: stringifySelector(parsed) };\n withHas.parts.push(has);\n }\n return this.querySelectorAll(withHas, root);\n }\n if (!root["querySelectorAll"])\n throw this.createStacklessError("Node is not queryable.");\n if (selector.capture !== void 0) {\n throw this.createStacklessError("Internal error: there should not be a capture in the selector.");\n }\n if (root.nodeType === 11 && selector.parts.length === 1 && selector.parts[0].name === "css" && selector.parts[0].source === ":scope")\n return [root];\n this._evaluator.begin();\n try {\n let roots = /* @__PURE__ */ new Set([root]);\n for (const part of selector.parts) {\n if (part.name === "nth") {\n roots = this._queryNth(roots, part);\n } else if (part.name === "internal:and") {\n const andElements = this.querySelectorAll(part.body.parsed, root);\n roots = new Set(andElements.filter((e) => roots.has(e)));\n } else if (part.name === "internal:or") {\n const orElements = this.querySelectorAll(part.body.parsed, root);\n roots = new Set(sortInDOMOrder(/* @__PURE__ */ new Set([...roots, ...orElements])));\n } else if (kLayoutSelectorNames.includes(part.name)) {\n roots = this._queryLayoutSelector(roots, part, root);\n } else {\n const next = /* @__PURE__ */ new Set();\n for (const root2 of roots) {\n const all = this._queryEngineAll(part, root2);\n for (const one of all)\n next.add(one);\n }\n roots = next;\n }\n }\n return [...roots];\n } finally {\n this._evaluator.end();\n }\n }\n _queryEngineAll(part, root) {\n const result = this._engines.get(part.name).queryAll(root, part.body);\n for (const element of result) {\n if (!("nodeName" in element))\n throw this.createStacklessError(`Expected a Node but got ${Object.prototype.toString.call(element)}`);\n }\n return result;\n }\n _createAttributeEngine(attribute, shadow) {\n const toCSS = (selector) => {\n const css = `[${attribute}=${JSON.stringify(selector)}]`;\n return [{ simples: [{ selector: { css, functions: [] }, combinator: "" }] }];\n };\n return {\n queryAll: (root, selector) => {\n return this._evaluator.query({ scope: root, pierceShadow: shadow }, toCSS(selector));\n }\n };\n }\n _createCSSEngine() {\n return {\n queryAll: (root, body) => {\n return this._evaluator.query({ scope: root, pierceShadow: true }, body);\n }\n };\n }\n _createTextEngine(shadow, internal) {\n const queryAll = (root, selector) => {\n const { matcher, kind } = createTextMatcher(selector, internal);\n const result = [];\n let lastDidNotMatchSelf = null;\n const appendElement = (element) => {\n if (kind === "lax" && lastDidNotMatchSelf && lastDidNotMatchSelf.contains(element))\n return false;\n const matches = elementMatchesText(this._evaluator._cacheText, element, matcher);\n if (matches === "none")\n lastDidNotMatchSelf = element;\n if (matches === "self" || matches === "selfAndChildren" && kind === "strict" && !internal)\n result.push(element);\n };\n if (root.nodeType === Node.ELEMENT_NODE)\n appendElement(root);\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: shadow }, "*");\n for (const element of elements)\n appendElement(element);\n return result;\n };\n return { queryAll };\n }\n _createInternalHasTextEngine() {\n return {\n queryAll: (root, selector) => {\n if (root.nodeType !== 1)\n return [];\n const element = root;\n const text = elementText(this._evaluator._cacheText, element);\n const { matcher } = createTextMatcher(selector, true);\n return matcher(text) ? [element] : [];\n }\n };\n }\n _createInternalHasNotTextEngine() {\n return {\n queryAll: (root, selector) => {\n if (root.nodeType !== 1)\n return [];\n const element = root;\n const text = elementText(this._evaluator._cacheText, element);\n const { matcher } = createTextMatcher(selector, true);\n return matcher(text) ? [] : [element];\n }\n };\n }\n _createInternalLabelEngine() {\n return {\n queryAll: (root, selector) => {\n const { matcher } = createTextMatcher(selector, true);\n const allElements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, "*");\n return allElements.filter((element) => {\n return getElementLabels(this._evaluator._cacheText, element).some((label) => matcher(label));\n });\n }\n };\n }\n _createNamedAttributeEngine() {\n const queryAll = (root, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n if (parsed.name || parsed.attributes.length !== 1)\n throw new Error("Malformed attribute selector: " + selector);\n const { name, value, caseSensitive } = parsed.attributes[0];\n const lowerCaseValue = caseSensitive ? null : value.toLowerCase();\n let matcher;\n if (value instanceof RegExp)\n matcher = (s) => !!s.match(value);\n else if (caseSensitive)\n matcher = (s) => s === value;\n else\n matcher = (s) => s.toLowerCase().includes(lowerCaseValue);\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, `[${name}]`);\n return elements.filter((e) => matcher(e.getAttribute(name)));\n };\n return { queryAll };\n }\n _createDescribeEngine() {\n const queryAll = (root) => {\n if (root.nodeType !== 1)\n return [];\n return [root];\n };\n return { queryAll };\n }\n _createControlEngine() {\n return {\n queryAll(root, body) {\n if (body === "enter-frame")\n return [];\n if (body === "return-empty")\n return [];\n if (body === "component") {\n if (root.nodeType !== 1)\n return [];\n return [root.childElementCount === 1 ? root.firstElementChild : root];\n }\n throw new Error(`Internal error, unknown internal:control selector ${body}`);\n }\n };\n }\n _createHasEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const has = !!this.querySelector(body.parsed, root, false);\n return has ? [root] : [];\n };\n return { queryAll };\n }\n _createHasNotEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const has = !!this.querySelector(body.parsed, root, false);\n return has ? [] : [root];\n };\n return { queryAll };\n }\n _createVisibleEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const visible = body === "true";\n return isElementVisible(root) === visible ? [root] : [];\n };\n return { queryAll };\n }\n _createInternalChainEngine() {\n const queryAll = (root, body) => {\n return this.querySelectorAll(body.parsed, root);\n };\n return { queryAll };\n }\n extend(source, params) {\n const constrFunction = this.window.eval(`\n (() => {\n const module = {};\n ${source}\n return module.exports.default();\n })()`);\n return new constrFunction(this, params);\n }\n async viewportRatio(element) {\n return await new Promise((resolve) => {\n const observer = new IntersectionObserver((entries) => {\n resolve(entries[0].intersectionRatio);\n observer.disconnect();\n });\n observer.observe(element);\n this.utils.builtins.requestAnimationFrame(() => {\n });\n });\n }\n getElementBorderWidth(node) {\n if (node.nodeType !== Node.ELEMENT_NODE || !node.ownerDocument || !node.ownerDocument.defaultView)\n return { left: 0, top: 0 };\n const style = node.ownerDocument.defaultView.getComputedStyle(node);\n return { left: parseInt(style.borderLeftWidth || "", 10), top: parseInt(style.borderTopWidth || "", 10) };\n }\n describeIFrameStyle(iframe) {\n if (!iframe.ownerDocument || !iframe.ownerDocument.defaultView)\n return "error:notconnected";\n const defaultView = iframe.ownerDocument.defaultView;\n for (let e = iframe; e; e = parentElementOrShadowHost(e)) {\n if (defaultView.getComputedStyle(e).transform !== "none")\n return "transformed";\n }\n const iframeStyle = defaultView.getComputedStyle(iframe);\n return {\n left: parseInt(iframeStyle.borderLeftWidth || "", 10) + parseInt(iframeStyle.paddingLeft || "", 10),\n top: parseInt(iframeStyle.borderTopWidth || "", 10) + parseInt(iframeStyle.paddingTop || "", 10)\n };\n }\n retarget(node, behavior) {\n let element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;\n if (!element)\n return null;\n if (behavior === "none")\n return element;\n if (!element.matches("input, textarea, select") && !element.isContentEditable) {\n if (behavior === "button-link")\n element = element.closest("button, [role=button], a, [role=link]") || element;\n else\n element = element.closest("button, [role=button], [role=checkbox], [role=radio]") || element;\n }\n if (behavior === "follow-label") {\n if (!element.matches("a, input, textarea, button, select, [role=link], [role=button], [role=checkbox], [role=radio]") && !element.isContentEditable) {\n const enclosingLabel = element.closest("label");\n if (enclosingLabel && enclosingLabel.control)\n element = enclosingLabel.control;\n }\n }\n return element;\n }\n async checkElementStates(node, states) {\n if (states.includes("stable")) {\n const stableResult = await this._checkElementIsStable(node);\n if (stableResult === false)\n return { missingState: "stable" };\n if (stableResult === "error:notconnected")\n return "error:notconnected";\n }\n for (const state of states) {\n if (state !== "stable") {\n const result = this.elementState(node, state);\n if (result.received === "error:notconnected")\n return "error:notconnected";\n if (!result.matches)\n return { missingState: state };\n }\n }\n }\n async _checkElementIsStable(node) {\n const continuePolling = Symbol("continuePolling");\n let lastRect;\n let stableRafCounter = 0;\n let lastTime = 0;\n const check = () => {\n const element = this.retarget(node, "no-follow-label");\n if (!element)\n return "error:notconnected";\n const time = this.utils.builtins.performance.now();\n if (this._stableRafCount > 1 && time - lastTime < 15)\n return continuePolling;\n lastTime = time;\n const clientRect = element.getBoundingClientRect();\n const rect = { x: clientRect.top, y: clientRect.left, width: clientRect.width, height: clientRect.height };\n if (lastRect) {\n const samePosition = rect.x === lastRect.x && rect.y === lastRect.y && rect.width === lastRect.width && rect.height === lastRect.height;\n if (!samePosition)\n return false;\n if (++stableRafCounter >= this._stableRafCount)\n return true;\n }\n lastRect = rect;\n return continuePolling;\n };\n let fulfill;\n let reject;\n const result = new Promise((f, r) => {\n fulfill = f;\n reject = r;\n });\n const raf = () => {\n try {\n const success = check();\n if (success !== continuePolling)\n fulfill(success);\n else\n this.utils.builtins.requestAnimationFrame(raf);\n } catch (e) {\n reject(e);\n }\n };\n this.utils.builtins.requestAnimationFrame(raf);\n return result;\n }\n _createAriaRefEngine() {\n const queryAll = (root, selector) => {\n var _a, _b;\n const result = (_b = (_a = this._lastAriaSnapshot) == null ? void 0 : _a.elements) == null ? void 0 : _b.get(selector);\n return result && result.isConnected ? [result] : [];\n };\n return { queryAll };\n }\n elementState(node, state) {\n const element = this.retarget(node, ["visible", "hidden"].includes(state) ? "none" : "follow-label");\n if (!element || !element.isConnected) {\n if (state === "hidden")\n return { matches: true, received: "hidden" };\n return { matches: false, received: "error:notconnected" };\n }\n if (state === "visible" || state === "hidden") {\n const visible = isElementVisible(element);\n return {\n matches: state === "visible" ? visible : !visible,\n received: visible ? "visible" : "hidden"\n };\n }\n if (state === "disabled" || state === "enabled") {\n const disabled = getAriaDisabled(element);\n return {\n matches: state === "disabled" ? disabled : !disabled,\n received: disabled ? "disabled" : "enabled"\n };\n }\n if (state === "editable") {\n const disabled = getAriaDisabled(element);\n const readonly = getReadonly(element);\n if (readonly === "error")\n throw this.createStacklessError("Element is not an
    "); + if ((internalTLS == null ? void 0 : internalTLS.alpnProtocol) === "h2") { + if ("performServerHandshake" in http) { + this.target.removeListener("close", this._targetCloseEventListener); + const session = http.performServerHandshake(internalTLS); + session.on("error", () => { + this.target.destroy(); + this._targetCloseEventListener(); + }); + session.once("stream", (stream2) => { + stream2.respond({ + "content-type": "text/html", + [http.constants.HTTP2_HEADER_STATUS]: 503 + }); + const cleanup = () => { + session.close(); + this.target.destroy(); + this._targetCloseEventListener(); + }; + stream2.end(responseBody, cleanup); + stream2.once("error", cleanup); + }); + } else { + this.target.destroy(); + } + } else { + internalTLS.end([ + "HTTP/1.1 503 Internal Server Error", + "Content-Type: text/html; charset=utf-8", + "Content-Length: " + Buffer.byteLength(responseBody), + "", + responseBody + ].join("\r\n")); + this.target.destroy(); + } + }; + if (this._closed) { + internalTLS.destroy(); + return; + } + targetTLS = tls.connect({ + socket: this.target, + host: this.host, + port: this.port, + rejectUnauthorized: !this.socksProxy.ignoreHTTPSErrors, + ALPNProtocols: [internalTLS.alpnProtocol || "http/1.1"], + servername: !net.isIP(this.host) ? this.host : void 0, + secureContext: this.socksProxy.secureContextMap.get(new URL(`https://${this.host}:${this.port}`).origin) + }); + targetTLS.once("secureConnect", () => { + internalTLS.pipe(targetTLS); + targetTLS.pipe(internalTLS); + }); + internalTLS.once("error", () => this.target.destroy()); + targetTLS.once("error", handleError); + }); + }); + } +} +class ClientCertificatesProxy { + constructor(contextOptions) { + this._connections = /* @__PURE__ */ new Map(); + this.secureContextMap = /* @__PURE__ */ new Map(); + verifyClientCertificates(contextOptions.clientCertificates); + this.alpnCache = new ALPNCache(); + this.ignoreHTTPSErrors = contextOptions.ignoreHTTPSErrors; + this.proxyAgentFromOptions = createProxyAgent(contextOptions.proxy); + this._initSecureContexts(contextOptions.clientCertificates); + this._socksProxy = new SocksProxy(); + this._socksProxy.setPattern("*"); + this._socksProxy.addListener(SocksProxy.Events.SocksRequested, async (payload) => { + try { + const connection = new SocksProxyConnection(this, payload.uid, payload.host, payload.port); + await connection.connect(); + this._connections.set(payload.uid, connection); + } catch (error2) { + this._socksProxy.socketFailed({ uid: payload.uid, errorCode: error2.code }); + } + }); + this._socksProxy.addListener(SocksProxy.Events.SocksData, async (payload) => { + var _a2; + (_a2 = this._connections.get(payload.uid)) == null ? void 0 : _a2.onData(payload.data); + }); + this._socksProxy.addListener(SocksProxy.Events.SocksClosed, (payload) => { + var _a2; + (_a2 = this._connections.get(payload.uid)) == null ? void 0 : _a2.onClose(); + this._connections.delete(payload.uid); + }); + loadDummyServerCertsIfNeeded(); + } + _initSecureContexts(clientCertificates) { + const origin2certs = /* @__PURE__ */ new Map(); + for (const cert of clientCertificates || []) { + const origin = normalizeOrigin(cert.origin); + const certs = origin2certs.get(origin) || []; + certs.push(cert); + origin2certs.set(origin, certs); + } + for (const [origin, certs] of origin2certs) { + try { + this.secureContextMap.set(origin, tls.createSecureContext(convertClientCertificatesToTLSOptions(certs))); + } catch (error2) { + error2 = rewriteOpenSSLErrorIfNeeded(error2); + throw rewriteErrorMessage(error2, `Failed to load client certificate: ${error2.message}`); + } + } + } + async listen() { + const port = await this._socksProxy.listen(0, "127.0.0.1"); + return { server: `socks5://127.0.0.1:${port}` }; + } + async close() { + await this._socksProxy.close(); + } +} +function normalizeOrigin(origin) { + try { + return new URL(origin).origin; + } catch (error2) { + return origin; + } +} +function convertClientCertificatesToTLSOptions(clientCertificates) { + if (!clientCertificates || !clientCertificates.length) + return; + const tlsOptions = { + pfx: [], + key: [], + cert: [] + }; + for (const cert of clientCertificates) { + if (cert.cert) + tlsOptions.cert.push(cert.cert); + if (cert.key) + tlsOptions.key.push({ pem: cert.key, passphrase: cert.passphrase }); + if (cert.pfx) + tlsOptions.pfx.push({ buf: cert.pfx, passphrase: cert.passphrase }); + } + return tlsOptions; +} +function getMatchingTLSOptionsForOrigin(clientCertificates, origin) { + const matchingCerts = clientCertificates == null ? void 0 : clientCertificates.filter( + (c) => normalizeOrigin(c.origin) === origin + ); + return convertClientCertificatesToTLSOptions(matchingCerts); +} +function rewriteToLocalhostIfNeeded(host) { + return host === "local.playwright" ? "localhost" : host; +} +function rewriteOpenSSLErrorIfNeeded(error2) { + if (error2.message !== "unsupported" && error2.code !== "ERR_CRYPTO_UNSUPPORTED_OPERATION") + return error2; + return rewriteErrorMessage(error2, [ + "Unsupported TLS certificate.", + "Most likely, the security algorithm of the given certificate was deprecated by OpenSSL.", + "For more details, see https://github.com/openssl/openssl/blob/master/README-PROVIDERS.md#the-legacy-provider", + "You could probably modernize the certificate by following the steps at https://github.com/nodejs/node/issues/40672#issuecomment-1243648223" + ].join("\n")); +} +let APIRequestContext$1 = (_f = class extends SdkObject { + constructor(parent) { + super(parent, "request-context"); + this.fetchResponses = /* @__PURE__ */ new Map(); + this.fetchLog = /* @__PURE__ */ new Map(); + this._activeProgressControllers = /* @__PURE__ */ new Set(); + _f.allInstances.add(this); + } + static findResponseBody(guid) { + for (const request2 of _f.allInstances) { + const body = request2.fetchResponses.get(guid); + if (body) + return body; + } + return void 0; + } + _disposeImpl() { + _f.allInstances.delete(this); + this.fetchResponses.clear(); + this.fetchLog.clear(); + this.emit(_f.Events.Dispose); + } + disposeResponse(fetchUid) { + this.fetchResponses.delete(fetchUid); + this.fetchLog.delete(fetchUid); + } + _storeResponseBody(body) { + const uid = createGuid(); + this.fetchResponses.set(uid, body); + return uid; + } + async fetch(params, metadata) { + var _a2; + const defaults = this._defaultOptions(); + const headers = { + "user-agent": defaults.userAgent, + "accept": "*/*", + "accept-encoding": "gzip,deflate,br" + }; + if (defaults.extraHTTPHeaders) { + for (const { name, value } of defaults.extraHTTPHeaders) + setHeader(headers, name, value); + } + if (params.headers) { + for (const { name, value } of params.headers) + setHeader(headers, name, value); + } + const requestUrl = new URL(constructURLBasedOnBaseURL(defaults.baseURL, params.url)); + if (params.encodedParams) { + requestUrl.search = params.encodedParams; + } else if (params.params) { + for (const { name, value } of params.params) + requestUrl.searchParams.append(name, value); + } + const credentials = this._getHttpCredentials(requestUrl); + if ((credentials == null ? void 0 : credentials.send) === "always") + setBasicAuthorizationHeader(headers, credentials); + const method = ((_a2 = params.method) == null ? void 0 : _a2.toUpperCase()) || "GET"; + const proxy = defaults.proxy; + let agent2; + if ((proxy == null ? void 0 : proxy.server) !== "per-context") + agent2 = createProxyAgent(proxy, requestUrl); + let maxRedirects = params.maxRedirects ?? (defaults.maxRedirects ?? 20); + maxRedirects = maxRedirects === 0 ? -1 : maxRedirects; + const timeout = params.timeout; + const deadline = timeout && monotonicTime() + timeout; + const options2 = { + method, + headers, + agent: agent2, + maxRedirects, + timeout, + deadline, + ...getMatchingTLSOptionsForOrigin(this._defaultOptions().clientCertificates, requestUrl.origin), + __testHookLookup: params.__testHookLookup + }; + if (params.ignoreHTTPSErrors || defaults.ignoreHTTPSErrors) + options2.rejectUnauthorized = false; + const postData = serializePostData(params, headers); + if (postData) + setHeader(headers, "content-length", String(postData.byteLength)); + const controller = new ProgressController(metadata, this); + const fetchResponse = await controller.run((progress2) => { + return this._sendRequestWithRetries(progress2, requestUrl, options2, postData, params.maxRetries); + }); + const fetchUid = this._storeResponseBody(fetchResponse.body); + this.fetchLog.set(fetchUid, controller.metadata.log); + const failOnStatusCode = params.failOnStatusCode !== void 0 ? params.failOnStatusCode : !!defaults.failOnStatusCode; + if (failOnStatusCode && (fetchResponse.status < 200 || fetchResponse.status >= 400)) { + let responseText = ""; + if (fetchResponse.body.byteLength) { + let text = fetchResponse.body.toString("utf8"); + if (text.length > 1e3) + text = text.substring(0, 997) + "..."; + responseText = ` +Response text: +${text}`; + } + throw new Error(`${fetchResponse.status} ${fetchResponse.statusText}${responseText}`); + } + return { ...fetchResponse, fetchUid }; + } + _parseSetCookieHeader(responseUrl, setCookie) { + if (!setCookie) + return []; + const url2 = new URL(responseUrl); + const defaultPath = "/" + url2.pathname.substr(1).split("/").slice(0, -1).join("/"); + const cookies = []; + for (const header of setCookie) { + const cookie = parseCookie(header); + if (!cookie) + continue; + if (!cookie.domain) + cookie.domain = url2.hostname; + else + assert(cookie.domain.startsWith(".") || !cookie.domain.includes(".")); + if (!domainMatches(url2.hostname, cookie.domain)) + continue; + if (!cookie.path || !cookie.path.startsWith("/")) + cookie.path = defaultPath; + cookies.push(cookie); + } + return cookies; + } + async _updateRequestCookieHeader(url2, headers) { + if (getHeader(headers, "cookie") !== void 0) + return; + const contextCookies = await this._cookies(url2); + const cookies = contextCookies.filter((c) => new Cookie(c).matches(url2)); + if (cookies.length) { + const valueArray = cookies.map((c) => `${c.name}=${c.value}`); + setHeader(headers, "cookie", valueArray.join("; ")); + } + } + async _sendRequestWithRetries(progress2, url2, options2, postData, maxRetries) { + maxRetries ?? (maxRetries = 0); + let backoff = 250; + for (let i = 0; i <= maxRetries; i++) { + try { + return await this._sendRequest(progress2, url2, options2, postData); + } catch (e) { + e = rewriteOpenSSLErrorIfNeeded(e); + if (maxRetries === 0) + throw e; + if (i === maxRetries || options2.deadline && monotonicTime() + backoff > options2.deadline) + throw new Error(`Failed after ${i + 1} attempt(s): ${e}`); + if (e.code !== "ECONNRESET") + throw e; + progress2.log(` Received ECONNRESET, will retry after ${backoff}ms.`); + await new Promise((f) => setTimeout(f, backoff)); + backoff *= 2; + } + } + throw new Error("Unreachable"); + } + async _sendRequest(progress2, url2, options2, postData) { + var _a2; + await this._updateRequestCookieHeader(url2, options2.headers); + const requestCookies = ((_a2 = getHeader(options2.headers, "cookie")) == null ? void 0 : _a2.split(";").map((p) => { + const [name, value] = p.split("=").map((v) => v.trim()); + return { name, value }; + })) || []; + const requestEvent = { + url: url2, + method: options2.method, + headers: options2.headers, + cookies: requestCookies, + postData + }; + this.emit(_f.Events.Request, requestEvent); + return new Promise((fulfill, reject) => { + const requestConstructor = (url2.protocol === "https:" ? https : http).request; + const agent2 = options2.agent || (url2.protocol === "https:" ? httpsHappyEyeballsAgent : httpHappyEyeballsAgent); + const requestOptions = { ...options2, agent: agent2 }; + const startAt = monotonicTime(); + let reusedSocketAt; + let dnsLookupAt; + let tcpConnectionAt; + let tlsHandshakeAt; + let requestFinishAt; + let serverIPAddress; + let serverPort; + let securityDetails; + const listeners = []; + const request2 = requestConstructor(url2, requestOptions, async (response2) => { + const responseAt = monotonicTime(); + const notifyRequestFinished = (body2) => { + const endAt = monotonicTime(); + const connectEnd = tlsHandshakeAt ?? tcpConnectionAt; + const timings = { + send: requestFinishAt - startAt, + wait: responseAt - requestFinishAt, + receive: endAt - responseAt, + dns: dnsLookupAt ? dnsLookupAt - startAt : -1, + connect: connectEnd ? connectEnd - startAt : -1, + // "If [ssl] is defined then the time is also included in the connect field " + ssl: tlsHandshakeAt ? tlsHandshakeAt - tcpConnectionAt : -1, + blocked: reusedSocketAt ? reusedSocketAt - startAt : -1 + }; + const requestFinishedEvent = { + requestEvent, + httpVersion: response2.httpVersion, + statusCode: response2.statusCode || 0, + statusMessage: response2.statusMessage || "", + headers: response2.headers, + rawHeaders: response2.rawHeaders, + cookies, + body: body2, + timings, + serverIPAddress, + serverPort, + securityDetails + }; + this.emit(_f.Events.RequestFinished, requestFinishedEvent); + }; + progress2.log(`← ${response2.statusCode} ${response2.statusMessage}`); + for (const [name, value] of Object.entries(response2.headers)) + progress2.log(` ${name}: ${value}`); + const cookies = this._parseSetCookieHeader(response2.url || url2.toString(), response2.headers["set-cookie"]); + if (cookies.length) { + try { + await this._addCookies(cookies); + } catch (e) { + await Promise.all(cookies.map((c) => this._addCookies([c]).catch(() => { + }))); + } + } + if (redirectStatus$1.includes(response2.statusCode) && options2.maxRedirects >= 0) { + if (options2.maxRedirects === 0) { + reject(new Error("Max redirect count exceeded")); + request2.destroy(); + return; + } + const headers = { ...options2.headers }; + removeHeader(headers, `cookie`); + const status = response2.statusCode; + let method = options2.method; + if ((status === 301 || status === 302) && method === "POST" || status === 303 && !["GET", "HEAD"].includes(method)) { + method = "GET"; + postData = void 0; + removeHeader(headers, `content-encoding`); + removeHeader(headers, `content-language`); + removeHeader(headers, `content-length`); + removeHeader(headers, `content-location`); + removeHeader(headers, `content-type`); + } + const redirectOptions = { + method, + headers, + agent: options2.agent, + maxRedirects: options2.maxRedirects - 1, + timeout: options2.timeout, + deadline: options2.deadline, + ...getMatchingTLSOptionsForOrigin(this._defaultOptions().clientCertificates, url2.origin), + __testHookLookup: options2.__testHookLookup + }; + if (options2.rejectUnauthorized === false) + redirectOptions.rejectUnauthorized = false; + const locationHeaderValue = Buffer.from(response2.headers.location ?? "", "latin1").toString("utf8"); + if (locationHeaderValue) { + let locationURL; + try { + locationURL = new URL(locationHeaderValue, url2); + } catch (error2) { + reject(new Error(`uri requested responds with an invalid redirect URL: ${locationHeaderValue}`)); + request2.destroy(); + return; + } + if (headers["host"]) + headers["host"] = locationURL.host; + notifyRequestFinished(); + fulfill(this._sendRequest(progress2, locationURL, redirectOptions, postData)); + request2.destroy(); + return; + } + } + if (response2.statusCode === 401 && !getHeader(options2.headers, "authorization")) { + const auth = response2.headers["www-authenticate"]; + const credentials = this._getHttpCredentials(url2); + if ((auth == null ? void 0 : auth.trim().startsWith("Basic")) && credentials) { + setBasicAuthorizationHeader(options2.headers, credentials); + notifyRequestFinished(); + fulfill(this._sendRequest(progress2, url2, options2, postData)); + request2.destroy(); + return; + } + } + response2.on("aborted", () => reject(new Error("aborted"))); + const chunks = []; + const notifyBodyFinished = () => { + const body2 = Buffer.concat(chunks); + notifyRequestFinished(body2); + fulfill({ + url: response2.url || url2.toString(), + status: response2.statusCode || 0, + statusText: response2.statusMessage || "", + headers: toHeadersArray(response2.rawHeaders), + body: body2 + }); + }; + let body = response2; + let transform2; + const encoding2 = response2.headers["content-encoding"]; + if (encoding2 === "gzip" || encoding2 === "x-gzip") { + transform2 = libExports.createGunzip({ + flush: libExports.constants.Z_SYNC_FLUSH, + finishFlush: libExports.constants.Z_SYNC_FLUSH + }); + } else if (encoding2 === "br") { + transform2 = libExports.createBrotliDecompress({ + flush: libExports.constants.BROTLI_OPERATION_FLUSH, + finishFlush: libExports.constants.BROTLI_OPERATION_FLUSH + }); + } else if (encoding2 === "deflate") { + transform2 = libExports.createInflate(); + } + if (transform2) { + const emptyStreamTransform = new SafeEmptyStreamTransform(notifyBodyFinished); + body = browserExports.pipeline(response2, emptyStreamTransform, transform2, (e) => { + if (e) + reject(new Error(`failed to decompress '${encoding2}' encoding: ${e.message}`)); + }); + body.on("error", (e) => reject(new Error(`failed to decompress '${encoding2}' encoding: ${e}`))); + } else { + body.on("error", reject); + } + body.on("data", (chunk) => chunks.push(chunk)); + body.on("end", notifyBodyFinished); + }); + request2.on("error", reject); + listeners.push( + eventsHelper.addEventListener(this, _f.Events.Dispose, () => { + reject(new Error("Request context disposed.")); + request2.destroy(); + }) + ); + request2.on("close", () => eventsHelper.removeEventListeners(listeners)); + request2.on("socket", (socket) => { + if (request2.reusedSocket) { + reusedSocketAt = monotonicTime(); + return; + } + const happyEyeBallsTimings = timingForSocket(socket); + dnsLookupAt = happyEyeBallsTimings.dnsLookupAt; + tcpConnectionAt = happyEyeBallsTimings.tcpConnectionAt; + listeners.push( + eventsHelper.addEventListener(socket, "lookup", () => { + dnsLookupAt = monotonicTime(); + }), + eventsHelper.addEventListener(socket, "connect", () => { + tcpConnectionAt = monotonicTime(); + }), + eventsHelper.addEventListener(socket, "secureConnect", () => { + tlsHandshakeAt = monotonicTime(); + if (socket instanceof TLSSocket) { + const peerCertificate = socket.getPeerCertificate(); + securityDetails = { + protocol: socket.getProtocol() ?? void 0, + subjectName: peerCertificate.subject.CN, + validFrom: new Date(peerCertificate.valid_from).getTime() / 1e3, + validTo: new Date(peerCertificate.valid_to).getTime() / 1e3, + issuer: peerCertificate.issuer.CN + }; + } + }) + ); + serverIPAddress = socket.remoteAddress; + serverPort = socket.remotePort; + }); + request2.on("finish", () => { + requestFinishAt = monotonicTime(); + }); + progress2.log(`→ ${options2.method} ${url2.toString()}`); + if (options2.headers) { + for (const [name, value] of Object.entries(options2.headers)) + progress2.log(` ${name}: ${value}`); + } + if (options2.deadline) { + const rejectOnTimeout = () => { + reject(new Error(`Request timed out after ${options2.timeout}ms`)); + request2.destroy(); + }; + const remaining = options2.deadline - monotonicTime(); + if (remaining <= 0) { + rejectOnTimeout(); + return; + } + request2.setTimeout(remaining, rejectOnTimeout); + } + if (postData) + request2.write(postData); + request2.end(); + }); + } + _getHttpCredentials(url2) { + var _a2, _b2, _c2; + if (!((_a2 = this._defaultOptions().httpCredentials) == null ? void 0 : _a2.origin) || url2.origin.toLowerCase() === ((_c2 = (_b2 = this._defaultOptions().httpCredentials) == null ? void 0 : _b2.origin) == null ? void 0 : _c2.toLowerCase())) + return this._defaultOptions().httpCredentials; + return void 0; + } +}, _f.Events = { + Dispose: "dispose", + Request: "request", + RequestFinished: "requestfinished" +}, _f.allInstances = /* @__PURE__ */ new Set(), _f); +class SafeEmptyStreamTransform extends browserExports.Transform { + constructor(onEmptyStreamCallback) { + super(); + this._receivedSomeData = false; + this._onEmptyStreamCallback = onEmptyStreamCallback; + } + _transform(chunk, encoding2, callback) { + this._receivedSomeData = true; + callback(null, chunk); + } + _flush(callback) { + if (this._receivedSomeData) + callback(null); + else + this._onEmptyStreamCallback(); + } +} +class BrowserContextAPIRequestContext extends APIRequestContext$1 { + constructor(context) { + super(context); + this._context = context; + context.once(BrowserContext$1.Events.Close, () => this._disposeImpl()); + } + tracing() { + return this._context.tracing; + } + async dispose(options2) { + this._closeReason = options2.reason; + this.fetchResponses.clear(); + } + _defaultOptions() { + return { + userAgent: this._context._options.userAgent || this._context._browser.userAgent(), + extraHTTPHeaders: this._context._options.extraHTTPHeaders, + failOnStatusCode: void 0, + httpCredentials: this._context._options.httpCredentials, + proxy: this._context._options.proxy || this._context._browser.options.proxy, + ignoreHTTPSErrors: this._context._options.ignoreHTTPSErrors, + baseURL: this._context._options.baseURL, + clientCertificates: this._context._options.clientCertificates + }; + } + async _addCookies(cookies) { + await this._context.addCookies(cookies); + } + async _cookies(url2) { + return await this._context.cookies(url2.toString()); + } + async storageState(indexedDB2) { + return this._context.storageState(indexedDB2); + } +} +class GlobalAPIRequestContext extends APIRequestContext$1 { + constructor(playwright2, options2) { + var _a2; + super(playwright2); + this._cookieStore = new CookieStore(); + this.attribution.context = this; + if (options2.storageState) { + this._origins = (_a2 = options2.storageState.origins) == null ? void 0 : _a2.map((origin) => ({ indexedDB: [], ...origin })); + this._cookieStore.addCookies(options2.storageState.cookies || []); + } + verifyClientCertificates(options2.clientCertificates); + this._options = { + baseURL: options2.baseURL, + userAgent: options2.userAgent || getUserAgent(), + extraHTTPHeaders: options2.extraHTTPHeaders, + failOnStatusCode: !!options2.failOnStatusCode, + ignoreHTTPSErrors: !!options2.ignoreHTTPSErrors, + maxRedirects: options2.maxRedirects, + httpCredentials: options2.httpCredentials, + clientCertificates: options2.clientCertificates, + proxy: options2.proxy + }; + this._tracing = new Tracing$1(this, options2.tracesDir); + } + tracing() { + return this._tracing; + } + async dispose(options2) { + this._closeReason = options2.reason; + await this._tracing.flush(); + await this._tracing.deleteTmpTracesDir(); + this._disposeImpl(); + } + _defaultOptions() { + return this._options; + } + async _addCookies(cookies) { + this._cookieStore.addCookies(cookies); + } + async _cookies(url2) { + return this._cookieStore.cookies(url2); + } + async storageState(indexedDB2 = false) { + return { + cookies: this._cookieStore.allCookies(), + origins: (this._origins || []).map((origin) => ({ ...origin, indexedDB: indexedDB2 ? origin.indexedDB : [] })) + }; + } +} +function toHeadersArray(rawHeaders) { + const result = []; + for (let i = 0; i < rawHeaders.length; i += 2) + result.push({ name: rawHeaders[i], value: rawHeaders[i + 1] }); + return result; +} +const redirectStatus$1 = [301, 302, 303, 307, 308]; +function parseCookie(header) { + const raw = parseRawCookie(header); + if (!raw) + return null; + const cookie = { + domain: "", + path: "", + expires: -1, + httpOnly: false, + secure: false, + // From https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite + // The cookie-sending behavior if SameSite is not specified is SameSite=Lax. + sameSite: "Lax", + ...raw + }; + return cookie; +} +function serializePostData(params, headers) { + assert((params.postData ? 1 : 0) + (params.jsonData ? 1 : 0) + (params.formData ? 1 : 0) + (params.multipartData ? 1 : 0) <= 1, `Only one of 'data', 'form' or 'multipart' can be specified`); + if (params.jsonData !== void 0) { + setHeader(headers, "content-type", "application/json", true); + return Buffer.from(params.jsonData, "utf8"); + } else if (params.formData) { + const searchParams = new URLSearchParams(); + for (const { name, value } of params.formData) + searchParams.append(name, value); + setHeader(headers, "content-type", "application/x-www-form-urlencoded", true); + return Buffer.from(searchParams.toString(), "utf8"); + } else if (params.multipartData) { + const formData = new MultipartFormData(); + for (const field of params.multipartData) { + if (field.file) + formData.addFileField(field.name, field.file); + else if (field.value) + formData.addField(field.name, field.value); + } + setHeader(headers, "content-type", formData.contentTypeHeader(), true); + return formData.finish(); + } else if (params.postData !== void 0) { + setHeader(headers, "content-type", "application/octet-stream", true); + return params.postData; + } + return void 0; +} +function setHeader(headers, name, value, keepExisting = false) { + const existing = Object.entries(headers).find((pair) => pair[0].toLowerCase() === name.toLowerCase()); + if (!existing) + headers[name] = value; + else if (!keepExisting) + headers[existing[0]] = value; +} +function getHeader(headers, name) { + const existing = Object.entries(headers).find((pair) => pair[0].toLowerCase() === name.toLowerCase()); + return existing ? existing[1] : void 0; +} +function removeHeader(headers, name) { + delete headers[name]; +} +function setBasicAuthorizationHeader(headers, credentials) { + const { username, password } = credentials; + const encoded = Buffer.from(`${username || ""}:${password || ""}`).toString("base64"); + setHeader(headers, "authorization", `Basic ${encoded}`); +} +class StreamDispatcher extends Dispatcher { + constructor(scope, stream2) { + super(scope, { guid: "stream@" + createGuid(), stream: stream2 }, "Stream", {}); + this._type_Stream = true; + this._ended = false; + stream2.once("end", () => this._ended = true); + stream2.once("error", () => this._ended = true); + } + async read(params) { + const stream2 = this._object.stream; + if (this._ended) + return { binary: Buffer.from("") }; + if (!stream2.readableLength) { + const readyPromise = new ManualPromise(); + const done = () => readyPromise.resolve(); + stream2.on("readable", done); + stream2.on("end", done); + stream2.on("error", done); + await readyPromise; + stream2.off("readable", done); + stream2.off("end", done); + stream2.off("error", done); + } + const buffer2 = stream2.read(Math.min(stream2.readableLength, params.size || stream2.readableLength)); + return { binary: buffer2 || Buffer.from("") }; + } + async close() { + this._object.stream.destroy(); + } +} +class ArtifactDispatcher extends Dispatcher { + constructor(scope, artifact) { + super(scope, artifact, "Artifact", { + absolutePath: artifact.localPath() + }); + this._type_Artifact = true; + } + static from(parentScope, artifact) { + return ArtifactDispatcher.fromNullable(parentScope, artifact); + } + static fromNullable(parentScope, artifact) { + if (!artifact) + return void 0; + const result = parentScope.connection.existingDispatcher(artifact); + return result || new ArtifactDispatcher(parentScope, artifact); + } + async pathAfterFinished() { + const path2 = await this._object.localPathAfterFinished(); + return { value: path2 }; + } + async saveAs(params) { + return await new Promise((resolve, reject) => { + this._object.saveAs(async (localPath, error2) => { + if (error2) { + reject(error2); + return; + } + try { + await mkdirIfNeeded$1(params.path); + await fs.promises.copyFile(localPath, params.path); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + } + async saveAsStream() { + return await new Promise((resolve, reject) => { + this._object.saveAs(async (localPath, error2) => { + if (error2) { + reject(error2); + return; + } + try { + const readable2 = fs.createReadStream(localPath, { highWaterMark: 1024 * 1024 }); + const stream2 = new StreamDispatcher(this, readable2); + resolve({ stream: stream2 }); + await new Promise((resolve2) => { + readable2.on("close", resolve2); + readable2.on("end", resolve2); + readable2.on("error", resolve2); + }); + } catch (e) { + reject(e); + } + }); + }); + } + async stream() { + const fileName = await this._object.localPathAfterFinished(); + const readable2 = fs.createReadStream(fileName, { highWaterMark: 1024 * 1024 }); + return { stream: new StreamDispatcher(this, readable2) }; + } + async failure() { + const error2 = await this._object.failureError(); + return { error: error2 || void 0 }; + } + async cancel() { + await this._object.cancel(); + } + async delete(_, metadata) { + metadata.potentiallyClosesScope = true; + await this._object.delete(); + this._dispose(); + } +} +const ConnectionEvents$1 = { + Disconnected: Symbol("ConnectionEvents.Disconnected") +}; +const kBrowserCloseMessageId$3 = -9999; +class CRConnection extends eventsExports.EventEmitter { + constructor(transport, protocolLogger, browserLogsCollector) { + super(); + this._lastId = 0; + this._sessions = /* @__PURE__ */ new Map(); + this._closed = false; + this.setMaxListeners(0); + this._transport = transport; + this._protocolLogger = protocolLogger; + this._browserLogsCollector = browserLogsCollector; + this.rootSession = new CRSession(this, null, ""); + this._sessions.set("", this.rootSession); + this._transport.onmessage = this._onMessage.bind(this); + this._transport.onclose = this._onClose.bind(this); + } + _rawSend(sessionId, method, params) { + const id = ++this._lastId; + const message = { id, method, params }; + if (sessionId) + message.sessionId = sessionId; + this._protocolLogger("send", message); + this._transport.send(message); + return id; + } + async _onMessage(message) { + this._protocolLogger("receive", message); + if (message.id === kBrowserCloseMessageId$3) + return; + const session = this._sessions.get(message.sessionId || ""); + if (session) + session._onMessage(message); + } + _onClose(reason) { + this._closed = true; + this._transport.onmessage = void 0; + this._transport.onclose = void 0; + this._browserDisconnectedLogs = helper.formatBrowserLogs(this._browserLogsCollector.recentLogs(), reason); + this.rootSession.dispose(); + Promise.resolve().then(() => this.emit(ConnectionEvents$1.Disconnected)); + } + close() { + if (!this._closed) + this._transport.close(); + } + async createBrowserSession() { + const { sessionId } = await this.rootSession.send("Target.attachToBrowserTarget"); + return new CDPSession$1(this.rootSession, sessionId); + } +} +class CRSession extends eventsExports.EventEmitter { + constructor(connection, parentSession, sessionId, eventListener) { + super(); + this._callbacks = /* @__PURE__ */ new Map(); + this._crashed = false; + this._closed = false; + this.setMaxListeners(0); + this._connection = connection; + this._parentSession = parentSession; + this._sessionId = sessionId; + this._eventListener = eventListener; + this.on = super.on; + this.addListener = super.addListener; + this.off = super.removeListener; + this.removeListener = super.removeListener; + this.once = super.once; + } + _markAsCrashed() { + this._crashed = true; + } + createChildSession(sessionId, eventListener) { + const session = new CRSession(this._connection, this, sessionId, eventListener); + this._connection._sessions.set(sessionId, session); + return session; + } + async send(method, params) { + if (this._crashed || this._closed || this._connection._closed || this._connection._browserDisconnectedLogs) + throw new ProtocolError(this._crashed ? "crashed" : "closed", void 0, this._connection._browserDisconnectedLogs); + const id = this._connection._rawSend(this._sessionId, method, params); + return new Promise((resolve, reject) => { + this._callbacks.set(id, { resolve, reject, error: new ProtocolError("error", method) }); + }); + } + _sendMayFail(method, params) { + return this.send(method, params).catch((error2) => debugLogger.log("error", error2)); + } + _onMessage(object) { + var _a2, _b2; + if (object.id && this._callbacks.has(object.id)) { + const callback = this._callbacks.get(object.id); + this._callbacks.delete(object.id); + if (object.error) { + callback.error.setMessage(object.error.message); + callback.reject(callback.error); + } else { + callback.resolve(object.result); + } + } else if (object.id && ((_a2 = object.error) == null ? void 0 : _a2.code) === -32001) ; + else { + assert(!object.id, ((_b2 = object == null ? void 0 : object.error) == null ? void 0 : _b2.message) || void 0); + Promise.resolve().then(() => { + if (this._eventListener) + this._eventListener(object.method, object.params); + this.emit(object.method, object.params); + }); + } + } + async detach() { + if (this._closed) + throw new Error(`Session already detached. Most likely the page has been closed.`); + if (!this._parentSession) + throw new Error("Root session cannot be closed"); + await this._sendMayFail("Runtime.runIfWaitingForDebugger"); + await this._parentSession.send("Target.detachFromTarget", { sessionId: this._sessionId }); + this.dispose(); + } + dispose() { + this._closed = true; + this._connection._sessions.delete(this._sessionId); + for (const callback of this._callbacks.values()) { + callback.error.setMessage(`Internal server error, session closed.`); + callback.error.type = this._crashed ? "crashed" : "closed"; + callback.error.logs = this._connection._browserDisconnectedLogs; + callback.reject(callback.error); + } + this._callbacks.clear(); + } +} +let CDPSession$1 = (_g = class extends eventsExports.EventEmitter { + constructor(parentSession, sessionId) { + super(); + this._listeners = []; + this.guid = `cdp-session@${sessionId}`; + this._session = parentSession.createChildSession(sessionId, (method, params) => this.emit(_g.Events.Event, { method, params })); + this._listeners = [eventsHelper.addEventListener(parentSession, "Target.detachedFromTarget", (event) => { + if (event.sessionId === sessionId) + this._onClose(); + })]; + } + async send(method, params) { + return await this._session.send(method, params); + } + async detach() { + return await this._session.detach(); + } + async attachToTarget(targetId) { + const { sessionId } = await this.send("Target.attachToTarget", { targetId, flatten: true }); + return new _g(this._session, sessionId); + } + _onClose() { + eventsHelper.removeEventListeners(this._listeners); + this._session.dispose(); + this.emit(_g.Events.Closed); + } +}, _g.Events = { + Event: "event", + Closed: "close" +}, _g); +class CDPSessionDispatcher extends Dispatcher { + constructor(scope, cdpSession) { + super(scope, cdpSession, "CDPSession", {}); + this._type_CDPSession = true; + this.addObjectListener(CDPSession$1.Events.Event, ({ method, params }) => this._dispatchEvent("event", { method, params })); + this.addObjectListener(CDPSession$1.Events.Closed, () => this._dispose()); + } + async send(params) { + return { result: await this._object.send(params.method, params.params) }; + } + async detach(_, metadata) { + metadata.potentiallyClosesScope = true; + await this._object.detach(); + } +} +class JSHandleDispatcher extends Dispatcher { + constructor(scope, jsHandle) { + super(scope, jsHandle, jsHandle.asElement() ? "ElementHandle" : "JSHandle", { + preview: jsHandle.toString() + }); + this._type_JSHandle = true; + jsHandle._setPreviewCallback((preview) => this._dispatchEvent("previewUpdated", { preview })); + } + static fromJSHandle(scope, handle) { + return scope.connection.existingDispatcher(handle) || new JSHandleDispatcher(scope, handle); + } + async evaluateExpression(params) { + return { value: serializeResult(await this._object.evaluateExpression(params.expression, { isFunction: params.isFunction }, parseArgument(params.arg))) }; + } + async evaluateExpressionHandle(params) { + const jsHandle = await this._object.evaluateExpressionHandle(params.expression, { isFunction: params.isFunction }, parseArgument(params.arg)); + return { handle: ElementHandleDispatcher.fromJSOrElementHandle(this.parentScope(), jsHandle) }; + } + async getProperty(params) { + const jsHandle = await this._object.getProperty(params.name); + return { handle: ElementHandleDispatcher.fromJSOrElementHandle(this.parentScope(), jsHandle) }; + } + async getPropertyList() { + const map2 = await this._object.getProperties(); + const properties = []; + for (const [name, value] of map2) { + properties.push({ name, value: ElementHandleDispatcher.fromJSOrElementHandle(this.parentScope(), value) }); + } + return { properties }; + } + async jsonValue() { + return { value: serializeResult(await this._object.jsonValue()) }; + } + async dispose(_, metadata) { + metadata.potentiallyClosesScope = true; + this._object.dispose(); + this._dispose(); + } +} +function parseArgument(arg) { + return parseSerializedValue(arg.value, arg.handles.map((a) => a._object)); +} +function serializeResult(arg) { + return serializeValue(arg, (value) => ({ fallThrough: value })); +} +class TracingDispatcher extends Dispatcher { + constructor(scope, tracing) { + super(scope, tracing, "Tracing", {}); + this._type_Tracing = true; + } + static from(scope, tracing) { + const result = scope.connection.existingDispatcher(tracing); + return result || new TracingDispatcher(scope, tracing); + } + async tracingStart(params) { + await this._object.start(params); + } + async tracingStartChunk(params) { + return await this._object.startChunk(params); + } + async tracingGroup(params, metadata) { + const { name, location: location2 } = params; + await this._object.group(name, location2, metadata); + } + async tracingGroupEnd(params) { + await this._object.groupEnd(); + } + async tracingStopChunk(params) { + const { artifact, entries } = await this._object.stopChunk(params); + return { artifact: artifact ? ArtifactDispatcher.from(this, artifact) : void 0, entries }; + } + async tracingStop(params) { + await this._object.stop(); + } +} +class RequestDispatcher extends Dispatcher { + static from(scope, request2) { + const result = scope.connection.existingDispatcher(request2); + return result || new RequestDispatcher(scope, request2); + } + static fromNullable(scope, request2) { + return request2 ? RequestDispatcher.from(scope, request2) : void 0; + } + constructor(scope, request2) { + var _a2; + const postData = request2.postDataBuffer(); + const frame = request2.frame(); + const page = (_a2 = request2.frame()) == null ? void 0 : _a2._page; + const pageDispatcher = page ? scope.connection.existingDispatcher(page) : null; + const frameDispatcher = frame ? FrameDispatcher.from(scope, frame) : null; + super(pageDispatcher || frameDispatcher || scope, request2, "Request", { + frame: FrameDispatcher.fromNullable(scope, request2.frame()), + serviceWorker: WorkerDispatcher.fromNullable(scope, request2.serviceWorker()), + url: request2.url(), + resourceType: request2.resourceType(), + method: request2.method(), + postData: postData === null ? void 0 : postData, + headers: request2.headers(), + isNavigationRequest: request2.isNavigationRequest(), + redirectedFrom: RequestDispatcher.fromNullable(scope, request2.redirectedFrom()) + }); + this._type_Request = true; + this._browserContextDispatcher = scope; + } + async rawRequestHeaders(params) { + return { headers: await this._object.rawRequestHeaders() }; + } + async response() { + return { response: ResponseDispatcher.fromNullable(this._browserContextDispatcher, await this._object.response()) }; + } +} +class ResponseDispatcher extends Dispatcher { + constructor(scope, response2) { + super(scope, response2, "Response", { + // TODO: responses in popups can point to non-reported requests. + request: scope, + url: response2.url(), + status: response2.status(), + statusText: response2.statusText(), + headers: response2.headers(), + timing: response2.timing(), + fromServiceWorker: response2.fromServiceWorker() + }); + this._type_Response = true; + } + static from(scope, response2) { + const result = scope.connection.existingDispatcher(response2); + const requestDispatcher = RequestDispatcher.from(scope, response2.request()); + return result || new ResponseDispatcher(requestDispatcher, response2); + } + static fromNullable(scope, response2) { + return response2 ? ResponseDispatcher.from(scope, response2) : void 0; + } + async body() { + return { binary: await this._object.body() }; + } + async securityDetails() { + return { value: await this._object.securityDetails() || void 0 }; + } + async serverAddr() { + return { value: await this._object.serverAddr() || void 0 }; + } + async rawResponseHeaders(params) { + return { headers: await this._object.rawResponseHeaders() }; + } + async sizes(params) { + return { sizes: await this._object.sizes() }; + } +} +class RouteDispatcher extends Dispatcher { + constructor(scope, route) { + super(scope, route, "Route", { + // Context route can point to a non-reported request, so we send the request in the initializer. + request: scope + }); + this._type_Route = true; + this._handled = false; + } + _checkNotHandled() { + if (this._handled) + throw new Error("Route is already handled!"); + this._handled = true; + } + async continue(params, metadata) { + this._checkNotHandled(); + await this._object.continue({ + url: params.url, + method: params.method, + headers: params.headers, + postData: params.postData, + isFallback: params.isFallback + }); + } + async fulfill(params, metadata) { + this._checkNotHandled(); + await this._object.fulfill(params); + } + async abort(params, metadata) { + this._checkNotHandled(); + await this._object.abort(params.errorCode || "failed"); + } + async redirectNavigationRequest(params) { + this._checkNotHandled(); + await this._object.redirectNavigationRequest(params.url); + } +} +class WebSocketDispatcher extends Dispatcher { + constructor(scope, webSocket) { + super(scope, webSocket, "WebSocket", { + url: webSocket.url() + }); + this._type_EventTarget = true; + this._type_WebSocket = true; + this.addObjectListener(WebSocket$1.Events.FrameSent, (event) => this._dispatchEvent("frameSent", event)); + this.addObjectListener(WebSocket$1.Events.FrameReceived, (event) => this._dispatchEvent("frameReceived", event)); + this.addObjectListener(WebSocket$1.Events.SocketError, (error2) => this._dispatchEvent("socketError", { error: error2 })); + this.addObjectListener(WebSocket$1.Events.Close, () => this._dispatchEvent("close", {})); + } +} +class APIRequestContextDispatcher extends Dispatcher { + constructor(parentScope, request2) { + const tracing = TracingDispatcher.from(parentScope, request2.tracing()); + super(parentScope, request2, "APIRequestContext", { + tracing + }); + this._type_APIRequestContext = true; + this.adopt(tracing); + } + static from(scope, request2) { + const result = scope.connection.existingDispatcher(request2); + return result || new APIRequestContextDispatcher(scope, request2); + } + static fromNullable(scope, request2) { + return request2 ? APIRequestContextDispatcher.from(scope, request2) : void 0; + } + async storageState(params) { + return this._object.storageState(params.indexedDB); + } + async dispose(params, metadata) { + metadata.potentiallyClosesScope = true; + await this._object.dispose(params); + this._dispose(); + } + async fetch(params, metadata) { + const fetchResponse = await this._object.fetch(params, metadata); + return { + response: { + url: fetchResponse.url, + status: fetchResponse.status, + statusText: fetchResponse.statusText, + headers: fetchResponse.headers, + fetchUid: fetchResponse.fetchUid + } + }; + } + async fetchResponseBody(params) { + return { binary: this._object.fetchResponses.get(params.fetchUid) }; + } + async fetchLog(params) { + const log = this._object.fetchLog.get(params.fetchUid) || []; + return { log }; + } + async disposeAPIResponse(params) { + this._object.disposeResponse(params.fetchUid); + } +} +function parseAriaSnapshotUnsafe(yaml2, text) { + const result = parseAriaSnapshot(yaml2, text); + if (result.errors.length) + throw new Error(result.errors[0].message); + return result.fragment; +} +function parseAriaSnapshot(yaml2, text, options2 = {}) { + var _a2; + const lineCounter = new yaml2.LineCounter(); + const parseOptions2 = { + keepSourceTokens: true, + lineCounter, + ...options2 + }; + const yamlDoc = yaml2.parseDocument(text, parseOptions2); + const errors2 = []; + const convertRange = (range2) => { + return [lineCounter.linePos(range2[0]), lineCounter.linePos(range2[1])]; + }; + const addError = (error2) => { + errors2.push({ + message: error2.message, + range: [lineCounter.linePos(error2.pos[0]), lineCounter.linePos(error2.pos[1])] + }); + }; + const convertSeq = (container, seq2) => { + for (const item of seq2.items) { + const itemIsString = item instanceof yaml2.Scalar && typeof item.value === "string"; + if (itemIsString) { + const childNode = KeyParser.parse(item, parseOptions2, errors2); + if (childNode) { + container.children = container.children || []; + container.children.push(childNode); + } + continue; + } + const itemIsMap = item instanceof yaml2.YAMLMap; + if (itemIsMap) { + convertMap(container, item); + continue; + } + errors2.push({ + message: "Sequence items should be strings or maps", + range: convertRange(item.range || seq2.range) + }); + } + }; + const convertMap = (container, map2) => { + for (const entry of map2.items) { + container.children = container.children || []; + const keyIsString = entry.key instanceof yaml2.Scalar && typeof entry.key.value === "string"; + if (!keyIsString) { + errors2.push({ + message: "Only string keys are supported", + range: convertRange(entry.key.range || map2.range) + }); + continue; + } + const key2 = entry.key; + const value = entry.value; + if (key2.value === "text") { + const valueIsString = value instanceof yaml2.Scalar && typeof value.value === "string"; + if (!valueIsString) { + errors2.push({ + message: "Text value should be a string", + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.children.push({ + kind: "text", + text: valueOrRegex(value.value) + }); + continue; + } + if (key2.value === "/children") { + const valueIsString = value instanceof yaml2.Scalar && typeof value.value === "string"; + if (!valueIsString || value.value !== "contain" && value.value !== "equal" && value.value !== "deep-equal") { + errors2.push({ + message: 'Strict value should be "contain", "equal" or "deep-equal"', + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.containerMode = value.value; + continue; + } + if (key2.value.startsWith("/")) { + const valueIsString = value instanceof yaml2.Scalar && typeof value.value === "string"; + if (!valueIsString) { + errors2.push({ + message: "Property value should be a string", + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.props = container.props ?? {}; + container.props[key2.value.slice(1)] = valueOrRegex(value.value); + continue; + } + const childNode = KeyParser.parse(key2, parseOptions2, errors2); + if (!childNode) + continue; + const valueIsScalar = value instanceof yaml2.Scalar; + if (valueIsScalar) { + const type2 = typeof value.value; + if (type2 !== "string" && type2 !== "number" && type2 !== "boolean") { + errors2.push({ + message: "Node value should be a string or a sequence", + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.children.push({ + ...childNode, + children: [{ + kind: "text", + text: valueOrRegex(String(value.value)) + }] + }); + continue; + } + const valueIsSequence = value instanceof yaml2.YAMLSeq; + if (valueIsSequence) { + container.children.push(childNode); + convertSeq(childNode, value); + continue; + } + errors2.push({ + message: "Map values should be strings or sequences", + range: convertRange(entry.value.range || map2.range) + }); + } + }; + const fragment = { kind: "role", role: "fragment" }; + yamlDoc.errors.forEach(addError); + if (errors2.length) + return { errors: errors2, fragment }; + if (!(yamlDoc.contents instanceof yaml2.YAMLSeq)) { + errors2.push({ + message: 'Aria snapshot must be a YAML sequence, elements starting with " -"', + range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }] + }); + } + if (errors2.length) + return { errors: errors2, fragment }; + convertSeq(fragment, yamlDoc.contents); + if (errors2.length) + return { errors: errors2, fragment: emptyFragment }; + if (((_a2 = fragment.children) == null ? void 0 : _a2.length) === 1) + return { fragment: fragment.children[0], errors: errors2 }; + return { fragment, errors: errors2 }; +} +const emptyFragment = { kind: "role", role: "fragment" }; +function normalizeWhitespace(text) { + return text.replace(/[\u200b\u00ad]/g, "").replace(/[\r\n\s\t]+/g, " ").trim(); +} +function valueOrRegex(value) { + return value.startsWith("/") && value.endsWith("/") && value.length > 1 ? { pattern: value.slice(1, -1) } : normalizeWhitespace(value); +} +class KeyParser { + static parse(text, options2, errors2) { + try { + return new KeyParser(text.value)._parse(); + } catch (e) { + if (e instanceof ParserError$1) { + const message = options2.prettyErrors === false ? e.message : e.message + ":\n\n" + text.value + "\n" + " ".repeat(e.pos) + "^\n"; + errors2.push({ + message, + range: [options2.lineCounter.linePos(text.range[0]), options2.lineCounter.linePos(text.range[0] + e.pos)] + }); + return null; + } + throw e; + } + } + constructor(input) { + this._input = input; + this._pos = 0; + this._length = input.length; + } + _peek() { + return this._input[this._pos] || ""; + } + _next() { + if (this._pos < this._length) + return this._input[this._pos++]; + return null; + } + _eof() { + return this._pos >= this._length; + } + _isWhitespace() { + return !this._eof() && /\s/.test(this._peek()); + } + _skipWhitespace() { + while (this._isWhitespace()) + this._pos++; + } + _readIdentifier(type2) { + if (this._eof()) + this._throwError(`Unexpected end of input when expecting ${type2}`); + const start = this._pos; + while (!this._eof() && /[a-zA-Z]/.test(this._peek())) + this._pos++; + return this._input.slice(start, this._pos); + } + _readString() { + let result = ""; + let escaped2 = false; + while (!this._eof()) { + const ch = this._next(); + if (escaped2) { + result += ch; + escaped2 = false; + } else if (ch === "\\") { + escaped2 = true; + } else if (ch === '"') { + return result; + } else { + result += ch; + } + } + this._throwError("Unterminated string"); + } + _throwError(message, offset2 = 0) { + throw new ParserError$1(message, offset2 || this._pos); + } + _readRegex() { + let result = ""; + let escaped2 = false; + let insideClass = false; + while (!this._eof()) { + const ch = this._next(); + if (escaped2) { + result += ch; + escaped2 = false; + } else if (ch === "\\") { + escaped2 = true; + result += ch; + } else if (ch === "/" && !insideClass) { + return { pattern: result }; + } else if (ch === "[") { + insideClass = true; + result += ch; + } else if (ch === "]" && insideClass) { + result += ch; + insideClass = false; + } else { + result += ch; + } + } + this._throwError("Unterminated regex"); + } + _readStringOrRegex() { + const ch = this._peek(); + if (ch === '"') { + this._next(); + return normalizeWhitespace(this._readString()); + } + if (ch === "/") { + this._next(); + return this._readRegex(); + } + return null; + } + _readAttributes(result) { + let errorPos = this._pos; + while (true) { + this._skipWhitespace(); + if (this._peek() === "[") { + this._next(); + this._skipWhitespace(); + errorPos = this._pos; + const flagName = this._readIdentifier("attribute"); + this._skipWhitespace(); + let flagValue = ""; + if (this._peek() === "=") { + this._next(); + this._skipWhitespace(); + errorPos = this._pos; + while (this._peek() !== "]" && !this._isWhitespace() && !this._eof()) + flagValue += this._next(); + } + this._skipWhitespace(); + if (this._peek() !== "]") + this._throwError("Expected ]"); + this._next(); + this._applyAttribute(result, flagName, flagValue || "true", errorPos); + } else { + break; + } + } + } + _parse() { + this._skipWhitespace(); + const role = this._readIdentifier("role"); + this._skipWhitespace(); + const name = this._readStringOrRegex() || ""; + const result = { kind: "role", role, name }; + this._readAttributes(result); + this._skipWhitespace(); + if (!this._eof()) + this._throwError("Unexpected input"); + return result; + } + _applyAttribute(node2, key2, value, errorPos) { + if (key2 === "checked") { + this._assert(value === "true" || value === "false" || value === "mixed", 'Value of "checked" attribute must be a boolean or "mixed"', errorPos); + node2.checked = value === "true" ? true : value === "false" ? false : "mixed"; + return; + } + if (key2 === "disabled") { + this._assert(value === "true" || value === "false", 'Value of "disabled" attribute must be a boolean', errorPos); + node2.disabled = value === "true"; + return; + } + if (key2 === "expanded") { + this._assert(value === "true" || value === "false", 'Value of "expanded" attribute must be a boolean', errorPos); + node2.expanded = value === "true"; + return; + } + if (key2 === "level") { + this._assert(!isNaN(Number(value)), 'Value of "level" attribute must be a number', errorPos); + node2.level = Number(value); + return; + } + if (key2 === "pressed") { + this._assert(value === "true" || value === "false" || value === "mixed", 'Value of "pressed" attribute must be a boolean or "mixed"', errorPos); + node2.pressed = value === "true" ? true : value === "false" ? false : "mixed"; + return; + } + if (key2 === "selected") { + this._assert(value === "true" || value === "false", 'Value of "selected" attribute must be a boolean', errorPos); + node2.selected = value === "true"; + return; + } + this._assert(false, `Unsupported attribute [${key2}]`, errorPos); + } + _assert(value, message, valuePos) { + if (!value) + this._throwError(message || "Assertion error", valuePos); + } +} +let ParserError$1 = class ParserError extends Error { + constructor(message, pos) { + super(message); + this.pos = pos; + } +}; +class FrameDispatcher extends Dispatcher { + constructor(scope, frame) { + const gcBucket = frame._page.mainFrame() === frame ? "MainFrame" : "Frame"; + const pageDispatcher = scope.connection.existingDispatcher(frame._page); + super(pageDispatcher || scope, frame, "Frame", { + url: frame.url(), + name: frame.name(), + parentFrame: FrameDispatcher.fromNullable(scope, frame.parentFrame()), + loadStates: Array.from(frame._firedLifecycleEvents) + }, gcBucket); + this._type_Frame = true; + this._browserContextDispatcher = scope; + this._frame = frame; + this.addObjectListener(Frame$1.Events.AddLifecycle, (lifecycleEvent) => { + this._dispatchEvent("loadstate", { add: lifecycleEvent }); + }); + this.addObjectListener(Frame$1.Events.RemoveLifecycle, (lifecycleEvent) => { + this._dispatchEvent("loadstate", { remove: lifecycleEvent }); + }); + this.addObjectListener(Frame$1.Events.InternalNavigation, (event) => { + if (!event.isPublic) + return; + const params = { url: event.url, name: event.name, error: event.error ? event.error.message : void 0 }; + if (event.newDocument) + params.newDocument = { request: RequestDispatcher.fromNullable(this._browserContextDispatcher, event.newDocument.request || null) }; + this._dispatchEvent("navigated", params); + }); + } + static from(scope, frame) { + const result = scope.connection.existingDispatcher(frame); + return result || new FrameDispatcher(scope, frame); + } + static fromNullable(scope, frame) { + if (!frame) + return; + return FrameDispatcher.from(scope, frame); + } + async goto(params, metadata) { + return { response: ResponseDispatcher.fromNullable(this._browserContextDispatcher, await this._frame.goto(metadata, params.url, params)) }; + } + async frameElement() { + return { element: ElementHandleDispatcher.from(this, await this._frame.frameElement()) }; + } + async evaluateExpression(params, metadata) { + return { value: serializeResult(await this._frame.evaluateExpression(params.expression, { isFunction: params.isFunction }, parseArgument(params.arg))) }; + } + async evaluateExpressionHandle(params, metadata) { + return { handle: ElementHandleDispatcher.fromJSOrElementHandle(this, await this._frame.evaluateExpressionHandle(params.expression, { isFunction: params.isFunction }, parseArgument(params.arg))) }; + } + async waitForSelector(params, metadata) { + return { element: ElementHandleDispatcher.fromNullable(this, await this._frame.waitForSelector(metadata, params.selector, params)) }; + } + async dispatchEvent(params, metadata) { + return this._frame.dispatchEvent(metadata, params.selector, params.type, parseArgument(params.eventInit), params); + } + async evalOnSelector(params, metadata) { + return { value: serializeResult(await this._frame.evalOnSelector(params.selector, !!params.strict, params.expression, params.isFunction, parseArgument(params.arg))) }; + } + async evalOnSelectorAll(params, metadata) { + return { value: serializeResult(await this._frame.evalOnSelectorAll(params.selector, params.expression, params.isFunction, parseArgument(params.arg))) }; + } + async querySelector(params, metadata) { + return { element: ElementHandleDispatcher.fromNullable(this, await this._frame.querySelector(params.selector, params)) }; + } + async querySelectorAll(params, metadata) { + const elements = await this._frame.querySelectorAll(params.selector); + return { elements: elements.map((e) => ElementHandleDispatcher.from(this, e)) }; + } + async queryCount(params) { + return { value: await this._frame.queryCount(params.selector) }; + } + async content() { + return { value: await this._frame.content() }; + } + async setContent(params, metadata) { + return await this._frame.setContent(metadata, params.html, params); + } + async addScriptTag(params, metadata) { + return { element: ElementHandleDispatcher.from(this, await this._frame.addScriptTag(params)) }; + } + async addStyleTag(params, metadata) { + return { element: ElementHandleDispatcher.from(this, await this._frame.addStyleTag(params)) }; + } + async click(params, metadata) { + metadata.potentiallyClosesScope = true; + return await this._frame.click(metadata, params.selector, params); + } + async dblclick(params, metadata) { + return await this._frame.dblclick(metadata, params.selector, params); + } + async dragAndDrop(params, metadata) { + return await this._frame.dragAndDrop(metadata, params.source, params.target, params); + } + async tap(params, metadata) { + return await this._frame.tap(metadata, params.selector, params); + } + async fill(params, metadata) { + return await this._frame.fill(metadata, params.selector, params.value, params); + } + async focus(params, metadata) { + await this._frame.focus(metadata, params.selector, params); + } + async blur(params, metadata) { + await this._frame.blur(metadata, params.selector, params); + } + async textContent(params, metadata) { + const value = await this._frame.textContent(metadata, params.selector, params); + return { value: value === null ? void 0 : value }; + } + async innerText(params, metadata) { + return { value: await this._frame.innerText(metadata, params.selector, params) }; + } + async innerHTML(params, metadata) { + return { value: await this._frame.innerHTML(metadata, params.selector, params) }; + } + async getAttribute(params, metadata) { + const value = await this._frame.getAttribute(metadata, params.selector, params.name, params); + return { value: value === null ? void 0 : value }; + } + async inputValue(params, metadata) { + const value = await this._frame.inputValue(metadata, params.selector, params); + return { value }; + } + async isChecked(params, metadata) { + return { value: await this._frame.isChecked(metadata, params.selector, params) }; + } + async isDisabled(params, metadata) { + return { value: await this._frame.isDisabled(metadata, params.selector, params) }; + } + async isEditable(params, metadata) { + return { value: await this._frame.isEditable(metadata, params.selector, params) }; + } + async isEnabled(params, metadata) { + return { value: await this._frame.isEnabled(metadata, params.selector, params) }; + } + async isHidden(params, metadata) { + return { value: await this._frame.isHidden(metadata, params.selector, params) }; + } + async isVisible(params, metadata) { + return { value: await this._frame.isVisible(metadata, params.selector, params) }; + } + async hover(params, metadata) { + return await this._frame.hover(metadata, params.selector, params); + } + async selectOption(params, metadata) { + const elements = (params.elements || []).map((e) => e._elementHandle); + return { values: await this._frame.selectOption(metadata, params.selector, elements, params.options || [], params) }; + } + async setInputFiles(params, metadata) { + return await this._frame.setInputFiles(metadata, params.selector, params); + } + async type(params, metadata) { + return await this._frame.type(metadata, params.selector, params.text, params); + } + async press(params, metadata) { + return await this._frame.press(metadata, params.selector, params.key, params); + } + async check(params, metadata) { + return await this._frame.check(metadata, params.selector, params); + } + async uncheck(params, metadata) { + return await this._frame.uncheck(metadata, params.selector, params); + } + async waitForTimeout(params, metadata) { + return await this._frame.waitForTimeout(metadata, params.timeout); + } + async waitForFunction(params, metadata) { + return { handle: ElementHandleDispatcher.fromJSOrElementHandle(this, await this._frame._waitForFunctionExpression(metadata, params.expression, params.isFunction, parseArgument(params.arg), params)) }; + } + async title(params, metadata) { + return { value: await this._frame.title() }; + } + async highlight(params, metadata) { + return await this._frame.highlight(params.selector); + } + async expect(params, metadata) { + metadata.potentiallyClosesScope = true; + let expectedValue = params.expectedValue ? parseArgument(params.expectedValue) : void 0; + if (params.expression === "to.match.aria" && expectedValue) + expectedValue = parseAriaSnapshotUnsafe(yaml, expectedValue); + const result = await this._frame.expect(metadata, params.selector, { ...params, expectedValue }); + if (result.received !== void 0) + result.received = serializeResult(result.received); + return result; + } + async ariaSnapshot(params, metadata) { + return { snapshot: await this._frame.ariaSnapshot(metadata, params.selector, params) }; + } +} +class ElementHandleDispatcher extends JSHandleDispatcher { + constructor(scope, elementHandle) { + super(scope, elementHandle); + this._type_ElementHandle = true; + this._elementHandle = elementHandle; + } + static from(scope, handle) { + return scope.connection.existingDispatcher(handle) || new ElementHandleDispatcher(scope, handle); + } + static fromNullable(scope, handle) { + if (!handle) + return void 0; + return scope.connection.existingDispatcher(handle) || new ElementHandleDispatcher(scope, handle); + } + static fromJSOrElementHandle(scope, handle) { + const result = scope.connection.existingDispatcher(handle); + if (result) + return result; + const elementHandle = handle.asElement(); + if (!elementHandle) + return new JSHandleDispatcher(scope, handle); + return new ElementHandleDispatcher(scope, elementHandle); + } + async ownerFrame(params, metadata) { + const frame = await this._elementHandle.ownerFrame(); + return { frame: frame ? FrameDispatcher.from(this._browserContextDispatcher(), frame) : void 0 }; + } + async contentFrame(params, metadata) { + const frame = await this._elementHandle.contentFrame(); + return { frame: frame ? FrameDispatcher.from(this._browserContextDispatcher(), frame) : void 0 }; + } + async generateLocatorString(params, metadata) { + return { value: await this._elementHandle.generateLocatorString() }; + } + async getAttribute(params, metadata) { + const value = await this._elementHandle.getAttribute(metadata, params.name); + return { value: value === null ? void 0 : value }; + } + async inputValue(params, metadata) { + const value = await this._elementHandle.inputValue(metadata); + return { value }; + } + async textContent(params, metadata) { + const value = await this._elementHandle.textContent(metadata); + return { value: value === null ? void 0 : value }; + } + async innerText(params, metadata) { + return { value: await this._elementHandle.innerText(metadata) }; + } + async innerHTML(params, metadata) { + return { value: await this._elementHandle.innerHTML(metadata) }; + } + async isChecked(params, metadata) { + return { value: await this._elementHandle.isChecked(metadata) }; + } + async isDisabled(params, metadata) { + return { value: await this._elementHandle.isDisabled(metadata) }; + } + async isEditable(params, metadata) { + return { value: await this._elementHandle.isEditable(metadata) }; + } + async isEnabled(params, metadata) { + return { value: await this._elementHandle.isEnabled(metadata) }; + } + async isHidden(params, metadata) { + return { value: await this._elementHandle.isHidden(metadata) }; + } + async isVisible(params, metadata) { + return { value: await this._elementHandle.isVisible(metadata) }; + } + async dispatchEvent(params, metadata) { + await this._elementHandle.dispatchEvent(metadata, params.type, parseArgument(params.eventInit)); + } + async scrollIntoViewIfNeeded(params, metadata) { + await this._elementHandle.scrollIntoViewIfNeeded(metadata, params); + } + async hover(params, metadata) { + return await this._elementHandle.hover(metadata, params); + } + async click(params, metadata) { + return await this._elementHandle.click(metadata, params); + } + async dblclick(params, metadata) { + return await this._elementHandle.dblclick(metadata, params); + } + async tap(params, metadata) { + return await this._elementHandle.tap(metadata, params); + } + async selectOption(params, metadata) { + const elements = (params.elements || []).map((e) => e._elementHandle); + return { values: await this._elementHandle.selectOption(metadata, elements, params.options || [], params) }; + } + async fill(params, metadata) { + return await this._elementHandle.fill(metadata, params.value, params); + } + async selectText(params, metadata) { + await this._elementHandle.selectText(metadata, params); + } + async setInputFiles(params, metadata) { + return await this._elementHandle.setInputFiles(metadata, params); + } + async focus(params, metadata) { + await this._elementHandle.focus(metadata); + } + async type(params, metadata) { + return await this._elementHandle.type(metadata, params.text, params); + } + async press(params, metadata) { + return await this._elementHandle.press(metadata, params.key, params); + } + async check(params, metadata) { + return await this._elementHandle.check(metadata, params); + } + async uncheck(params, metadata) { + return await this._elementHandle.uncheck(metadata, params); + } + async boundingBox(params, metadata) { + const value = await this._elementHandle.boundingBox(); + return { value: value || void 0 }; + } + async screenshot(params, metadata) { + const mask = (params.mask || []).map(({ frame, selector }) => ({ + frame: frame._object, + selector + })); + return { binary: await this._elementHandle.screenshot(metadata, { ...params, mask }) }; + } + async querySelector(params, metadata) { + const handle = await this._elementHandle.querySelector(params.selector, params); + return { element: ElementHandleDispatcher.fromNullable(this.parentScope(), handle) }; + } + async querySelectorAll(params, metadata) { + const elements = await this._elementHandle.querySelectorAll(params.selector); + return { elements: elements.map((e) => ElementHandleDispatcher.from(this.parentScope(), e)) }; + } + async evalOnSelector(params, metadata) { + return { value: serializeResult(await this._elementHandle.evalOnSelector(params.selector, !!params.strict, params.expression, params.isFunction, parseArgument(params.arg))) }; + } + async evalOnSelectorAll(params, metadata) { + return { value: serializeResult(await this._elementHandle.evalOnSelectorAll(params.selector, params.expression, params.isFunction, parseArgument(params.arg))) }; + } + async waitForElementState(params, metadata) { + await this._elementHandle.waitForElementState(metadata, params.state, params); + } + async waitForSelector(params, metadata) { + return { element: ElementHandleDispatcher.fromNullable(this.parentScope(), await this._elementHandle.waitForSelector(metadata, params.selector, params)) }; + } + _browserContextDispatcher() { + const parentScope = this.parentScope().parentScope(); + if (parentScope instanceof BrowserContextDispatcher) + return parentScope; + return parentScope.parentScope(); + } +} +const source = ` +var __commonJS = obj => { + let required = false; + let result; + return function __require() { + if (!required) { + required = true; + let fn; + for (const name in obj) { fn = obj[name]; break; } + const module = { exports: {} }; + fn(module.exports, module); + result = module.exports; + } + return result; + } +}; +var __export = (target, all) => {for (var name in all) target[name] = all[name];}; +var __toESM = mod => ({ ...mod, 'default': mod }); +var __toCommonJS = mod => ({ ...mod, __esModule: true }); + + +// packages/injected/src/webSocketMock.ts +var webSocketMock_exports = {}; +__export(webSocketMock_exports, { + inject: () => inject +}); +module.exports = __toCommonJS(webSocketMock_exports); +function inject(globalThis) { + if (globalThis.__pwWebSocketDispatch) + return; + function generateId() { + const bytes = new Uint8Array(32); + globalThis.crypto.getRandomValues(bytes); + const hex = "0123456789abcdef"; + return [...bytes].map((value) => { + const high = Math.floor(value / 16); + const low = value % 16; + return hex[high] + hex[low]; + }).join(""); + } + function bufferToData(b) { + let s = ""; + for (let i = 0; i < b.length; i++) + s += String.fromCharCode(b[i]); + return { data: globalThis.btoa(s), isBase64: true }; + } + function stringToBuffer(s) { + s = globalThis.atob(s); + const b = new Uint8Array(s.length); + for (let i = 0; i < s.length; i++) + b[i] = s.charCodeAt(i); + return b.buffer; + } + function messageToData(message, cb) { + if (message instanceof globalThis.Blob) + return message.arrayBuffer().then((buffer) => cb(bufferToData(new Uint8Array(buffer)))); + if (typeof message === "string") + return cb({ data: message, isBase64: false }); + if (ArrayBuffer.isView(message)) + return cb(bufferToData(new Uint8Array(message.buffer, message.byteOffset, message.byteLength))); + return cb(bufferToData(new Uint8Array(message))); + } + function dataToMessage(data, binaryType) { + if (!data.isBase64) + return data.data; + const buffer = stringToBuffer(data.data); + return binaryType === "arraybuffer" ? buffer : new Blob([buffer]); + } + const binding = globalThis.__pwWebSocketBinding; + const NativeWebSocket = globalThis.WebSocket; + const idToWebSocket = /* @__PURE__ */ new Map(); + globalThis.__pwWebSocketDispatch = (request) => { + const ws = idToWebSocket.get(request.id); + if (!ws) + return; + if (request.type === "connect") + ws._apiConnect(); + if (request.type === "passthrough") + ws._apiPassThrough(); + if (request.type === "ensureOpened") + ws._apiEnsureOpened(); + if (request.type === "sendToPage") + ws._apiSendToPage(dataToMessage(request.data, ws.binaryType)); + if (request.type === "closePage") + ws._apiClosePage(request.code, request.reason, request.wasClean); + if (request.type === "sendToServer") + ws._apiSendToServer(dataToMessage(request.data, ws.binaryType)); + if (request.type === "closeServer") + ws._apiCloseServer(request.code, request.reason, request.wasClean); + }; + const _WebSocketMock = class _WebSocketMock extends EventTarget { + constructor(url, protocols) { + var _a, _b; + super(); + // WebSocket.CLOSED + this.CONNECTING = 0; + // WebSocket.CONNECTING + this.OPEN = 1; + // WebSocket.OPEN + this.CLOSING = 2; + // WebSocket.CLOSING + this.CLOSED = 3; + // WebSocket.CLOSED + this._oncloseListener = null; + this._onerrorListener = null; + this._onmessageListener = null; + this._onopenListener = null; + this.bufferedAmount = 0; + this.extensions = ""; + this.protocol = ""; + this.readyState = 0; + this._origin = ""; + this._passthrough = false; + this._wsBufferedMessages = []; + this._binaryType = "blob"; + this.url = new URL(url, globalThis.window.document.baseURI).href.replace(/^http/, "ws"); + this._origin = (_b = (_a = URL.parse(this.url)) == null ? void 0 : _a.origin) != null ? _b : ""; + this._protocols = protocols; + this._id = generateId(); + idToWebSocket.set(this._id, this); + binding({ type: "onCreate", id: this._id, url: this.url }); + } + // --- native WebSocket implementation --- + get binaryType() { + return this._binaryType; + } + set binaryType(type) { + this._binaryType = type; + if (this._ws) + this._ws.binaryType = type; + } + get onclose() { + return this._oncloseListener; + } + set onclose(listener) { + if (this._oncloseListener) + this.removeEventListener("close", this._oncloseListener); + this._oncloseListener = listener; + if (this._oncloseListener) + this.addEventListener("close", this._oncloseListener); + } + get onerror() { + return this._onerrorListener; + } + set onerror(listener) { + if (this._onerrorListener) + this.removeEventListener("error", this._onerrorListener); + this._onerrorListener = listener; + if (this._onerrorListener) + this.addEventListener("error", this._onerrorListener); + } + get onopen() { + return this._onopenListener; + } + set onopen(listener) { + if (this._onopenListener) + this.removeEventListener("open", this._onopenListener); + this._onopenListener = listener; + if (this._onopenListener) + this.addEventListener("open", this._onopenListener); + } + get onmessage() { + return this._onmessageListener; + } + set onmessage(listener) { + if (this._onmessageListener) + this.removeEventListener("message", this._onmessageListener); + this._onmessageListener = listener; + if (this._onmessageListener) + this.addEventListener("message", this._onmessageListener); + } + send(message) { + if (this.readyState === _WebSocketMock.CONNECTING) + throw new DOMException(\`Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.\`); + if (this.readyState !== _WebSocketMock.OPEN) + throw new DOMException(\`WebSocket is already in CLOSING or CLOSED state.\`); + if (this._passthrough) { + if (this._ws) + this._apiSendToServer(message); + } else { + messageToData(message, (data) => binding({ type: "onMessageFromPage", id: this._id, data })); + } + } + close(code, reason) { + if (code !== void 0 && code !== 1e3 && (code < 3e3 || code > 4999)) + throw new DOMException(\`Failed to execute 'close' on 'WebSocket': The close code must be either 1000, or between 3000 and 4999. \${code} is neither.\`); + if (this.readyState === _WebSocketMock.OPEN || this.readyState === _WebSocketMock.CONNECTING) + this.readyState = _WebSocketMock.CLOSING; + if (this._passthrough) + this._apiCloseServer(code, reason, true); + else + binding({ type: "onClosePage", id: this._id, code, reason, wasClean: true }); + } + // --- methods called from the routing API --- + _apiEnsureOpened() { + if (!this._ws) + this._ensureOpened(); + } + _apiSendToPage(message) { + this._ensureOpened(); + if (this.readyState !== _WebSocketMock.OPEN) + throw new DOMException(\`WebSocket is already in CLOSING or CLOSED state.\`); + this.dispatchEvent(new MessageEvent("message", { data: message, origin: this._origin, cancelable: true })); + } + _apiSendToServer(message) { + if (!this._ws) + throw new Error("Cannot send a message before connecting to the server"); + if (this._ws.readyState === _WebSocketMock.CONNECTING) + this._wsBufferedMessages.push(message); + else + this._ws.send(message); + } + _apiConnect() { + if (this._ws) + throw new Error("Can only connect to the server once"); + this._ws = new NativeWebSocket(this.url, this._protocols); + this._ws.binaryType = this._binaryType; + this._ws.onopen = () => { + for (const message of this._wsBufferedMessages) + this._ws.send(message); + this._wsBufferedMessages = []; + this._ensureOpened(); + }; + this._ws.onclose = (event) => { + this._onWSClose(event.code, event.reason, event.wasClean); + }; + this._ws.onmessage = (event) => { + if (this._passthrough) + this._apiSendToPage(event.data); + else + messageToData(event.data, (data) => binding({ type: "onMessageFromServer", id: this._id, data })); + }; + this._ws.onerror = () => { + const event = new Event("error", { cancelable: true }); + this.dispatchEvent(event); + }; + } + // This method connects to the server, and passes all messages through, + // as if WebSocketMock was not engaged. + _apiPassThrough() { + this._passthrough = true; + this._apiConnect(); + } + _apiCloseServer(code, reason, wasClean) { + if (!this._ws) { + this._onWSClose(code, reason, wasClean); + return; + } + if (this._ws.readyState === _WebSocketMock.CONNECTING || this._ws.readyState === _WebSocketMock.OPEN) + this._ws.close(code, reason); + } + _apiClosePage(code, reason, wasClean) { + if (this.readyState === _WebSocketMock.CLOSED) + return; + this.readyState = _WebSocketMock.CLOSED; + this.dispatchEvent(new CloseEvent("close", { code, reason, wasClean, cancelable: true })); + this._maybeCleanup(); + if (this._passthrough) + this._apiCloseServer(code, reason, wasClean); + else + binding({ type: "onClosePage", id: this._id, code, reason, wasClean }); + } + // --- internals --- + _ensureOpened() { + var _a; + if (this.readyState !== _WebSocketMock.CONNECTING) + return; + this.extensions = ((_a = this._ws) == null ? void 0 : _a.extensions) || ""; + if (this._ws) + this.protocol = this._ws.protocol; + else if (Array.isArray(this._protocols)) + this.protocol = this._protocols[0] || ""; + else + this.protocol = this._protocols || ""; + this.readyState = _WebSocketMock.OPEN; + this.dispatchEvent(new Event("open", { cancelable: true })); + } + _onWSClose(code, reason, wasClean) { + if (this._passthrough) + this._apiClosePage(code, reason, wasClean); + else + binding({ type: "onCloseServer", id: this._id, code, reason, wasClean }); + if (this._ws) { + this._ws.onopen = null; + this._ws.onclose = null; + this._ws.onmessage = null; + this._ws.onerror = null; + this._ws = void 0; + this._wsBufferedMessages = []; + } + this._maybeCleanup(); + } + _maybeCleanup() { + if (this.readyState === _WebSocketMock.CLOSED && !this._ws) + idToWebSocket.delete(this._id); + } + }; + _WebSocketMock.CONNECTING = 0; + // WebSocket.CONNECTING + _WebSocketMock.OPEN = 1; + // WebSocket.OPEN + _WebSocketMock.CLOSING = 2; + // WebSocket.CLOSING + _WebSocketMock.CLOSED = 3; + let WebSocketMock = _WebSocketMock; + globalThis.WebSocket = class WebSocket extends WebSocketMock { + }; +} +`; +const _WebSocketRouteDispatcher = class _WebSocketRouteDispatcher2 extends Dispatcher { + constructor(scope, id, url2, frame) { + super(scope, { guid: "webSocketRoute@" + createGuid() }, "WebSocketRoute", { url: url2 }); + this._type_WebSocketRoute = true; + this._id = id; + this._frame = frame; + this._eventListeners.push( + // When the frame navigates or detaches, there will be no more communication + // from the mock websocket, so pretend like it was closed. + eventsHelper.addEventListener(frame._page, Page$1.Events.InternalFrameNavigatedToNewDocument, (frame2) => { + if (frame2 === this._frame) + this._executionContextGone(); + }), + eventsHelper.addEventListener(frame._page, Page$1.Events.FrameDetached, (frame2) => { + if (frame2 === this._frame) + this._executionContextGone(); + }), + eventsHelper.addEventListener(frame._page, Page$1.Events.Close, () => this._executionContextGone()), + eventsHelper.addEventListener(frame._page, Page$1.Events.Crash, () => this._executionContextGone()) + ); + _WebSocketRouteDispatcher2._idToDispatcher.set(this._id, this); + scope._dispatchEvent("webSocketRoute", { webSocketRoute: this }); + } + static async installIfNeeded(connection, target) { + const kBindingName2 = "__pwWebSocketBinding"; + const context = target instanceof Page$1 ? target.browserContext : target; + if (!context.hasBinding(kBindingName2)) { + await context.exposeBinding(kBindingName2, false, (source2, payload) => { + if (payload.type === "onCreate") { + const contextDispatcher = connection.existingDispatcher(context); + const pageDispatcher = contextDispatcher ? PageDispatcher.fromNullable(contextDispatcher, source2.page) : void 0; + let scope; + if (pageDispatcher && matchesPattern(pageDispatcher, context._options.baseURL, payload.url)) + scope = pageDispatcher; + else if (contextDispatcher && matchesPattern(contextDispatcher, context._options.baseURL, payload.url)) + scope = contextDispatcher; + if (scope) { + new _WebSocketRouteDispatcher2(scope, payload.id, payload.url, source2.frame); + } else { + const request2 = { id: payload.id, type: "passthrough" }; + source2.frame.evaluateExpression(`globalThis.__pwWebSocketDispatch(${JSON.stringify(request2)})`).catch(() => { + }); + } + return; + } + const dispatcher = _WebSocketRouteDispatcher2._idToDispatcher.get(payload.id); + if (payload.type === "onMessageFromPage") + dispatcher == null ? void 0 : dispatcher._dispatchEvent("messageFromPage", { message: payload.data.data, isBase64: payload.data.isBase64 }); + if (payload.type === "onMessageFromServer") + dispatcher == null ? void 0 : dispatcher._dispatchEvent("messageFromServer", { message: payload.data.data, isBase64: payload.data.isBase64 }); + if (payload.type === "onClosePage") + dispatcher == null ? void 0 : dispatcher._dispatchEvent("closePage", { code: payload.code, reason: payload.reason, wasClean: payload.wasClean }); + if (payload.type === "onCloseServer") + dispatcher == null ? void 0 : dispatcher._dispatchEvent("closeServer", { code: payload.code, reason: payload.reason, wasClean: payload.wasClean }); + }); + } + const kInitScriptName = "webSocketMockSource"; + if (!target.initScripts.find((s) => s.name === kInitScriptName)) { + await target.addInitScript(` + (() => { + const module = {}; + ${source} + (module.exports.inject())(globalThis); + })(); + `, kInitScriptName); + } + } + async connect(params) { + await this._evaluateAPIRequest({ id: this._id, type: "connect" }); + } + async ensureOpened(params) { + await this._evaluateAPIRequest({ id: this._id, type: "ensureOpened" }); + } + async sendToPage(params) { + await this._evaluateAPIRequest({ id: this._id, type: "sendToPage", data: { data: params.message, isBase64: params.isBase64 } }); + } + async sendToServer(params) { + await this._evaluateAPIRequest({ id: this._id, type: "sendToServer", data: { data: params.message, isBase64: params.isBase64 } }); + } + async closePage(params) { + await this._evaluateAPIRequest({ id: this._id, type: "closePage", code: params.code, reason: params.reason, wasClean: params.wasClean }); + } + async closeServer(params) { + await this._evaluateAPIRequest({ id: this._id, type: "closeServer", code: params.code, reason: params.reason, wasClean: params.wasClean }); + } + async _evaluateAPIRequest(request2) { + await this._frame.evaluateExpression(`globalThis.__pwWebSocketDispatch(${JSON.stringify(request2)})`).catch(() => { + }); + } + _onDispose() { + _WebSocketRouteDispatcher2._idToDispatcher.delete(this._id); + } + _executionContextGone() { + if (!this._disposed) { + this._dispatchEvent("closePage", { wasClean: true }); + this._dispatchEvent("closeServer", { wasClean: true }); + } + } +}; +_WebSocketRouteDispatcher._idToDispatcher = /* @__PURE__ */ new Map(); +let WebSocketRouteDispatcher = _WebSocketRouteDispatcher; +function matchesPattern(dispatcher, baseURL, url2) { + for (const pattern of dispatcher._webSocketInterceptionPatterns || []) { + const urlMatch = pattern.regexSource ? new RegExp(pattern.regexSource, pattern.regexFlags) : pattern.glob; + if (urlMatches(baseURL, url2, urlMatch, true)) + return true; + } + return false; +} +class PageDispatcher extends Dispatcher { + constructor(parentScope, page) { + var _a2; + const mainFrame = FrameDispatcher.from(parentScope, page.mainFrame()); + super(parentScope, page, "Page", { + mainFrame, + viewportSize: (_a2 = page.emulatedSize()) == null ? void 0 : _a2.viewport, + isClosed: page.isClosed(), + opener: PageDispatcher.fromNullable(parentScope, page.opener()) + }); + this._type_EventTarget = true; + this._type_Page = true; + this._subscriptions = /* @__PURE__ */ new Set(); + this._webSocketInterceptionPatterns = []; + this._bindings = []; + this._initScripts = []; + this._interceptionUrlMatchers = []; + this._locatorHandlers = /* @__PURE__ */ new Set(); + this._jsCoverageActive = false; + this._cssCoverageActive = false; + this.adopt(mainFrame); + this._page = page; + this._requestInterceptor = (route, request2) => { + const matchesSome = this._interceptionUrlMatchers.some((urlMatch) => urlMatches(this._page.browserContext._options.baseURL, request2.url(), urlMatch)); + if (!matchesSome) { + route.continue({ isFallback: true }).catch(() => { + }); + return; + } + this._dispatchEvent("route", { route: new RouteDispatcher(RequestDispatcher.from(this.parentScope(), request2), route) }); + }; + this.addObjectListener(Page$1.Events.Close, () => { + this._dispatchEvent("close"); + this._dispose(); + }); + this.addObjectListener(Page$1.Events.Crash, () => this._dispatchEvent("crash")); + this.addObjectListener(Page$1.Events.Download, (download) => { + this._dispatchEvent("download", { url: download.url, suggestedFilename: download.suggestedFilename(), artifact: ArtifactDispatcher.from(parentScope, download.artifact) }); + }); + this.addObjectListener(Page$1.Events.EmulatedSizeChanged, () => { + var _a3; + return this._dispatchEvent("viewportSizeChanged", { viewportSize: (_a3 = page.emulatedSize()) == null ? void 0 : _a3.viewport }); + }); + this.addObjectListener(Page$1.Events.FileChooser, (fileChooser) => this._dispatchEvent("fileChooser", { + element: ElementHandleDispatcher.from(mainFrame, fileChooser.element()), + isMultiple: fileChooser.isMultiple() + })); + this.addObjectListener(Page$1.Events.FrameAttached, (frame) => this._onFrameAttached(frame)); + this.addObjectListener(Page$1.Events.FrameDetached, (frame) => this._onFrameDetached(frame)); + this.addObjectListener(Page$1.Events.LocatorHandlerTriggered, (uid) => this._dispatchEvent("locatorHandlerTriggered", { uid })); + this.addObjectListener(Page$1.Events.WebSocket, (webSocket) => this._dispatchEvent("webSocket", { webSocket: new WebSocketDispatcher(this, webSocket) })); + this.addObjectListener(Page$1.Events.Worker, (worker) => this._dispatchEvent("worker", { worker: new WorkerDispatcher(this, worker) })); + this.addObjectListener(Page$1.Events.Video, (artifact) => this._dispatchEvent("video", { artifact: ArtifactDispatcher.from(parentScope, artifact) })); + if (page.video) + this._dispatchEvent("video", { artifact: ArtifactDispatcher.from(this.parentScope(), page.video) }); + const frames = page.frameManager.frames(); + for (let i = 1; i < frames.length; i++) + this._onFrameAttached(frames[i]); + } + static from(parentScope, page) { + return PageDispatcher.fromNullable(parentScope, page); + } + static fromNullable(parentScope, page) { + if (!page) + return void 0; + const result = parentScope.connection.existingDispatcher(page); + return result || new PageDispatcher(parentScope, page); + } + page() { + return this._page; + } + async exposeBinding(params, metadata) { + const binding2 = await this._page.exposeBinding(params.name, !!params.needsHandle, (source2, ...args) => { + if (this._disposed) + return; + const binding22 = new BindingCallDispatcher(this, params.name, !!params.needsHandle, source2, args); + this._dispatchEvent("bindingCall", { binding: binding22 }); + return binding22.promise(); + }); + this._bindings.push(binding2); + } + async setExtraHTTPHeaders(params, metadata) { + await this._page.setExtraHTTPHeaders(params.headers); + } + async reload(params, metadata) { + return { response: ResponseDispatcher.fromNullable(this.parentScope(), await this._page.reload(metadata, params)) }; + } + async goBack(params, metadata) { + return { response: ResponseDispatcher.fromNullable(this.parentScope(), await this._page.goBack(metadata, params)) }; + } + async goForward(params, metadata) { + return { response: ResponseDispatcher.fromNullable(this.parentScope(), await this._page.goForward(metadata, params)) }; + } + async requestGC(params, metadata) { + await this._page.requestGC(); + } + async registerLocatorHandler(params, metadata) { + const uid = this._page.registerLocatorHandler(params.selector, params.noWaitAfter); + this._locatorHandlers.add(uid); + return { uid }; + } + async resolveLocatorHandlerNoReply(params, metadata) { + this._page.resolveLocatorHandler(params.uid, params.remove); + } + async unregisterLocatorHandler(params, metadata) { + this._page.unregisterLocatorHandler(params.uid); + this._locatorHandlers.delete(params.uid); + } + async emulateMedia(params, metadata) { + await this._page.emulateMedia({ + media: params.media, + colorScheme: params.colorScheme, + reducedMotion: params.reducedMotion, + forcedColors: params.forcedColors, + contrast: params.contrast + }); + } + async setViewportSize(params, metadata) { + await this._page.setViewportSize(params.viewportSize); + } + async addInitScript(params, metadata) { + this._initScripts.push(await this._page.addInitScript(params.source)); + } + async setNetworkInterceptionPatterns(params, metadata) { + const hadMatchers = this._interceptionUrlMatchers.length > 0; + if (!params.patterns.length) { + if (hadMatchers) + await this._page.removeRequestInterceptor(this._requestInterceptor); + this._interceptionUrlMatchers = []; + } else { + this._interceptionUrlMatchers = params.patterns.map((pattern) => pattern.regexSource ? new RegExp(pattern.regexSource, pattern.regexFlags) : pattern.glob); + if (!hadMatchers) + await this._page.addRequestInterceptor(this._requestInterceptor); + } + } + async setWebSocketInterceptionPatterns(params, metadata) { + this._webSocketInterceptionPatterns = params.patterns; + if (params.patterns.length) + await WebSocketRouteDispatcher.installIfNeeded(this.connection, this._page); + } + async expectScreenshot(params, metadata) { + const mask = (params.mask || []).map(({ frame, selector }) => ({ + frame: frame._object, + selector + })); + const locator = params.locator ? { + frame: params.locator.frame._object, + selector: params.locator.selector + } : void 0; + return await this._page.expectScreenshot(metadata, { + ...params, + locator, + mask + }); + } + async screenshot(params, metadata) { + const mask = (params.mask || []).map(({ frame, selector }) => ({ + frame: frame._object, + selector + })); + return { binary: await this._page.screenshot(metadata, { ...params, mask }) }; + } + async close(params, metadata) { + if (!params.runBeforeUnload) + metadata.potentiallyClosesScope = true; + await this._page.close(metadata, params); + } + async updateSubscription(params) { + if (params.event === "fileChooser") + await this._page.setFileChooserInterceptedBy(params.enabled, this); + if (params.enabled) + this._subscriptions.add(params.event); + else + this._subscriptions.delete(params.event); + } + async keyboardDown(params, metadata) { + await this._page.keyboard.down(params.key); + } + async keyboardUp(params, metadata) { + await this._page.keyboard.up(params.key); + } + async keyboardInsertText(params, metadata) { + await this._page.keyboard.insertText(params.text); + } + async keyboardType(params, metadata) { + await this._page.keyboard.type(params.text, params); + } + async keyboardPress(params, metadata) { + await this._page.keyboard.press(params.key, params); + } + async mouseMove(params, metadata) { + await this._page.mouse.move(params.x, params.y, params, metadata); + } + async mouseDown(params, metadata) { + await this._page.mouse.down(params, metadata); + } + async mouseUp(params, metadata) { + await this._page.mouse.up(params, metadata); + } + async mouseClick(params, metadata) { + await this._page.mouse.click(params.x, params.y, params, metadata); + } + async mouseWheel(params, metadata) { + await this._page.mouse.wheel(params.deltaX, params.deltaY); + } + async touchscreenTap(params, metadata) { + await this._page.touchscreen.tap(params.x, params.y, metadata); + } + async accessibilitySnapshot(params, metadata) { + const rootAXNode = await this._page.accessibility.snapshot({ + interestingOnly: params.interestingOnly, + root: params.root ? params.root._elementHandle : void 0 + }); + return { rootAXNode: rootAXNode || void 0 }; + } + async pdf(params, metadata) { + if (!this._page.pdf) + throw new Error("PDF generation is only supported for Headless Chromium"); + const buffer2 = await this._page.pdf(params); + return { pdf: buffer2 }; + } + async snapshotForAI(params, metadata) { + return { snapshot: await this._page.snapshotForAI(metadata) }; + } + async bringToFront(params, metadata) { + await this._page.bringToFront(); + } + async startJSCoverage(params, metadata) { + this._jsCoverageActive = true; + const coverage = this._page.coverage; + await coverage.startJSCoverage(params); + } + async stopJSCoverage(params, metadata) { + const coverage = this._page.coverage; + const result = await coverage.stopJSCoverage(); + this._jsCoverageActive = false; + return result; + } + async startCSSCoverage(params, metadata) { + this._cssCoverageActive = true; + const coverage = this._page.coverage; + await coverage.startCSSCoverage(params); + } + async stopCSSCoverage(params, metadata) { + const coverage = this._page.coverage; + const result = await coverage.stopCSSCoverage(); + this._cssCoverageActive = false; + return result; + } + _onFrameAttached(frame) { + this._dispatchEvent("frameAttached", { frame: FrameDispatcher.from(this.parentScope(), frame) }); + } + _onFrameDetached(frame) { + this._dispatchEvent("frameDetached", { frame: FrameDispatcher.from(this.parentScope(), frame) }); + } + _onDispose() { + if (this._page.isClosedOrClosingOrCrashed()) + return; + this._interceptionUrlMatchers = []; + this._page.removeRequestInterceptor(this._requestInterceptor).catch(() => { + }); + this._page.removeExposedBindings(this._bindings).catch(() => { + }); + this._bindings = []; + this._page.removeInitScripts(this._initScripts).catch(() => { + }); + this._initScripts = []; + for (const uid of this._locatorHandlers) + this._page.unregisterLocatorHandler(uid); + this._locatorHandlers.clear(); + this._page.setFileChooserInterceptedBy(false, this).catch(() => { + }); + if (this._jsCoverageActive) + this._page.coverage.stopJSCoverage().catch(() => { + }); + this._jsCoverageActive = false; + if (this._cssCoverageActive) + this._page.coverage.stopCSSCoverage().catch(() => { + }); + this._cssCoverageActive = false; + } +} +class WorkerDispatcher extends Dispatcher { + constructor(scope, worker) { + super(scope, worker, "Worker", { + url: worker.url + }); + this._type_Worker = true; + this.addObjectListener(Worker$1.Events.Close, () => this._dispatchEvent("close")); + } + static fromNullable(scope, worker) { + if (!worker) + return void 0; + const result = scope.connection.existingDispatcher(worker); + return result || new WorkerDispatcher(scope, worker); + } + async evaluateExpression(params, metadata) { + return { value: serializeResult(await this._object.evaluateExpression(params.expression, params.isFunction, parseArgument(params.arg))) }; + } + async evaluateExpressionHandle(params, metadata) { + return { handle: JSHandleDispatcher.fromJSHandle(this, await this._object.evaluateExpressionHandle(params.expression, params.isFunction, parseArgument(params.arg))) }; + } +} +class BindingCallDispatcher extends Dispatcher { + constructor(scope, name, needsHandle, source2, args) { + const frameDispatcher = FrameDispatcher.from(scope.parentScope(), source2.frame); + super(scope, { guid: "bindingCall@" + createGuid() }, "BindingCall", { + frame: frameDispatcher, + name, + args: needsHandle ? void 0 : args.map(serializeResult), + handle: needsHandle ? ElementHandleDispatcher.fromJSOrElementHandle(frameDispatcher, args[0]) : void 0 + }); + this._type_BindingCall = true; + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + } + promise() { + return this._promise; + } + async resolve(params, metadata) { + this._resolve(parseArgument(params.result)); + this._dispose(); + } + async reject(params, metadata) { + this._reject(parseError$1(params.error)); + this._dispose(); + } +} +class DialogDispatcher extends Dispatcher { + constructor(scope, dialog) { + const page = PageDispatcher.fromNullable(scope, dialog.page().initializedOrUndefined()); + super(page || scope, dialog, "Dialog", { + page, + type: dialog.type(), + message: dialog.message(), + defaultValue: dialog.defaultValue() + }); + this._type_Dialog = true; + } + async accept(params) { + await this._object.accept(params.promptText); + } + async dismiss() { + await this._object.dismiss(); + } +} +let Download$1 = class Download { + constructor(page, downloadsPath, uuid, url2, suggestedFilename) { + const unaccessibleErrorMessage = page.browserContext._options.acceptDownloads === "deny" ? "Pass { acceptDownloads: true } when you are creating your browser context." : void 0; + this.artifact = new Artifact$1(page, path.join(downloadsPath, uuid), unaccessibleErrorMessage, () => { + return this._page.browserContext.cancelDownload(uuid); + }); + this._page = page; + this.url = url2; + this._suggestedFilename = suggestedFilename; + page.browserContext._downloads.add(this); + if (suggestedFilename !== void 0) + this._fireDownloadEvent(); + } + page() { + return this._page; + } + _filenameSuggested(suggestedFilename) { + assert(this._suggestedFilename === void 0); + this._suggestedFilename = suggestedFilename; + this._fireDownloadEvent(); + } + suggestedFilename() { + return this._suggestedFilename; + } + _fireDownloadEvent() { + this._page.instrumentation.onDownload(this._page, this); + this._page.emit(Page$1.Events.Download, this); + } +}; +let Browser$1 = (_h = class extends SdkObject { + constructor(parent, options2) { + super(parent, "browser"); + this._downloads = /* @__PURE__ */ new Map(); + this._defaultContext = null; + this._startedClosing = false; + this._idToVideo = /* @__PURE__ */ new Map(); + this._isCollocatedWithServer = true; + this.attribution.browser = this; + this.options = options2; + this.instrumentation.onBrowserOpen(this); + } + async newContext(metadata, options2) { + var _a2; + validateBrowserContextOptions(options2, this.options); + let clientCertificatesProxy; + if ((_a2 = options2.clientCertificates) == null ? void 0 : _a2.length) { + clientCertificatesProxy = new ClientCertificatesProxy(options2); + options2 = { ...options2 }; + options2.proxyOverride = await clientCertificatesProxy.listen(); + options2.internalIgnoreHTTPSErrors = true; + } + let context; + try { + context = await this.doCreateNewContext(options2); + } catch (error2) { + await (clientCertificatesProxy == null ? void 0 : clientCertificatesProxy.close()); + throw error2; + } + context._clientCertificatesProxy = clientCertificatesProxy; + if (options2.storageState) + await context.setStorageState(metadata, options2.storageState); + this.emit(_h.Events.Context, context); + return context; + } + async newContextForReuse(params, metadata) { + const hash2 = BrowserContext$1.reusableContextHash(params); + if (!this._contextForReuse || hash2 !== this._contextForReuse.hash || !this._contextForReuse.context.canResetForReuse()) { + if (this._contextForReuse) + await this._contextForReuse.context.close({ reason: "Context reused" }); + this._contextForReuse = { context: await this.newContext(metadata, params), hash: hash2 }; + return { context: this._contextForReuse.context, needsReset: false }; + } + await this._contextForReuse.context.stopPendingOperations("Context recreated"); + return { context: this._contextForReuse.context, needsReset: true }; + } + async stopPendingOperations(reason) { + var _a2, _b2; + await ((_b2 = (_a2 = this._contextForReuse) == null ? void 0 : _a2.context) == null ? void 0 : _b2.stopPendingOperations(reason)); + } + _downloadCreated(page, uuid, url2, suggestedFilename) { + const download = new Download$1(page, this.options.downloadsPath || "", uuid, url2, suggestedFilename); + this._downloads.set(uuid, download); + } + _downloadFilenameSuggested(uuid, suggestedFilename) { + const download = this._downloads.get(uuid); + if (!download) + return; + download._filenameSuggested(suggestedFilename); + } + _downloadFinished(uuid, error2) { + const download = this._downloads.get(uuid); + if (!download) + return; + download.artifact.reportFinished(error2 ? new Error(error2) : void 0); + this._downloads.delete(uuid); + } + _videoStarted(context, videoId, path2, pageOrError) { + const artifact = new Artifact$1(context, path2); + this._idToVideo.set(videoId, { context, artifact }); + pageOrError.then((page) => { + if (page instanceof Page$1) { + page.video = artifact; + page.emitOnContext(BrowserContext$1.Events.VideoStarted, artifact); + page.emit(Page$1.Events.Video, artifact); + } + }); + } + _takeVideo(videoId) { + const video = this._idToVideo.get(videoId); + this._idToVideo.delete(videoId); + return video == null ? void 0 : video.artifact; + } + _didClose() { + for (const context of this.contexts()) + context._browserClosed(); + if (this._defaultContext) + this._defaultContext._browserClosed(); + this.emit(_h.Events.Disconnected); + this.instrumentation.onBrowserClose(this); + } + async close(options2) { + if (!this._startedClosing) { + if (options2.reason) + this._closeReason = options2.reason; + this._startedClosing = true; + await this.options.browserProcess.close(); + } + if (this.isConnected()) + await new Promise((x) => this.once(_h.Events.Disconnected, x)); + } + async killForTests() { + await this.options.browserProcess.kill(); + } +}, _h.Events = { + Context: "context", + Disconnected: "disconnected" +}, _h); +async function getAccessibilityTree$2(client, needle) { + const { nodes } = await client.send("Accessibility.getFullAXTree"); + const tree = CRAXNode.createTree(client, nodes); + return { + tree, + needle: needle ? await tree._findElement(needle) : null + }; +} +class CRAXNode { + constructor(client, payload) { + this._children = []; + this._richlyEditable = false; + this._editable = false; + this._focusable = false; + this._expanded = false; + this._hidden = false; + this._client = client; + this._payload = payload; + this._name = this._payload.name ? this._payload.name.value : ""; + this._role = this._payload.role ? this._payload.role.value : "Unknown"; + for (const property of this._payload.properties || []) { + if (property.name === "editable") { + this._richlyEditable = property.value.value === "richtext"; + this._editable = true; + } + if (property.name === "focusable") + this._focusable = property.value.value; + if (property.name === "expanded") + this._expanded = property.value.value; + if (property.name === "hidden") + this._hidden = property.value.value; + } + } + _isPlainTextField() { + if (this._richlyEditable) + return false; + if (this._editable) + return true; + return this._role === "textbox" || this._role === "ComboBox" || this._role === "searchbox"; + } + _isTextOnlyObject() { + const role = this._role; + return role === "LineBreak" || role === "text" || role === "InlineTextBox" || role === "StaticText"; + } + _hasFocusableChild() { + if (this._cachedHasFocusableChild === void 0) { + this._cachedHasFocusableChild = false; + for (const child of this._children) { + if (child._focusable || child._hasFocusableChild()) { + this._cachedHasFocusableChild = true; + break; + } + } + } + return this._cachedHasFocusableChild; + } + children() { + return this._children; + } + async _findElement(element) { + const objectId = element._objectId; + const { node: { backendNodeId } } = await this._client.send("DOM.describeNode", { objectId }); + const needle = this.find((node2) => node2._payload.backendDOMNodeId === backendNodeId); + return needle || null; + } + find(predicate) { + if (predicate(this)) + return this; + for (const child of this._children) { + const result = child.find(predicate); + if (result) + return result; + } + return null; + } + isLeafNode() { + if (!this._children.length) + return true; + if (this._isPlainTextField() || this._isTextOnlyObject()) + return true; + switch (this._role) { + case "doc-cover": + case "graphics-symbol": + case "img": + case "Meter": + case "scrollbar": + case "slider": + case "separator": + case "progressbar": + return true; + } + if (this._hasFocusableChild()) + return false; + if (this._focusable && this._role !== "WebArea" && this._role !== "RootWebArea" && this._name) + return true; + if (this._role === "heading" && this._name) + return true; + return false; + } + isControl() { + switch (this._role) { + case "button": + case "checkbox": + case "ColorWell": + case "combobox": + case "DisclosureTriangle": + case "listbox": + case "menu": + case "menubar": + case "menuitem": + case "menuitemcheckbox": + case "menuitemradio": + case "radio": + case "scrollbar": + case "searchbox": + case "slider": + case "spinbutton": + case "switch": + case "tab": + case "textbox": + case "tree": + return true; + default: + return false; + } + } + isInteresting(insideControl) { + const role = this._role; + if (role === "Ignored" || this._hidden) + return false; + if (this._focusable || this._richlyEditable) + return true; + if (this.isControl()) + return true; + if (insideControl) + return false; + return this.isLeafNode() && !!this._name; + } + normalizedRole() { + switch (this._role) { + case "RootWebArea": + return "WebArea"; + case "StaticText": + return "text"; + default: + return this._role; + } + } + serialize() { + const properties = /* @__PURE__ */ new Map(); + for (const property of this._payload.properties || []) + properties.set(property.name.toLowerCase(), property.value.value); + if (this._payload.description) + properties.set("description", this._payload.description.value); + const node2 = { + role: this.normalizedRole(), + name: this._payload.name ? this._payload.name.value || "" : "" + }; + const userStringProperties = [ + "description", + "keyshortcuts", + "roledescription", + "valuetext" + ]; + for (const userStringProperty of userStringProperties) { + if (!properties.has(userStringProperty)) + continue; + node2[userStringProperty] = properties.get(userStringProperty); + } + const booleanProperties = [ + "disabled", + "expanded", + "focused", + "modal", + "multiline", + "multiselectable", + "readonly", + "required", + "selected" + ]; + for (const booleanProperty of booleanProperties) { + if (booleanProperty === "focused" && (this._role === "WebArea" || this._role === "RootWebArea")) + continue; + const value = properties.get(booleanProperty); + if (!value) + continue; + node2[booleanProperty] = value; + } + const numericalProperties = [ + "level", + "valuemax", + "valuemin" + ]; + for (const numericalProperty of numericalProperties) { + if (!properties.has(numericalProperty)) + continue; + node2[numericalProperty] = properties.get(numericalProperty); + } + const tokenProperties = [ + "autocomplete", + "haspopup", + "invalid", + "orientation" + ]; + for (const tokenProperty of tokenProperties) { + const value = properties.get(tokenProperty); + if (!value || value === "false") + continue; + node2[tokenProperty] = value; + } + const axNode = node2; + if (this._payload.value) { + if (typeof this._payload.value.value === "string") + axNode.valueString = this._payload.value.value; + if (typeof this._payload.value.value === "number") + axNode.valueNumber = this._payload.value.value; + } + if (properties.has("checked")) + axNode.checked = properties.get("checked") === "true" ? "checked" : properties.get("checked") === "false" ? "unchecked" : "mixed"; + if (properties.has("pressed")) + axNode.pressed = properties.get("pressed") === "true" ? "pressed" : properties.get("pressed") === "false" ? "released" : "mixed"; + return axNode; + } + static createTree(client, payloads) { + const nodeById = /* @__PURE__ */ new Map(); + for (const payload of payloads) + nodeById.set(payload.nodeId, new CRAXNode(client, payload)); + for (const node2 of nodeById.values()) { + for (const childId of node2._payload.childIds || []) + node2._children.push(nodeById.get(childId)); + } + return nodeById.values().next().value; + } +} +class CRCoverage { + constructor(client) { + this._jsCoverage = new JSCoverage(client); + this._cssCoverage = new CSSCoverage(client); + } + async startJSCoverage(options2) { + return await this._jsCoverage.start(options2); + } + async stopJSCoverage() { + return await this._jsCoverage.stop(); + } + async startCSSCoverage(options2) { + return await this._cssCoverage.start(options2); + } + async stopCSSCoverage() { + return await this._cssCoverage.stop(); + } +} +class JSCoverage { + constructor(client) { + this._reportAnonymousScripts = false; + this._client = client; + this._enabled = false; + this._scriptIds = /* @__PURE__ */ new Set(); + this._scriptSources = /* @__PURE__ */ new Map(); + this._eventListeners = []; + this._resetOnNavigation = false; + } + async start(options2) { + assert(!this._enabled, "JSCoverage is already enabled"); + const { + resetOnNavigation = true, + reportAnonymousScripts = false + } = options2; + this._resetOnNavigation = resetOnNavigation; + this._reportAnonymousScripts = reportAnonymousScripts; + this._enabled = true; + this._scriptIds.clear(); + this._scriptSources.clear(); + this._eventListeners = [ + eventsHelper.addEventListener(this._client, "Debugger.scriptParsed", this._onScriptParsed.bind(this)), + eventsHelper.addEventListener(this._client, "Runtime.executionContextsCleared", this._onExecutionContextsCleared.bind(this)), + eventsHelper.addEventListener(this._client, "Debugger.paused", this._onDebuggerPaused.bind(this)) + ]; + await Promise.all([ + this._client.send("Profiler.enable"), + this._client.send("Profiler.startPreciseCoverage", { callCount: true, detailed: true }), + this._client.send("Debugger.enable"), + this._client.send("Debugger.setSkipAllPauses", { skip: true }) + ]); + } + _onDebuggerPaused() { + this._client.send("Debugger.resume"); + } + _onExecutionContextsCleared() { + if (!this._resetOnNavigation) + return; + this._scriptIds.clear(); + this._scriptSources.clear(); + } + async _onScriptParsed(event) { + this._scriptIds.add(event.scriptId); + if (!event.url && !this._reportAnonymousScripts) + return; + const response2 = await this._client._sendMayFail("Debugger.getScriptSource", { scriptId: event.scriptId }); + if (response2) + this._scriptSources.set(event.scriptId, response2.scriptSource); + } + async stop() { + if (!this._enabled) + return { entries: [] }; + const [profileResponse] = await Promise.all([ + this._client.send("Profiler.takePreciseCoverage"), + this._client.send("Profiler.stopPreciseCoverage"), + this._client.send("Profiler.disable"), + this._client.send("Debugger.disable") + ]); + eventsHelper.removeEventListeners(this._eventListeners); + this._enabled = false; + const coverage = { entries: [] }; + for (const entry of profileResponse.result) { + if (!this._scriptIds.has(entry.scriptId)) + continue; + if (!entry.url && !this._reportAnonymousScripts) + continue; + const source2 = this._scriptSources.get(entry.scriptId); + if (source2) + coverage.entries.push({ ...entry, source: source2 }); + else + coverage.entries.push(entry); + } + return coverage; + } +} +class CSSCoverage { + constructor(client) { + this._client = client; + this._enabled = false; + this._stylesheetURLs = /* @__PURE__ */ new Map(); + this._stylesheetSources = /* @__PURE__ */ new Map(); + this._eventListeners = []; + this._resetOnNavigation = false; + } + async start(options2) { + assert(!this._enabled, "CSSCoverage is already enabled"); + const { resetOnNavigation = true } = options2; + this._resetOnNavigation = resetOnNavigation; + this._enabled = true; + this._stylesheetURLs.clear(); + this._stylesheetSources.clear(); + this._eventListeners = [ + eventsHelper.addEventListener(this._client, "CSS.styleSheetAdded", this._onStyleSheet.bind(this)), + eventsHelper.addEventListener(this._client, "Runtime.executionContextsCleared", this._onExecutionContextsCleared.bind(this)) + ]; + await Promise.all([ + this._client.send("DOM.enable"), + this._client.send("CSS.enable"), + this._client.send("CSS.startRuleUsageTracking") + ]); + } + _onExecutionContextsCleared() { + if (!this._resetOnNavigation) + return; + this._stylesheetURLs.clear(); + this._stylesheetSources.clear(); + } + async _onStyleSheet(event) { + const header = event.header; + if (!header.sourceURL) + return; + const response2 = await this._client._sendMayFail("CSS.getStyleSheetText", { styleSheetId: header.styleSheetId }); + if (response2) { + this._stylesheetURLs.set(header.styleSheetId, header.sourceURL); + this._stylesheetSources.set(header.styleSheetId, response2.text); + } + } + async stop() { + if (!this._enabled) + return { entries: [] }; + const ruleTrackingResponse = await this._client.send("CSS.stopRuleUsageTracking"); + await Promise.all([ + this._client.send("CSS.disable"), + this._client.send("DOM.disable") + ]); + eventsHelper.removeEventListeners(this._eventListeners); + this._enabled = false; + const styleSheetIdToCoverage = /* @__PURE__ */ new Map(); + for (const entry of ruleTrackingResponse.ruleUsage) { + let ranges = styleSheetIdToCoverage.get(entry.styleSheetId); + if (!ranges) { + ranges = []; + styleSheetIdToCoverage.set(entry.styleSheetId, ranges); + } + ranges.push({ + startOffset: entry.startOffset, + endOffset: entry.endOffset, + count: entry.used ? 1 : 0 + }); + } + const coverage = { entries: [] }; + for (const styleSheetId of this._stylesheetURLs.keys()) { + const url2 = this._stylesheetURLs.get(styleSheetId); + const text = this._stylesheetSources.get(styleSheetId); + const ranges = convertToDisjointRanges(styleSheetIdToCoverage.get(styleSheetId) || []); + coverage.entries.push({ url: url2, ranges, text }); + } + return coverage; + } +} +function convertToDisjointRanges(nestedRanges) { + const points = []; + for (const range2 of nestedRanges) { + points.push({ offset: range2.startOffset, type: 0, range: range2 }); + points.push({ offset: range2.endOffset, type: 1, range: range2 }); + } + points.sort((a, b) => { + if (a.offset !== b.offset) + return a.offset - b.offset; + if (a.type !== b.type) + return b.type - a.type; + const aLength = a.range.endOffset - a.range.startOffset; + const bLength = b.range.endOffset - b.range.startOffset; + if (a.type === 0) + return bLength - aLength; + return aLength - bLength; + }); + const hitCountStack = []; + const results = []; + let lastOffset = 0; + for (const point of points) { + if (hitCountStack.length && lastOffset < point.offset && hitCountStack[hitCountStack.length - 1] > 0) { + const lastResult = results.length ? results[results.length - 1] : null; + if (lastResult && lastResult.end === lastOffset) + lastResult.end = point.offset; + else + results.push({ start: lastOffset, end: point.offset }); + } + lastOffset = point.offset; + if (point.type === 0) + hitCountStack.push(point.range.count); + else + hitCountStack.pop(); + } + return results.filter((range2) => range2.end - range2.start > 1); +} +function getExceptionMessage(exceptionDetails) { + if (exceptionDetails.exception) + return exceptionDetails.exception.description || String(exceptionDetails.exception.value); + let message = exceptionDetails.text; + if (exceptionDetails.stackTrace) { + for (const callframe of exceptionDetails.stackTrace.callFrames) { + const location2 = callframe.url + ":" + callframe.lineNumber + ":" + callframe.columnNumber; + const functionName = callframe.functionName || ""; + message += ` + at ${functionName} (${location2})`; + } + } + return message; +} +async function releaseObject(client, objectId) { + await client.send("Runtime.releaseObject", { objectId }).catch((error2) => { + }); +} +async function saveProtocolStream(client, handle, path2) { + let eof = false; + await mkdirIfNeeded$1(path2); + const fd = await fs.promises.open(path2, "w"); + while (!eof) { + const response2 = await client.send("IO.read", { handle }); + eof = response2.eof; + const buf = Buffer.from(response2.data, response2.base64Encoded ? "base64" : void 0); + await fd.write(buf); + } + await fd.close(); + await client.send("IO.close", { handle }); +} +async function readProtocolStream(client, handle) { + let eof = false; + const chunks = []; + while (!eof) { + const response2 = await client.send("IO.read", { handle }); + eof = response2.eof; + const buf = Buffer.from(response2.data, response2.base64Encoded ? "base64" : void 0); + chunks.push(buf); + } + await client.send("IO.close", { handle }); + return Buffer.concat(chunks); +} +function toConsoleMessageLocation(stackTrace) { + return stackTrace && stackTrace.callFrames.length ? { + url: stackTrace.callFrames[0].url, + lineNumber: stackTrace.callFrames[0].lineNumber, + columnNumber: stackTrace.callFrames[0].columnNumber + } : { url: "", lineNumber: 0, columnNumber: 0 }; +} +function exceptionToError(exceptionDetails) { + var _a2, _b2; + const messageWithStack = getExceptionMessage(exceptionDetails); + const lines = messageWithStack.split("\n"); + const firstStackTraceLine = lines.findIndex((line) => line.startsWith(" at")); + let messageWithName = ""; + let stack = ""; + if (firstStackTraceLine === -1) { + messageWithName = messageWithStack; + } else { + messageWithName = lines.slice(0, firstStackTraceLine).join("\n"); + stack = messageWithStack; + } + const { name, message } = splitErrorMessage(messageWithName); + const err = new Error(message); + err.stack = stack; + const nameOverride = (_b2 = (_a2 = exceptionDetails.exception) == null ? void 0 : _a2.preview) == null ? void 0 : _b2.properties.find((o) => o.name === "name"); + err.name = nameOverride ? nameOverride.value ?? "Error" : name; + return err; +} +function toModifiersMask$2(modifiers) { + let mask = 0; + if (modifiers.has("Alt")) + mask |= 1; + if (modifiers.has("Control")) + mask |= 2; + if (modifiers.has("Meta")) + mask |= 4; + if (modifiers.has("Shift")) + mask |= 8; + return mask; +} +function toButtonsMask$2(buttons) { + let mask = 0; + if (buttons.has("left")) + mask |= 1; + if (buttons.has("right")) + mask |= 2; + if (buttons.has("middle")) + mask |= 4; + return mask; +} +class DragManager { + constructor(page) { + this._dragState = null; + this._lastPosition = { x: 0, y: 0 }; + this._crPage = page; + } + async cancelDrag() { + if (!this._dragState) + return false; + await this._crPage._mainFrameSession._client.send("Input.dispatchDragEvent", { + type: "dragCancel", + x: this._lastPosition.x, + y: this._lastPosition.y, + data: { + items: [], + dragOperationsMask: 65535 + } + }); + this._dragState = null; + return true; + } + async interceptDragCausedByMove(x, y, button, buttons, modifiers, moveCallback) { + this._lastPosition = { x, y }; + if (this._dragState) { + await this._crPage._mainFrameSession._client.send("Input.dispatchDragEvent", { + type: "dragOver", + x, + y, + data: this._dragState, + modifiers: toModifiersMask$2(modifiers) + }); + return; + } + if (button !== "left") + return moveCallback(); + const client = this._crPage._mainFrameSession._client; + let onDragIntercepted; + const dragInterceptedPromise = new Promise((x2) => onDragIntercepted = x2); + function setupDragListeners() { + let didStartDrag = Promise.resolve(false); + let dragEvent = null; + const dragListener = (event) => dragEvent = event; + const mouseListener = () => { + didStartDrag = new Promise((callback) => { + window.addEventListener("dragstart", dragListener, { once: true, capture: true }); + setTimeout(() => callback(dragEvent ? !dragEvent.defaultPrevented : false), 0); + }); + }; + window.addEventListener("mousemove", mouseListener, { once: true, capture: true }); + window.__cleanupDrag = async () => { + const val = await didStartDrag; + window.removeEventListener("mousemove", mouseListener, { capture: true }); + window.removeEventListener("dragstart", dragListener, { capture: true }); + delete window.__cleanupDrag; + return val; + }; + } + await this._crPage._page.safeNonStallingEvaluateInAllFrames(`(${setupDragListeners.toString()})()`, "utility"); + client.on("Input.dragIntercepted", onDragIntercepted); + try { + await client.send("Input.setInterceptDrags", { enabled: true }); + } catch { + client.off("Input.dragIntercepted", onDragIntercepted); + return moveCallback(); + } + await moveCallback(); + const expectingDrag = (await Promise.all(this._crPage._page.frames().map(async (frame) => { + return frame.nonStallingEvaluateInExistingContext("window.__cleanupDrag && window.__cleanupDrag()", "utility").catch(() => false); + }))).some((x2) => x2); + this._dragState = expectingDrag ? (await dragInterceptedPromise).data : null; + client.off("Input.dragIntercepted", onDragIntercepted); + await client.send("Input.setInterceptDrags", { enabled: false }); + if (this._dragState) { + await this._crPage._mainFrameSession._client.send("Input.dispatchDragEvent", { + type: "dragEnter", + x, + y, + data: this._dragState, + modifiers: toModifiersMask$2(modifiers) + }); + } + } + isDragging() { + return !!this._dragState; + } + async drop(x, y, modifiers) { + assert(this._dragState, "missing drag state"); + await this._crPage._mainFrameSession._client.send("Input.dispatchDragEvent", { + type: "drop", + x, + y, + data: this._dragState, + modifiers: toModifiersMask$2(modifiers) + }); + this._dragState = null; + } +} +class CRExecutionContext { + constructor(client, contextPayload) { + this._client = client; + this._contextId = contextPayload.id; + } + async rawEvaluateJSON(expression) { + const { exceptionDetails, result: remoteObject } = await this._client.send("Runtime.evaluate", { + expression, + contextId: this._contextId, + returnByValue: true + }).catch(rewriteError$2); + if (exceptionDetails) + throw new JavaScriptErrorInEvaluate(getExceptionMessage(exceptionDetails)); + return remoteObject.value; + } + async rawEvaluateHandle(context, expression) { + const { exceptionDetails, result: remoteObject } = await this._client.send("Runtime.evaluate", { + expression, + contextId: this._contextId + }).catch(rewriteError$2); + if (exceptionDetails) + throw new JavaScriptErrorInEvaluate(getExceptionMessage(exceptionDetails)); + return createHandle$3(context, remoteObject); + } + async evaluateWithArguments(expression, returnByValue, utilityScript, values, handles) { + const { exceptionDetails, result: remoteObject } = await this._client.send("Runtime.callFunctionOn", { + functionDeclaration: expression, + objectId: utilityScript._objectId, + arguments: [ + { objectId: utilityScript._objectId }, + ...values.map((value) => ({ value })), + ...handles.map((handle) => ({ objectId: handle._objectId })) + ], + returnByValue, + awaitPromise: true, + userGesture: true + }).catch(rewriteError$2); + if (exceptionDetails) + throw new JavaScriptErrorInEvaluate(getExceptionMessage(exceptionDetails)); + return returnByValue ? parseEvaluationResultValue(remoteObject.value) : createHandle$3(utilityScript._context, remoteObject); + } + async getProperties(object) { + const response2 = await this._client.send("Runtime.getProperties", { + objectId: object._objectId, + ownProperties: true + }); + const result = /* @__PURE__ */ new Map(); + for (const property of response2.result) { + if (!property.enumerable || !property.value) + continue; + result.set(property.name, createHandle$3(object._context, property.value)); + } + return result; + } + async releaseHandle(handle) { + if (!handle._objectId) + return; + await releaseObject(this._client, handle._objectId); + } +} +function rewriteError$2(error2) { + if (error2.message.includes("Object reference chain is too long")) + throw new Error("Cannot serialize result: object reference chain is too long."); + if (error2.message.includes("Object couldn't be returned by value")) + return { result: { type: "undefined" } }; + if (error2 instanceof TypeError && error2.message.startsWith("Converting circular structure to JSON")) + rewriteErrorMessage(error2, error2.message + " Are you passing a nested JSHandle?"); + if (!isJavaScriptErrorInEvaluate(error2) && !isSessionClosedError(error2)) + throw new Error("Execution context was destroyed, most likely because of a navigation."); + throw error2; +} +function potentiallyUnserializableValue$2(remoteObject) { + const value = remoteObject.value; + const unserializableValue = remoteObject.unserializableValue; + return unserializableValue ? parseUnserializableValue(unserializableValue) : value; +} +function renderPreview$3(object) { + if (object.type === "undefined") + return "undefined"; + if ("value" in object) + return String(object.value); + if (object.unserializableValue) + return String(object.unserializableValue); + if (object.description === "Object" && object.preview) { + const tokens = []; + for (const { name, value } of object.preview.properties) + tokens.push(`${name}: ${value}`); + return `{${tokens.join(", ")}}`; + } + if (object.subtype === "array" && object.preview) + return sparseArrayToString(object.preview.properties); + return object.description; +} +function createHandle$3(context, remoteObject) { + if (remoteObject.subtype === "node") { + assert(context instanceof FrameExecutionContext); + return new ElementHandle$1(context, remoteObject.objectId); + } + return new JSHandle$1(context, remoteObject.subtype || remoteObject.type, renderPreview$3(remoteObject), remoteObject.objectId, potentiallyUnserializableValue$2(remoteObject)); +} +const macEditingCommands = { + "Backspace": "deleteBackward:", + "Enter": "insertNewline:", + "NumpadEnter": "insertNewline:", + "Escape": "cancelOperation:", + "ArrowUp": "moveUp:", + "ArrowDown": "moveDown:", + "ArrowLeft": "moveLeft:", + "ArrowRight": "moveRight:", + "F5": "complete:", + "Delete": "deleteForward:", + "Home": "scrollToBeginningOfDocument:", + "End": "scrollToEndOfDocument:", + "PageUp": "scrollPageUp:", + "PageDown": "scrollPageDown:", + "Shift+Backspace": "deleteBackward:", + "Shift+Enter": "insertNewline:", + "Shift+NumpadEnter": "insertNewline:", + "Shift+Escape": "cancelOperation:", + "Shift+ArrowUp": "moveUpAndModifySelection:", + "Shift+ArrowDown": "moveDownAndModifySelection:", + "Shift+ArrowLeft": "moveLeftAndModifySelection:", + "Shift+ArrowRight": "moveRightAndModifySelection:", + "Shift+F5": "complete:", + "Shift+Delete": "deleteForward:", + "Shift+Home": "moveToBeginningOfDocumentAndModifySelection:", + "Shift+End": "moveToEndOfDocumentAndModifySelection:", + "Shift+PageUp": "pageUpAndModifySelection:", + "Shift+PageDown": "pageDownAndModifySelection:", + "Shift+Numpad5": "delete:", + "Control+Tab": "selectNextKeyView:", + "Control+Enter": "insertLineBreak:", + "Control+NumpadEnter": "insertLineBreak:", + "Control+Quote": "insertSingleQuoteIgnoringSubstitution:", + "Control+KeyA": "moveToBeginningOfParagraph:", + "Control+KeyB": "moveBackward:", + "Control+KeyD": "deleteForward:", + "Control+KeyE": "moveToEndOfParagraph:", + "Control+KeyF": "moveForward:", + "Control+KeyH": "deleteBackward:", + "Control+KeyK": "deleteToEndOfParagraph:", + "Control+KeyL": "centerSelectionInVisibleArea:", + "Control+KeyN": "moveDown:", + "Control+KeyO": ["insertNewlineIgnoringFieldEditor:", "moveBackward:"], + "Control+KeyP": "moveUp:", + "Control+KeyT": "transpose:", + "Control+KeyV": "pageDown:", + "Control+KeyY": "yank:", + "Control+Backspace": "deleteBackwardByDecomposingPreviousCharacter:", + "Control+ArrowUp": "scrollPageUp:", + "Control+ArrowDown": "scrollPageDown:", + "Control+ArrowLeft": "moveToLeftEndOfLine:", + "Control+ArrowRight": "moveToRightEndOfLine:", + "Shift+Control+Enter": "insertLineBreak:", + "Shift+Control+NumpadEnter": "insertLineBreak:", + "Shift+Control+Tab": "selectPreviousKeyView:", + "Shift+Control+Quote": "insertDoubleQuoteIgnoringSubstitution:", + "Shift+Control+KeyA": "moveToBeginningOfParagraphAndModifySelection:", + "Shift+Control+KeyB": "moveBackwardAndModifySelection:", + "Shift+Control+KeyE": "moveToEndOfParagraphAndModifySelection:", + "Shift+Control+KeyF": "moveForwardAndModifySelection:", + "Shift+Control+KeyN": "moveDownAndModifySelection:", + "Shift+Control+KeyP": "moveUpAndModifySelection:", + "Shift+Control+KeyV": "pageDownAndModifySelection:", + "Shift+Control+Backspace": "deleteBackwardByDecomposingPreviousCharacter:", + "Shift+Control+ArrowUp": "scrollPageUp:", + "Shift+Control+ArrowDown": "scrollPageDown:", + "Shift+Control+ArrowLeft": "moveToLeftEndOfLineAndModifySelection:", + "Shift+Control+ArrowRight": "moveToRightEndOfLineAndModifySelection:", + "Alt+Backspace": "deleteWordBackward:", + "Alt+Enter": "insertNewlineIgnoringFieldEditor:", + "Alt+NumpadEnter": "insertNewlineIgnoringFieldEditor:", + "Alt+Escape": "complete:", + "Alt+ArrowUp": ["moveBackward:", "moveToBeginningOfParagraph:"], + "Alt+ArrowDown": ["moveForward:", "moveToEndOfParagraph:"], + "Alt+ArrowLeft": "moveWordLeft:", + "Alt+ArrowRight": "moveWordRight:", + "Alt+Delete": "deleteWordForward:", + "Alt+PageUp": "pageUp:", + "Alt+PageDown": "pageDown:", + "Shift+Alt+Backspace": "deleteWordBackward:", + "Shift+Alt+Enter": "insertNewlineIgnoringFieldEditor:", + "Shift+Alt+NumpadEnter": "insertNewlineIgnoringFieldEditor:", + "Shift+Alt+Escape": "complete:", + "Shift+Alt+ArrowUp": "moveParagraphBackwardAndModifySelection:", + "Shift+Alt+ArrowDown": "moveParagraphForwardAndModifySelection:", + "Shift+Alt+ArrowLeft": "moveWordLeftAndModifySelection:", + "Shift+Alt+ArrowRight": "moveWordRightAndModifySelection:", + "Shift+Alt+Delete": "deleteWordForward:", + "Shift+Alt+PageUp": "pageUp:", + "Shift+Alt+PageDown": "pageDown:", + "Control+Alt+KeyB": "moveWordBackward:", + "Control+Alt+KeyF": "moveWordForward:", + "Control+Alt+Backspace": "deleteWordBackward:", + "Shift+Control+Alt+KeyB": "moveWordBackwardAndModifySelection:", + "Shift+Control+Alt+KeyF": "moveWordForwardAndModifySelection:", + "Shift+Control+Alt+Backspace": "deleteWordBackward:", + "Meta+NumpadSubtract": "cancel:", + "Meta+Backspace": "deleteToBeginningOfLine:", + "Meta+ArrowUp": "moveToBeginningOfDocument:", + "Meta+ArrowDown": "moveToEndOfDocument:", + "Meta+ArrowLeft": "moveToLeftEndOfLine:", + "Meta+ArrowRight": "moveToRightEndOfLine:", + "Shift+Meta+NumpadSubtract": "cancel:", + "Shift+Meta+Backspace": "deleteToBeginningOfLine:", + "Shift+Meta+ArrowUp": "moveToBeginningOfDocumentAndModifySelection:", + "Shift+Meta+ArrowDown": "moveToEndOfDocumentAndModifySelection:", + "Shift+Meta+ArrowLeft": "moveToLeftEndOfLineAndModifySelection:", + "Shift+Meta+ArrowRight": "moveToRightEndOfLineAndModifySelection:", + "Meta+KeyA": "selectAll:", + "Meta+KeyC": "copy:", + "Meta+KeyX": "cut:", + "Meta+KeyV": "paste:", + "Meta+KeyZ": "undo:", + "Shift+Meta+KeyZ": "redo:" +}; +let RawKeyboardImpl$3 = class RawKeyboardImpl { + constructor(_client, _isMac, _dragManger) { + this._client = _client; + this._isMac = _isMac; + this._dragManger = _dragManger; + } + _commandsForCode(code, modifiers) { + if (!this._isMac) + return []; + const parts = []; + for (const modifier of ["Shift", "Control", "Alt", "Meta"]) { + if (modifiers.has(modifier)) + parts.push(modifier); + } + parts.push(code); + const shortcut = parts.join("+"); + let commands = macEditingCommands[shortcut] || []; + if (isString(commands)) + commands = [commands]; + commands = commands.filter((x) => !x.startsWith("insert")); + return commands.map((c) => c.substring(0, c.length - 1)); + } + async keydown(modifiers, keyName, description, autoRepeat) { + const { code, key: key2, location: location2, text } = description; + if (code === "Escape" && await this._dragManger.cancelDrag()) + return; + const commands = this._commandsForCode(code, modifiers); + await this._client.send("Input.dispatchKeyEvent", { + type: text ? "keyDown" : "rawKeyDown", + modifiers: toModifiersMask$2(modifiers), + windowsVirtualKeyCode: description.keyCodeWithoutLocation, + code, + commands, + key: key2, + text, + unmodifiedText: text, + autoRepeat, + location: location2, + isKeypad: location2 === keypadLocation + }); + } + async keyup(modifiers, keyName, description) { + const { code, key: key2, location: location2 } = description; + await this._client.send("Input.dispatchKeyEvent", { + type: "keyUp", + modifiers: toModifiersMask$2(modifiers), + key: key2, + windowsVirtualKeyCode: description.keyCodeWithoutLocation, + code, + location: location2 + }); + } + async sendText(text) { + await this._client.send("Input.insertText", { text }); + } +}; +let RawMouseImpl$3 = class RawMouseImpl { + constructor(page, client, dragManager) { + this._page = page; + this._client = client; + this._dragManager = dragManager; + } + async move(x, y, button, buttons, modifiers, forClick) { + const actualMove = async () => { + await this._client.send("Input.dispatchMouseEvent", { + type: "mouseMoved", + button, + buttons: toButtonsMask$2(buttons), + x, + y, + modifiers: toModifiersMask$2(modifiers), + force: buttons.size > 0 ? 0.5 : 0 + }); + }; + if (forClick) { + return actualMove(); + } + await this._dragManager.interceptDragCausedByMove(x, y, button, buttons, modifiers, actualMove); + } + async down(x, y, button, buttons, modifiers, clickCount) { + if (this._dragManager.isDragging()) + return; + await this._client.send("Input.dispatchMouseEvent", { + type: "mousePressed", + button, + buttons: toButtonsMask$2(buttons), + x, + y, + modifiers: toModifiersMask$2(modifiers), + clickCount, + force: buttons.size > 0 ? 0.5 : 0 + }); + } + async up(x, y, button, buttons, modifiers, clickCount) { + if (this._dragManager.isDragging()) { + await this._dragManager.drop(x, y, modifiers); + return; + } + await this._client.send("Input.dispatchMouseEvent", { + type: "mouseReleased", + button, + buttons: toButtonsMask$2(buttons), + x, + y, + modifiers: toModifiersMask$2(modifiers), + clickCount + }); + } + async wheel(x, y, buttons, modifiers, deltaX, deltaY) { + await this._client.send("Input.dispatchMouseEvent", { + type: "mouseWheel", + x, + y, + modifiers: toModifiersMask$2(modifiers), + deltaX, + deltaY + }); + } +}; +let RawTouchscreenImpl$3 = class RawTouchscreenImpl { + constructor(client) { + this._client = client; + } + async tap(x, y, modifiers) { + await Promise.all([ + this._client.send("Input.dispatchTouchEvent", { + type: "touchStart", + modifiers: toModifiersMask$2(modifiers), + touchPoints: [{ + x, + y + }] + }), + this._client.send("Input.dispatchTouchEvent", { + type: "touchEnd", + modifiers: toModifiersMask$2(modifiers), + touchPoints: [] + }) + ]); + } +}; +class CRNetworkManager { + constructor(page, serviceWorker) { + this._requestIdToRequest = /* @__PURE__ */ new Map(); + this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map(); + this._credentials = null; + this._attemptedAuthentications = /* @__PURE__ */ new Set(); + this._userRequestInterceptionEnabled = false; + this._protocolRequestInterceptionEnabled = false; + this._offline = false; + this._extraHTTPHeaders = []; + this._requestIdToRequestPausedEvent = /* @__PURE__ */ new Map(); + this._responseExtraInfoTracker = new ResponseExtraInfoTracker(); + this._sessions = /* @__PURE__ */ new Map(); + this._page = page; + this._serviceWorker = serviceWorker; + } + async addSession(session, workerFrame, isMain) { + const sessionInfo = { session, isMain, workerFrame, eventListeners: [] }; + sessionInfo.eventListeners = [ + eventsHelper.addEventListener(session, "Fetch.requestPaused", this._onRequestPaused.bind(this, sessionInfo)), + eventsHelper.addEventListener(session, "Fetch.authRequired", this._onAuthRequired.bind(this, sessionInfo)), + eventsHelper.addEventListener(session, "Network.requestWillBeSent", this._onRequestWillBeSent.bind(this, sessionInfo)), + eventsHelper.addEventListener(session, "Network.requestWillBeSentExtraInfo", this._onRequestWillBeSentExtraInfo.bind(this)), + eventsHelper.addEventListener(session, "Network.requestServedFromCache", this._onRequestServedFromCache.bind(this)), + eventsHelper.addEventListener(session, "Network.responseReceived", this._onResponseReceived.bind(this, sessionInfo)), + eventsHelper.addEventListener(session, "Network.responseReceivedExtraInfo", this._onResponseReceivedExtraInfo.bind(this)), + eventsHelper.addEventListener(session, "Network.loadingFinished", this._onLoadingFinished.bind(this, sessionInfo)), + eventsHelper.addEventListener(session, "Network.loadingFailed", this._onLoadingFailed.bind(this, sessionInfo)) + ]; + if (this._page) { + sessionInfo.eventListeners.push(...[ + eventsHelper.addEventListener(session, "Network.webSocketCreated", (e) => this._page.frameManager.onWebSocketCreated(e.requestId, e.url)), + eventsHelper.addEventListener(session, "Network.webSocketWillSendHandshakeRequest", (e) => this._page.frameManager.onWebSocketRequest(e.requestId)), + eventsHelper.addEventListener(session, "Network.webSocketHandshakeResponseReceived", (e) => this._page.frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)), + eventsHelper.addEventListener(session, "Network.webSocketFrameSent", (e) => e.response.payloadData && this._page.frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)), + eventsHelper.addEventListener(session, "Network.webSocketFrameReceived", (e) => e.response.payloadData && this._page.frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)), + eventsHelper.addEventListener(session, "Network.webSocketClosed", (e) => this._page.frameManager.webSocketClosed(e.requestId)), + eventsHelper.addEventListener(session, "Network.webSocketFrameError", (e) => this._page.frameManager.webSocketError(e.requestId, e.errorMessage)) + ]); + } + this._sessions.set(session, sessionInfo); + await Promise.all([ + session.send("Network.enable"), + this._updateProtocolRequestInterceptionForSession( + sessionInfo, + true + /* initial */ + ), + this._setOfflineForSession( + sessionInfo, + true + /* initial */ + ), + this._setExtraHTTPHeadersForSession( + sessionInfo, + true + /* initial */ + ) + ]); + } + removeSession(session) { + const info = this._sessions.get(session); + if (info) + eventsHelper.removeEventListeners(info.eventListeners); + this._sessions.delete(session); + } + async _forEachSession(cb) { + await Promise.all([...this._sessions.values()].map((info) => { + if (info.isMain) + return cb(info); + return cb(info).catch((e) => { + if (isSessionClosedError(e)) + return; + throw e; + }); + })); + } + async authenticate(credentials) { + this._credentials = credentials; + await this._updateProtocolRequestInterception(); + } + async setOffline(offline) { + if (offline === this._offline) + return; + this._offline = offline; + await this._forEachSession((info) => this._setOfflineForSession(info)); + } + async _setOfflineForSession(info, initial) { + if (initial && !this._offline) + return; + if (info.workerFrame) + return; + await info.session.send("Network.emulateNetworkConditions", { + offline: this._offline, + // values of 0 remove any active throttling. crbug.com/456324#c9 + latency: 0, + downloadThroughput: -1, + uploadThroughput: -1 + }); + } + async setRequestInterception(value) { + this._userRequestInterceptionEnabled = value; + await this._updateProtocolRequestInterception(); + } + async _updateProtocolRequestInterception() { + const enabled = this._userRequestInterceptionEnabled || !!this._credentials; + if (enabled === this._protocolRequestInterceptionEnabled) + return; + this._protocolRequestInterceptionEnabled = enabled; + await this._forEachSession((info) => this._updateProtocolRequestInterceptionForSession(info)); + } + async _updateProtocolRequestInterceptionForSession(info, initial) { + const enabled = this._protocolRequestInterceptionEnabled; + if (initial && !enabled) + return; + const cachePromise = info.session.send("Network.setCacheDisabled", { cacheDisabled: enabled }); + let fetchPromise = Promise.resolve(void 0); + if (!info.workerFrame) { + if (enabled) + fetchPromise = info.session.send("Fetch.enable", { handleAuthRequests: true, patterns: [{ urlPattern: "*", requestStage: "Request" }] }); + else + fetchPromise = info.session.send("Fetch.disable"); + } + await Promise.all([cachePromise, fetchPromise]); + } + async setExtraHTTPHeaders(extraHTTPHeaders) { + if (!this._extraHTTPHeaders.length && !extraHTTPHeaders.length) + return; + this._extraHTTPHeaders = extraHTTPHeaders; + await this._forEachSession((info) => this._setExtraHTTPHeadersForSession(info)); + } + async _setExtraHTTPHeadersForSession(info, initial) { + if (initial && !this._extraHTTPHeaders.length) + return; + await info.session.send("Network.setExtraHTTPHeaders", { headers: headersArrayToObject( + this._extraHTTPHeaders, + false + /* lowerCase */ + ) }); + } + async clearCache() { + await this._forEachSession(async (info) => { + await info.session.send("Network.setCacheDisabled", { cacheDisabled: true }); + if (!this._protocolRequestInterceptionEnabled) + await info.session.send("Network.setCacheDisabled", { cacheDisabled: false }); + if (!info.workerFrame) + await info.session.send("Network.clearBrowserCache"); + }); + } + _onRequestWillBeSent(sessionInfo, event) { + if (this._protocolRequestInterceptionEnabled && !event.request.url.startsWith("data:")) { + const requestId = event.requestId; + const requestPausedEvent = this._requestIdToRequestPausedEvent.get(requestId); + if (requestPausedEvent) { + this._onRequest(sessionInfo, event, requestPausedEvent.sessionInfo, requestPausedEvent.event); + this._requestIdToRequestPausedEvent.delete(requestId); + } else { + this._requestIdToRequestWillBeSentEvent.set(event.requestId, { sessionInfo, event }); + } + } else { + this._onRequest(sessionInfo, event, void 0, void 0); + } + } + _onRequestServedFromCache(event) { + this._responseExtraInfoTracker.requestServedFromCache(event); + } + _onRequestWillBeSentExtraInfo(event) { + this._responseExtraInfoTracker.requestWillBeSentExtraInfo(event); + } + _onAuthRequired(sessionInfo, event) { + let response2 = "Default"; + const shouldProvideCredentials = this._shouldProvideCredentials(event.request.url); + if (this._attemptedAuthentications.has(event.requestId)) { + response2 = "CancelAuth"; + } else if (shouldProvideCredentials) { + response2 = "ProvideCredentials"; + this._attemptedAuthentications.add(event.requestId); + } + const { username, password } = shouldProvideCredentials && this._credentials ? this._credentials : { username: void 0, password: void 0 }; + sessionInfo.session._sendMayFail("Fetch.continueWithAuth", { + requestId: event.requestId, + authChallengeResponse: { response: response2, username, password } + }); + } + _shouldProvideCredentials(url2) { + if (!this._credentials) + return false; + return !this._credentials.origin || new URL(url2).origin.toLowerCase() === this._credentials.origin.toLowerCase(); + } + _onRequestPaused(sessionInfo, event) { + var _a2; + if (!event.networkId) { + sessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: event.requestId }); + return; + } + if (event.request.url.startsWith("data:")) + return; + const requestId = event.networkId; + const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(requestId); + if (requestWillBeSentEvent) { + this._onRequest(requestWillBeSentEvent.sessionInfo, requestWillBeSentEvent.event, sessionInfo, event); + this._requestIdToRequestWillBeSentEvent.delete(requestId); + } else { + const existingRequest = this._requestIdToRequest.get(requestId); + const alreadyContinuedParams = (_a2 = existingRequest == null ? void 0 : existingRequest._route) == null ? void 0 : _a2._alreadyContinuedParams; + if (alreadyContinuedParams && !event.redirectedRequestId) { + sessionInfo.session._sendMayFail("Fetch.continueRequest", { + ...alreadyContinuedParams, + requestId: event.requestId + }); + return; + } + this._requestIdToRequestPausedEvent.set(requestId, { sessionInfo, event }); + } + } + _onRequest(requestWillBeSentSessionInfo, requestWillBeSentEvent, requestPausedSessionInfo, requestPausedEvent) { + var _a2, _b2, _c2, _d2, _e2; + if (requestWillBeSentEvent.request.url.startsWith("data:")) + return; + let redirectedFrom = null; + if (requestWillBeSentEvent.redirectResponse) { + const request22 = this._requestIdToRequest.get(requestWillBeSentEvent.requestId); + if (request22) { + this._handleRequestRedirect(request22, requestWillBeSentEvent.redirectResponse, requestWillBeSentEvent.timestamp, requestWillBeSentEvent.redirectHasExtraInfo); + redirectedFrom = request22; + } + } + let frame = requestWillBeSentEvent.frameId ? (_a2 = this._page) == null ? void 0 : _a2.frameManager.frame(requestWillBeSentEvent.frameId) : requestWillBeSentSessionInfo.workerFrame; + if (!frame && this._page && requestPausedEvent && requestPausedEvent.frameId) + frame = this._page.frameManager.frame(requestPausedEvent.frameId); + if (!frame && this._page && requestWillBeSentEvent.frameId === ((_b2 = this._page) == null ? void 0 : _b2.delegate)._targetId) { + frame = this._page.frameManager.frameAttached(requestWillBeSentEvent.frameId, null); + } + const isInterceptedOptionsPreflight = !!requestPausedEvent && requestPausedEvent.request.method === "OPTIONS" && requestWillBeSentEvent.initiator.type === "preflight"; + if (isInterceptedOptionsPreflight && (this._page || this._serviceWorker).needsRequestInterception()) { + const requestHeaders = requestPausedEvent.request.headers; + const responseHeaders = [ + { name: "Access-Control-Allow-Origin", value: requestHeaders["Origin"] || "*" }, + { name: "Access-Control-Allow-Methods", value: requestHeaders["Access-Control-Request-Method"] || "GET, POST, OPTIONS, DELETE" }, + { name: "Access-Control-Allow-Credentials", value: "true" } + ]; + if (requestHeaders["Access-Control-Request-Headers"]) + responseHeaders.push({ name: "Access-Control-Allow-Headers", value: requestHeaders["Access-Control-Request-Headers"] }); + requestPausedSessionInfo.session._sendMayFail("Fetch.fulfillRequest", { + requestId: requestPausedEvent.requestId, + responseCode: 204, + responsePhrase: statusText(204), + responseHeaders, + body: "" + }); + return; + } + if (!frame && !this._serviceWorker) { + if (requestPausedEvent) + requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId }); + return; + } + let route = null; + let headersOverride; + if (requestPausedEvent) { + if (redirectedFrom || !this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) { + headersOverride = (_d2 = (_c2 = redirectedFrom == null ? void 0 : redirectedFrom._originalRequestRoute) == null ? void 0 : _c2._alreadyContinuedParams) == null ? void 0 : _d2.headers; + requestPausedSessionInfo.session._sendMayFail("Fetch.continueRequest", { requestId: requestPausedEvent.requestId, headers: headersOverride }); + } else { + route = new RouteImpl(requestPausedSessionInfo.session, requestPausedEvent.requestId); + } + } + const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === "Document"; + const documentId = isNavigationRequest ? requestWillBeSentEvent.loaderId : void 0; + const request2 = new InterceptableRequest$1({ + session: requestWillBeSentSessionInfo.session, + context: (this._page || this._serviceWorker).browserContext, + frame: frame || null, + serviceWorker: this._serviceWorker || null, + documentId, + route, + requestWillBeSentEvent, + requestPausedEvent, + redirectedFrom, + headersOverride: headersOverride || null + }); + this._requestIdToRequest.set(requestWillBeSentEvent.requestId, request2); + if (route) { + request2.request.setRawRequestHeaders(headersObjectToArray(requestPausedEvent.request.headers, "\n")); + } + (((_e2 = this._page) == null ? void 0 : _e2.frameManager) || this._serviceWorker).requestStarted(request2.request, route || void 0); + } + _createResponse(request2, responsePayload, hasExtraInfo) { + var _a2, _b2, _c2, _d2, _e2; + const getResponseBody = async () => { + var _a3; + const contentLengthHeader = Object.entries(responsePayload.headers).find((header) => header[0].toLowerCase() === "content-length"); + const expectedLength = contentLengthHeader ? +contentLengthHeader[1] : void 0; + const session = request2.session; + const response22 = await session.send("Network.getResponseBody", { requestId: request2._requestId }); + if (response22.body || !expectedLength) + return Buffer.from(response22.body, response22.base64Encoded ? "base64" : "utf8"); + if ((_a3 = request2._route) == null ? void 0 : _a3._fulfilled) + return Buffer.from(""); + const resource = await session.send("Network.loadNetworkResource", { url: request2.request.url(), frameId: this._serviceWorker ? void 0 : request2.request.frame()._id, options: { disableCache: false, includeCredentials: true } }); + const chunks = []; + while (resource.resource.stream) { + const chunk = await session.send("IO.read", { handle: resource.resource.stream }); + chunks.push(Buffer.from(chunk.data, chunk.base64Encoded ? "base64" : "utf-8")); + if (chunk.eof) { + await session.send("IO.close", { handle: resource.resource.stream }); + break; + } + } + return Buffer.concat(chunks); + }; + const timingPayload = responsePayload.timing; + let timing; + if (timingPayload && !this._responseExtraInfoTracker.servedFromCache(request2._requestId)) { + timing = { + startTime: (timingPayload.requestTime - request2._timestamp + request2._wallTime) * 1e3, + domainLookupStart: timingPayload.dnsStart, + domainLookupEnd: timingPayload.dnsEnd, + connectStart: timingPayload.connectStart, + secureConnectionStart: timingPayload.sslStart, + connectEnd: timingPayload.connectEnd, + requestStart: timingPayload.sendStart, + responseStart: timingPayload.receiveHeadersEnd + }; + } else { + timing = { + startTime: request2._wallTime * 1e3, + domainLookupStart: -1, + domainLookupEnd: -1, + connectStart: -1, + secureConnectionStart: -1, + connectEnd: -1, + requestStart: -1, + responseStart: -1 + }; + } + const response2 = new Response$1(request2.request, responsePayload.status, responsePayload.statusText, headersObjectToArray(responsePayload.headers), timing, getResponseBody, !!responsePayload.fromServiceWorker, responsePayload.protocol); + if ((responsePayload == null ? void 0 : responsePayload.remoteIPAddress) && typeof (responsePayload == null ? void 0 : responsePayload.remotePort) === "number") { + response2._serverAddrFinished({ + ipAddress: responsePayload.remoteIPAddress, + port: responsePayload.remotePort + }); + } else { + response2._serverAddrFinished(); + } + response2._securityDetailsFinished({ + protocol: (_a2 = responsePayload == null ? void 0 : responsePayload.securityDetails) == null ? void 0 : _a2.protocol, + subjectName: (_b2 = responsePayload == null ? void 0 : responsePayload.securityDetails) == null ? void 0 : _b2.subjectName, + issuer: (_c2 = responsePayload == null ? void 0 : responsePayload.securityDetails) == null ? void 0 : _c2.issuer, + validFrom: (_d2 = responsePayload == null ? void 0 : responsePayload.securityDetails) == null ? void 0 : _d2.validFrom, + validTo: (_e2 = responsePayload == null ? void 0 : responsePayload.securityDetails) == null ? void 0 : _e2.validTo + }); + this._responseExtraInfoTracker.processResponse(request2._requestId, response2, hasExtraInfo); + return response2; + } + _deleteRequest(request2) { + this._requestIdToRequest.delete(request2._requestId); + if (request2._interceptionId) + this._attemptedAuthentications.delete(request2._interceptionId); + } + _handleRequestRedirect(request2, responsePayload, timestamp2, hasExtraInfo) { + var _a2, _b2; + const response2 = this._createResponse(request2, responsePayload, hasExtraInfo); + response2.setTransferSize(null); + response2.setEncodedBodySize(null); + response2._requestFinished((timestamp2 - request2._timestamp) * 1e3); + this._deleteRequest(request2); + (((_a2 = this._page) == null ? void 0 : _a2.frameManager) || this._serviceWorker).requestReceivedResponse(response2); + (((_b2 = this._page) == null ? void 0 : _b2.frameManager) || this._serviceWorker).reportRequestFinished(request2.request, response2); + } + _onResponseReceivedExtraInfo(event) { + this._responseExtraInfoTracker.responseReceivedExtraInfo(event); + } + _onResponseReceived(sessionInfo, event) { + var _a2; + let request2 = this._requestIdToRequest.get(event.requestId); + if (!request2 && event.response.fromServiceWorker) { + const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId); + if (requestWillBeSentEvent) { + this._requestIdToRequestWillBeSentEvent.delete(event.requestId); + this._onRequest(sessionInfo, requestWillBeSentEvent.event, void 0, void 0); + request2 = this._requestIdToRequest.get(event.requestId); + } + } + if (!request2) + return; + const response2 = this._createResponse(request2, event.response, event.hasExtraInfo); + (((_a2 = this._page) == null ? void 0 : _a2.frameManager) || this._serviceWorker).requestReceivedResponse(response2); + } + _onLoadingFinished(sessionInfo, event) { + var _a2; + this._responseExtraInfoTracker.loadingFinished(event); + const request2 = this._requestIdToRequest.get(event.requestId); + if (!request2) + return; + this._maybeUpdateRequestSession(sessionInfo, request2); + const response2 = request2.request._existingResponse(); + if (response2) { + response2.setTransferSize(event.encodedDataLength); + response2.responseHeadersSize().then((size) => response2.setEncodedBodySize(event.encodedDataLength - size)); + response2._requestFinished(helper.secondsToRoundishMillis(event.timestamp - request2._timestamp)); + } + this._deleteRequest(request2); + (((_a2 = this._page) == null ? void 0 : _a2.frameManager) || this._serviceWorker).reportRequestFinished(request2.request, response2); + } + _onLoadingFailed(sessionInfo, event) { + var _a2; + this._responseExtraInfoTracker.loadingFailed(event); + let request2 = this._requestIdToRequest.get(event.requestId); + if (!request2) { + const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId); + if (requestWillBeSentEvent) { + this._requestIdToRequestWillBeSentEvent.delete(event.requestId); + this._onRequest(sessionInfo, requestWillBeSentEvent.event, void 0, void 0); + request2 = this._requestIdToRequest.get(event.requestId); + } + } + if (!request2) + return; + this._maybeUpdateRequestSession(sessionInfo, request2); + const response2 = request2.request._existingResponse(); + if (response2) { + response2.setTransferSize(null); + response2.setEncodedBodySize(null); + response2._requestFinished(helper.secondsToRoundishMillis(event.timestamp - request2._timestamp)); + } else { + request2.request.setRawRequestHeaders(null); + } + this._deleteRequest(request2); + request2.request._setFailureText(event.errorText || event.blockedReason || ""); + (((_a2 = this._page) == null ? void 0 : _a2.frameManager) || this._serviceWorker).requestFailed(request2.request, !!event.canceled); + } + _maybeUpdateRequestSession(sessionInfo, request2) { + if (request2.session !== sessionInfo.session && !sessionInfo.isMain && (request2._documentId === request2._requestId || sessionInfo.workerFrame)) + request2.session = sessionInfo.session; + } +} +let InterceptableRequest$1 = class InterceptableRequest { + constructor(options2) { + const { session, context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker, headersOverride } = options2; + this.session = session; + this._timestamp = requestWillBeSentEvent.timestamp; + this._wallTime = requestWillBeSentEvent.wallTime; + this._requestId = requestWillBeSentEvent.requestId; + this._interceptionId = requestPausedEvent && requestPausedEvent.requestId; + this._documentId = documentId; + this._route = route; + this._originalRequestRoute = route ?? (redirectedFrom == null ? void 0 : redirectedFrom._originalRequestRoute); + const { + headers, + method, + url: url2, + postDataEntries = null + } = requestPausedEvent ? requestPausedEvent.request : requestWillBeSentEvent.request; + const type2 = (requestWillBeSentEvent.type || "").toLowerCase(); + let postDataBuffer = null; + const entries = postDataEntries == null ? void 0 : postDataEntries.filter((entry) => entry.bytes); + if (entries && entries.length) + postDataBuffer = Buffer.concat(entries.map((entry) => Buffer.from(entry.bytes, "base64"))); + this.request = new Request$1(context, frame, serviceWorker, (redirectedFrom == null ? void 0 : redirectedFrom.request) || null, documentId, url2, type2, method, postDataBuffer, headersOverride || headersObjectToArray(headers)); + } +}; +class RouteImpl { + constructor(session, interceptionId) { + this._fulfilled = false; + this._session = session; + this._interceptionId = interceptionId; + } + async continue(overrides) { + this._alreadyContinuedParams = { + requestId: this._interceptionId, + url: overrides.url, + headers: overrides.headers, + method: overrides.method, + postData: overrides.postData ? overrides.postData.toString("base64") : void 0 + }; + await catchDisallowedErrors(async () => { + await this._session.send("Fetch.continueRequest", this._alreadyContinuedParams); + }); + } + async fulfill(response2) { + this._fulfilled = true; + const body = response2.isBase64 ? response2.body : Buffer.from(response2.body).toString("base64"); + const responseHeaders = splitSetCookieHeader(response2.headers); + await catchDisallowedErrors(async () => { + await this._session.send("Fetch.fulfillRequest", { + requestId: this._interceptionId, + responseCode: response2.status, + responsePhrase: statusText(response2.status), + responseHeaders, + body + }); + }); + } + async abort(errorCode = "failed") { + const errorReason = errorReasons$1[errorCode]; + assert(errorReason, "Unknown error code: " + errorCode); + await catchDisallowedErrors(async () => { + await this._session.send("Fetch.failRequest", { + requestId: this._interceptionId, + errorReason + }); + }); + } +} +async function catchDisallowedErrors(callback) { + try { + return await callback(); + } catch (e) { + if (isProtocolError(e) && e.message.includes("Invalid http status code or phrase")) + throw e; + if (isProtocolError(e) && e.message.includes("Unsafe header")) + throw e; + } +} +function splitSetCookieHeader(headers) { + const index2 = headers.findIndex(({ name }) => name.toLowerCase() === "set-cookie"); + if (index2 === -1) + return headers; + const header = headers[index2]; + const values = header.value.split("\n"); + if (values.length === 1) + return headers; + const result = headers.slice(); + result.splice(index2, 1, ...values.map((value) => ({ name: header.name, value }))); + return result; +} +const errorReasons$1 = { + "aborted": "Aborted", + "accessdenied": "AccessDenied", + "addressunreachable": "AddressUnreachable", + "blockedbyclient": "BlockedByClient", + "blockedbyresponse": "BlockedByResponse", + "connectionaborted": "ConnectionAborted", + "connectionclosed": "ConnectionClosed", + "connectionfailed": "ConnectionFailed", + "connectionrefused": "ConnectionRefused", + "connectionreset": "ConnectionReset", + "internetdisconnected": "InternetDisconnected", + "namenotresolved": "NameNotResolved", + "timedout": "TimedOut", + "failed": "Failed" +}; +class ResponseExtraInfoTracker { + constructor() { + this._requests = /* @__PURE__ */ new Map(); + } + requestWillBeSentExtraInfo(event) { + const info = this._getOrCreateEntry(event.requestId); + info.requestWillBeSentExtraInfo.push(event); + this._patchHeaders(info, info.requestWillBeSentExtraInfo.length - 1); + this._checkFinished(info); + } + requestServedFromCache(event) { + const info = this._getOrCreateEntry(event.requestId); + info.servedFromCache = true; + } + servedFromCache(requestId) { + const info = this._requests.get(requestId); + return !!(info == null ? void 0 : info.servedFromCache); + } + responseReceivedExtraInfo(event) { + const info = this._getOrCreateEntry(event.requestId); + info.responseReceivedExtraInfo.push(event); + this._patchHeaders(info, info.responseReceivedExtraInfo.length - 1); + this._checkFinished(info); + } + processResponse(requestId, response2, hasExtraInfo) { + let info = this._requests.get(requestId); + if (!hasExtraInfo || (info == null ? void 0 : info.servedFromCache)) { + response2.request().setRawRequestHeaders(null); + response2.setResponseHeadersSize(null); + response2.setRawResponseHeaders(null); + return; + } + info = this._getOrCreateEntry(requestId); + info.responses.push(response2); + this._patchHeaders(info, info.responses.length - 1); + } + loadingFinished(event) { + const info = this._requests.get(event.requestId); + if (!info) + return; + info.loadingFinished = event; + this._checkFinished(info); + } + loadingFailed(event) { + const info = this._requests.get(event.requestId); + if (!info) + return; + info.loadingFailed = event; + this._checkFinished(info); + } + _getOrCreateEntry(requestId) { + let info = this._requests.get(requestId); + if (!info) { + info = { + requestId, + requestWillBeSentExtraInfo: [], + responseReceivedExtraInfo: [], + responses: [] + }; + this._requests.set(requestId, info); + } + return info; + } + _patchHeaders(info, index2) { + var _a2; + const response2 = info.responses[index2]; + const requestExtraInfo = info.requestWillBeSentExtraInfo[index2]; + if (response2 && requestExtraInfo) { + response2.request().setRawRequestHeaders(headersObjectToArray(requestExtraInfo.headers, "\n")); + info.requestWillBeSentExtraInfo[index2] = void 0; + } + const responseExtraInfo = info.responseReceivedExtraInfo[index2]; + if (response2 && responseExtraInfo) { + response2.setResponseHeadersSize(((_a2 = responseExtraInfo.headersText) == null ? void 0 : _a2.length) || 0); + response2.setRawResponseHeaders(headersObjectToArray(responseExtraInfo.headers, "\n")); + info.responseReceivedExtraInfo[index2] = void 0; + } + } + _checkFinished(info) { + if (!info.loadingFinished && !info.loadingFailed) + return; + if (info.responses.length <= info.responseReceivedExtraInfo.length) { + this._stopTracking(info.requestId); + return; + } + } + _stopTracking(requestId) { + this._requests.delete(requestId); + } +} +const PagePaperFormats$1 = { + letter: { width: 8.5, height: 11 }, + legal: { width: 8.5, height: 14 }, + tabloid: { width: 11, height: 17 }, + ledger: { width: 17, height: 11 }, + a0: { width: 33.1, height: 46.8 }, + a1: { width: 23.4, height: 33.1 }, + a2: { width: 16.54, height: 23.4 }, + a3: { width: 11.7, height: 16.54 }, + a4: { width: 8.27, height: 11.7 }, + a5: { width: 5.83, height: 8.27 }, + a6: { width: 4.13, height: 5.83 } +}; +const unitToPixels$1 = { + "px": 1, + "in": 96, + "cm": 37.8, + "mm": 3.78 +}; +function convertPrintParameterToInches$1(text) { + if (text === void 0) + return void 0; + let unit = text.substring(text.length - 2).toLowerCase(); + let valueText = ""; + if (unitToPixels$1.hasOwnProperty(unit)) { + valueText = text.substring(0, text.length - 2); + } else { + unit = "px"; + valueText = text; + } + const value = Number(valueText); + assert(!isNaN(value), "Failed to parse parameter value: " + text); + const pixels = value * unitToPixels$1[unit]; + return pixels / 96; +} +class CRPDF { + constructor(client) { + this._client = client; + } + async generate(options2) { + const { + scale = 1, + displayHeaderFooter = false, + headerTemplate = "", + footerTemplate = "", + printBackground = false, + landscape = false, + pageRanges = "", + preferCSSPageSize = false, + margin = {}, + tagged = false, + outline = false + } = options2; + let paperWidth = 8.5; + let paperHeight = 11; + if (options2.format) { + const format = PagePaperFormats$1[options2.format.toLowerCase()]; + assert(format, "Unknown paper format: " + options2.format); + paperWidth = format.width; + paperHeight = format.height; + } else { + paperWidth = convertPrintParameterToInches$1(options2.width) || paperWidth; + paperHeight = convertPrintParameterToInches$1(options2.height) || paperHeight; + } + const marginTop = convertPrintParameterToInches$1(margin.top) || 0; + const marginLeft = convertPrintParameterToInches$1(margin.left) || 0; + const marginBottom = convertPrintParameterToInches$1(margin.bottom) || 0; + const marginRight = convertPrintParameterToInches$1(margin.right) || 0; + const generateDocumentOutline = outline; + const generateTaggedPDF = tagged; + const result = await this._client.send("Page.printToPDF", { + transferMode: "ReturnAsStream", + landscape, + displayHeaderFooter, + headerTemplate, + footerTemplate, + printBackground, + scale, + paperWidth, + paperHeight, + marginTop, + marginBottom, + marginLeft, + marginRight, + pageRanges, + preferCSSPageSize, + generateTaggedPDF, + generateDocumentOutline + }); + return await readProtocolStream(this._client, result.stream); + } +} +const platformToFontFamilies = { + "linux": { + "fontFamilies": { + "standard": "Times New Roman", + "fixed": "Monospace", + "serif": "Times New Roman", + "sansSerif": "Arial", + "cursive": "Comic Sans MS", + "fantasy": "Impact" + } + }, + "mac": { + "fontFamilies": { + "standard": "Times", + "fixed": "Courier", + "serif": "Times", + "sansSerif": "Helvetica", + "cursive": "Apple Chancery", + "fantasy": "Papyrus" + }, + "forScripts": [ + { + "script": "jpan", + "fontFamilies": { + "standard": "Hiragino Kaku Gothic ProN", + "fixed": "Osaka-Mono", + "serif": "Hiragino Mincho ProN", + "sansSerif": "Hiragino Kaku Gothic ProN" + } + }, + { + "script": "hang", + "fontFamilies": { + "standard": "Apple SD Gothic Neo", + "serif": "AppleMyungjo", + "sansSerif": "Apple SD Gothic Neo" + } + }, + { + "script": "hans", + "fontFamilies": { + "standard": ",PingFang SC,STHeiti", + "serif": "Songti SC", + "sansSerif": ",PingFang SC,STHeiti", + "cursive": "Kaiti SC" + } + }, + { + "script": "hant", + "fontFamilies": { + "standard": ",PingFang TC,Heiti TC", + "serif": "Songti TC", + "sansSerif": ",PingFang TC,Heiti TC", + "cursive": "Kaiti TC" + } + } + ] + }, + "win": { + "fontFamilies": { + "standard": "Times New Roman", + "fixed": "Consolas", + "serif": "Times New Roman", + "sansSerif": "Arial", + "cursive": "Comic Sans MS", + "fantasy": "Impact" + }, + "forScripts": [ + { + "script": "cyrl", + "fontFamilies": { + "standard": "Times New Roman", + "fixed": "Courier New", + "serif": "Times New Roman", + "sansSerif": "Arial" + } + }, + { + "script": "arab", + "fontFamilies": { + "fixed": "Courier New", + "sansSerif": "Segoe UI" + } + }, + { + "script": "grek", + "fontFamilies": { + "standard": "Times New Roman", + "fixed": "Courier New", + "serif": "Times New Roman", + "sansSerif": "Arial" + } + }, + { + "script": "jpan", + "fontFamilies": { + "standard": ",Meiryo,Yu Gothic", + "fixed": "MS Gothic", + "serif": ",Yu Mincho,MS PMincho", + "sansSerif": ",Meiryo,Yu Gothic" + } + }, + { + "script": "hang", + "fontFamilies": { + "standard": "Malgun Gothic", + "fixed": "Gulimche", + "serif": "Batang", + "sansSerif": "Malgun Gothic", + "cursive": "Gungsuh" + } + }, + { + "script": "hans", + "fontFamilies": { + "standard": "Microsoft YaHei", + "fixed": "NSimsun", + "serif": "Simsun", + "sansSerif": "Microsoft YaHei", + "cursive": "KaiTi" + } + }, + { + "script": "hant", + "fontFamilies": { + "standard": "Microsoft JhengHei", + "fixed": "MingLiU", + "serif": "PMingLiU", + "sansSerif": "Microsoft JhengHei", + "cursive": "DFKai-SB" + } + } + ] + } +}; +const fps = 25; +class VideoRecorder { + constructor(page, ffmpegPath, progress2) { + this._process = null; + this._gracefullyClose = null; + this._lastWritePromise = Promise.resolve(); + this._lastFrameTimestamp = 0; + this._lastFrameBuffer = null; + this._lastWriteTimestamp = 0; + this._frameQueue = []; + this._isStopped = false; + this._progress = progress2; + this._ffmpegPath = ffmpegPath; + page.on(Page$1.Events.ScreencastFrame, (frame) => this.writeFrame(frame.buffer, frame.frameSwapWallTime / 1e3)); + } + static async launch(page, ffmpegPath, options2) { + if (!options2.outputFile.endsWith(".webm")) + throw new Error("File must have .webm extension"); + const controller = new ProgressController(serverSideCallMetadata(), page); + controller.setLogName("browser"); + return await controller.run(async (progress2) => { + const recorder = new VideoRecorder(page, ffmpegPath, progress2); + await recorder._launch(options2); + return recorder; + }); + } + async _launch(options2) { + const w = options2.width; + const h = options2.height; + const args = `-loglevel error -f image2pipe -avioflags direct -fpsprobesize 0 -probesize 32 -analyzeduration 0 -c:v mjpeg -i pipe:0 -y -an -r ${fps} -c:v vp8 -qmin 0 -qmax 50 -crf 8 -deadline realtime -speed 8 -b:v 1M -threads 1 -vf pad=${w}:${h}:0:0:gray,crop=${w}:${h}:0:0`.split(" "); + args.push(options2.outputFile); + const progress2 = this._progress; + const { launchedProcess, gracefullyClose } = await launchProcess({ + command: this._ffmpegPath, + args, + stdio: "stdin", + log: (message) => progress2.log(message), + tempDirectories: [], + attemptToGracefullyClose: async () => { + progress2.log("Closing stdin..."); + launchedProcess.stdin.end(); + }, + onExit: (exitCode, signal) => { + progress2.log(`ffmpeg onkill exitCode=${exitCode} signal=${signal}`); + } + }); + launchedProcess.stdin.on("finish", () => { + progress2.log("ffmpeg finished input."); + }); + launchedProcess.stdin.on("error", () => { + progress2.log("ffmpeg error."); + }); + this._process = launchedProcess; + this._gracefullyClose = gracefullyClose; + } + writeFrame(frame, timestamp2) { + assert(this._process); + if (this._isStopped) + return; + if (this._lastFrameBuffer) { + const durationSec = timestamp2 - this._lastFrameTimestamp; + const repeatCount = Math.max(1, Math.round(fps * durationSec)); + for (let i = 0; i < repeatCount; ++i) + this._frameQueue.push(this._lastFrameBuffer); + this._lastWritePromise = this._lastWritePromise.then(() => this._sendFrames()); + } + this._lastFrameBuffer = frame; + this._lastFrameTimestamp = timestamp2; + this._lastWriteTimestamp = monotonicTime(); + } + async _sendFrames() { + while (this._frameQueue.length) + await this._sendFrame(this._frameQueue.shift()); + } + async _sendFrame(frame) { + return new Promise((f) => this._process.stdin.write(frame, f)).then((error2) => { + if (error2) + this._progress.log(`ffmpeg failed to write: ${String(error2)}`); + }); + } + async stop() { + if (this._isStopped) + return; + this.writeFrame(Buffer.from([]), this._lastFrameTimestamp + (monotonicTime() - this._lastWriteTimestamp) / 1e3); + this._isStopped = true; + await this._lastWritePromise; + await this._gracefullyClose(); + } +} +class CRPage { + constructor(client, targetId, browserContext, opener, bits) { + this._sessions = /* @__PURE__ */ new Map(); + this._nextWindowOpenPopupFeatures = []; + this._targetId = targetId; + this._opener = opener; + this._isBackgroundPage = bits.isBackgroundPage; + const dragManager = new DragManager(this); + this.rawKeyboard = new RawKeyboardImpl$3(client, browserContext._browser._platform() === "mac", dragManager); + this.rawMouse = new RawMouseImpl$3(this, client, dragManager); + this.rawTouchscreen = new RawTouchscreenImpl$3(client); + this._pdf = new CRPDF(client); + this._coverage = new CRCoverage(client); + this._browserContext = browserContext; + this._page = new Page$1(this, browserContext); + this.utilityWorldName = `__playwright_utility_world_${this._page.guid}`; + this._networkManager = new CRNetworkManager(this._page, null); + this.updateOffline(); + this.updateExtraHTTPHeaders(); + this.updateHttpCredentials(); + this.updateRequestInterception(); + this._mainFrameSession = new FrameSession(this, client, targetId, null); + this._sessions.set(targetId, this._mainFrameSession); + if (opener && !browserContext._options.noDefaultViewport) { + const features = opener._nextWindowOpenPopupFeatures.shift() || []; + const viewportSize = helper.getViewportSizeFromWindowFeatures(features); + if (viewportSize) + this._page.setEmulatedSizeFromWindowOpen({ viewport: viewportSize, screen: viewportSize }); + } + const createdEvent = this._isBackgroundPage ? CRBrowserContext.CREvents.BackgroundPage : BrowserContext$1.Events.Page; + this._mainFrameSession._initialize(bits.hasUIWindow).then( + () => { + var _a2; + return this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page, void 0, createdEvent); + }, + (error2) => { + var _a2; + return this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page, error2, createdEvent); + } + ); + } + static mainFrameSession(page) { + const crPage = page.delegate; + return crPage._mainFrameSession; + } + async _forAllFrameSessions(cb) { + const frameSessions = Array.from(this._sessions.values()); + await Promise.all(frameSessions.map((frameSession) => { + if (frameSession._isMainFrame()) + return cb(frameSession); + return cb(frameSession).catch((e) => { + if (isSessionClosedError(e)) + return; + throw e; + }); + })); + } + _sessionForFrame(frame) { + while (!this._sessions.has(frame._id)) { + const parent = frame.parentFrame(); + if (!parent) + throw new Error(`Frame has been detached.`); + frame = parent; + } + return this._sessions.get(frame._id); + } + _sessionForHandle(handle) { + const frame = handle._context.frame; + return this._sessionForFrame(frame); + } + willBeginDownload() { + this._mainFrameSession._willBeginDownload(); + } + didClose() { + for (const session of this._sessions.values()) + session.dispose(); + this._page._didClose(); + } + async navigateFrame(frame, url2, referrer) { + return this._sessionForFrame(frame)._navigate(frame, url2, referrer); + } + async updateExtraHTTPHeaders() { + const headers = mergeHeaders([ + this._browserContext._options.extraHTTPHeaders, + this._page.extraHTTPHeaders() + ]); + await this._networkManager.setExtraHTTPHeaders(headers); + } + async updateGeolocation() { + await this._forAllFrameSessions((frame) => frame._updateGeolocation(false)); + } + async updateOffline() { + await this._networkManager.setOffline(!!this._browserContext._options.offline); + } + async updateHttpCredentials() { + await this._networkManager.authenticate(this._browserContext._options.httpCredentials || null); + } + async updateEmulatedViewportSize(preserveWindowBoundaries) { + await this._mainFrameSession._updateViewport(preserveWindowBoundaries); + } + async bringToFront() { + await this._mainFrameSession._client.send("Page.bringToFront"); + } + async updateEmulateMedia() { + await this._forAllFrameSessions((frame) => frame._updateEmulateMedia()); + } + async updateUserAgent() { + await this._forAllFrameSessions((frame) => frame._updateUserAgent()); + } + async updateRequestInterception() { + await this._networkManager.setRequestInterception(this._page.needsRequestInterception()); + } + async updateFileChooserInterception() { + await this._forAllFrameSessions((frame) => frame._updateFileChooserInterception(false)); + } + async reload() { + await this._mainFrameSession._client.send("Page.reload"); + } + async _go(delta) { + const history = await this._mainFrameSession._client.send("Page.getNavigationHistory"); + const entry = history.entries[history.currentIndex + delta]; + if (!entry) + return false; + await this._mainFrameSession._client.send("Page.navigateToHistoryEntry", { entryId: entry.id }); + return true; + } + goBack() { + return this._go(-1); + } + goForward() { + return this._go(1); + } + async requestGC() { + await this._mainFrameSession._client.send("HeapProfiler.collectGarbage"); + } + async addInitScript(initScript, world = "main") { + await this._forAllFrameSessions((frame) => frame._evaluateOnNewDocument(initScript, world)); + } + async exposePlaywrightBinding() { + await this._forAllFrameSessions((frame) => frame.exposePlaywrightBinding()); + } + async removeInitScripts(initScripts) { + await this._forAllFrameSessions((frame) => frame._removeEvaluatesOnNewDocument(initScripts)); + } + async closePage(runBeforeUnload) { + if (runBeforeUnload) + await this._mainFrameSession._client.send("Page.close"); + else + await this._browserContext._browser._closePage(this); + } + async setBackgroundColor(color) { + await this._mainFrameSession._client.send("Emulation.setDefaultBackgroundColorOverride", { color }); + } + async takeScreenshot(progress2, format, documentRect, viewportRect, quality, fitsViewport, scale) { + const { visualViewport } = await this._mainFrameSession._client.send("Page.getLayoutMetrics"); + if (!documentRect) { + documentRect = { + x: visualViewport.pageX + viewportRect.x, + y: visualViewport.pageY + viewportRect.y, + ...helper.enclosingIntSize({ + width: viewportRect.width / visualViewport.scale, + height: viewportRect.height / visualViewport.scale + }) + }; + } + const clip = { ...documentRect, scale: viewportRect ? visualViewport.scale : 1 }; + if (scale === "css") { + const deviceScaleFactor = this._browserContext._options.deviceScaleFactor || 1; + clip.scale /= deviceScaleFactor; + } + progress2.throwIfAborted(); + const result = await this._mainFrameSession._client.send("Page.captureScreenshot", { format, quality, clip, captureBeyondViewport: !fitsViewport }); + return Buffer.from(result.data, "base64"); + } + async getContentFrame(handle) { + return this._sessionForHandle(handle)._getContentFrame(handle); + } + async getOwnerFrame(handle) { + return this._sessionForHandle(handle)._getOwnerFrame(handle); + } + async getBoundingBox(handle) { + return this._sessionForHandle(handle)._getBoundingBox(handle); + } + async scrollRectIntoViewIfNeeded(handle, rect) { + return this._sessionForHandle(handle)._scrollRectIntoViewIfNeeded(handle, rect); + } + async setScreencastOptions(options2) { + if (options2) { + await this._mainFrameSession._startScreencast(this, { + format: "jpeg", + quality: options2.quality, + maxWidth: options2.width, + maxHeight: options2.height + }); + } else { + await this._mainFrameSession._stopScreencast(this); + } + } + rafCountForStablePosition() { + return 1; + } + async getContentQuads(handle) { + return this._sessionForHandle(handle)._getContentQuads(handle); + } + async setInputFilePaths(handle, files) { + const frame = await handle.ownerFrame(); + if (!frame) + throw new Error("Cannot set input files to detached input element"); + const parentSession = this._sessionForFrame(frame); + await parentSession._client.send("DOM.setFileInputFiles", { + objectId: handle._objectId, + files + }); + } + async adoptElementHandle(handle, to) { + return this._sessionForHandle(handle)._adoptElementHandle(handle, to); + } + async getAccessibilityTree(needle) { + return getAccessibilityTree$2(this._mainFrameSession._client, needle); + } + async inputActionEpilogue() { + await this._mainFrameSession._client.send("Page.enable").catch((e) => { + }); + } + async resetForReuse() { + await this.rawMouse.move(-1, -1, "none", /* @__PURE__ */ new Set(), /* @__PURE__ */ new Set(), true); + } + async pdf(options2) { + return this._pdf.generate(options2); + } + coverage() { + return this._coverage; + } + async getFrameElement(frame) { + let parent = frame.parentFrame(); + if (!parent) + throw new Error("Frame has been detached."); + const parentSession = this._sessionForFrame(parent); + const { backendNodeId } = await parentSession._client.send("DOM.getFrameOwner", { frameId: frame._id }).catch((e) => { + if (e instanceof Error && e.message.includes("Frame with the given id was not found.")) + rewriteErrorMessage(e, "Frame has been detached."); + throw e; + }); + parent = frame.parentFrame(); + if (!parent) + throw new Error("Frame has been detached."); + return parentSession._adoptBackendNodeId(backendNodeId, await parent._mainContext()); + } + shouldToggleStyleSheetToSyncAnimations() { + return false; + } +} +class FrameSession { + constructor(crPage, client, targetId, parentSession) { + this._childSessions = /* @__PURE__ */ new Set(); + this._contextIdToContext = /* @__PURE__ */ new Map(); + this._eventListeners = []; + this._firstNonInitialNavigationCommittedFulfill = () => { + }; + this._firstNonInitialNavigationCommittedReject = (e) => { + }; + this._swappedIn = false; + this._videoRecorder = null; + this._screencastId = null; + this._screencastClients = /* @__PURE__ */ new Set(); + this._workerSessions = /* @__PURE__ */ new Map(); + this._initScriptIds = /* @__PURE__ */ new Map(); + this._client = client; + this._crPage = crPage; + this._page = crPage._page; + this._targetId = targetId; + this._parentSession = parentSession; + if (parentSession) + parentSession._childSessions.add(this); + this._firstNonInitialNavigationCommittedPromise = new Promise((f, r) => { + this._firstNonInitialNavigationCommittedFulfill = f; + this._firstNonInitialNavigationCommittedReject = r; + }); + this._firstNonInitialNavigationCommittedPromise.catch(() => { + }); + } + _isMainFrame() { + return this._targetId === this._crPage._targetId; + } + _addRendererListeners() { + this._eventListeners.push(...[ + eventsHelper.addEventListener(this._client, "Log.entryAdded", (event) => this._onLogEntryAdded(event)), + eventsHelper.addEventListener(this._client, "Page.fileChooserOpened", (event) => this._onFileChooserOpened(event)), + eventsHelper.addEventListener(this._client, "Page.frameAttached", (event) => this._onFrameAttached(event.frameId, event.parentFrameId)), + eventsHelper.addEventListener(this._client, "Page.frameDetached", (event) => this._onFrameDetached(event.frameId, event.reason)), + eventsHelper.addEventListener(this._client, "Page.frameNavigated", (event) => this._onFrameNavigated(event.frame, false)), + eventsHelper.addEventListener(this._client, "Page.frameRequestedNavigation", (event) => this._onFrameRequestedNavigation(event)), + eventsHelper.addEventListener(this._client, "Page.javascriptDialogOpening", (event) => this._onDialog(event)), + eventsHelper.addEventListener(this._client, "Page.navigatedWithinDocument", (event) => this._onFrameNavigatedWithinDocument(event.frameId, event.url)), + eventsHelper.addEventListener(this._client, "Runtime.bindingCalled", (event) => this._onBindingCalled(event)), + eventsHelper.addEventListener(this._client, "Runtime.consoleAPICalled", (event) => this._onConsoleAPI(event)), + eventsHelper.addEventListener(this._client, "Runtime.exceptionThrown", (exception) => this._handleException(exception.exceptionDetails)), + eventsHelper.addEventListener(this._client, "Runtime.executionContextCreated", (event) => this._onExecutionContextCreated(event.context)), + eventsHelper.addEventListener(this._client, "Runtime.executionContextDestroyed", (event) => this._onExecutionContextDestroyed(event.executionContextId)), + eventsHelper.addEventListener(this._client, "Runtime.executionContextsCleared", (event) => this._onExecutionContextsCleared()), + eventsHelper.addEventListener(this._client, "Target.attachedToTarget", (event) => this._onAttachedToTarget(event)), + eventsHelper.addEventListener(this._client, "Target.detachedFromTarget", (event) => this._onDetachedFromTarget(event)) + ]); + } + _addBrowserListeners() { + this._eventListeners.push(...[ + eventsHelper.addEventListener(this._client, "Inspector.targetCrashed", (event) => this._onTargetCrashed()), + eventsHelper.addEventListener(this._client, "Page.screencastFrame", (event) => this._onScreencastFrame(event)), + eventsHelper.addEventListener(this._client, "Page.windowOpen", (event) => this._onWindowOpen(event)) + ]); + } + async _initialize(hasUIWindow) { + const isSettingStorageState = this._page.browserContext.isSettingStorageState(); + if (!isSettingStorageState && hasUIWindow && !this._crPage._browserContext._browser.isClank() && !this._crPage._browserContext._options.noDefaultViewport) { + const { windowId } = await this._client.send("Browser.getWindowForTarget"); + this._windowId = windowId; + } + let screencastOptions; + if (!isSettingStorageState && this._isMainFrame() && this._crPage._browserContext._options.recordVideo && hasUIWindow) { + const screencastId = createGuid(); + const outputFile = path.join(this._crPage._browserContext._options.recordVideo.dir, screencastId + ".webm"); + screencastOptions = { + // validateBrowserContextOptions ensures correct video size. + ...this._crPage._browserContext._options.recordVideo.size, + outputFile + }; + await this._crPage._browserContext._ensureVideosPath(); + await this._createVideoRecorder(screencastId, screencastOptions); + this._crPage._page.waitForInitializedOrError().then((p) => { + if (p instanceof Error) + this._stopVideoRecording().catch(() => { + }); + }); + } + let lifecycleEventsEnabled; + if (!this._isMainFrame()) + this._addRendererListeners(); + this._addBrowserListeners(); + const promises2 = [ + this._client.send("Page.enable"), + this._client.send("Page.getFrameTree").then(({ frameTree }) => { + if (this._isMainFrame()) { + this._handleFrameTree(frameTree); + this._addRendererListeners(); + } + const localFrames = this._isMainFrame() ? this._page.frames() : [this._page.frameManager.frame(this._targetId)]; + for (const frame of localFrames) { + this._client._sendMayFail("Page.createIsolatedWorld", { + frameId: frame._id, + grantUniveralAccess: true, + worldName: this._crPage.utilityWorldName + }); + } + const isInitialEmptyPage = this._isMainFrame() && this._page.mainFrame().url() === ":"; + if (isInitialEmptyPage) { + lifecycleEventsEnabled.catch((e) => { + }).then(() => { + this._eventListeners.push(eventsHelper.addEventListener(this._client, "Page.lifecycleEvent", (event) => this._onLifecycleEvent(event))); + }); + } else { + this._firstNonInitialNavigationCommittedFulfill(); + this._eventListeners.push(eventsHelper.addEventListener(this._client, "Page.lifecycleEvent", (event) => this._onLifecycleEvent(event))); + } + }), + this._client.send("Log.enable", {}), + lifecycleEventsEnabled = this._client.send("Page.setLifecycleEventsEnabled", { enabled: true }), + this._client.send("Runtime.enable", {}), + this._client.send("Page.addScriptToEvaluateOnNewDocument", { + source: "", + worldName: this._crPage.utilityWorldName + }), + this._crPage._networkManager.addSession(this._client, void 0, this._isMainFrame()), + this._client.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }) + ]; + if (!isSettingStorageState) { + if (this._crPage._browserContext.needsPlaywrightBinding()) + promises2.push(this.exposePlaywrightBinding()); + if (this._isMainFrame()) + promises2.push(this._client.send("Emulation.setFocusEmulationEnabled", { enabled: true })); + const options2 = this._crPage._browserContext._options; + if (options2.bypassCSP) + promises2.push(this._client.send("Page.setBypassCSP", { enabled: true })); + if (options2.ignoreHTTPSErrors || options2.internalIgnoreHTTPSErrors) + promises2.push(this._client.send("Security.setIgnoreCertificateErrors", { ignore: true })); + if (this._isMainFrame()) + promises2.push(this._updateViewport()); + if (options2.hasTouch) + promises2.push(this._client.send("Emulation.setTouchEmulationEnabled", { enabled: true })); + if (options2.javaScriptEnabled === false) + promises2.push(this._client.send("Emulation.setScriptExecutionDisabled", { value: true })); + if (options2.userAgent || options2.locale) + promises2.push(this._updateUserAgent()); + if (options2.locale) + promises2.push(emulateLocale(this._client, options2.locale)); + if (options2.timezoneId) + promises2.push(emulateTimezone(this._client, options2.timezoneId)); + if (!this._crPage._browserContext._browser.options.headful) + promises2.push(this._setDefaultFontFamilies(this._client)); + promises2.push(this._updateGeolocation(true)); + promises2.push(this._updateEmulateMedia()); + promises2.push(this._updateFileChooserInterception(true)); + for (const initScript of this._crPage._page.allInitScripts()) + promises2.push(this._evaluateOnNewDocument( + initScript, + "main", + true + /* runImmediately */ + )); + if (screencastOptions) + promises2.push(this._startVideoRecording(screencastOptions)); + } + promises2.push(this._client.send("Runtime.runIfWaitingForDebugger")); + promises2.push(this._firstNonInitialNavigationCommittedPromise); + await Promise.all(promises2); + } + dispose() { + this._firstNonInitialNavigationCommittedReject(new TargetClosedError$1()); + for (const childSession of this._childSessions) + childSession.dispose(); + if (this._parentSession) + this._parentSession._childSessions.delete(this); + eventsHelper.removeEventListeners(this._eventListeners); + this._crPage._networkManager.removeSession(this._client); + this._crPage._sessions.delete(this._targetId); + this._client.dispose(); + } + async _navigate(frame, url2, referrer) { + const response2 = await this._client.send("Page.navigate", { url: url2, referrer, frameId: frame._id, referrerPolicy: "unsafeUrl" }); + if (response2.errorText) + throw new NavigationAbortedError(response2.loaderId, `${response2.errorText} at ${url2}`); + return { newDocumentId: response2.loaderId }; + } + _onLifecycleEvent(event) { + if (this._eventBelongsToStaleFrame(event.frameId)) + return; + if (event.name === "load") + this._page.frameManager.frameLifecycleEvent(event.frameId, "load"); + else if (event.name === "DOMContentLoaded") + this._page.frameManager.frameLifecycleEvent(event.frameId, "domcontentloaded"); + } + _handleFrameTree(frameTree) { + this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null); + this._onFrameNavigated(frameTree.frame, true); + if (!frameTree.childFrames) + return; + for (const child of frameTree.childFrames) + this._handleFrameTree(child); + } + _eventBelongsToStaleFrame(frameId) { + const frame = this._page.frameManager.frame(frameId); + if (!frame) + return true; + const session = this._crPage._sessionForFrame(frame); + return session && session !== this && !session._swappedIn; + } + _onFrameAttached(frameId, parentFrameId) { + const frameSession = this._crPage._sessions.get(frameId); + if (frameSession && frameId !== this._targetId) { + frameSession._swappedIn = true; + const frame = this._page.frameManager.frame(frameId); + if (frame) + this._page.frameManager.removeChildFramesRecursively(frame); + return; + } + if (parentFrameId && !this._page.frameManager.frame(parentFrameId)) { + return; + } + this._page.frameManager.frameAttached(frameId, parentFrameId); + } + _onFrameNavigated(framePayload, initial) { + if (this._eventBelongsToStaleFrame(framePayload.id)) + return; + this._page.frameManager.frameCommittedNewDocumentNavigation(framePayload.id, framePayload.url + (framePayload.urlFragment || ""), framePayload.name || "", framePayload.loaderId, initial); + if (!initial) + this._firstNonInitialNavigationCommittedFulfill(); + } + _onFrameRequestedNavigation(payload) { + if (this._eventBelongsToStaleFrame(payload.frameId)) + return; + if (payload.disposition === "currentTab") + this._page.frameManager.frameRequestedNavigation(payload.frameId); + } + _onFrameNavigatedWithinDocument(frameId, url2) { + if (this._eventBelongsToStaleFrame(frameId)) + return; + this._page.frameManager.frameCommittedSameDocumentNavigation(frameId, url2); + } + _onFrameDetached(frameId, reason) { + if (this._crPage._sessions.has(frameId)) { + return; + } + if (reason === "swap") { + const frame = this._page.frameManager.frame(frameId); + if (frame) + this._page.frameManager.removeChildFramesRecursively(frame); + return; + } + this._page.frameManager.frameDetached(frameId); + } + _onExecutionContextCreated(contextPayload) { + const frame = contextPayload.auxData ? this._page.frameManager.frame(contextPayload.auxData.frameId) : null; + if (!frame || this._eventBelongsToStaleFrame(frame._id)) + return; + const delegate = new CRExecutionContext(this._client, contextPayload); + let worldName = null; + if (contextPayload.auxData && !!contextPayload.auxData.isDefault) + worldName = "main"; + else if (contextPayload.name === this._crPage.utilityWorldName) + worldName = "utility"; + const context = new FrameExecutionContext(delegate, frame, worldName); + if (worldName) + frame._contextCreated(worldName, context); + this._contextIdToContext.set(contextPayload.id, context); + } + _onExecutionContextDestroyed(executionContextId) { + const context = this._contextIdToContext.get(executionContextId); + if (!context) + return; + this._contextIdToContext.delete(executionContextId); + context.frame._contextDestroyed(context); + } + _onExecutionContextsCleared() { + for (const contextId of Array.from(this._contextIdToContext.keys())) + this._onExecutionContextDestroyed(contextId); + } + _onAttachedToTarget(event) { + const session = this._client.createChildSession(event.sessionId); + if (event.targetInfo.type === "iframe") { + const targetId = event.targetInfo.targetId; + const frame = this._page.frameManager.frame(targetId); + if (!frame) + return; + this._page.frameManager.removeChildFramesRecursively(frame); + for (const [contextId, context] of this._contextIdToContext) { + if (context.frame === frame) + this._onExecutionContextDestroyed(contextId); + } + const frameSession = new FrameSession(this._crPage, session, targetId, this); + this._crPage._sessions.set(targetId, frameSession); + frameSession._initialize(false).catch((e) => e); + return; + } + if (event.targetInfo.type !== "worker") { + session.detach().catch(() => { + }); + return; + } + const url2 = event.targetInfo.url; + const worker = new Worker$1(this._page, url2); + this._page.addWorker(event.sessionId, worker); + this._workerSessions.set(event.sessionId, session); + session.once("Runtime.executionContextCreated", async (event2) => { + worker.createExecutionContext(new CRExecutionContext(session, event2.context)); + }); + session._sendMayFail("Runtime.enable"); + this._crPage._networkManager.addSession(session, this._page.frameManager.frame(this._targetId) ?? void 0).catch(() => { + }); + session._sendMayFail("Runtime.runIfWaitingForDebugger"); + session._sendMayFail("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }); + session.on("Target.attachedToTarget", (event2) => this._onAttachedToTarget(event2)); + session.on("Target.detachedFromTarget", (event2) => this._onDetachedFromTarget(event2)); + session.on("Runtime.consoleAPICalled", (event2) => { + const args = event2.args.map((o) => createHandle$3(worker.existingExecutionContext, o)); + this._page.addConsoleMessage(event2.type, args, toConsoleMessageLocation(event2.stackTrace)); + }); + session.on("Runtime.exceptionThrown", (exception) => this._page.emitOnContextOnceInitialized(BrowserContext$1.Events.PageError, exceptionToError(exception.exceptionDetails), this._page)); + } + _onDetachedFromTarget(event) { + const workerSession = this._workerSessions.get(event.sessionId); + if (workerSession) { + workerSession.dispose(); + this._page.removeWorker(event.sessionId); + return; + } + const childFrameSession = this._crPage._sessions.get(event.targetId); + if (!childFrameSession) + return; + if (childFrameSession._swappedIn) { + childFrameSession.dispose(); + return; + } + this._client.send("Page.enable").catch((e) => null).then(() => { + if (!childFrameSession._swappedIn) + this._page.frameManager.frameDetached(event.targetId); + childFrameSession.dispose(); + }); + } + _onWindowOpen(event) { + this._crPage._nextWindowOpenPopupFeatures.push(event.windowFeatures); + } + async _onConsoleAPI(event) { + if (event.executionContextId === 0) { + return; + } + const context = this._contextIdToContext.get(event.executionContextId); + if (!context) + return; + const values = event.args.map((arg) => createHandle$3(context, arg)); + this._page.addConsoleMessage(event.type, values, toConsoleMessageLocation(event.stackTrace)); + } + async _onBindingCalled(event) { + const pageOrError = await this._crPage._page.waitForInitializedOrError(); + if (!(pageOrError instanceof Error)) { + const context = this._contextIdToContext.get(event.executionContextId); + if (context) + await this._page.onBindingCalled(event.payload, context); + } + } + _onDialog(event) { + if (!this._page.frameManager.frame(this._targetId)) + return; + this._page.browserContext.dialogManager.dialogDidOpen(new Dialog$1( + this._page, + event.type, + event.message, + async (accept, promptText) => { + if (this._isMainFrame() && event.type === "beforeunload" && !accept) + this._page.frameManager.frameAbortedNavigation(this._page.mainFrame()._id, "navigation cancelled by beforeunload dialog"); + await this._client.send("Page.handleJavaScriptDialog", { accept, promptText }); + }, + event.defaultPrompt + )); + } + _handleException(exceptionDetails) { + this._page.emitOnContextOnceInitialized(BrowserContext$1.Events.PageError, exceptionToError(exceptionDetails), this._page); + } + async _onTargetCrashed() { + this._client._markAsCrashed(); + this._page._didCrash(); + } + _onLogEntryAdded(event) { + const { level, text, args, source: source2, url: url2, lineNumber } = event.entry; + if (args) + args.map((arg) => releaseObject(this._client, arg.objectId)); + if (source2 !== "worker") { + const location2 = { + url: url2 || "", + lineNumber: lineNumber || 0, + columnNumber: 0 + }; + this._page.addConsoleMessage(level, [], location2, text); + } + } + async _onFileChooserOpened(event) { + if (!event.backendNodeId) + return; + const frame = this._page.frameManager.frame(event.frameId); + if (!frame) + return; + let handle; + try { + const utilityContext = await frame._utilityContext(); + handle = await this._adoptBackendNodeId(event.backendNodeId, utilityContext); + } catch (e) { + return; + } + await this._page._onFileChooserOpened(handle); + } + _willBeginDownload() { + if (!this._crPage._page.initializedOrUndefined()) { + this._firstNonInitialNavigationCommittedReject(new Error("Starting new page download")); + } + } + _onScreencastFrame(payload) { + this._page.throttleScreencastFrameAck(() => { + this._client.send("Page.screencastFrameAck", { sessionId: payload.sessionId }).catch(() => { + }); + }); + const buffer2 = Buffer.from(payload.data, "base64"); + this._page.emit(Page$1.Events.ScreencastFrame, { + buffer: buffer2, + frameSwapWallTime: payload.metadata.timestamp ? payload.metadata.timestamp * 1e3 : void 0, + width: payload.metadata.deviceWidth, + height: payload.metadata.deviceHeight + }); + } + async _createVideoRecorder(screencastId, options2) { + assert(!this._screencastId); + const ffmpegPath = registry.findExecutable("ffmpeg").executablePathOrDie(this._page.attribution.playwright.options.sdkLanguage); + this._videoRecorder = await VideoRecorder.launch(this._crPage._page, ffmpegPath, options2); + this._screencastId = screencastId; + } + async _startVideoRecording(options2) { + const screencastId = this._screencastId; + assert(screencastId); + this._page.once(Page$1.Events.Close, () => this._stopVideoRecording().catch(() => { + })); + const gotFirstFrame = new Promise((f) => this._client.once("Page.screencastFrame", f)); + await this._startScreencast(this._videoRecorder, { + format: "jpeg", + quality: 90, + maxWidth: options2.width, + maxHeight: options2.height + }); + gotFirstFrame.then(() => { + this._crPage._browserContext._browser._videoStarted(this._crPage._browserContext, screencastId, options2.outputFile, this._crPage._page.waitForInitializedOrError()); + }); + } + async _stopVideoRecording() { + if (!this._screencastId) + return; + const screencastId = this._screencastId; + this._screencastId = null; + const recorder = this._videoRecorder; + this._videoRecorder = null; + await this._stopScreencast(recorder); + await recorder.stop().catch(() => { + }); + const video = this._crPage._browserContext._browser._takeVideo(screencastId); + video == null ? void 0 : video.reportFinished(); + } + async _startScreencast(client, options2 = {}) { + this._screencastClients.add(client); + if (this._screencastClients.size === 1) + await this._client.send("Page.startScreencast", options2); + } + async _stopScreencast(client) { + this._screencastClients.delete(client); + if (!this._screencastClients.size) + await this._client._sendMayFail("Page.stopScreencast"); + } + async _updateGeolocation(initial) { + const geolocation = this._crPage._browserContext._options.geolocation; + if (!initial || geolocation) + await this._client.send("Emulation.setGeolocationOverride", geolocation || {}); + } + async _updateViewport(preserveWindowBoundaries) { + if (this._crPage._browserContext._browser.isClank()) + return; + assert(this._isMainFrame()); + const options2 = this._crPage._browserContext._options; + const emulatedSize = this._page.emulatedSize(); + if (!emulatedSize) + return; + const viewportSize = emulatedSize.viewport; + const screenSize = emulatedSize.screen; + const isLandscape = screenSize.width > screenSize.height; + const metricsOverride = { + mobile: !!options2.isMobile, + width: viewportSize.width, + height: viewportSize.height, + screenWidth: screenSize.width, + screenHeight: screenSize.height, + deviceScaleFactor: options2.deviceScaleFactor || 1, + screenOrientation: !!options2.isMobile ? isLandscape ? { angle: 90, type: "landscapePrimary" } : { angle: 0, type: "portraitPrimary" } : { angle: 0, type: "landscapePrimary" }, + dontSetVisibleSize: preserveWindowBoundaries + }; + if (JSON.stringify(this._metricsOverride) === JSON.stringify(metricsOverride)) + return; + const promises2 = []; + if (!preserveWindowBoundaries && this._windowId) { + let insets = { width: 0, height: 0 }; + if (this._crPage._browserContext._browser.options.headful) { + insets = { width: 24, height: 88 }; + if (process.platform === "win32") + insets = { width: 16, height: 88 }; + else if (process.platform === "linux") + insets = { width: 8, height: 85 }; + else if (process.platform === "darwin") + insets = { width: 2, height: 80 }; + if (this._crPage._browserContext.isPersistentContext()) { + insets.height += 46; + } + } + promises2.push(this.setWindowBounds({ + width: viewportSize.width + insets.width, + height: viewportSize.height + insets.height + })); + } + promises2.push(this._client.send("Emulation.setDeviceMetricsOverride", metricsOverride)); + await Promise.all(promises2); + this._metricsOverride = metricsOverride; + } + async windowBounds() { + const { bounds } = await this._client.send("Browser.getWindowBounds", { + windowId: this._windowId + }); + return bounds; + } + async setWindowBounds(bounds) { + return await this._client.send("Browser.setWindowBounds", { + windowId: this._windowId, + bounds + }); + } + async _updateEmulateMedia() { + const emulatedMedia = this._page.emulatedMedia(); + const media = emulatedMedia.media === "no-override" ? "" : emulatedMedia.media; + const colorScheme = emulatedMedia.colorScheme === "no-override" ? "" : emulatedMedia.colorScheme; + const reducedMotion = emulatedMedia.reducedMotion === "no-override" ? "" : emulatedMedia.reducedMotion; + const forcedColors = emulatedMedia.forcedColors === "no-override" ? "" : emulatedMedia.forcedColors; + const contrast = emulatedMedia.contrast === "no-override" ? "" : emulatedMedia.contrast; + const features = [ + { name: "prefers-color-scheme", value: colorScheme }, + { name: "prefers-reduced-motion", value: reducedMotion }, + { name: "forced-colors", value: forcedColors }, + { name: "prefers-contrast", value: contrast } + ]; + await this._client.send("Emulation.setEmulatedMedia", { media, features }); + } + async _updateUserAgent() { + const options2 = this._crPage._browserContext._options; + await this._client.send("Emulation.setUserAgentOverride", { + userAgent: options2.userAgent || "", + acceptLanguage: options2.locale, + userAgentMetadata: calculateUserAgentMetadata(options2) + }); + } + async _setDefaultFontFamilies(session) { + const fontFamilies = platformToFontFamilies[this._crPage._browserContext._browser._platform()]; + await session.send("Page.setFontFamilies", fontFamilies); + } + async _updateFileChooserInterception(initial) { + const enabled = this._page.fileChooserIntercepted(); + if (initial && !enabled) + return; + await this._client.send("Page.setInterceptFileChooserDialog", { enabled }).catch(() => { + }); + } + async _evaluateOnNewDocument(initScript, world, runImmediately) { + const worldName = world === "utility" ? this._crPage.utilityWorldName : void 0; + const { identifier } = await this._client.send("Page.addScriptToEvaluateOnNewDocument", { source: initScript.source, worldName, runImmediately }); + this._initScriptIds.set(initScript, identifier); + } + async _removeEvaluatesOnNewDocument(initScripts) { + const ids = []; + for (const script of initScripts) { + const id = this._initScriptIds.get(script); + if (id) + ids.push(id); + this._initScriptIds.delete(script); + } + await Promise.all(ids.map((identifier) => this._client.send("Page.removeScriptToEvaluateOnNewDocument", { identifier }).catch(() => { + }))); + } + async exposePlaywrightBinding() { + await this._client.send("Runtime.addBinding", { name: PageBinding.kBindingName }); + } + async _getContentFrame(handle) { + const nodeInfo = await this._client.send("DOM.describeNode", { + objectId: handle._objectId + }); + if (!nodeInfo || typeof nodeInfo.node.frameId !== "string") + return null; + return this._page.frameManager.frame(nodeInfo.node.frameId); + } + async _getOwnerFrame(handle) { + const documentElement = await handle.evaluateHandle((node2) => { + const doc = node2; + if (doc.documentElement && doc.documentElement.ownerDocument === doc) + return doc.documentElement; + return node2.ownerDocument ? node2.ownerDocument.documentElement : null; + }); + if (!documentElement) + return null; + if (!documentElement._objectId) + return null; + const nodeInfo = await this._client.send("DOM.describeNode", { + objectId: documentElement._objectId + }); + const frameId = nodeInfo && typeof nodeInfo.node.frameId === "string" ? nodeInfo.node.frameId : null; + documentElement.dispose(); + return frameId; + } + async _getBoundingBox(handle) { + const result = await this._client._sendMayFail("DOM.getBoxModel", { + objectId: handle._objectId + }); + if (!result) + return null; + const quad = result.model.border; + const x = Math.min(quad[0], quad[2], quad[4], quad[6]); + const y = Math.min(quad[1], quad[3], quad[5], quad[7]); + const width = Math.max(quad[0], quad[2], quad[4], quad[6]) - x; + const height = Math.max(quad[1], quad[3], quad[5], quad[7]) - y; + const position = await this._framePosition(); + if (!position) + return null; + return { x: x + position.x, y: y + position.y, width, height }; + } + async _framePosition() { + const frame = this._page.frameManager.frame(this._targetId); + if (!frame) + return null; + if (frame === this._page.mainFrame()) + return { x: 0, y: 0 }; + const element = await frame.frameElement(); + const box = await element.boundingBox(); + return box; + } + async _scrollRectIntoViewIfNeeded(handle, rect) { + return await this._client.send("DOM.scrollIntoViewIfNeeded", { + objectId: handle._objectId, + rect + }).then(() => "done").catch((e) => { + if (e instanceof Error && e.message.includes("Node does not have a layout object")) + return "error:notvisible"; + if (e instanceof Error && e.message.includes("Node is detached from document")) + return "error:notconnected"; + throw e; + }); + } + async _getContentQuads(handle) { + const result = await this._client._sendMayFail("DOM.getContentQuads", { + objectId: handle._objectId + }); + if (!result) + return null; + const position = await this._framePosition(); + if (!position) + return null; + return result.quads.map((quad) => [ + { x: quad[0] + position.x, y: quad[1] + position.y }, + { x: quad[2] + position.x, y: quad[3] + position.y }, + { x: quad[4] + position.x, y: quad[5] + position.y }, + { x: quad[6] + position.x, y: quad[7] + position.y } + ]); + } + async _adoptElementHandle(handle, to) { + const nodeInfo = await this._client.send("DOM.describeNode", { + objectId: handle._objectId + }); + return this._adoptBackendNodeId(nodeInfo.node.backendNodeId, to); + } + async _adoptBackendNodeId(backendNodeId, to) { + const result = await this._client._sendMayFail("DOM.resolveNode", { + backendNodeId, + executionContextId: to.delegate._contextId + }); + if (!result || result.object.subtype === "null") + throw new Error(kUnableToAdoptErrorMessage); + return createHandle$3(to, result.object).asElement(); + } +} +async function emulateLocale(session, locale) { + try { + await session.send("Emulation.setLocaleOverride", { locale }); + } catch (exception) { + if (exception.message.includes("Another locale override is already in effect")) + return; + throw exception; + } +} +async function emulateTimezone(session, timezoneId) { + try { + await session.send("Emulation.setTimezoneOverride", { timezoneId }); + } catch (exception) { + if (exception.message.includes("Timezone override is already in effect")) + return; + if (exception.message.includes("Invalid timezone")) + throw new Error(`Invalid timezone ID: ${timezoneId}`); + throw exception; + } +} +function calculateUserAgentMetadata(options2) { + const ua = options2.userAgent; + if (!ua) + return void 0; + const metadata = { + mobile: !!options2.isMobile, + model: "", + architecture: "x86", + platform: "Windows", + platformVersion: "" + }; + const androidMatch = ua.match(/Android (\d+(\.\d+)?(\.\d+)?)/); + const iPhoneMatch = ua.match(/iPhone OS (\d+(_\d+)?)/); + const iPadMatch = ua.match(/iPad; CPU OS (\d+(_\d+)?)/); + const macOSMatch = ua.match(/Mac OS X (\d+(_\d+)?(_\d+)?)/); + const windowsMatch = ua.match(/Windows\D+(\d+(\.\d+)?(\.\d+)?)/); + if (androidMatch) { + metadata.platform = "Android"; + metadata.platformVersion = androidMatch[1]; + metadata.architecture = "arm"; + } else if (iPhoneMatch) { + metadata.platform = "iOS"; + metadata.platformVersion = iPhoneMatch[1]; + metadata.architecture = "arm"; + } else if (iPadMatch) { + metadata.platform = "iOS"; + metadata.platformVersion = iPadMatch[1]; + metadata.architecture = "arm"; + } else if (macOSMatch) { + metadata.platform = "macOS"; + metadata.platformVersion = macOSMatch[1]; + if (!ua.includes("Intel")) + metadata.architecture = "arm"; + } else if (windowsMatch) { + metadata.platform = "Windows"; + metadata.platformVersion = windowsMatch[1]; + } else if (ua.toLowerCase().includes("linux")) { + metadata.platform = "Linux"; + } + if (ua.includes("ARM")) + metadata.architecture = "arm"; + return metadata; +} +class CRServiceWorker extends Worker$1 { + constructor(browserContext, session, url2) { + super(browserContext, url2); + this._session = session; + this.browserContext = browserContext; + if (!!define_process_env_default.PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS) + this._networkManager = new CRNetworkManager(null, this); + session.once("Runtime.executionContextCreated", (event) => { + this.createExecutionContext(new CRExecutionContext(session, event.context)); + }); + if (this._networkManager && this._isNetworkInspectionEnabled()) { + this.updateRequestInterception(); + this.updateExtraHTTPHeaders(); + this.updateHttpCredentials(); + this.updateOffline(); + this._networkManager.addSession( + session, + void 0, + true + /* isMain */ + ).catch(() => { + }); + } + session.send("Runtime.enable", {}).catch((e) => { + }); + session.send("Runtime.runIfWaitingForDebugger").catch((e) => { + }); + session.on("Inspector.targetReloadedAfterCrash", () => { + session._sendMayFail("Runtime.runIfWaitingForDebugger", {}); + }); + } + didClose() { + var _a2; + (_a2 = this._networkManager) == null ? void 0 : _a2.removeSession(this._session); + this._session.dispose(); + super.didClose(); + } + async updateOffline() { + var _a2; + if (!this._isNetworkInspectionEnabled()) + return; + await ((_a2 = this._networkManager) == null ? void 0 : _a2.setOffline(!!this.browserContext._options.offline).catch(() => { + })); + } + async updateHttpCredentials() { + var _a2; + if (!this._isNetworkInspectionEnabled()) + return; + await ((_a2 = this._networkManager) == null ? void 0 : _a2.authenticate(this.browserContext._options.httpCredentials || null).catch(() => { + })); + } + async updateExtraHTTPHeaders() { + var _a2; + if (!this._isNetworkInspectionEnabled()) + return; + await ((_a2 = this._networkManager) == null ? void 0 : _a2.setExtraHTTPHeaders(this.browserContext._options.extraHTTPHeaders || []).catch(() => { + })); + } + async updateRequestInterception() { + var _a2; + if (!this._isNetworkInspectionEnabled()) + return; + await ((_a2 = this._networkManager) == null ? void 0 : _a2.setRequestInterception(this.needsRequestInterception()).catch(() => { + })); + } + needsRequestInterception() { + return this._isNetworkInspectionEnabled() && this.browserContext.requestInterceptors.length > 0; + } + reportRequestFinished(request2, response2) { + this.browserContext.emit(BrowserContext$1.Events.RequestFinished, { request: request2, response: response2 }); + } + requestFailed(request2, _canceled) { + this.browserContext.emit(BrowserContext$1.Events.RequestFailed, request2); + } + requestReceivedResponse(response2) { + this.browserContext.emit(BrowserContext$1.Events.Response, response2); + } + requestStarted(request2, route) { + this.browserContext.emit(BrowserContext$1.Events.Request, request2); + if (route) + new Route$1(request2, route).handle(this.browserContext.requestInterceptors); + } + _isNetworkInspectionEnabled() { + return this.browserContext._options.serviceWorkers !== "block"; + } +} +class CRBrowser extends Browser$1 { + constructor(parent, connection, options2) { + super(parent, options2); + this._clientRootSessionPromise = null; + this._contexts = /* @__PURE__ */ new Map(); + this._crPages = /* @__PURE__ */ new Map(); + this._backgroundPages = /* @__PURE__ */ new Map(); + this._serviceWorkers = /* @__PURE__ */ new Map(); + this._version = ""; + this._tracingRecording = false; + this._userAgent = ""; + this._connection = connection; + this._session = this._connection.rootSession; + this._connection.on(ConnectionEvents$1.Disconnected, () => this._didDisconnect()); + this._session.on("Target.attachedToTarget", this._onAttachedToTarget.bind(this)); + this._session.on("Target.detachedFromTarget", this._onDetachedFromTarget.bind(this)); + this._session.on("Browser.downloadWillBegin", this._onDownloadWillBegin.bind(this)); + this._session.on("Browser.downloadProgress", this._onDownloadProgress.bind(this)); + } + static async connect(parent, transport, options2, devtools) { + options2 = { ...options2 }; + const connection = new CRConnection(transport, options2.protocolLogger, options2.browserLogsCollector); + const browser2 = new CRBrowser(parent, connection, options2); + browser2._devtools = devtools; + if (browser2.isClank()) + browser2._isCollocatedWithServer = false; + const session = connection.rootSession; + if (options2.__testHookOnConnectToBrowser) + await options2.__testHookOnConnectToBrowser(); + const version2 = await session.send("Browser.getVersion"); + browser2._version = version2.product.substring(version2.product.indexOf("/") + 1); + browser2._userAgent = version2.userAgent; + browser2.options.headful = !version2.userAgent.includes("Headless"); + if (!options2.persistent) { + await session.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }); + return browser2; + } + browser2._defaultContext = new CRBrowserContext(browser2, void 0, options2.persistent); + await Promise.all([ + session.send("Target.setAutoAttach", { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }).then(async () => { + await session.send("Target.getTargetInfo"); + }), + browser2._defaultContext._initialize() + ]); + await browser2._waitForAllPagesToBeInitialized(); + return browser2; + } + async doCreateNewContext(options2) { + const proxy = options2.proxyOverride || options2.proxy; + let proxyBypassList = void 0; + if (proxy) { + if (define_process_env_default.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK) + proxyBypassList = proxy.bypass; + else + proxyBypassList = "<-loopback>" + (proxy.bypass ? `,${proxy.bypass}` : ""); + } + const { browserContextId } = await this._session.send("Target.createBrowserContext", { + disposeOnDetach: true, + proxyServer: proxy ? proxy.server : void 0, + proxyBypassList + }); + const context = new CRBrowserContext(this, browserContextId, options2); + await context._initialize(); + this._contexts.set(browserContextId, context); + return context; + } + contexts() { + return Array.from(this._contexts.values()); + } + version() { + return this._version; + } + userAgent() { + return this._userAgent; + } + _platform() { + if (this._userAgent.includes("Windows")) + return "win"; + if (this._userAgent.includes("Macintosh")) + return "mac"; + return "linux"; + } + isClank() { + return this.options.name === "clank"; + } + async _waitForAllPagesToBeInitialized() { + await Promise.all([...this._crPages.values()].map((crPage) => crPage._page.waitForInitializedOrError())); + } + _onAttachedToTarget({ targetInfo, sessionId, waitingForDebugger }) { + if (targetInfo.type === "browser") + return; + const session = this._session.createChildSession(sessionId); + assert(targetInfo.browserContextId, "targetInfo: " + JSON.stringify(targetInfo, null, 2)); + let context = this._contexts.get(targetInfo.browserContextId) || null; + if (!context) { + context = this._defaultContext; + } + if (targetInfo.type === "other" && targetInfo.url.startsWith("devtools://devtools") && this._devtools) { + this._devtools.install(session); + return; + } + const treatOtherAsPage = targetInfo.type === "other" && define_process_env_default.PW_CHROMIUM_ATTACH_TO_OTHER; + if (!context || targetInfo.type === "other" && !treatOtherAsPage) { + session.detach().catch(() => { + }); + return; + } + assert(!this._crPages.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId); + assert(!this._backgroundPages.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId); + assert(!this._serviceWorkers.has(targetInfo.targetId), "Duplicate target " + targetInfo.targetId); + if (targetInfo.type === "background_page") { + const backgroundPage = new CRPage(session, targetInfo.targetId, context, null, { hasUIWindow: false, isBackgroundPage: true }); + this._backgroundPages.set(targetInfo.targetId, backgroundPage); + return; + } + if (targetInfo.type === "page" || treatOtherAsPage) { + const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null; + const crPage = new CRPage(session, targetInfo.targetId, context, opener, { hasUIWindow: targetInfo.type === "page", isBackgroundPage: false }); + this._crPages.set(targetInfo.targetId, crPage); + return; + } + if (targetInfo.type === "service_worker") { + const serviceWorker = new CRServiceWorker(context, session, targetInfo.url); + this._serviceWorkers.set(targetInfo.targetId, serviceWorker); + context.emit(CRBrowserContext.CREvents.ServiceWorker, serviceWorker); + return; + } + session.detach().catch(() => { + }); + } + _onDetachedFromTarget(payload) { + const targetId = payload.targetId; + const crPage = this._crPages.get(targetId); + if (crPage) { + this._crPages.delete(targetId); + crPage.didClose(); + return; + } + const backgroundPage = this._backgroundPages.get(targetId); + if (backgroundPage) { + this._backgroundPages.delete(targetId); + backgroundPage.didClose(); + return; + } + const serviceWorker = this._serviceWorkers.get(targetId); + if (serviceWorker) { + this._serviceWorkers.delete(targetId); + serviceWorker.didClose(); + return; + } + } + _didDisconnect() { + for (const crPage of this._crPages.values()) + crPage.didClose(); + this._crPages.clear(); + for (const backgroundPage of this._backgroundPages.values()) + backgroundPage.didClose(); + this._backgroundPages.clear(); + for (const serviceWorker of this._serviceWorkers.values()) + serviceWorker.didClose(); + this._serviceWorkers.clear(); + this._didClose(); + } + _findOwningPage(frameId) { + for (const crPage of this._crPages.values()) { + const frame = crPage._page.frameManager.frame(frameId); + if (frame) + return crPage; + } + return null; + } + _onDownloadWillBegin(payload) { + const page = this._findOwningPage(payload.frameId); + if (!page) { + return; + } + page.willBeginDownload(); + let originPage = page._page.initializedOrUndefined(); + if (!originPage && page._opener) + originPage = page._opener._page.initializedOrUndefined(); + if (!originPage) + return; + this._downloadCreated(originPage, payload.guid, payload.url, payload.suggestedFilename); + } + _onDownloadProgress(payload) { + if (payload.state === "completed") + this._downloadFinished(payload.guid, ""); + if (payload.state === "canceled") + this._downloadFinished(payload.guid, this._closeReason || "canceled"); + } + async _closePage(crPage) { + await this._session.send("Target.closeTarget", { targetId: crPage._targetId }); + } + async newBrowserCDPSession() { + return await this._connection.createBrowserSession(); + } + async startTracing(page, options2 = {}) { + assert(!this._tracingRecording, "Cannot start recording trace while already recording trace."); + this._tracingClient = page ? page.delegate._mainFrameSession._client : this._session; + const defaultCategories = [ + "-*", + "devtools.timeline", + "v8.execute", + "disabled-by-default-devtools.timeline", + "disabled-by-default-devtools.timeline.frame", + "toplevel", + "blink.console", + "blink.user_timing", + "latencyInfo", + "disabled-by-default-devtools.timeline.stack", + "disabled-by-default-v8.cpu_profiler", + "disabled-by-default-v8.cpu_profiler.hires" + ]; + const { + screenshots = false, + categories = defaultCategories + } = options2; + if (screenshots) + categories.push("disabled-by-default-devtools.screenshot"); + this._tracingRecording = true; + await this._tracingClient.send("Tracing.start", { + transferMode: "ReturnAsStream", + categories: categories.join(",") + }); + } + async stopTracing() { + assert(this._tracingClient, "Tracing was not started."); + const [event] = await Promise.all([ + new Promise((f) => this._tracingClient.once("Tracing.tracingComplete", f)), + this._tracingClient.send("Tracing.end") + ]); + const tracingPath = path.join(this.options.artifactsDir, createGuid() + ".crtrace"); + await saveProtocolStream(this._tracingClient, event.stream, tracingPath); + this._tracingRecording = false; + const artifact = new Artifact$1(this, tracingPath); + artifact.reportFinished(); + return artifact; + } + isConnected() { + return !this._connection._closed; + } + async _clientRootSession() { + if (!this._clientRootSessionPromise) + this._clientRootSessionPromise = this._connection.createBrowserSession(); + return this._clientRootSessionPromise; + } +} +const _CRBrowserContext = class _CRBrowserContext2 extends BrowserContext$1 { + constructor(browser2, browserContextId, options2) { + super(browser2, options2, browserContextId); + this._authenticateProxyViaCredentials(); + } + async _initialize() { + assert(!Array.from(this._browser._crPages.values()).some((page) => page._browserContext === this)); + const promises2 = [super._initialize()]; + if (this._browser.options.name !== "clank" && this._options.acceptDownloads !== "internal-browser-default") { + promises2.push(this._browser._session.send("Browser.setDownloadBehavior", { + behavior: this._options.acceptDownloads === "accept" ? "allowAndName" : "deny", + browserContextId: this._browserContextId, + downloadPath: this._browser.options.downloadsPath, + eventsEnabled: true + })); + } + await Promise.all(promises2); + } + _crPages() { + return [...this._browser._crPages.values()].filter((crPage) => crPage._browserContext === this); + } + possiblyUninitializedPages() { + return this._crPages().map((crPage) => crPage._page); + } + async doCreateNewPage(markAsServerSideOnly) { + const { targetId } = await this._browser._session.send("Target.createTarget", { url: "about:blank", browserContextId: this._browserContextId }); + const page = this._browser._crPages.get(targetId)._page; + if (markAsServerSideOnly) + page.markAsServerSideOnly(); + return page; + } + async doGetCookies(urls) { + const { cookies } = await this._browser._session.send("Storage.getCookies", { browserContextId: this._browserContextId }); + return filterCookies(cookies.map((c) => { + const copy = { sameSite: "Lax", ...c }; + delete copy.size; + delete copy.priority; + delete copy.session; + delete copy.sameParty; + delete copy.sourceScheme; + delete copy.sourcePort; + return copy; + }), urls); + } + async addCookies(cookies) { + await this._browser._session.send("Storage.setCookies", { cookies: rewriteCookies(cookies), browserContextId: this._browserContextId }); + } + async doClearCookies() { + await this._browser._session.send("Storage.clearCookies", { browserContextId: this._browserContextId }); + } + async doGrantPermissions(origin, permissions) { + const webPermissionToProtocol = /* @__PURE__ */ new Map([ + ["geolocation", "geolocation"], + ["midi", "midi"], + ["notifications", "notifications"], + ["camera", "videoCapture"], + ["microphone", "audioCapture"], + ["background-sync", "backgroundSync"], + ["ambient-light-sensor", "sensors"], + ["accelerometer", "sensors"], + ["gyroscope", "sensors"], + ["magnetometer", "sensors"], + ["clipboard-read", "clipboardReadWrite"], + ["clipboard-write", "clipboardSanitizedWrite"], + ["payment-handler", "paymentHandler"], + // chrome-specific permissions we have. + ["midi-sysex", "midiSysex"], + ["storage-access", "storageAccess"] + ]); + const filtered = permissions.map((permission) => { + const protocolPermission = webPermissionToProtocol.get(permission); + if (!protocolPermission) + throw new Error("Unknown permission: " + permission); + return protocolPermission; + }); + await this._browser._session.send("Browser.grantPermissions", { origin: origin === "*" ? void 0 : origin, browserContextId: this._browserContextId, permissions: filtered }); + } + async doClearPermissions() { + await this._browser._session.send("Browser.resetPermissions", { browserContextId: this._browserContextId }); + } + async setGeolocation(geolocation) { + verifyGeolocation(geolocation); + this._options.geolocation = geolocation; + for (const page of this.pages()) + await page.delegate.updateGeolocation(); + } + async setExtraHTTPHeaders(headers) { + this._options.extraHTTPHeaders = headers; + for (const page of this.pages()) + await page.delegate.updateExtraHTTPHeaders(); + for (const sw of this.serviceWorkers()) + await sw.updateExtraHTTPHeaders(); + } + async setUserAgent(userAgent) { + this._options.userAgent = userAgent; + for (const page of this.pages()) + await page.delegate.updateUserAgent(); + } + async setOffline(offline) { + this._options.offline = offline; + for (const page of this.pages()) + await page.delegate.updateOffline(); + for (const sw of this.serviceWorkers()) + await sw.updateOffline(); + } + async doSetHTTPCredentials(httpCredentials) { + this._options.httpCredentials = httpCredentials; + for (const page of this.pages()) + await page.delegate.updateHttpCredentials(); + for (const sw of this.serviceWorkers()) + await sw.updateHttpCredentials(); + } + async doAddInitScript(initScript) { + for (const page of this.pages()) + await page.delegate.addInitScript(initScript); + } + async doRemoveInitScripts(initScripts) { + for (const page of this.pages()) + await page.delegate.removeInitScripts(initScripts); + } + async doUpdateRequestInterception() { + for (const page of this.pages()) + await page.delegate.updateRequestInterception(); + for (const sw of this.serviceWorkers()) + await sw.updateRequestInterception(); + } + async doExposePlaywrightBinding() { + for (const page of this._crPages()) + await page.exposePlaywrightBinding(); + } + async doClose(reason) { + await this.dialogManager.closeBeforeUnloadDialogs(); + if (!this._browserContextId) { + await this.stopVideoRecording(); + await this._browser.close({ reason }); + return; + } + await this._browser._session.send("Target.disposeBrowserContext", { browserContextId: this._browserContextId }); + this._browser._contexts.delete(this._browserContextId); + for (const [targetId, serviceWorker] of this._browser._serviceWorkers) { + if (serviceWorker.browserContext !== this) + continue; + serviceWorker.didClose(); + this._browser._serviceWorkers.delete(targetId); + } + } + async stopVideoRecording() { + await Promise.all(this._crPages().map((crPage) => crPage._mainFrameSession._stopVideoRecording())); + } + onClosePersistent() { + for (const [targetId, backgroundPage] of this._browser._backgroundPages.entries()) { + if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined()) { + backgroundPage.didClose(); + this._browser._backgroundPages.delete(targetId); + } + } + } + async clearCache() { + for (const page of this._crPages()) + await page._networkManager.clearCache(); + } + async cancelDownload(guid) { + await this._browser._session.send("Browser.cancelDownload", { + guid, + browserContextId: this._browserContextId + }); + } + backgroundPages() { + const result = []; + for (const backgroundPage of this._browser._backgroundPages.values()) { + if (backgroundPage._browserContext === this && backgroundPage._page.initializedOrUndefined()) + result.push(backgroundPage._page); + } + return result; + } + serviceWorkers() { + return Array.from(this._browser._serviceWorkers.values()).filter((serviceWorker) => serviceWorker.browserContext === this); + } + async newCDPSession(page) { + let targetId = null; + if (page instanceof Page$1) { + targetId = page.delegate._targetId; + } else if (page instanceof Frame$1) { + const session = page._page.delegate._sessions.get(page._id); + if (!session) + throw new Error(`This frame does not have a separate CDP session, it is a part of the parent frame's session`); + targetId = session._targetId; + } else { + throw new Error("page: expected Page or Frame"); + } + const rootSession = await this._browser._clientRootSession(); + return rootSession.attachToTarget(targetId); + } +}; +_CRBrowserContext.CREvents = { + BackgroundPage: "backgroundpage", + ServiceWorker: "serviceworker" +}; +let CRBrowserContext = _CRBrowserContext; +class WritableStreamDispatcher extends Dispatcher { + constructor(scope, streamOrDirectory, lastModifiedMs) { + super(scope, { guid: "writableStream@" + createGuid(), streamOrDirectory }, "WritableStream", {}); + this._type_WritableStream = true; + this._lastModifiedMs = lastModifiedMs; + } + async write(params) { + if (typeof this._object.streamOrDirectory === "string") + throw new Error("Cannot write to a directory"); + const stream2 = this._object.streamOrDirectory; + await new Promise((fulfill, reject) => { + stream2.write(params.binary, (error2) => { + if (error2) + reject(error2); + else + fulfill(); + }); + }); + } + async close() { + if (typeof this._object.streamOrDirectory === "string") + throw new Error("Cannot close a directory"); + const stream2 = this._object.streamOrDirectory; + await new Promise((fulfill) => stream2.end(fulfill)); + if (this._lastModifiedMs) + await fs.promises.utimes(this.path(), new Date(this._lastModifiedMs), new Date(this._lastModifiedMs)); + } + path() { + if (typeof this._object.streamOrDirectory === "string") + return this._object.streamOrDirectory; + return this._object.streamOrDirectory.path; + } +} +class BrowserContextDispatcher extends Dispatcher { + constructor(parentScope, context) { + const requestContext = APIRequestContextDispatcher.from(parentScope, context.fetchRequest); + const tracing = TracingDispatcher.from(parentScope, context.tracing); + super(parentScope, context, "BrowserContext", { + isChromium: context._browser.options.isChromium, + requestContext, + tracing, + options: context._options + }); + this._type_EventTarget = true; + this._type_BrowserContext = true; + this._subscriptions = /* @__PURE__ */ new Set(); + this._webSocketInterceptionPatterns = []; + this._bindings = []; + this._initScritps = []; + this._clockPaused = false; + this._interceptionUrlMatchers = []; + this.adopt(requestContext); + this.adopt(tracing); + this._requestInterceptor = (route, request2) => { + const matchesSome = this._interceptionUrlMatchers.some((urlMatch) => urlMatches(this._context._options.baseURL, request2.url(), urlMatch)); + const routeDispatcher = this.connection.existingDispatcher(route); + if (!matchesSome || routeDispatcher) { + route.continue({ isFallback: true }).catch(() => { + }); + return; + } + this._dispatchEvent("route", { route: new RouteDispatcher(RequestDispatcher.from(this, request2), route) }); + }; + this._context = context; + const onVideo = (artifact) => { + const artifactDispatcher = ArtifactDispatcher.from(parentScope, artifact); + this._dispatchEvent("video", { artifact: artifactDispatcher }); + }; + this.addObjectListener(BrowserContext$1.Events.VideoStarted, onVideo); + for (const video of context._browser._idToVideo.values()) { + if (video.context === context) + onVideo(video.artifact); + } + for (const page of context.pages()) + this._dispatchEvent("page", { page: PageDispatcher.from(this, page) }); + this.addObjectListener(BrowserContext$1.Events.Page, (page) => { + this._dispatchEvent("page", { page: PageDispatcher.from(this, page) }); + }); + this.addObjectListener(BrowserContext$1.Events.Close, () => { + this._dispatchEvent("close"); + this._dispose(); + }); + this.addObjectListener(BrowserContext$1.Events.PageError, (error2, page) => { + this._dispatchEvent("pageError", { error: serializeError$1(error2), page: PageDispatcher.from(this, page) }); + }); + this.addObjectListener(BrowserContext$1.Events.Console, (message) => { + const page = message.page(); + if (this._shouldDispatchEvent(page, "console")) { + const pageDispatcher = PageDispatcher.from(this, page); + this._dispatchEvent("console", { + page: pageDispatcher, + type: message.type(), + text: message.text(), + args: message.args().map((a) => { + const elementHandle = a.asElement(); + if (elementHandle) + return ElementHandleDispatcher.from(FrameDispatcher.from(this, elementHandle._frame), elementHandle); + return JSHandleDispatcher.fromJSHandle(pageDispatcher, a); + }), + location: message.location() + }); + } + }); + this._dialogHandler = (dialog) => { + if (!this._shouldDispatchEvent(dialog.page(), "dialog")) + return false; + this._dispatchEvent("dialog", { dialog: new DialogDispatcher(this, dialog) }); + return true; + }; + context.dialogManager.addDialogHandler(this._dialogHandler); + if (context._browser.options.name === "chromium") { + for (const page of context.backgroundPages()) + this._dispatchEvent("backgroundPage", { page: PageDispatcher.from(this, page) }); + this.addObjectListener(CRBrowserContext.CREvents.BackgroundPage, (page) => this._dispatchEvent("backgroundPage", { page: PageDispatcher.from(this, page) })); + for (const serviceWorker of context.serviceWorkers()) + this._dispatchEvent("serviceWorker", { worker: new WorkerDispatcher(this, serviceWorker) }); + this.addObjectListener(CRBrowserContext.CREvents.ServiceWorker, (serviceWorker) => this._dispatchEvent("serviceWorker", { worker: new WorkerDispatcher(this, serviceWorker) })); + } + this.addObjectListener(BrowserContext$1.Events.Request, (request2) => { + var _a2; + const redirectFromDispatcher = request2.redirectedFrom() && this.connection.existingDispatcher(request2.redirectedFrom()); + if (!redirectFromDispatcher && !this._shouldDispatchNetworkEvent(request2, "request") && !request2.isNavigationRequest()) + return; + const requestDispatcher = RequestDispatcher.from(this, request2); + this._dispatchEvent("request", { + request: requestDispatcher, + page: PageDispatcher.fromNullable(this, (_a2 = request2.frame()) == null ? void 0 : _a2._page.initializedOrUndefined()) + }); + }); + this.addObjectListener(BrowserContext$1.Events.Response, (response2) => { + var _a2; + const requestDispatcher = this.connection.existingDispatcher(response2.request()); + if (!requestDispatcher && !this._shouldDispatchNetworkEvent(response2.request(), "response")) + return; + this._dispatchEvent("response", { + response: ResponseDispatcher.from(this, response2), + page: PageDispatcher.fromNullable(this, (_a2 = response2.frame()) == null ? void 0 : _a2._page.initializedOrUndefined()) + }); + }); + this.addObjectListener(BrowserContext$1.Events.RequestFailed, (request2) => { + var _a2; + const requestDispatcher = this.connection.existingDispatcher(request2); + if (!requestDispatcher && !this._shouldDispatchNetworkEvent(request2, "requestFailed")) + return; + this._dispatchEvent("requestFailed", { + request: RequestDispatcher.from(this, request2), + failureText: request2._failureText || void 0, + responseEndTiming: request2._responseEndTiming, + page: PageDispatcher.fromNullable(this, (_a2 = request2.frame()) == null ? void 0 : _a2._page.initializedOrUndefined()) + }); + }); + this.addObjectListener(BrowserContext$1.Events.RequestFinished, ({ request: request2, response: response2 }) => { + var _a2; + const requestDispatcher = this.connection.existingDispatcher(request2); + if (!requestDispatcher && !this._shouldDispatchNetworkEvent(request2, "requestFinished")) + return; + this._dispatchEvent("requestFinished", { + request: RequestDispatcher.from(this, request2), + response: ResponseDispatcher.fromNullable(this, response2), + responseEndTiming: request2._responseEndTiming, + page: PageDispatcher.fromNullable(this, (_a2 = request2.frame()) == null ? void 0 : _a2._page.initializedOrUndefined()) + }); + }); + } + static from(parentScope, context) { + const result = parentScope.connection.existingDispatcher(context); + return result || new BrowserContextDispatcher(parentScope, context); + } + _shouldDispatchNetworkEvent(request2, event) { + var _a2, _b2; + return this._shouldDispatchEvent((_b2 = (_a2 = request2.frame()) == null ? void 0 : _a2._page) == null ? void 0 : _b2.initializedOrUndefined(), event); + } + _shouldDispatchEvent(page, event) { + if (this._subscriptions.has(event)) + return true; + const pageDispatcher = page ? this.connection.existingDispatcher(page) : void 0; + if (pageDispatcher == null ? void 0 : pageDispatcher._subscriptions.has(event)) + return true; + return false; + } + async createTempFiles(params) { + const dir = this._context._browser.options.artifactsDir; + const tmpDir = path.join(dir, "upload-" + createGuid()); + const tempDirWithRootName = params.rootDirName ? path.join(tmpDir, path.basename(params.rootDirName)) : tmpDir; + await fs.promises.mkdir(tempDirWithRootName, { recursive: true }); + this._context._tempDirs.push(tmpDir); + return { + rootDir: params.rootDirName ? new WritableStreamDispatcher(this, tempDirWithRootName) : void 0, + writableStreams: await Promise.all(params.items.map(async (item) => { + await fs.promises.mkdir(path.dirname(path.join(tempDirWithRootName, item.name)), { recursive: true }); + const file = fs.createWriteStream(path.join(tempDirWithRootName, item.name)); + return new WritableStreamDispatcher(this, file, item.lastModifiedMs); + })) + }; + } + async exposeBinding(params) { + const binding2 = await this._context.exposeBinding(params.name, !!params.needsHandle, (source2, ...args) => { + if (this._disposed) + return; + const pageDispatcher = PageDispatcher.from(this, source2.page); + const binding22 = new BindingCallDispatcher(pageDispatcher, params.name, !!params.needsHandle, source2, args); + this._dispatchEvent("bindingCall", { binding: binding22 }); + return binding22.promise(); + }); + this._bindings.push(binding2); + } + async newPage(params, metadata) { + return { page: PageDispatcher.from(this, await this._context.newPage(metadata)) }; + } + async cookies(params) { + return { cookies: await this._context.cookies(params.urls) }; + } + async addCookies(params) { + await this._context.addCookies(params.cookies); + } + async clearCookies(params) { + const nameRe = params.nameRegexSource !== void 0 && params.nameRegexFlags !== void 0 ? new RegExp(params.nameRegexSource, params.nameRegexFlags) : void 0; + const domainRe = params.domainRegexSource !== void 0 && params.domainRegexFlags !== void 0 ? new RegExp(params.domainRegexSource, params.domainRegexFlags) : void 0; + const pathRe = params.pathRegexSource !== void 0 && params.pathRegexFlags !== void 0 ? new RegExp(params.pathRegexSource, params.pathRegexFlags) : void 0; + await this._context.clearCookies({ + name: nameRe || params.name, + domain: domainRe || params.domain, + path: pathRe || params.path + }); + } + async grantPermissions(params) { + await this._context.grantPermissions(params.permissions, params.origin); + } + async clearPermissions() { + await this._context.clearPermissions(); + } + async setGeolocation(params) { + await this._context.setGeolocation(params.geolocation); + } + async setExtraHTTPHeaders(params) { + await this._context.setExtraHTTPHeaders(params.headers); + } + async setOffline(params) { + await this._context.setOffline(params.offline); + } + async setHTTPCredentials(params) { + await this._context.setHTTPCredentials(params.httpCredentials); + } + async addInitScript(params) { + this._initScritps.push(await this._context.addInitScript(params.source)); + } + async setNetworkInterceptionPatterns(params) { + const hadMatchers = this._interceptionUrlMatchers.length > 0; + if (!params.patterns.length) { + if (hadMatchers) + await this._context.removeRequestInterceptor(this._requestInterceptor); + this._interceptionUrlMatchers = []; + } else { + this._interceptionUrlMatchers = params.patterns.map((pattern) => pattern.regexSource ? new RegExp(pattern.regexSource, pattern.regexFlags) : pattern.glob); + if (!hadMatchers) + await this._context.addRequestInterceptor(this._requestInterceptor); + } + } + async setWebSocketInterceptionPatterns(params, metadata) { + this._webSocketInterceptionPatterns = params.patterns; + if (params.patterns.length) + await WebSocketRouteDispatcher.installIfNeeded(this.connection, this._context); + } + async storageState(params, metadata) { + return await this._context.storageState(params.indexedDB); + } + async close(params, metadata) { + metadata.potentiallyClosesScope = true; + await this._context.close(params); + } + async enableRecorder(params) { + await Recorder.show(this._context, RecorderApp.factory(this._context), params); + } + async pause(params, metadata) { + } + async newCDPSession(params) { + if (!this._object._browser.options.isChromium) + throw new Error(`CDP session is only available in Chromium`); + if (!params.page && !params.frame || params.page && params.frame) + throw new Error(`CDP session must be initiated with either Page or Frame, not none or both`); + const crBrowserContext = this._object; + return { session: new CDPSessionDispatcher(this, await crBrowserContext.newCDPSession((params.page ? params.page : params.frame)._object)) }; + } + async harStart(params) { + const harId = await this._context._harStart(params.page ? params.page._object : null, params.options); + return { harId }; + } + async harExport(params) { + const artifact = await this._context._harExport(params.harId); + if (!artifact) + throw new Error("No HAR artifact. Ensure record.harPath is set."); + return { artifact: ArtifactDispatcher.from(this, artifact) }; + } + async clockFastForward(params, metadata) { + await this._context.clock.fastForward(params.ticksString ?? params.ticksNumber ?? 0); + } + async clockInstall(params, metadata) { + await this._context.clock.install(params.timeString ?? params.timeNumber ?? void 0); + } + async clockPauseAt(params, metadata) { + await this._context.clock.pauseAt(params.timeString ?? params.timeNumber ?? 0); + this._clockPaused = true; + } + async clockResume(params, metadata) { + await this._context.clock.resume(); + this._clockPaused = false; + } + async clockRunFor(params, metadata) { + await this._context.clock.runFor(params.ticksString ?? params.ticksNumber ?? 0); + } + async clockSetFixedTime(params, metadata) { + await this._context.clock.setFixedTime(params.timeString ?? params.timeNumber ?? 0); + } + async clockSetSystemTime(params, metadata) { + await this._context.clock.setSystemTime(params.timeString ?? params.timeNumber ?? 0); + } + async updateSubscription(params) { + if (params.enabled) + this._subscriptions.add(params.event); + else + this._subscriptions.delete(params.event); + } + async registerSelectorEngine(params) { + this._object.selectors().register(params.selectorEngine); + } + async setTestIdAttributeName(params) { + this._object.selectors().setTestIdAttributeName(params.testIdAttributeName); + } + _onDispose() { + if (this._context.isClosingOrClosed()) + return; + this._context.dialogManager.removeDialogHandler(this._dialogHandler); + this._interceptionUrlMatchers = []; + this._context.removeRequestInterceptor(this._requestInterceptor).catch(() => { + }); + this._context.removeExposedBindings(this._bindings).catch(() => { + }); + this._bindings = []; + this._context.removeInitScripts(this._initScritps).catch(() => { + }); + this._initScritps = []; + if (this._clockPaused) + this._context.clock.resume().catch(() => { + }); + this._clockPaused = false; + } +} +let PipeTransport$1 = class PipeTransport { + constructor(pipeWrite, pipeRead, closeable, endian = "le") { + this._data = Buffer.from([]); + this._waitForNextTask = makeWaitForNextTask(); + this._closed = false; + this._bytesLeft = 0; + this._pipeWrite = pipeWrite; + this._endian = endian; + this._closeableStream = closeable; + pipeRead.on("data", (buffer2) => this._dispatch(buffer2)); + pipeRead.on("close", () => { + this._closed = true; + if (this.onclose) + this.onclose(); + }); + this.onmessage = void 0; + this.onclose = void 0; + } + send(message) { + if (this._closed) + throw new Error("Pipe has been closed"); + const data2 = Buffer.from(message, "utf-8"); + const dataLength = Buffer.alloc(4); + if (this._endian === "be") + dataLength.writeUInt32BE(data2.length, 0); + else + dataLength.writeUInt32LE(data2.length, 0); + this._pipeWrite.write(dataLength); + this._pipeWrite.write(data2); + } + close() { + this._closeableStream.close(); + } + _dispatch(buffer2) { + this._data = Buffer.concat([this._data, buffer2]); + while (true) { + if (!this._bytesLeft && this._data.length < 4) { + break; + } + if (!this._bytesLeft) { + this._bytesLeft = this._endian === "be" ? this._data.readUInt32BE(0) : this._data.readUInt32LE(0); + this._data = this._data.slice(4); + } + if (!this._bytesLeft || this._data.length < this._bytesLeft) { + break; + } + const message = this._data.slice(0, this._bytesLeft); + this._data = this._data.slice(this._bytesLeft); + this._bytesLeft = 0; + this._waitForNextTask(() => { + if (this.onmessage) + this.onmessage(message.toString("utf-8")); + }); + } + } +}; +const disabledFeatures = (assistantMode) => [ + // See https://github.com/microsoft/playwright/pull/10380 + "AcceptCHFrame", + // See https://github.com/microsoft/playwright/pull/10679 + "AutoExpandDetailsElement", + // See https://github.com/microsoft/playwright/issues/14047 + "AvoidUnnecessaryBeforeUnloadCheckSync", + // See https://github.com/microsoft/playwright/pull/12992 + "CertificateTransparencyComponentUpdater", + "DestroyProfileOnBrowserClose", + // See https://github.com/microsoft/playwright/pull/13854 + "DialMediaRouteProvider", + // Chromium is disabling manifest version 2. Allow testing it as long as Chromium can actually run it. + // Disabled in https://chromium-review.googlesource.com/c/chromium/src/+/6265903. + "ExtensionManifestV2Disabled", + "GlobalMediaControls", + // See https://github.com/microsoft/playwright/pull/27605 + "HttpsUpgrades", + "ImprovedCookieControls", + "LazyFrameLoading", + // Hides the Lens feature in the URL address bar. Its not working in unofficial builds. + "LensOverlay", + // See https://github.com/microsoft/playwright/pull/8162 + "MediaRouter", + // See https://github.com/microsoft/playwright/issues/28023 + "PaintHolding", + // See https://github.com/microsoft/playwright/issues/32230 + "ThirdPartyStoragePartitioning", + // See https://github.com/microsoft/playwright/issues/16126 + "Translate", + assistantMode ? "AutomationControlled" : "" +].filter(Boolean); +const chromiumSwitches = (assistantMode, channel) => [ + "--disable-field-trial-config", + // https://source.chromium.org/chromium/chromium/src/+/main:testing/variations/README.md + "--disable-background-networking", + "--disable-background-timer-throttling", + "--disable-backgrounding-occluded-windows", + "--disable-back-forward-cache", + // Avoids surprises like main request not being intercepted during page.goBack(). + "--disable-breakpad", + "--disable-client-side-phishing-detection", + "--disable-component-extensions-with-background-pages", + "--disable-component-update", + // Avoids unneeded network activity after startup. + "--no-default-browser-check", + "--disable-default-apps", + "--disable-dev-shm-usage", + "--disable-extensions", + "--disable-features=" + disabledFeatures(assistantMode).join(","), + channel === "chromium-tip-of-tree" ? "--enable-features=CDPScreenshotNewSurface" : "", + "--allow-pre-commit-input", + "--disable-hang-monitor", + "--disable-ipc-flooding-protection", + "--disable-popup-blocking", + "--disable-prompt-on-repost", + "--disable-renderer-backgrounding", + "--force-color-profile=srgb", + "--metrics-recording-only", + "--no-first-run", + "--password-store=basic", + "--use-mock-keychain", + // See https://chromium-review.googlesource.com/c/chromium/src/+/2436773 + "--no-service-autorun", + "--export-tagged-pdf", + // https://chromium-review.googlesource.com/c/chromium/src/+/4853540 + "--disable-search-engine-choice-screen", + // https://issues.chromium.org/41491762 + "--unsafely-disable-devtools-self-xss-warnings", + assistantMode ? "" : "--enable-automation" +].filter(Boolean); +const ARTIFACTS_FOLDER$2 = path.join(os.tmpdir(), "playwright-artifacts-"); +let Android$1 = class Android extends SdkObject { + constructor(parent, backend) { + super(parent, "android"); + this._devices = /* @__PURE__ */ new Map(); + this._backend = backend; + } + async devices(options2) { + const devices = (await this._backend.devices(options2)).filter((d) => d.status === "device"); + const newSerials = /* @__PURE__ */ new Set(); + for (const d of devices) { + newSerials.add(d.serial); + if (this._devices.has(d.serial)) + continue; + const device = await AndroidDevice$1.create(this, d, options2); + this._devices.set(d.serial, device); + } + for (const d of this._devices.keys()) { + if (!newSerials.has(d)) + this._devices.delete(d); + } + return [...this._devices.values()]; + } + _deviceClosed(device) { + this._devices.delete(device.serial); + } +}; +let AndroidDevice$1 = (_i = class extends SdkObject { + constructor(android, backend, model, options2) { + super(android, "android-device"); + this._lastId = 0; + this._callbacks = /* @__PURE__ */ new Map(); + this._webViews = /* @__PURE__ */ new Map(); + this._browserConnections = /* @__PURE__ */ new Set(); + this._isClosed = false; + this._android = android; + this._backend = backend; + this.model = model; + this.serial = backend.serial; + this._options = options2; + } + static async create(android, backend, options2) { + await backend.init(); + const model = await backend.runCommand("shell:getprop ro.product.model"); + const device = new _i(android, backend, model.toString().trim(), options2); + await device._init(); + return device; + } + async _init() { + await this._refreshWebViews(); + const poll = () => { + this._pollingWebViews = setTimeout(() => this._refreshWebViews().then(poll).catch(() => { + this.close().catch(() => { + }); + }), 500); + }; + poll(); + } + async shell(command2) { + const result = await this._backend.runCommand(`shell:${command2}`); + await this._refreshWebViews(); + return result; + } + async open(command2) { + return await this._backend.open(`${command2}`); + } + async screenshot() { + return await this._backend.runCommand(`shell:screencap -p`); + } + async _driver() { + if (this._isClosed) + return; + if (!this._driverPromise) + this._driverPromise = this._installDriver(); + return this._driverPromise; + } + async _installDriver() { + debug$2("pw:android")("Stopping the old driver"); + await this.shell(`am force-stop com.microsoft.playwright.androiddriver`); + if (!this._options.omitDriverInstall) { + debug$2("pw:android")("Uninstalling the old driver"); + await this.shell(`cmd package uninstall com.microsoft.playwright.androiddriver`); + await this.shell(`cmd package uninstall com.microsoft.playwright.androiddriver.test`); + debug$2("pw:android")("Installing the new driver"); + const executable = registry.findExecutable("android"); + const packageManagerCommand = getPackageManagerExecCommand(); + for (const file of ["android-driver.apk", "android-driver-target.apk"]) { + const fullName = path.join(executable.directory, file); + if (!fs.existsSync(fullName)) + throw new Error(`Please install Android driver apk using '${packageManagerCommand} playwright install android'`); + await this.installApk(await fs.promises.readFile(fullName)); + } + } else { + debug$2("pw:android")("Skipping the driver installation"); + } + debug$2("pw:android")("Starting the new driver"); + this.shell("am instrument -w com.microsoft.playwright.androiddriver.test/androidx.test.runner.AndroidJUnitRunner").catch((e) => debug$2("pw:android")(e)); + const socket = await this._waitForLocalAbstract("playwright_android_driver_socket"); + const transport = new PipeTransport$1(socket, socket, socket, "be"); + transport.onmessage = (message) => { + const response2 = JSON.parse(message); + const { id, result, error: error2 } = response2; + const callback = this._callbacks.get(id); + if (!callback) + return; + if (error2) + callback.reject(new Error(error2)); + else + callback.fulfill(result); + this._callbacks.delete(id); + }; + return transport; + } + async _waitForLocalAbstract(socketName) { + let socket; + debug$2("pw:android")(`Polling the socket localabstract:${socketName}`); + while (!socket) { + try { + socket = await this._backend.open(`localabstract:${socketName}`); + } catch (e) { + await new Promise((f) => setTimeout(f, 250)); + } + } + debug$2("pw:android")(`Connected to localabstract:${socketName}`); + return socket; + } + async send(method, params = {}) { + params = { + ...params, + // Patch the timeout in, just in case it's missing in one of the commands. + timeout: params.timeout || 0 + }; + if (params.androidSelector) { + params.selector = params.androidSelector; + delete params.androidSelector; + } + const driver = await this._driver(); + if (!driver) + throw new Error("Device is closed"); + const id = ++this._lastId; + const result = new Promise((fulfill, reject) => this._callbacks.set(id, { fulfill, reject })); + driver.send(JSON.stringify({ id, method, params })); + return result; + } + async close() { + if (this._isClosed) + return; + this._isClosed = true; + if (this._pollingWebViews) + clearTimeout(this._pollingWebViews); + for (const connection of this._browserConnections) + await connection.close(); + if (this._driverPromise) { + const driver = await this._driver(); + driver == null ? void 0 : driver.close(); + } + await this._backend.close(); + this._android._deviceClosed(this); + this.emit(_i.Events.Close); + } + async launchBrowser(pkg = "com.android.chrome", options2) { + debug$2("pw:android")("Force-stopping", pkg); + await this._backend.runCommand(`shell:am force-stop ${pkg}`); + const socketName = isUnderTest() ? "webview_devtools_remote_playwright_test" : "playwright_" + createGuid() + "_devtools_remote"; + const commandLine = this._defaultArgs(options2, socketName).join(" "); + debug$2("pw:android")("Starting", pkg, commandLine); + await this._backend.runCommand(`shell:echo "${Buffer.from(commandLine).toString("base64")}" | base64 -d > /data/local/tmp/chrome-command-line`); + await this._backend.runCommand(`shell:am start -a android.intent.action.VIEW -d about:blank ${pkg}`); + const browserContext = await this._connectToBrowser(socketName, options2); + await this._backend.runCommand(`shell:rm /data/local/tmp/chrome-command-line`); + return browserContext; + } + _defaultArgs(options2, socketName) { + const chromeArguments = [ + "_", + "--disable-fre", + "--no-default-browser-check", + `--remote-debugging-socket-name=${socketName}`, + ...chromiumSwitches(), + ...this._innerDefaultArgs(options2) + ]; + return chromeArguments; + } + _innerDefaultArgs(options2) { + const { args = [], proxy } = options2; + const chromeArguments = []; + if (proxy) { + chromeArguments.push(`--proxy-server=${proxy.server}`); + const proxyBypassRules = []; + if (proxy.bypass) + proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t)); + if (!define_process_env_default.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>")) + proxyBypassRules.push("<-loopback>"); + if (proxyBypassRules.length > 0) + chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`); + } + chromeArguments.push(...args); + return chromeArguments; + } + async connectToWebView(socketName) { + const webView = this._webViews.get(socketName); + if (!webView) + throw new Error("WebView has been closed"); + return await this._connectToBrowser(socketName); + } + async _connectToBrowser(socketName, options2 = {}) { + const socket = await this._waitForLocalAbstract(socketName); + const androidBrowser = new AndroidBrowser(this, socket); + await androidBrowser._init(); + this._browserConnections.add(androidBrowser); + const artifactsDir = await fs.promises.mkdtemp(ARTIFACTS_FOLDER$2); + const cleanupArtifactsDir = async () => { + const errors2 = (await removeFolders([artifactsDir])).filter(Boolean); + for (let i = 0; i < (errors2 || []).length; ++i) + debug$2("pw:android")(`exception while removing ${artifactsDir}: ${errors2[i]}`); + }; + gracefullyCloseSet.add(cleanupArtifactsDir); + socket.on("close", async () => { + gracefullyCloseSet.delete(cleanupArtifactsDir); + cleanupArtifactsDir().catch((e) => debug$2("pw:android")(`could not cleanup artifacts dir: ${e}`)); + }); + const browserOptions = { + name: "clank", + isChromium: true, + slowMo: 0, + persistent: { ...options2, noDefaultViewport: true }, + artifactsDir, + downloadsPath: artifactsDir, + tracesDir: artifactsDir, + browserProcess: new ClankBrowserProcess(androidBrowser), + proxy: options2.proxy, + protocolLogger: helper.debugProtocolLogger(), + browserLogsCollector: new RecentLogsCollector(), + originalLaunchOptions: { timeout: 0 } + }; + validateBrowserContextOptions(options2, browserOptions); + const browser2 = await CRBrowser.connect(this.attribution.playwright, androidBrowser, browserOptions); + const controller = new ProgressController(serverSideCallMetadata(), this); + const defaultContext = browser2._defaultContext; + await controller.run(async (progress2) => { + await defaultContext._loadDefaultContextAsIs(progress2); + }); + return defaultContext; + } + webViews() { + return [...this._webViews.values()]; + } + async installApk(content, options2) { + const args = options2 && options2.args ? options2.args : ["-r", "-t", "-S"]; + debug$2("pw:android")("Opening install socket"); + const installSocket = await this._backend.open(`shell:cmd package install ${args.join(" ")} ${content.length}`); + debug$2("pw:android")("Writing driver bytes: " + content.length); + await installSocket.write(content); + const success = await new Promise((f) => installSocket.on("data", f)); + debug$2("pw:android")("Written driver bytes: " + success); + installSocket.close(); + } + async push(content, path2, mode = 420) { + const socket = await this._backend.open(`sync:`); + const sendHeader = async (command2, length) => { + const buffer2 = Buffer.alloc(command2.length + 4); + buffer2.write(command2, 0); + buffer2.writeUInt32LE(length, command2.length); + await socket.write(buffer2); + }; + const send = async (command2, data2) => { + await sendHeader(command2, data2.length); + await socket.write(data2); + }; + await send("SEND", Buffer.from(`${path2},${mode}`)); + const maxChunk = 65535; + for (let i = 0; i < content.length; i += maxChunk) + await send("DATA", content.slice(i, i + maxChunk)); + await sendHeader("DONE", Date.now() / 1e3 | 0); + const result = await new Promise((f) => socket.once("data", f)); + const code = result.slice(0, 4).toString(); + if (code !== "OKAY") + throw new Error("Could not push: " + code); + socket.close(); + } + async _refreshWebViews() { + const sockets = (await this._backend.runCommand(`shell:cat /proc/net/unix | grep webview_devtools_remote`)).toString().split("\n"); + if (this._isClosed) + return; + const socketNames = /* @__PURE__ */ new Set(); + for (const line of sockets) { + const matchSocketName = line.match(/[^@]+@(.*?webview_devtools_remote_?.*)/); + if (!matchSocketName) + continue; + const socketName = matchSocketName[1]; + socketNames.add(socketName); + if (this._webViews.has(socketName)) + continue; + const match = line.match(/[^@]+@.*?webview_devtools_remote_?(\d*)/); + let pid = -1; + if (match && match[1]) + pid = +match[1]; + const pkg = await this._extractPkg(pid); + if (this._isClosed) + return; + const webView = { pid, pkg, socketName }; + this._webViews.set(socketName, webView); + this.emit(_i.Events.WebViewAdded, webView); + } + for (const p of this._webViews.keys()) { + if (!socketNames.has(p)) { + this._webViews.delete(p); + this.emit(_i.Events.WebViewRemoved, p); + } + } + } + async _extractPkg(pid) { + let pkg = ""; + if (pid === -1) + return pkg; + const procs = (await this._backend.runCommand(`shell:ps -A | grep ${pid}`)).toString().split("\n"); + for (const proc of procs) { + const match = proc.match(/[^\s]+\s+(\d+).*$/); + if (!match) + continue; + pkg = proc.substring(proc.lastIndexOf(" ") + 1); + } + return pkg; + } +}, _i.Events = { + WebViewAdded: "webViewAdded", + WebViewRemoved: "webViewRemoved", + Close: "close" +}, _i); +class AndroidBrowser extends eventsExports.EventEmitter { + constructor(device, socket) { + super(); + this._waitForNextTask = makeWaitForNextTask(); + this.setMaxListeners(0); + this.device = device; + this._socket = socket; + this._socket.on("close", () => { + this._waitForNextTask(() => { + if (this.onclose) + this.onclose(); + }); + }); + this._receiver = new wsReceiver(); + this._receiver.on("message", (message) => { + this._waitForNextTask(() => { + if (this.onmessage) + this.onmessage(JSON.parse(message)); + }); + }); + } + async _init() { + await this._socket.write(Buffer.from(`GET /devtools/browser HTTP/1.1\r +Upgrade: WebSocket\r +Connection: Upgrade\r +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r +Sec-WebSocket-Version: 13\r +\r +`)); + await new Promise((f) => this._socket.once("data", f)); + this._socket.on("data", (data2) => this._receiver._write(data2, "binary", () => { + })); + } + async send(s) { + await this._socket.write(encodeWebFrame(JSON.stringify(s))); + } + async close() { + this._socket.close(); + } +} +function encodeWebFrame(data2) { + return wsSender.frame(Buffer.from(data2), { + opcode: 1, + mask: true, + fin: true, + readOnly: true + })[0]; +} +class ClankBrowserProcess { + constructor(browser2) { + this._browser = browser2; + } + async kill() { + } + async close() { + await this._browser.close(); + } +} +class AndroidDispatcher extends Dispatcher { + constructor(scope, android) { + super(scope, android, "Android", {}); + this._type_Android = true; + } + async devices(params) { + const devices = await this._object.devices(params); + return { + devices: devices.map((d) => AndroidDeviceDispatcher.from(this, d)) + }; + } +} +class AndroidDeviceDispatcher extends Dispatcher { + constructor(scope, device) { + super(scope, device, "AndroidDevice", { + model: device.model, + serial: device.serial + }); + this._type_EventTarget = true; + this._type_AndroidDevice = true; + for (const webView of device.webViews()) + this._dispatchEvent("webViewAdded", { webView }); + this.addObjectListener(AndroidDevice$1.Events.WebViewAdded, (webView) => this._dispatchEvent("webViewAdded", { webView })); + this.addObjectListener(AndroidDevice$1.Events.WebViewRemoved, (socketName) => this._dispatchEvent("webViewRemoved", { socketName })); + this.addObjectListener(AndroidDevice$1.Events.Close, (socketName) => this._dispatchEvent("close")); + } + static from(scope, device) { + const result = scope.connection.existingDispatcher(device); + return result || new AndroidDeviceDispatcher(scope, device); + } + async wait(params) { + await this._object.send("wait", params); + } + async fill(params) { + await this._object.send("click", { selector: params.androidSelector }); + await this._object.send("fill", params); + } + async tap(params) { + await this._object.send("click", params); + } + async drag(params) { + await this._object.send("drag", params); + } + async fling(params) { + await this._object.send("fling", params); + } + async longTap(params) { + await this._object.send("longClick", params); + } + async pinchClose(params) { + await this._object.send("pinchClose", params); + } + async pinchOpen(params) { + await this._object.send("pinchOpen", params); + } + async scroll(params) { + await this._object.send("scroll", params); + } + async swipe(params) { + await this._object.send("swipe", params); + } + async info(params) { + const info = await this._object.send("info", params); + fixupAndroidElementInfo(info); + return { info }; + } + async inputType(params) { + const text = params.text; + const keyCodes = []; + for (let i = 0; i < text.length; ++i) { + const code = keyMap.get(text[i].toUpperCase()); + if (code === void 0) + throw new Error("No mapping for " + text[i] + " found"); + keyCodes.push(code); + } + await Promise.all(keyCodes.map((keyCode) => this._object.send("inputPress", { keyCode }))); + } + async inputPress(params) { + if (!keyMap.has(params.key)) + throw new Error("Unknown key: " + params.key); + await this._object.send("inputPress", { keyCode: keyMap.get(params.key) }); + } + async inputTap(params) { + await this._object.send("inputClick", params); + } + async inputSwipe(params) { + await this._object.send("inputSwipe", params); + } + async inputDrag(params) { + await this._object.send("inputDrag", params); + } + async screenshot(params) { + return { binary: await this._object.screenshot() }; + } + async shell(params) { + return { result: await this._object.shell(params.command) }; + } + async open(params, metadata) { + const socket = await this._object.open(params.command); + return { socket: new AndroidSocketDispatcher(this, socket) }; + } + async installApk(params) { + await this._object.installApk(params.file, { args: params.args }); + } + async push(params) { + await this._object.push(params.file, params.path, params.mode); + } + async launchBrowser(params) { + const context = await this._object.launchBrowser(params.pkg, params); + return { context: BrowserContextDispatcher.from(this, context) }; + } + async close(params) { + await this._object.close(); + } + async connectToWebView(params) { + return { context: BrowserContextDispatcher.from(this, await this._object.connectToWebView(params.socketName)) }; + } +} +class AndroidSocketDispatcher extends Dispatcher { + constructor(scope, socket) { + super(scope, socket, "AndroidSocket", {}); + this._type_AndroidSocket = true; + this.addObjectListener("data", (data2) => this._dispatchEvent("data", { data: data2 })); + this.addObjectListener("close", () => { + this._dispatchEvent("close"); + this._dispose(); + }); + } + async write(params, metadata) { + await this._object.write(params.data); + } + async close(params, metadata) { + this._object.close(); + } +} +const keyMap = /* @__PURE__ */ new Map([ + ["Unknown", 0], + ["SoftLeft", 1], + ["SoftRight", 2], + ["Home", 3], + ["Back", 4], + ["Call", 5], + ["EndCall", 6], + ["0", 7], + ["1", 8], + ["2", 9], + ["3", 10], + ["4", 11], + ["5", 12], + ["6", 13], + ["7", 14], + ["8", 15], + ["9", 16], + ["Star", 17], + ["*", 17], + ["Pound", 18], + ["#", 18], + ["DialUp", 19], + ["DialDown", 20], + ["DialLeft", 21], + ["DialRight", 22], + ["DialCenter", 23], + ["VolumeUp", 24], + ["VolumeDown", 25], + ["Power", 26], + ["Camera", 27], + ["Clear", 28], + ["A", 29], + ["B", 30], + ["C", 31], + ["D", 32], + ["E", 33], + ["F", 34], + ["G", 35], + ["H", 36], + ["I", 37], + ["J", 38], + ["K", 39], + ["L", 40], + ["M", 41], + ["N", 42], + ["O", 43], + ["P", 44], + ["Q", 45], + ["R", 46], + ["S", 47], + ["T", 48], + ["U", 49], + ["V", 50], + ["W", 51], + ["X", 52], + ["Y", 53], + ["Z", 54], + ["Comma", 55], + [",", 55], + ["Period", 56], + [".", 56], + ["AltLeft", 57], + ["AltRight", 58], + ["ShiftLeft", 59], + ["ShiftRight", 60], + ["Tab", 61], + [" ", 61], + ["Space", 62], + [" ", 62], + ["Sym", 63], + ["Explorer", 64], + ["Envelop", 65], + ["Enter", 66], + ["Del", 67], + ["Grave", 68], + ["Minus", 69], + ["-", 69], + ["Equals", 70], + ["=", 70], + ["LeftBracket", 71], + ["(", 71], + ["RightBracket", 72], + [")", 72], + ["Backslash", 73], + ["\\", 73], + ["Semicolon", 74], + [";", 74], + ["Apostrophe", 75], + ["`", 75], + ["Slash", 76], + ["/", 76], + ["At", 77], + ["@", 77], + ["Num", 78], + ["HeadsetHook", 79], + ["Focus", 80], + ["Plus", 81], + ["Menu", 82], + ["Notification", 83], + ["Search", 84], + ["ChannelUp", 166], + ["ChannelDown", 167], + ["AppSwitch", 187], + ["Assist", 219], + ["Cut", 277], + ["Copy", 278], + ["Paste", 279] +]); +function fixupAndroidElementInfo(info) { + info.clazz = info.clazz || ""; + info.pkg = info.pkg || ""; + info.res = info.res || ""; + info.desc = info.desc || ""; + info.text = info.text || ""; + for (const child of info.children || []) + fixupAndroidElementInfo(child); +} +class BrowserDispatcher extends Dispatcher { + constructor(scope, browser2, options2 = {}) { + super(scope, browser2, "Browser", { version: browser2.version(), name: browser2.options.name }); + this._type_Browser = true; + this._isolatedContexts = /* @__PURE__ */ new Set(); + this._options = options2; + if (!options2.isolateContexts) { + this.addObjectListener(Browser$1.Events.Context, (context) => this._dispatchEvent("context", { context: BrowserContextDispatcher.from(this, context) })); + this.addObjectListener(Browser$1.Events.Disconnected, () => this._didClose()); + if (browser2._defaultContext) + this._dispatchEvent("context", { context: BrowserContextDispatcher.from(this, browser2._defaultContext) }); + for (const context of browser2.contexts()) + this._dispatchEvent("context", { context: BrowserContextDispatcher.from(this, context) }); + } + } + _didClose() { + this._dispatchEvent("close"); + this._dispose(); + } + async newContext(params, metadata) { + if (!this._options.isolateContexts) { + const context2 = await this._object.newContext(metadata, params); + const contextDispatcher2 = BrowserContextDispatcher.from(this, context2); + return { context: contextDispatcher2 }; + } + if (params.recordVideo) + params.recordVideo.dir = this._object.options.artifactsDir; + const context = await this._object.newContext(metadata, params); + this._isolatedContexts.add(context); + context.on(BrowserContext$1.Events.Close, () => this._isolatedContexts.delete(context)); + const contextDispatcher = BrowserContextDispatcher.from(this, context); + this._dispatchEvent("context", { context: contextDispatcher }); + return { context: contextDispatcher }; + } + async newContextForReuse(params, metadata) { + const { context, needsReset } = await this._object.newContextForReuse(params, metadata); + if (needsReset) { + const oldContextDispatcher = this.connection.existingDispatcher(context); + if (oldContextDispatcher) + oldContextDispatcher._dispose(); + await context.resetForReuse(metadata, params); + } + const contextDispatcher = BrowserContextDispatcher.from(this, context); + this._dispatchEvent("context", { context: contextDispatcher }); + return { context: contextDispatcher }; + } + async stopPendingOperations(params, metadata) { + await this._object.stopPendingOperations(params.reason); + } + async close(params, metadata) { + if (this._options.ignoreStopAndKill) + return; + metadata.potentiallyClosesScope = true; + await this._object.close(params); + } + async killForTests(_, metadata) { + if (this._options.ignoreStopAndKill) + return; + metadata.potentiallyClosesScope = true; + await this._object.killForTests(); + } + async defaultUserAgentForTest() { + return { userAgent: this._object.userAgent() }; + } + async newBrowserCDPSession() { + if (!this._object.options.isChromium) + throw new Error(`CDP session is only available in Chromium`); + const crBrowser = this._object; + return { session: new CDPSessionDispatcher(this, await crBrowser.newBrowserCDPSession()) }; + } + async startTracing(params) { + if (!this._object.options.isChromium) + throw new Error(`Tracing is only available in Chromium`); + const crBrowser = this._object; + await crBrowser.startTracing(params.page ? params.page._object : void 0, params); + } + async stopTracing() { + if (!this._object.options.isChromium) + throw new Error(`Tracing is only available in Chromium`); + const crBrowser = this._object; + return { artifact: ArtifactDispatcher.from(this, await crBrowser.stopTracing()) }; + } + async cleanupContexts() { + await Promise.all(Array.from(this._isolatedContexts).map((context) => context.close({ reason: "Global context cleanup (connection terminated)" }))); + } +} +class BrowserTypeDispatcher extends Dispatcher { + constructor(scope, browserType) { + super(scope, browserType, "BrowserType", { + executablePath: browserType.executablePath(), + name: browserType.name() + }); + this._type_BrowserType = true; + } + async launch(params, metadata) { + const browser2 = await this._object.launch(metadata, params); + return { browser: new BrowserDispatcher(this, browser2) }; + } + async launchPersistentContext(params, metadata) { + const browserContext = await this._object.launchPersistentContext(metadata, params.userDataDir, params); + const browserDispatcher = new BrowserDispatcher(this, browserContext._browser); + const contextDispatcher = BrowserContextDispatcher.from(browserDispatcher, browserContext); + return { browser: browserDispatcher, context: contextDispatcher }; + } + async connectOverCDP(params, metadata) { + const browser2 = await this._object.connectOverCDP(metadata, params.endpointURL, params); + const browserDispatcher = new BrowserDispatcher(this, browser2); + return { + browser: browserDispatcher, + defaultContext: browser2._defaultContext ? BrowserContextDispatcher.from(browserDispatcher, browser2._defaultContext) : void 0 + }; + } +} +const perMessageDeflate = { + clientNoContextTakeover: true, + zlibDeflateOptions: { + level: 3 + }, + zlibInflateOptions: { + chunkSize: 10 * 1024 + }, + threshold: 10 * 1024 +}; +let WebSocketTransport$1 = class WebSocketTransport { + constructor(progress2, url2, logUrl, options2) { + this.headers = []; + this.wsEndpoint = url2; + this._logUrl = logUrl; + this._ws = new ws(url2, [], { + maxPayload: 256 * 1024 * 1024, + // 256Mb, + // Prevent internal http client error when passing negative timeout. + handshakeTimeout: Math.max((progress2 == null ? void 0 : progress2.timeUntilDeadline()) ?? DEFAULT_PLAYWRIGHT_TIMEOUT, 1), + headers: options2.headers, + followRedirects: options2.followRedirects, + agent: /^(https|wss):\/\//.test(url2) ? httpsHappyEyeballsAgent : httpHappyEyeballsAgent, + perMessageDeflate + }); + this._ws.on("upgrade", (response2) => { + for (let i = 0; i < response2.rawHeaders.length; i += 2) { + this.headers.push({ name: response2.rawHeaders[i], value: response2.rawHeaders[i + 1] }); + if (options2.debugLogHeader && response2.rawHeaders[i] === options2.debugLogHeader) + progress2 == null ? void 0 : progress2.log(response2.rawHeaders[i + 1]); + } + }); + this._progress = progress2; + const messageWrap = makeWaitForNextTask(); + this._ws.addEventListener("message", (event) => { + messageWrap(() => { + var _a2, _b2; + const eventData = event.data; + let parsedJson; + try { + parsedJson = JSON.parse(eventData); + } catch (e) { + (_a2 = this._progress) == null ? void 0 : _a2.log(` Closing websocket due to malformed JSON. eventData=${eventData} e=${e == null ? void 0 : e.message}`); + this._ws.close(); + return; + } + try { + if (this.onmessage) + this.onmessage.call(null, parsedJson); + } catch (e) { + (_b2 = this._progress) == null ? void 0 : _b2.log(` Closing websocket due to failed onmessage callback. eventData=${eventData} e=${e == null ? void 0 : e.message}`); + this._ws.close(); + } + }); + }); + this._ws.addEventListener("close", (event) => { + var _a2; + (_a2 = this._progress) == null ? void 0 : _a2.log(` ${logUrl} code=${event.code} reason=${event.reason}`); + if (this.onclose) + this.onclose.call(null, event.reason); + }); + this._ws.addEventListener("error", (error2) => { + var _a2; + return (_a2 = this._progress) == null ? void 0 : _a2.log(` ${logUrl} ${error2.type} ${error2.message}`); + }); + } + static async connect(progress2, url2, options2 = {}) { + return await WebSocketTransport._connect( + progress2, + url2, + options2, + false + /* hadRedirects */ + ); + } + static async _connect(progress2, url2, options2, hadRedirects) { + const logUrl = stripQueryParams(url2); + progress2 == null ? void 0 : progress2.log(` ${logUrl}`); + const transport = new WebSocketTransport(progress2, url2, logUrl, { ...options2, followRedirects: !!options2.followRedirects && hadRedirects }); + let success = false; + progress2 == null ? void 0 : progress2.cleanupWhenAborted(async () => { + if (!success) + await transport.closeAndWait().catch((e) => null); + }); + const result = await new Promise((fulfill, reject) => { + transport._ws.on("open", async () => { + progress2 == null ? void 0 : progress2.log(` ${logUrl}`); + fulfill({ transport }); + }); + transport._ws.on("error", (event) => { + progress2 == null ? void 0 : progress2.log(` ${logUrl} ${event.message}`); + reject(new Error("WebSocket error: " + event.message)); + transport._ws.close(); + }); + transport._ws.on("unexpected-response", (request2, response2) => { + if (options2.followRedirects && !hadRedirects && (response2.statusCode === 301 || response2.statusCode === 302 || response2.statusCode === 307 || response2.statusCode === 308)) { + fulfill({ redirect: response2 }); + transport._ws.close(); + return; + } + for (let i = 0; i < response2.rawHeaders.length; i += 2) { + if (options2.debugLogHeader && response2.rawHeaders[i] === options2.debugLogHeader) + progress2 == null ? void 0 : progress2.log(response2.rawHeaders[i + 1]); + } + const chunks = []; + const errorPrefix = `${logUrl} ${response2.statusCode} ${response2.statusMessage}`; + response2.on("data", (chunk) => chunks.push(chunk)); + response2.on("close", () => { + const error2 = chunks.length ? `${errorPrefix} +${Buffer.concat(chunks)}` : errorPrefix; + progress2 == null ? void 0 : progress2.log(` ${error2}`); + reject(new Error("WebSocket error: " + error2)); + transport._ws.close(); + }); + }); + }); + if (result.redirect) { + const newHeaders = Object.fromEntries(Object.entries(options2.headers || {}).filter(([name]) => { + return !name.includes("access-key") && name.toLowerCase() !== "authorization"; + })); + return WebSocketTransport._connect( + progress2, + result.redirect.headers.location, + { ...options2, headers: newHeaders }, + true + /* hadRedirects */ + ); + } + success = true; + return transport; + } + send(message) { + this._ws.send(JSON.stringify(message)); + } + close() { + var _a2; + (_a2 = this._progress) == null ? void 0 : _a2.log(` ${this._logUrl}`); + this._ws.close(); + } + async closeAndWait() { + if (this._ws.readyState === ws.CLOSED) + return; + const promise = new Promise((f) => this._ws.once("close", f)); + this.close(); + await promise; + } +}; +function stripQueryParams(url2) { + try { + const u = new URL(url2); + u.search = ""; + u.hash = ""; + return u.toString(); + } catch { + return url2; + } +} +const ARTIFACTS_FOLDER$1 = path.join(os.tmpdir(), "playwright-artifacts-"); +let ElectronApplication$1 = (_j = class extends SdkObject { + constructor(parent, browser2, nodeConnection, process2) { + super(parent, "electron-app"); + this._nodeElectronHandlePromise = new ManualPromise(); + this._process = process2; + this._browserContext = browser2._defaultContext; + this._nodeConnection = nodeConnection; + this._nodeSession = nodeConnection.rootSession; + this._nodeSession.on("Runtime.executionContextCreated", async (event) => { + if (!event.context.auxData || !event.context.auxData.isDefault) + return; + const crExecutionContext = new CRExecutionContext(this._nodeSession, event.context); + this._nodeExecutionContext = new ExecutionContext(this, crExecutionContext, "electron"); + const { result: remoteObject } = await crExecutionContext._client.send("Runtime.evaluate", { + expression: `require('electron')`, + contextId: event.context.id, + // Needed after Electron 28 to get access to require: https://github.com/microsoft/playwright/issues/28048 + includeCommandLineAPI: true + }); + this._nodeElectronHandlePromise.resolve(new JSHandle$1(this._nodeExecutionContext, "object", "ElectronModule", remoteObject.objectId)); + }); + this._nodeSession.on("Runtime.consoleAPICalled", (event) => this._onConsoleAPI(event)); + const appClosePromise = new Promise((f) => this.once(_j.Events.Close, f)); + this._browserContext.setCustomCloseHandler(async () => { + await this._browserContext.stopVideoRecording(); + const electronHandle = await this._nodeElectronHandlePromise; + await electronHandle.evaluate(({ app }) => app.quit()).catch(() => { + }); + this._nodeConnection.close(); + await appClosePromise; + }); + } + async _onConsoleAPI(event) { + if (event.executionContextId === 0) { + return; + } + if (!this._nodeExecutionContext) + return; + const args = event.args.map((arg) => createHandle$3(this._nodeExecutionContext, arg)); + const message = new ConsoleMessage$1(null, event.type, void 0, args, toConsoleMessageLocation(event.stackTrace)); + this.emit(_j.Events.Console, message); + } + async initialize() { + await this._nodeSession.send("Runtime.enable", {}); + await this._nodeSession.send("Runtime.evaluate", { expression: "__playwright_run()" }); + } + process() { + return this._process; + } + context() { + return this._browserContext; + } + async close() { + await this._browserContext.close({ reason: "Application exited" }); + } + async browserWindow(page) { + const targetId = page.delegate._targetId; + const electronHandle = await this._nodeElectronHandlePromise; + return await electronHandle.evaluateHandle(({ BrowserWindow, webContents }, targetId2) => { + const wc = webContents.fromDevToolsTargetId(targetId2); + return BrowserWindow.fromWebContents(wc); + }, targetId); + } +}, _j.Events = { + Close: "close", + Console: "console" +}, _j); +let Electron$1 = class Electron extends SdkObject { + constructor(playwright2) { + super(playwright2, "electron"); + } + async launch(options2) { + const { + args = [] + } = options2; + const controller = new ProgressController(serverSideCallMetadata(), this); + controller.setLogName("browser"); + return controller.run(async (progress2) => { + let app = void 0; + let electronArguments = ["--inspect=0", "--remote-debugging-port=0", ...args]; + if (os.platform() === "linux") { + const runningAsRoot = process.geteuid && process.geteuid() === 0; + if (runningAsRoot && electronArguments.indexOf("--no-sandbox") === -1) + electronArguments.unshift("--no-sandbox"); + } + const artifactsDir = await fs.promises.mkdtemp(ARTIFACTS_FOLDER$1); + const browserLogsCollector = new RecentLogsCollector(); + const env = options2.env ? envArrayToObject(options2.env) : define_process_env_default; + let command2; + if (options2.executablePath) { + command2 = options2.executablePath; + } else { + try { + command2 = require("electron/index.js"); + } catch (error2) { + if ((error2 == null ? void 0 : error2.code) === "MODULE_NOT_FOUND") { + throw new Error("\n" + wrapInASCIIBox([ + "Electron executablePath not found!", + "Please install it using `npm install -D electron` or set the executablePath to your Electron executable." + ].join("\n"), 1)); + } + throw error2; + } + electronArguments.unshift("-r", Boolean("./loader")); + } + let shell = false; + if (process.platform === "win32") { + shell = true; + command2 = `"${command2}"`; + electronArguments = electronArguments.map((arg) => `"${arg}"`); + } + delete env.NODE_OPTIONS; + const { launchedProcess, gracefullyClose, kill } = await launchProcess({ + command: command2, + args: electronArguments, + env, + log: (message) => { + progress2.log(message); + browserLogsCollector.log(message); + }, + shell, + stdio: "pipe", + cwd: options2.cwd, + tempDirectories: [artifactsDir], + attemptToGracefullyClose: () => app.close(), + handleSIGINT: true, + handleSIGTERM: true, + handleSIGHUP: true, + onExit: () => app == null ? void 0 : app.emit(ElectronApplication$1.Events.Close) + }); + const waitForXserverError = new Promise(async (resolve, reject) => { + waitForLine(progress2, launchedProcess, /Unable to open X display/).then(() => reject(new Error([ + "Unable to open X display!", + `================================`, + "Most likely this is because there is no X server available.", + "Use 'xvfb-run' on Linux to launch your tests with an emulated display server.", + "For example: 'xvfb-run npm run test:e2e'", + `================================`, + progress2.metadata.log + ].join("\n")))).catch(() => { + }); + }); + const nodeMatchPromise = waitForLine(progress2, launchedProcess, /^Debugger listening on (ws:\/\/.*)$/); + const chromeMatchPromise = waitForLine(progress2, launchedProcess, /^DevTools listening on (ws:\/\/.*)$/); + const debuggerDisconnectPromise = waitForLine(progress2, launchedProcess, /Waiting for the debugger to disconnect\.\.\./); + const nodeMatch = await nodeMatchPromise; + const nodeTransport = await WebSocketTransport$1.connect(progress2, nodeMatch[1]); + const nodeConnection = new CRConnection(nodeTransport, helper.debugProtocolLogger(), browserLogsCollector); + debuggerDisconnectPromise.then(() => { + nodeTransport.close(); + }).catch(() => { + }); + const chromeMatch = await Promise.race([ + chromeMatchPromise, + waitForXserverError + ]); + const chromeTransport = await WebSocketTransport$1.connect(progress2, chromeMatch[1]); + const browserProcess = { + onclose: void 0, + process: launchedProcess, + close: gracefullyClose, + kill + }; + const contextOptions = { + ...options2, + noDefaultViewport: true + }; + const browserOptions = { + name: "electron", + isChromium: true, + headful: true, + persistent: contextOptions, + browserProcess, + protocolLogger: helper.debugProtocolLogger(), + browserLogsCollector, + artifactsDir, + downloadsPath: artifactsDir, + tracesDir: options2.tracesDir || artifactsDir, + originalLaunchOptions: { timeout: options2.timeout } + }; + validateBrowserContextOptions(contextOptions, browserOptions); + const browser2 = await CRBrowser.connect(this.attribution.playwright, chromeTransport, browserOptions); + app = new ElectronApplication$1(this, browser2, nodeConnection, launchedProcess); + await app.initialize(); + return app; + }, options2.timeout); + } +}; +function waitForLine(progress2, process2, regex) { + return new Promise((resolve, reject) => { + const rl = createInterface({ input: process2.stderr }); + const failError = new Error("Process failed to launch!"); + const listeners = [ + eventsHelper.addEventListener(rl, "line", onLine), + eventsHelper.addEventListener(rl, "close", reject.bind(null, failError)), + eventsHelper.addEventListener(process2, "exit", reject.bind(null, failError)), + // It is Ok to remove error handler because we did not create process and there is another listener. + eventsHelper.addEventListener(process2, "error", reject.bind(null, failError)) + ]; + progress2.cleanupWhenAborted(cleanup); + function onLine(line) { + const match = line.match(regex); + if (!match) + return; + cleanup(); + resolve(match); + } + function cleanup() { + eventsHelper.removeEventListeners(listeners); + } + }); +} +class ElectronDispatcher extends Dispatcher { + constructor(scope, electron) { + super(scope, electron, "Electron", {}); + this._type_Electron = true; + } + async launch(params) { + const electronApplication = await this._object.launch(params); + return { electronApplication: new ElectronApplicationDispatcher(this, electronApplication) }; + } +} +class ElectronApplicationDispatcher extends Dispatcher { + constructor(scope, electronApplication) { + super(scope, electronApplication, "ElectronApplication", { + context: BrowserContextDispatcher.from(scope, electronApplication.context()) + }); + this._type_EventTarget = true; + this._type_ElectronApplication = true; + this._subscriptions = /* @__PURE__ */ new Set(); + this.addObjectListener(ElectronApplication$1.Events.Close, () => { + this._dispatchEvent("close"); + this._dispose(); + }); + this.addObjectListener(ElectronApplication$1.Events.Console, (message) => { + if (!this._subscriptions.has("console")) + return; + this._dispatchEvent("console", { + type: message.type(), + text: message.text(), + args: message.args().map((a) => JSHandleDispatcher.fromJSHandle(this, a)), + location: message.location() + }); + }); + } + async browserWindow(params) { + const handle = await this._object.browserWindow(params.page.page()); + return { handle: JSHandleDispatcher.fromJSHandle(this, handle) }; + } + async evaluateExpression(params) { + const handle = await this._object._nodeElectronHandlePromise; + return { value: serializeResult(await handle.evaluateExpression(params.expression, { isFunction: params.isFunction }, parseArgument(params.arg))) }; + } + async evaluateExpressionHandle(params) { + const handle = await this._object._nodeElectronHandlePromise; + const result = await handle.evaluateExpressionHandle(params.expression, { isFunction: params.isFunction }, parseArgument(params.arg)); + return { handle: JSHandleDispatcher.fromJSHandle(this, result) }; + } + async updateSubscription(params) { + if (params.enabled) + this._subscriptions.add(params.event); + else + this._subscriptions.delete(params.event); + } + async close() { + await this._object.close(); + } +} +const redirectStatus = [301, 302, 303, 307, 308]; +class HarBackend { + constructor(harFile, baseDir, zipFile) { + this.id = createGuid(); + this._harFile = harFile; + this._baseDir = baseDir; + this._zipFile = zipFile; + } + async lookup(url2, method, headers, postData, isNavigationRequest) { + let entry; + try { + entry = await this._harFindResponse(url2, method, headers, postData); + } catch (e) { + return { action: "error", message: "HAR error: " + e.message }; + } + if (!entry) + return { action: "noentry" }; + if (entry.request.url !== url2 && isNavigationRequest) + return { action: "redirect", redirectURL: entry.request.url }; + const response2 = entry.response; + try { + const buffer2 = await this._loadContent(response2.content); + return { + action: "fulfill", + status: response2.status, + headers: response2.headers, + body: buffer2 + }; + } catch (e) { + return { action: "error", message: e.message }; + } + } + async _loadContent(content) { + const file = content._file; + let buffer2; + if (file) { + if (this._zipFile) + buffer2 = await this._zipFile.read(file); + else + buffer2 = await fs.promises.readFile(path.resolve(this._baseDir, file)); + } else { + buffer2 = Buffer.from(content.text || "", content.encoding === "base64" ? "base64" : "utf-8"); + } + return buffer2; + } + async _harFindResponse(url2, method, headers, postData) { + const harLog = this._harFile.log; + const visited = /* @__PURE__ */ new Set(); + while (true) { + const entries = []; + for (const candidate of harLog.entries) { + if (candidate.request.url !== url2 || candidate.request.method !== method) + continue; + if (method === "POST" && postData && candidate.request.postData) { + const buffer2 = await this._loadContent(candidate.request.postData); + if (!buffer2.equals(postData)) { + const boundary = multipartBoundary(headers); + if (!boundary) + continue; + const candidataBoundary = multipartBoundary(candidate.request.headers); + if (!candidataBoundary) + continue; + if (postData.toString().replaceAll(boundary, "") !== buffer2.toString().replaceAll(candidataBoundary, "")) + continue; + } + } + entries.push(candidate); + } + if (!entries.length) + return; + let entry = entries[0]; + if (entries.length > 1) { + const list = []; + for (const candidate of entries) { + const matchingHeaders = countMatchingHeaders(candidate.request.headers, headers); + list.push({ candidate, matchingHeaders }); + } + list.sort((a, b) => b.matchingHeaders - a.matchingHeaders); + entry = list[0].candidate; + } + if (visited.has(entry)) + throw new Error(`Found redirect cycle for ${url2}`); + visited.add(entry); + const locationHeader = entry.response.headers.find((h) => h.name.toLowerCase() === "location"); + if (redirectStatus.includes(entry.response.status) && locationHeader) { + const locationURL = new URL(locationHeader.value, url2); + url2 = locationURL.toString(); + if ((entry.response.status === 301 || entry.response.status === 302) && method === "POST" || entry.response.status === 303 && !["GET", "HEAD"].includes(method)) { + method = "GET"; + } + continue; + } + return entry; + } + } + dispose() { + var _a2; + (_a2 = this._zipFile) == null ? void 0 : _a2.close(); + } +} +function countMatchingHeaders(harHeaders, headers) { + const set2 = new Set(headers.map((h) => h.name.toLowerCase() + ":" + h.value)); + let matches = 0; + for (const h of harHeaders) { + if (set2.has(h.name.toLowerCase() + ":" + h.value)) + ++matches; + } + return matches; +} +function multipartBoundary(headers) { + const contentType = headers.find((h) => h.name.toLowerCase() === "content-type"); + if (!(contentType == null ? void 0 : contentType.value.includes("multipart/form-data"))) + return void 0; + const boundary = contentType.value.match(/boundary=(\S+)/); + if (boundary) + return boundary[1]; + return void 0; +} +function serializeClientSideCallMetadata(metadatas) { + const fileNames = /* @__PURE__ */ new Map(); + const stacks = []; + for (const m of metadatas) { + if (!m.stack || !m.stack.length) + continue; + const stack = []; + for (const frame of m.stack) { + let ordinal = fileNames.get(frame.file); + if (typeof ordinal !== "number") { + ordinal = fileNames.size; + fileNames.set(frame.file, ordinal); + } + const stackFrame = [ordinal, frame.line || 0, frame.column || 0, frame.function || ""]; + stack.push(stackFrame); + } + stacks.push([m.id, stack]); + } + return { files: [...fileNames.keys()], stacks }; +} +async function zip(stackSessions, params) { + const promise = new ManualPromise(); + const zipFile = new yazl.ZipFile(); + zipFile.on("error", (error2) => promise.reject(error2)); + const addFile = (file, name) => { + try { + if (fs.statSync(file).isFile()) + zipFile.addFile(file, name); + } catch (e) { + } + }; + for (const entry of params.entries) + addFile(entry.value, entry.name); + const stackSession = params.stacksId ? stackSessions.get(params.stacksId) : void 0; + if (stackSession == null ? void 0 : stackSession.callStacks.length) { + await stackSession.writer; + if (define_process_env_default.PW_LIVE_TRACE_STACKS) { + zipFile.addFile(stackSession.file, "trace.stacks"); + } else { + const buffer2 = Buffer.from(JSON.stringify(serializeClientSideCallMetadata(stackSession.callStacks))); + zipFile.addBuffer(buffer2, "trace.stacks"); + } + } + if (params.includeSources) { + const sourceFiles = /* @__PURE__ */ new Set(); + for (const { stack } of (stackSession == null ? void 0 : stackSession.callStacks) || []) { + if (!stack) + continue; + for (const { file } of stack) + sourceFiles.add(file); + } + for (const sourceFile of sourceFiles) + addFile(sourceFile, "resources/src@" + await calculateSha1(sourceFile) + ".txt"); + } + if (params.mode === "write") { + await fs.promises.mkdir(path.dirname(params.zipFile), { recursive: true }); + zipFile.end(void 0, () => { + zipFile.outputStream.pipe(fs.createWriteStream(params.zipFile)).on("close", () => promise.resolve()).on("error", (error2) => promise.reject(error2)); + }); + await promise; + await deleteStackSession(stackSessions, params.stacksId); + return; + } + const tempFile = params.zipFile + ".tmp"; + await fs.promises.rename(params.zipFile, tempFile); + yauzl.open(tempFile, (err, inZipFile) => { + if (err) { + promise.reject(err); + return; + } + assert(inZipFile); + let pendingEntries = inZipFile.entryCount; + inZipFile.on("entry", (entry) => { + inZipFile.openReadStream(entry, (err2, readStream) => { + if (err2) { + promise.reject(err2); + return; + } + zipFile.addReadStream(readStream, entry.fileName); + if (--pendingEntries === 0) { + zipFile.end(void 0, () => { + zipFile.outputStream.pipe(fs.createWriteStream(params.zipFile)).on("close", () => { + fs.promises.unlink(tempFile).then(() => { + promise.resolve(); + }).catch((error2) => promise.reject(error2)); + }); + }); + } + }); + }); + }); + await promise; + await deleteStackSession(stackSessions, params.stacksId); +} +async function deleteStackSession(stackSessions, stacksId) { + const session = stacksId ? stackSessions.get(stacksId) : void 0; + if (!session) + return; + await session.writer; + if (session.tmpDir) + await removeFolders([session.tmpDir]); + stackSessions.delete(stacksId); +} +async function harOpen(harBackends, params) { + let harBackend; + if (params.file.endsWith(".zip")) { + const zipFile = new ZipFile(params.file); + const entryNames = await zipFile.entries(); + const harEntryName = entryNames.find((e) => e.endsWith(".har")); + if (!harEntryName) + return { error: "Specified archive does not have a .har file" }; + const har = await zipFile.read(harEntryName); + const harFile = JSON.parse(har.toString()); + harBackend = new HarBackend(harFile, null, zipFile); + } else { + const harFile = JSON.parse(await fs.promises.readFile(params.file, "utf-8")); + harBackend = new HarBackend(harFile, path.dirname(params.file), null); + } + harBackends.set(harBackend.id, harBackend); + return { harId: harBackend.id }; +} +async function harLookup(harBackends, params) { + const harBackend = harBackends.get(params.harId); + if (!harBackend) + return { action: "error", message: `Internal error: har was not opened` }; + return await harBackend.lookup(params.url, params.method, params.headers, params.postData, params.isNavigationRequest); +} +async function harClose(harBackends, params) { + const harBackend = harBackends.get(params.harId); + if (harBackend) { + harBackends.delete(harBackend.id); + harBackend.dispose(); + } +} +async function harUnzip(params) { + const dir = path.dirname(params.zipFile); + const zipFile = new ZipFile(params.zipFile); + for (const entry of await zipFile.entries()) { + const buffer2 = await zipFile.read(entry); + if (entry === "har.har") + await fs.promises.writeFile(params.harFile, buffer2); + else + await fs.promises.writeFile(path.join(dir, entry), buffer2); + } + zipFile.close(); + await fs.promises.unlink(params.zipFile); +} +async function tracingStarted(stackSessions, params) { + let tmpDir = void 0; + if (!params.tracesDir) + tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "playwright-tracing-")); + const traceStacksFile = path.join(params.tracesDir || tmpDir, params.traceName + ".stacks"); + stackSessions.set(traceStacksFile, { callStacks: [], file: traceStacksFile, writer: Promise.resolve(), tmpDir }); + return { stacksId: traceStacksFile }; +} +async function traceDiscarded(stackSessions, params) { + await deleteStackSession(stackSessions, params.stacksId); +} +async function addStackToTracingNoReply(stackSessions, params) { + for (const session of stackSessions.values()) { + session.callStacks.push(params.callData); + if (define_process_env_default.PW_LIVE_TRACE_STACKS) { + session.writer = session.writer.then(() => { + const buffer2 = Buffer.from(JSON.stringify(serializeClientSideCallMetadata(session.callStacks))); + return fs.promises.writeFile(session.file, buffer2); + }); + } + } +} +class JsonPipeDispatcher extends Dispatcher { + constructor(scope) { + super(scope, { guid: "jsonPipe@" + createGuid() }, "JsonPipe", {}); + this._type_JsonPipe = true; + } + async send(params) { + this.emit("message", params.message); + } + async close() { + this.emit("close"); + if (!this._disposed) { + this._dispatchEvent("closed", {}); + this._dispose(); + } + } + dispatch(message) { + if (!this._disposed) + this._dispatchEvent("message", { message }); + } + wasClosed(reason) { + if (!this._disposed) { + this._dispatchEvent("closed", { reason }); + this._dispose(); + } + } + dispose() { + this._dispose(); + } +} +class SocksInterceptor { + constructor(transport, pattern, redirectPortForTest) { + this._ids = /* @__PURE__ */ new Set(); + this._handler = new SocksProxyHandler(pattern, redirectPortForTest); + let lastId = -1; + this._channel = new Proxy(new EventEmitter$1(), { + get: (obj, prop) => { + if (prop in obj || obj[prop] !== void 0 || typeof prop !== "string") + return obj[prop]; + return (params) => { + try { + const id = --lastId; + this._ids.add(id); + const validator = findValidator("SocksSupport", prop, "Params"); + params = validator(params, "", { tChannelImpl: tChannelForSocks, binary: "toBase64", isUnderTest }); + transport.send({ id, guid: this._socksSupportObjectGuid, method: prop, params, metadata: { stack: [], apiName: "", internal: true } }); + } catch (e) { + } + }; + } + }); + this._handler.on(SocksProxyHandler.Events.SocksConnected, (payload) => this._channel.socksConnected(payload)); + this._handler.on(SocksProxyHandler.Events.SocksData, (payload) => this._channel.socksData(payload)); + this._handler.on(SocksProxyHandler.Events.SocksError, (payload) => this._channel.socksError(payload)); + this._handler.on(SocksProxyHandler.Events.SocksFailed, (payload) => this._channel.socksFailed(payload)); + this._handler.on(SocksProxyHandler.Events.SocksEnd, (payload) => this._channel.socksEnd(payload)); + this._channel.on("socksRequested", (payload) => this._handler.socketRequested(payload)); + this._channel.on("socksClosed", (payload) => this._handler.socketClosed(payload)); + this._channel.on("socksData", (payload) => this._handler.sendSocketData(payload)); + } + cleanup() { + this._handler.cleanup(); + } + interceptMessage(message) { + if (this._ids.has(message.id)) { + this._ids.delete(message.id); + return true; + } + if (message.method === "__create__" && message.params.type === "SocksSupport") { + this._socksSupportObjectGuid = message.params.guid; + return false; + } + if (this._socksSupportObjectGuid && message.guid === this._socksSupportObjectGuid) { + const validator = findValidator("SocksSupport", message.method, "Event"); + const params = validator(message.params, "", { tChannelImpl: tChannelForSocks, binary: "fromBase64", isUnderTest }); + this._channel.emit(message.method, params); + return true; + } + return false; + } +} +function tChannelForSocks(names, arg, path2, context) { + throw new ValidationError(`${path2}: channels are not expected in SocksSupport`); +} +class LocalUtilsDispatcher extends Dispatcher { + constructor(scope, playwright2) { + const localUtils2 = new SdkObject(playwright2, "localUtils", "localUtils"); + const deviceDescriptors$1 = Object.entries(deviceDescriptors).map(([name, descriptor]) => ({ name, descriptor })); + super(scope, localUtils2, "LocalUtils", { + deviceDescriptors: deviceDescriptors$1 + }); + this._harBackends = /* @__PURE__ */ new Map(); + this._stackSessions = /* @__PURE__ */ new Map(); + this._type_LocalUtils = true; + } + async zip(params) { + return await zip(this._stackSessions, params); + } + async harOpen(params, metadata) { + return await harOpen(this._harBackends, params); + } + async harLookup(params, metadata) { + return await harLookup(this._harBackends, params); + } + async harClose(params, metadata) { + return await harClose(this._harBackends, params); + } + async harUnzip(params, metadata) { + return await harUnzip(params); + } + async tracingStarted(params, metadata) { + return await tracingStarted(this._stackSessions, params); + } + async traceDiscarded(params, metadata) { + return await traceDiscarded(this._stackSessions, params); + } + async addStackToTracingNoReply(params, metadata) { + return await addStackToTracingNoReply(this._stackSessions, params); + } + async connect(params, metadata) { + const controller = new ProgressController(metadata, this._object); + controller.setLogName("browser"); + return await controller.run(async (progress2) => { + const wsHeaders = { + "User-Agent": getUserAgent(), + "x-playwright-proxy": params.exposeNetwork ?? "", + ...params.headers + }; + const wsEndpoint = await urlToWSEndpoint$1(progress2, params.wsEndpoint); + const transport = await WebSocketTransport$1.connect(progress2, wsEndpoint, { headers: wsHeaders, followRedirects: true, debugLogHeader: "x-playwright-debug-log" }); + const socksInterceptor = new SocksInterceptor(transport, params.exposeNetwork, params.socksProxyRedirectPortForTest); + const pipe = new JsonPipeDispatcher(this); + transport.onmessage = (json) => { + if (socksInterceptor.interceptMessage(json)) + return; + const cb = () => { + try { + pipe.dispatch(json); + } catch (e) { + transport.close(); + } + }; + if (params.slowMo) + setTimeout(cb, params.slowMo); + else + cb(); + }; + pipe.on("message", (message) => { + transport.send(message); + }); + transport.onclose = (reason) => { + socksInterceptor == null ? void 0 : socksInterceptor.cleanup(); + pipe.wasClosed(reason); + }; + pipe.on("close", () => transport.close()); + return { pipe, headers: transport.headers }; + }, params.timeout); + } + async globToRegex(params, metadata) { + const regex = resolveGlobToRegexPattern(params.baseURL, params.glob, params.webSocketUrl); + return { regex }; + } +} +async function urlToWSEndpoint$1(progress2, endpointURL) { + if (endpointURL.startsWith("ws")) + return endpointURL; + progress2.log(` retrieving websocket url from ${endpointURL}`); + const fetchUrl = new URL(endpointURL); + if (!fetchUrl.pathname.endsWith("/")) + fetchUrl.pathname += "/"; + fetchUrl.pathname += "json"; + const json = await fetchData({ + url: fetchUrl.toString(), + method: "GET", + timeout: progress2.timeUntilDeadline(), + headers: { "User-Agent": getUserAgent() } + }, async (params, response2) => { + return new Error(`Unexpected status ${response2.statusCode} when connecting to ${fetchUrl.toString()}. +This does not look like a Playwright server, try connecting via ws://.`); + }); + progress2.throwIfAborted(); + const wsUrl = new URL(endpointURL); + let wsEndpointPath = JSON.parse(json).wsEndpointPath; + if (wsEndpointPath.startsWith("/")) + wsEndpointPath = wsEndpointPath.substring(1); + if (!wsUrl.pathname.endsWith("/")) + wsUrl.pathname += "/"; + wsUrl.pathname += wsEndpointPath; + wsUrl.protocol = wsUrl.protocol === "https:" ? "wss:" : "ws:"; + return wsUrl.toString(); +} +class AdbBackend { + async devices(options2 = {}) { + const result = await runCommand("host:devices", options2.host, options2.port); + const lines = result.toString().trim().split("\n"); + return lines.map((line) => { + const [serial, status] = line.trim().split(" "); + return new AdbDevice(serial, status, options2.host, options2.port); + }); + } +} +class AdbDevice { + constructor(serial, status, host, port) { + this._closed = false; + this.serial = serial; + this.status = status; + this.host = host; + this.port = port; + } + async init() { + } + async close() { + this._closed = true; + } + runCommand(command2) { + if (this._closed) + throw new Error("Device is closed"); + return runCommand(command2, this.host, this.port, this.serial); + } + async open(command2) { + if (this._closed) + throw new Error("Device is closed"); + const result = await open(command2, this.host, this.port, this.serial); + result.becomeSocket(); + return result; + } +} +async function runCommand(command2, host = "127.0.0.1", port = 5037, serial) { + debug$2("pw:adb:runCommand")(command2, serial); + const socket = new BufferedSocketWrapper(command2, net.createConnection({ host, port })); + try { + if (serial) { + await socket.write(encodeMessage(`host:transport:${serial}`)); + const status2 = await socket.read(4); + assert(status2.toString() === "OKAY", status2.toString()); + } + await socket.write(encodeMessage(command2)); + const status = await socket.read(4); + assert(status.toString() === "OKAY", status.toString()); + let commandOutput; + if (!command2.startsWith("shell:")) { + const remainingLength = parseInt((await socket.read(4)).toString(), 16); + commandOutput = await socket.read(remainingLength); + } else { + commandOutput = await socket.readAll(); + } + return commandOutput; + } finally { + socket.close(); + } +} +async function open(command2, host = "127.0.0.1", port = 5037, serial) { + const socket = new BufferedSocketWrapper(command2, net.createConnection({ host, port })); + if (serial) { + await socket.write(encodeMessage(`host:transport:${serial}`)); + const status2 = await socket.read(4); + assert(status2.toString() === "OKAY", status2.toString()); + } + await socket.write(encodeMessage(command2)); + const status = await socket.read(4); + assert(status.toString() === "OKAY", status.toString()); + return socket; +} +function encodeMessage(message) { + let lenHex = message.length.toString(16); + lenHex = "0".repeat(4 - lenHex.length) + lenHex; + return Buffer.from(lenHex + message); +} +class BufferedSocketWrapper extends eventsExports.EventEmitter { + constructor(command2, socket) { + super(); + this.guid = createGuid(); + this._buffer = Buffer.from([]); + this._isSocket = false; + this._isClosed = false; + this._command = command2; + this._socket = socket; + this._connectPromise = new Promise((f) => this._socket.on("connect", f)); + this._socket.on("data", (data2) => { + debug$2("pw:adb:data")(data2.toString()); + if (this._isSocket) { + this.emit("data", data2); + return; + } + this._buffer = Buffer.concat([this._buffer, data2]); + if (this._notifyReader) + this._notifyReader(); + }); + this._socket.on("close", () => { + this._isClosed = true; + if (this._notifyReader) + this._notifyReader(); + this.close(); + this.emit("close"); + }); + this._socket.on("error", (error2) => this.emit("error", error2)); + } + async write(data2) { + debug$2("pw:adb:send")(data2.toString().substring(0, 100) + "..."); + await this._connectPromise; + await new Promise((f) => this._socket.write(data2, f)); + } + close() { + if (this._isClosed) + return; + debug$2("pw:adb")("Close " + this._command); + this._socket.destroy(); + } + async read(length) { + await this._connectPromise; + assert(!this._isSocket, "Can not read by length in socket mode"); + while (this._buffer.length < length) + await new Promise((f) => this._notifyReader = f); + const result = this._buffer.slice(0, length); + this._buffer = this._buffer.slice(length); + debug$2("pw:adb:recv")(result.toString().substring(0, 100) + "..."); + return result; + } + async readAll() { + while (!this._isClosed) + await new Promise((f) => this._notifyReader = f); + return this._buffer; + } + becomeSocket() { + assert(!this._buffer.length); + this._isSocket = true; + } +} +class PipeTransport2 { + constructor(pipeWrite, pipeRead) { + this._pendingBuffers = []; + this._waitForNextTask = makeWaitForNextTask(); + this._closed = false; + this._pipeRead = pipeRead; + this._pipeWrite = pipeWrite; + pipeRead.on("data", (buffer2) => this._dispatch(buffer2)); + pipeRead.on("close", () => { + this._closed = true; + if (this._onclose) + this._onclose.call(null); + }); + pipeRead.on("error", (e) => debugLogger.log("error", e)); + pipeWrite.on("error", (e) => debugLogger.log("error", e)); + this.onmessage = void 0; + } + get onclose() { + return this._onclose; + } + set onclose(onclose) { + this._onclose = onclose; + if (onclose && !this._pipeRead.readable) + onclose(); + } + send(message) { + if (this._closed) + throw new Error("Pipe has been closed"); + this._pipeWrite.write(JSON.stringify(message)); + this._pipeWrite.write("\0"); + } + close() { + throw new Error("unimplemented"); + } + _dispatch(buffer2) { + let end = buffer2.indexOf("\0"); + if (end === -1) { + this._pendingBuffers.push(buffer2); + return; + } + this._pendingBuffers.push(buffer2.slice(0, end)); + const message = Buffer.concat(this._pendingBuffers).toString(); + this._waitForNextTask(() => { + if (this.onmessage) + this.onmessage.call(null, JSON.parse(message)); + }); + let start = end + 1; + end = buffer2.indexOf("\0", start); + while (end !== -1) { + const message2 = buffer2.toString(void 0, start, end); + this._waitForNextTask(() => { + if (this.onmessage) + this.onmessage.call(null, JSON.parse(message2)); + }); + start = end + 1; + end = buffer2.indexOf("\0", start); + } + this._pendingBuffers = [buffer2.slice(start)]; + } +} +const kNoXServerRunningError = "Looks like you launched a headed browser without having a XServer running.\nSet either 'headless: true' or use 'xvfb-run ' before running Playwright.\n\n<3 Playwright Team"; +class BrowserReadyState { + constructor() { + this._wsEndpoint = new ManualPromise(); + } + onBrowserExit() { + this._wsEndpoint.resolve(void 0); + } + async waitUntilReady() { + const wsEndpoint = await this._wsEndpoint; + return { wsEndpoint }; + } +} +let BrowserType$1 = class BrowserType extends SdkObject { + constructor(parent, browserName) { + super(parent, "browser-type"); + this.attribution.browserType = this; + this._name = browserName; + } + executablePath() { + return registry.findExecutable(this._name).executablePath(this.attribution.playwright.options.sdkLanguage) || ""; + } + name() { + return this._name; + } + async launch(metadata, options2, protocolLogger) { + options2 = this._validateLaunchOptions(options2); + const controller = new ProgressController(metadata, this); + controller.setLogName("browser"); + const browser2 = await controller.run((progress2) => { + const seleniumHubUrl = options2.__testHookSeleniumRemoteURL || define_process_env_default.SELENIUM_REMOTE_URL; + if (seleniumHubUrl) + return this._launchWithSeleniumHub(progress2, seleniumHubUrl, options2); + return this._innerLaunchWithRetries(progress2, options2, void 0, helper.debugProtocolLogger(protocolLogger)).catch((e) => { + throw this._rewriteStartupLog(e); + }); + }, options2.timeout); + return browser2; + } + async launchPersistentContext(metadata, userDataDir, options2) { + const launchOptions = this._validateLaunchOptions(options2); + const controller = new ProgressController(metadata, this); + controller.setLogName("browser"); + const browser2 = await controller.run(async (progress2) => { + var _a2; + let clientCertificatesProxy; + if ((_a2 = options2.clientCertificates) == null ? void 0 : _a2.length) { + clientCertificatesProxy = new ClientCertificatesProxy(options2); + launchOptions.proxyOverride = await (clientCertificatesProxy == null ? void 0 : clientCertificatesProxy.listen()); + options2 = { ...options2 }; + options2.internalIgnoreHTTPSErrors = true; + } + progress2.cleanupWhenAborted(() => clientCertificatesProxy == null ? void 0 : clientCertificatesProxy.close()); + const browser22 = await this._innerLaunchWithRetries(progress2, launchOptions, options2, helper.debugProtocolLogger(), userDataDir).catch((e) => { + throw this._rewriteStartupLog(e); + }); + browser22._defaultContext._clientCertificatesProxy = clientCertificatesProxy; + return browser22; + }, launchOptions.timeout); + return browser2._defaultContext; + } + async _innerLaunchWithRetries(progress2, options2, persistent, protocolLogger, userDataDir) { + try { + return await this._innerLaunch(progress2, options2, persistent, protocolLogger, userDataDir); + } catch (error2) { + const errorMessage = typeof error2 === "object" && typeof error2.message === "string" ? error2.message : ""; + if (errorMessage.includes("Inconsistency detected by ld.so")) { + progress2.log(``); + return this._innerLaunch(progress2, options2, persistent, protocolLogger, userDataDir); + } + throw error2; + } + } + async _innerLaunch(progress2, options2, persistent, protocolLogger, maybeUserDataDir) { + options2.proxy = options2.proxy ? normalizeProxySettings(options2.proxy) : void 0; + const browserLogsCollector = new RecentLogsCollector(); + const { browserProcess, userDataDir, artifactsDir, transport } = await this._launchProcess(progress2, options2, !!persistent, browserLogsCollector, maybeUserDataDir); + if (options2.__testHookBeforeCreateBrowser) + await options2.__testHookBeforeCreateBrowser(); + const browserOptions = { + name: this._name, + isChromium: this._name === "chromium", + channel: options2.channel, + slowMo: options2.slowMo, + persistent, + headful: !options2.headless, + artifactsDir, + downloadsPath: options2.downloadsPath || artifactsDir, + tracesDir: options2.tracesDir || artifactsDir, + browserProcess, + customExecutablePath: options2.executablePath, + proxy: options2.proxy, + protocolLogger, + browserLogsCollector, + wsEndpoint: transport instanceof WebSocketTransport$1 ? transport.wsEndpoint : void 0, + originalLaunchOptions: options2 + }; + if (persistent) + validateBrowserContextOptions(persistent, browserOptions); + copyTestHooks(options2, browserOptions); + const browser2 = await this.connectToTransport(transport, browserOptions, browserLogsCollector); + browser2._userDataDirForTest = userDataDir; + if (persistent && !options2.ignoreAllDefaultArgs) + await browser2._defaultContext._loadDefaultContext(progress2); + return browser2; + } + async _launchProcess(progress2, options2, isPersistent, browserLogsCollector, userDataDir) { + var _a2; + const { + ignoreDefaultArgs, + ignoreAllDefaultArgs, + args = [], + executablePath = null, + handleSIGINT = true, + handleSIGTERM = true, + handleSIGHUP = true + } = options2; + const env = options2.env ? envArrayToObject(options2.env) : define_process_env_default; + await this._createArtifactDirs(options2); + const tempDirectories = []; + const artifactsDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "playwright-artifacts-")); + tempDirectories.push(artifactsDir); + if (userDataDir) { + assert(path.isAbsolute(userDataDir), "userDataDir must be an absolute path"); + if (!await existsAsync(userDataDir)) + await fs.promises.mkdir(userDataDir, { recursive: true, mode: 448 }); + } else { + userDataDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), `playwright_${this._name}dev_profile-`)); + tempDirectories.push(userDataDir); + } + await this.prepareUserDataDir(options2, userDataDir); + const browserArguments = []; + if (ignoreAllDefaultArgs) + browserArguments.push(...args); + else if (ignoreDefaultArgs) + browserArguments.push(...this.defaultArgs(options2, isPersistent, userDataDir).filter((arg) => ignoreDefaultArgs.indexOf(arg) === -1)); + else + browserArguments.push(...this.defaultArgs(options2, isPersistent, userDataDir)); + let executable; + if (executablePath) { + if (!await existsAsync(executablePath)) + throw new Error(`Failed to launch ${this._name} because executable doesn't exist at ${executablePath}`); + executable = executablePath; + } else { + const registryExecutable = registry.findExecutable(this.getExecutableName(options2)); + if (!registryExecutable || registryExecutable.browserName !== this._name) + throw new Error(`Unsupported ${this._name} channel "${options2.channel}"`); + executable = registryExecutable.executablePathOrDie(this.attribution.playwright.options.sdkLanguage); + await registry.validateHostRequirementsForExecutablesIfNeeded([registryExecutable], this.attribution.playwright.options.sdkLanguage); + } + const readyState = this.readyState(options2); + let transport = void 0; + let browserProcess = void 0; + const { launchedProcess, gracefullyClose, kill } = await launchProcess({ + command: executable, + args: browserArguments, + env: this.amendEnvironment(env, userDataDir, executable, browserArguments), + handleSIGINT, + handleSIGTERM, + handleSIGHUP, + log: (message) => { + readyState == null ? void 0 : readyState.onBrowserOutput(message); + progress2.log(message); + browserLogsCollector.log(message); + }, + stdio: "pipe", + tempDirectories, + attemptToGracefullyClose: async () => { + if (options2.__testHookGracefullyClose) + await options2.__testHookGracefullyClose(); + this.attemptToGracefullyCloseBrowser(transport); + }, + onExit: (exitCode, signal) => { + readyState == null ? void 0 : readyState.onBrowserExit(); + if (browserProcess && browserProcess.onclose) + browserProcess.onclose(exitCode, signal); + } + }); + async function closeOrKill(timeout) { + let timer; + try { + await Promise.race([ + gracefullyClose(), + new Promise((resolve, reject) => timer = setTimeout(reject, timeout)) + ]); + } catch (ignored) { + await kill().catch((ignored2) => { + }); + } finally { + clearTimeout(timer); + } + } + browserProcess = { + onclose: void 0, + process: launchedProcess, + close: () => closeOrKill(options2.__testHookBrowserCloseTimeout || DEFAULT_PLAYWRIGHT_TIMEOUT), + kill + }; + progress2.cleanupWhenAborted(() => closeOrKill(progress2.timeUntilDeadline())); + const wsEndpoint = (_a2 = await (readyState == null ? void 0 : readyState.waitUntilReady())) == null ? void 0 : _a2.wsEndpoint; + if (options2.cdpPort !== void 0 || !this.supportsPipeTransport()) { + transport = await WebSocketTransport$1.connect(progress2, wsEndpoint); + } else { + const stdio = launchedProcess.stdio; + transport = new PipeTransport2(stdio[3], stdio[4]); + } + return { browserProcess, artifactsDir, userDataDir, transport }; + } + async _createArtifactDirs(options2) { + if (options2.downloadsPath) + await fs.promises.mkdir(options2.downloadsPath, { recursive: true }); + if (options2.tracesDir) + await fs.promises.mkdir(options2.tracesDir, { recursive: true }); + } + async connectOverCDP(metadata, endpointURL, options2) { + throw new Error("CDP connections are only supported by Chromium"); + } + async _launchWithSeleniumHub(progress2, hubUrl, options2) { + throw new Error("Connecting to SELENIUM_REMOTE_URL is only supported by Chromium"); + } + _validateLaunchOptions(options2) { + const { devtools = false } = options2; + let { headless = !devtools, downloadsPath, proxy } = options2; + if (debugMode()) + headless = false; + if (downloadsPath && !path.isAbsolute(downloadsPath)) + downloadsPath = path.join(process.cwd(), downloadsPath); + if (this.attribution.playwright.options.socksProxyPort) + proxy = { server: `socks5://127.0.0.1:${this.attribution.playwright.options.socksProxyPort}` }; + return { ...options2, devtools, headless, downloadsPath, proxy }; + } + _createUserDataDirArgMisuseError(userDataDirArg) { + switch (this.attribution.playwright.options.sdkLanguage) { + case "java": + return new Error(`Pass userDataDir parameter to 'BrowserType.launchPersistentContext(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`); + case "python": + return new Error(`Pass user_data_dir parameter to 'browser_type.launch_persistent_context(user_data_dir, **kwargs)' instead of specifying '${userDataDirArg}' argument`); + case "csharp": + return new Error(`Pass userDataDir parameter to 'BrowserType.LaunchPersistentContextAsync(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`); + default: + return new Error(`Pass userDataDir parameter to 'browserType.launchPersistentContext(userDataDir, options)' instead of specifying '${userDataDirArg}' argument`); + } + } + _rewriteStartupLog(error2) { + if (!isProtocolError(error2)) + return error2; + return this.doRewriteStartupLog(error2); + } + readyState(options2) { + return void 0; + } + async prepareUserDataDir(options2, userDataDir) { + } + supportsPipeTransport() { + return true; + } + getExecutableName(options2) { + return options2.channel || this._name; + } +}; +function copyTestHooks(from2, to) { + for (const [key2, value] of Object.entries(from2)) { + if (key2.startsWith("__testHook")) + to[key2] = value; + } +} +const kBrowserCloseMessageId$2 = 0; +class BidiConnection { + constructor(transport, onDisconnect, protocolLogger, browserLogsCollector) { + this._lastId = 0; + this._closed = false; + this._browsingContextToSession = /* @__PURE__ */ new Map(); + this._transport = transport; + this._onDisconnect = onDisconnect; + this._protocolLogger = protocolLogger; + this._browserLogsCollector = browserLogsCollector; + this.browserSession = new BidiSession(this, "", (message) => { + this.rawSend(message); + }); + this._transport.onmessage = this._dispatchMessage.bind(this); + this._transport.onclose = this._onClose.bind(this); + } + nextMessageId() { + return ++this._lastId; + } + rawSend(message) { + this._protocolLogger("send", message); + this._transport.send(message); + } + _dispatchMessage(message) { + var _a2; + this._protocolLogger("receive", message); + const object = message; + if (object.type === "event") { + let context; + if ("context" in object.params) + context = object.params.context; + else if (object.method === "log.entryAdded" || object.method === "script.message") + context = (_a2 = object.params.source) == null ? void 0 : _a2.context; + if (context) { + const session = this._browsingContextToSession.get(context); + if (session) { + session.dispatchMessage(message); + return; + } + } + } else if (message.id) { + for (const session of this._browsingContextToSession.values()) { + if (session.hasCallback(message.id)) { + session.dispatchMessage(message); + return; + } + } + } + this.browserSession.dispatchMessage(message); + } + _onClose(reason) { + this._closed = true; + this._transport.onmessage = void 0; + this._transport.onclose = void 0; + this._browserDisconnectedLogs = helper.formatBrowserLogs(this._browserLogsCollector.recentLogs(), reason); + this.browserSession.dispose(); + this._onDisconnect(); + } + isClosed() { + return this._closed; + } + close() { + if (!this._closed) + this._transport.close(); + } + createMainFrameBrowsingContextSession(bowsingContextId) { + const result = new BidiSession(this, bowsingContextId, (message) => this.rawSend(message)); + this._browsingContextToSession.set(bowsingContextId, result); + return result; + } +} +class BidiSession extends eventsExports.EventEmitter { + constructor(connection, sessionId, rawSend) { + super(); + this._disposed = false; + this._callbacks = /* @__PURE__ */ new Map(); + this._crashed = false; + this._browsingContexts = /* @__PURE__ */ new Set(); + this.setMaxListeners(0); + this.connection = connection; + this.sessionId = sessionId; + this._rawSend = rawSend; + this.on = super.on; + this.off = super.removeListener; + this.addListener = super.addListener; + this.removeListener = super.removeListener; + this.once = super.once; + } + addFrameBrowsingContext(context) { + this._browsingContexts.add(context); + this.connection._browsingContextToSession.set(context, this); + } + removeFrameBrowsingContext(context) { + this._browsingContexts.delete(context); + this.connection._browsingContextToSession.delete(context); + } + async send(method, params) { + if (this._crashed || this._disposed || this.connection._browserDisconnectedLogs) + throw new ProtocolError(this._crashed ? "crashed" : "closed", void 0, this.connection._browserDisconnectedLogs); + const id = this.connection.nextMessageId(); + const messageObj = { id, method, params }; + this._rawSend(messageObj); + return new Promise((resolve, reject) => { + this._callbacks.set(id, { resolve, reject, error: new ProtocolError("error", method) }); + }); + } + sendMayFail(method, params) { + return this.send(method, params).catch((error2) => debugLogger.log("error", error2)); + } + markAsCrashed() { + this._crashed = true; + } + isDisposed() { + return this._disposed; + } + dispose() { + this._disposed = true; + this.connection._browsingContextToSession.delete(this.sessionId); + for (const context of this._browsingContexts) + this.connection._browsingContextToSession.delete(context); + this._browsingContexts.clear(); + for (const callback of this._callbacks.values()) { + callback.error.type = this._crashed ? "crashed" : "closed"; + callback.error.logs = this.connection._browserDisconnectedLogs; + callback.reject(callback.error); + } + this._callbacks.clear(); + } + hasCallback(id) { + return this._callbacks.has(id); + } + dispatchMessage(message) { + const object = message; + if (object.id === kBrowserCloseMessageId$2) + return; + if (object.id && this._callbacks.has(object.id)) { + const callback = this._callbacks.get(object.id); + this._callbacks.delete(object.id); + if (object.type === "error") { + callback.error.setMessage(object.error + "\nMessage: " + object.message); + callback.reject(callback.error); + } else if (object.type === "success") { + callback.resolve(object.result); + } else { + callback.error.setMessage("Internal error, unexpected response type: " + JSON.stringify(object)); + callback.reject(callback.error); + } + } else if (object.id) ; + else { + Promise.resolve().then(() => this.emit(object.method, object.params)); + } + } +} +/** + * @license + * Copyright 2024 Google Inc. + * Modifications copyright (c) Microsoft Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ +var Session; +((Session2) => { + ((UserPromptHandlerType2) => { + UserPromptHandlerType2["Accept"] = "accept"; + UserPromptHandlerType2["Dismiss"] = "dismiss"; + UserPromptHandlerType2["Ignore"] = "ignore"; + })(Session2.UserPromptHandlerType || (Session2.UserPromptHandlerType = {})); +})(Session || (Session = {})); +var BrowsingContext; +((BrowsingContext2) => { + ((ReadinessState2) => { + ReadinessState2["None"] = "none"; + ReadinessState2["Interactive"] = "interactive"; + ReadinessState2["Complete"] = "complete"; + })(BrowsingContext2.ReadinessState || (BrowsingContext2.ReadinessState = {})); +})(BrowsingContext || (BrowsingContext = {})); +((BrowsingContext2) => { + ((UserPromptType2) => { + UserPromptType2["Alert"] = "alert"; + UserPromptType2["Beforeunload"] = "beforeunload"; + UserPromptType2["Confirm"] = "confirm"; + UserPromptType2["Prompt"] = "prompt"; + })(BrowsingContext2.UserPromptType || (BrowsingContext2.UserPromptType = {})); +})(BrowsingContext || (BrowsingContext = {})); +((BrowsingContext2) => { + ((CreateType2) => { + CreateType2["Tab"] = "tab"; + CreateType2["Window"] = "window"; + })(BrowsingContext2.CreateType || (BrowsingContext2.CreateType = {})); +})(BrowsingContext || (BrowsingContext = {})); +var Network$1; +((Network2) => { + ((SameSite2) => { + SameSite2["Strict"] = "strict"; + SameSite2["Lax"] = "lax"; + SameSite2["None"] = "none"; + })(Network2.SameSite || (Network2.SameSite = {})); +})(Network$1 || (Network$1 = {})); +((Network2) => { + ((InterceptPhase2) => { + InterceptPhase2["BeforeRequestSent"] = "beforeRequestSent"; + InterceptPhase2["ResponseStarted"] = "responseStarted"; + InterceptPhase2["AuthRequired"] = "authRequired"; + })(Network2.InterceptPhase || (Network2.InterceptPhase = {})); +})(Network$1 || (Network$1 = {})); +var Script; +((Script2) => { + ((ResultOwnership2) => { + ResultOwnership2["Root"] = "root"; + ResultOwnership2["None"] = "none"; + })(Script2.ResultOwnership || (Script2.ResultOwnership = {})); +})(Script || (Script = {})); +var Log; +((Log2) => { + ((Level2) => { + Level2["Debug"] = "debug"; + Level2["Info"] = "info"; + Level2["Warn"] = "warn"; + Level2["Error"] = "error"; + })(Log2.Level || (Log2.Level = {})); +})(Log || (Log = {})); +var Input; +((Input2) => { + ((PointerType2) => { + PointerType2["Mouse"] = "mouse"; + PointerType2["Pen"] = "pen"; + PointerType2["Touch"] = "touch"; + })(Input2.PointerType || (Input2.PointerType = {})); +})(Input || (Input = {})); +/** + * @license + * Copyright 2024 Google Inc. + * Modifications copyright (c) Microsoft Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ +var Permissions; +((Permissions2) => { + ((PermissionState2) => { + PermissionState2["Granted"] = "granted"; + PermissionState2["Denied"] = "denied"; + PermissionState2["Prompt"] = "prompt"; + })(Permissions2.PermissionState || (Permissions2.PermissionState = {})); +})(Permissions || (Permissions = {})); +class BidiNetworkManager { + constructor(bidiSession, page, onNavigationResponseStarted) { + this._userRequestInterceptionEnabled = false; + this._protocolRequestInterceptionEnabled = false; + this._session = bidiSession; + this._requests = /* @__PURE__ */ new Map(); + this._page = page; + this._onNavigationResponseStarted = onNavigationResponseStarted; + this._eventListeners = [ + eventsHelper.addEventListener(bidiSession, "network.beforeRequestSent", this._onBeforeRequestSent.bind(this)), + eventsHelper.addEventListener(bidiSession, "network.responseStarted", this._onResponseStarted.bind(this)), + eventsHelper.addEventListener(bidiSession, "network.responseCompleted", this._onResponseCompleted.bind(this)), + eventsHelper.addEventListener(bidiSession, "network.fetchError", this._onFetchError.bind(this)), + eventsHelper.addEventListener(bidiSession, "network.authRequired", this._onAuthRequired.bind(this)) + ]; + } + dispose() { + eventsHelper.removeEventListeners(this._eventListeners); + } + _onBeforeRequestSent(param) { + var _a2; + if (param.request.url.startsWith("data:")) + return; + const redirectedFrom = param.redirectCount ? this._requests.get(param.request.request) || null : null; + const frame = redirectedFrom ? redirectedFrom.request.frame() : param.context ? this._page.frameManager.frame(param.context) : null; + if (!frame) + return; + if (redirectedFrom) + this._requests.delete(redirectedFrom._id); + let route; + if (param.intercepts) { + if (redirectedFrom) { + let params = {}; + if ((_a2 = redirectedFrom._originalRequestRoute) == null ? void 0 : _a2._alreadyContinuedHeaders) + params = toBidiRequestHeaders(redirectedFrom._originalRequestRoute._alreadyContinuedHeaders ?? []); + this._session.sendMayFail("network.continueRequest", { + request: param.request.request, + ...params + }); + } else { + route = new BidiRouteImpl(this._session, param.request.request); + } + } + const request2 = new BidiRequest(frame, redirectedFrom, param, route); + this._requests.set(request2._id, request2); + this._page.frameManager.requestStarted(request2.request, route); + } + _onResponseStarted(params) { + const request2 = this._requests.get(params.request.request); + if (!request2) + return; + const getResponseBody = async () => { + throw new Error(`Response body is not available for requests in Bidi`); + }; + const timings = params.request.timings; + const startTime = timings.requestTime; + function relativeToStart(time) { + if (!time) + return -1; + return time - startTime; + } + const timing = { + startTime, + requestStart: relativeToStart(timings.requestStart), + responseStart: relativeToStart(timings.responseStart), + domainLookupStart: relativeToStart(timings.dnsStart), + domainLookupEnd: relativeToStart(timings.dnsEnd), + connectStart: relativeToStart(timings.connectStart), + secureConnectionStart: relativeToStart(timings.tlsStart), + connectEnd: relativeToStart(timings.connectEnd) + }; + const response2 = new Response$1(request2.request, params.response.status, params.response.statusText, fromBidiHeaders(params.response.headers), timing, getResponseBody, false); + response2._serverAddrFinished(); + response2._securityDetailsFinished(); + response2.setRawResponseHeaders(null); + response2.setResponseHeadersSize(params.response.headersSize); + this._page.frameManager.requestReceivedResponse(response2); + if (params.navigation) + this._onNavigationResponseStarted(params); + } + _onResponseCompleted(params) { + const request2 = this._requests.get(params.request.request); + if (!request2) + return; + const response2 = request2.request._existingResponse(); + response2.setTransferSize(params.response.bodySize); + response2.setEncodedBodySize(params.response.bodySize); + const isRedirected = response2.status() >= 300 && response2.status() <= 399; + const responseEndTime = params.request.timings.responseEnd - response2.timing().startTime; + if (isRedirected) { + response2._requestFinished(responseEndTime); + } else { + this._requests.delete(request2._id); + response2._requestFinished(responseEndTime); + } + response2._setHttpVersion(params.response.protocol); + this._page.frameManager.reportRequestFinished(request2.request, response2); + } + _onFetchError(params) { + const request2 = this._requests.get(params.request.request); + if (!request2) + return; + this._requests.delete(request2._id); + const response2 = request2.request._existingResponse(); + if (response2) { + response2.setTransferSize(null); + response2.setEncodedBodySize(null); + response2._requestFinished(-1); + } + request2.request._setFailureText(params.errorText); + this._page.frameManager.requestFailed(request2.request, params.errorText === "NS_BINDING_ABORTED"); + } + _onAuthRequired(params) { + var _a2; + const isBasic = (_a2 = params.response.authChallenges) == null ? void 0 : _a2.some((challenge) => challenge.scheme.startsWith("Basic")); + const credentials = this._page.browserContext._options.httpCredentials; + if (isBasic && credentials) { + this._session.sendMayFail("network.continueWithAuth", { + request: params.request.request, + action: "provideCredentials", + credentials: { + type: "password", + username: credentials.username, + password: credentials.password + } + }); + } else { + this._session.sendMayFail("network.continueWithAuth", { + request: params.request.request, + action: "default" + }); + } + } + async setRequestInterception(value) { + this._userRequestInterceptionEnabled = value; + await this._updateProtocolRequestInterception(); + } + async setCredentials(credentials) { + this._credentials = credentials; + await this._updateProtocolRequestInterception(); + } + async _updateProtocolRequestInterception(initial) { + const enabled = this._userRequestInterceptionEnabled || !!this._credentials; + if (enabled === this._protocolRequestInterceptionEnabled) + return; + this._protocolRequestInterceptionEnabled = enabled; + if (initial && !enabled) + return; + const cachePromise = this._session.send("network.setCacheBehavior", { cacheBehavior: enabled ? "bypass" : "default" }); + let interceptPromise = Promise.resolve(void 0); + if (enabled) { + interceptPromise = this._session.send("network.addIntercept", { + phases: [Network$1.InterceptPhase.AuthRequired, Network$1.InterceptPhase.BeforeRequestSent], + urlPatterns: [{ type: "pattern" }] + // urlPatterns: [{ type: 'string', pattern: '*' }], + }).then((r) => { + this._intercepId = r.intercept; + }); + } else if (this._intercepId) { + interceptPromise = this._session.send("network.removeIntercept", { intercept: this._intercepId }); + this._intercepId = void 0; + } + await Promise.all([cachePromise, interceptPromise]); + } +} +class BidiRequest { + constructor(frame, redirectedFrom, payload, route) { + this._id = payload.request.request; + if (redirectedFrom) + redirectedFrom._redirectedTo = this; + const postDataBuffer = null; + this.request = new Request$1( + frame._page.browserContext, + frame, + null, + redirectedFrom ? redirectedFrom.request : null, + payload.navigation ?? void 0, + payload.request.url, + "other", + payload.request.method, + postDataBuffer, + fromBidiHeaders(payload.request.headers) + ); + this.request.setRawRequestHeaders(null); + this.request._setBodySize(payload.request.bodySize || 0); + this._originalRequestRoute = route ?? (redirectedFrom == null ? void 0 : redirectedFrom._originalRequestRoute); + route == null ? void 0 : route._setRequest(this.request); + } + _finalRequest() { + let request2 = this; + while (request2._redirectedTo) + request2 = request2._redirectedTo; + return request2; + } +} +class BidiRouteImpl { + constructor(session, requestId) { + this._session = session; + this._requestId = requestId; + } + _setRequest(request2) { + this._request = request2; + } + async continue(overrides) { + let headers = overrides.headers || this._request.headers(); + if (overrides.postData && headers) { + headers = headers.map((header) => { + if (header.name.toLowerCase() === "content-length") + return { name: header.name, value: overrides.postData.byteLength.toString() }; + return header; + }); + } + this._alreadyContinuedHeaders = headers; + await this._session.sendMayFail("network.continueRequest", { + request: this._requestId, + url: overrides.url, + method: overrides.method, + ...toBidiRequestHeaders(this._alreadyContinuedHeaders), + body: overrides.postData ? { type: "base64", value: Buffer.from(overrides.postData).toString("base64") } : void 0 + }); + } + async fulfill(response2) { + const base64body = response2.isBase64 ? response2.body : Buffer.from(response2.body).toString("base64"); + await this._session.sendMayFail("network.provideResponse", { + request: this._requestId, + statusCode: response2.status, + reasonPhrase: statusText(response2.status), + ...toBidiResponseHeaders(response2.headers), + body: { type: "base64", value: base64body } + }); + } + async abort(errorCode) { + await this._session.sendMayFail("network.failRequest", { + request: this._requestId + }); + } +} +function fromBidiHeaders(bidiHeaders) { + const result = []; + for (const { name, value } of bidiHeaders) + result.push({ name, value: bidiBytesValueToString(value) }); + return result; +} +function toBidiRequestHeaders(allHeaders) { + const bidiHeaders = toBidiHeaders(allHeaders); + return { headers: bidiHeaders }; +} +function toBidiResponseHeaders(headers) { + const setCookieHeaders = headers.filter((h) => h.name.toLowerCase() === "set-cookie"); + const otherHeaders = headers.filter((h) => h.name.toLowerCase() !== "set-cookie"); + const rawCookies = setCookieHeaders.map((h) => parseRawCookie(h.value)); + const cookies = rawCookies.filter(Boolean).map((c) => { + return { + ...c, + value: { type: "string", value: c.value }, + sameSite: toBidiSameSite$1(c.sameSite) + }; + }); + return { cookies, headers: toBidiHeaders(otherHeaders) }; +} +function toBidiHeaders(headers) { + return headers.map(({ name, value }) => ({ name, value: { type: "string", value } })); +} +function bidiBytesValueToString(value) { + if (value.type === "string") + return value.value; + if (value.type === "base64") + return Buffer.from(value.type, "base64").toString("binary"); + return "unknown value type: " + value.type; +} +function toBidiSameSite$1(sameSite) { + if (!sameSite) + return void 0; + if (sameSite === "Strict") + return Network$1.SameSite.Strict; + if (sameSite === "Lax") + return Network$1.SameSite.Lax; + return Network$1.SameSite.None; +} +/** + * @license + * Copyright 2024 Google Inc. + * Modifications copyright (c) Microsoft Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ +class BidiDeserializer { + static deserialize(result) { + var _a2, _b2, _c2, _d2; + if (!result) + return void 0; + switch (result.type) { + case "array": + return (_a2 = result.value) == null ? void 0 : _a2.map((value) => { + return BidiDeserializer.deserialize(value); + }); + case "set": + return (_b2 = result.value) == null ? void 0 : _b2.reduce((acc, value) => { + return acc.add(BidiDeserializer.deserialize(value)); + }, /* @__PURE__ */ new Set()); + case "object": + return (_c2 = result.value) == null ? void 0 : _c2.reduce((acc, tuple) => { + const { key: key2, value } = BidiDeserializer._deserializeTuple(tuple); + acc[key2] = value; + return acc; + }, {}); + case "map": + return (_d2 = result.value) == null ? void 0 : _d2.reduce((acc, tuple) => { + const { key: key2, value } = BidiDeserializer._deserializeTuple(tuple); + return acc.set(key2, value); + }, /* @__PURE__ */ new Map()); + case "promise": + return {}; + case "regexp": + return new RegExp(result.value.pattern, result.value.flags); + case "date": + return new Date(result.value); + case "undefined": + return void 0; + case "null": + return null; + case "number": + return BidiDeserializer._deserializeNumber(result.value); + case "bigint": + return BigInt(result.value); + case "boolean": + return Boolean(result.value); + case "string": + return result.value; + } + throw new Error(`Deserialization of type ${result.type} not supported.`); + } + static _deserializeNumber(value) { + switch (value) { + case "-0": + return -0; + case "NaN": + return NaN; + case "Infinity": + return Infinity; + case "-Infinity": + return -Infinity; + default: + return value; + } + } + static _deserializeTuple([serializedKey, serializedValue]) { + const key2 = typeof serializedKey === "string" ? serializedKey : BidiDeserializer.deserialize(serializedKey); + const value = BidiDeserializer.deserialize(serializedValue); + return { key: key2, value }; + } +} +/** + * @license + * Copyright 2024 Google Inc. + * Modifications copyright (c) Microsoft Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ +class UnserializableError extends Error { +} +class BidiSerializer { + static serialize(arg) { + switch (typeof arg) { + case "symbol": + case "function": + throw new UnserializableError(`Unable to serializable ${typeof arg}`); + case "object": + return BidiSerializer._serializeObject(arg); + case "undefined": + return { + type: "undefined" + }; + case "number": + return BidiSerializer._serializeNumber(arg); + case "bigint": + return { + type: "bigint", + value: arg.toString() + }; + case "string": + return { + type: "string", + value: arg + }; + case "boolean": + return { + type: "boolean", + value: arg + }; + } + } + static _serializeNumber(arg) { + let value; + if (Object.is(arg, -0)) { + value = "-0"; + } else if (Object.is(arg, Infinity)) { + value = "Infinity"; + } else if (Object.is(arg, -Infinity)) { + value = "-Infinity"; + } else if (Object.is(arg, NaN)) { + value = "NaN"; + } else { + value = arg; + } + return { + type: "number", + value + }; + } + static _serializeObject(arg) { + if (arg === null) { + return { + type: "null" + }; + } else if (Array.isArray(arg)) { + const parsedArray = arg.map((subArg) => { + return BidiSerializer.serialize(subArg); + }); + return { + type: "array", + value: parsedArray + }; + } else if (isPlainObject(arg)) { + try { + JSON.stringify(arg); + } catch (error2) { + if (error2 instanceof TypeError && error2.message.startsWith("Converting circular structure to JSON")) { + error2.message += " Recursive objects are not allowed."; + } + throw error2; + } + const parsedObject = []; + for (const key2 in arg) { + parsedObject.push([BidiSerializer.serialize(key2), BidiSerializer.serialize(arg[key2])]); + } + return { + type: "object", + value: parsedObject + }; + } else if (isRegExp(arg)) { + return { + type: "regexp", + value: { + pattern: arg.source, + flags: arg.flags + } + }; + } else if (isDate(arg)) { + return { + type: "date", + value: arg.toISOString() + }; + } + throw new UnserializableError( + "Custom object serialization not possible. Use plain objects instead." + ); + } +} +const isPlainObject = (obj) => { + return typeof obj === "object" && (obj == null ? void 0 : obj.constructor) === Object; +}; +const isRegExp = (obj) => { + return typeof obj === "object" && (obj == null ? void 0 : obj.constructor) === RegExp; +}; +const isDate = (obj) => { + return typeof obj === "object" && (obj == null ? void 0 : obj.constructor) === Date; +}; +class BidiExecutionContext { + constructor(session, realmInfo) { + this._session = session; + if (realmInfo.type === "window") { + this._target = { + context: realmInfo.context, + sandbox: realmInfo.sandbox + }; + } else { + this._target = { + realm: realmInfo.realm + }; + } + } + async rawEvaluateJSON(expression) { + const response2 = await this._session.send("script.evaluate", { + expression, + target: this._target, + serializationOptions: { + maxObjectDepth: 10, + maxDomDepth: 10 + }, + awaitPromise: true, + userActivation: true + }); + if (response2.type === "success") + return BidiDeserializer.deserialize(response2.result); + if (response2.type === "exception") + throw new JavaScriptErrorInEvaluate(response2.exceptionDetails.text + "\nFull val: " + JSON.stringify(response2.exceptionDetails)); + throw new JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response2)); + } + async rawEvaluateHandle(context, expression) { + const response2 = await this._session.send("script.evaluate", { + expression, + target: this._target, + resultOwnership: Script.ResultOwnership.Root, + // Necessary for the handle to be returned. + serializationOptions: { maxObjectDepth: 0, maxDomDepth: 0 }, + awaitPromise: true, + userActivation: true + }); + if (response2.type === "success") { + if ("handle" in response2.result) + return createHandle$2(context, response2.result); + throw new JavaScriptErrorInEvaluate("Cannot get handle: " + JSON.stringify(response2.result)); + } + if (response2.type === "exception") + throw new JavaScriptErrorInEvaluate(response2.exceptionDetails.text + "\nFull val: " + JSON.stringify(response2.exceptionDetails)); + throw new JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response2)); + } + async evaluateWithArguments(functionDeclaration, returnByValue, utilityScript, values, handles) { + const response2 = await this._session.send("script.callFunction", { + functionDeclaration, + target: this._target, + arguments: [ + { handle: utilityScript._objectId }, + ...values.map(BidiSerializer.serialize), + ...handles.map((handle) => ({ handle: handle._objectId })) + ], + resultOwnership: returnByValue ? void 0 : Script.ResultOwnership.Root, + // Necessary for the handle to be returned. + serializationOptions: returnByValue ? {} : { maxObjectDepth: 0, maxDomDepth: 0 }, + awaitPromise: true, + userActivation: true + }); + if (response2.type === "exception") + throw new JavaScriptErrorInEvaluate(response2.exceptionDetails.text + "\nFull val: " + JSON.stringify(response2.exceptionDetails)); + if (response2.type === "success") { + if (returnByValue) + return parseEvaluationResultValue(BidiDeserializer.deserialize(response2.result)); + return createHandle$2(utilityScript._context, response2.result); + } + throw new JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response2)); + } + async getProperties(handle) { + const names = await handle.evaluate((object) => { + var _a2; + const names2 = []; + const descriptors = Object.getOwnPropertyDescriptors(object); + for (const name in descriptors) { + if ((_a2 = descriptors[name]) == null ? void 0 : _a2.enumerable) + names2.push(name); + } + return names2; + }); + const values = await Promise.all(names.map((name) => handle.evaluateHandle((object, name2) => object[name2], name))); + const map2 = /* @__PURE__ */ new Map(); + for (let i = 0; i < names.length; i++) + map2.set(names[i], values[i]); + return map2; + } + async releaseHandle(handle) { + if (!handle._objectId) + return; + await this._session.send("script.disown", { + target: this._target, + handles: [handle._objectId] + }); + } + async nodeIdForElementHandle(handle) { + const shared = await this._remoteValueForReference({ handle: handle._objectId }); + if (!("sharedId" in shared)) + throw new Error("Element is not a node"); + return { + sharedId: shared.sharedId + }; + } + async remoteObjectForNodeId(context, nodeId) { + const result = await this._remoteValueForReference(nodeId, true); + if (!("handle" in result)) + throw new Error("Can't get remote object for nodeId"); + return createHandle$2(context, result); + } + async contentFrameIdForFrame(handle) { + const contentWindow = await this._rawCallFunction("e => e.contentWindow", { handle: handle._objectId }); + if ((contentWindow == null ? void 0 : contentWindow.type) === "window") + return contentWindow.value.context; + return null; + } + async frameIdForWindowHandle(handle) { + if (!handle._objectId) + throw new Error("JSHandle is not a DOM node handle"); + const contentWindow = await this._remoteValueForReference({ handle: handle._objectId }); + if (contentWindow.type === "window") + return contentWindow.value.context; + return null; + } + async _remoteValueForReference(reference, createHandle2) { + return await this._rawCallFunction("e => e", reference, createHandle2); + } + async _rawCallFunction(functionDeclaration, arg, createHandle2) { + const response2 = await this._session.send("script.callFunction", { + functionDeclaration, + target: this._target, + arguments: [arg], + // "Root" is necessary for the handle to be returned. + resultOwnership: createHandle2 ? Script.ResultOwnership.Root : Script.ResultOwnership.None, + serializationOptions: { maxObjectDepth: 0, maxDomDepth: 0 }, + awaitPromise: true, + userActivation: true + }); + if (response2.type === "exception") + throw new JavaScriptErrorInEvaluate(response2.exceptionDetails.text + "\nFull val: " + JSON.stringify(response2.exceptionDetails)); + if (response2.type === "success") + return response2.result; + throw new JavaScriptErrorInEvaluate("Unexpected response type: " + JSON.stringify(response2)); + } +} +function renderPreview$2(remoteObject) { + if (remoteObject.type === "undefined") + return "undefined"; + if (remoteObject.type === "null") + return "null"; + if ("value" in remoteObject) + return String(remoteObject.value); + return `<${remoteObject.type}>`; +} +function remoteObjectValue(remoteObject) { + if (remoteObject.type === "undefined") + return void 0; + if (remoteObject.type === "null") + return null; + if (remoteObject.type === "number" && typeof remoteObject.value === "string") + return parseUnserializableValue(remoteObject.value); + if ("value" in remoteObject) + return remoteObject.value; + return void 0; +} +function createHandle$2(context, remoteObject) { + if (remoteObject.type === "node") { + assert(context instanceof FrameExecutionContext); + return new ElementHandle$1(context, remoteObject.handle); + } + const objectId = "handle" in remoteObject ? remoteObject.handle : void 0; + return new JSHandle$1(context, remoteObject.type, renderPreview$2(remoteObject), objectId, remoteObjectValue(remoteObject)); +} +/** + * @license + * Copyright 2024 Google Inc. + * Modifications copyright (c) Microsoft Corporation. + * SPDX-License-Identifier: Apache-2.0 + */ +const getBidiKeyValue = (keyName) => { + switch (keyName) { + case "\r": + case "\n": + keyName = "Enter"; + break; + } + if ([...keyName].length === 1) { + return keyName; + } + switch (keyName) { + case "Cancel": + return ""; + case "Help": + return ""; + case "Backspace": + return ""; + case "Tab": + return ""; + case "Clear": + return ""; + case "Enter": + return ""; + case "Shift": + case "ShiftLeft": + return ""; + case "Control": + case "ControlLeft": + return ""; + case "Alt": + case "AltLeft": + return ""; + case "Pause": + return ""; + case "Escape": + return ""; + case "PageUp": + return ""; + case "PageDown": + return ""; + case "End": + return ""; + case "Home": + return ""; + case "ArrowLeft": + return ""; + case "ArrowUp": + return ""; + case "ArrowRight": + return ""; + case "ArrowDown": + return ""; + case "Insert": + return ""; + case "Delete": + return ""; + case "NumpadEqual": + return ""; + case "Numpad0": + return ""; + case "Numpad1": + return ""; + case "Numpad2": + return ""; + case "Numpad3": + return ""; + case "Numpad4": + return ""; + case "Numpad5": + return ""; + case "Numpad6": + return ""; + case "Numpad7": + return ""; + case "Numpad8": + return ""; + case "Numpad9": + return ""; + case "NumpadMultiply": + return ""; + case "NumpadAdd": + return ""; + case "NumpadSubtract": + return ""; + case "NumpadDecimal": + return ""; + case "NumpadDivide": + return ""; + case "F1": + return ""; + case "F2": + return ""; + case "F3": + return ""; + case "F4": + return ""; + case "F5": + return ""; + case "F6": + return ""; + case "F7": + return ""; + case "F8": + return ""; + case "F9": + return ""; + case "F10": + return ""; + case "F11": + return ""; + case "F12": + return ""; + case "Meta": + case "MetaLeft": + return ""; + case "ShiftRight": + return ""; + case "ControlRight": + return ""; + case "AltRight": + return ""; + case "MetaRight": + return ""; + case "Space": + return " "; + case "Digit0": + return "0"; + case "Digit1": + return "1"; + case "Digit2": + return "2"; + case "Digit3": + return "3"; + case "Digit4": + return "4"; + case "Digit5": + return "5"; + case "Digit6": + return "6"; + case "Digit7": + return "7"; + case "Digit8": + return "8"; + case "Digit9": + return "9"; + case "KeyA": + return "a"; + case "KeyB": + return "b"; + case "KeyC": + return "c"; + case "KeyD": + return "d"; + case "KeyE": + return "e"; + case "KeyF": + return "f"; + case "KeyG": + return "g"; + case "KeyH": + return "h"; + case "KeyI": + return "i"; + case "KeyJ": + return "j"; + case "KeyK": + return "k"; + case "KeyL": + return "l"; + case "KeyM": + return "m"; + case "KeyN": + return "n"; + case "KeyO": + return "o"; + case "KeyP": + return "p"; + case "KeyQ": + return "q"; + case "KeyR": + return "r"; + case "KeyS": + return "s"; + case "KeyT": + return "t"; + case "KeyU": + return "u"; + case "KeyV": + return "v"; + case "KeyW": + return "w"; + case "KeyX": + return "x"; + case "KeyY": + return "y"; + case "KeyZ": + return "z"; + case "Semicolon": + return ";"; + case "Equal": + return "="; + case "Comma": + return ","; + case "Minus": + return "-"; + case "Period": + return "."; + case "Slash": + return "/"; + case "Backquote": + return "`"; + case "BracketLeft": + return "["; + case "Backslash": + return "\\"; + case "BracketRight": + return "]"; + case "Quote": + return '"'; + default: + throw new Error(`Unknown key: "${keyName}"`); + } +}; +let RawKeyboardImpl$2 = class RawKeyboardImpl2 { + constructor(session) { + this._session = session; + } + setSession(session) { + this._session = session; + } + async keydown(modifiers, keyName, description, autoRepeat) { + keyName = resolveSmartModifierString(keyName); + const actions = []; + actions.push({ type: "keyDown", value: getBidiKeyValue(keyName) }); + await this._performActions(actions); + } + async keyup(modifiers, keyName, description) { + keyName = resolveSmartModifierString(keyName); + const actions = []; + actions.push({ type: "keyUp", value: getBidiKeyValue(keyName) }); + await this._performActions(actions); + } + async sendText(text) { + const actions = []; + for (const char of text) { + const value = getBidiKeyValue(char); + actions.push({ type: "keyDown", value }); + actions.push({ type: "keyUp", value }); + } + await this._performActions(actions); + } + async _performActions(actions) { + await this._session.send("input.performActions", { + context: this._session.sessionId, + actions: [ + { + type: "key", + id: "pw_keyboard", + actions + } + ] + }); + } +}; +let RawMouseImpl$2 = class RawMouseImpl2 { + constructor(session) { + this._session = session; + } + async move(x, y, button, buttons, modifiers, forClick) { + await this._performActions([{ type: "pointerMove", x, y }]); + } + async down(x, y, button, buttons, modifiers, clickCount) { + await this._performActions([{ type: "pointerDown", button: toBidiButton(button) }]); + } + async up(x, y, button, buttons, modifiers, clickCount) { + await this._performActions([{ type: "pointerUp", button: toBidiButton(button) }]); + } + async wheel(x, y, buttons, modifiers, deltaX, deltaY) { + x = Math.floor(x); + y = Math.floor(y); + await this._session.send("input.performActions", { + context: this._session.sessionId, + actions: [ + { + type: "wheel", + id: "pw_mouse_wheel", + actions: [{ type: "scroll", x, y, deltaX, deltaY }] + } + ] + }); + } + async _performActions(actions) { + await this._session.send("input.performActions", { + context: this._session.sessionId, + actions: [ + { + type: "pointer", + id: "pw_mouse", + parameters: { + pointerType: Input.PointerType.Mouse + }, + actions + } + ] + }); + } +}; +let RawTouchscreenImpl$2 = class RawTouchscreenImpl2 { + constructor(session) { + this._session = session; + } + async tap(x, y, modifiers) { + } +}; +function toBidiButton(button) { + switch (button) { + case "left": + return 0; + case "right": + return 2; + case "middle": + return 1; + } + throw new Error("Unknown button: " + button); +} +const PagePaperFormats = { + letter: { width: 8.5, height: 11 }, + legal: { width: 8.5, height: 14 }, + tabloid: { width: 11, height: 17 }, + ledger: { width: 17, height: 11 }, + a0: { width: 33.1, height: 46.8 }, + a1: { width: 23.4, height: 33.1 }, + a2: { width: 16.54, height: 23.4 }, + a3: { width: 11.7, height: 16.54 }, + a4: { width: 8.27, height: 11.7 }, + a5: { width: 5.83, height: 8.27 }, + a6: { width: 4.13, height: 5.83 } +}; +const unitToPixels = { + "px": 1, + "in": 96, + "cm": 37.8, + "mm": 3.78 +}; +function convertPrintParameterToInches(text) { + if (text === void 0) + return void 0; + let unit = text.substring(text.length - 2).toLowerCase(); + let valueText = ""; + if (unitToPixels.hasOwnProperty(unit)) { + valueText = text.substring(0, text.length - 2); + } else { + unit = "px"; + valueText = text; + } + const value = Number(valueText); + assert(!isNaN(value), "Failed to parse parameter value: " + text); + const pixels = value * unitToPixels[unit]; + return pixels / 96; +} +class BidiPDF { + constructor(session) { + this._session = session; + } + async generate(options2) { + const { + scale = 1, + printBackground = false, + landscape = false, + pageRanges = "", + margin = {} + } = options2; + let paperWidth = 8.5; + let paperHeight = 11; + if (options2.format) { + const format = PagePaperFormats[options2.format.toLowerCase()]; + assert(format, "Unknown paper format: " + options2.format); + paperWidth = format.width; + paperHeight = format.height; + } else { + paperWidth = convertPrintParameterToInches(options2.width) || paperWidth; + paperHeight = convertPrintParameterToInches(options2.height) || paperHeight; + } + const { data: data2 } = await this._session.send("browsingContext.print", { + context: this._session.sessionId, + background: printBackground, + margin: { + bottom: convertPrintParameterToInches(margin.bottom) || 0, + left: convertPrintParameterToInches(margin.left) || 0, + right: convertPrintParameterToInches(margin.right) || 0, + top: convertPrintParameterToInches(margin.top) || 0 + }, + orientation: landscape ? "landscape" : "portrait", + page: { + width: paperWidth, + height: paperHeight + }, + pageRanges: pageRanges ? pageRanges.split(",").map((r) => r.trim()) : void 0, + scale + }); + return Buffer.from(data2, "base64"); + } +} +const UTILITY_WORLD_NAME$2 = "__playwright_utility_world__"; +const kPlaywrightBindingChannel = "playwrightChannel"; +class BidiPage { + constructor(browserContext, bidiSession, opener) { + this._sessionListeners = []; + this._initScriptIds = /* @__PURE__ */ new Map(); + this._session = bidiSession; + this._opener = opener; + this.rawKeyboard = new RawKeyboardImpl$2(bidiSession); + this.rawMouse = new RawMouseImpl$2(bidiSession); + this.rawTouchscreen = new RawTouchscreenImpl$2(bidiSession); + this._realmToContext = /* @__PURE__ */ new Map(); + this._page = new Page$1(this, browserContext); + this._browserContext = browserContext; + this._networkManager = new BidiNetworkManager(this._session, this._page, this._onNavigationResponseStarted.bind(this)); + this._pdf = new BidiPDF(this._session); + this._page.on(Page$1.Events.FrameDetached, (frame) => this._removeContextsForFrame(frame, false)); + this._sessionListeners = [ + eventsHelper.addEventListener(bidiSession, "script.realmCreated", this._onRealmCreated.bind(this)), + eventsHelper.addEventListener(bidiSession, "script.message", this._onScriptMessage.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.contextDestroyed", this._onBrowsingContextDestroyed.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.navigationStarted", this._onNavigationStarted.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.navigationAborted", this._onNavigationAborted.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.navigationFailed", this._onNavigationFailed.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.fragmentNavigated", this._onFragmentNavigated.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.domContentLoaded", this._onDomContentLoaded.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.load", this._onLoad.bind(this)), + eventsHelper.addEventListener(bidiSession, "browsingContext.userPromptOpened", this._onUserPromptOpened.bind(this)), + eventsHelper.addEventListener(bidiSession, "log.entryAdded", this._onLogEntryAdded.bind(this)) + ]; + this._initialize().then( + () => { + var _a2; + return this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page); + }, + (error2) => { + var _a2; + return this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page, error2); + } + ); + } + async _initialize() { + this._onFrameAttached(this._session.sessionId, null); + await Promise.all([ + this.updateHttpCredentials(), + this.updateRequestInterception(), + // If the page is created by the Playwright client's call, some initialization + // may be pending. Wait for it to complete before reporting the page as new. + // + // TODO: ideally we'd wait only for the commands that created this page, but currently + // there is no way in Bidi to track which command created this page. + this._browserContext.waitForBlockingPageCreations() + ]); + } + didClose() { + this._session.dispose(); + eventsHelper.removeEventListeners(this._sessionListeners); + this._page._didClose(); + } + _onFrameAttached(frameId, parentFrameId) { + return this._page.frameManager.frameAttached(frameId, parentFrameId); + } + _removeContextsForFrame(frame, notifyFrame) { + for (const [contextId, context] of this._realmToContext) { + if (context.frame === frame) { + this._realmToContext.delete(contextId); + if (notifyFrame) + frame._contextDestroyed(context); + } + } + } + _onRealmCreated(realmInfo) { + if (this._realmToContext.has(realmInfo.realm)) + return; + if (realmInfo.type !== "window") + return; + const frame = this._page.frameManager.frame(realmInfo.context); + if (!frame) + return; + let worldName; + if (!realmInfo.sandbox) { + worldName = "main"; + this._touchUtilityWorld(realmInfo.context); + } else if (realmInfo.sandbox === UTILITY_WORLD_NAME$2) { + worldName = "utility"; + } else { + return; + } + const delegate = new BidiExecutionContext(this._session, realmInfo); + const context = new FrameExecutionContext(delegate, frame, worldName); + frame._contextCreated(worldName, context); + this._realmToContext.set(realmInfo.realm, context); + } + async _touchUtilityWorld(context) { + await this._session.sendMayFail("script.evaluate", { + expression: "1 + 1", + target: { + context, + sandbox: UTILITY_WORLD_NAME$2 + }, + serializationOptions: { + maxObjectDepth: 10, + maxDomDepth: 10 + }, + awaitPromise: true, + userActivation: true + }); + } + _onRealmDestroyed(params) { + const context = this._realmToContext.get(params.realm); + if (!context) + return false; + this._realmToContext.delete(params.realm); + context.frame._contextDestroyed(context); + return true; + } + // TODO: route the message directly to the browser + _onBrowsingContextDestroyed(params) { + this._browserContext._browser._onBrowsingContextDestroyed(params); + } + _onNavigationStarted(params) { + const frameId = params.context; + this._page.frameManager.frameRequestedNavigation(frameId, params.navigation); + const url2 = params.url.toLowerCase(); + if (url2.startsWith("file:") || url2.startsWith("data:") || url2 === "about:blank") { + const frame = this._page.frameManager.frame(frameId); + if (frame) + this._page.frameManager.frameCommittedNewDocumentNavigation( + frameId, + params.url, + "", + params.navigation, + /* initial */ + false + ); + } + } + // TODO: there is no separate event for committed navigation, so we approximate it with responseStarted. + _onNavigationResponseStarted(params) { + const frameId = params.context; + const frame = this._page.frameManager.frame(frameId); + assert(frame); + this._page.frameManager.frameCommittedNewDocumentNavigation( + frameId, + params.response.url, + "", + params.navigation, + /* initial */ + false + ); + } + _onDomContentLoaded(params) { + const frameId = params.context; + this._page.frameManager.frameLifecycleEvent(frameId, "domcontentloaded"); + } + _onLoad(params) { + this._page.frameManager.frameLifecycleEvent(params.context, "load"); + } + _onNavigationAborted(params) { + this._page.frameManager.frameAbortedNavigation(params.context, "Navigation aborted", params.navigation || void 0); + } + _onNavigationFailed(params) { + this._page.frameManager.frameAbortedNavigation(params.context, "Navigation failed", params.navigation || void 0); + } + _onFragmentNavigated(params) { + this._page.frameManager.frameCommittedSameDocumentNavigation(params.context, params.url); + } + _onUserPromptOpened(event) { + this._page.browserContext.dialogManager.dialogDidOpen(new Dialog$1( + this._page, + event.type, + event.message, + async (accept, userText) => { + await this._session.send("browsingContext.handleUserPrompt", { context: event.context, accept, userText }); + }, + event.defaultValue + )); + } + _onLogEntryAdded(params) { + var _a2; + if (params.type !== "console") + return; + const entry = params; + const context = this._realmToContext.get(params.source.realm); + if (!context) + return; + const callFrame = (_a2 = params.stackTrace) == null ? void 0 : _a2.callFrames[0]; + const location2 = callFrame ?? { url: "", lineNumber: 1, columnNumber: 1 }; + this._page.addConsoleMessage(entry.method, entry.args.map((arg) => createHandle$2(context, arg)), location2, params.text || void 0); + } + async navigateFrame(frame, url2, referrer) { + const { navigation } = await this._session.send("browsingContext.navigate", { + context: frame._id, + url: url2 + }); + return { newDocumentId: navigation || void 0 }; + } + async updateExtraHTTPHeaders() { + } + async updateEmulateMedia() { + } + async updateUserAgent() { + } + async bringToFront() { + await this._session.send("browsingContext.activate", { + context: this._session.sessionId + }); + } + async updateEmulatedViewportSize() { + const options2 = this._browserContext._options; + const emulatedSize = this._page.emulatedSize(); + if (!emulatedSize) + return; + const viewportSize = emulatedSize.viewport; + await this._session.send("browsingContext.setViewport", { + context: this._session.sessionId, + viewport: { + width: viewportSize.width, + height: viewportSize.height + }, + devicePixelRatio: options2.deviceScaleFactor || 1 + }); + } + async updateRequestInterception() { + await this._networkManager.setRequestInterception(this._page.needsRequestInterception()); + } + async updateOffline() { + } + async updateHttpCredentials() { + await this._networkManager.setCredentials(this._browserContext._options.httpCredentials); + } + async updateFileChooserInterception() { + } + async reload() { + await this._session.send("browsingContext.reload", { + context: this._session.sessionId, + // ignoreCache: true, + wait: BrowsingContext.ReadinessState.Interactive + }); + } + async goBack() { + return await this._session.send("browsingContext.traverseHistory", { + context: this._session.sessionId, + delta: -1 + }).then(() => true).catch(() => false); + } + async goForward() { + return await this._session.send("browsingContext.traverseHistory", { + context: this._session.sessionId, + delta: 1 + }).then(() => true).catch(() => false); + } + async requestGC() { + throw new Error("Method not implemented."); + } + async _onScriptMessage(event) { + if (event.channel !== kPlaywrightBindingChannel) + return; + const pageOrError = await this._page.waitForInitializedOrError(); + if (pageOrError instanceof Error) + return; + const context = this._realmToContext.get(event.source.realm); + if (!context) + return; + if (event.data.type !== "string") + return; + await this._page.onBindingCalled(event.data.value, context); + } + async addInitScript(initScript) { + const { script } = await this._session.send("script.addPreloadScript", { + // TODO: remove function call from the source. + functionDeclaration: `() => { return ${initScript.source} }`, + // TODO: push to iframes? + contexts: [this._session.sessionId] + }); + this._initScriptIds.set(initScript, script); + } + async removeInitScripts(initScripts) { + const ids = []; + for (const script of initScripts) { + const id = this._initScriptIds.get(script); + if (id) + ids.push(id); + this._initScriptIds.delete(script); + } + await Promise.all(ids.map((script) => this._session.send("script.removePreloadScript", { script }))); + } + async closePage(runBeforeUnload) { + await this._session.send("browsingContext.close", { + context: this._session.sessionId, + promptUnload: runBeforeUnload + }); + } + async setBackgroundColor(color) { + } + async takeScreenshot(progress2, format, documentRect, viewportRect, quality, fitsViewport, scale) { + const rect = documentRect || viewportRect; + const { data: data2 } = await this._session.send("browsingContext.captureScreenshot", { + context: this._session.sessionId, + format: { + type: `image/${format === "png" ? "png" : "jpeg"}`, + quality: quality ? quality / 100 : 0.8 + }, + origin: documentRect ? "document" : "viewport", + clip: { + type: "box", + ...rect + } + }); + return Buffer.from(data2, "base64"); + } + async getContentFrame(handle) { + const executionContext = toBidiExecutionContext(handle._context); + const frameId = await executionContext.contentFrameIdForFrame(handle); + if (!frameId) + return null; + return this._page.frameManager.frame(frameId); + } + async getOwnerFrame(handle) { + const windowHandle = await handle.evaluateHandle((node2) => { + const doc = node2.ownerDocument ?? node2; + return doc.defaultView; + }); + if (!windowHandle) + return null; + const executionContext = toBidiExecutionContext(handle._context); + return executionContext.frameIdForWindowHandle(windowHandle); + } + async getBoundingBox(handle) { + const box = await handle.evaluate((element) => { + if (!(element instanceof Element)) + return null; + const rect = element.getBoundingClientRect(); + return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }; + }); + if (!box) + return null; + const position = await this._framePosition(handle._frame); + if (!position) + return null; + box.x += position.x; + box.y += position.y; + return box; + } + // TODO: move to Frame. + async _framePosition(frame) { + if (frame === this._page.mainFrame()) + return { x: 0, y: 0 }; + const element = await frame.frameElement(); + const box = await element.boundingBox(); + if (!box) + return null; + const style = await element.evaluateInUtility(([injected, iframe]) => injected.describeIFrameStyle(iframe), {}).catch((e) => "error:notconnected"); + if (style === "error:notconnected" || style === "transformed") + return null; + box.x += style.left; + box.y += style.top; + return box; + } + async scrollRectIntoViewIfNeeded(handle, rect) { + return await handle.evaluateInUtility(([injected, node2]) => { + node2.scrollIntoView({ + block: "center", + inline: "center", + behavior: "instant" + }); + }, null).then(() => "done").catch((e) => { + if (e instanceof Error && e.message.includes("Node is detached from document")) + return "error:notconnected"; + if (e instanceof Error && e.message.includes("Node does not have a layout object")) + return "error:notvisible"; + throw e; + }); + } + async setScreencastOptions(options2) { + } + rafCountForStablePosition() { + return 1; + } + async getContentQuads(handle) { + const quads = await handle.evaluateInUtility(([injected, node2]) => { + if (!node2.isConnected) + return "error:notconnected"; + const rects = node2.getClientRects(); + if (!rects) + return null; + return [...rects].map((rect) => [ + { x: rect.left, y: rect.top }, + { x: rect.right, y: rect.top }, + { x: rect.right, y: rect.bottom }, + { x: rect.left, y: rect.bottom } + ]); + }, null); + if (!quads || quads === "error:notconnected") + return quads; + const position = await this._framePosition(handle._frame); + if (!position) + return null; + quads.forEach((quad) => quad.forEach((point) => { + point.x += position.x; + point.y += position.y; + })); + return quads; + } + async setInputFilePaths(handle, paths) { + const fromContext = toBidiExecutionContext(handle._context); + await this._session.send("input.setFiles", { + context: this._session.sessionId, + element: await fromContext.nodeIdForElementHandle(handle), + files: paths + }); + } + async adoptElementHandle(handle, to) { + const fromContext = toBidiExecutionContext(handle._context); + const nodeId = await fromContext.nodeIdForElementHandle(handle); + const executionContext = toBidiExecutionContext(to); + return await executionContext.remoteObjectForNodeId(to, nodeId); + } + async getAccessibilityTree(needle) { + throw new Error("Method not implemented."); + } + async inputActionEpilogue() { + } + async resetForReuse() { + } + async pdf(options2) { + return this._pdf.generate(options2); + } + async getFrameElement(frame) { + const parent = frame.parentFrame(); + if (!parent) + throw new Error("Frame has been detached."); + const parentContext = await parent._mainContext(); + const list = await parentContext.evaluateHandle(() => { + return [...document.querySelectorAll("iframe,frame")]; + }); + const length = await list.evaluate((list2) => list2.length); + let foundElement = null; + for (let i = 0; i < length; i++) { + const element = await list.evaluateHandle((list2, i2) => list2[i2], i); + const candidate = await element.contentFrame(); + if (frame === candidate) { + foundElement = element; + break; + } else { + element.dispose(); + } + } + list.dispose(); + if (!foundElement) + throw new Error("Frame has been detached."); + return foundElement; + } + shouldToggleStyleSheetToSyncAnimations() { + return true; + } +} +function toBidiExecutionContext(executionContext) { + return executionContext.delegate; +} +class BidiBrowser extends Browser$1 { + constructor(parent, transport, options2) { + super(parent, options2); + this._contexts = /* @__PURE__ */ new Map(); + this._bidiPages = /* @__PURE__ */ new Map(); + this._connection = new BidiConnection(transport, this._onDisconnect.bind(this), options2.protocolLogger, options2.browserLogsCollector); + this._browserSession = this._connection.browserSession; + this._eventListeners = [ + eventsHelper.addEventListener(this._browserSession, "browsingContext.contextCreated", this._onBrowsingContextCreated.bind(this)), + eventsHelper.addEventListener(this._browserSession, "script.realmDestroyed", this._onScriptRealmDestroyed.bind(this)) + ]; + } + static async connect(parent, transport, options2) { + const browser2 = new BidiBrowser(parent, transport, options2); + if (options2.__testHookOnConnectToBrowser) + await options2.__testHookOnConnectToBrowser(); + let proxy; + if (options2.proxy) { + proxy = { + proxyType: "manual" + }; + const url2 = new URL(options2.proxy.server); + switch (url2.protocol) { + case "http:": + proxy.httpProxy = url2.host; + break; + case "https:": + proxy.httpsProxy = url2.host; + break; + case "socks4:": + proxy.socksProxy = url2.host; + proxy.socksVersion = 4; + break; + case "socks5:": + proxy.socksProxy = url2.host; + proxy.socksVersion = 5; + break; + default: + throw new Error("Invalid proxy server protocol: " + options2.proxy.server); + } + if (options2.proxy.bypass) + proxy.noProxy = options2.proxy.bypass.split(","); + } + browser2._bidiSessionInfo = await browser2._browserSession.send("session.new", { + capabilities: { + alwaysMatch: { + acceptInsecureCerts: false, + proxy, + unhandledPromptBehavior: { + default: Session.UserPromptHandlerType.Ignore + }, + webSocketUrl: true + } + } + }); + await browser2._browserSession.send("session.subscribe", { + events: [ + "browsingContext", + "network", + "log", + "script" + ] + }); + if (options2.persistent) { + const context = new BidiBrowserContext(browser2, void 0, options2.persistent); + browser2._defaultContext = context; + await context._initialize(); + const page = await browser2._defaultContext.doCreateNewPage(); + await page.waitForInitializedOrError(); + } + return browser2; + } + _onDisconnect() { + this._didClose(); + } + async doCreateNewContext(options2) { + const { userContext } = await this._browserSession.send("browser.createUserContext", { + acceptInsecureCerts: options2.ignoreHTTPSErrors + }); + const context = new BidiBrowserContext(this, userContext, options2); + await context._initialize(); + this._contexts.set(userContext, context); + return context; + } + contexts() { + return Array.from(this._contexts.values()); + } + version() { + return this._bidiSessionInfo.capabilities.browserVersion; + } + userAgent() { + return this._bidiSessionInfo.capabilities.userAgent; + } + isConnected() { + return !this._connection.isClosed(); + } + _onBrowsingContextCreated(event) { + if (event.parent) { + const parentFrameId = event.parent; + for (const page2 of this._bidiPages.values()) { + const parentFrame = page2._page.frameManager.frame(parentFrameId); + if (!parentFrame) + continue; + page2._session.addFrameBrowsingContext(event.context); + page2._page.frameManager.frameAttached(event.context, parentFrameId); + const frame = page2._page.frameManager.frame(event.context); + if (frame) + frame._url = event.url; + return; + } + return; + } + let context = this._contexts.get(event.userContext); + if (!context) + context = this._defaultContext; + if (!context) + return; + const session = this._connection.createMainFrameBrowsingContextSession(event.context); + const opener = event.originalOpener && this._bidiPages.get(event.originalOpener); + const page = new BidiPage(context, session, opener || null); + page._page.mainFrame()._url = event.url; + this._bidiPages.set(event.context, page); + } + _onBrowsingContextDestroyed(event) { + if (event.parent) { + this._browserSession.removeFrameBrowsingContext(event.context); + const parentFrameId = event.parent; + for (const page of this._bidiPages.values()) { + const parentFrame = page._page.frameManager.frame(parentFrameId); + if (!parentFrame) + continue; + page._page.frameManager.frameDetached(event.context); + return; + } + return; + } + const bidiPage = this._bidiPages.get(event.context); + if (!bidiPage) + return; + bidiPage.didClose(); + this._bidiPages.delete(event.context); + } + _onScriptRealmDestroyed(event) { + for (const page of this._bidiPages.values()) { + if (page._onRealmDestroyed(event)) + return; + } + } +} +class BidiBrowserContext extends BrowserContext$1 { + constructor(browser2, browserContextId, options2) { + super(browser2, options2, browserContextId); + this._originToPermissions = /* @__PURE__ */ new Map(); + this._blockingPageCreations = /* @__PURE__ */ new Set(); + this._initScriptIds = /* @__PURE__ */ new Map(); + this._authenticateProxyViaHeader(); + } + _bidiPages() { + return [...this._browser._bidiPages.values()].filter((bidiPage) => bidiPage._browserContext === this); + } + async _initialize() { + const promises2 = [ + super._initialize() + ]; + if (this._options.viewport) { + promises2.push(this._browser._browserSession.send("browsingContext.setViewport", { + viewport: { + width: this._options.viewport.width, + height: this._options.viewport.height + }, + devicePixelRatio: this._options.deviceScaleFactor || 1, + userContexts: [this._userContextId()] + })); + } + if (this._options.geolocation) + promises2.push(this.setGeolocation(this._options.geolocation)); + await Promise.all(promises2); + } + possiblyUninitializedPages() { + return this._bidiPages().map((bidiPage) => bidiPage._page); + } + async doCreateNewPage(markAsServerSideOnly) { + const promise = this._createNewPageImpl(markAsServerSideOnly); + if (markAsServerSideOnly) + this._blockingPageCreations.add(promise); + try { + return await promise; + } finally { + this._blockingPageCreations.delete(promise); + } + } + async _createNewPageImpl(markAsServerSideOnly) { + const { context } = await this._browser._browserSession.send("browsingContext.create", { + type: BrowsingContext.CreateType.Window, + userContext: this._browserContextId + }); + const page = this._browser._bidiPages.get(context)._page; + if (markAsServerSideOnly) + page.markAsServerSideOnly(); + return page; + } + async waitForBlockingPageCreations() { + await Promise.all([...this._blockingPageCreations].map((command2) => command2.catch(() => { + }))); + } + async doGetCookies(urls) { + const { cookies } = await this._browser._browserSession.send( + "storage.getCookies", + { partition: { type: "storageKey", userContext: this._browserContextId } } + ); + return filterCookies(cookies.map((c) => { + const copy = { + name: c.name, + value: bidiBytesValueToString(c.value), + domain: c.domain, + path: c.path, + httpOnly: c.httpOnly, + secure: c.secure, + expires: c.expiry ?? -1, + sameSite: c.sameSite ? fromBidiSameSite(c.sameSite) : "None" + }; + return copy; + }), urls); + } + async addCookies(cookies) { + cookies = rewriteCookies(cookies); + const promises2 = cookies.map((c) => { + const cookie = { + name: c.name, + value: { type: "string", value: c.value }, + domain: c.domain, + path: c.path, + httpOnly: c.httpOnly, + secure: c.secure, + sameSite: c.sameSite && toBidiSameSite(c.sameSite), + expiry: c.expires === -1 || c.expires === void 0 ? void 0 : Math.round(c.expires) + }; + return this._browser._browserSession.send( + "storage.setCookie", + { cookie, partition: { type: "storageKey", userContext: this._browserContextId } } + ); + }); + await Promise.all(promises2); + } + async doClearCookies() { + await this._browser._browserSession.send( + "storage.deleteCookies", + { partition: { type: "storageKey", userContext: this._browserContextId } } + ); + } + async doGrantPermissions(origin, permissions) { + const currentPermissions = this._originToPermissions.get(origin) || []; + const toGrant = permissions.filter((permission) => !currentPermissions.includes(permission)); + this._originToPermissions.set(origin, [...currentPermissions, ...toGrant]); + await Promise.all(toGrant.map((permission) => this._setPermission(origin, permission, Permissions.PermissionState.Granted))); + } + async doClearPermissions() { + const currentPermissions = [...this._originToPermissions.entries()]; + this._originToPermissions = /* @__PURE__ */ new Map(); + await Promise.all(currentPermissions.map(([origin, permissions]) => permissions.map( + (p) => this._setPermission(origin, p, Permissions.PermissionState.Prompt) + ))); + } + async _setPermission(origin, permission, state2) { + await this._browser._browserSession.send("permissions.setPermission", { + descriptor: { + name: permission + }, + state: state2, + origin, + userContext: this._browserContextId || "default" + }); + } + async setGeolocation(geolocation) { + verifyGeolocation(geolocation); + this._options.geolocation = geolocation; + await this._browser._browserSession.send("emulation.setGeolocationOverride", { + coordinates: geolocation ? { + latitude: geolocation.latitude, + longitude: geolocation.longitude, + accuracy: geolocation.accuracy + } : null, + userContexts: [this._browserContextId || "default"] + }); + } + async setExtraHTTPHeaders(headers) { + } + async setUserAgent(userAgent) { + } + async setOffline(offline) { + } + async doSetHTTPCredentials(httpCredentials) { + this._options.httpCredentials = httpCredentials; + for (const page of this.pages()) + await page.delegate.updateHttpCredentials(); + } + async doAddInitScript(initScript) { + const { script } = await this._browser._browserSession.send("script.addPreloadScript", { + // TODO: remove function call from the source. + functionDeclaration: `() => { return ${initScript.source} }`, + userContexts: [this._browserContextId || "default"] + }); + this._initScriptIds.set(initScript, script); + } + async doRemoveInitScripts(initScripts) { + const ids = []; + for (const script of initScripts) { + const id = this._initScriptIds.get(script); + if (id) + ids.push(id); + this._initScriptIds.delete(script); + } + await Promise.all(ids.map((script) => this._browser._browserSession.send("script.removePreloadScript", { script }))); + } + async doUpdateRequestInterception() { + } + async doExposePlaywrightBinding() { + const args = [{ + type: "channel", + value: { + channel: kPlaywrightBindingChannel, + ownership: Script.ResultOwnership.Root + } + }]; + const functionDeclaration = `function addMainBinding(callback) { globalThis['${PageBinding.kBindingName}'] = callback; }`; + const promises2 = []; + promises2.push(this._browser._browserSession.send("script.addPreloadScript", { + functionDeclaration, + arguments: args, + userContexts: [this._userContextId()] + })); + promises2.push(...this._bidiPages().map((page) => { + const realms = [...page._realmToContext].filter(([realm, context]) => context.world === "main").map(([realm, context]) => realm); + return Promise.all(realms.map((realm) => { + return page._session.send("script.callFunction", { + functionDeclaration, + arguments: args, + target: { realm }, + awaitPromise: false, + userActivation: false + }); + })); + })); + await Promise.all(promises2); + } + onClosePersistent() { + } + async clearCache() { + } + async doClose(reason) { + if (!this._browserContextId) { + await this._browser.close({ reason }); + return; + } + await this._browser._browserSession.send("browser.removeUserContext", { + userContext: this._browserContextId + }); + this._browser._contexts.delete(this._browserContextId); + } + async cancelDownload(uuid) { + } + _userContextId() { + if (this._browserContextId) + return this._browserContextId; + return "default"; + } +} +function fromBidiSameSite(sameSite) { + switch (sameSite) { + case "strict": + return "Strict"; + case "lax": + return "Lax"; + case "none": + return "None"; + } + return "None"; +} +function toBidiSameSite(sameSite) { + switch (sameSite) { + case "Strict": + return Network$1.SameSite.Strict; + case "Lax": + return Network$1.SameSite.Lax; + case "None": + return Network$1.SameSite.None; + } + return Network$1.SameSite.None; +} +var Network; +((Network2) => { + ((SameSite2) => { + SameSite2["Strict"] = "strict"; + SameSite2["Lax"] = "lax"; + SameSite2["None"] = "none"; + })(Network2.SameSite || (Network2.SameSite = {})); +})(Network || (Network = {})); +class BidiChromium extends BrowserType$1 { + constructor(parent) { + super(parent, "bidi"); + } + async connectToTransport(transport, options2, browserLogsCollector) { + const bidiTransport = await require("./bidiOverCdp").connectBidiOverCdp(transport); + transport[kBidiOverCdpWrapper] = bidiTransport; + try { + return BidiBrowser.connect(this.attribution.playwright, bidiTransport, options2); + } catch (e) { + if (browserLogsCollector.recentLogs().some((log) => log.includes("Failed to create a ProcessSingleton for your profile directory."))) { + throw new Error( + "Failed to create a ProcessSingleton for your profile directory. This usually means that the profile is already in use by another instance of Chromium." + ); + } + throw e; + } + } + doRewriteStartupLog(error2) { + if (!error2.logs) + return error2; + if (error2.logs.includes("Missing X server")) + error2.logs = "\n" + wrapInASCIIBox(kNoXServerRunningError, 1); + if (!error2.logs.includes("crbug.com/357670") && !error2.logs.includes("No usable sandbox!") && !error2.logs.includes("crbug.com/638180")) + return error2; + error2.logs = [ + `Chromium sandboxing failed!`, + `================================`, + `To avoid the sandboxing issue, do either of the following:`, + ` - (preferred): Configure your environment to support sandboxing`, + ` - (alternative): Launch Chromium without sandbox using 'chromiumSandbox: false' option`, + `================================`, + `` + ].join("\n"); + return error2; + } + amendEnvironment(env, userDataDir, executable, browserArguments) { + return env; + } + attemptToGracefullyCloseBrowser(transport) { + const bidiTransport = transport[kBidiOverCdpWrapper]; + if (bidiTransport) + transport = bidiTransport; + transport.send({ method: "browser.close", params: {}, id: kBrowserCloseMessageId$2 }); + } + supportsPipeTransport() { + return false; + } + defaultArgs(options2, isPersistent, userDataDir) { + const chromeArguments = this._innerDefaultArgs(options2); + chromeArguments.push(`--user-data-dir=${userDataDir}`); + chromeArguments.push("--remote-debugging-port=0"); + if (isPersistent) + chromeArguments.push("about:blank"); + else + chromeArguments.push("--no-startup-window"); + return chromeArguments; + } + readyState(options2) { + return new ChromiumReadyState$1(); + } + _innerDefaultArgs(options2) { + const { args = [] } = options2; + const userDataDirArg = args.find((arg) => arg.startsWith("--user-data-dir")); + if (userDataDirArg) + throw this._createUserDataDirArgMisuseError("--user-data-dir"); + if (args.find((arg) => arg.startsWith("--remote-debugging-pipe"))) + throw new Error("Playwright manages remote debugging connection itself."); + if (args.find((arg) => !arg.startsWith("-"))) + throw new Error("Arguments can not specify page to be opened"); + const chromeArguments = [...chromiumSwitches(options2.assistantMode)]; + if (os.platform() === "darwin") { + chromeArguments.push("--enable-use-zoom-for-dsf=false"); + if (options2.headless) + chromeArguments.push("--use-angle"); + } + if (options2.devtools) + chromeArguments.push("--auto-open-devtools-for-tabs"); + if (options2.headless) { + chromeArguments.push("--headless"); + chromeArguments.push( + "--hide-scrollbars", + "--mute-audio", + "--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4" + ); + } + if (options2.chromiumSandbox !== true) + chromeArguments.push("--no-sandbox"); + const proxy = options2.proxyOverride || options2.proxy; + if (proxy) { + const proxyURL = new URL(proxy.server); + const isSocks = proxyURL.protocol === "socks5:"; + if (isSocks && !this.attribution.playwright.options.socksProxyPort) { + chromeArguments.push(`--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE ${proxyURL.hostname}"`); + } + chromeArguments.push(`--proxy-server=${proxy.server}`); + const proxyBypassRules = []; + if (this.attribution.playwright.options.socksProxyPort) + proxyBypassRules.push("<-loopback>"); + if (proxy.bypass) + proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t)); + if (!define_process_env_default.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>")) + proxyBypassRules.push("<-loopback>"); + if (proxyBypassRules.length > 0) + chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`); + } + chromeArguments.push(...args); + return chromeArguments; + } +} +let ChromiumReadyState$1 = class ChromiumReadyState extends BrowserReadyState { + onBrowserOutput(message) { + if (message.includes("Failed to create a ProcessSingleton for your profile directory.")) { + this._wsEndpoint.reject(new Error("Failed to create a ProcessSingleton for your profile directory. This usually means that the profile is already in use by another instance of Chromium.")); + } + const match = message.match(/DevTools listening on (.*)/); + if (match) + this._wsEndpoint.resolve(match[1]); + } +}; +const kBidiOverCdpWrapper = Symbol("kBidiConnectionWrapper"); +/** + * @license + * Copyright 2023 Google Inc. + * SPDX-License-Identifier: Apache-2.0 + */ +async function createProfile(options2) { + if (!fs.existsSync(options2.path)) { + await fs.promises.mkdir(options2.path, { + recursive: true + }); + } + await writePreferences({ + preferences: { + ...defaultProfilePreferences(options2.preferences), + ...options2.preferences + }, + path: options2.path + }); +} +function defaultProfilePreferences(extraPrefs) { + const server = "dummy.test"; + const defaultPrefs = { + // Make sure Shield doesn't hit the network. + "app.normandy.api_url": "", + // Disable Firefox old build background check + "app.update.checkInstallTime": false, + // Disable automatically upgrading Firefox + "app.update.disabledForTesting": true, + // Increase the APZ content response timeout to 1 minute + "apz.content_response_timeout": 6e4, + // Prevent various error message on the console + // jest-puppeteer asserts that no error message is emitted by the console + "browser.contentblocking.features.standard": "-tp,tpPrivate,cookieBehavior0,-cm,-fp", + // Enable the dump function: which sends messages to the system + // console + // https://bugzilla.mozilla.org/show_bug.cgi?id=1543115 + "browser.dom.window.dump.enabled": true, + // Make sure newtab weather doesn't hit the network to retrieve weather data. + "browser.newtabpage.activity-stream.discoverystream.region-weather-config": "", + // Make sure newtab wallpapers don't hit the network to retrieve wallpaper data. + "browser.newtabpage.activity-stream.newtabWallpapers.enabled": false, + "browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled": false, + // Make sure Topsites doesn't hit the network to retrieve sponsored tiles. + "browser.newtabpage.activity-stream.showSponsoredTopSites": false, + // Disable topstories + "browser.newtabpage.activity-stream.feeds.system.topstories": false, + // Always display a blank page + "browser.newtabpage.enabled": false, + // Background thumbnails in particular cause grief: and disabling + // thumbnails in general cannot hurt + "browser.pagethumbnails.capturing_disabled": true, + // Disable safebrowsing components. + "browser.safebrowsing.blockedURIs.enabled": false, + "browser.safebrowsing.downloads.enabled": false, + "browser.safebrowsing.malware.enabled": false, + "browser.safebrowsing.phishing.enabled": false, + // Disable updates to search engines. + "browser.search.update": false, + // Do not restore the last open set of tabs if the browser has crashed + "browser.sessionstore.resume_from_crash": false, + // Skip check for default browser on startup + "browser.shell.checkDefaultBrowser": false, + // Disable newtabpage + "browser.startup.homepage": "about:blank", + // Do not redirect user when a milstone upgrade of Firefox is detected + "browser.startup.homepage_override.mstone": "ignore", + // Start with a blank page about:blank + "browser.startup.page": 0, + // Do not allow background tabs to be zombified on Android: otherwise for + // tests that open additional tabs: the test harness tab itself might get + // unloaded + "browser.tabs.disableBackgroundZombification": false, + // Do not warn when closing all other open tabs + "browser.tabs.warnOnCloseOtherTabs": false, + // Do not warn when multiple tabs will be opened + "browser.tabs.warnOnOpen": false, + // Do not automatically offer translations, as tests do not expect this. + "browser.translations.automaticallyPopup": false, + // Disable the UI tour. + "browser.uitour.enabled": false, + // Turn off search suggestions in the location bar so as not to trigger + // network connections. + "browser.urlbar.suggest.searches": false, + // Disable first run splash page on Windows 10 + "browser.usedOnWindows10.introURL": "", + // Do not warn on quitting Firefox + "browser.warnOnQuit": false, + // Defensively disable data reporting systems + "datareporting.healthreport.documentServerURI": `http://${server}/dummy/healthreport/`, + "datareporting.healthreport.logging.consoleEnabled": false, + "datareporting.healthreport.service.enabled": false, + "datareporting.healthreport.service.firstRun": false, + "datareporting.healthreport.uploadEnabled": false, + // Do not show datareporting policy notifications which can interfere with tests + "datareporting.policy.dataSubmissionEnabled": false, + "datareporting.policy.dataSubmissionPolicyBypassNotification": true, + // DevTools JSONViewer sometimes fails to load dependencies with its require.js. + // This doesn't affect Puppeteer but spams console (Bug 1424372) + "devtools.jsonview.enabled": false, + // Disable popup-blocker + "dom.disable_open_during_load": false, + // Enable the support for File object creation in the content process + // Required for |Page.setFileInputFiles| protocol method. + "dom.file.createInChild": true, + // Disable the ProcessHangMonitor + "dom.ipc.reportProcessHangs": false, + // Disable slow script dialogues + "dom.max_chrome_script_run_time": 0, + "dom.max_script_run_time": 0, + // Disable background timer throttling to allow tests to run in parallel + // without a decrease in performance. + "dom.min_background_timeout_value": 0, + "dom.min_background_timeout_value_without_budget_throttling": 0, + "dom.timeout.enable_budget_timer_throttling": false, + // Disable HTTPS-First upgrades + "dom.security.https_first": false, + // Only load extensions from the application and user profile + // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION + "extensions.autoDisableScopes": 0, + "extensions.enabledScopes": 5, + // Disable metadata caching for installed add-ons by default + "extensions.getAddons.cache.enabled": false, + // Disable installing any distribution extensions or add-ons. + "extensions.installDistroAddons": false, + // Disabled screenshots extension + "extensions.screenshots.disabled": true, + // Turn off extension updates so they do not bother tests + "extensions.update.enabled": false, + // Turn off extension updates so they do not bother tests + "extensions.update.notifyUser": false, + // Make sure opening about:addons will not hit the network + "extensions.webservice.discoverURL": `http://${server}/dummy/discoveryURL`, + // Allow the application to have focus even it runs in the background + "focusmanager.testmode": true, + // Disable useragent updates + "general.useragent.updates.enabled": false, + // Always use network provider for geolocation tests so we bypass the + // macOS dialog raised by the corelocation provider + "geo.provider.testing": true, + // Do not scan Wifi + "geo.wifi.scan": false, + // No hang monitor + "hangmonitor.timeout": 0, + // Show chrome errors and warnings in the error console + "javascript.options.showInConsole": true, + // Do not throttle rendering (requestAnimationFrame) in background tabs + "layout.testing.top-level-always-active": true, + // Disable download and usage of OpenH264: and Widevine plugins + "media.gmp-manager.updateEnabled": false, + // Disable the GFX sanity window + "media.sanity-test.disabled": true, + // Disable connectivity service pings + "network.connectivity-service.enabled": false, + // Disable experimental feature that is only available in Nightly + "network.cookie.sameSite.laxByDefault": false, + // Do not prompt for temporary redirects + "network.http.prompt-temp-redirect": false, + // Disable speculative connections so they are not reported as leaking + // when they are hanging around + "network.http.speculative-parallel-limit": 0, + // Do not automatically switch between offline and online + "network.manage-offline-status": false, + // Make sure SNTP requests do not hit the network + "network.sntp.pools": server, + // Disable Flash. + "plugin.state.flash": 0, + "privacy.trackingprotection.enabled": false, + // Can be removed once Firefox 89 is no longer supported + // https://bugzilla.mozilla.org/show_bug.cgi?id=1710839 + "remote.enabled": true, + // Don't do network connections for mitm priming + "security.certerrors.mitm.priming.enabled": false, + // Local documents have access to all other local documents, + // including directory listings + "security.fileuri.strict_origin_policy": false, + // Do not wait for the notification button security delay + "security.notification_enable_delay": 0, + // Do not automatically fill sign-in forms with known usernames and + // passwords + "signon.autofillForms": false, + // Disable password capture, so that tests that include forms are not + // influenced by the presence of the persistent doorhanger notification + "signon.rememberSignons": false, + // Disable first-run welcome page + "startup.homepage_welcome_url": "about:blank", + // Disable first-run welcome page + "startup.homepage_welcome_url.additional": "", + // Disable browser animations (tabs, fullscreen, sliding alerts) + "toolkit.cosmeticAnimations.enabled": false, + // Prevent starting into safe mode after application crashes + "toolkit.startup.max_resumed_crashes": -1 + }; + return Object.assign(defaultPrefs, extraPrefs); +} +async function writePreferences(options2) { + const prefsPath = path.join(options2.path, "prefs.js"); + const lines = Object.entries(options2.preferences).map(([key2, value]) => { + return `user_pref(${JSON.stringify(key2)}, ${JSON.stringify(value)});`; + }); + const result = await Promise.allSettled([ + fs.promises.writeFile(path.join(options2.path, "user.js"), lines.join("\n")), + // Create a backup of the preferences file if it already exitsts. + fs.promises.access(prefsPath, fs.constants.F_OK).then( + async () => { + await fs.promises.copyFile( + prefsPath, + path.join(options2.path, "prefs.js.playwright") + ); + }, + // Swallow only if file does not exist + () => { + } + ) + ]); + for (const command2 of result) { + if (command2.status === "rejected") { + throw command2.reason; + } + } +} +class BidiFirefox extends BrowserType$1 { + constructor(parent) { + super(parent, "bidi"); + } + async connectToTransport(transport, options2) { + return BidiBrowser.connect(this.attribution.playwright, transport, options2); + } + doRewriteStartupLog(error2) { + if (!error2.logs) + return error2; + if (error2.logs.includes(`as root in a regular user's session is not supported.`)) + error2.logs = "\n" + wrapInASCIIBox(`Firefox is unable to launch if the $HOME folder isn't owned by the current user. +Workaround: Set the HOME=/root environment variable${define_process_env_default.GITHUB_ACTION ? " in your GitHub Actions workflow file" : ""} when running Playwright.`, 1); + if (error2.logs.includes("no DISPLAY environment variable specified")) + error2.logs = "\n" + wrapInASCIIBox(kNoXServerRunningError, 1); + return error2; + } + amendEnvironment(env, userDataDir, executable, browserArguments) { + if (!path.isAbsolute(os.homedir())) + throw new Error(`Cannot launch Firefox with relative home directory. Did you set ${os.platform() === "win32" ? "USERPROFILE" : "HOME"} to a relative path?`); + env = { + ...env, + "MOZ_CRASHREPORTER": "1", + "MOZ_CRASHREPORTER_NO_REPORT": "1", + "MOZ_CRASHREPORTER_SHUTDOWN": "1" + }; + if (os.platform() === "linux") { + return { ...env, SNAP_NAME: void 0, SNAP_INSTANCE_NAME: void 0 }; + } + return env; + } + attemptToGracefullyCloseBrowser(transport) { + transport.send({ method: "browser.close", params: {}, id: kBrowserCloseMessageId$2 }); + } + supportsPipeTransport() { + return false; + } + async prepareUserDataDir(options2, userDataDir) { + await createProfile({ + path: userDataDir, + preferences: options2.firefoxUserPrefs || {} + }); + } + defaultArgs(options2, isPersistent, userDataDir) { + const { args = [], headless } = options2; + const userDataDirArg = args.find((arg) => arg.startsWith("-profile") || arg.startsWith("--profile")); + if (userDataDirArg) + throw this._createUserDataDirArgMisuseError("--profile"); + const firefoxArguments = ["--remote-debugging-port=0"]; + if (headless) + firefoxArguments.push("--headless"); + else + firefoxArguments.push("--foreground"); + firefoxArguments.push(`--profile`, userDataDir); + firefoxArguments.push(...args); + return firefoxArguments; + } + readyState(options2) { + return new FirefoxReadyState(); + } +} +class FirefoxReadyState extends BrowserReadyState { + onBrowserOutput(message) { + const match = message.match(/WebDriver BiDi listening on (ws:\/\/.*)$/); + if (match) + this._wsEndpoint.resolve(match[1] + "/session"); + } +} +const kBindingName = "__pw_devtools__"; +class CRDevTools { + constructor(preferencesPath) { + this._preferencesPath = preferencesPath; + this._savePromise = Promise.resolve(); + } + install(session) { + session.on("Runtime.bindingCalled", async (event) => { + if (event.name !== kBindingName) + return; + const parsed = JSON.parse(event.payload); + let result = void 0; + if (this.__testHookOnBinding) + this.__testHookOnBinding(parsed); + if (parsed.method === "getPreferences") { + if (this._prefs === void 0) { + try { + const json = await fs.promises.readFile(this._preferencesPath, "utf8"); + this._prefs = JSON.parse(json); + } catch (e) { + this._prefs = {}; + } + } + result = this._prefs; + } else if (parsed.method === "setPreference") { + this._prefs[parsed.params[0]] = parsed.params[1]; + this._save(); + } else if (parsed.method === "removePreference") { + delete this._prefs[parsed.params[0]]; + this._save(); + } else if (parsed.method === "clearPreferences") { + this._prefs = {}; + this._save(); + } + session.send("Runtime.evaluate", { + expression: `window.DevToolsAPI.embedderMessageAck(${parsed.id}, ${JSON.stringify(result)})`, + contextId: event.executionContextId + }).catch((e) => null); + }); + Promise.all([ + session.send("Runtime.enable"), + session.send("Runtime.addBinding", { name: kBindingName }), + session.send("Page.enable"), + session.send("Page.addScriptToEvaluateOnNewDocument", { source: ` + (() => { + const init = () => { + // Lazy init happens when InspectorFrontendHost is initialized. + // At this point DevToolsHost is ready to be used. + const host = window.DevToolsHost; + const old = host.sendMessageToEmbedder.bind(host); + host.sendMessageToEmbedder = message => { + if (['getPreferences', 'setPreference', 'removePreference', 'clearPreferences'].includes(JSON.parse(message).method)) + window.${kBindingName}(message); + else + old(message); + }; + }; + let value; + Object.defineProperty(window, 'InspectorFrontendHost', { + configurable: true, + enumerable: true, + get() { return value; }, + set(v) { value = v; init(); }, + }); + })() + ` }), + session.send("Runtime.runIfWaitingForDebugger") + ]).catch((e) => null); + } + _save() { + this._savePromise = this._savePromise.then(async () => { + await fs.promises.writeFile(this._preferencesPath, JSON.stringify(this._prefs)).catch((e) => null); + }); + } +} +const ARTIFACTS_FOLDER = path.join(os.tmpdir(), "playwright-artifacts-"); +class Chromium extends BrowserType$1 { + constructor(parent) { + super(parent, "chromium"); + if (debugMode()) + this._devtools = this._createDevTools(); + } + async connectOverCDP(metadata, endpointURL, options2) { + const controller = new ProgressController(metadata, this); + controller.setLogName("browser"); + return controller.run(async (progress2) => { + return await this._connectOverCDPInternal(progress2, endpointURL, options2); + }, options2.timeout); + } + async _connectOverCDPInternal(progress2, endpointURL, options2, onClose) { + let headersMap; + if (options2.headers) + headersMap = headersArrayToObject(options2.headers, false); + if (!headersMap) + headersMap = { "User-Agent": getUserAgent() }; + else if (headersMap && !Object.keys(headersMap).some((key2) => key2.toLowerCase() === "user-agent")) + headersMap["User-Agent"] = getUserAgent(); + const artifactsDir = await fs.promises.mkdtemp(ARTIFACTS_FOLDER); + const wsEndpoint = await urlToWSEndpoint(progress2, endpointURL, headersMap); + progress2.throwIfAborted(); + const chromeTransport = await WebSocketTransport$1.connect(progress2, wsEndpoint, { headers: headersMap }); + const cleanedUp = new ManualPromise(); + const doCleanup = async () => { + await removeFolders([artifactsDir]); + await (onClose == null ? void 0 : onClose()); + cleanedUp.resolve(); + }; + const doClose = async () => { + await chromeTransport.closeAndWait(); + await cleanedUp; + }; + const browserProcess = { close: doClose, kill: doClose }; + const persistent = { noDefaultViewport: true }; + const browserOptions = { + slowMo: options2.slowMo, + name: "chromium", + isChromium: true, + persistent, + browserProcess, + protocolLogger: helper.debugProtocolLogger(), + browserLogsCollector: new RecentLogsCollector(), + artifactsDir, + downloadsPath: options2.downloadsPath || artifactsDir, + tracesDir: options2.tracesDir || artifactsDir, + originalLaunchOptions: { timeout: options2.timeout } + }; + validateBrowserContextOptions(persistent, browserOptions); + progress2.throwIfAborted(); + const browser2 = await CRBrowser.connect(this.attribution.playwright, chromeTransport, browserOptions); + browser2._isCollocatedWithServer = false; + browser2.on(Browser$1.Events.Disconnected, doCleanup); + return browser2; + } + _createDevTools() { + const directory = registry.findExecutable("chromium").directory; + return directory ? new CRDevTools(path.join(directory, "devtools-preferences.json")) : void 0; + } + async connectToTransport(transport, options2, browserLogsCollector) { + let devtools = this._devtools; + if (options2.__testHookForDevTools) { + devtools = this._createDevTools(); + await options2.__testHookForDevTools(devtools); + } + try { + return await CRBrowser.connect(this.attribution.playwright, transport, options2, devtools); + } catch (e) { + if (browserLogsCollector.recentLogs().some((log) => log.includes("Failed to create a ProcessSingleton for your profile directory."))) { + throw new Error( + "Failed to create a ProcessSingleton for your profile directory. This usually means that the profile is already in use by another instance of Chromium." + ); + } + throw e; + } + } + doRewriteStartupLog(error2) { + if (!error2.logs) + return error2; + if (error2.logs.includes("Missing X server")) + error2.logs = "\n" + wrapInASCIIBox(kNoXServerRunningError, 1); + if (!error2.logs.includes("crbug.com/357670") && !error2.logs.includes("No usable sandbox!") && !error2.logs.includes("crbug.com/638180")) + return error2; + error2.logs = [ + `Chromium sandboxing failed!`, + `================================`, + `To avoid the sandboxing issue, do either of the following:`, + ` - (preferred): Configure your environment to support sandboxing`, + ` - (alternative): Launch Chromium without sandbox using 'chromiumSandbox: false' option`, + `================================`, + `` + ].join("\n"); + return error2; + } + amendEnvironment(env, userDataDir, executable, browserArguments) { + return env; + } + attemptToGracefullyCloseBrowser(transport) { + const message = { method: "Browser.close", id: kBrowserCloseMessageId$3, params: {} }; + transport.send(message); + } + async _launchWithSeleniumHub(progress2, hubUrl, options2) { + await this._createArtifactDirs(options2); + if (!hubUrl.endsWith("/")) + hubUrl = hubUrl + "/"; + const args = this._innerDefaultArgs(options2); + args.push("--remote-debugging-port=0"); + const isEdge = options2.channel && options2.channel.startsWith("msedge"); + let desiredCapabilities = { + "browserName": isEdge ? "MicrosoftEdge" : "chrome", + [isEdge ? "ms:edgeOptions" : "goog:chromeOptions"]: { args } + }; + if (define_process_env_default.SELENIUM_REMOTE_CAPABILITIES) { + const remoteCapabilities = parseSeleniumRemoteParams({ name: "capabilities", value: define_process_env_default.SELENIUM_REMOTE_CAPABILITIES }, progress2); + if (remoteCapabilities) + desiredCapabilities = { ...desiredCapabilities, ...remoteCapabilities }; + } + let headers = {}; + if (define_process_env_default.SELENIUM_REMOTE_HEADERS) { + const remoteHeaders = parseSeleniumRemoteParams({ name: "headers", value: define_process_env_default.SELENIUM_REMOTE_HEADERS }, progress2); + if (remoteHeaders) + headers = remoteHeaders; + } + progress2.log(` connecting to ${hubUrl}`); + const response2 = await fetchData({ + url: hubUrl + "session", + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8", + ...headers + }, + data: JSON.stringify({ + capabilities: { alwaysMatch: desiredCapabilities } + }), + timeout: progress2.timeUntilDeadline() + }, seleniumErrorHandler); + const value = JSON.parse(response2).value; + const sessionId = value.sessionId; + progress2.log(` connected to sessionId=${sessionId}`); + const disconnectFromSelenium = async () => { + progress2.log(` disconnecting from sessionId=${sessionId}`); + await fetchData({ + url: hubUrl + "session/" + sessionId, + method: "DELETE", + headers + }).catch((error2) => progress2.log(`: ${error2}`)); + progress2.log(` disconnected from sessionId=${sessionId}`); + gracefullyCloseSet.delete(disconnectFromSelenium); + }; + gracefullyCloseSet.add(disconnectFromSelenium); + try { + const capabilities = value.capabilities; + let endpointURL; + if (capabilities["se:cdp"]) { + progress2.log(` using selenium v4`); + const endpointURLString = addProtocol(capabilities["se:cdp"]); + endpointURL = new URL(endpointURLString); + if (endpointURL.hostname === "localhost" || endpointURL.hostname === "127.0.0.1") + endpointURL.hostname = new URL(hubUrl).hostname; + progress2.log(` retrieved endpoint ${endpointURL.toString()} for sessionId=${sessionId}`); + } else { + progress2.log(` using selenium v3`); + const maybeChromeOptions = capabilities["goog:chromeOptions"]; + const chromeOptions = maybeChromeOptions && typeof maybeChromeOptions === "object" ? maybeChromeOptions : void 0; + const debuggerAddress = chromeOptions && typeof chromeOptions.debuggerAddress === "string" ? chromeOptions.debuggerAddress : void 0; + const chromeOptionsURL = typeof maybeChromeOptions === "string" ? maybeChromeOptions : void 0; + const endpointURLString = addProtocol(debuggerAddress || chromeOptionsURL).replace("localhost", "127.0.0.1"); + progress2.log(` retrieved endpoint ${endpointURLString} for sessionId=${sessionId}`); + endpointURL = new URL(endpointURLString); + if (endpointURL.hostname === "localhost" || endpointURL.hostname === "127.0.0.1") { + const sessionInfoUrl = new URL(hubUrl).origin + "/grid/api/testsession?session=" + sessionId; + try { + const sessionResponse = await fetchData({ + url: sessionInfoUrl, + method: "GET", + timeout: progress2.timeUntilDeadline(), + headers + }, seleniumErrorHandler); + const proxyId = JSON.parse(sessionResponse).proxyId; + endpointURL.hostname = new URL(proxyId).hostname; + progress2.log(` resolved endpoint ip ${endpointURL.toString()} for sessionId=${sessionId}`); + } catch (e) { + progress2.log(` unable to resolve endpoint ip for sessionId=${sessionId}, running in standalone?`); + } + } + } + return await this._connectOverCDPInternal(progress2, endpointURL.toString(), { + ...options2, + headers: headersObjectToArray(headers) + }, disconnectFromSelenium); + } catch (e) { + await disconnectFromSelenium(); + throw e; + } + } + defaultArgs(options2, isPersistent, userDataDir) { + const chromeArguments = this._innerDefaultArgs(options2); + chromeArguments.push(`--user-data-dir=${userDataDir}`); + if (options2.cdpPort !== void 0) + chromeArguments.push(`--remote-debugging-port=${options2.cdpPort}`); + else + chromeArguments.push("--remote-debugging-pipe"); + if (isPersistent) + chromeArguments.push("about:blank"); + else + chromeArguments.push("--no-startup-window"); + return chromeArguments; + } + _innerDefaultArgs(options2) { + const { args = [] } = options2; + const userDataDirArg = args.find((arg) => arg.startsWith("--user-data-dir")); + if (userDataDirArg) + throw this._createUserDataDirArgMisuseError("--user-data-dir"); + if (args.find((arg) => arg.startsWith("--remote-debugging-pipe"))) + throw new Error("Playwright manages remote debugging connection itself."); + if (args.find((arg) => !arg.startsWith("-"))) + throw new Error("Arguments can not specify page to be opened"); + const chromeArguments = [...chromiumSwitches(options2.assistantMode, options2.channel)]; + if (os.platform() === "darwin") { + chromeArguments.push("--enable-use-zoom-for-dsf=false"); + if (options2.headless && (!options2.channel || options2.channel === "chromium-headless-shell")) + chromeArguments.push("--use-angle"); + } + if (options2.devtools) + chromeArguments.push("--auto-open-devtools-for-tabs"); + if (options2.headless) { + chromeArguments.push("--headless"); + chromeArguments.push( + "--hide-scrollbars", + "--mute-audio", + "--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4" + ); + } + if (options2.chromiumSandbox !== true) + chromeArguments.push("--no-sandbox"); + const proxy = options2.proxyOverride || options2.proxy; + if (proxy) { + const proxyURL = new URL(proxy.server); + const isSocks = proxyURL.protocol === "socks5:"; + if (isSocks && !this.attribution.playwright.options.socksProxyPort) { + chromeArguments.push(`--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE ${proxyURL.hostname}"`); + } + chromeArguments.push(`--proxy-server=${proxy.server}`); + const proxyBypassRules = []; + if (this.attribution.playwright.options.socksProxyPort) + proxyBypassRules.push("<-loopback>"); + if (proxy.bypass) + proxyBypassRules.push(...proxy.bypass.split(",").map((t) => t.trim()).map((t) => t.startsWith(".") ? "*" + t : t)); + if (!define_process_env_default.PLAYWRIGHT_DISABLE_FORCED_CHROMIUM_PROXIED_LOOPBACK && !proxyBypassRules.includes("<-loopback>")) + proxyBypassRules.push("<-loopback>"); + if (proxyBypassRules.length > 0) + chromeArguments.push(`--proxy-bypass-list=${proxyBypassRules.join(";")}`); + } + chromeArguments.push(...args); + return chromeArguments; + } + readyState(options2) { + var _a2; + if (options2.cdpPort !== void 0 || ((_a2 = options2.args) == null ? void 0 : _a2.some((a) => a.startsWith("--remote-debugging-port")))) + return new ChromiumReadyState2(); + return void 0; + } + getExecutableName(options2) { + if (options2.channel) + return options2.channel; + return options2.headless ? "chromium-headless-shell" : "chromium"; + } +} +class ChromiumReadyState2 extends BrowserReadyState { + onBrowserOutput(message) { + if (message.includes("Failed to create a ProcessSingleton for your profile directory.")) { + this._wsEndpoint.reject(new Error("Failed to create a ProcessSingleton for your profile directory. This usually means that the profile is already in use by another instance of Chromium.")); + } + const match = message.match(/DevTools listening on (.*)/); + if (match) + this._wsEndpoint.resolve(match[1]); + } +} +async function urlToWSEndpoint(progress2, endpointURL, headers) { + if (endpointURL.startsWith("ws")) + return endpointURL; + progress2.log(` retrieving websocket url from ${endpointURL}`); + const url2 = new URL(endpointURL); + url2.pathname += "json/version/"; + const httpURL = url2.toString(); + const json = await fetchData( + { + url: httpURL, + headers + }, + async (_, resp) => new Error(`Unexpected status ${resp.statusCode} when connecting to ${httpURL}. +This does not look like a DevTools server, try connecting via ws://.`) + ); + return JSON.parse(json).webSocketDebuggerUrl; +} +async function seleniumErrorHandler(params, response2) { + const body = await streamToString(response2); + let message = body; + try { + const json = JSON.parse(body); + message = json.value.localizedMessage || json.value.message; + } catch (e) { + } + return new Error(`Error connecting to Selenium at ${params.url}: ${message}`); +} +function addProtocol(url2) { + if (!["ws://", "wss://", "http://", "https://"].some((protocol) => url2.startsWith(protocol))) + return "http://" + url2; + return url2; +} +function streamToString(stream2) { + return new Promise((resolve, reject) => { + const chunks = []; + stream2.on("data", (chunk) => chunks.push(Buffer.from(chunk))); + stream2.on("error", reject); + stream2.on("end", () => resolve(Buffer.concat(chunks).toString("utf8"))); + }); +} +function parseSeleniumRemoteParams(env, progress2) { + try { + const parsed = JSON.parse(env.value); + progress2.log(` using additional ${env.name} "${env.value}"`); + return parsed; + } catch (e) { + progress2.log(` ignoring additional ${env.name} "${env.value}": ${e}`); + } +} +const internalMetadata = serverSideCallMetadata(); +const _DebugController = class _DebugController2 extends SdkObject { + constructor(playwright2) { + super({ attribution: { isInternalPlaywright: true }, instrumentation: createInstrumentation$1() }, void 0, "DebugController"); + this._sdkLanguage = "javascript"; + this._codegenId = "playwright-test"; + this._playwright = playwright2; + } + initialize(codegenId, sdkLanguage) { + this._codegenId = codegenId; + this._sdkLanguage = sdkLanguage; + } + dispose() { + this.setReportStateChanged(false); + } + setReportStateChanged(enabled) { + if (enabled && !this._trackHierarchyListener) { + this._trackHierarchyListener = { + onPageOpen: () => this._emitSnapshot(false), + onPageClose: () => this._emitSnapshot(false) + }; + this._playwright.instrumentation.addListener(this._trackHierarchyListener, null); + this._emitSnapshot(true); + } else if (!enabled && this._trackHierarchyListener) { + this._playwright.instrumentation.removeListener(this._trackHierarchyListener); + this._trackHierarchyListener = void 0; + } + } + async resetForReuse() { + const contexts = /* @__PURE__ */ new Set(); + for (const page of this._playwright.allPages()) + contexts.add(page.browserContext); + for (const context of contexts) + await context.resetForReuse(internalMetadata, null); + } + async navigate(url2) { + for (const p of this._playwright.allPages()) + await p.mainFrame().goto(internalMetadata, url2, { timeout: DEFAULT_PLAYWRIGHT_TIMEOUT }); + } + async setRecorderMode(params) { + await this._closeBrowsersWithoutPages(); + if (params.mode === "none") { + for (const recorder of await this._allRecorders()) { + recorder.hideHighlightedSelector(); + recorder.setMode("none"); + } + return; + } + if (!this._playwright.allBrowsers().length) + await this._playwright.chromium.launch(internalMetadata, { headless: !!define_process_env_default.PW_DEBUG_CONTROLLER_HEADLESS, timeout: DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT }); + const pages = this._playwright.allPages(); + if (!pages.length) { + const [browser2] = this._playwright.allBrowsers(); + const { context } = await browser2.newContextForReuse({}, internalMetadata); + await context.newPage(internalMetadata); + } + if (params.testIdAttributeName) { + for (const page of this._playwright.allPages()) + page.browserContext.selectors().setTestIdAttributeName(params.testIdAttributeName); + } + for (const recorder of await this._allRecorders()) { + recorder.hideHighlightedSelector(); + if (params.mode !== "inspecting") + recorder.setOutput(this._codegenId, params.file); + recorder.setMode(params.mode); + } + } + async highlight(params) { + if (params.selector) + unsafeLocatorOrSelectorAsSelector(this._sdkLanguage, params.selector, "data-testid"); + const ariaTemplate = params.ariaTemplate ? parseAriaSnapshotUnsafe(yaml, params.ariaTemplate) : void 0; + for (const recorder of await this._allRecorders()) { + if (ariaTemplate) + recorder.setHighlightedAriaTemplate(ariaTemplate); + else if (params.selector) + recorder.setHighlightedSelector(this._sdkLanguage, params.selector); + } + } + async hideHighlight() { + for (const recorder of await this._allRecorders()) + recorder.hideHighlightedSelector(); + await this._playwright.hideHighlight(); + } + allBrowsers() { + return [...this._playwright.allBrowsers()]; + } + async resume() { + for (const recorder of await this._allRecorders()) + recorder.resume(); + } + async kill() { + gracefullyProcessExitDoNotHang(0); + } + async closeAllBrowsers() { + await Promise.all(this.allBrowsers().map((browser2) => browser2.close({ reason: "Close all browsers requested" }))); + } + _emitSnapshot(initial) { + const pageCount = this._playwright.allPages().length; + if (initial && !pageCount) + return; + this.emit(_DebugController2.Events.StateChanged, { pageCount }); + } + async _allRecorders() { + const contexts = /* @__PURE__ */ new Set(); + for (const page of this._playwright.allPages()) + contexts.add(page.browserContext); + const result = await Promise.all([...contexts].map((c) => Recorder.showInspector(c, { omitCallTracking: true }, () => Promise.resolve(new InspectingRecorderApp(this))))); + return result.filter(Boolean); + } + async _closeBrowsersWithoutPages() { + for (const browser2 of this._playwright.allBrowsers()) { + for (const context of browser2.contexts()) { + if (!context.pages().length) + await context.close({ reason: "Browser collected" }); + } + if (!browser2.contexts()) + await browser2.close({ reason: "Browser collected" }); + } + } +}; +_DebugController.Events = { + StateChanged: "stateChanged", + InspectRequested: "inspectRequested", + SourceChanged: "sourceChanged", + Paused: "paused", + SetModeRequested: "setModeRequested" +}; +let DebugController = _DebugController; +class InspectingRecorderApp extends EmptyRecorderApp { + constructor(debugController) { + super(); + this._debugController = debugController; + } + async elementPicked(elementInfo) { + const locator = asLocator(this._debugController._sdkLanguage, elementInfo.selector); + this._debugController.emit(DebugController.Events.InspectRequested, { selector: elementInfo.selector, locator, ariaSnapshot: elementInfo.ariaSnapshot }); + } + async setSources(sources) { + const source2 = sources.find((s) => s.id === this._debugController._codegenId); + const { text, header, footer, actions } = source2 || { text: "" }; + this._debugController.emit(DebugController.Events.SourceChanged, { text, header, footer, actions }); + } + async setPaused(paused) { + this._debugController.emit(DebugController.Events.Paused, { paused }); + } + async setMode(mode) { + this._debugController.emit(DebugController.Events.SetModeRequested, { mode }); + } +} +const ConnectionEvents = { + Disconnected: Symbol("Disconnected") +}; +const kBrowserCloseMessageId$1 = -9999; +class FFConnection extends eventsExports.EventEmitter { + constructor(transport, protocolLogger, browserLogsCollector) { + super(); + this.setMaxListeners(0); + this._transport = transport; + this._protocolLogger = protocolLogger; + this._browserLogsCollector = browserLogsCollector; + this._lastId = 0; + this._sessions = /* @__PURE__ */ new Map(); + this._closed = false; + this.rootSession = new FFSession(this, "", (message) => this._rawSend(message)); + this._sessions.set("", this.rootSession); + this._transport.onmessage = this._onMessage.bind(this); + this._transport.onclose = this._onClose.bind(this); + } + nextMessageId() { + return ++this._lastId; + } + _rawSend(message) { + this._protocolLogger("send", message); + this._transport.send(message); + } + async _onMessage(message) { + this._protocolLogger("receive", message); + if (message.id === kBrowserCloseMessageId$1) + return; + const session = this._sessions.get(message.sessionId || ""); + if (session) + session.dispatchMessage(message); + } + _onClose(reason) { + this._closed = true; + this._transport.onmessage = void 0; + this._transport.onclose = void 0; + this._browserDisconnectedLogs = helper.formatBrowserLogs(this._browserLogsCollector.recentLogs(), reason); + this.rootSession.dispose(); + Promise.resolve().then(() => this.emit(ConnectionEvents.Disconnected)); + } + close() { + if (!this._closed) + this._transport.close(); + } + createSession(sessionId) { + const session = new FFSession(this, sessionId, (message) => this._rawSend({ ...message, sessionId })); + this._sessions.set(sessionId, session); + return session; + } +} +class FFSession extends eventsExports.EventEmitter { + constructor(connection, sessionId, rawSend) { + super(); + this._disposed = false; + this._crashed = false; + this.setMaxListeners(0); + this._callbacks = /* @__PURE__ */ new Map(); + this._connection = connection; + this._sessionId = sessionId; + this._rawSend = rawSend; + this.on = super.on; + this.addListener = super.addListener; + this.off = super.removeListener; + this.removeListener = super.removeListener; + this.once = super.once; + } + markAsCrashed() { + this._crashed = true; + } + async send(method, params) { + if (this._crashed || this._disposed || this._connection._closed || this._connection._browserDisconnectedLogs) + throw new ProtocolError(this._crashed ? "crashed" : "closed", void 0, this._connection._browserDisconnectedLogs); + const id = this._connection.nextMessageId(); + this._rawSend({ method, params, id }); + return new Promise((resolve, reject) => { + this._callbacks.set(id, { resolve, reject, error: new ProtocolError("error", method) }); + }); + } + sendMayFail(method, params) { + return this.send(method, params).catch((error2) => debugLogger.log("error", error2)); + } + dispatchMessage(object) { + if (object.id) { + const callback = this._callbacks.get(object.id); + if (callback) { + this._callbacks.delete(object.id); + if (object.error) { + callback.error.setMessage(object.error.message); + callback.reject(callback.error); + } else { + callback.resolve(object.result); + } + } + } else { + Promise.resolve().then(() => this.emit(object.method, object.params)); + } + } + dispose() { + this._disposed = true; + this._connection._sessions.delete(this._sessionId); + for (const callback of this._callbacks.values()) { + callback.error.type = this._crashed ? "crashed" : "closed"; + callback.error.logs = this._connection._browserDisconnectedLogs; + callback.reject(callback.error); + } + this._callbacks.clear(); + } +} +async function getAccessibilityTree$1(session, needle) { + const objectId = needle ? needle._objectId : void 0; + const { tree } = await session.send("Accessibility.getFullAXTree", { objectId }); + const axNode = new FFAXNode(tree); + return { + tree: axNode, + needle: needle ? axNode._findNeedle() : null + }; +} +const FFRoleToARIARole = new Map(Object.entries({ + "pushbutton": "button", + "checkbutton": "checkbox", + "editcombobox": "combobox", + "content deletion": "deletion", + "footnote": "doc-footnote", + "non-native document": "document", + "grouping": "group", + "graphic": "img", + "content insertion": "insertion", + "animation": "marquee", + "flat equation": "math", + "menupopup": "menu", + "check menu item": "menuitemcheckbox", + "radio menu item": "menuitemradio", + "listbox option": "option", + "radiobutton": "radio", + "statusbar": "status", + "pagetab": "tab", + "pagetablist": "tablist", + "propertypage": "tabpanel", + "entry": "textbox", + "outline": "tree", + "tree table": "treegrid", + "outlineitem": "treeitem" +})); +class FFAXNode { + constructor(payload) { + this._payload = payload; + this._children = (payload.children || []).map((x) => new FFAXNode(x)); + this._editable = !!payload.editable; + this._richlyEditable = this._editable && (payload.tag !== "textarea" && payload.tag !== "input"); + this._focusable = !!payload.focusable; + this._expanded = !!payload.expanded; + this._name = this._payload.name; + this._role = this._payload.role; + } + _isPlainTextField() { + if (this._richlyEditable) + return false; + if (this._editable) + return true; + return this._role === "entry"; + } + _isTextOnlyObject() { + const role = this._role; + return role === "text leaf" || role === "text" || role === "statictext"; + } + _hasFocusableChild() { + if (this._cachedHasFocusableChild === void 0) { + this._cachedHasFocusableChild = false; + for (const child of this._children) { + if (child._focusable || child._hasFocusableChild()) { + this._cachedHasFocusableChild = true; + break; + } + } + } + return this._cachedHasFocusableChild; + } + children() { + return this._children; + } + _findNeedle() { + if (this._payload.foundObject) + return this; + for (const child of this._children) { + const found = child._findNeedle(); + if (found) + return found; + } + return null; + } + isLeafNode() { + if (!this._children.length) + return true; + if (this._isPlainTextField() || this._isTextOnlyObject()) + return true; + switch (this._role) { + case "graphic": + case "scrollbar": + case "slider": + case "separator": + case "progressbar": + return true; + } + if (this._hasFocusableChild()) + return false; + if (this._focusable && this._role !== "document" && this._name) + return true; + if (this._role === "heading" && this._name) + return true; + return false; + } + isControl() { + switch (this._role) { + case "checkbutton": + case "check menu item": + case "check rich option": + case "combobox": + case "combobox option": + case "color chooser": + case "listbox": + case "listbox option": + case "listbox rich option": + case "popup menu": + case "menupopup": + case "menuitem": + case "menubar": + case "button": + case "pushbutton": + case "radiobutton": + case "radio menuitem": + case "scrollbar": + case "slider": + case "spinbutton": + case "switch": + case "pagetab": + case "entry": + case "tree table": + return true; + default: + return false; + } + } + isInteresting(insideControl) { + if (this._focusable || this._richlyEditable) + return true; + if (this.isControl()) + return true; + if (insideControl) + return false; + return this.isLeafNode() && !!this._name.trim(); + } + serialize() { + const node2 = { + role: FFRoleToARIARole.get(this._role) || this._role, + name: this._name || "" + }; + const userStringProperties = [ + "name", + "description", + "roledescription", + "valuetext", + "keyshortcuts" + ]; + for (const userStringProperty of userStringProperties) { + if (!(userStringProperty in this._payload)) + continue; + node2[userStringProperty] = this._payload[userStringProperty]; + } + const booleanProperties = [ + "disabled", + "expanded", + "focused", + "modal", + "multiline", + "multiselectable", + "readonly", + "required", + "selected" + ]; + for (const booleanProperty of booleanProperties) { + if (this._role === "document" && booleanProperty === "focused") + continue; + const value = this._payload[booleanProperty]; + if (!value) + continue; + node2[booleanProperty] = value; + } + const numericalProperties = [ + "level" + ]; + for (const numericalProperty of numericalProperties) { + if (!(numericalProperty in this._payload)) + continue; + node2[numericalProperty] = this._payload[numericalProperty]; + } + const tokenProperties = [ + "autocomplete", + "haspopup", + "orientation" + ]; + for (const tokenProperty of tokenProperties) { + const value = this._payload[tokenProperty]; + if (!value || value === "false") + continue; + node2[tokenProperty] = value; + } + const axNode = node2; + axNode.valueString = this._payload.value; + if ("checked" in this._payload) + axNode.checked = this._payload.checked === true ? "checked" : this._payload.checked === "mixed" ? "mixed" : "unchecked"; + if ("pressed" in this._payload) + axNode.pressed = this._payload.pressed === true ? "pressed" : "released"; + if ("invalid" in this._payload) + axNode.invalid = this._payload.invalid === true ? "true" : "false"; + return axNode; + } +} +class FFExecutionContext { + constructor(session, executionContextId) { + this._session = session; + this._executionContextId = executionContextId; + } + async rawEvaluateJSON(expression) { + const payload = await this._session.send("Runtime.evaluate", { + expression, + returnByValue: true, + executionContextId: this._executionContextId + }).catch(rewriteError$1); + checkException(payload.exceptionDetails); + return payload.result.value; + } + async rawEvaluateHandle(context, expression) { + const payload = await this._session.send("Runtime.evaluate", { + expression, + returnByValue: false, + executionContextId: this._executionContextId + }).catch(rewriteError$1); + checkException(payload.exceptionDetails); + return createHandle$1(context, payload.result); + } + async evaluateWithArguments(expression, returnByValue, utilityScript, values, handles) { + const payload = await this._session.send("Runtime.callFunction", { + functionDeclaration: expression, + args: [ + { objectId: utilityScript._objectId, value: void 0 }, + ...values.map((value) => ({ value })), + ...handles.map((handle) => ({ objectId: handle._objectId, value: void 0 })) + ], + returnByValue, + executionContextId: this._executionContextId + }).catch(rewriteError$1); + checkException(payload.exceptionDetails); + if (returnByValue) + return parseEvaluationResultValue(payload.result.value); + return createHandle$1(utilityScript._context, payload.result); + } + async getProperties(object) { + const response2 = await this._session.send("Runtime.getObjectProperties", { + executionContextId: this._executionContextId, + objectId: object._objectId + }); + const result = /* @__PURE__ */ new Map(); + for (const property of response2.properties) + result.set(property.name, createHandle$1(object._context, property.value)); + return result; + } + async releaseHandle(handle) { + if (!handle._objectId) + return; + await this._session.send("Runtime.disposeObject", { + executionContextId: this._executionContextId, + objectId: handle._objectId + }); + } +} +function checkException(exceptionDetails) { + if (!exceptionDetails) + return; + if (exceptionDetails.value) + throw new JavaScriptErrorInEvaluate(JSON.stringify(exceptionDetails.value)); + else + throw new JavaScriptErrorInEvaluate(exceptionDetails.text + (exceptionDetails.stack ? "\n" + exceptionDetails.stack : "")); +} +function rewriteError$1(error2) { + if (error2.message.includes("cyclic object value") || error2.message.includes("Object is not serializable")) + return { result: { type: "undefined", value: void 0 } }; + if (error2 instanceof TypeError && error2.message.startsWith("Converting circular structure to JSON")) + rewriteErrorMessage(error2, error2.message + " Are you passing a nested JSHandle?"); + if (!isJavaScriptErrorInEvaluate(error2) && !isSessionClosedError(error2)) + throw new Error("Execution context was destroyed, most likely because of a navigation."); + throw error2; +} +function potentiallyUnserializableValue$1(remoteObject) { + const value = remoteObject.value; + const unserializableValue = remoteObject.unserializableValue; + return unserializableValue ? parseUnserializableValue(unserializableValue) : value; +} +function renderPreview$1(object) { + if (object.type === "undefined") + return "undefined"; + if (object.unserializableValue) + return String(object.unserializableValue); + if (object.type === "symbol") + return "Symbol()"; + if (object.subtype === "regexp") + return "RegExp"; + if (object.subtype === "weakmap") + return "WeakMap"; + if (object.subtype === "weakset") + return "WeakSet"; + if (object.subtype) + return object.subtype[0].toUpperCase() + object.subtype.slice(1); + if ("value" in object) + return String(object.value); +} +function createHandle$1(context, remoteObject) { + if (remoteObject.subtype === "node") { + assert(context instanceof FrameExecutionContext); + return new ElementHandle$1(context, remoteObject.objectId); + } + return new JSHandle$1(context, remoteObject.subtype || remoteObject.type || "", renderPreview$1(remoteObject), remoteObject.objectId, potentiallyUnserializableValue$1(remoteObject)); +} +function toModifiersMask$1(modifiers) { + let mask = 0; + if (modifiers.has("Alt")) + mask |= 1; + if (modifiers.has("Control")) + mask |= 2; + if (modifiers.has("Shift")) + mask |= 4; + if (modifiers.has("Meta")) + mask |= 8; + return mask; +} +function toButtonNumber(button) { + if (button === "left") + return 0; + if (button === "middle") + return 1; + if (button === "right") + return 2; + return 0; +} +function toButtonsMask$1(buttons) { + let mask = 0; + if (buttons.has("left")) + mask |= 1; + if (buttons.has("right")) + mask |= 2; + if (buttons.has("middle")) + mask |= 4; + return mask; +} +let RawKeyboardImpl$1 = class RawKeyboardImpl3 { + constructor(client) { + this._client = client; + } + async keydown(modifiers, keyName, description, autoRepeat) { + let text = description.text; + if (text === "\r") + text = ""; + const { code, key: key2, location: location2 } = description; + await this._client.send("Page.dispatchKeyEvent", { + type: "keydown", + keyCode: description.keyCodeWithoutLocation, + code, + key: key2, + repeat: autoRepeat, + location: location2, + text + }); + } + async keyup(modifiers, keyName, description) { + const { code, key: key2, location: location2 } = description; + await this._client.send("Page.dispatchKeyEvent", { + type: "keyup", + key: key2, + keyCode: description.keyCodeWithoutLocation, + code, + location: location2, + repeat: false + }); + } + async sendText(text) { + await this._client.send("Page.insertText", { text }); + } +}; +let RawMouseImpl$1 = class RawMouseImpl3 { + constructor(client) { + this._client = client; + } + async move(x, y, button, buttons, modifiers, forClick) { + await this._client.send("Page.dispatchMouseEvent", { + type: "mousemove", + button: 0, + buttons: toButtonsMask$1(buttons), + x: Math.floor(x), + y: Math.floor(y), + modifiers: toModifiersMask$1(modifiers) + }); + } + async down(x, y, button, buttons, modifiers, clickCount) { + await this._client.send("Page.dispatchMouseEvent", { + type: "mousedown", + button: toButtonNumber(button), + buttons: toButtonsMask$1(buttons), + x: Math.floor(x), + y: Math.floor(y), + modifiers: toModifiersMask$1(modifiers), + clickCount + }); + } + async up(x, y, button, buttons, modifiers, clickCount) { + await this._client.send("Page.dispatchMouseEvent", { + type: "mouseup", + button: toButtonNumber(button), + buttons: toButtonsMask$1(buttons), + x: Math.floor(x), + y: Math.floor(y), + modifiers: toModifiersMask$1(modifiers), + clickCount + }); + } + async wheel(x, y, buttons, modifiers, deltaX, deltaY) { + await this._page.mainFrame().evaluateExpression(`new Promise(requestAnimationFrame)`, { world: "utility" }); + await this._client.send("Page.dispatchWheelEvent", { + deltaX, + deltaY, + x: Math.floor(x), + y: Math.floor(y), + deltaZ: 0, + modifiers: toModifiersMask$1(modifiers) + }); + } + setPage(page) { + this._page = page; + } +}; +let RawTouchscreenImpl$1 = class RawTouchscreenImpl3 { + constructor(client) { + this._client = client; + } + async tap(x, y, modifiers) { + await this._client.send("Page.dispatchTapEvent", { + x, + y, + modifiers: toModifiersMask$1(modifiers) + }); + } +}; +class FFNetworkManager { + constructor(session, page) { + this._session = session; + this._requests = /* @__PURE__ */ new Map(); + this._page = page; + this._eventListeners = [ + eventsHelper.addEventListener(session, "Network.requestWillBeSent", this._onRequestWillBeSent.bind(this)), + eventsHelper.addEventListener(session, "Network.responseReceived", this._onResponseReceived.bind(this)), + eventsHelper.addEventListener(session, "Network.requestFinished", this._onRequestFinished.bind(this)), + eventsHelper.addEventListener(session, "Network.requestFailed", this._onRequestFailed.bind(this)) + ]; + } + dispose() { + eventsHelper.removeEventListeners(this._eventListeners); + } + async setRequestInterception(enabled) { + await Promise.all([ + this._session.send("Network.setRequestInterception", { enabled }), + this._session.send("Page.setCacheDisabled", { cacheDisabled: enabled }) + ]); + } + _onRequestWillBeSent(event) { + const redirectedFrom = event.redirectedFrom ? this._requests.get(event.redirectedFrom) || null : null; + const frame = redirectedFrom ? redirectedFrom.request.frame() : event.frameId ? this._page.frameManager.frame(event.frameId) : null; + if (!frame) + return; + if (redirectedFrom) + this._requests.delete(redirectedFrom._id); + const request2 = new InterceptableRequest2(frame, redirectedFrom, event); + let route; + if (event.isIntercepted) + route = new FFRouteImpl(this._session, request2); + this._requests.set(request2._id, request2); + this._page.frameManager.requestStarted(request2.request, route); + } + _onResponseReceived(event) { + var _a2, _b2, _c2, _d2, _e2; + const request2 = this._requests.get(event.requestId); + if (!request2) + return; + const getResponseBody = async () => { + const response22 = await this._session.send("Network.getResponseBody", { + requestId: request2._id + }); + if (response22.evicted) + throw new Error(`Response body for ${request2.request.method()} ${request2.request.url()} was evicted!`); + return Buffer.from(response22.base64body, "base64"); + }; + const startTime = event.timing.startTime; + function relativeToStart(time) { + if (!time) + return -1; + return (time - startTime) / 1e3; + } + const timing = { + startTime: startTime / 1e3, + domainLookupStart: relativeToStart(event.timing.domainLookupStart), + domainLookupEnd: relativeToStart(event.timing.domainLookupEnd), + connectStart: relativeToStart(event.timing.connectStart), + secureConnectionStart: relativeToStart(event.timing.secureConnectionStart), + connectEnd: relativeToStart(event.timing.connectEnd), + requestStart: relativeToStart(event.timing.requestStart), + responseStart: relativeToStart(event.timing.responseStart) + }; + const response2 = new Response$1(request2.request, event.status, event.statusText, parseMultivalueHeaders(event.headers), timing, getResponseBody, event.fromServiceWorker); + if ((event == null ? void 0 : event.remoteIPAddress) && typeof (event == null ? void 0 : event.remotePort) === "number") { + response2._serverAddrFinished({ + ipAddress: event.remoteIPAddress, + port: event.remotePort + }); + } else { + response2._serverAddrFinished(); + } + response2._securityDetailsFinished({ + protocol: (_a2 = event == null ? void 0 : event.securityDetails) == null ? void 0 : _a2.protocol, + subjectName: (_b2 = event == null ? void 0 : event.securityDetails) == null ? void 0 : _b2.subjectName, + issuer: (_c2 = event == null ? void 0 : event.securityDetails) == null ? void 0 : _c2.issuer, + validFrom: (_d2 = event == null ? void 0 : event.securityDetails) == null ? void 0 : _d2.validFrom, + validTo: (_e2 = event == null ? void 0 : event.securityDetails) == null ? void 0 : _e2.validTo + }); + response2.setRawResponseHeaders(null); + response2.setResponseHeadersSize(null); + this._page.frameManager.requestReceivedResponse(response2); + } + _onRequestFinished(event) { + const request2 = this._requests.get(event.requestId); + if (!request2) + return; + const response2 = request2.request._existingResponse(); + response2.setTransferSize(event.transferSize); + response2.setEncodedBodySize(event.encodedBodySize); + const isRedirected = response2.status() >= 300 && response2.status() <= 399; + const responseEndTime = event.responseEndTime ? event.responseEndTime / 1e3 - response2.timing().startTime : -1; + if (isRedirected) { + response2._requestFinished(responseEndTime); + } else { + this._requests.delete(request2._id); + response2._requestFinished(responseEndTime); + } + if (event.protocolVersion) + response2._setHttpVersion(event.protocolVersion); + this._page.frameManager.reportRequestFinished(request2.request, response2); + } + _onRequestFailed(event) { + const request2 = this._requests.get(event.requestId); + if (!request2) + return; + this._requests.delete(request2._id); + const response2 = request2.request._existingResponse(); + if (response2) { + response2.setTransferSize(null); + response2.setEncodedBodySize(null); + response2._requestFinished(-1); + } + request2.request._setFailureText(event.errorCode); + this._page.frameManager.requestFailed(request2.request, event.errorCode === "NS_BINDING_ABORTED"); + } +} +const causeToResourceType = { + TYPE_INVALID: "other", + TYPE_OTHER: "other", + TYPE_SCRIPT: "script", + TYPE_IMAGE: "image", + TYPE_STYLESHEET: "stylesheet", + TYPE_OBJECT: "other", + TYPE_DOCUMENT: "document", + TYPE_SUBDOCUMENT: "document", + TYPE_REFRESH: "document", + TYPE_XBL: "other", + TYPE_PING: "other", + TYPE_XMLHTTPREQUEST: "xhr", + TYPE_OBJECT_SUBREQUEST: "other", + TYPE_DTD: "other", + TYPE_FONT: "font", + TYPE_MEDIA: "media", + TYPE_WEBSOCKET: "websocket", + TYPE_CSP_REPORT: "other", + TYPE_XSLT: "other", + TYPE_BEACON: "other", + TYPE_FETCH: "fetch", + TYPE_IMAGESET: "image", + TYPE_WEB_MANIFEST: "manifest" +}; +const internalCauseToResourceType = { + TYPE_INTERNAL_EVENTSOURCE: "eventsource" +}; +class InterceptableRequest2 { + constructor(frame, redirectedFrom, payload) { + this._id = payload.requestId; + if (redirectedFrom) + redirectedFrom._redirectedTo = this; + let postDataBuffer = null; + if (payload.postData) + postDataBuffer = Buffer.from(payload.postData, "base64"); + this.request = new Request$1( + frame._page.browserContext, + frame, + null, + redirectedFrom ? redirectedFrom.request : null, + payload.navigationId, + payload.url, + internalCauseToResourceType[payload.internalCause] || causeToResourceType[payload.cause] || "other", + payload.method, + postDataBuffer, + payload.headers + ); + this.request.setRawRequestHeaders(null); + } + _finalRequest() { + let request2 = this; + while (request2._redirectedTo) + request2 = request2._redirectedTo; + return request2; + } +} +class FFRouteImpl { + constructor(session, request2) { + this._session = session; + this._request = request2; + } + async continue(overrides) { + await this._session.sendMayFail("Network.resumeInterceptedRequest", { + requestId: this._request._id, + url: overrides.url, + method: overrides.method, + headers: overrides.headers, + postData: overrides.postData ? Buffer.from(overrides.postData).toString("base64") : void 0 + }); + } + async fulfill(response2) { + const base64body = response2.isBase64 ? response2.body : Buffer.from(response2.body).toString("base64"); + await this._session.sendMayFail("Network.fulfillInterceptedRequest", { + requestId: this._request._id, + status: response2.status, + statusText: statusText(response2.status), + headers: response2.headers, + base64body + }); + } + async abort(errorCode) { + await this._session.sendMayFail("Network.abortInterceptedRequest", { + requestId: this._request._id, + errorCode + }); + } +} +function parseMultivalueHeaders(headers) { + const result = []; + for (const header of headers) { + const separator = header.name.toLowerCase() === "set-cookie" ? "\n" : ","; + const tokens = header.value.split(separator).map((s) => s.trim()); + for (const token of tokens) + result.push({ name: header.name, value: token }); + } + return result; +} +const UTILITY_WORLD_NAME$1 = "__playwright_utility_world__"; +class FFPage { + constructor(session, browserContext, opener) { + this.cspErrorsAsynchronousForInlineScripts = true; + this._reportedAsNew = false; + this._workers = /* @__PURE__ */ new Map(); + this._initScripts = []; + this._session = session; + this._opener = opener; + this.rawKeyboard = new RawKeyboardImpl$1(session); + this.rawMouse = new RawMouseImpl$1(session); + this.rawTouchscreen = new RawTouchscreenImpl$1(session); + this._contextIdToContext = /* @__PURE__ */ new Map(); + this._browserContext = browserContext; + this._page = new Page$1(this, browserContext); + this.rawMouse.setPage(this._page); + this._networkManager = new FFNetworkManager(session, this._page); + this._page.on(Page$1.Events.FrameDetached, (frame) => this._removeContextsForFrame(frame)); + this._eventListeners = [ + eventsHelper.addEventListener(this._session, "Page.eventFired", this._onEventFired.bind(this)), + eventsHelper.addEventListener(this._session, "Page.frameAttached", this._onFrameAttached.bind(this)), + eventsHelper.addEventListener(this._session, "Page.frameDetached", this._onFrameDetached.bind(this)), + eventsHelper.addEventListener(this._session, "Page.navigationAborted", this._onNavigationAborted.bind(this)), + eventsHelper.addEventListener(this._session, "Page.navigationCommitted", this._onNavigationCommitted.bind(this)), + eventsHelper.addEventListener(this._session, "Page.navigationStarted", this._onNavigationStarted.bind(this)), + eventsHelper.addEventListener(this._session, "Page.sameDocumentNavigation", this._onSameDocumentNavigation.bind(this)), + eventsHelper.addEventListener(this._session, "Runtime.executionContextCreated", this._onExecutionContextCreated.bind(this)), + eventsHelper.addEventListener(this._session, "Runtime.executionContextDestroyed", this._onExecutionContextDestroyed.bind(this)), + eventsHelper.addEventListener(this._session, "Runtime.executionContextsCleared", this._onExecutionContextsCleared.bind(this)), + eventsHelper.addEventListener(this._session, "Page.linkClicked", (event) => this._onLinkClicked(event.phase)), + eventsHelper.addEventListener(this._session, "Page.uncaughtError", this._onUncaughtError.bind(this)), + eventsHelper.addEventListener(this._session, "Runtime.console", this._onConsole.bind(this)), + eventsHelper.addEventListener(this._session, "Page.dialogOpened", this._onDialogOpened.bind(this)), + eventsHelper.addEventListener(this._session, "Page.bindingCalled", this._onBindingCalled.bind(this)), + eventsHelper.addEventListener(this._session, "Page.fileChooserOpened", this._onFileChooserOpened.bind(this)), + eventsHelper.addEventListener(this._session, "Page.workerCreated", this._onWorkerCreated.bind(this)), + eventsHelper.addEventListener(this._session, "Page.workerDestroyed", this._onWorkerDestroyed.bind(this)), + eventsHelper.addEventListener(this._session, "Page.dispatchMessageFromWorker", this._onDispatchMessageFromWorker.bind(this)), + eventsHelper.addEventListener(this._session, "Page.crashed", this._onCrashed.bind(this)), + eventsHelper.addEventListener(this._session, "Page.videoRecordingStarted", this._onVideoRecordingStarted.bind(this)), + eventsHelper.addEventListener(this._session, "Page.webSocketCreated", this._onWebSocketCreated.bind(this)), + eventsHelper.addEventListener(this._session, "Page.webSocketClosed", this._onWebSocketClosed.bind(this)), + eventsHelper.addEventListener(this._session, "Page.webSocketFrameReceived", this._onWebSocketFrameReceived.bind(this)), + eventsHelper.addEventListener(this._session, "Page.webSocketFrameSent", this._onWebSocketFrameSent.bind(this)), + eventsHelper.addEventListener(this._session, "Page.screencastFrame", this._onScreencastFrame.bind(this)) + ]; + this._session.once("Page.ready", () => { + var _a2; + if (this._reportedAsNew) + return; + this._reportedAsNew = true; + this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page); + }); + this.addInitScript(new InitScript(""), UTILITY_WORLD_NAME$1).catch((e) => this._markAsError(e)); + } + async _markAsError(error2) { + var _a2; + if (this._reportedAsNew) + return; + this._reportedAsNew = true; + this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page, error2); + } + _onWebSocketCreated(event) { + this._page.frameManager.onWebSocketCreated(webSocketId(event.frameId, event.wsid), event.requestURL); + this._page.frameManager.onWebSocketRequest(webSocketId(event.frameId, event.wsid)); + } + _onWebSocketClosed(event) { + if (event.error) + this._page.frameManager.webSocketError(webSocketId(event.frameId, event.wsid), event.error); + this._page.frameManager.webSocketClosed(webSocketId(event.frameId, event.wsid)); + } + _onWebSocketFrameReceived(event) { + this._page.frameManager.webSocketFrameReceived(webSocketId(event.frameId, event.wsid), event.opcode, event.data); + } + _onWebSocketFrameSent(event) { + this._page.frameManager.onWebSocketFrameSent(webSocketId(event.frameId, event.wsid), event.opcode, event.data); + } + _onExecutionContextCreated(payload) { + const { executionContextId, auxData } = payload; + const frame = this._page.frameManager.frame(auxData.frameId); + if (!frame) + return; + const delegate = new FFExecutionContext(this._session, executionContextId); + let worldName = null; + if (auxData.name === UTILITY_WORLD_NAME$1) + worldName = "utility"; + else if (!auxData.name) + worldName = "main"; + const context = new FrameExecutionContext(delegate, frame, worldName); + if (worldName) + frame._contextCreated(worldName, context); + this._contextIdToContext.set(executionContextId, context); + } + _onExecutionContextDestroyed(payload) { + const { executionContextId } = payload; + const context = this._contextIdToContext.get(executionContextId); + if (!context) + return; + this._contextIdToContext.delete(executionContextId); + context.frame._contextDestroyed(context); + } + _onExecutionContextsCleared() { + for (const executionContextId of Array.from(this._contextIdToContext.keys())) + this._onExecutionContextDestroyed({ executionContextId }); + } + _removeContextsForFrame(frame) { + for (const [contextId, context] of this._contextIdToContext) { + if (context.frame === frame) + this._contextIdToContext.delete(contextId); + } + } + _onLinkClicked(phase) { + if (phase === "before") + this._page.frameManager.frameWillPotentiallyRequestNavigation(); + else + this._page.frameManager.frameDidPotentiallyRequestNavigation(); + } + _onNavigationStarted(params) { + this._page.frameManager.frameRequestedNavigation(params.frameId, params.navigationId); + } + _onNavigationAborted(params) { + this._page.frameManager.frameAbortedNavigation(params.frameId, params.errorText, params.navigationId); + } + _onNavigationCommitted(params) { + for (const [workerId, worker] of this._workers) { + if (worker.frameId === params.frameId) + this._onWorkerDestroyed({ workerId }); + } + this._page.frameManager.frameCommittedNewDocumentNavigation(params.frameId, params.url, params.name || "", params.navigationId || "", false); + } + _onSameDocumentNavigation(params) { + this._page.frameManager.frameCommittedSameDocumentNavigation(params.frameId, params.url); + } + _onFrameAttached(params) { + this._page.frameManager.frameAttached(params.frameId, params.parentFrameId); + } + _onFrameDetached(params) { + this._page.frameManager.frameDetached(params.frameId); + } + _onEventFired(payload) { + const { frameId, name } = payload; + if (name === "load") + this._page.frameManager.frameLifecycleEvent(frameId, "load"); + if (name === "DOMContentLoaded") + this._page.frameManager.frameLifecycleEvent(frameId, "domcontentloaded"); + } + _onUncaughtError(params) { + const { name, message } = splitErrorMessage(params.message); + const error2 = new Error(message); + error2.stack = params.message + "\n" + params.stack.split("\n").filter(Boolean).map((a) => a.replace(/([^@]*)@(.*)/, " at $1 ($2)")).join("\n"); + error2.name = name; + this._page.emitOnContextOnceInitialized(BrowserContext$1.Events.PageError, error2, this._page); + } + _onConsole(payload) { + const { type: type2, args, executionContextId, location: location2 } = payload; + const context = this._contextIdToContext.get(executionContextId); + if (!context) + return; + this._page.addConsoleMessage(type2 === "warn" ? "warning" : type2, args.map((arg) => createHandle$1(context, arg)), location2); + } + _onDialogOpened(params) { + this._page.browserContext.dialogManager.dialogDidOpen(new Dialog$1( + this._page, + params.type, + params.message, + async (accept, promptText) => { + await this._session.sendMayFail("Page.handleDialog", { dialogId: params.dialogId, accept, promptText }); + }, + params.defaultValue + )); + } + async _onBindingCalled(event) { + const pageOrError = await this._page.waitForInitializedOrError(); + if (!(pageOrError instanceof Error)) { + const context = this._contextIdToContext.get(event.executionContextId); + if (context) + await this._page.onBindingCalled(event.payload, context); + } + } + async _onFileChooserOpened(payload) { + const { executionContextId, element } = payload; + const context = this._contextIdToContext.get(executionContextId); + if (!context) + return; + const handle = createHandle$1(context, element).asElement(); + await this._page._onFileChooserOpened(handle); + } + async _onWorkerCreated(event) { + const workerId = event.workerId; + const worker = new Worker$1(this._page, event.url); + const workerSession = new FFSession(this._session._connection, workerId, (message) => { + this._session.send("Page.sendMessageToWorker", { + frameId: event.frameId, + workerId, + message: JSON.stringify(message) + }).catch((e) => { + workerSession.dispatchMessage({ id: message.id, method: "", params: {}, error: { message: e.message, data: void 0 } }); + }); + }); + this._workers.set(workerId, { session: workerSession, frameId: event.frameId }); + this._page.addWorker(workerId, worker); + workerSession.once("Runtime.executionContextCreated", (event2) => { + worker.createExecutionContext(new FFExecutionContext(workerSession, event2.executionContextId)); + }); + workerSession.on("Runtime.console", (event2) => { + const { type: type2, args, location: location2 } = event2; + const context = worker.existingExecutionContext; + this._page.addConsoleMessage(type2, args.map((arg) => createHandle$1(context, arg)), location2); + }); + } + _onWorkerDestroyed(event) { + const workerId = event.workerId; + const worker = this._workers.get(workerId); + if (!worker) + return; + worker.session.dispose(); + this._workers.delete(workerId); + this._page.removeWorker(workerId); + } + async _onDispatchMessageFromWorker(event) { + const worker = this._workers.get(event.workerId); + if (!worker) + return; + worker.session.dispatchMessage(JSON.parse(event.message)); + } + async _onCrashed(event) { + this._session.markAsCrashed(); + this._page._didCrash(); + } + _onVideoRecordingStarted(event) { + this._browserContext._browser._videoStarted(this._browserContext, event.screencastId, event.file, this._page.waitForInitializedOrError()); + } + didClose() { + this._markAsError(new TargetClosedError$1()); + this._session.dispose(); + eventsHelper.removeEventListeners(this._eventListeners); + this._networkManager.dispose(); + this._page._didClose(); + } + async navigateFrame(frame, url2, referer) { + const response2 = await this._session.send("Page.navigate", { url: url2, referer, frameId: frame._id }); + return { newDocumentId: response2.navigationId || void 0 }; + } + async updateExtraHTTPHeaders() { + await this._session.send("Network.setExtraHTTPHeaders", { headers: this._page.extraHTTPHeaders() || [] }); + } + async updateEmulatedViewportSize() { + var _a2; + const viewportSize = ((_a2 = this._page.emulatedSize()) == null ? void 0 : _a2.viewport) ?? null; + await this._session.send("Page.setViewportSize", { viewportSize }); + } + async bringToFront() { + await this._session.send("Page.bringToFront", {}); + } + async updateEmulateMedia() { + const emulatedMedia = this._page.emulatedMedia(); + const colorScheme = emulatedMedia.colorScheme === "no-override" ? void 0 : emulatedMedia.colorScheme; + const reducedMotion = emulatedMedia.reducedMotion === "no-override" ? void 0 : emulatedMedia.reducedMotion; + const forcedColors = emulatedMedia.forcedColors === "no-override" ? void 0 : emulatedMedia.forcedColors; + const contrast = emulatedMedia.contrast === "no-override" ? void 0 : emulatedMedia.contrast; + await this._session.send("Page.setEmulatedMedia", { + // Empty string means reset. + type: emulatedMedia.media === "no-override" ? "" : emulatedMedia.media, + colorScheme, + reducedMotion, + forcedColors, + contrast + }); + } + async updateRequestInterception() { + await this._networkManager.setRequestInterception(this._page.needsRequestInterception()); + } + async updateFileChooserInterception() { + const enabled = this._page.fileChooserIntercepted(); + await this._session.send("Page.setInterceptFileChooserDialog", { enabled }).catch(() => { + }); + } + async reload() { + await this._session.send("Page.reload"); + } + async goBack() { + const { success } = await this._session.send("Page.goBack", { frameId: this._page.mainFrame()._id }); + return success; + } + async goForward() { + const { success } = await this._session.send("Page.goForward", { frameId: this._page.mainFrame()._id }); + return success; + } + async requestGC() { + await this._session.send("Heap.collectGarbage"); + } + async addInitScript(initScript, worldName) { + this._initScripts.push({ initScript, worldName }); + await this._updateInitScripts(); + } + async removeInitScripts(initScripts) { + const set2 = new Set(initScripts); + this._initScripts = this._initScripts.filter((s) => !set2.has(s.initScript)); + await this._updateInitScripts(); + } + async _updateInitScripts() { + await this._session.send("Page.setInitScripts", { scripts: this._initScripts.map((s) => ({ script: s.initScript.source, worldName: s.worldName })) }); + } + async closePage(runBeforeUnload) { + await this._session.send("Page.close", { runBeforeUnload }); + } + async setBackgroundColor(color) { + if (color) + throw new Error("Not implemented"); + } + async takeScreenshot(progress2, format, documentRect, viewportRect, quality, fitsViewport, scale) { + if (!documentRect) { + const scrollOffset = await this._page.mainFrame().waitForFunctionValueInUtility(progress2, () => ({ x: window.scrollX, y: window.scrollY })); + documentRect = { + x: viewportRect.x + scrollOffset.x, + y: viewportRect.y + scrollOffset.y, + width: viewportRect.width, + height: viewportRect.height + }; + } + progress2.throwIfAborted(); + const { data: data2 } = await this._session.send("Page.screenshot", { + mimeType: "image/" + format, + clip: documentRect, + quality, + omitDeviceScaleFactor: scale === "css" + }); + return Buffer.from(data2, "base64"); + } + async getContentFrame(handle) { + const { contentFrameId } = await this._session.send("Page.describeNode", { + frameId: handle._context.frame._id, + objectId: handle._objectId + }); + if (!contentFrameId) + return null; + return this._page.frameManager.frame(contentFrameId); + } + async getOwnerFrame(handle) { + const { ownerFrameId } = await this._session.send("Page.describeNode", { + frameId: handle._context.frame._id, + objectId: handle._objectId + }); + return ownerFrameId || null; + } + async getBoundingBox(handle) { + const quads = await this.getContentQuads(handle); + if (!quads || !quads.length) + return null; + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + for (const quad of quads) { + for (const point of quad) { + minX = Math.min(minX, point.x); + maxX = Math.max(maxX, point.x); + minY = Math.min(minY, point.y); + maxY = Math.max(maxY, point.y); + } + } + return { x: minX, y: minY, width: maxX - minX, height: maxY - minY }; + } + async scrollRectIntoViewIfNeeded(handle, rect) { + return await this._session.send("Page.scrollIntoViewIfNeeded", { + frameId: handle._context.frame._id, + objectId: handle._objectId, + rect + }).then(() => "done").catch((e) => { + if (e instanceof Error && e.message.includes("Node is detached from document")) + return "error:notconnected"; + if (e instanceof Error && e.message.includes("Node does not have a layout object")) + return "error:notvisible"; + throw e; + }); + } + async setScreencastOptions(options2) { + if (options2) { + const { screencastId } = await this._session.send("Page.startScreencast", options2); + this._screencastId = screencastId; + } else { + await this._session.send("Page.stopScreencast"); + } + } + _onScreencastFrame(event) { + if (!this._screencastId) + return; + const screencastId = this._screencastId; + this._page.throttleScreencastFrameAck(() => { + this._session.send("Page.screencastFrameAck", { screencastId }).catch((e) => debugLogger.log("error", e)); + }); + const buffer2 = Buffer.from(event.data, "base64"); + this._page.emit(Page$1.Events.ScreencastFrame, { + buffer: buffer2, + width: event.deviceWidth, + height: event.deviceHeight + }); + } + rafCountForStablePosition() { + return 1; + } + async getContentQuads(handle) { + const result = await this._session.sendMayFail("Page.getContentQuads", { + frameId: handle._context.frame._id, + objectId: handle._objectId + }); + if (!result) + return null; + return result.quads.map((quad) => [quad.p1, quad.p2, quad.p3, quad.p4]); + } + async setInputFilePaths(handle, files) { + await this._session.send("Page.setFileInputFiles", { + frameId: handle._context.frame._id, + objectId: handle._objectId, + files + }); + } + async adoptElementHandle(handle, to) { + const result = await this._session.send("Page.adoptNode", { + frameId: handle._context.frame._id, + objectId: handle._objectId, + executionContextId: to.delegate._executionContextId + }); + if (!result.remoteObject) + throw new Error(kUnableToAdoptErrorMessage); + return createHandle$1(to, result.remoteObject); + } + async getAccessibilityTree(needle) { + return getAccessibilityTree$1(this._session, needle); + } + async inputActionEpilogue() { + } + async resetForReuse() { + await this.rawMouse.move(-1, -1, "none", /* @__PURE__ */ new Set(), /* @__PURE__ */ new Set(), false); + } + async getFrameElement(frame) { + const parent = frame.parentFrame(); + if (!parent) + throw new Error("Frame has been detached."); + const context = await parent._mainContext(); + const result = await this._session.send("Page.adoptNode", { + frameId: frame._id, + executionContextId: context.delegate._executionContextId + }); + if (!result.remoteObject) + throw new Error("Frame has been detached."); + return createHandle$1(context, result.remoteObject); + } + shouldToggleStyleSheetToSyncAnimations() { + return false; + } +} +function webSocketId(frameId, wsid) { + return `${frameId}---${wsid}`; +} +class FFBrowser extends Browser$1 { + constructor(parent, connection, options2) { + super(parent, options2); + this._version = ""; + this._userAgent = ""; + this._connection = connection; + this.session = connection.rootSession; + this._ffPages = /* @__PURE__ */ new Map(); + this._contexts = /* @__PURE__ */ new Map(); + this._connection.on(ConnectionEvents.Disconnected, () => this._onDisconnect()); + this.session.on("Browser.attachedToTarget", this._onAttachedToTarget.bind(this)); + this.session.on("Browser.detachedFromTarget", this._onDetachedFromTarget.bind(this)); + this.session.on("Browser.downloadCreated", this._onDownloadCreated.bind(this)); + this.session.on("Browser.downloadFinished", this._onDownloadFinished.bind(this)); + this.session.on("Browser.videoRecordingFinished", this._onVideoRecordingFinished.bind(this)); + } + static async connect(parent, transport, options2) { + const connection = new FFConnection(transport, options2.protocolLogger, options2.browserLogsCollector); + const browser2 = new FFBrowser(parent, connection, options2); + if (options2.__testHookOnConnectToBrowser) + await options2.__testHookOnConnectToBrowser(); + let firefoxUserPrefs = options2.originalLaunchOptions.firefoxUserPrefs ?? {}; + if (Object.keys(kBandaidFirefoxUserPrefs).length) + firefoxUserPrefs = { ...kBandaidFirefoxUserPrefs, ...firefoxUserPrefs }; + const promises2 = [ + browser2.session.send("Browser.enable", { + attachToDefaultContext: !!options2.persistent, + userPrefs: Object.entries(firefoxUserPrefs).map(([name, value]) => ({ name, value })) + }), + browser2._initVersion() + ]; + if (options2.persistent) { + browser2._defaultContext = new FFBrowserContext(browser2, void 0, options2.persistent); + promises2.push(browser2._defaultContext._initialize()); + } + const proxy = options2.originalLaunchOptions.proxyOverride || options2.proxy; + if (proxy) + promises2.push(browser2.session.send("Browser.setBrowserProxy", toJugglerProxyOptions(proxy))); + await Promise.all(promises2); + return browser2; + } + async _initVersion() { + const result = await this.session.send("Browser.getInfo"); + this._version = result.version.substring(result.version.indexOf("/") + 1); + this._userAgent = result.userAgent; + } + isConnected() { + return !this._connection._closed; + } + async doCreateNewContext(options2) { + if (options2.isMobile) + throw new Error("options.isMobile is not supported in Firefox"); + const { browserContextId } = await this.session.send("Browser.createBrowserContext", { removeOnDetach: true }); + const context = new FFBrowserContext(this, browserContextId, options2); + await context._initialize(); + this._contexts.set(browserContextId, context); + return context; + } + contexts() { + return Array.from(this._contexts.values()); + } + version() { + return this._version; + } + userAgent() { + return this._userAgent; + } + _onDetachedFromTarget(payload) { + const ffPage = this._ffPages.get(payload.targetId); + this._ffPages.delete(payload.targetId); + ffPage.didClose(); + } + _onAttachedToTarget(payload) { + const { targetId, browserContextId, openerId, type: type2 } = payload.targetInfo; + assert(type2 === "page"); + const context = browserContextId ? this._contexts.get(browserContextId) : this._defaultContext; + assert(context, `Unknown context id:${browserContextId}, _defaultContext: ${this._defaultContext}`); + const session = this._connection.createSession(payload.sessionId); + const opener = openerId ? this._ffPages.get(openerId) : null; + const ffPage = new FFPage(session, context, opener); + this._ffPages.set(targetId, ffPage); + } + _onDownloadCreated(payload) { + const ffPage = this._ffPages.get(payload.pageTargetId); + if (!ffPage) + return; + ffPage._page.frameManager.frameAbortedNavigation(payload.frameId, "Download is starting"); + let originPage = ffPage._page.initializedOrUndefined(); + if (!originPage) { + ffPage._markAsError(new Error("Starting new page download")); + if (ffPage._opener) + originPage = ffPage._opener._page.initializedOrUndefined(); + } + if (!originPage) + return; + this._downloadCreated(originPage, payload.uuid, payload.url, payload.suggestedFileName); + } + _onDownloadFinished(payload) { + const error2 = payload.canceled ? "canceled" : payload.error; + this._downloadFinished(payload.uuid, error2); + } + _onVideoRecordingFinished(payload) { + var _a2; + (_a2 = this._takeVideo(payload.screencastId)) == null ? void 0 : _a2.reportFinished(); + } + _onDisconnect() { + for (const video of this._idToVideo.values()) + video.artifact.reportFinished(new TargetClosedError$1()); + this._idToVideo.clear(); + for (const ffPage of this._ffPages.values()) + ffPage.didClose(); + this._ffPages.clear(); + this._didClose(); + } +} +class FFBrowserContext extends BrowserContext$1 { + constructor(browser2, browserContextId, options2) { + super(browser2, options2, browserContextId); + } + async _initialize() { + assert(!this._ffPages().length); + const browserContextId = this._browserContextId; + const promises2 = [ + super._initialize(), + this._updateInitScripts() + ]; + if (this._options.acceptDownloads !== "internal-browser-default") { + promises2.push(this._browser.session.send("Browser.setDownloadOptions", { + browserContextId, + downloadOptions: { + behavior: this._options.acceptDownloads === "accept" ? "saveToDisk" : "cancel", + downloadsDir: this._browser.options.downloadsPath + } + })); + } + if (this._options.viewport) { + const viewport = { + viewportSize: { width: this._options.viewport.width, height: this._options.viewport.height }, + deviceScaleFactor: this._options.deviceScaleFactor || 1 + }; + promises2.push(this._browser.session.send("Browser.setDefaultViewport", { browserContextId, viewport })); + } + if (this._options.hasTouch) + promises2.push(this._browser.session.send("Browser.setTouchOverride", { browserContextId, hasTouch: true })); + if (this._options.userAgent) + promises2.push(this._browser.session.send("Browser.setUserAgentOverride", { browserContextId, userAgent: this._options.userAgent })); + if (this._options.bypassCSP) + promises2.push(this._browser.session.send("Browser.setBypassCSP", { browserContextId, bypassCSP: true })); + if (this._options.ignoreHTTPSErrors || this._options.internalIgnoreHTTPSErrors) + promises2.push(this._browser.session.send("Browser.setIgnoreHTTPSErrors", { browserContextId, ignoreHTTPSErrors: true })); + if (this._options.javaScriptEnabled === false) + promises2.push(this._browser.session.send("Browser.setJavaScriptDisabled", { browserContextId, javaScriptDisabled: true })); + if (this._options.locale) + promises2.push(this._browser.session.send("Browser.setLocaleOverride", { browserContextId, locale: this._options.locale })); + if (this._options.timezoneId) + promises2.push(this._browser.session.send("Browser.setTimezoneOverride", { browserContextId, timezoneId: this._options.timezoneId })); + if (this._options.extraHTTPHeaders || this._options.locale) + promises2.push(this.setExtraHTTPHeaders(this._options.extraHTTPHeaders || [])); + if (this._options.httpCredentials) + promises2.push(this.setHTTPCredentials(this._options.httpCredentials)); + if (this._options.geolocation) + promises2.push(this.setGeolocation(this._options.geolocation)); + if (this._options.offline) + promises2.push(this.setOffline(this._options.offline)); + if (this._options.colorScheme !== "no-override") { + promises2.push(this._browser.session.send("Browser.setColorScheme", { + browserContextId, + colorScheme: this._options.colorScheme !== void 0 ? this._options.colorScheme : "light" + })); + } + if (this._options.reducedMotion !== "no-override") { + promises2.push(this._browser.session.send("Browser.setReducedMotion", { + browserContextId, + reducedMotion: this._options.reducedMotion !== void 0 ? this._options.reducedMotion : "no-preference" + })); + } + if (this._options.forcedColors !== "no-override") { + promises2.push(this._browser.session.send("Browser.setForcedColors", { + browserContextId, + forcedColors: this._options.forcedColors !== void 0 ? this._options.forcedColors : "none" + })); + } + if (this._options.contrast !== "no-override") { + promises2.push(this._browser.session.send("Browser.setContrast", { + browserContextId, + contrast: this._options.contrast !== void 0 ? this._options.contrast : "no-preference" + })); + } + if (this._options.recordVideo) { + promises2.push(this._ensureVideosPath().then(() => { + return this._browser.session.send("Browser.setVideoRecordingOptions", { + // validateBrowserContextOptions ensures correct video size. + options: { + ...this._options.recordVideo.size, + dir: this._options.recordVideo.dir + }, + browserContextId: this._browserContextId + }); + })); + } + const proxy = this._options.proxyOverride || this._options.proxy; + if (proxy) { + promises2.push(this._browser.session.send("Browser.setContextProxy", { + browserContextId: this._browserContextId, + ...toJugglerProxyOptions(proxy) + })); + } + await Promise.all(promises2); + } + _ffPages() { + return Array.from(this._browser._ffPages.values()).filter((ffPage) => ffPage._browserContext === this); + } + possiblyUninitializedPages() { + return this._ffPages().map((ffPage) => ffPage._page); + } + async doCreateNewPage(markAsServerSideOnly) { + const { targetId } = await this._browser.session.send("Browser.newPage", { + browserContextId: this._browserContextId + }).catch((e) => { + if (e.message.includes("Failed to override timezone")) + throw new Error(`Invalid timezone ID: ${this._options.timezoneId}`); + throw e; + }); + const page = this._browser._ffPages.get(targetId)._page; + if (markAsServerSideOnly) + page.markAsServerSideOnly(); + return page; + } + async doGetCookies(urls) { + const { cookies } = await this._browser.session.send("Browser.getCookies", { browserContextId: this._browserContextId }); + return filterCookies(cookies.map((c) => { + const copy = { ...c }; + delete copy.size; + delete copy.session; + return copy; + }), urls); + } + async addCookies(cookies) { + const cc = rewriteCookies(cookies).map((c) => ({ + ...c, + expires: c.expires === -1 ? void 0 : c.expires + })); + await this._browser.session.send("Browser.setCookies", { browserContextId: this._browserContextId, cookies: cc }); + } + async doClearCookies() { + await this._browser.session.send("Browser.clearCookies", { browserContextId: this._browserContextId }); + } + async doGrantPermissions(origin, permissions) { + const webPermissionToProtocol = /* @__PURE__ */ new Map([ + ["geolocation", "geo"], + ["persistent-storage", "persistent-storage"], + ["push", "push"], + ["notifications", "desktop-notification"] + ]); + const filtered = permissions.map((permission) => { + const protocolPermission = webPermissionToProtocol.get(permission); + if (!protocolPermission) + throw new Error("Unknown permission: " + permission); + return protocolPermission; + }); + await this._browser.session.send("Browser.grantPermissions", { origin, browserContextId: this._browserContextId, permissions: filtered }); + } + async doClearPermissions() { + await this._browser.session.send("Browser.resetPermissions", { browserContextId: this._browserContextId }); + } + async setGeolocation(geolocation) { + verifyGeolocation(geolocation); + this._options.geolocation = geolocation; + await this._browser.session.send("Browser.setGeolocationOverride", { browserContextId: this._browserContextId, geolocation: geolocation || null }); + } + async setExtraHTTPHeaders(headers) { + this._options.extraHTTPHeaders = headers; + let allHeaders = this._options.extraHTTPHeaders; + if (this._options.locale) + allHeaders = mergeHeaders([allHeaders, singleHeader("Accept-Language", this._options.locale)]); + await this._browser.session.send("Browser.setExtraHTTPHeaders", { browserContextId: this._browserContextId, headers: allHeaders }); + } + async setUserAgent(userAgent) { + await this._browser.session.send("Browser.setUserAgentOverride", { browserContextId: this._browserContextId, userAgent: userAgent || null }); + } + async setOffline(offline) { + this._options.offline = offline; + await this._browser.session.send("Browser.setOnlineOverride", { browserContextId: this._browserContextId, override: offline ? "offline" : "online" }); + } + async doSetHTTPCredentials(httpCredentials) { + this._options.httpCredentials = httpCredentials; + let credentials = null; + if (httpCredentials) { + const { username, password, origin } = httpCredentials; + credentials = { username, password, origin }; + } + await this._browser.session.send("Browser.setHTTPCredentials", { browserContextId: this._browserContextId, credentials }); + } + async doAddInitScript(initScript) { + await this._updateInitScripts(); + } + async doRemoveInitScripts(initScripts) { + await this._updateInitScripts(); + } + async _updateInitScripts() { + const bindingScripts = [...this._pageBindings.values()].map((binding2) => binding2.initScript.source); + if (this.bindingsInitScript) + bindingScripts.unshift(this.bindingsInitScript.source); + const initScripts = this.initScripts.map((script) => script.source); + await this._browser.session.send("Browser.setInitScripts", { browserContextId: this._browserContextId, scripts: [...bindingScripts, ...initScripts].map((script) => ({ script })) }); + } + async doUpdateRequestInterception() { + await Promise.all([ + this._browser.session.send("Browser.setRequestInterception", { browserContextId: this._browserContextId, enabled: this.requestInterceptors.length > 0 }), + this._browser.session.send("Browser.setCacheDisabled", { browserContextId: this._browserContextId, cacheDisabled: this.requestInterceptors.length > 0 }) + ]); + } + async doExposePlaywrightBinding() { + this._browser.session.send("Browser.addBinding", { browserContextId: this._browserContextId, name: PageBinding.kBindingName, script: "" }); + } + onClosePersistent() { + } + async clearCache() { + await this._browser.session.send("Browser.clearCache"); + } + async doClose(reason) { + if (!this._browserContextId) { + if (this._options.recordVideo) { + await this._browser.session.send("Browser.setVideoRecordingOptions", { + options: void 0, + browserContextId: this._browserContextId + }); + } + await this._browser.close({ reason }); + } else { + await this._browser.session.send("Browser.removeBrowserContext", { browserContextId: this._browserContextId }); + this._browser._contexts.delete(this._browserContextId); + } + } + async cancelDownload(uuid) { + await this._browser.session.send("Browser.cancelDownload", { uuid }); + } +} +function toJugglerProxyOptions(proxy) { + const proxyServer = new URL(proxy.server); + let port = parseInt(proxyServer.port, 10); + let type2 = "http"; + if (proxyServer.protocol === "socks5:") + type2 = "socks"; + else if (proxyServer.protocol === "socks4:") + type2 = "socks4"; + else if (proxyServer.protocol === "https:") + type2 = "https"; + if (proxyServer.port === "") { + if (proxyServer.protocol === "http:") + port = 80; + else if (proxyServer.protocol === "https:") + port = 443; + } + return { + type: type2, + bypass: proxy.bypass ? proxy.bypass.split(",").map((domain) => domain.trim()) : [], + host: proxyServer.hostname, + port, + username: proxy.username, + password: proxy.password + }; +} +const kBandaidFirefoxUserPrefs = {}; +class Firefox extends BrowserType$1 { + constructor(parent) { + super(parent, "firefox"); + } + connectToTransport(transport, options2) { + return FFBrowser.connect(this.attribution.playwright, transport, options2); + } + doRewriteStartupLog(error2) { + if (!error2.logs) + return error2; + if (error2.logs.includes(`as root in a regular user's session is not supported.`)) + error2.logs = "\n" + wrapInASCIIBox(`Firefox is unable to launch if the $HOME folder isn't owned by the current user. +Workaround: Set the HOME=/root environment variable${define_process_env_default.GITHUB_ACTION ? " in your GitHub Actions workflow file" : ""} when running Playwright.`, 1); + if (error2.logs.includes("no DISPLAY environment variable specified")) + error2.logs = "\n" + wrapInASCIIBox(kNoXServerRunningError, 1); + return error2; + } + amendEnvironment(env, userDataDir, executable, browserArguments) { + if (!path.isAbsolute(os.homedir())) + throw new Error(`Cannot launch Firefox with relative home directory. Did you set ${os.platform() === "win32" ? "USERPROFILE" : "HOME"} to a relative path?`); + if (os.platform() === "linux") { + return { ...env, SNAP_NAME: void 0, SNAP_INSTANCE_NAME: void 0 }; + } + return env; + } + attemptToGracefullyCloseBrowser(transport) { + const message = { method: "Browser.close", params: {}, id: kBrowserCloseMessageId$1 }; + transport.send(message); + } + defaultArgs(options2, isPersistent, userDataDir) { + const { args = [], headless } = options2; + const userDataDirArg = args.find((arg) => arg.startsWith("-profile") || arg.startsWith("--profile")); + if (userDataDirArg) + throw this._createUserDataDirArgMisuseError("--profile"); + if (args.find((arg) => arg.startsWith("-juggler"))) + throw new Error("Use the port parameter instead of -juggler argument"); + const firefoxArguments = ["-no-remote"]; + if (headless) { + firefoxArguments.push("-headless"); + } else { + firefoxArguments.push("-wait-for-browser"); + firefoxArguments.push("-foreground"); + } + firefoxArguments.push(`-profile`, userDataDir); + firefoxArguments.push("-juggler-pipe"); + firefoxArguments.push(...args); + if (isPersistent) + firefoxArguments.push("about:blank"); + else + firefoxArguments.push("-silent"); + return firefoxArguments; + } + readyState(options2) { + return new JugglerReadyState(); + } +} +class JugglerReadyState extends BrowserReadyState { + onBrowserOutput(message) { + if (message.includes("Juggler listening to the pipe")) + this._wsEndpoint.resolve(void 0); + } +} +const kBrowserCloseMessageId = -9999; +const kPageProxyMessageReceived = Symbol("kPageProxyMessageReceived"); +class WKConnection { + constructor(transport, onDisconnect, protocolLogger, browserLogsCollector) { + this._lastId = 0; + this._closed = false; + this._transport = transport; + this._onDisconnect = onDisconnect; + this._protocolLogger = protocolLogger; + this._browserLogsCollector = browserLogsCollector; + this.browserSession = new WKSession(this, "", (message) => { + this.rawSend(message); + }); + this._transport.onmessage = this._dispatchMessage.bind(this); + this._transport.onclose = this._onClose.bind(this); + } + nextMessageId() { + return ++this._lastId; + } + rawSend(message) { + this._protocolLogger("send", message); + this._transport.send(message); + } + _dispatchMessage(message) { + this._protocolLogger("receive", message); + if (message.id === kBrowserCloseMessageId) + return; + if (message.pageProxyId) { + const payload = { message, pageProxyId: message.pageProxyId }; + this.browserSession.dispatchMessage({ method: kPageProxyMessageReceived, params: payload }); + return; + } + this.browserSession.dispatchMessage(message); + } + _onClose(reason) { + this._closed = true; + this._transport.onmessage = void 0; + this._transport.onclose = void 0; + this._browserDisconnectedLogs = helper.formatBrowserLogs(this._browserLogsCollector.recentLogs(), reason); + this.browserSession.dispose(); + this._onDisconnect(); + } + isClosed() { + return this._closed; + } + close() { + if (!this._closed) + this._transport.close(); + } +} +class WKSession extends eventsExports.EventEmitter { + constructor(connection, sessionId, rawSend) { + super(); + this._disposed = false; + this._callbacks = /* @__PURE__ */ new Map(); + this._crashed = false; + this.setMaxListeners(0); + this.connection = connection; + this.sessionId = sessionId; + this._rawSend = rawSend; + this.on = super.on; + this.off = super.removeListener; + this.addListener = super.addListener; + this.removeListener = super.removeListener; + this.once = super.once; + } + async send(method, params) { + if (this._crashed || this._disposed || this.connection._browserDisconnectedLogs) + throw new ProtocolError(this._crashed ? "crashed" : "closed", void 0, this.connection._browserDisconnectedLogs); + const id = this.connection.nextMessageId(); + const messageObj = { id, method, params }; + this._rawSend(messageObj); + return new Promise((resolve, reject) => { + this._callbacks.set(id, { resolve, reject, error: new ProtocolError("error", method) }); + }); + } + sendMayFail(method, params) { + return this.send(method, params).catch((error2) => debugLogger.log("error", error2)); + } + markAsCrashed() { + this._crashed = true; + } + isDisposed() { + return this._disposed; + } + dispose() { + for (const callback of this._callbacks.values()) { + callback.error.type = this._crashed ? "crashed" : "closed"; + callback.error.logs = this.connection._browserDisconnectedLogs; + callback.reject(callback.error); + } + this._callbacks.clear(); + this._disposed = true; + } + dispatchMessage(object) { + if (object.id && this._callbacks.has(object.id)) { + const callback = this._callbacks.get(object.id); + this._callbacks.delete(object.id); + if (object.error) { + callback.error.setMessage(object.error.message); + callback.reject(callback.error); + } else { + callback.resolve(object.result); + } + } else if (object.id && !object.error) { + assert(this.isDisposed()); + } else { + Promise.resolve().then(() => this.emit(object.method, object.params)); + } + } +} +async function getAccessibilityTree(session, needle) { + const objectId = needle ? needle._objectId : void 0; + const { axNode } = await session.send("Page.accessibilitySnapshot", { objectId }); + const tree = new WKAXNode(axNode); + return { + tree, + needle: needle ? tree._findNeedle() : null + }; +} +const WKRoleToARIARole = new Map(Object.entries({ + "TextField": "textbox" +})); +const WKUnhelpfulRoleDescriptions = new Map(Object.entries({ + "WebArea": "HTML content", + "Summary": "summary", + "DescriptionList": "description list", + "ImageMap": "image map", + "ListMarker": "list marker", + "Video": "video playback", + "Mark": "highlighted", + "contentinfo": "content information", + "Details": "details", + "DescriptionListDetail": "description", + "DescriptionListTerm": "term", + "alertdialog": "web alert dialog", + "dialog": "web dialog", + "status": "application status", + "tabpanel": "tab panel", + "application": "web application" +})); +class WKAXNode { + constructor(payload) { + this._payload = payload; + this._children = []; + for (const payload2 of this._payload.children || []) + this._children.push(new WKAXNode(payload2)); + } + children() { + return this._children; + } + _findNeedle() { + if (this._payload.found) + return this; + for (const child of this._children) { + const found = child._findNeedle(); + if (found) + return found; + } + return null; + } + isControl() { + switch (this._payload.role) { + case "button": + case "checkbox": + case "ColorWell": + case "combobox": + case "DisclosureTriangle": + case "listbox": + case "menu": + case "menubar": + case "menuitem": + case "menuitemcheckbox": + case "menuitemradio": + case "radio": + case "scrollbar": + case "searchbox": + case "slider": + case "spinbutton": + case "switch": + case "tab": + case "textbox": + case "TextField": + case "tree": + return true; + default: + return false; + } + } + _isTextControl() { + switch (this._payload.role) { + case "combobox": + case "searchfield": + case "textbox": + case "TextField": + return true; + } + return false; + } + _name() { + if (this._payload.role === "text") + return this._payload.value || ""; + return this._payload.name || ""; + } + isInteresting(insideControl) { + const { role, focusable } = this._payload; + const name = this._name(); + if (role === "ScrollArea") + return false; + if (role === "WebArea") + return true; + if (focusable || role === "MenuListOption") + return true; + if (this.isControl()) + return true; + if (insideControl) + return false; + return this.isLeafNode() && !!name; + } + _hasRedundantTextChild() { + if (this._children.length !== 1) + return false; + const child = this._children[0]; + return child._payload.role === "text" && this._payload.name === child._payload.value; + } + isLeafNode() { + if (!this._children.length) + return true; + if (this._isTextControl()) + return true; + if (this._hasRedundantTextChild()) + return true; + return false; + } + serialize() { + const node2 = { + role: WKRoleToARIARole.get(this._payload.role) || this._payload.role, + name: this._name() + }; + if ("description" in this._payload && this._payload.description !== node2.name) + node2.description = this._payload.description; + if ("roledescription" in this._payload) { + const roledescription = this._payload.roledescription; + if (roledescription !== this._payload.role && WKUnhelpfulRoleDescriptions.get(this._payload.role) !== roledescription) + node2.roledescription = roledescription; + } + if ("value" in this._payload && this._payload.role !== "text") { + if (typeof this._payload.value === "string") + node2.valueString = this._payload.value; + else if (typeof this._payload.value === "number") + node2.valueNumber = this._payload.value; + } + if ("checked" in this._payload) + node2.checked = this._payload.checked === "true" ? "checked" : this._payload.checked === "false" ? "unchecked" : "mixed"; + if ("pressed" in this._payload) + node2.pressed = this._payload.pressed === "true" ? "pressed" : this._payload.pressed === "false" ? "released" : "mixed"; + const userStringProperties = [ + "keyshortcuts", + "valuetext" + ]; + for (const userStringProperty of userStringProperties) { + if (!(userStringProperty in this._payload)) + continue; + node2[userStringProperty] = this._payload[userStringProperty]; + } + const booleanProperties = [ + "disabled", + "expanded", + "focused", + "modal", + "multiselectable", + "readonly", + "required", + "selected" + ]; + for (const booleanProperty of booleanProperties) { + if (booleanProperty === "focused" && (this._payload.role === "WebArea" || this._payload.role === "ScrollArea")) + continue; + const value = this._payload[booleanProperty]; + if (!value) + continue; + node2[booleanProperty] = value; + } + const numericalProperties = [ + "level", + "valuemax", + "valuemin" + ]; + for (const numericalProperty of numericalProperties) { + if (!(numericalProperty in this._payload)) + continue; + node2[numericalProperty] = this._payload[numericalProperty]; + } + const tokenProperties = [ + "autocomplete", + "haspopup", + "invalid" + ]; + for (const tokenProperty of tokenProperties) { + const value = this._payload[tokenProperty]; + if (!value || value === "false") + continue; + node2[tokenProperty] = value; + } + const orientationIsApplicable = /* @__PURE__ */ new Set([ + "ScrollArea", + "scrollbar", + "listbox", + "combobox", + "menu", + "tree", + "separator", + "slider", + "tablist", + "toolbar" + ]); + if (this._payload.orientation && orientationIsApplicable.has(this._payload.role)) + node2.orientation = this._payload.orientation; + return node2; + } +} +class WKExecutionContext { + constructor(session, contextId) { + this._session = session; + this._contextId = contextId; + } + async rawEvaluateJSON(expression) { + try { + const response2 = await this._session.send("Runtime.evaluate", { + expression, + contextId: this._contextId, + returnByValue: true + }); + if (response2.wasThrown) + throw new JavaScriptErrorInEvaluate(response2.result.description); + return response2.result.value; + } catch (error2) { + throw rewriteError(error2); + } + } + async rawEvaluateHandle(context, expression) { + try { + const response2 = await this._session.send("Runtime.evaluate", { + expression, + contextId: this._contextId, + returnByValue: false + }); + if (response2.wasThrown) + throw new JavaScriptErrorInEvaluate(response2.result.description); + return createHandle(context, response2.result); + } catch (error2) { + throw rewriteError(error2); + } + } + async evaluateWithArguments(expression, returnByValue, utilityScript, values, handles) { + try { + const response2 = await this._session.send("Runtime.callFunctionOn", { + functionDeclaration: expression, + objectId: utilityScript._objectId, + arguments: [ + { objectId: utilityScript._objectId }, + ...values.map((value) => ({ value })), + ...handles.map((handle) => ({ objectId: handle._objectId })) + ], + returnByValue, + emulateUserGesture: true, + awaitPromise: true + }); + if (response2.wasThrown) + throw new JavaScriptErrorInEvaluate(response2.result.description); + if (returnByValue) + return parseEvaluationResultValue(response2.result.value); + return createHandle(utilityScript._context, response2.result); + } catch (error2) { + throw rewriteError(error2); + } + } + async getProperties(object) { + const response2 = await this._session.send("Runtime.getProperties", { + objectId: object._objectId, + ownProperties: true + }); + const result = /* @__PURE__ */ new Map(); + for (const property of response2.properties) { + if (!property.enumerable || !property.value) + continue; + result.set(property.name, createHandle(object._context, property.value)); + } + return result; + } + async releaseHandle(handle) { + if (!handle._objectId) + return; + await this._session.send("Runtime.releaseObject", { objectId: handle._objectId }); + } +} +function potentiallyUnserializableValue(remoteObject) { + const value = remoteObject.value; + const isUnserializable = remoteObject.type === "number" && ["NaN", "-Infinity", "Infinity", "-0"].includes(remoteObject.description); + return isUnserializable ? parseUnserializableValue(remoteObject.description) : value; +} +function rewriteError(error2) { + if (error2.message.includes("Object has too long reference chain")) + throw new Error("Cannot serialize result: object reference chain is too long."); + if (!isJavaScriptErrorInEvaluate(error2) && !isSessionClosedError(error2)) + return new Error("Execution context was destroyed, most likely because of a navigation."); + return error2; +} +function renderPreview(object) { + if (object.type === "undefined") + return "undefined"; + if ("value" in object) + return String(object.value); + if (object.description === "Object" && object.preview) { + const tokens = []; + for (const { name, value } of object.preview.properties) + tokens.push(`${name}: ${value}`); + return `{${tokens.join(", ")}}`; + } + if (object.subtype === "array" && object.preview) + return sparseArrayToString(object.preview.properties); + return object.description; +} +function createHandle(context, remoteObject) { + if (remoteObject.subtype === "node") { + assert(context instanceof FrameExecutionContext); + return new ElementHandle$1(context, remoteObject.objectId); + } + const isPromise = remoteObject.className === "Promise"; + return new JSHandle$1(context, isPromise ? "promise" : remoteObject.subtype || remoteObject.type, renderPreview(remoteObject), remoteObject.objectId, potentiallyUnserializableValue(remoteObject)); +} +function toModifiersMask(modifiers) { + let mask = 0; + if (modifiers.has("Shift")) + mask |= 1; + if (modifiers.has("Control")) + mask |= 2; + if (modifiers.has("Alt")) + mask |= 4; + if (modifiers.has("Meta")) + mask |= 8; + return mask; +} +function toButtonsMask(buttons) { + let mask = 0; + if (buttons.has("left")) + mask |= 1; + if (buttons.has("right")) + mask |= 2; + if (buttons.has("middle")) + mask |= 4; + return mask; +} +class RawKeyboardImpl4 { + constructor(session) { + this._pageProxySession = session; + } + setSession(session) { + this._session = session; + } + async keydown(modifiers, keyName, description, autoRepeat) { + const parts = []; + for (const modifier of ["Shift", "Control", "Alt", "Meta"]) { + if (modifiers.has(modifier)) + parts.push(modifier); + } + const { code, keyCode, key: key2, text } = description; + parts.push(code); + const shortcut = parts.join("+"); + let commands = macEditingCommands[shortcut]; + if (isString(commands)) + commands = [commands]; + await this._pageProxySession.send("Input.dispatchKeyEvent", { + type: "keyDown", + modifiers: toModifiersMask(modifiers), + windowsVirtualKeyCode: keyCode, + code, + key: key2, + text, + unmodifiedText: text, + autoRepeat, + macCommands: commands, + isKeypad: description.location === keypadLocation + }); + } + async keyup(modifiers, keyName, description) { + const { code, key: key2 } = description; + await this._pageProxySession.send("Input.dispatchKeyEvent", { + type: "keyUp", + modifiers: toModifiersMask(modifiers), + key: key2, + windowsVirtualKeyCode: description.keyCode, + code, + isKeypad: description.location === keypadLocation + }); + } + async sendText(text) { + await this._session.send("Page.insertText", { text }); + } +} +class RawMouseImpl4 { + constructor(session) { + this._pageProxySession = session; + } + setSession(session) { + this._session = session; + } + async move(x, y, button, buttons, modifiers, forClick) { + await this._pageProxySession.send("Input.dispatchMouseEvent", { + type: "move", + button, + buttons: toButtonsMask(buttons), + x, + y, + modifiers: toModifiersMask(modifiers) + }); + } + async down(x, y, button, buttons, modifiers, clickCount) { + await this._pageProxySession.send("Input.dispatchMouseEvent", { + type: "down", + button, + buttons: toButtonsMask(buttons), + x, + y, + modifiers: toModifiersMask(modifiers), + clickCount + }); + } + async up(x, y, button, buttons, modifiers, clickCount) { + await this._pageProxySession.send("Input.dispatchMouseEvent", { + type: "up", + button, + buttons: toButtonsMask(buttons), + x, + y, + modifiers: toModifiersMask(modifiers), + clickCount + }); + } + async wheel(x, y, buttons, modifiers, deltaX, deltaY) { + var _a2; + if ((_a2 = this._page) == null ? void 0 : _a2.browserContext._options.isMobile) + throw new Error("Mouse wheel is not supported in mobile WebKit"); + await this._session.send("Page.updateScrollingState"); + await this._page.mainFrame().evaluateExpression(`new Promise(requestAnimationFrame)`, { world: "utility" }); + await this._pageProxySession.send("Input.dispatchWheelEvent", { + x, + y, + deltaX, + deltaY, + modifiers: toModifiersMask(modifiers) + }); + } + setPage(page) { + this._page = page; + } +} +class RawTouchscreenImpl4 { + constructor(session) { + this._pageProxySession = session; + } + async tap(x, y, modifiers) { + await this._pageProxySession.send("Input.dispatchTapEvent", { + x, + y, + modifiers: toModifiersMask(modifiers) + }); + } +} +const errorReasons = { + "aborted": "Cancellation", + "accessdenied": "AccessControl", + "addressunreachable": "General", + "blockedbyclient": "Cancellation", + "blockedbyresponse": "General", + "connectionaborted": "General", + "connectionclosed": "General", + "connectionfailed": "General", + "connectionrefused": "General", + "connectionreset": "General", + "internetdisconnected": "General", + "namenotresolved": "General", + "timedout": "Timeout", + "failed": "General" +}; +class WKInterceptableRequest { + constructor(session, frame, event, redirectedFrom, documentId) { + this._session = session; + this._requestId = event.requestId; + const resourceType = event.type ? event.type.toLowerCase() : redirectedFrom ? redirectedFrom.request.resourceType() : "other"; + let postDataBuffer = null; + this._timestamp = event.timestamp; + this._wallTime = event.walltime * 1e3; + if (event.request.postData) + postDataBuffer = Buffer.from(event.request.postData, "base64"); + this.request = new Request$1( + frame._page.browserContext, + frame, + null, + (redirectedFrom == null ? void 0 : redirectedFrom.request) || null, + documentId, + event.request.url, + resourceType, + event.request.method, + postDataBuffer, + headersObjectToArray(event.request.headers) + ); + } + adoptRequestFromNewProcess(newSession, requestId) { + this._session = newSession; + this._requestId = requestId; + } + createResponse(responsePayload) { + const getResponseBody = async () => { + const response22 = await this._session.send("Network.getResponseBody", { requestId: this._requestId }); + return Buffer.from(response22.body, response22.base64Encoded ? "base64" : "utf8"); + }; + const timingPayload = responsePayload.timing; + const timing = { + startTime: this._wallTime, + domainLookupStart: timingPayload ? wkMillisToRoundishMillis(timingPayload.domainLookupStart) : -1, + domainLookupEnd: timingPayload ? wkMillisToRoundishMillis(timingPayload.domainLookupEnd) : -1, + connectStart: timingPayload ? wkMillisToRoundishMillis(timingPayload.connectStart) : -1, + secureConnectionStart: timingPayload ? wkMillisToRoundishMillis(timingPayload.secureConnectionStart) : -1, + connectEnd: timingPayload ? wkMillisToRoundishMillis(timingPayload.connectEnd) : -1, + requestStart: timingPayload ? wkMillisToRoundishMillis(timingPayload.requestStart) : -1, + responseStart: timingPayload ? wkMillisToRoundishMillis(timingPayload.responseStart) : -1 + }; + const setCookieSeparator = process.platform === "darwin" ? "," : "playwright-set-cookie-separator"; + const response2 = new Response$1(this.request, responsePayload.status, responsePayload.statusText, headersObjectToArray(responsePayload.headers, ",", setCookieSeparator), timing, getResponseBody, responsePayload.source === "service-worker"); + response2.setRawResponseHeaders(null); + response2.setTransferSize(null); + if (responsePayload.requestHeaders && Object.keys(responsePayload.requestHeaders).length) { + const headers = { ...responsePayload.requestHeaders }; + if (!headers["host"]) + headers["Host"] = new URL(this.request.url()).host; + this.request.setRawRequestHeaders(headersObjectToArray(headers)); + } else { + this.request.setRawRequestHeaders(null); + } + return response2; + } +} +class WKRouteImpl { + constructor(session, requestId) { + this._session = session; + this._requestId = requestId; + } + async abort(errorCode) { + const errorType = errorReasons[errorCode]; + assert(errorType, "Unknown error code: " + errorCode); + await this._session.sendMayFail("Network.interceptRequestWithError", { requestId: this._requestId, errorType }); + } + async fulfill(response2) { + if (300 <= response2.status && response2.status < 400) + throw new Error("Cannot fulfill with redirect status: " + response2.status); + let mimeType = response2.isBase64 ? "application/octet-stream" : "text/plain"; + const headers = headersArrayToObject( + response2.headers, + true + /* lowerCase */ + ); + const contentType = headers["content-type"]; + if (contentType) + mimeType = contentType.split(";")[0].trim(); + await this._session.sendMayFail("Network.interceptRequestWithResponse", { + requestId: this._requestId, + status: response2.status, + statusText: statusText(response2.status), + mimeType, + headers, + base64Encoded: response2.isBase64, + content: response2.body + }); + } + async continue(overrides) { + await this._session.sendMayFail("Network.interceptWithRequest", { + requestId: this._requestId, + url: overrides.url, + method: overrides.method, + headers: overrides.headers ? headersArrayToObject( + overrides.headers, + false + /* lowerCase */ + ) : void 0, + postData: overrides.postData ? Buffer.from(overrides.postData).toString("base64") : void 0 + }); + } +} +function wkMillisToRoundishMillis(value) { + if (value === -1e3) + return -1; + if (value <= 0) { + return -1; + } + return (value * 1e3 | 0) / 1e3; +} +class WKProvisionalPage { + constructor(session, page) { + var _a2; + this._sessionListeners = []; + this._mainFrameId = null; + this._session = session; + this._wkPage = page; + this._coopNavigationRequest = (_a2 = page._page.mainFrame().pendingDocument()) == null ? void 0 : _a2.request; + const overrideFrameId = (handler) => { + return (payload) => { + if (payload.frameId) + payload.frameId = this._wkPage._page.frameManager.mainFrame()._id; + handler(payload); + }; + }; + const wkPage = this._wkPage; + this._sessionListeners = [ + eventsHelper.addEventListener(session, "Network.requestWillBeSent", overrideFrameId((e) => this._onRequestWillBeSent(e))), + eventsHelper.addEventListener(session, "Network.requestIntercepted", overrideFrameId((e) => wkPage._onRequestIntercepted(session, e))), + eventsHelper.addEventListener(session, "Network.responseReceived", overrideFrameId((e) => wkPage._onResponseReceived(session, e))), + eventsHelper.addEventListener(session, "Network.loadingFinished", overrideFrameId((e) => this._onLoadingFinished(e))), + eventsHelper.addEventListener(session, "Network.loadingFailed", overrideFrameId((e) => this._onLoadingFailed(e))) + ]; + this.initializationPromise = this._wkPage._initializeSession(session, true, ({ frameTree }) => this._handleFrameTree(frameTree)); + } + coopNavigationRequest() { + return this._coopNavigationRequest; + } + dispose() { + eventsHelper.removeEventListeners(this._sessionListeners); + } + commit() { + assert(this._mainFrameId); + this._wkPage._onFrameAttached(this._mainFrameId, null); + } + _onRequestWillBeSent(event) { + if (this._coopNavigationRequest && this._coopNavigationRequest.url() === event.request.url) { + this._wkPage._adoptRequestFromNewProcess(this._coopNavigationRequest, this._session, event.requestId); + return; + } + this._wkPage._onRequestWillBeSent(this._session, event); + } + _onLoadingFinished(event) { + this._coopNavigationRequest = void 0; + this._wkPage._onLoadingFinished(event); + } + _onLoadingFailed(event) { + this._coopNavigationRequest = void 0; + this._wkPage._onLoadingFailed(this._session, event); + } + _handleFrameTree(frameTree) { + assert(!frameTree.frame.parentId); + this._mainFrameId = frameTree.frame.id; + } +} +class WKWorkers { + constructor(page) { + this._sessionListeners = []; + this._workerSessions = /* @__PURE__ */ new Map(); + this._page = page; + } + setSession(session) { + eventsHelper.removeEventListeners(this._sessionListeners); + this.clear(); + this._sessionListeners = [ + eventsHelper.addEventListener(session, "Worker.workerCreated", (event) => { + const worker = new Worker$1(this._page, event.url); + const workerSession = new WKSession(session.connection, event.workerId, (message) => { + session.send("Worker.sendMessageToWorker", { + workerId: event.workerId, + message: JSON.stringify(message) + }).catch((e) => { + workerSession.dispatchMessage({ id: message.id, error: { message: e.message } }); + }); + }); + this._workerSessions.set(event.workerId, workerSession); + worker.createExecutionContext(new WKExecutionContext(workerSession, void 0)); + this._page.addWorker(event.workerId, worker); + workerSession.on("Console.messageAdded", (event2) => this._onConsoleMessage(worker, event2)); + Promise.all([ + workerSession.send("Runtime.enable"), + workerSession.send("Console.enable"), + session.send("Worker.initialized", { workerId: event.workerId }) + ]).catch((e) => { + this._page.removeWorker(event.workerId); + }); + }), + eventsHelper.addEventListener(session, "Worker.dispatchMessageFromWorker", (event) => { + const workerSession = this._workerSessions.get(event.workerId); + if (!workerSession) + return; + workerSession.dispatchMessage(JSON.parse(event.message)); + }), + eventsHelper.addEventListener(session, "Worker.workerTerminated", (event) => { + const workerSession = this._workerSessions.get(event.workerId); + if (!workerSession) + return; + workerSession.dispose(); + this._workerSessions.delete(event.workerId); + this._page.removeWorker(event.workerId); + }) + ]; + } + clear() { + this._page.clearWorkers(); + this._workerSessions.clear(); + } + async initializeSession(session) { + await session.send("Worker.enable"); + } + async _onConsoleMessage(worker, event) { + const { type: type2, level, text, parameters, url: url2, line: lineNumber, column: columnNumber } = event.message; + let derivedType = type2 || ""; + if (type2 === "log") + derivedType = level; + else if (type2 === "timing") + derivedType = "timeEnd"; + const handles = (parameters || []).map((p) => { + return createHandle(worker.existingExecutionContext, p); + }); + const location2 = { + url: url2 || "", + lineNumber: (lineNumber || 1) - 1, + columnNumber: (columnNumber || 1) - 1 + }; + this._page.addConsoleMessage(derivedType, handles, location2, handles.length ? void 0 : text); + } +} +const UTILITY_WORLD_NAME = "__playwright_utility_world__"; +class WKPage { + constructor(browserContext, pageProxySession, opener) { + this._provisionalPage = null; + this._requestIdToRequest = /* @__PURE__ */ new Map(); + this._requestIdToRequestWillBeSentEvent = /* @__PURE__ */ new Map(); + this._sessionListeners = []; + this._firstNonInitialNavigationCommittedFulfill = () => { + }; + this._firstNonInitialNavigationCommittedReject = (e) => { + }; + this._lastConsoleMessage = null; + this._requestIdToResponseReceivedPayloadEvent = /* @__PURE__ */ new Map(); + this._recordingVideoFile = null; + this._screencastGeneration = 0; + this._pageProxySession = pageProxySession; + this._opener = opener; + this.rawKeyboard = new RawKeyboardImpl4(pageProxySession); + this.rawMouse = new RawMouseImpl4(pageProxySession); + this.rawTouchscreen = new RawTouchscreenImpl4(pageProxySession); + this._contextIdToContext = /* @__PURE__ */ new Map(); + this._page = new Page$1(this, browserContext); + this.rawMouse.setPage(this._page); + this._workers = new WKWorkers(this._page); + this._session = void 0; + this._browserContext = browserContext; + this._page.on(Page$1.Events.FrameDetached, (frame) => this._removeContextsForFrame(frame, false)); + this._eventListeners = [ + eventsHelper.addEventListener(this._pageProxySession, "Target.targetCreated", this._onTargetCreated.bind(this)), + eventsHelper.addEventListener(this._pageProxySession, "Target.targetDestroyed", this._onTargetDestroyed.bind(this)), + eventsHelper.addEventListener(this._pageProxySession, "Target.dispatchMessageFromTarget", this._onDispatchMessageFromTarget.bind(this)), + eventsHelper.addEventListener(this._pageProxySession, "Target.didCommitProvisionalTarget", this._onDidCommitProvisionalTarget.bind(this)), + eventsHelper.addEventListener(this._pageProxySession, "Screencast.screencastFrame", this._onScreencastFrame.bind(this)) + ]; + this._firstNonInitialNavigationCommittedPromise = new Promise((f, r) => { + this._firstNonInitialNavigationCommittedFulfill = f; + this._firstNonInitialNavigationCommittedReject = r; + }); + if (opener && !browserContext._options.noDefaultViewport && opener._nextWindowOpenPopupFeatures) { + const viewportSize = helper.getViewportSizeFromWindowFeatures(opener._nextWindowOpenPopupFeatures); + opener._nextWindowOpenPopupFeatures = void 0; + if (viewportSize) + this._page.setEmulatedSizeFromWindowOpen({ viewport: viewportSize, screen: viewportSize }); + } + } + async _initializePageProxySession() { + if (this._page.browserContext.isSettingStorageState()) + return; + const promises2 = [ + this._pageProxySession.send("Dialog.enable"), + this._pageProxySession.send("Emulation.setActiveAndFocused", { active: true }) + ]; + const contextOptions = this._browserContext._options; + if (contextOptions.javaScriptEnabled === false) + promises2.push(this._pageProxySession.send("Emulation.setJavaScriptEnabled", { enabled: false })); + promises2.push(this._updateViewport()); + promises2.push(this.updateHttpCredentials()); + if (this._browserContext._permissions.size) { + for (const [key2, value] of this._browserContext._permissions) + promises2.push(this._grantPermissions(key2, value)); + } + if (this._browserContext._options.recordVideo) { + const outputFile = path.join(this._browserContext._options.recordVideo.dir, createGuid() + ".webm"); + promises2.push(this._browserContext._ensureVideosPath().then(() => { + return this._startVideo({ + // validateBrowserContextOptions ensures correct video size. + ...this._browserContext._options.recordVideo.size, + outputFile + }); + })); + } + await Promise.all(promises2); + } + _setSession(session) { + eventsHelper.removeEventListeners(this._sessionListeners); + this._session = session; + this.rawKeyboard.setSession(session); + this.rawMouse.setSession(session); + this._addSessionListeners(); + this._workers.setSession(session); + } + // This method is called for provisional targets as well. The session passed as the parameter + // may be different from the current session and may be destroyed without becoming current. + async _initializeSession(session, provisional, resourceTreeHandler) { + await this._initializeSessionMayThrow(session, resourceTreeHandler).catch((e) => { + if (provisional && session.isDisposed()) + return; + if (this._session === session) + throw e; + }); + } + async _initializeSessionMayThrow(session, resourceTreeHandler) { + const [, frameTree] = await Promise.all([ + // Page agent must be enabled before Runtime. + session.send("Page.enable"), + session.send("Page.getResourceTree") + ]); + resourceTreeHandler(frameTree); + const promises2 = [ + // Resource tree should be received before first execution context. + session.send("Runtime.enable"), + session.send("Page.createUserWorld", { name: UTILITY_WORLD_NAME }).catch((_) => { + }), + // Worlds are per-process + session.send("Console.enable"), + session.send("Network.enable"), + this._workers.initializeSession(session) + ]; + if (this._page.browserContext.needsPlaywrightBinding()) + promises2.push(session.send("Runtime.addBinding", { name: PageBinding.kBindingName })); + if (this._page.needsRequestInterception()) { + promises2.push(session.send("Network.setInterceptionEnabled", { enabled: true })); + promises2.push(session.send("Network.setResourceCachingDisabled", { disabled: true })); + promises2.push(session.send("Network.addInterception", { url: ".*", stage: "request", isRegex: true })); + } + if (this._page.browserContext.isSettingStorageState()) { + await Promise.all(promises2); + return; + } + const contextOptions = this._browserContext._options; + if (contextOptions.userAgent) + promises2.push(this.updateUserAgent()); + const emulatedMedia = this._page.emulatedMedia(); + if (emulatedMedia.media || emulatedMedia.colorScheme || emulatedMedia.reducedMotion || emulatedMedia.forcedColors || emulatedMedia.contrast) + promises2.push(WKPage._setEmulateMedia(session, emulatedMedia.media, emulatedMedia.colorScheme, emulatedMedia.reducedMotion, emulatedMedia.forcedColors, emulatedMedia.contrast)); + const bootstrapScript = this._calculateBootstrapScript(); + if (bootstrapScript.length) + promises2.push(session.send("Page.setBootstrapScript", { source: bootstrapScript })); + this._page.frames().map((frame) => frame.evaluateExpression(bootstrapScript).catch((e) => { + })); + if (contextOptions.bypassCSP) + promises2.push(session.send("Page.setBypassCSP", { enabled: true })); + const emulatedSize = this._page.emulatedSize(); + if (emulatedSize) { + promises2.push(session.send("Page.setScreenSizeOverride", { + width: emulatedSize.screen.width, + height: emulatedSize.screen.height + })); + } + promises2.push(this.updateEmulateMedia()); + promises2.push(session.send("Network.setExtraHTTPHeaders", { headers: headersArrayToObject( + this._calculateExtraHTTPHeaders(), + false + /* lowerCase */ + ) })); + if (contextOptions.offline) + promises2.push(session.send("Network.setEmulateOfflineState", { offline: true })); + promises2.push(session.send("Page.setTouchEmulationEnabled", { enabled: !!contextOptions.hasTouch })); + if (contextOptions.timezoneId) { + promises2.push(session.send("Page.setTimeZone", { timeZone: contextOptions.timezoneId }).catch((e) => { + throw new Error(`Invalid timezone ID: ${contextOptions.timezoneId}`); + })); + } + if (this._page.fileChooserIntercepted()) + promises2.push(session.send("Page.setInterceptFileChooserDialog", { enabled: true })); + promises2.push(session.send("Page.overrideSetting", { setting: "DeviceOrientationEventEnabled", value: contextOptions.isMobile })); + promises2.push(session.send("Page.overrideSetting", { setting: "FullScreenEnabled", value: !contextOptions.isMobile })); + promises2.push(session.send("Page.overrideSetting", { setting: "NotificationsEnabled", value: !contextOptions.isMobile })); + promises2.push(session.send("Page.overrideSetting", { setting: "PointerLockEnabled", value: !contextOptions.isMobile })); + promises2.push(session.send("Page.overrideSetting", { setting: "InputTypeMonthEnabled", value: contextOptions.isMobile })); + promises2.push(session.send("Page.overrideSetting", { setting: "InputTypeWeekEnabled", value: contextOptions.isMobile })); + promises2.push(session.send("Page.overrideSetting", { setting: "FixedBackgroundsPaintRelativeToDocument", value: contextOptions.isMobile })); + await Promise.all(promises2); + } + _onDidCommitProvisionalTarget(event) { + const { oldTargetId, newTargetId } = event; + assert(this._provisionalPage); + assert(this._provisionalPage._session.sessionId === newTargetId, "Unknown new target: " + newTargetId); + assert(this._session.sessionId === oldTargetId, "Unknown old target: " + oldTargetId); + const newSession = this._provisionalPage._session; + this._provisionalPage.commit(); + this._provisionalPage.dispose(); + this._provisionalPage = null; + this._setSession(newSession); + } + _onTargetDestroyed(event) { + const { targetId, crashed } = event; + if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) { + this._maybeCancelCoopNavigationRequest(this._provisionalPage); + this._provisionalPage._session.dispose(); + this._provisionalPage.dispose(); + this._provisionalPage = null; + } else if (this._session.sessionId === targetId) { + this._session.dispose(); + eventsHelper.removeEventListeners(this._sessionListeners); + if (crashed) { + this._session.markAsCrashed(); + this._page._didCrash(); + } + } + } + didClose() { + this._pageProxySession.dispose(); + eventsHelper.removeEventListeners(this._sessionListeners); + eventsHelper.removeEventListeners(this._eventListeners); + if (this._session) + this._session.dispose(); + if (this._provisionalPage) { + this._provisionalPage._session.dispose(); + this._provisionalPage.dispose(); + this._provisionalPage = null; + } + this._firstNonInitialNavigationCommittedReject(new TargetClosedError$1()); + this._page._didClose(); + } + dispatchMessageToSession(message) { + this._pageProxySession.dispatchMessage(message); + } + handleProvisionalLoadFailed(event) { + if (!this._page.initializedOrUndefined()) { + this._firstNonInitialNavigationCommittedReject(new Error("Initial load failed")); + return; + } + if (!this._provisionalPage) + return; + let errorText = event.error; + if (errorText.includes("cancelled")) + errorText += "; maybe frame was detached?"; + this._page.frameManager.frameAbortedNavigation(this._page.mainFrame()._id, errorText, event.loaderId); + } + handleWindowOpen(event) { + this._nextWindowOpenPopupFeatures = event.windowFeatures; + } + async _onTargetCreated(event) { + var _a2; + const { targetInfo } = event; + const session = new WKSession(this._pageProxySession.connection, targetInfo.targetId, (message) => { + this._pageProxySession.send("Target.sendMessageToTarget", { + message: JSON.stringify(message), + targetId: targetInfo.targetId + }).catch((e) => { + session.dispatchMessage({ id: message.id, error: { message: e.message } }); + }); + }); + assert(targetInfo.type === "page", "Only page targets are expected in WebKit, received: " + targetInfo.type); + if (!targetInfo.isProvisional) { + assert(!this._page.initializedOrUndefined()); + let pageOrError; + try { + this._setSession(session); + await Promise.all([ + this._initializePageProxySession(), + this._initializeSession(session, false, ({ frameTree }) => this._handleFrameTree(frameTree)) + ]); + pageOrError = this._page; + } catch (e) { + pageOrError = e; + } + if (targetInfo.isPaused) + this._pageProxySession.sendMayFail("Target.resume", { targetId: targetInfo.targetId }); + if (pageOrError instanceof Page$1 && this._page.mainFrame().url() === "") { + try { + await this._firstNonInitialNavigationCommittedPromise; + } catch (e) { + pageOrError = e; + } + } else { + this._firstNonInitialNavigationCommittedPromise.catch(() => { + }); + } + this._page.reportAsNew((_a2 = this._opener) == null ? void 0 : _a2._page, pageOrError instanceof Page$1 ? void 0 : pageOrError); + } else { + assert(targetInfo.isProvisional); + assert(!this._provisionalPage); + this._provisionalPage = new WKProvisionalPage(session, this); + if (targetInfo.isPaused) { + this._provisionalPage.initializationPromise.then(() => { + this._pageProxySession.sendMayFail("Target.resume", { targetId: targetInfo.targetId }); + }); + } + } + } + _onDispatchMessageFromTarget(event) { + const { targetId, message } = event; + if (this._provisionalPage && this._provisionalPage._session.sessionId === targetId) + this._provisionalPage._session.dispatchMessage(JSON.parse(message)); + else if (this._session.sessionId === targetId) + this._session.dispatchMessage(JSON.parse(message)); + else + throw new Error("Unknown target: " + targetId); + } + _addSessionListeners() { + this._sessionListeners = [ + eventsHelper.addEventListener(this._session, "Page.frameNavigated", (event) => this._onFrameNavigated(event.frame, false)), + eventsHelper.addEventListener(this._session, "Page.navigatedWithinDocument", (event) => this._onFrameNavigatedWithinDocument(event.frameId, event.url)), + eventsHelper.addEventListener(this._session, "Page.frameAttached", (event) => this._onFrameAttached(event.frameId, event.parentFrameId)), + eventsHelper.addEventListener(this._session, "Page.frameDetached", (event) => this._onFrameDetached(event.frameId)), + eventsHelper.addEventListener(this._session, "Page.willCheckNavigationPolicy", (event) => this._onWillCheckNavigationPolicy(event.frameId)), + eventsHelper.addEventListener(this._session, "Page.didCheckNavigationPolicy", (event) => this._onDidCheckNavigationPolicy(event.frameId, event.cancel)), + eventsHelper.addEventListener(this._session, "Page.frameScheduledNavigation", (event) => this._onFrameScheduledNavigation(event.frameId, event.delay, event.targetIsCurrentFrame)), + eventsHelper.addEventListener(this._session, "Page.loadEventFired", (event) => this._page.frameManager.frameLifecycleEvent(event.frameId, "load")), + eventsHelper.addEventListener(this._session, "Page.domContentEventFired", (event) => this._page.frameManager.frameLifecycleEvent(event.frameId, "domcontentloaded")), + eventsHelper.addEventListener(this._session, "Runtime.executionContextCreated", (event) => this._onExecutionContextCreated(event.context)), + eventsHelper.addEventListener(this._session, "Runtime.bindingCalled", (event) => this._onBindingCalled(event.contextId, event.argument)), + eventsHelper.addEventListener(this._session, "Console.messageAdded", (event) => this._onConsoleMessage(event)), + eventsHelper.addEventListener(this._session, "Console.messageRepeatCountUpdated", (event) => this._onConsoleRepeatCountUpdated(event)), + eventsHelper.addEventListener(this._pageProxySession, "Dialog.javascriptDialogOpening", (event) => this._onDialog(event)), + eventsHelper.addEventListener(this._session, "Page.fileChooserOpened", (event) => this._onFileChooserOpened(event)), + eventsHelper.addEventListener(this._session, "Network.requestWillBeSent", (e) => this._onRequestWillBeSent(this._session, e)), + eventsHelper.addEventListener(this._session, "Network.requestIntercepted", (e) => this._onRequestIntercepted(this._session, e)), + eventsHelper.addEventListener(this._session, "Network.responseReceived", (e) => this._onResponseReceived(this._session, e)), + eventsHelper.addEventListener(this._session, "Network.loadingFinished", (e) => this._onLoadingFinished(e)), + eventsHelper.addEventListener(this._session, "Network.loadingFailed", (e) => this._onLoadingFailed(this._session, e)), + eventsHelper.addEventListener(this._session, "Network.webSocketCreated", (e) => this._page.frameManager.onWebSocketCreated(e.requestId, e.url)), + eventsHelper.addEventListener(this._session, "Network.webSocketWillSendHandshakeRequest", (e) => this._page.frameManager.onWebSocketRequest(e.requestId)), + eventsHelper.addEventListener(this._session, "Network.webSocketHandshakeResponseReceived", (e) => this._page.frameManager.onWebSocketResponse(e.requestId, e.response.status, e.response.statusText)), + eventsHelper.addEventListener(this._session, "Network.webSocketFrameSent", (e) => e.response.payloadData && this._page.frameManager.onWebSocketFrameSent(e.requestId, e.response.opcode, e.response.payloadData)), + eventsHelper.addEventListener(this._session, "Network.webSocketFrameReceived", (e) => e.response.payloadData && this._page.frameManager.webSocketFrameReceived(e.requestId, e.response.opcode, e.response.payloadData)), + eventsHelper.addEventListener(this._session, "Network.webSocketClosed", (e) => this._page.frameManager.webSocketClosed(e.requestId)), + eventsHelper.addEventListener(this._session, "Network.webSocketFrameError", (e) => this._page.frameManager.webSocketError(e.requestId, e.errorMessage)) + ]; + } + async _updateState(method, params) { + await this._forAllSessions((session) => session.send(method, params).then()); + } + async _forAllSessions(callback) { + const sessions = [ + this._session + ]; + if (this._provisionalPage) + sessions.push(this._provisionalPage._session); + await Promise.all(sessions.map((session) => callback(session).catch((e) => { + }))); + } + _onWillCheckNavigationPolicy(frameId) { + if (this._provisionalPage) + return; + this._page.frameManager.frameRequestedNavigation(frameId); + } + _onDidCheckNavigationPolicy(frameId, cancel) { + if (!cancel) + return; + if (this._provisionalPage) + return; + this._page.frameManager.frameAbortedNavigation(frameId, "Navigation canceled by policy check"); + } + _onFrameScheduledNavigation(frameId, delay, targetIsCurrentFrame) { + if (targetIsCurrentFrame) + this._page.frameManager.frameRequestedNavigation(frameId); + } + _handleFrameTree(frameTree) { + this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId || null); + this._onFrameNavigated(frameTree.frame, true); + this._page.frameManager.frameLifecycleEvent(frameTree.frame.id, "domcontentloaded"); + this._page.frameManager.frameLifecycleEvent(frameTree.frame.id, "load"); + if (!frameTree.childFrames) + return; + for (const child of frameTree.childFrames) + this._handleFrameTree(child); + } + _onFrameAttached(frameId, parentFrameId) { + return this._page.frameManager.frameAttached(frameId, parentFrameId); + } + _onFrameNavigated(framePayload, initial) { + const frame = this._page.frameManager.frame(framePayload.id); + assert(frame); + this._removeContextsForFrame(frame, true); + if (!framePayload.parentId) + this._workers.clear(); + this._page.frameManager.frameCommittedNewDocumentNavigation(framePayload.id, framePayload.url, framePayload.name || "", framePayload.loaderId, initial); + if (!initial) + this._firstNonInitialNavigationCommittedFulfill(); + } + _onFrameNavigatedWithinDocument(frameId, url2) { + this._page.frameManager.frameCommittedSameDocumentNavigation(frameId, url2); + } + _onFrameDetached(frameId) { + this._page.frameManager.frameDetached(frameId); + } + _removeContextsForFrame(frame, notifyFrame) { + for (const [contextId, context] of this._contextIdToContext) { + if (context.frame === frame) { + this._contextIdToContext.delete(contextId); + if (notifyFrame) + frame._contextDestroyed(context); + } + } + } + _onExecutionContextCreated(contextPayload) { + if (this._contextIdToContext.has(contextPayload.id)) + return; + const frame = this._page.frameManager.frame(contextPayload.frameId); + if (!frame) + return; + const delegate = new WKExecutionContext(this._session, contextPayload.id); + let worldName = null; + if (contextPayload.type === "normal") + worldName = "main"; + else if (contextPayload.type === "user" && contextPayload.name === UTILITY_WORLD_NAME) + worldName = "utility"; + const context = new FrameExecutionContext(delegate, frame, worldName); + if (worldName) + frame._contextCreated(worldName, context); + this._contextIdToContext.set(contextPayload.id, context); + } + async _onBindingCalled(contextId, argument2) { + const pageOrError = await this._page.waitForInitializedOrError(); + if (!(pageOrError instanceof Error)) { + const context = this._contextIdToContext.get(contextId); + if (context) + await this._page.onBindingCalled(argument2, context); + } + } + async navigateFrame(frame, url2, referrer) { + if (this._pageProxySession.isDisposed()) + throw new TargetClosedError$1(); + const pageProxyId = this._pageProxySession.sessionId; + const result = await this._pageProxySession.connection.browserSession.send("Playwright.navigate", { url: url2, pageProxyId, frameId: frame._id, referrer }); + return { newDocumentId: result.loaderId }; + } + _onConsoleMessage(event) { + const { type: type2, level, text, parameters, url: url2, line: lineNumber, column: columnNumber, source: source2 } = event.message; + if (level === "error" && source2 === "javascript") { + const { name, message } = splitErrorMessage(text); + let stack; + if (event.message.stackTrace) { + stack = text + "\n" + event.message.stackTrace.callFrames.map((callFrame) => { + return ` at ${callFrame.functionName || "unknown"} (${callFrame.url}:${callFrame.lineNumber}:${callFrame.columnNumber})`; + }).join("\n"); + } else { + stack = ""; + } + this._lastConsoleMessage = null; + const error2 = new Error(message); + error2.stack = stack; + error2.name = name; + this._page.emitOnContextOnceInitialized(BrowserContext$1.Events.PageError, error2, this._page); + return; + } + let derivedType = type2 || ""; + if (type2 === "log") + derivedType = level; + else if (type2 === "timing") + derivedType = "timeEnd"; + const handles = []; + for (const p of parameters || []) { + let context; + if (p.objectId) { + const objectId = JSON.parse(p.objectId); + context = this._contextIdToContext.get(objectId.injectedScriptId); + } else { + context = [...this._contextIdToContext.values()].find((c) => c.frame === this._page.mainFrame()); + } + if (!context) + return; + handles.push(createHandle(context, p)); + } + this._lastConsoleMessage = { + derivedType, + text, + handles, + count: 0, + location: { + url: url2 || "", + lineNumber: (lineNumber || 1) - 1, + columnNumber: (columnNumber || 1) - 1 + } + }; + this._onConsoleRepeatCountUpdated({ count: 1 }); + } + _onConsoleRepeatCountUpdated(event) { + if (this._lastConsoleMessage) { + const { + derivedType, + text, + handles, + count, + location: location2 + } = this._lastConsoleMessage; + for (let i = count; i < event.count; ++i) + this._page.addConsoleMessage(derivedType, handles, location2, handles.length ? void 0 : text); + this._lastConsoleMessage.count = event.count; + } + } + _onDialog(event) { + this._page.browserContext.dialogManager.dialogDidOpen(new Dialog$1( + this._page, + event.type, + event.message, + async (accept, promptText) => { + if (event.type === "beforeunload" && !accept) + this._page.frameManager.frameAbortedNavigation(this._page.mainFrame()._id, "navigation cancelled by beforeunload dialog"); + await this._pageProxySession.send("Dialog.handleJavaScriptDialog", { accept, promptText }); + }, + event.defaultPrompt + )); + } + async _onFileChooserOpened(event) { + let handle; + try { + const context = await this._page.frameManager.frame(event.frameId)._mainContext(); + handle = createHandle(context, event.element).asElement(); + } catch (e) { + return; + } + await this._page._onFileChooserOpened(handle); + } + static async _setEmulateMedia(session, mediaType, colorScheme, reducedMotion, forcedColors, contrast) { + const promises2 = []; + promises2.push(session.send("Page.setEmulatedMedia", { media: mediaType === "no-override" ? "" : mediaType })); + let appearance = void 0; + switch (colorScheme) { + case "light": + appearance = "Light"; + break; + case "dark": + appearance = "Dark"; + break; + case "no-override": + appearance = void 0; + break; + } + promises2.push(session.send("Page.overrideUserPreference", { name: "PrefersColorScheme", value: appearance })); + let reducedMotionWk = void 0; + switch (reducedMotion) { + case "reduce": + reducedMotionWk = "Reduce"; + break; + case "no-preference": + reducedMotionWk = "NoPreference"; + break; + case "no-override": + reducedMotionWk = void 0; + break; + } + promises2.push(session.send("Page.overrideUserPreference", { name: "PrefersReducedMotion", value: reducedMotionWk })); + let forcedColorsWk = void 0; + switch (forcedColors) { + case "active": + forcedColorsWk = "Active"; + break; + case "none": + forcedColorsWk = "None"; + break; + case "no-override": + forcedColorsWk = void 0; + break; + } + promises2.push(session.send("Page.setForcedColors", { forcedColors: forcedColorsWk })); + let contrastWk = void 0; + switch (contrast) { + case "more": + contrastWk = "More"; + break; + case "no-preference": + contrastWk = "NoPreference"; + break; + case "no-override": + contrastWk = void 0; + break; + } + promises2.push(session.send("Page.overrideUserPreference", { name: "PrefersContrast", value: contrastWk })); + await Promise.all(promises2); + } + async updateExtraHTTPHeaders() { + await this._updateState("Network.setExtraHTTPHeaders", { headers: headersArrayToObject( + this._calculateExtraHTTPHeaders(), + false + /* lowerCase */ + ) }); + } + _calculateExtraHTTPHeaders() { + const locale = this._browserContext._options.locale; + const headers = mergeHeaders([ + this._browserContext._options.extraHTTPHeaders, + this._page.extraHTTPHeaders(), + locale ? singleHeader("Accept-Language", locale) : void 0 + ]); + return headers; + } + async updateEmulateMedia() { + const emulatedMedia = this._page.emulatedMedia(); + const colorScheme = emulatedMedia.colorScheme; + const reducedMotion = emulatedMedia.reducedMotion; + const forcedColors = emulatedMedia.forcedColors; + const contrast = emulatedMedia.contrast; + await this._forAllSessions((session) => WKPage._setEmulateMedia(session, emulatedMedia.media, colorScheme, reducedMotion, forcedColors, contrast)); + } + async updateEmulatedViewportSize() { + var _a2; + this._browserContext._validateEmulatedViewport((_a2 = this._page.emulatedSize()) == null ? void 0 : _a2.viewport); + await this._updateViewport(); + } + async updateUserAgent() { + const contextOptions = this._browserContext._options; + this._updateState("Page.overrideUserAgent", { value: contextOptions.userAgent }); + } + async bringToFront() { + this._pageProxySession.send("Target.activate", { + targetId: this._session.sessionId + }); + } + async _updateViewport() { + const options2 = this._browserContext._options; + const emulatedSize = this._page.emulatedSize(); + if (!emulatedSize) + return; + const viewportSize = emulatedSize.viewport; + const screenSize = emulatedSize.screen; + const promises2 = [ + this._pageProxySession.send("Emulation.setDeviceMetricsOverride", { + width: viewportSize.width, + height: viewportSize.height, + fixedLayout: !!options2.isMobile, + deviceScaleFactor: options2.deviceScaleFactor || 1 + }), + this._session.send("Page.setScreenSizeOverride", { + width: screenSize.width, + height: screenSize.height + }) + ]; + if (options2.isMobile) { + const angle = viewportSize.width > viewportSize.height ? 90 : 0; + promises2.push(this._pageProxySession.send("Emulation.setOrientationOverride", { angle })); + } + await Promise.all(promises2); + } + async updateRequestInterception() { + const enabled = this._page.needsRequestInterception(); + await Promise.all([ + this._updateState("Network.setInterceptionEnabled", { enabled }), + this._updateState("Network.setResourceCachingDisabled", { disabled: enabled }), + this._updateState("Network.addInterception", { url: ".*", stage: "request", isRegex: true }) + ]); + } + async updateOffline() { + await this._updateState("Network.setEmulateOfflineState", { offline: !!this._browserContext._options.offline }); + } + async updateHttpCredentials() { + const credentials = this._browserContext._options.httpCredentials || { username: "", password: "", origin: "" }; + await this._pageProxySession.send("Emulation.setAuthCredentials", { username: credentials.username, password: credentials.password, origin: credentials.origin }); + } + async updateFileChooserInterception() { + const enabled = this._page.fileChooserIntercepted(); + await this._session.send("Page.setInterceptFileChooserDialog", { enabled }).catch(() => { + }); + } + async reload() { + await this._session.send("Page.reload"); + } + goBack() { + return this._session.send("Page.goBack").then(() => true).catch((error2) => { + if (error2 instanceof Error && error2.message.includes(`Protocol error (Page.goBack): Failed to go`)) + return false; + throw error2; + }); + } + goForward() { + return this._session.send("Page.goForward").then(() => true).catch((error2) => { + if (error2 instanceof Error && error2.message.includes(`Protocol error (Page.goForward): Failed to go`)) + return false; + throw error2; + }); + } + async requestGC() { + await this._session.send("Heap.gc"); + } + async addInitScript(initScript) { + await this._updateBootstrapScript(); + } + async removeInitScripts(initScripts) { + await this._updateBootstrapScript(); + } + async exposePlaywrightBinding() { + await this._updateState("Runtime.addBinding", { name: PageBinding.kBindingName }); + } + _calculateBootstrapScript() { + const scripts = []; + if (!this._page.browserContext._options.isMobile) { + scripts.push("delete window.orientation"); + scripts.push("delete window.ondevicemotion"); + scripts.push("delete window.ondeviceorientation"); + } + scripts.push('if (!window.safari) window.safari = { pushNotification: { toString() { return "[object SafariRemoteNotification]"; } } };'); + scripts.push("if (!window.GestureEvent) window.GestureEvent = function GestureEvent() {};"); + scripts.push(this._publicKeyCredentialScript()); + scripts.push(...this._page.allInitScripts().map((script) => script.source)); + return scripts.join(";\n"); + } + _publicKeyCredentialScript() { + function polyfill2() { + window.PublicKeyCredential ?? (window.PublicKeyCredential = { + async getClientCapabilities() { + return {}; + }, + async isConditionalMediationAvailable() { + return false; + }, + async isUserVerifyingPlatformAuthenticatorAvailable() { + return false; + } + }); + } + return `(${polyfill2.toString()})();`; + } + async _updateBootstrapScript() { + await this._updateState("Page.setBootstrapScript", { source: this._calculateBootstrapScript() }); + } + async closePage(runBeforeUnload) { + await this._stopVideo(); + await this._pageProxySession.sendMayFail("Target.close", { + targetId: this._session.sessionId, + runBeforeUnload + }); + } + async setBackgroundColor(color) { + await this._session.send("Page.setDefaultBackgroundColorOverride", { color }); + } + _toolbarHeight() { + var _a2; + if ((_a2 = this._page.browserContext._browser) == null ? void 0 : _a2.options.headful) + return hostPlatform === "mac10.15" ? 55 : 59; + return 0; + } + async _startVideo(options2) { + assert(!this._recordingVideoFile); + const { screencastId } = await this._pageProxySession.send("Screencast.startVideo", { + file: options2.outputFile, + width: options2.width, + height: options2.height, + toolbarHeight: this._toolbarHeight() + }); + this._recordingVideoFile = options2.outputFile; + this._browserContext._browser._videoStarted(this._browserContext, screencastId, options2.outputFile, this._page.waitForInitializedOrError()); + } + async _stopVideo() { + if (!this._recordingVideoFile) + return; + await this._pageProxySession.sendMayFail("Screencast.stopVideo"); + this._recordingVideoFile = null; + } + validateScreenshotDimension(side, omitDeviceScaleFactor) { + if (process.platform === "darwin") + return; + if (!omitDeviceScaleFactor && this._page.browserContext._options.deviceScaleFactor) + side = Math.ceil(side * this._page.browserContext._options.deviceScaleFactor); + if (side > 32767) + throw new Error("Cannot take screenshot larger than 32767 pixels on any dimension"); + } + async takeScreenshot(progress2, format, documentRect, viewportRect, quality, fitsViewport, scale) { + const rect = documentRect || viewportRect; + const omitDeviceScaleFactor = scale === "css"; + this.validateScreenshotDimension(rect.width, omitDeviceScaleFactor); + this.validateScreenshotDimension(rect.height, omitDeviceScaleFactor); + const result = await this._session.send("Page.snapshotRect", { ...rect, coordinateSystem: documentRect ? "Page" : "Viewport", omitDeviceScaleFactor }); + const prefix = "data:image/png;base64,"; + let buffer2 = Buffer.from(result.dataURL.substr(prefix.length), "base64"); + if (format === "jpeg") + buffer2 = jpegjs.encode(PNG.sync.read(buffer2), quality).data; + return buffer2; + } + async getContentFrame(handle) { + const nodeInfo = await this._session.send("DOM.describeNode", { + objectId: handle._objectId + }); + if (!nodeInfo.contentFrameId) + return null; + return this._page.frameManager.frame(nodeInfo.contentFrameId); + } + async getOwnerFrame(handle) { + if (!handle._objectId) + return null; + const nodeInfo = await this._session.send("DOM.describeNode", { + objectId: handle._objectId + }); + return nodeInfo.ownerFrameId || null; + } + async getBoundingBox(handle) { + const quads = await this.getContentQuads(handle); + if (!quads || !quads.length) + return null; + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + for (const quad of quads) { + for (const point of quad) { + minX = Math.min(minX, point.x); + maxX = Math.max(maxX, point.x); + minY = Math.min(minY, point.y); + maxY = Math.max(maxY, point.y); + } + } + return { x: minX, y: minY, width: maxX - minX, height: maxY - minY }; + } + async scrollRectIntoViewIfNeeded(handle, rect) { + return await this._session.send("DOM.scrollIntoViewIfNeeded", { + objectId: handle._objectId, + rect + }).then(() => "done").catch((e) => { + if (e instanceof Error && e.message.includes("Node does not have a layout object")) + return "error:notvisible"; + if (e instanceof Error && e.message.includes("Node is detached from document")) + return "error:notconnected"; + throw e; + }); + } + async setScreencastOptions(options2) { + if (options2) { + const so = { ...options2, toolbarHeight: this._toolbarHeight() }; + const { generation } = await this._pageProxySession.send("Screencast.startScreencast", so); + this._screencastGeneration = generation; + } else { + await this._pageProxySession.send("Screencast.stopScreencast"); + } + } + _onScreencastFrame(event) { + const generation = this._screencastGeneration; + this._page.throttleScreencastFrameAck(() => { + this._pageProxySession.send("Screencast.screencastFrameAck", { generation }).catch((e) => debugLogger.log("error", e)); + }); + const buffer2 = Buffer.from(event.data, "base64"); + this._page.emit(Page$1.Events.ScreencastFrame, { + buffer: buffer2, + width: event.deviceWidth, + height: event.deviceHeight + }); + } + rafCountForStablePosition() { + return process.platform === "win32" ? 5 : 1; + } + async getContentQuads(handle) { + const result = await this._session.sendMayFail("DOM.getContentQuads", { + objectId: handle._objectId + }); + if (!result) + return null; + return result.quads.map((quad) => [ + { x: quad[0], y: quad[1] }, + { x: quad[2], y: quad[3] }, + { x: quad[4], y: quad[5] }, + { x: quad[6], y: quad[7] } + ]); + } + async setInputFilePaths(handle, paths) { + const pageProxyId = this._pageProxySession.sessionId; + const objectId = handle._objectId; + await Promise.all([ + this._pageProxySession.connection.browserSession.send("Playwright.grantFileReadAccess", { pageProxyId, paths }), + this._session.send("DOM.setInputFiles", { objectId, paths }) + ]); + } + async adoptElementHandle(handle, to) { + const result = await this._session.sendMayFail("DOM.resolveNode", { + objectId: handle._objectId, + executionContextId: to.delegate._contextId + }); + if (!result || result.object.subtype === "null") + throw new Error(kUnableToAdoptErrorMessage); + return createHandle(to, result.object); + } + async getAccessibilityTree(needle) { + return getAccessibilityTree(this._session, needle); + } + async inputActionEpilogue() { + } + async resetForReuse() { + } + async getFrameElement(frame) { + const parent = frame.parentFrame(); + if (!parent) + throw new Error("Frame has been detached."); + const context = await parent._mainContext(); + const result = await this._session.send("DOM.resolveNode", { + frameId: frame._id, + executionContextId: context.delegate._contextId + }); + if (!result || result.object.subtype === "null") + throw new Error("Frame has been detached."); + return createHandle(context, result.object); + } + _maybeCancelCoopNavigationRequest(provisionalPage) { + const navigationRequest = provisionalPage.coopNavigationRequest(); + for (const [requestId, request2] of this._requestIdToRequest) { + if (request2.request === navigationRequest) { + this._onLoadingFailed(provisionalPage._session, { + requestId, + errorText: "Provisiolal navigation canceled.", + timestamp: request2._timestamp, + canceled: true + }); + return; + } + } + } + _adoptRequestFromNewProcess(navigationRequest, newSession, newRequestId) { + for (const [requestId, request2] of this._requestIdToRequest) { + if (request2.request === navigationRequest) { + this._requestIdToRequest.delete(requestId); + request2.adoptRequestFromNewProcess(newSession, newRequestId); + this._requestIdToRequest.set(newRequestId, request2); + return; + } + } + } + _onRequestWillBeSent(session, event) { + if (event.request.url.startsWith("data:")) + return; + if (event.request.url.startsWith("about:")) + return; + if (this._page.needsRequestInterception() && !event.redirectResponse) + this._requestIdToRequestWillBeSentEvent.set(event.requestId, event); + else + this._onRequest(session, event, false); + } + _onRequest(session, event, intercepted) { + let redirectedFrom = null; + if (event.redirectResponse) { + const request22 = this._requestIdToRequest.get(event.requestId); + if (request22) { + this._handleRequestRedirect(request22, event.requestId, event.redirectResponse, event.timestamp); + redirectedFrom = request22; + } + } + const frame = redirectedFrom ? redirectedFrom.request.frame() : this._page.frameManager.frame(event.frameId); + if (!frame) + return; + const isNavigationRequest = event.type === "Document"; + const documentId = isNavigationRequest ? event.loaderId : void 0; + const request2 = new WKInterceptableRequest(session, frame, event, redirectedFrom, documentId); + let route; + if (intercepted) { + route = new WKRouteImpl(session, event.requestId); + request2.request.setRawRequestHeaders(null); + } + this._requestIdToRequest.set(event.requestId, request2); + this._page.frameManager.requestStarted(request2.request, route); + } + _handleRequestRedirect(request2, requestId, responsePayload, timestamp2) { + const response2 = request2.createResponse(responsePayload); + response2._securityDetailsFinished(); + response2._serverAddrFinished(); + response2.setResponseHeadersSize(null); + response2.setEncodedBodySize(null); + response2._requestFinished(responsePayload.timing ? helper.secondsToRoundishMillis(timestamp2 - request2._timestamp) : -1); + this._requestIdToRequest.delete(requestId); + this._page.frameManager.requestReceivedResponse(response2); + this._page.frameManager.reportRequestFinished(request2.request, response2); + } + _onRequestIntercepted(session, event) { + const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId); + if (!requestWillBeSentEvent) { + session.sendMayFail("Network.interceptWithRequest", { requestId: event.requestId }); + return; + } + this._requestIdToRequestWillBeSentEvent.delete(event.requestId); + this._onRequest(session, requestWillBeSentEvent, true); + } + _onResponseReceived(session, event) { + const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId); + if (requestWillBeSentEvent) { + this._requestIdToRequestWillBeSentEvent.delete(event.requestId); + this._onRequest(session, requestWillBeSentEvent, false); + } + const request2 = this._requestIdToRequest.get(event.requestId); + if (!request2) + return; + this._requestIdToResponseReceivedPayloadEvent.set(event.requestId, event); + const response2 = request2.createResponse(event.response); + this._page.frameManager.requestReceivedResponse(response2); + if (response2.status() === 204 && request2.request.isNavigationRequest()) { + this._onLoadingFailed(session, { + requestId: event.requestId, + errorText: "Aborted: 204 No Content", + timestamp: event.timestamp + }); + } + } + _onLoadingFinished(event) { + var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k, _l; + const request2 = this._requestIdToRequest.get(event.requestId); + if (!request2) + return; + const response2 = request2.request._existingResponse(); + if (response2) { + const responseReceivedPayload = this._requestIdToResponseReceivedPayloadEvent.get(event.requestId); + response2._serverAddrFinished(parseRemoteAddress((_a2 = event == null ? void 0 : event.metrics) == null ? void 0 : _a2.remoteAddress)); + response2._securityDetailsFinished({ + protocol: isLoadedSecurely(response2.url(), response2.timing()) ? (_c2 = (_b2 = event.metrics) == null ? void 0 : _b2.securityConnection) == null ? void 0 : _c2.protocol : void 0, + subjectName: (_e2 = (_d2 = responseReceivedPayload == null ? void 0 : responseReceivedPayload.response.security) == null ? void 0 : _d2.certificate) == null ? void 0 : _e2.subject, + validFrom: (_g2 = (_f2 = responseReceivedPayload == null ? void 0 : responseReceivedPayload.response.security) == null ? void 0 : _f2.certificate) == null ? void 0 : _g2.validFrom, + validTo: (_i2 = (_h2 = responseReceivedPayload == null ? void 0 : responseReceivedPayload.response.security) == null ? void 0 : _h2.certificate) == null ? void 0 : _i2.validUntil + }); + if ((_j2 = event.metrics) == null ? void 0 : _j2.protocol) + response2._setHttpVersion(event.metrics.protocol); + response2.setEncodedBodySize(((_k = event.metrics) == null ? void 0 : _k.responseBodyBytesReceived) ?? null); + response2.setResponseHeadersSize(((_l = event.metrics) == null ? void 0 : _l.responseHeaderBytesReceived) ?? null); + response2._requestFinished(helper.secondsToRoundishMillis(event.timestamp - request2._timestamp)); + } else { + request2.request.setRawRequestHeaders(null); + } + this._requestIdToResponseReceivedPayloadEvent.delete(event.requestId); + this._requestIdToRequest.delete(event.requestId); + this._page.frameManager.reportRequestFinished(request2.request, response2); + } + _onLoadingFailed(session, event) { + const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(event.requestId); + if (requestWillBeSentEvent) { + this._requestIdToRequestWillBeSentEvent.delete(event.requestId); + this._onRequest(session, requestWillBeSentEvent, false); + } + const request2 = this._requestIdToRequest.get(event.requestId); + if (!request2) + return; + const response2 = request2.request._existingResponse(); + if (response2) { + response2._serverAddrFinished(); + response2._securityDetailsFinished(); + response2.setResponseHeadersSize(null); + response2.setEncodedBodySize(null); + response2._requestFinished(helper.secondsToRoundishMillis(event.timestamp - request2._timestamp)); + } else { + request2.request.setRawRequestHeaders(null); + } + this._requestIdToRequest.delete(event.requestId); + request2.request._setFailureText(event.errorText); + this._page.frameManager.requestFailed(request2.request, event.errorText.includes("cancelled")); + } + async _grantPermissions(origin, permissions) { + const webPermissionToProtocol = /* @__PURE__ */ new Map([ + ["geolocation", "geolocation"], + ["notifications", "notifications"], + ["clipboard-read", "clipboard-read"] + ]); + const filtered = permissions.map((permission) => { + const protocolPermission = webPermissionToProtocol.get(permission); + if (!protocolPermission) + throw new Error("Unknown permission: " + permission); + return protocolPermission; + }); + await this._pageProxySession.send("Emulation.grantPermissions", { origin, permissions: filtered }); + } + async _clearPermissions() { + await this._pageProxySession.send("Emulation.resetPermissions", {}); + } + shouldToggleStyleSheetToSyncAnimations() { + return true; + } +} +function parseRemoteAddress(value) { + if (!value) + return; + try { + const colon = value.lastIndexOf(":"); + const dot = value.lastIndexOf("."); + if (dot < 0) { + return { + ipAddress: `[${value.slice(0, colon)}]`, + port: +value.slice(colon + 1) + }; + } + if (colon > dot) { + const [address, port] = value.split(":"); + return { + ipAddress: address, + port: +port + }; + } else { + const [address, port] = value.split("."); + return { + ipAddress: `[${address}]`, + port: +port + }; + } + } catch (_) { + } +} +function isLoadedSecurely(url2, timing) { + try { + const u = new URL(url2); + if (u.protocol !== "https:" && u.protocol !== "wss:" && u.protocol !== "sftp:") + return false; + if (timing.secureConnectionStart === -1 && timing.connectStart !== -1) + return false; + return true; + } catch (_) { + } +} +const BROWSER_VERSION = "18.5"; +const DEFAULT_USER_AGENT = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${BROWSER_VERSION} Safari/605.1.15`; +class WKBrowser extends Browser$1 { + constructor(parent, transport, options2) { + super(parent, options2); + this._contexts = /* @__PURE__ */ new Map(); + this._wkPages = /* @__PURE__ */ new Map(); + this._connection = new WKConnection(transport, this._onDisconnect.bind(this), options2.protocolLogger, options2.browserLogsCollector); + this._browserSession = this._connection.browserSession; + this._browserSession.on("Playwright.pageProxyCreated", this._onPageProxyCreated.bind(this)); + this._browserSession.on("Playwright.pageProxyDestroyed", this._onPageProxyDestroyed.bind(this)); + this._browserSession.on("Playwright.provisionalLoadFailed", (event) => this._onProvisionalLoadFailed(event)); + this._browserSession.on("Playwright.windowOpen", (event) => this._onWindowOpen(event)); + this._browserSession.on("Playwright.downloadCreated", this._onDownloadCreated.bind(this)); + this._browserSession.on("Playwright.downloadFilenameSuggested", this._onDownloadFilenameSuggested.bind(this)); + this._browserSession.on("Playwright.downloadFinished", this._onDownloadFinished.bind(this)); + this._browserSession.on("Playwright.screencastFinished", this._onScreencastFinished.bind(this)); + this._browserSession.on(kPageProxyMessageReceived, this._onPageProxyMessageReceived.bind(this)); + } + static async connect(parent, transport, options2) { + var _a2; + const browser2 = new WKBrowser(parent, transport, options2); + if (options2.__testHookOnConnectToBrowser) + await options2.__testHookOnConnectToBrowser(); + const promises2 = [ + browser2._browserSession.send("Playwright.enable") + ]; + if (options2.persistent) { + (_a2 = options2.persistent).userAgent || (_a2.userAgent = DEFAULT_USER_AGENT); + browser2._defaultContext = new WKBrowserContext(browser2, void 0, options2.persistent); + promises2.push(browser2._defaultContext._initialize()); + } + await Promise.all(promises2); + return browser2; + } + _onDisconnect() { + for (const wkPage of this._wkPages.values()) + wkPage.didClose(); + this._wkPages.clear(); + for (const video of this._idToVideo.values()) + video.artifact.reportFinished(new TargetClosedError$1()); + this._idToVideo.clear(); + this._didClose(); + } + async doCreateNewContext(options2) { + const proxy = options2.proxyOverride || options2.proxy; + const createOptions = proxy ? { + // Enable socks5 hostname resolution on Windows. + // See https://github.com/microsoft/playwright/issues/20451 + proxyServer: process.platform === "win32" ? proxy.server.replace(/^socks5:\/\//, "socks5h://") : proxy.server, + proxyBypassList: proxy.bypass + } : void 0; + const { browserContextId } = await this._browserSession.send("Playwright.createContext", createOptions); + options2.userAgent = options2.userAgent || DEFAULT_USER_AGENT; + const context = new WKBrowserContext(this, browserContextId, options2); + await context._initialize(); + this._contexts.set(browserContextId, context); + return context; + } + contexts() { + return Array.from(this._contexts.values()); + } + version() { + return BROWSER_VERSION; + } + userAgent() { + return DEFAULT_USER_AGENT; + } + _onDownloadCreated(payload) { + const page = this._wkPages.get(payload.pageProxyId); + if (!page) + return; + page._page.frameManager.frameAbortedNavigation(payload.frameId, "Download is starting"); + let originPage = page._page.initializedOrUndefined(); + if (!originPage) { + page._firstNonInitialNavigationCommittedReject(new Error("Starting new page download")); + if (page._opener) + originPage = page._opener._page.initializedOrUndefined(); + } + if (!originPage) + return; + this._downloadCreated(originPage, payload.uuid, payload.url); + } + _onDownloadFilenameSuggested(payload) { + this._downloadFilenameSuggested(payload.uuid, payload.suggestedFilename); + } + _onDownloadFinished(payload) { + this._downloadFinished(payload.uuid, payload.error); + } + _onScreencastFinished(payload) { + var _a2; + (_a2 = this._takeVideo(payload.screencastId)) == null ? void 0 : _a2.reportFinished(); + } + _onPageProxyCreated(event) { + const pageProxyId = event.pageProxyId; + let context = null; + if (event.browserContextId) { + context = this._contexts.get(event.browserContextId) || null; + } + if (!context) + context = this._defaultContext; + if (!context) + return; + const pageProxySession = new WKSession(this._connection, pageProxyId, (message) => { + this._connection.rawSend({ ...message, pageProxyId }); + }); + const opener = event.openerId ? this._wkPages.get(event.openerId) : void 0; + const wkPage = new WKPage(context, pageProxySession, opener || null); + this._wkPages.set(pageProxyId, wkPage); + } + _onPageProxyDestroyed(event) { + const pageProxyId = event.pageProxyId; + const wkPage = this._wkPages.get(pageProxyId); + if (!wkPage) + return; + wkPage.didClose(); + this._wkPages.delete(pageProxyId); + } + _onPageProxyMessageReceived(event) { + const wkPage = this._wkPages.get(event.pageProxyId); + if (!wkPage) + return; + wkPage.dispatchMessageToSession(event.message); + } + _onProvisionalLoadFailed(event) { + const wkPage = this._wkPages.get(event.pageProxyId); + if (!wkPage) + return; + wkPage.handleProvisionalLoadFailed(event); + } + _onWindowOpen(event) { + const wkPage = this._wkPages.get(event.pageProxyId); + if (!wkPage) + return; + wkPage.handleWindowOpen(event); + } + isConnected() { + return !this._connection.isClosed(); + } +} +class WKBrowserContext extends BrowserContext$1 { + constructor(browser2, browserContextId, options2) { + super(browser2, options2, browserContextId); + this._validateEmulatedViewport(options2.viewport); + this._authenticateProxyViaHeader(); + } + async _initialize() { + assert(!this._wkPages().length); + const browserContextId = this._browserContextId; + const promises2 = [super._initialize()]; + promises2.push(this._browser._browserSession.send("Playwright.setDownloadBehavior", { + behavior: this._options.acceptDownloads === "accept" ? "allow" : "deny", + downloadPath: this._browser.options.downloadsPath, + browserContextId + })); + if (this._options.ignoreHTTPSErrors || this._options.internalIgnoreHTTPSErrors) + promises2.push(this._browser._browserSession.send("Playwright.setIgnoreCertificateErrors", { browserContextId, ignore: true })); + if (this._options.locale) + promises2.push(this._browser._browserSession.send("Playwright.setLanguages", { browserContextId, languages: [this._options.locale] })); + if (this._options.geolocation) + promises2.push(this.setGeolocation(this._options.geolocation)); + if (this._options.offline) + promises2.push(this.setOffline(this._options.offline)); + if (this._options.httpCredentials) + promises2.push(this.setHTTPCredentials(this._options.httpCredentials)); + await Promise.all(promises2); + } + _wkPages() { + return Array.from(this._browser._wkPages.values()).filter((wkPage) => wkPage._browserContext === this); + } + possiblyUninitializedPages() { + return this._wkPages().map((wkPage) => wkPage._page); + } + async doCreateNewPage(markAsServerSideOnly) { + const { pageProxyId } = await this._browser._browserSession.send("Playwright.createPage", { browserContextId: this._browserContextId }); + const page = this._browser._wkPages.get(pageProxyId)._page; + if (markAsServerSideOnly) + page.markAsServerSideOnly(); + return page; + } + async doGetCookies(urls) { + const { cookies } = await this._browser._browserSession.send("Playwright.getAllCookies", { browserContextId: this._browserContextId }); + return filterCookies(cookies.map((c) => { + const copy = { ...c }; + copy.expires = c.expires === -1 ? -1 : c.expires / 1e3; + delete copy.session; + return copy; + }), urls); + } + async addCookies(cookies) { + const cc = rewriteCookies(cookies).map((c) => ({ + ...c, + session: c.expires === -1 || c.expires === void 0, + expires: c.expires && c.expires !== -1 ? c.expires * 1e3 : c.expires + })); + await this._browser._browserSession.send("Playwright.setCookies", { cookies: cc, browserContextId: this._browserContextId }); + } + async doClearCookies() { + await this._browser._browserSession.send("Playwright.deleteAllCookies", { browserContextId: this._browserContextId }); + } + async doGrantPermissions(origin, permissions) { + await Promise.all(this.pages().map((page) => page.delegate._grantPermissions(origin, permissions))); + } + async doClearPermissions() { + await Promise.all(this.pages().map((page) => page.delegate._clearPermissions())); + } + async setGeolocation(geolocation) { + verifyGeolocation(geolocation); + this._options.geolocation = geolocation; + const payload = geolocation ? { ...geolocation, timestamp: Date.now() } : void 0; + await this._browser._browserSession.send("Playwright.setGeolocationOverride", { browserContextId: this._browserContextId, geolocation: payload }); + } + async setExtraHTTPHeaders(headers) { + this._options.extraHTTPHeaders = headers; + for (const page of this.pages()) + await page.delegate.updateExtraHTTPHeaders(); + } + async setUserAgent(userAgent) { + this._options.userAgent = userAgent; + for (const page of this.pages()) + await page.delegate.updateUserAgent(); + } + async setOffline(offline) { + this._options.offline = offline; + for (const page of this.pages()) + await page.delegate.updateOffline(); + } + async doSetHTTPCredentials(httpCredentials) { + this._options.httpCredentials = httpCredentials; + for (const page of this.pages()) + await page.delegate.updateHttpCredentials(); + } + async doAddInitScript(initScript) { + for (const page of this.pages()) + await page.delegate._updateBootstrapScript(); + } + async doRemoveInitScripts(initScripts) { + for (const page of this.pages()) + await page.delegate._updateBootstrapScript(); + } + async doUpdateRequestInterception() { + for (const page of this.pages()) + await page.delegate.updateRequestInterception(); + } + async doExposePlaywrightBinding() { + for (const page of this.pages()) + await page.delegate.exposePlaywrightBinding(); + } + onClosePersistent() { + } + async clearCache() { + await this._browser._browserSession.send("Playwright.clearMemoryCache", { + browserContextId: this._browserContextId + }); + } + async doClose(reason) { + if (!this._browserContextId) { + await Promise.all(this._wkPages().map((wkPage) => wkPage._stopVideo())); + await this._browser.close({ reason }); + } else { + await this._browser._browserSession.send("Playwright.deleteContext", { browserContextId: this._browserContextId }); + this._browser._contexts.delete(this._browserContextId); + } + } + async cancelDownload(uuid) { + await this._browser._browserSession.send("Playwright.cancelDownload", { uuid }); + } + _validateEmulatedViewport(viewportSize) { + if (!viewportSize) + return; + if (process.platform === "win32" && this._browser.options.headful && (viewportSize.width < 250 || viewportSize.height < 240)) + throw new Error(`WebKit on Windows has a minimal viewport of 250x240.`); + } +} +class WebKit extends BrowserType$1 { + constructor(parent) { + super(parent, "webkit"); + } + connectToTransport(transport, options2) { + return WKBrowser.connect(this.attribution.playwright, transport, options2); + } + amendEnvironment(env, userDataDir, executable, browserArguments) { + return { ...env, CURL_COOKIE_JAR_PATH: path.join(userDataDir, "cookiejar.db") }; + } + doRewriteStartupLog(error2) { + if (!error2.logs) + return error2; + if (error2.logs.includes("Failed to open display") || error2.logs.includes("cannot open display")) + error2.logs = "\n" + wrapInASCIIBox(kNoXServerRunningError, 1); + return error2; + } + attemptToGracefullyCloseBrowser(transport) { + transport.send({ method: "Playwright.close", params: {}, id: kBrowserCloseMessageId }); + } + defaultArgs(options2, isPersistent, userDataDir) { + const { args = [], headless } = options2; + const userDataDirArg = args.find((arg) => arg.startsWith("--user-data-dir")); + if (userDataDirArg) + throw this._createUserDataDirArgMisuseError("--user-data-dir"); + if (args.find((arg) => !arg.startsWith("-"))) + throw new Error("Arguments can not specify page to be opened"); + const webkitArguments = ["--inspector-pipe"]; + if (process.platform === "win32") + webkitArguments.push("--disable-accelerated-compositing"); + if (headless) + webkitArguments.push("--headless"); + if (isPersistent) + webkitArguments.push(`--user-data-dir=${userDataDir}`); + else + webkitArguments.push(`--no-startup-window`); + const proxy = options2.proxyOverride || options2.proxy; + if (proxy) { + if (process.platform === "darwin") { + webkitArguments.push(`--proxy=${proxy.server}`); + if (proxy.bypass) + webkitArguments.push(`--proxy-bypass-list=${proxy.bypass}`); + } else if (process.platform === "linux") { + webkitArguments.push(`--proxy=${proxy.server}`); + if (proxy.bypass) + webkitArguments.push(...proxy.bypass.split(",").map((t) => `--ignore-host=${t}`)); + } else if (process.platform === "win32") { + webkitArguments.push(`--curl-proxy=${proxy.server.replace(/^socks5:\/\//, "socks5h://")}`); + if (proxy.bypass) + webkitArguments.push(`--curl-noproxy=${proxy.bypass}`); + } + } + webkitArguments.push(...args); + if (isPersistent) + webkitArguments.push("about:blank"); + return webkitArguments; + } +} +let Playwright$1 = class Playwright extends SdkObject { + constructor(options2) { + super({ attribution: {}, instrumentation: createInstrumentation$1() }, void 0, "Playwright"); + this._allPages = /* @__PURE__ */ new Set(); + this._allBrowsers = /* @__PURE__ */ new Set(); + this.options = options2; + this.attribution.playwright = this; + this.instrumentation.addListener({ + onBrowserOpen: (browser2) => this._allBrowsers.add(browser2), + onBrowserClose: (browser2) => this._allBrowsers.delete(browser2), + onPageOpen: (page) => this._allPages.add(page), + onPageClose: (page) => this._allPages.delete(page), + onCallLog: (sdkObject, metadata, logName, message) => { + debugLogger.log(logName, message); + } + }, null); + this.chromium = new Chromium(this); + this.bidiChromium = new BidiChromium(this); + this.bidiFirefox = new BidiFirefox(this); + this.firefox = new Firefox(this); + this.webkit = new WebKit(this); + this.electron = new Electron$1(this); + this.android = new Android$1(this, new AdbBackend()); + this.debugController = new DebugController(this); + } + async hideHighlight() { + await Promise.all([...this._allPages].map((p) => p.hideHighlight().catch(() => { + }))); + } + allBrowsers() { + return [...this._allBrowsers]; + } + allPages() { + return [...this._allPages]; + } +}; +class EventEmitter { + constructor(platform) { + this._events = void 0; + this._eventsCount = 0; + this._maxListeners = void 0; + this._pendingHandlers = /* @__PURE__ */ new Map(); + this._platform = platform; + if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } + this._maxListeners = this._maxListeners || void 0; + this.on = this.addListener; + this.off = this.removeListener; + } + setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || Number.isNaN(n)) + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); + this._maxListeners = n; + return this; + } + getMaxListeners() { + return this._maxListeners === void 0 ? this._platform.defaultMaxListeners() : this._maxListeners; + } + emit(type2, ...args) { + const events2 = this._events; + if (events2 === void 0) + return false; + const handler = events2 == null ? void 0 : events2[type2]; + if (handler === void 0) + return false; + if (typeof handler === "function") { + this._callHandler(type2, handler, args); + } else { + const len = handler.length; + const listeners = handler.slice(); + for (let i = 0; i < len; ++i) + this._callHandler(type2, listeners[i], args); + } + return true; + } + _callHandler(type2, handler, args) { + const promise = Reflect.apply(handler, this, args); + if (!(promise instanceof Promise)) + return; + let set2 = this._pendingHandlers.get(type2); + if (!set2) { + set2 = /* @__PURE__ */ new Set(); + this._pendingHandlers.set(type2, set2); + } + set2.add(promise); + promise.catch((e) => { + if (this._rejectionHandler) + this._rejectionHandler(e); + else + throw e; + }).finally(() => set2.delete(promise)); + } + addListener(type2, listener) { + return this._addListener(type2, listener, false); + } + on(type2, listener) { + return this._addListener(type2, listener, false); + } + _addListener(type2, listener, prepend) { + checkListener(listener); + let events2 = this._events; + let existing; + if (events2 === void 0) { + events2 = this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else { + if (events2.newListener !== void 0) { + this.emit("newListener", type2, unwrapListener(listener)); + events2 = this._events; + } + existing = events2[type2]; + } + if (existing === void 0) { + existing = events2[type2] = listener; + ++this._eventsCount; + } else { + if (typeof existing === "function") { + existing = events2[type2] = prepend ? [listener, existing] : [existing, listener]; + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + const m = this.getMaxListeners(); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + const w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type2) + " listeners added. Use emitter.setMaxListeners() to increase limit"); + w.name = "MaxListenersExceededWarning"; + w.emitter = this; + w.type = type2; + w.count = existing.length; + if (!this._platform.isUnderTest()) { + console.warn(w); + } + } + } + return this; + } + prependListener(type2, listener) { + return this._addListener(type2, listener, true); + } + once(type2, listener) { + checkListener(listener); + this.on(type2, new OnceWrapper(this, type2, listener).wrapperFunction); + return this; + } + prependOnceListener(type2, listener) { + checkListener(listener); + this.prependListener(type2, new OnceWrapper(this, type2, listener).wrapperFunction); + return this; + } + removeListener(type2, listener) { + checkListener(listener); + const events2 = this._events; + if (events2 === void 0) + return this; + const list = events2[type2]; + if (list === void 0) + return this; + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) { + this._events = /* @__PURE__ */ Object.create(null); + } else { + delete events2[type2]; + if (events2.removeListener) + this.emit("removeListener", type2, list.listener ?? listener); + } + } else if (typeof list !== "function") { + let position = -1; + let originalListener; + for (let i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || wrappedListener(list[i]) === listener) { + originalListener = wrappedListener(list[i]); + position = i; + break; + } + } + if (position < 0) + return this; + if (position === 0) + list.shift(); + else + list.splice(position, 1); + if (list.length === 1) + events2[type2] = list[0]; + if (events2.removeListener !== void 0) + this.emit("removeListener", type2, originalListener || listener); + } + return this; + } + off(type2, listener) { + return this.removeListener(type2, listener); + } + removeAllListeners(type2, options2) { + this._removeAllListeners(type2); + if (!options2) + return this; + if (options2.behavior === "wait") { + const errors2 = []; + this._rejectionHandler = (error2) => errors2.push(error2); + return this._waitFor(type2).then(() => { + if (errors2.length) + throw errors2[0]; + }); + } + if (options2.behavior === "ignoreErrors") + this._rejectionHandler = () => { + }; + return Promise.resolve(); + } + _removeAllListeners(type2) { + const events2 = this._events; + if (!events2) + return; + if (!events2.removeListener) { + if (type2 === void 0) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else if (events2[type2] !== void 0) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else + delete events2[type2]; + } + return; + } + if (type2 === void 0) { + const keys = Object.keys(events2); + let key2; + for (let i = 0; i < keys.length; ++i) { + key2 = keys[i]; + if (key2 === "removeListener") + continue; + this._removeAllListeners(key2); + } + this._removeAllListeners("removeListener"); + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + return; + } + const listeners = events2[type2]; + if (typeof listeners === "function") { + this.removeListener(type2, listeners); + } else if (listeners !== void 0) { + for (let i = listeners.length - 1; i >= 0; i--) + this.removeListener(type2, listeners[i]); + } + } + listeners(type2) { + return this._listeners(this, type2, true); + } + rawListeners(type2) { + return this._listeners(this, type2, false); + } + listenerCount(type2) { + const events2 = this._events; + if (events2 !== void 0) { + const listener = events2[type2]; + if (typeof listener === "function") + return 1; + if (listener !== void 0) + return listener.length; + } + return 0; + } + eventNames() { + return this._eventsCount > 0 && this._events ? Reflect.ownKeys(this._events) : []; + } + async _waitFor(type2) { + let promises2 = []; + if (type2) { + promises2 = [...this._pendingHandlers.get(type2) || []]; + } else { + promises2 = []; + for (const [, pending] of this._pendingHandlers) + promises2.push(...pending); + } + await Promise.all(promises2); + } + _listeners(target, type2, unwrap) { + const events2 = target._events; + if (events2 === void 0) + return []; + const listener = events2[type2]; + if (listener === void 0) + return []; + if (typeof listener === "function") + return unwrap ? [unwrapListener(listener)] : [listener]; + return unwrap ? unwrapListeners(listener) : listener.slice(); + } +} +function checkListener(listener) { + if (typeof listener !== "function") + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); +} +class OnceWrapper { + constructor(eventEmitter, eventType, listener) { + this._fired = false; + this._eventEmitter = eventEmitter; + this._eventType = eventType; + this._listener = listener; + this.wrapperFunction = this._handle.bind(this); + this.wrapperFunction.listener = listener; + } + _handle(...args) { + if (this._fired) + return; + this._fired = true; + this._eventEmitter.removeListener(this._eventType, this.wrapperFunction); + return this._listener.apply(this._eventEmitter, args); + } +} +function unwrapListener(l) { + return wrappedListener(l) ?? l; +} +function unwrapListeners(arr) { + return arr.map((l) => wrappedListener(l) ?? l); +} +function wrappedListener(l) { + return l.listener; +} +function captureLibraryStackTrace(platform) { + const stack = captureRawStack(); + let parsedFrames = stack.map((line) => { + const frame = parseStackFrame(line, platform.pathSeparator, platform.showInternalStackFrames()); + if (!frame || !frame.file) + return null; + const isPlaywrightLibrary = !!platform.coreDir && frame.file.startsWith(platform.coreDir); + const parsed = { + frame, + frameText: line, + isPlaywrightLibrary + }; + return parsed; + }).filter(Boolean); + let apiName = ""; + for (let i = 0; i < parsedFrames.length - 1; i++) { + const parsedFrame = parsedFrames[i]; + if (parsedFrame.isPlaywrightLibrary && !parsedFrames[i + 1].isPlaywrightLibrary) { + apiName = apiName || normalizeAPIName(parsedFrame.frame.function); + break; + } + } + function normalizeAPIName(name) { + if (!name) + return ""; + const match = name.match(/(API|JS|CDP|[A-Z])(.*)/); + if (!match) + return name; + return match[1].toLowerCase() + match[2]; + } + const filterPrefixes = platform.boxedStackPrefixes(); + parsedFrames = parsedFrames.filter((f) => { + if (filterPrefixes.some((prefix) => f.frame.file.startsWith(prefix))) + return false; + return true; + }); + return { + frames: parsedFrames.map((p) => p.frame), + apiName + }; +} +class ChannelOwner extends EventEmitter { + constructor(parent, type2, guid, initializer) { + const connection = parent instanceof ChannelOwner ? parent._connection : parent; + super(connection._platform); + this._objects = /* @__PURE__ */ new Map(); + this._eventToSubscriptionMapping = /* @__PURE__ */ new Map(); + this._wasCollected = false; + this.setMaxListeners(0); + this._connection = connection; + this._type = type2; + this._guid = guid; + this._parent = parent instanceof ChannelOwner ? parent : void 0; + this._instrumentation = this._connection._instrumentation; + this._connection._objects.set(guid, this); + if (this._parent) { + this._parent._objects.set(guid, this); + this._logger = this._parent._logger; + } + this._channel = this._createChannel(new EventEmitter(connection._platform)); + this._initializer = initializer; + } + _setEventToSubscriptionMapping(mapping) { + this._eventToSubscriptionMapping = mapping; + } + _updateSubscription(event, enabled) { + const protocolEvent = this._eventToSubscriptionMapping.get(String(event)); + if (protocolEvent) + this._channel.updateSubscription({ event: protocolEvent, enabled }).catch(() => { + }); + } + on(event, listener) { + if (!this.listenerCount(event)) + this._updateSubscription(event, true); + super.on(event, listener); + return this; + } + addListener(event, listener) { + if (!this.listenerCount(event)) + this._updateSubscription(event, true); + super.addListener(event, listener); + return this; + } + prependListener(event, listener) { + if (!this.listenerCount(event)) + this._updateSubscription(event, true); + super.prependListener(event, listener); + return this; + } + off(event, listener) { + super.off(event, listener); + if (!this.listenerCount(event)) + this._updateSubscription(event, false); + return this; + } + removeListener(event, listener) { + super.removeListener(event, listener); + if (!this.listenerCount(event)) + this._updateSubscription(event, false); + return this; + } + _adopt(child) { + child._parent._objects.delete(child._guid); + this._objects.set(child._guid, child); + child._parent = this; + } + _dispose(reason) { + if (this._parent) + this._parent._objects.delete(this._guid); + this._connection._objects.delete(this._guid); + this._wasCollected = reason === "gc"; + for (const object of [...this._objects.values()]) + object._dispose(reason); + this._objects.clear(); + } + _debugScopeState() { + return { + _guid: this._guid, + objects: Array.from(this._objects.values()).map((o) => o._debugScopeState()) + }; + } + _validatorToWireContext() { + return { + tChannelImpl: tChannelImplToWire, + binary: this._connection.rawBuffers() ? "buffer" : "toBase64", + isUnderTest: () => this._platform.isUnderTest() + }; + } + _createChannel(base2) { + const channel = new Proxy(base2, { + get: (obj, prop) => { + if (typeof prop === "string") { + const validator = maybeFindValidator(this._type, prop, "Params"); + const { internal } = methodMetainfo.get(this._type + "." + prop) || {}; + if (validator) { + return async (params) => { + return await this._wrapApiCall(async (apiZone) => { + const validatedParams = validator(params, "", this._validatorToWireContext()); + if (!apiZone.internal && !apiZone.reported) { + apiZone.reported = true; + this._instrumentation.onApiCallBegin(apiZone, { type: this._type, method: prop, params }); + logApiCall(this._platform, this._logger, `=> ${apiZone.apiName} started`); + return await this._connection.sendMessageToServer(this, prop, validatedParams, apiZone); + } + return await this._connection.sendMessageToServer(this, prop, validatedParams, { internal: true }); + }, { internal }); + }; + } + } + return obj[prop]; + } + }); + channel._object = this; + return channel; + } + async _wrapApiCall(func, options2) { + const logger = this._logger; + const existingApiZone = this._platform.zones.current().data(); + if (existingApiZone) + return await func(existingApiZone); + const crxZone = currentZone().data("crxZone"); + const stackTrace = captureLibraryStackTrace(this._platform); + const apiZone = { title: options2 == null ? void 0 : options2.title, apiName: (crxZone == null ? void 0 : crxZone.apiName) ?? stackTrace.apiName, frames: stackTrace.frames, internal: (options2 == null ? void 0 : options2.internal) ?? false, reported: false, userData: void 0, stepId: void 0 }; + try { + const result = await this._platform.zones.current().push(apiZone).run(async () => await func(apiZone)); + if (!(options2 == null ? void 0 : options2.internal)) { + logApiCall(this._platform, logger, `<= ${apiZone.apiName} succeeded`); + this._instrumentation.onApiCallEnd(apiZone); + } + return result; + } catch (e) { + const innerError = (this._platform.showInternalStackFrames() || this._platform.isUnderTest()) && e.stack ? "\n\n" + e.stack : ""; + if (apiZone.apiName && !apiZone.apiName.includes("")) + e.message = apiZone.apiName + ": " + e.message; + const stackFrames = "\n" + stringifyStackFrames(stackTrace.frames).join("\n") + innerError; + if (stackFrames.trim()) + e.stack = e.message + stackFrames; + else + e.stack = ""; + if (!(options2 == null ? void 0 : options2.internal)) { + apiZone.error = e; + logApiCall(this._platform, logger, `<= ${apiZone.apiName} failed`); + this._instrumentation.onApiCallEnd(apiZone); + } + throw e; + } + } + _toImpl() { + var _a2, _b2; + return (_b2 = (_a2 = this._connection).toImpl) == null ? void 0 : _b2.call(_a2, this); + } + toJSON() { + return { + _type: this._type, + _guid: this._guid + }; + } +} +function logApiCall(platform, logger, message) { + if (logger && logger.isEnabled("api", "info")) + logger.log("api", "info", message, [], { color: "cyan" }); + platform.log("api", message); +} +function tChannelImplToWire(names, arg, path2, context) { + if (arg._object instanceof ChannelOwner && (names === "*" || names.includes(arg._object._type))) + return { guid: arg._object._guid }; + throw new ValidationError(`${path2}: expected channel ${names.toString()}`); +} +class Stream extends ChannelOwner { + static from(Stream2) { + return Stream2._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + } + stream() { + return this._platform.streamReadable(this._channel); + } +} +const fileUploadSizeLimit = 50 * 1024 * 1024; +async function mkdirIfNeeded(platform, filePath) { + await platform.fs().promises.mkdir(platform.path().dirname(filePath), { recursive: true }).catch(() => { + }); +} +class Artifact2 extends ChannelOwner { + static from(channel) { + return channel._object; + } + async pathAfterFinished() { + if (this._connection.isRemote()) + throw new Error(`Path is not available when connecting remotely. Use saveAs() to save a local copy.`); + return (await this._channel.pathAfterFinished()).value; + } + async saveAs(path2) { + if (!this._connection.isRemote()) { + await this._channel.saveAs({ path: path2 }); + return; + } + const result = await this._channel.saveAsStream(); + const stream2 = Stream.from(result.stream); + await mkdirIfNeeded(this._platform, path2); + await new Promise((resolve, reject) => { + stream2.stream().pipe(this._platform.fs().createWriteStream(path2)).on("finish", resolve).on("error", reject); + }); + } + async failure() { + return (await this._channel.failure()).error || null; + } + async createReadStream() { + const result = await this._channel.stream(); + const stream2 = Stream.from(result.stream); + return stream2.stream(); + } + async readIntoBuffer() { + const stream2 = await this.createReadStream(); + return await new Promise((resolve, reject) => { + const chunks = []; + stream2.on("data", (chunk) => { + chunks.push(chunk); + }); + stream2.on("end", () => { + resolve(Buffer.concat(chunks)); + }); + stream2.on("error", reject); + }); + } + async cancel() { + return await this._channel.cancel(); + } + async delete() { + return await this._channel.delete(); + } +} +class CDPSession extends ChannelOwner { + static from(cdpSession) { + return cdpSession._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._channel.on("event", ({ method, params }) => { + this.emit(method, params); + }); + this.on = super.on; + this.addListener = super.addListener; + this.off = super.removeListener; + this.removeListener = super.removeListener; + this.once = super.once; + } + async send(method, params) { + const result = await this._channel.send({ method, params }); + return result.result; + } + async detach() { + return await this._channel.detach(); + } +} +function envObjectToArray(env) { + const result = []; + for (const name in env) { + if (!Object.is(env[name], void 0)) + result.push({ name, value: String(env[name]) }); + } + return result; +} +async function evaluationScript(platform, fun, arg, addSourceUrl = true) { + if (typeof fun === "function") { + const source2 = fun.toString(); + const argString = Object.is(arg, void 0) ? "undefined" : JSON.stringify(arg); + return `(${source2})(${argString})`; + } + if (arg !== void 0) + throw new Error("Cannot evaluate a string with arguments"); + if (isString(fun)) + return fun; + if (fun.content !== void 0) + return fun.content; + if (fun.path !== void 0) { + let source2 = await platform.fs().promises.readFile(fun.path, "utf8"); + if (addSourceUrl) + source2 = addSourceUrlToScript(source2, fun.path); + return source2; + } + throw new Error("Either path or content property must be present"); +} +function addSourceUrlToScript(source2, path2) { + return `${source2} +//# sourceURL=${path2.replace(/\n/g, "")}`; +} +class Clock2 { + constructor(browserContext) { + this._browserContext = browserContext; + } + async install(options2 = {}) { + await this._browserContext._channel.clockInstall(options2.time !== void 0 ? parseTime(options2.time) : {}); + } + async fastForward(ticks) { + await this._browserContext._channel.clockFastForward(parseTicks(ticks)); + } + async pauseAt(time) { + await this._browserContext._channel.clockPauseAt(parseTime(time)); + } + async resume() { + await this._browserContext._channel.clockResume({}); + } + async runFor(ticks) { + await this._browserContext._channel.clockRunFor(parseTicks(ticks)); + } + async setFixedTime(time) { + await this._browserContext._channel.clockSetFixedTime(parseTime(time)); + } + async setSystemTime(time) { + await this._browserContext._channel.clockSetSystemTime(parseTime(time)); + } +} +function parseTime(time) { + if (typeof time === "number") + return { timeNumber: time }; + if (typeof time === "string") + return { timeString: time }; + if (!isFinite(time.getTime())) + throw new Error(`Invalid date: ${time}`); + return { timeNumber: time.getTime() }; +} +function parseTicks(ticks) { + return { + ticksNumber: typeof ticks === "number" ? ticks : void 0, + ticksString: typeof ticks === "string" ? ticks : void 0 + }; +} +class TimeoutError2 extends Error { + constructor(message) { + super(message); + this.name = "TimeoutError"; + } +} +class TargetClosedError2 extends Error { + constructor(cause) { + super(cause || "Target page, context or browser has been closed"); + } +} +function isTargetClosedError(error2) { + return error2 instanceof TargetClosedError2; +} +function serializeError(e) { + if (isError$2(e)) + return { error: { message: e.message, stack: e.stack, name: e.name } }; + return { value: serializeValue(e, (value) => ({ fallThrough: value })) }; +} +function parseError(error2) { + if (!error2.error) { + if (error2.value === void 0) + throw new Error("Serialized error must have either an error or a value"); + return parseSerializedValue(error2.value, void 0); + } + if (error2.error.name === "TimeoutError") { + const e2 = new TimeoutError2(error2.error.message); + e2.stack = error2.error.stack || ""; + return e2; + } + if (error2.error.name === "TargetClosedError") { + const e2 = new TargetClosedError2(error2.error.message); + e2.stack = error2.error.stack || ""; + return e2; + } + const e = new Error(error2.error.message); + e.stack = error2.error.stack || ""; + e.name = error2.error.name; + return e; +} +class JSHandle2 extends ChannelOwner { + static from(handle) { + return handle._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._preview = this._initializer.preview; + this._channel.on("previewUpdated", ({ preview }) => this._preview = preview); + } + async evaluate(pageFunction, arg) { + const result = await this._channel.evaluateExpression({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async evaluateHandle(pageFunction, arg) { + const result = await this._channel.evaluateExpressionHandle({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return JSHandle2.from(result.handle); + } + async getProperty(propertyName) { + const result = await this._channel.getProperty({ name: propertyName }); + return JSHandle2.from(result.handle); + } + async getProperties() { + const map2 = /* @__PURE__ */ new Map(); + for (const { name, value } of (await this._channel.getPropertyList()).properties) + map2.set(name, JSHandle2.from(value)); + return map2; + } + async jsonValue() { + return parseResult((await this._channel.jsonValue()).value); + } + asElement() { + return null; + } + async [Symbol.asyncDispose]() { + await this.dispose(); + } + async dispose() { + try { + await this._channel.dispose(); + } catch (e) { + if (isTargetClosedError(e)) + return; + throw e; + } + } + toString() { + return this._preview; + } +} +function serializeArgument(arg) { + const handles = []; + const pushHandle = (channel) => { + handles.push(channel); + return handles.length - 1; + }; + const value = serializeValue(arg, (value2) => { + if (value2 instanceof JSHandle2) + return { h: pushHandle(value2._channel) }; + return { fallThrough: value2 }; + }); + return { value, handles }; +} +function parseResult(value) { + return parseSerializedValue(value, void 0); +} +function assertMaxArguments(count, max2) { + if (count > max2) + throw new Error("Too many arguments. If you need to pass more than 1 argument to the function wrap them in an object."); +} +function axNodeFromProtocol(axNode) { + const result = { + ...axNode, + value: axNode.valueNumber !== void 0 ? axNode.valueNumber : axNode.valueString, + checked: axNode.checked === "checked" ? true : axNode.checked === "unchecked" ? false : axNode.checked, + pressed: axNode.pressed === "pressed" ? true : axNode.pressed === "released" ? false : axNode.pressed, + children: axNode.children ? axNode.children.map(axNodeFromProtocol) : void 0 + }; + delete result.valueNumber; + delete result.valueString; + return result; +} +class Accessibility2 { + constructor(channel) { + this._channel = channel; + } + async snapshot(options2 = {}) { + const root = options2.root ? options2.root._elementChannel : void 0; + const result = await this._channel.accessibilitySnapshot({ interestingOnly: options2.interestingOnly, root }); + return result.rootAXNode ? axNodeFromProtocol(result.rootAXNode) : null; + } +} +class Coverage { + constructor(channel) { + this._channel = channel; + } + async startJSCoverage(options2 = {}) { + await this._channel.startJSCoverage(options2); + } + async stopJSCoverage() { + return (await this._channel.stopJSCoverage()).entries; + } + async startCSSCoverage(options2 = {}) { + await this._channel.startCSSCoverage(options2); + } + async stopCSSCoverage() { + return (await this._channel.stopCSSCoverage()).entries; + } +} +class Download2 { + constructor(page, url2, suggestedFilename, artifact) { + this._page = page; + this._url = url2; + this._suggestedFilename = suggestedFilename; + this._artifact = artifact; + } + page() { + return this._page; + } + url() { + return this._url; + } + suggestedFilename() { + return this._suggestedFilename; + } + async path() { + return await this._artifact.pathAfterFinished(); + } + async saveAs(path2) { + return await this._artifact.saveAs(path2); + } + async failure() { + return await this._artifact.failure(); + } + async createReadStream() { + return await this._artifact.createReadStream(); + } + async cancel() { + return await this._artifact.cancel(); + } + async delete() { + return await this._artifact.delete(); + } +} +const Events = { + AndroidDevice: { + WebView: "webview", + Close: "close" + }, + AndroidSocket: { + Data: "data", + Close: "close" + }, + AndroidWebView: { + Close: "close" + }, + Browser: { + Disconnected: "disconnected" + }, + BrowserContext: { + Console: "console", + Close: "close", + Dialog: "dialog", + Page: "page", + // Can't use just 'error' due to node.js special treatment of error events. + // @see https://nodejs.org/api/events.html#events_error_events + WebError: "weberror", + BackgroundPage: "backgroundpage", + ServiceWorker: "serviceworker", + Request: "request", + Response: "response", + RequestFailed: "requestfailed", + RequestFinished: "requestfinished" + }, + Page: { + Close: "close", + Crash: "crash", + Console: "console", + Dialog: "dialog", + Download: "download", + FileChooser: "filechooser", + DOMContentLoaded: "domcontentloaded", + // Can't use just 'error' due to node.js special treatment of error events. + // @see https://nodejs.org/api/events.html#events_error_events + PageError: "pageerror", + Request: "request", + Response: "response", + RequestFailed: "requestfailed", + RequestFinished: "requestfinished", + FrameAttached: "frameattached", + FrameDetached: "framedetached", + FrameNavigated: "framenavigated", + Load: "load", + Popup: "popup", + WebSocket: "websocket", + Worker: "worker" + }, + WebSocket: { + Close: "close", + Error: "socketerror", + FrameReceived: "framereceived", + FrameSent: "framesent" + }, + Worker: { + Close: "close" + }, + ElectronApplication: { + Close: "close", + Console: "console", + Window: "window" + } +}; +function getByAttributeTextSelector(attrName, text, options2) { + return `internal:attr=[${attrName}=${escapeForAttributeSelector(text, (options2 == null ? void 0 : options2.exact) || false)}]`; +} +function getByTestIdSelector(testIdAttributeName2, testId) { + return `internal:testid=[${testIdAttributeName2}=${escapeForAttributeSelector(testId, true)}]`; +} +function getByLabelSelector(text, options2) { + return "internal:label=" + escapeForTextSelector(text, !!(options2 == null ? void 0 : options2.exact)); +} +function getByAltTextSelector(text, options2) { + return getByAttributeTextSelector("alt", text, options2); +} +function getByTitleSelector(text, options2) { + return getByAttributeTextSelector("title", text, options2); +} +function getByPlaceholderSelector(text, options2) { + return getByAttributeTextSelector("placeholder", text, options2); +} +function getByTextSelector(text, options2) { + return "internal:text=" + escapeForTextSelector(text, !!(options2 == null ? void 0 : options2.exact)); +} +function getByRoleSelector(role, options2 = {}) { + const props = []; + if (options2.checked !== void 0) + props.push(["checked", String(options2.checked)]); + if (options2.disabled !== void 0) + props.push(["disabled", String(options2.disabled)]); + if (options2.selected !== void 0) + props.push(["selected", String(options2.selected)]); + if (options2.expanded !== void 0) + props.push(["expanded", String(options2.expanded)]); + if (options2.includeHidden !== void 0) + props.push(["include-hidden", String(options2.includeHidden)]); + if (options2.level !== void 0) + props.push(["level", String(options2.level)]); + if (options2.name !== void 0) + props.push(["name", escapeForAttributeSelector(options2.name, !!options2.exact)]); + if (options2.pressed !== void 0) + props.push(["pressed", String(options2.pressed)]); + return `internal:role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join("")}`; +} +class Locator { + constructor(frame, selector, options2) { + this._frame = frame; + this._selector = selector; + if (options2 == null ? void 0 : options2.hasText) + this._selector += ` >> internal:has-text=${escapeForTextSelector(options2.hasText, false)}`; + if (options2 == null ? void 0 : options2.hasNotText) + this._selector += ` >> internal:has-not-text=${escapeForTextSelector(options2.hasNotText, false)}`; + if (options2 == null ? void 0 : options2.has) { + const locator = options2.has; + if (locator._frame !== frame) + throw new Error(`Inner "has" locator must belong to the same frame.`); + this._selector += ` >> internal:has=` + JSON.stringify(locator._selector); + } + if (options2 == null ? void 0 : options2.hasNot) { + const locator = options2.hasNot; + if (locator._frame !== frame) + throw new Error(`Inner "hasNot" locator must belong to the same frame.`); + this._selector += ` >> internal:has-not=` + JSON.stringify(locator._selector); + } + if ((options2 == null ? void 0 : options2.visible) !== void 0) + this._selector += ` >> visible=${options2.visible ? "true" : "false"}`; + if (this._frame._platform.inspectCustom) + this[this._frame._platform.inspectCustom] = () => this._inspect(); + } + async _withElement(task, options2) { + const timeout = this._frame._timeout({ timeout: options2.timeout }); + const deadline = timeout ? monotonicTime() + timeout : 0; + return await this._frame._wrapApiCall(async () => { + const result = await this._frame._channel.waitForSelector({ selector: this._selector, strict: true, state: "attached", timeout }); + const handle = ElementHandle2.fromNullable(result.element); + if (!handle) + throw new Error(`Could not resolve ${this._selector} to DOM Element`); + try { + return await task(handle, deadline ? deadline - monotonicTime() : 0); + } finally { + await handle.dispose(); + } + }, { title: options2.title, internal: options2.internal }); + } + _equals(locator) { + return this._frame === locator._frame && this._selector === locator._selector; + } + page() { + return this._frame.page(); + } + async boundingBox(options2) { + return await this._withElement((h) => h.boundingBox(), { title: "Bounding box", timeout: options2 == null ? void 0 : options2.timeout }); + } + async check(options2 = {}) { + return await this._frame.check(this._selector, { strict: true, ...options2 }); + } + async click(options2 = {}) { + return await this._frame.click(this._selector, { strict: true, ...options2 }); + } + async dblclick(options2 = {}) { + await this._frame.dblclick(this._selector, { strict: true, ...options2 }); + } + async dispatchEvent(type2, eventInit = {}, options2) { + return await this._frame.dispatchEvent(this._selector, type2, eventInit, { strict: true, ...options2 }); + } + async dragTo(target, options2 = {}) { + return await this._frame.dragAndDrop(this._selector, target._selector, { + strict: true, + ...options2 + }); + } + async evaluate(pageFunction, arg, options2) { + return await this._withElement((h) => h.evaluate(pageFunction, arg), { title: "Evaluate", timeout: options2 == null ? void 0 : options2.timeout }); + } + async evaluateAll(pageFunction, arg) { + return await this._frame.$$eval(this._selector, pageFunction, arg); + } + async evaluateHandle(pageFunction, arg, options2) { + return await this._withElement((h) => h.evaluateHandle(pageFunction, arg), { title: "Evaluate", timeout: options2 == null ? void 0 : options2.timeout }); + } + async fill(value, options2 = {}) { + return await this._frame.fill(this._selector, value, { strict: true, ...options2 }); + } + async clear(options2 = {}) { + return await this.fill("", options2); + } + async _highlight() { + return await this._frame._highlight(this._selector); + } + async highlight() { + return await this._frame._highlight(this._selector); + } + locator(selectorOrLocator, options2) { + if (isString(selectorOrLocator)) + return new Locator(this._frame, this._selector + " >> " + selectorOrLocator, options2); + if (selectorOrLocator._frame !== this._frame) + throw new Error(`Locators must belong to the same frame.`); + return new Locator(this._frame, this._selector + " >> internal:chain=" + JSON.stringify(selectorOrLocator._selector), options2); + } + getByTestId(testId) { + return this.locator(getByTestIdSelector(testIdAttributeName(), testId)); + } + getByAltText(text, options2) { + return this.locator(getByAltTextSelector(text, options2)); + } + getByLabel(text, options2) { + return this.locator(getByLabelSelector(text, options2)); + } + getByPlaceholder(text, options2) { + return this.locator(getByPlaceholderSelector(text, options2)); + } + getByText(text, options2) { + return this.locator(getByTextSelector(text, options2)); + } + getByTitle(text, options2) { + return this.locator(getByTitleSelector(text, options2)); + } + getByRole(role, options2 = {}) { + return this.locator(getByRoleSelector(role, options2)); + } + frameLocator(selector) { + return new FrameLocator(this._frame, this._selector + " >> " + selector); + } + filter(options2) { + return new Locator(this._frame, this._selector, options2); + } + async elementHandle(options2) { + return await this._frame.waitForSelector(this._selector, { strict: true, state: "attached", ...options2 }); + } + async elementHandles() { + return await this._frame.$$(this._selector); + } + contentFrame() { + return new FrameLocator(this._frame, this._selector); + } + describe(description) { + return new Locator(this._frame, this._selector + " >> internal:describe=" + JSON.stringify(description)); + } + first() { + return new Locator(this._frame, this._selector + " >> nth=0"); + } + last() { + return new Locator(this._frame, this._selector + ` >> nth=-1`); + } + nth(index2) { + return new Locator(this._frame, this._selector + ` >> nth=${index2}`); + } + and(locator) { + if (locator._frame !== this._frame) + throw new Error(`Locators must belong to the same frame.`); + return new Locator(this._frame, this._selector + ` >> internal:and=` + JSON.stringify(locator._selector)); + } + or(locator) { + if (locator._frame !== this._frame) + throw new Error(`Locators must belong to the same frame.`); + return new Locator(this._frame, this._selector + ` >> internal:or=` + JSON.stringify(locator._selector)); + } + async focus(options2) { + return await this._frame.focus(this._selector, { strict: true, ...options2 }); + } + async blur(options2) { + await this._frame._channel.blur({ selector: this._selector, strict: true, ...options2, timeout: this._frame._timeout(options2) }); + } + async count() { + return await this._frame._queryCount(this._selector); + } + async _generateLocatorString() { + return await this._withElement((h) => h._generateLocatorString(), { title: "Generate locator string", internal: true }); + } + async getAttribute(name, options2) { + return await this._frame.getAttribute(this._selector, name, { strict: true, ...options2 }); + } + async hover(options2 = {}) { + return await this._frame.hover(this._selector, { strict: true, ...options2 }); + } + async innerHTML(options2) { + return await this._frame.innerHTML(this._selector, { strict: true, ...options2 }); + } + async innerText(options2) { + return await this._frame.innerText(this._selector, { strict: true, ...options2 }); + } + async inputValue(options2) { + return await this._frame.inputValue(this._selector, { strict: true, ...options2 }); + } + async isChecked(options2) { + return await this._frame.isChecked(this._selector, { strict: true, ...options2 }); + } + async isDisabled(options2) { + return await this._frame.isDisabled(this._selector, { strict: true, ...options2 }); + } + async isEditable(options2) { + return await this._frame.isEditable(this._selector, { strict: true, ...options2 }); + } + async isEnabled(options2) { + return await this._frame.isEnabled(this._selector, { strict: true, ...options2 }); + } + async isHidden(options2) { + return await this._frame.isHidden(this._selector, { strict: true, ...options2 }); + } + async isVisible(options2) { + return await this._frame.isVisible(this._selector, { strict: true, ...options2 }); + } + async press(key2, options2 = {}) { + return await this._frame.press(this._selector, key2, { strict: true, ...options2 }); + } + async screenshot(options2 = {}) { + const mask = options2.mask; + return await this._withElement((h, timeout) => h.screenshot({ ...options2, mask, timeout }), { title: "Screenshot", timeout: options2.timeout }); + } + async ariaSnapshot(options2) { + const result = await this._frame._channel.ariaSnapshot({ ...options2, selector: this._selector, timeout: this._frame._timeout(options2) }); + return result.snapshot; + } + async scrollIntoViewIfNeeded(options2 = {}) { + return await this._withElement((h, timeout) => h.scrollIntoViewIfNeeded({ ...options2, timeout }), { title: "Scroll into view", timeout: options2.timeout }); + } + async selectOption(values, options2 = {}) { + return await this._frame.selectOption(this._selector, values, { strict: true, ...options2 }); + } + async selectText(options2 = {}) { + return await this._withElement((h, timeout) => h.selectText({ ...options2, timeout }), { title: "Select text", timeout: options2.timeout }); + } + async setChecked(checked, options2) { + if (checked) + await this.check(options2); + else + await this.uncheck(options2); + } + async setInputFiles(files, options2 = {}) { + return await this._frame.setInputFiles(this._selector, files, { strict: true, ...options2 }); + } + async tap(options2 = {}) { + return await this._frame.tap(this._selector, { strict: true, ...options2 }); + } + async textContent(options2) { + return await this._frame.textContent(this._selector, { strict: true, ...options2 }); + } + async type(text, options2 = {}) { + return await this._frame.type(this._selector, text, { strict: true, ...options2 }); + } + async pressSequentially(text, options2 = {}) { + return await this.type(text, options2); + } + async uncheck(options2 = {}) { + return await this._frame.uncheck(this._selector, { strict: true, ...options2 }); + } + async all() { + return new Array(await this.count()).fill(0).map((e, i) => this.nth(i)); + } + async allInnerTexts() { + return await this._frame.$$eval(this._selector, (ee) => ee.map((e) => e.innerText)); + } + async allTextContents() { + return await this._frame.$$eval(this._selector, (ee) => ee.map((e) => e.textContent || "")); + } + async waitFor(options2) { + await this._frame._channel.waitForSelector({ selector: this._selector, strict: true, omitReturnValue: true, ...options2, timeout: this._frame._timeout(options2) }); + } + async _expect(expression, options2) { + const params = { selector: this._selector, expression, ...options2, isNot: !!options2.isNot }; + params.expectedValue = serializeArgument(options2.expectedValue); + const result = await this._frame._channel.expect(params); + if (result.received !== void 0) + result.received = parseResult(result.received); + return result; + } + _inspect() { + return this.toString(); + } + toString() { + return asLocator("javascript", this._selector); + } +} +class FrameLocator { + constructor(frame, selector) { + this._frame = frame; + this._frameSelector = selector; + } + locator(selectorOrLocator, options2) { + if (isString(selectorOrLocator)) + return new Locator(this._frame, this._frameSelector + " >> internal:control=enter-frame >> " + selectorOrLocator, options2); + if (selectorOrLocator._frame !== this._frame) + throw new Error(`Locators must belong to the same frame.`); + return new Locator(this._frame, this._frameSelector + " >> internal:control=enter-frame >> " + selectorOrLocator._selector, options2); + } + getByTestId(testId) { + return this.locator(getByTestIdSelector(testIdAttributeName(), testId)); + } + getByAltText(text, options2) { + return this.locator(getByAltTextSelector(text, options2)); + } + getByLabel(text, options2) { + return this.locator(getByLabelSelector(text, options2)); + } + getByPlaceholder(text, options2) { + return this.locator(getByPlaceholderSelector(text, options2)); + } + getByText(text, options2) { + return this.locator(getByTextSelector(text, options2)); + } + getByTitle(text, options2) { + return this.locator(getByTitleSelector(text, options2)); + } + getByRole(role, options2 = {}) { + return this.locator(getByRoleSelector(role, options2)); + } + owner() { + return new Locator(this._frame, this._frameSelector); + } + frameLocator(selector) { + return new FrameLocator(this._frame, this._frameSelector + " >> internal:control=enter-frame >> " + selector); + } + first() { + return new FrameLocator(this._frame, this._frameSelector + " >> nth=0"); + } + last() { + return new FrameLocator(this._frame, this._frameSelector + ` >> nth=-1`); + } + nth(index2) { + return new FrameLocator(this._frame, this._frameSelector + ` >> nth=${index2}`); + } +} +let _testIdAttributeName = "data-testid"; +function testIdAttributeName() { + return _testIdAttributeName; +} +function setTestIdAttribute(attributeName) { + _testIdAttributeName = attributeName; +} +class Tracing2 extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._includeSources = false; + this._isTracing = false; + } + static from(channel) { + return channel._object; + } + async start(options2 = {}) { + this._includeSources = !!options2.sources; + await this._channel.tracingStart({ + name: options2.name, + snapshots: options2.snapshots, + screenshots: options2.screenshots, + live: options2._live + }); + const { traceName } = await this._channel.tracingStartChunk({ name: options2.name, title: options2.title }); + await this._startCollectingStacks(traceName); + } + async startChunk(options2 = {}) { + const { traceName } = await this._channel.tracingStartChunk(options2); + await this._startCollectingStacks(traceName); + } + async group(name, options2 = {}) { + await this._channel.tracingGroup({ name, location: options2.location }); + } + async groupEnd() { + await this._channel.tracingGroupEnd(); + } + async _startCollectingStacks(traceName) { + var _a2; + if (!this._isTracing) { + this._isTracing = true; + this._connection.setIsTracing(true); + } + const result = await ((_a2 = this._connection.localUtils()) == null ? void 0 : _a2.tracingStarted({ tracesDir: this._tracesDir, traceName })); + this._stacksId = result == null ? void 0 : result.stacksId; + } + async stopChunk(options2 = {}) { + await this._doStopChunk(options2.path); + } + async stop(options2 = {}) { + await this._doStopChunk(options2.path); + await this._channel.tracingStop(); + } + async _doStopChunk(filePath) { + this._resetStackCounter(); + if (!filePath) { + await this._channel.tracingStopChunk({ mode: "discard" }); + if (this._stacksId) + await this._connection.localUtils().traceDiscarded({ stacksId: this._stacksId }); + return; + } + const localUtils = this._connection.localUtils(); + if (!localUtils) + throw new Error("Cannot save trace in thin clients"); + const isLocal = !this._connection.isRemote(); + if (isLocal) { + const result2 = await this._channel.tracingStopChunk({ mode: "entries" }); + await localUtils.zip({ zipFile: filePath, entries: result2.entries, mode: "write", stacksId: this._stacksId, includeSources: this._includeSources }); + return; + } + const result = await this._channel.tracingStopChunk({ mode: "archive" }); + if (!result.artifact) { + if (this._stacksId) + await localUtils.traceDiscarded({ stacksId: this._stacksId }); + return; + } + const artifact = Artifact2.from(result.artifact); + await artifact.saveAs(filePath); + await artifact.delete(); + await localUtils.zip({ zipFile: filePath, entries: [], mode: "append", stacksId: this._stacksId, includeSources: this._includeSources }); + } + _resetStackCounter() { + if (this._isTracing) { + this._isTracing = false; + this._connection.setIsTracing(false); + } + } +} +class TimeoutSettings { + constructor(platform, parent) { + this._parent = parent; + this._platform = platform; + } + setDefaultTimeout(timeout) { + this._defaultTimeout = timeout; + } + setDefaultNavigationTimeout(timeout) { + this._defaultNavigationTimeout = timeout; + } + defaultNavigationTimeout() { + return this._defaultNavigationTimeout; + } + defaultTimeout() { + return this._defaultTimeout; + } + navigationTimeout(options2) { + if (typeof options2.timeout === "number") + return options2.timeout; + if (this._defaultNavigationTimeout !== void 0) + return this._defaultNavigationTimeout; + if (this._platform.isDebugMode()) + return 0; + if (this._defaultTimeout !== void 0) + return this._defaultTimeout; + if (this._parent) + return this._parent.navigationTimeout(options2); + return DEFAULT_PLAYWRIGHT_TIMEOUT; + } + timeout(options2) { + if (typeof options2.timeout === "number") + return options2.timeout; + if (this._platform.isDebugMode()) + return 0; + if (this._defaultTimeout !== void 0) + return this._defaultTimeout; + if (this._parent) + return this._parent.timeout(options2); + return DEFAULT_PLAYWRIGHT_TIMEOUT; + } + launchTimeout(options2) { + if (typeof options2.timeout === "number") + return options2.timeout; + if (this._platform.isDebugMode()) + return 0; + if (this._parent) + return this._parent.launchTimeout(options2); + return DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT; + } +} +class APIRequest { + constructor(playwright2) { + this._contexts = /* @__PURE__ */ new Set(); + this._playwright = playwright2; + } + async newContext(options2 = {}) { + var _a2, _b2; + options2 = { + ...this._playwright._defaultContextOptions, + ...options2 + }; + const storageState = typeof options2.storageState === "string" ? JSON.parse(await this._playwright._platform.fs().promises.readFile(options2.storageState, "utf8")) : options2.storageState; + const context = APIRequestContext.from((await this._playwright._channel.newRequest({ + ...options2, + extraHTTPHeaders: options2.extraHTTPHeaders ? headersObjectToArray(options2.extraHTTPHeaders) : void 0, + storageState, + tracesDir: (_a2 = this._playwright._defaultLaunchOptions) == null ? void 0 : _a2.tracesDir, + // We do not expose tracesDir in the API, so do not allow options to accidentally override it. + clientCertificates: await toClientCertificatesProtocol(this._playwright._platform, options2.clientCertificates) + })).request); + this._contexts.add(context); + context._request = this; + context._timeoutSettings.setDefaultTimeout(options2.timeout ?? this._playwright._defaultContextTimeout); + context._tracing._tracesDir = (_b2 = this._playwright._defaultLaunchOptions) == null ? void 0 : _b2.tracesDir; + await context._instrumentation.runAfterCreateRequestContext(context); + return context; + } +} +class APIRequestContext extends ChannelOwner { + static from(channel) { + return channel._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._tracing = Tracing2.from(initializer.tracing); + this._timeoutSettings = new TimeoutSettings(this._platform); + } + async [Symbol.asyncDispose]() { + await this.dispose(); + } + async dispose(options2 = {}) { + var _a2; + this._closeReason = options2.reason; + await this._instrumentation.runBeforeCloseRequestContext(this); + try { + await this._channel.dispose(options2); + } catch (e) { + if (isTargetClosedError(e)) + return; + throw e; + } + this._tracing._resetStackCounter(); + (_a2 = this._request) == null ? void 0 : _a2._contexts.delete(this); + } + async delete(url2, options2) { + return await this.fetch(url2, { + ...options2, + method: "DELETE" + }); + } + async head(url2, options2) { + return await this.fetch(url2, { + ...options2, + method: "HEAD" + }); + } + async get(url2, options2) { + return await this.fetch(url2, { + ...options2, + method: "GET" + }); + } + async patch(url2, options2) { + return await this.fetch(url2, { + ...options2, + method: "PATCH" + }); + } + async post(url2, options2) { + return await this.fetch(url2, { + ...options2, + method: "POST" + }); + } + async put(url2, options2) { + return await this.fetch(url2, { + ...options2, + method: "PUT" + }); + } + async fetch(urlOrRequest, options2 = {}) { + const url2 = isString(urlOrRequest) ? urlOrRequest : void 0; + const request2 = isString(urlOrRequest) ? void 0 : urlOrRequest; + return await this._innerFetch({ url: url2, request: request2, ...options2 }); + } + async _innerFetch(options2 = {}) { + return await this._wrapApiCall(async () => { + var _a2, _b2, _c2; + if (this._closeReason) + throw new TargetClosedError2(this._closeReason); + assert(options2.request || typeof options2.url === "string", "First argument must be either URL string or Request"); + assert((options2.data === void 0 ? 0 : 1) + (options2.form === void 0 ? 0 : 1) + (options2.multipart === void 0 ? 0 : 1) <= 1, `Only one of 'data', 'form' or 'multipart' can be specified`); + assert(options2.maxRedirects === void 0 || options2.maxRedirects >= 0, `'maxRedirects' must be greater than or equal to '0'`); + assert(options2.maxRetries === void 0 || options2.maxRetries >= 0, `'maxRetries' must be greater than or equal to '0'`); + const url2 = options2.url !== void 0 ? options2.url : options2.request.url(); + const method = options2.method || ((_a2 = options2.request) == null ? void 0 : _a2.method()); + let encodedParams = void 0; + if (typeof options2.params === "string") + encodedParams = options2.params; + else if (options2.params instanceof URLSearchParams) + encodedParams = options2.params.toString(); + const headersObj = options2.headers || ((_b2 = options2.request) == null ? void 0 : _b2.headers()); + const headers = headersObj ? headersObjectToArray(headersObj) : void 0; + let jsonData; + let formData; + let multipartData; + let postDataBuffer; + if (options2.data !== void 0) { + if (isString(options2.data)) { + if (isJsonContentType(headers)) + jsonData = isJsonParsable(options2.data) ? options2.data : JSON.stringify(options2.data); + else + postDataBuffer = Buffer.from(options2.data, "utf8"); + } else if (Buffer.isBuffer(options2.data)) { + postDataBuffer = options2.data; + } else if (typeof options2.data === "object" || typeof options2.data === "number" || typeof options2.data === "boolean") { + jsonData = JSON.stringify(options2.data); + } else { + throw new Error(`Unexpected 'data' type`); + } + } else if (options2.form) { + if (globalThis.FormData && options2.form instanceof FormData) { + formData = []; + for (const [name, value] of options2.form.entries()) { + if (typeof value !== "string") + throw new Error(`Expected string for options.form["${name}"], found File. Please use options.multipart instead.`); + formData.push({ name, value }); + } + } else { + formData = objectToArray(options2.form); + } + } else if (options2.multipart) { + multipartData = []; + if (globalThis.FormData && options2.multipart instanceof FormData) { + const form = options2.multipart; + for (const [name, value] of form.entries()) { + if (isString(value)) { + multipartData.push({ name, value }); + } else { + const file = { + name: value.name, + mimeType: value.type, + buffer: Buffer.from(await value.arrayBuffer()) + }; + multipartData.push({ name, file }); + } + } + } else { + for (const [name, value] of Object.entries(options2.multipart)) + multipartData.push(await toFormField(this._platform, name, value)); + } + } + if (postDataBuffer === void 0 && jsonData === void 0 && formData === void 0 && multipartData === void 0) + postDataBuffer = ((_c2 = options2.request) == null ? void 0 : _c2.postDataBuffer()) || void 0; + const fixtures = { + __testHookLookup: options2.__testHookLookup + }; + const result = await this._channel.fetch({ + url: url2, + params: typeof options2.params === "object" ? objectToArray(options2.params) : void 0, + encodedParams, + method, + headers, + postData: postDataBuffer, + jsonData, + formData, + multipartData, + timeout: this._timeoutSettings.timeout(options2), + failOnStatusCode: options2.failOnStatusCode, + ignoreHTTPSErrors: options2.ignoreHTTPSErrors, + maxRedirects: options2.maxRedirects, + maxRetries: options2.maxRetries, + ...fixtures + }); + return new APIResponse(this, result.response); + }); + } + async storageState(options2 = {}) { + const state2 = await this._channel.storageState({ indexedDB: options2.indexedDB }); + if (options2.path) { + await mkdirIfNeeded(this._platform, options2.path); + await this._platform.fs().promises.writeFile(options2.path, JSON.stringify(state2, void 0, 2), "utf8"); + } + return state2; + } +} +async function toFormField(platform, name, value) { + const typeOfValue = typeof value; + if (isFilePayload(value)) { + const payload = value; + if (!Buffer.isBuffer(payload.buffer)) + throw new Error(`Unexpected buffer type of 'data.${name}'`); + return { name, file: filePayloadToJson(payload) }; + } else if (typeOfValue === "string" || typeOfValue === "number" || typeOfValue === "boolean") { + return { name, value: String(value) }; + } else { + return { name, file: await readStreamToJson(platform, value) }; + } +} +function isJsonParsable(value) { + if (typeof value !== "string") + return false; + try { + JSON.parse(value); + return true; + } catch (e) { + if (e instanceof SyntaxError) + return false; + else + throw e; + } +} +class APIResponse { + constructor(context, initializer) { + this._request = context; + this._initializer = initializer; + this._headers = new RawHeaders(this._initializer.headers); + if (context._platform.inspectCustom) + this[context._platform.inspectCustom] = () => this._inspect(); + } + ok() { + return this._initializer.status >= 200 && this._initializer.status <= 299; + } + url() { + return this._initializer.url; + } + status() { + return this._initializer.status; + } + statusText() { + return this._initializer.statusText; + } + headers() { + return this._headers.headers(); + } + headersArray() { + return this._headers.headersArray(); + } + async body() { + return await this._request._wrapApiCall(async () => { + try { + const result = await this._request._channel.fetchResponseBody({ fetchUid: this._fetchUid() }); + if (result.binary === void 0) + throw new Error("Response has been disposed"); + return result.binary; + } catch (e) { + if (isTargetClosedError(e)) + throw new Error("Response has been disposed"); + throw e; + } + }, { internal: true }); + } + async text() { + const content = await this.body(); + return content.toString("utf8"); + } + async json() { + const content = await this.text(); + return JSON.parse(content); + } + async [Symbol.asyncDispose]() { + await this.dispose(); + } + async dispose() { + await this._request._channel.disposeAPIResponse({ fetchUid: this._fetchUid() }); + } + _inspect() { + const headers = this.headersArray().map(({ name, value }) => ` ${name}: ${value}`); + return `APIResponse: ${this.status()} ${this.statusText()} +${headers.join("\n")}`; + } + _fetchUid() { + return this._initializer.fetchUid; + } + async _fetchLog() { + const { log } = await this._request._channel.fetchLog({ fetchUid: this._fetchUid() }); + return log; + } +} +function filePayloadToJson(payload) { + return { + name: payload.name, + mimeType: payload.mimeType, + buffer: payload.buffer + }; +} +async function readStreamToJson(platform, stream2) { + const buffer2 = await new Promise((resolve, reject) => { + const chunks = []; + stream2.on("data", (chunk) => chunks.push(chunk)); + stream2.on("end", () => resolve(Buffer.concat(chunks))); + stream2.on("error", (err) => reject(err)); + }); + const streamPath = Buffer.isBuffer(stream2.path) ? stream2.path.toString("utf8") : stream2.path; + return { + name: platform.path().basename(streamPath), + buffer: buffer2 + }; +} +function isJsonContentType(headers) { + if (!headers) + return false; + for (const { name, value } of headers) { + if (name.toLocaleLowerCase() === "content-type") + return value === "application/json"; + } + return false; +} +function objectToArray(map2) { + if (!map2) + return void 0; + const result = []; + for (const [name, value] of Object.entries(map2)) { + if (value !== void 0) + result.push({ name, value: String(value) }); + } + return result; +} +function isFilePayload(value) { + return typeof value === "object" && value["name"] && value["mimeType"] && value["buffer"]; +} +class Waiter { + constructor(channelOwner, event) { + this._failures = []; + this._logs = []; + this._waitId = channelOwner._platform.createGuid(); + this._channelOwner = channelOwner; + this._savedZone = channelOwner._platform.zones.current().pop(); + this._channelOwner._channel.waitForEventInfo({ info: { waitId: this._waitId, phase: "before", event } }).catch(() => { + }); + this._dispose = [ + () => this._channelOwner._wrapApiCall(async () => { + await this._channelOwner._channel.waitForEventInfo({ info: { waitId: this._waitId, phase: "after", error: this._error } }); + }, { internal: true }).catch(() => { + }) + ]; + } + static createForEvent(channelOwner, event) { + return new Waiter(channelOwner, event); + } + async waitForEvent(emitter, event, predicate) { + const { promise, dispose } = waitForEvent(emitter, event, this._savedZone, predicate); + return await this.waitForPromise(promise, dispose); + } + rejectOnEvent(emitter, event, error2, predicate) { + const { promise, dispose } = waitForEvent(emitter, event, this._savedZone, predicate); + this._rejectOn(promise.then(() => { + throw typeof error2 === "function" ? error2() : error2; + }), dispose); + } + rejectOnTimeout(timeout, message) { + if (!timeout) + return; + const { promise, dispose } = waitForTimeout(timeout); + this._rejectOn(promise.then(() => { + throw new TimeoutError2(message); + }), dispose); + } + rejectImmediately(error2) { + this._immediateError = error2; + } + dispose() { + for (const dispose of this._dispose) + dispose(); + } + async waitForPromise(promise, dispose) { + try { + if (this._immediateError) + throw this._immediateError; + const result = await Promise.race([promise, ...this._failures]); + if (dispose) + dispose(); + return result; + } catch (e) { + if (dispose) + dispose(); + this._error = e.message; + this.dispose(); + rewriteErrorMessage(e, e.message + formatLogRecording(this._logs)); + throw e; + } + } + log(s) { + this._logs.push(s); + this._channelOwner._wrapApiCall(async () => { + await this._channelOwner._channel.waitForEventInfo({ info: { waitId: this._waitId, phase: "log", message: s } }); + }, { internal: true }).catch(() => { + }); + } + _rejectOn(promise, dispose) { + this._failures.push(promise); + if (dispose) + this._dispose.push(dispose); + } +} +function waitForEvent(emitter, event, savedZone, predicate) { + let listener; + const promise = new Promise((resolve, reject) => { + listener = async (eventArg) => { + await savedZone.run(async () => { + try { + if (predicate && !await predicate(eventArg)) + return; + emitter.removeListener(event, listener); + resolve(eventArg); + } catch (e) { + emitter.removeListener(event, listener); + reject(e); + } + }); + }; + emitter.addListener(event, listener); + }); + const dispose = () => emitter.removeListener(event, listener); + return { promise, dispose }; +} +function waitForTimeout(timeout) { + let timeoutId; + const promise = new Promise((resolve) => timeoutId = setTimeout(resolve, timeout)); + const dispose = () => clearTimeout(timeoutId); + return { promise, dispose }; +} +function formatLogRecording(log) { + if (!log.length) + return ""; + const header = ` logs `; + const headerLength = 60; + const leftLength = (headerLength - header.length) / 2; + const rightLength = headerLength - header.length - leftLength; + return ` +${"=".repeat(leftLength)}${header}${"=".repeat(rightLength)} +${log.join("\n")} +${"=".repeat(headerLength)}`; +} +class Worker extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._closedScope = new LongStandingScope(); + this._channel.on("close", () => { + if (this._page) + this._page._workers.delete(this); + if (this._context) + this._context._serviceWorkers.delete(this); + this.emit(Events.Worker.Close, this); + }); + this.once(Events.Worker.Close, () => { + var _a2; + return this._closedScope.close(((_a2 = this._page) == null ? void 0 : _a2._closeErrorWithReason()) || new TargetClosedError2()); + }); + } + static from(worker) { + return worker._object; + } + url() { + return this._initializer.url; + } + async evaluate(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + const result = await this._channel.evaluateExpression({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async evaluateHandle(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + const result = await this._channel.evaluateExpressionHandle({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return JSHandle2.from(result.handle); + } +} +class Request2 extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._redirectedFrom = null; + this._redirectedTo = null; + this._failureText = null; + this._fallbackOverrides = {}; + this._redirectedFrom = Request2.fromNullable(initializer.redirectedFrom); + if (this._redirectedFrom) + this._redirectedFrom._redirectedTo = this; + this._provisionalHeaders = new RawHeaders(initializer.headers); + this._timing = { + startTime: 0, + domainLookupStart: -1, + domainLookupEnd: -1, + connectStart: -1, + secureConnectionStart: -1, + connectEnd: -1, + requestStart: -1, + responseStart: -1, + responseEnd: -1 + }; + } + static from(request2) { + return request2._object; + } + static fromNullable(request2) { + return request2 ? Request2.from(request2) : null; + } + url() { + return this._fallbackOverrides.url || this._initializer.url; + } + resourceType() { + return this._initializer.resourceType; + } + method() { + return this._fallbackOverrides.method || this._initializer.method; + } + postData() { + var _a2; + return ((_a2 = this._fallbackOverrides.postDataBuffer || this._initializer.postData) == null ? void 0 : _a2.toString("utf-8")) || null; + } + postDataBuffer() { + return this._fallbackOverrides.postDataBuffer || this._initializer.postData || null; + } + postDataJSON() { + const postData = this.postData(); + if (!postData) + return null; + const contentType = this.headers()["content-type"]; + if (contentType == null ? void 0 : contentType.includes("application/x-www-form-urlencoded")) { + const entries = {}; + const parsed = new URLSearchParams(postData); + for (const [k, v] of parsed.entries()) + entries[k] = v; + return entries; + } + try { + return JSON.parse(postData); + } catch (e) { + throw new Error("POST data is not a valid JSON object: " + postData); + } + } + /** + * @deprecated + */ + headers() { + if (this._fallbackOverrides.headers) + return RawHeaders._fromHeadersObjectLossy(this._fallbackOverrides.headers).headers(); + return this._provisionalHeaders.headers(); + } + async _actualHeaders() { + if (this._fallbackOverrides.headers) + return RawHeaders._fromHeadersObjectLossy(this._fallbackOverrides.headers); + if (!this._actualHeadersPromise) { + this._actualHeadersPromise = this._wrapApiCall(async () => { + return new RawHeaders((await this._channel.rawRequestHeaders()).headers); + }, { internal: true }); + } + return await this._actualHeadersPromise; + } + async allHeaders() { + return (await this._actualHeaders()).headers(); + } + async headersArray() { + return (await this._actualHeaders()).headersArray(); + } + async headerValue(name) { + return (await this._actualHeaders()).get(name); + } + async response() { + return Response2.fromNullable((await this._channel.response()).response); + } + async _internalResponse() { + return Response2.fromNullable((await this._channel.response()).response); + } + frame() { + if (!this._initializer.frame) { + assert(this.serviceWorker()); + throw new Error("Service Worker requests do not have an associated frame."); + } + const frame = Frame.from(this._initializer.frame); + if (!frame._page) { + throw new Error([ + "Frame for this navigation request is not available, because the request", + "was issued before the frame is created. You can check whether the request", + "is a navigation request by calling isNavigationRequest() method." + ].join("\n")); + } + return frame; + } + _safePage() { + var _a2; + return ((_a2 = Frame.fromNullable(this._initializer.frame)) == null ? void 0 : _a2._page) || null; + } + serviceWorker() { + return this._initializer.serviceWorker ? Worker.from(this._initializer.serviceWorker) : null; + } + isNavigationRequest() { + return this._initializer.isNavigationRequest; + } + redirectedFrom() { + return this._redirectedFrom; + } + redirectedTo() { + return this._redirectedTo; + } + failure() { + if (this._failureText === null) + return null; + return { + errorText: this._failureText + }; + } + timing() { + return this._timing; + } + async sizes() { + const response2 = await this.response(); + if (!response2) + throw new Error("Unable to fetch sizes for failed request"); + return (await response2._channel.sizes()).sizes; + } + _setResponseEndTiming(responseEndTiming) { + this._timing.responseEnd = responseEndTiming; + if (this._timing.responseStart === -1) + this._timing.responseStart = responseEndTiming; + } + _finalRequest() { + return this._redirectedTo ? this._redirectedTo._finalRequest() : this; + } + _applyFallbackOverrides(overrides) { + if (overrides.url) + this._fallbackOverrides.url = overrides.url; + if (overrides.method) + this._fallbackOverrides.method = overrides.method; + if (overrides.headers) + this._fallbackOverrides.headers = overrides.headers; + if (isString(overrides.postData)) + this._fallbackOverrides.postDataBuffer = Buffer.from(overrides.postData, "utf-8"); + else if (overrides.postData instanceof Buffer) + this._fallbackOverrides.postDataBuffer = overrides.postData; + else if (overrides.postData) + this._fallbackOverrides.postDataBuffer = Buffer.from(JSON.stringify(overrides.postData), "utf-8"); + } + _fallbackOverridesForContinue() { + return this._fallbackOverrides; + } + _targetClosedScope() { + var _a2, _b2; + return ((_a2 = this.serviceWorker()) == null ? void 0 : _a2._closedScope) || ((_b2 = this._safePage()) == null ? void 0 : _b2._closedOrCrashedScope) || new LongStandingScope(); + } +} +class Route2 extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._handlingPromise = null; + this._didThrow = false; + } + static from(route) { + return route._object; + } + request() { + return Request2.from(this._initializer.request); + } + async _raceWithTargetClose(promise) { + return await this.request()._targetClosedScope().safeRace(promise); + } + async _startHandling() { + this._handlingPromise = new ManualPromise(); + return await this._handlingPromise; + } + async fallback(options2 = {}) { + this._checkNotHandled(); + this.request()._applyFallbackOverrides(options2); + this._reportHandled(false); + } + async abort(errorCode) { + await this._handleRoute(async () => { + await this._raceWithTargetClose(this._channel.abort({ errorCode })); + }); + } + async _redirectNavigationRequest(url2) { + await this._handleRoute(async () => { + await this._raceWithTargetClose(this._channel.redirectNavigationRequest({ url: url2 })); + }); + } + async fetch(options2 = {}) { + return await this._wrapApiCall(async () => { + return await this._context.request._innerFetch({ request: this.request(), data: options2.postData, ...options2 }); + }); + } + async fulfill(options2 = {}) { + await this._handleRoute(async () => { + await this._innerFulfill(options2); + }); + } + async _handleRoute(callback) { + this._checkNotHandled(); + try { + await callback(); + this._reportHandled(true); + } catch (e) { + this._didThrow = true; + throw e; + } + } + async _innerFulfill(options2 = {}) { + let fetchResponseUid; + let { status: statusOption, headers: headersOption, body } = options2; + if (options2.json !== void 0) { + assert(options2.body === void 0, "Can specify either body or json parameters"); + body = JSON.stringify(options2.json); + } + if (options2.response instanceof APIResponse) { + statusOption ?? (statusOption = options2.response.status()); + headersOption ?? (headersOption = options2.response.headers()); + if (body === void 0 && options2.path === void 0) { + if (options2.response._request._connection === this._connection) + fetchResponseUid = options2.response._fetchUid(); + else + body = await options2.response.body(); + } + } + let isBase64 = false; + let length = 0; + if (options2.path) { + const buffer2 = await this._platform.fs().promises.readFile(options2.path); + body = buffer2.toString("base64"); + isBase64 = true; + length = buffer2.length; + } else if (isString(body)) { + isBase64 = false; + length = Buffer.byteLength(body); + } else if (body) { + length = body.length; + body = body.toString("base64"); + isBase64 = true; + } + const headers = {}; + for (const header of Object.keys(headersOption || {})) + headers[header.toLowerCase()] = String(headersOption[header]); + if (options2.contentType) + headers["content-type"] = String(options2.contentType); + else if (options2.json) + headers["content-type"] = "application/json"; + else if (options2.path) + headers["content-type"] = getMimeTypeForPath(options2.path) || "application/octet-stream"; + if (length && !("content-length" in headers)) + headers["content-length"] = String(length); + await this._raceWithTargetClose(this._channel.fulfill({ + status: statusOption || 200, + headers: headersObjectToArray(headers), + body, + isBase64, + fetchResponseUid + })); + } + async continue(options2 = {}) { + await this._handleRoute(async () => { + this.request()._applyFallbackOverrides(options2); + await this._innerContinue( + false + /* isFallback */ + ); + }); + } + _checkNotHandled() { + if (!this._handlingPromise) + throw new Error("Route is already handled!"); + } + _reportHandled(done) { + const chain = this._handlingPromise; + this._handlingPromise = null; + chain.resolve(done); + } + async _innerContinue(isFallback) { + const options2 = this.request()._fallbackOverridesForContinue(); + return await this._raceWithTargetClose(this._channel.continue({ + url: options2.url, + method: options2.method, + headers: options2.headers ? headersObjectToArray(options2.headers) : void 0, + postData: options2.postDataBuffer, + isFallback + })); + } +} +class WebSocketRoute extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._connected = false; + this._server = { + onMessage: (handler) => { + this._onServerMessage = handler; + }, + onClose: (handler) => { + this._onServerClose = handler; + }, + connectToServer: () => { + throw new Error(`connectToServer must be called on the page-side WebSocketRoute`); + }, + url: () => { + return this._initializer.url; + }, + close: async (options2 = {}) => { + await this._channel.closeServer({ ...options2, wasClean: true }).catch(() => { + }); + }, + send: (message) => { + if (isString(message)) + this._channel.sendToServer({ message, isBase64: false }).catch(() => { + }); + else + this._channel.sendToServer({ message: message.toString("base64"), isBase64: true }).catch(() => { + }); + }, + async [Symbol.asyncDispose]() { + await this.close(); + } + }; + this._channel.on("messageFromPage", ({ message, isBase64 }) => { + if (this._onPageMessage) + this._onPageMessage(isBase64 ? Buffer.from(message, "base64") : message); + else if (this._connected) + this._channel.sendToServer({ message, isBase64 }).catch(() => { + }); + }); + this._channel.on("messageFromServer", ({ message, isBase64 }) => { + if (this._onServerMessage) + this._onServerMessage(isBase64 ? Buffer.from(message, "base64") : message); + else + this._channel.sendToPage({ message, isBase64 }).catch(() => { + }); + }); + this._channel.on("closePage", ({ code, reason, wasClean }) => { + if (this._onPageClose) + this._onPageClose(code, reason); + else + this._channel.closeServer({ code, reason, wasClean }).catch(() => { + }); + }); + this._channel.on("closeServer", ({ code, reason, wasClean }) => { + if (this._onServerClose) + this._onServerClose(code, reason); + else + this._channel.closePage({ code, reason, wasClean }).catch(() => { + }); + }); + } + static from(route) { + return route._object; + } + url() { + return this._initializer.url; + } + async close(options2 = {}) { + await this._channel.closePage({ ...options2, wasClean: true }).catch(() => { + }); + } + connectToServer() { + if (this._connected) + throw new Error("Already connected to the server"); + this._connected = true; + this._channel.connect().catch(() => { + }); + return this._server; + } + send(message) { + if (isString(message)) + this._channel.sendToPage({ message, isBase64: false }).catch(() => { + }); + else + this._channel.sendToPage({ message: message.toString("base64"), isBase64: true }).catch(() => { + }); + } + onMessage(handler) { + this._onPageMessage = handler; + } + onClose(handler) { + this._onPageClose = handler; + } + async [Symbol.asyncDispose]() { + await this.close(); + } + async _afterHandle() { + if (this._connected) + return; + await this._channel.ensureOpened(); + } +} +class WebSocketRouteHandler { + constructor(baseURL, url2, handler) { + this._baseURL = baseURL; + this.url = url2; + this.handler = handler; + } + static prepareInterceptionPatterns(handlers) { + const patterns = []; + let all = false; + for (const handler of handlers) { + if (isString(handler.url)) + patterns.push({ glob: handler.url }); + else if (isRegExp$4(handler.url)) + patterns.push({ regexSource: handler.url.source, regexFlags: handler.url.flags }); + else + all = true; + } + if (all) + return [{ glob: "**/*" }]; + return patterns; + } + matches(wsURL) { + return urlMatches(this._baseURL, wsURL, this.url, true); + } + async handle(webSocketRoute) { + const handler = this.handler; + await handler(webSocketRoute); + await webSocketRoute._afterHandle(); + } +} +class Response2 extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._finishedPromise = new ManualPromise(); + this._provisionalHeaders = new RawHeaders(initializer.headers); + this._request = Request2.from(this._initializer.request); + Object.assign(this._request._timing, this._initializer.timing); + } + static from(response2) { + return response2._object; + } + static fromNullable(response2) { + return response2 ? Response2.from(response2) : null; + } + url() { + return this._initializer.url; + } + ok() { + return this._initializer.status === 0 || this._initializer.status >= 200 && this._initializer.status <= 299; + } + status() { + return this._initializer.status; + } + statusText() { + return this._initializer.statusText; + } + fromServiceWorker() { + return this._initializer.fromServiceWorker; + } + /** + * @deprecated + */ + headers() { + return this._provisionalHeaders.headers(); + } + async _actualHeaders() { + if (!this._actualHeadersPromise) { + this._actualHeadersPromise = (async () => { + return new RawHeaders((await this._channel.rawResponseHeaders()).headers); + })(); + } + return await this._actualHeadersPromise; + } + async allHeaders() { + return (await this._actualHeaders()).headers(); + } + async headersArray() { + return (await this._actualHeaders()).headersArray().slice(); + } + async headerValue(name) { + return (await this._actualHeaders()).get(name); + } + async headerValues(name) { + return (await this._actualHeaders()).getAll(name); + } + async finished() { + return await this.request()._targetClosedScope().race(this._finishedPromise); + } + async body() { + return (await this._channel.body()).binary; + } + async text() { + const content = await this.body(); + return content.toString("utf8"); + } + async json() { + const content = await this.text(); + return JSON.parse(content); + } + request() { + return this._request; + } + frame() { + return this._request.frame(); + } + async serverAddr() { + return (await this._channel.serverAddr()).value || null; + } + async securityDetails() { + return (await this._channel.securityDetails()).value || null; + } +} +class WebSocket extends ChannelOwner { + static from(webSocket) { + return webSocket._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._isClosed = false; + this._page = parent; + this._channel.on("frameSent", (event) => { + if (event.opcode === 1) + this.emit(Events.WebSocket.FrameSent, { payload: event.data }); + else if (event.opcode === 2) + this.emit(Events.WebSocket.FrameSent, { payload: Buffer.from(event.data, "base64") }); + }); + this._channel.on("frameReceived", (event) => { + if (event.opcode === 1) + this.emit(Events.WebSocket.FrameReceived, { payload: event.data }); + else if (event.opcode === 2) + this.emit(Events.WebSocket.FrameReceived, { payload: Buffer.from(event.data, "base64") }); + }); + this._channel.on("socketError", ({ error: error2 }) => this.emit(Events.WebSocket.Error, error2)); + this._channel.on("close", () => { + this._isClosed = true; + this.emit(Events.WebSocket.Close, this); + }); + } + url() { + return this._initializer.url; + } + isClosed() { + return this._isClosed; + } + async waitForEvent(event, optionsOrPredicate = {}) { + return await this._wrapApiCall(async () => { + const timeout = this._page._timeoutSettings.timeout(typeof optionsOrPredicate === "function" ? {} : optionsOrPredicate); + const predicate = typeof optionsOrPredicate === "function" ? optionsOrPredicate : optionsOrPredicate.predicate; + const waiter = Waiter.createForEvent(this, event); + waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded while waiting for event "${event}"`); + if (event !== Events.WebSocket.Error) + waiter.rejectOnEvent(this, Events.WebSocket.Error, new Error("Socket error")); + if (event !== Events.WebSocket.Close) + waiter.rejectOnEvent(this, Events.WebSocket.Close, new Error("Socket closed")); + waiter.rejectOnEvent(this._page, Events.Page.Close, () => this._page._closeErrorWithReason()); + const result = await waiter.waitForEvent(this, event, predicate); + waiter.dispose(); + return result; + }); + } +} +function validateHeaders(headers) { + for (const key2 of Object.keys(headers)) { + const value = headers[key2]; + if (!Object.is(value, void 0) && !isString(value)) + throw new Error(`Expected value of header "${key2}" to be String, but "${typeof value}" is found.`); + } +} +class RouteHandler { + constructor(platform, baseURL, url2, handler, times = Number.MAX_SAFE_INTEGER) { + this.handledCount = 0; + this._ignoreException = false; + this._activeInvocations = /* @__PURE__ */ new Set(); + this._baseURL = baseURL; + this._times = times; + this.url = url2; + this.handler = handler; + this._savedZone = platform.zones.current().pop(); + } + static prepareInterceptionPatterns(handlers) { + const patterns = []; + let all = false; + for (const handler of handlers) { + if (isString(handler.url)) + patterns.push({ glob: handler.url }); + else if (isRegExp$4(handler.url)) + patterns.push({ regexSource: handler.url.source, regexFlags: handler.url.flags }); + else + all = true; + } + if (all) + return [{ glob: "**/*" }]; + return patterns; + } + matches(requestURL) { + return urlMatches(this._baseURL, requestURL, this.url); + } + async handle(route) { + return await this._savedZone.run(async () => this._handleImpl(route)); + } + async _handleImpl(route) { + const handlerInvocation = { complete: new ManualPromise(), route }; + this._activeInvocations.add(handlerInvocation); + try { + return await this._handleInternal(route); + } catch (e) { + if (this._ignoreException) + return false; + if (isTargetClosedError(e)) { + rewriteErrorMessage(e, `"${e.message}" while running route callback. +Consider awaiting \`await page.unrouteAll({ behavior: 'ignoreErrors' })\` +before the end of the test to ignore remaining routes in flight.`); + } + throw e; + } finally { + handlerInvocation.complete.resolve(); + this._activeInvocations.delete(handlerInvocation); + } + } + async stop(behavior) { + if (behavior === "ignoreErrors") { + this._ignoreException = true; + } else { + const promises2 = []; + for (const activation of this._activeInvocations) { + if (!activation.route._didThrow) + promises2.push(activation.complete); + } + await Promise.all(promises2); + } + } + async _handleInternal(route) { + ++this.handledCount; + const handledPromise = route._startHandling(); + const handler = this.handler; + const [handled] = await Promise.all([ + handledPromise, + handler(route, route.request()) + ]); + return handled; + } + willExpire() { + return this.handledCount + 1 >= this._times; + } +} +class RawHeaders { + constructor(headers) { + this._headersMap = new MultiMap(); + this._headersArray = headers; + for (const header of headers) + this._headersMap.set(header.name.toLowerCase(), header.value); + } + static _fromHeadersObjectLossy(headers) { + const headersArray = Object.entries(headers).map(([name, value]) => ({ + name, + value + })).filter((header) => header.value !== void 0); + return new RawHeaders(headersArray); + } + get(name) { + const values = this.getAll(name); + if (!values || !values.length) + return null; + return values.join(name.toLowerCase() === "set-cookie" ? "\n" : ", "); + } + getAll(name) { + return [...this._headersMap.get(name.toLowerCase())]; + } + headers() { + const result = {}; + for (const name of this._headersMap.keys()) + result[name] = this.get(name); + return result; + } + headersArray() { + return this._headersArray; + } +} +const kLifecycleEvents = /* @__PURE__ */ new Set(["load", "domcontentloaded", "networkidle", "commit"]); +class Frame extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._parentFrame = null; + this._url = ""; + this._name = ""; + this._detached = false; + this._childFrames = /* @__PURE__ */ new Set(); + this._eventEmitter = new EventEmitter(parent._platform); + this._eventEmitter.setMaxListeners(0); + this._parentFrame = Frame.fromNullable(initializer.parentFrame); + if (this._parentFrame) + this._parentFrame._childFrames.add(this); + this._name = initializer.name; + this._url = initializer.url; + this._loadStates = new Set(initializer.loadStates); + this._channel.on("loadstate", (event) => { + if (event.add) { + this._loadStates.add(event.add); + this._eventEmitter.emit("loadstate", event.add); + } + if (event.remove) + this._loadStates.delete(event.remove); + if (!this._parentFrame && event.add === "load" && this._page) + this._page.emit(Events.Page.Load, this._page); + if (!this._parentFrame && event.add === "domcontentloaded" && this._page) + this._page.emit(Events.Page.DOMContentLoaded, this._page); + }); + this._channel.on("navigated", (event) => { + this._url = event.url; + this._name = event.name; + this._eventEmitter.emit("navigated", event); + if (!event.error && this._page) + this._page.emit(Events.Page.FrameNavigated, this); + }); + } + static from(frame) { + return frame._object; + } + static fromNullable(frame) { + return frame ? Frame.from(frame) : null; + } + page() { + return this._page; + } + _timeout(options2) { + var _a2; + const timeoutSettings = ((_a2 = this._page) == null ? void 0 : _a2._timeoutSettings) || new TimeoutSettings(this._platform); + return timeoutSettings.timeout(options2 || {}); + } + _navigationTimeout(options2) { + var _a2; + const timeoutSettings = ((_a2 = this._page) == null ? void 0 : _a2._timeoutSettings) || new TimeoutSettings(this._platform); + return timeoutSettings.navigationTimeout(options2 || {}); + } + async goto(url2, options2 = {}) { + const waitUntil = verifyLoadState("waitUntil", options2.waitUntil === void 0 ? "load" : options2.waitUntil); + return Response2.fromNullable((await this._channel.goto({ url: url2, ...options2, waitUntil, timeout: this._navigationTimeout(options2) })).response); + } + _setupNavigationWaiter(options2) { + const waiter = new Waiter(this._page, ""); + if (this._page.isClosed()) + waiter.rejectImmediately(this._page._closeErrorWithReason()); + waiter.rejectOnEvent(this._page, Events.Page.Close, () => this._page._closeErrorWithReason()); + waiter.rejectOnEvent(this._page, Events.Page.Crash, new Error("Navigation failed because page crashed!")); + waiter.rejectOnEvent(this._page, Events.Page.FrameDetached, new Error("Navigating frame was detached!"), (frame) => frame === this); + const timeout = this._page._timeoutSettings.navigationTimeout(options2); + waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded.`); + return waiter; + } + async waitForNavigation(options2 = {}) { + return await this._page._wrapApiCall(async () => { + const waitUntil = verifyLoadState("waitUntil", options2.waitUntil === void 0 ? "load" : options2.waitUntil); + const waiter = this._setupNavigationWaiter(options2); + const toUrl = typeof options2.url === "string" ? ` to "${options2.url}"` : ""; + waiter.log(`waiting for navigation${toUrl} until "${waitUntil}"`); + const navigatedEvent = await waiter.waitForEvent(this._eventEmitter, "navigated", (event) => { + var _a2; + if (event.error) + return true; + waiter.log(` navigated to "${event.url}"`); + return urlMatches((_a2 = this._page) == null ? void 0 : _a2.context()._options.baseURL, event.url, options2.url); + }); + if (navigatedEvent.error) { + const e = new Error(navigatedEvent.error); + e.stack = ""; + await waiter.waitForPromise(Promise.reject(e)); + } + if (!this._loadStates.has(waitUntil)) { + await waiter.waitForEvent(this._eventEmitter, "loadstate", (s) => { + waiter.log(` "${s}" event fired`); + return s === waitUntil; + }); + } + const request2 = navigatedEvent.newDocument ? Request2.fromNullable(navigatedEvent.newDocument.request) : null; + const response2 = request2 ? await waiter.waitForPromise(request2._finalRequest()._internalResponse()) : null; + waiter.dispose(); + return response2; + }, { title: "Wait for navigation" }); + } + async waitForLoadState(state2 = "load", options2 = {}) { + state2 = verifyLoadState("state", state2); + return await this._page._wrapApiCall(async () => { + const waiter = this._setupNavigationWaiter(options2); + if (this._loadStates.has(state2)) { + waiter.log(` not waiting, "${state2}" event already fired`); + } else { + await waiter.waitForEvent(this._eventEmitter, "loadstate", (s) => { + waiter.log(` "${s}" event fired`); + return s === state2; + }); + } + waiter.dispose(); + }, { title: `Wait for load state "${state2}"` }); + } + async waitForURL(url2, options2 = {}) { + var _a2; + if (urlMatches((_a2 = this._page) == null ? void 0 : _a2.context()._options.baseURL, this.url(), url2)) + return await this.waitForLoadState(options2.waitUntil, options2); + await this.waitForNavigation({ url: url2, ...options2 }); + } + async frameElement() { + return ElementHandle2.from((await this._channel.frameElement()).element); + } + async evaluateHandle(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + const result = await this._channel.evaluateExpressionHandle({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return JSHandle2.from(result.handle); + } + async evaluate(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + const result = await this._channel.evaluateExpression({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async _evaluateExposeUtilityScript(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + const result = await this._channel.evaluateExpression({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async $(selector, options2) { + const result = await this._channel.querySelector({ selector, ...options2 }); + return ElementHandle2.fromNullable(result.element); + } + async waitForSelector(selector, options2 = {}) { + if (options2.visibility) + throw new Error("options.visibility is not supported, did you mean options.state?"); + if (options2.waitFor && options2.waitFor !== "visible") + throw new Error("options.waitFor is not supported, did you mean options.state?"); + const result = await this._channel.waitForSelector({ selector, ...options2, timeout: this._timeout(options2) }); + return ElementHandle2.fromNullable(result.element); + } + async dispatchEvent(selector, type2, eventInit, options2 = {}) { + await this._channel.dispatchEvent({ selector, type: type2, eventInit: serializeArgument(eventInit), ...options2, timeout: this._timeout(options2) }); + } + async $eval(selector, pageFunction, arg) { + assertMaxArguments(arguments.length, 3); + const result = await this._channel.evalOnSelector({ selector, expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async $$eval(selector, pageFunction, arg) { + assertMaxArguments(arguments.length, 3); + const result = await this._channel.evalOnSelectorAll({ selector, expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async $$(selector) { + const result = await this._channel.querySelectorAll({ selector }); + return result.elements.map((e) => ElementHandle2.from(e)); + } + async _queryCount(selector) { + return (await this._channel.queryCount({ selector })).value; + } + async content() { + return (await this._channel.content()).value; + } + async setContent(html, options2 = {}) { + const waitUntil = verifyLoadState("waitUntil", options2.waitUntil === void 0 ? "load" : options2.waitUntil); + await this._channel.setContent({ html, ...options2, waitUntil, timeout: this._navigationTimeout(options2) }); + } + name() { + return this._name || ""; + } + url() { + return this._url; + } + parentFrame() { + return this._parentFrame; + } + childFrames() { + return Array.from(this._childFrames); + } + isDetached() { + return this._detached; + } + async addScriptTag(options2 = {}) { + const copy = { ...options2 }; + if (copy.path) { + copy.content = (await this._platform.fs().promises.readFile(copy.path)).toString(); + copy.content = addSourceUrlToScript(copy.content, copy.path); + } + return ElementHandle2.from((await this._channel.addScriptTag({ ...copy })).element); + } + async addStyleTag(options2 = {}) { + const copy = { ...options2 }; + if (copy.path) { + copy.content = (await this._platform.fs().promises.readFile(copy.path)).toString(); + copy.content += "/*# sourceURL=" + copy.path.replace(/\n/g, "") + "*/"; + } + return ElementHandle2.from((await this._channel.addStyleTag({ ...copy })).element); + } + async click(selector, options2 = {}) { + return await this._channel.click({ selector, ...options2, timeout: this._timeout(options2) }); + } + async dblclick(selector, options2 = {}) { + return await this._channel.dblclick({ selector, ...options2, timeout: this._timeout(options2) }); + } + async dragAndDrop(source2, target, options2 = {}) { + return await this._channel.dragAndDrop({ source: source2, target, ...options2, timeout: this._timeout(options2) }); + } + async tap(selector, options2 = {}) { + return await this._channel.tap({ selector, ...options2, timeout: this._timeout(options2) }); + } + async fill(selector, value, options2 = {}) { + return await this._channel.fill({ selector, value, ...options2, timeout: this._timeout(options2) }); + } + async _highlight(selector) { + return await this._channel.highlight({ selector }); + } + locator(selector, options2) { + return new Locator(this, selector, options2); + } + getByTestId(testId) { + return this.locator(getByTestIdSelector(testIdAttributeName(), testId)); + } + getByAltText(text, options2) { + return this.locator(getByAltTextSelector(text, options2)); + } + getByLabel(text, options2) { + return this.locator(getByLabelSelector(text, options2)); + } + getByPlaceholder(text, options2) { + return this.locator(getByPlaceholderSelector(text, options2)); + } + getByText(text, options2) { + return this.locator(getByTextSelector(text, options2)); + } + getByTitle(text, options2) { + return this.locator(getByTitleSelector(text, options2)); + } + getByRole(role, options2 = {}) { + return this.locator(getByRoleSelector(role, options2)); + } + frameLocator(selector) { + return new FrameLocator(this, selector); + } + async focus(selector, options2 = {}) { + await this._channel.focus({ selector, ...options2, timeout: this._timeout(options2) }); + } + async textContent(selector, options2 = {}) { + const value = (await this._channel.textContent({ selector, ...options2, timeout: this._timeout(options2) })).value; + return value === void 0 ? null : value; + } + async innerText(selector, options2 = {}) { + return (await this._channel.innerText({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async innerHTML(selector, options2 = {}) { + return (await this._channel.innerHTML({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async getAttribute(selector, name, options2 = {}) { + const value = (await this._channel.getAttribute({ selector, name, ...options2, timeout: this._timeout(options2) })).value; + return value === void 0 ? null : value; + } + async inputValue(selector, options2 = {}) { + return (await this._channel.inputValue({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async isChecked(selector, options2 = {}) { + return (await this._channel.isChecked({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async isDisabled(selector, options2 = {}) { + return (await this._channel.isDisabled({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async isEditable(selector, options2 = {}) { + return (await this._channel.isEditable({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async isEnabled(selector, options2 = {}) { + return (await this._channel.isEnabled({ selector, ...options2, timeout: this._timeout(options2) })).value; + } + async isHidden(selector, options2 = {}) { + return (await this._channel.isHidden({ selector, ...options2 })).value; + } + async isVisible(selector, options2 = {}) { + return (await this._channel.isVisible({ selector, ...options2 })).value; + } + async hover(selector, options2 = {}) { + await this._channel.hover({ selector, ...options2, timeout: this._timeout(options2) }); + } + async selectOption(selector, values, options2 = {}) { + return (await this._channel.selectOption({ selector, ...convertSelectOptionValues(values), ...options2, timeout: this._timeout(options2) })).values; + } + async setInputFiles(selector, files, options2 = {}) { + const converted = await convertInputFiles(this._platform, files, this.page().context()); + await this._channel.setInputFiles({ selector, ...converted, ...options2, timeout: this._timeout(options2) }); + } + async type(selector, text, options2 = {}) { + await this._channel.type({ selector, text, ...options2, timeout: this._timeout(options2) }); + } + async press(selector, key2, options2 = {}) { + await this._channel.press({ selector, key: key2, ...options2, timeout: this._timeout(options2) }); + } + async check(selector, options2 = {}) { + await this._channel.check({ selector, ...options2, timeout: this._timeout(options2) }); + } + async uncheck(selector, options2 = {}) { + await this._channel.uncheck({ selector, ...options2, timeout: this._timeout(options2) }); + } + async setChecked(selector, checked, options2) { + if (checked) + await this.check(selector, options2); + else + await this.uncheck(selector, options2); + } + async waitForTimeout(timeout) { + await this._channel.waitForTimeout({ timeout }); + } + async waitForFunction(pageFunction, arg, options2 = {}) { + if (typeof options2.polling === "string") + assert(options2.polling === "raf", "Unknown polling option: " + options2.polling); + const result = await this._channel.waitForFunction({ + ...options2, + pollingInterval: options2.polling === "raf" ? void 0 : options2.polling, + expression: String(pageFunction), + isFunction: typeof pageFunction === "function", + arg: serializeArgument(arg), + timeout: this._timeout(options2) + }); + return JSHandle2.from(result.handle); + } + async title() { + return (await this._channel.title()).value; + } +} +function verifyLoadState(name, waitUntil) { + if (waitUntil === "networkidle0") + waitUntil = "networkidle"; + if (!kLifecycleEvents.has(waitUntil)) + throw new Error(`${name}: expected one of (load|domcontentloaded|networkidle|commit)`); + return waitUntil; +} +let WritableStream$1 = class WritableStream2 extends ChannelOwner { + static from(Stream2) { + return Stream2._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + } + stream() { + return this._platform.streamWritable(this._channel); + } +}; +class ElementHandle2 extends JSHandle2 { + static from(handle) { + return handle._object; + } + static fromNullable(handle) { + return handle ? ElementHandle2.from(handle) : null; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._frame = parent; + this._elementChannel = this._channel; + } + asElement() { + return this; + } + async ownerFrame() { + return Frame.fromNullable((await this._elementChannel.ownerFrame()).frame); + } + async contentFrame() { + return Frame.fromNullable((await this._elementChannel.contentFrame()).frame); + } + async _generateLocatorString() { + const value = (await this._elementChannel.generateLocatorString()).value; + return value === void 0 ? null : value; + } + async getAttribute(name) { + const value = (await this._elementChannel.getAttribute({ name })).value; + return value === void 0 ? null : value; + } + async inputValue() { + return (await this._elementChannel.inputValue()).value; + } + async textContent() { + const value = (await this._elementChannel.textContent()).value; + return value === void 0 ? null : value; + } + async innerText() { + return (await this._elementChannel.innerText()).value; + } + async innerHTML() { + return (await this._elementChannel.innerHTML()).value; + } + async isChecked() { + return (await this._elementChannel.isChecked()).value; + } + async isDisabled() { + return (await this._elementChannel.isDisabled()).value; + } + async isEditable() { + return (await this._elementChannel.isEditable()).value; + } + async isEnabled() { + return (await this._elementChannel.isEnabled()).value; + } + async isHidden() { + return (await this._elementChannel.isHidden()).value; + } + async isVisible() { + return (await this._elementChannel.isVisible()).value; + } + async dispatchEvent(type2, eventInit = {}) { + await this._elementChannel.dispatchEvent({ type: type2, eventInit: serializeArgument(eventInit) }); + } + async scrollIntoViewIfNeeded(options2 = {}) { + await this._elementChannel.scrollIntoViewIfNeeded({ ...options2, timeout: this._frame._timeout(options2) }); + } + async hover(options2 = {}) { + await this._elementChannel.hover({ ...options2, timeout: this._frame._timeout(options2) }); + } + async click(options2 = {}) { + return await this._elementChannel.click({ ...options2, timeout: this._frame._timeout(options2) }); + } + async dblclick(options2 = {}) { + return await this._elementChannel.dblclick({ ...options2, timeout: this._frame._timeout(options2) }); + } + async tap(options2 = {}) { + return await this._elementChannel.tap({ ...options2, timeout: this._frame._timeout(options2) }); + } + async selectOption(values, options2 = {}) { + const result = await this._elementChannel.selectOption({ ...convertSelectOptionValues(values), ...options2, timeout: this._frame._timeout(options2) }); + return result.values; + } + async fill(value, options2 = {}) { + return await this._elementChannel.fill({ value, ...options2, timeout: this._frame._timeout(options2) }); + } + async selectText(options2 = {}) { + await this._elementChannel.selectText({ ...options2, timeout: this._frame._timeout(options2) }); + } + async setInputFiles(files, options2 = {}) { + const frame = await this.ownerFrame(); + if (!frame) + throw new Error("Cannot set input files to detached element"); + const converted = await convertInputFiles(this._platform, files, frame.page().context()); + await this._elementChannel.setInputFiles({ ...converted, ...options2, timeout: this._frame._timeout(options2) }); + } + async focus() { + await this._elementChannel.focus(); + } + async type(text, options2 = {}) { + await this._elementChannel.type({ text, ...options2, timeout: this._frame._timeout(options2) }); + } + async press(key2, options2 = {}) { + await this._elementChannel.press({ key: key2, ...options2, timeout: this._frame._timeout(options2) }); + } + async check(options2 = {}) { + return await this._elementChannel.check({ ...options2, timeout: this._frame._timeout(options2) }); + } + async uncheck(options2 = {}) { + return await this._elementChannel.uncheck({ ...options2, timeout: this._frame._timeout(options2) }); + } + async setChecked(checked, options2) { + if (checked) + await this.check(options2); + else + await this.uncheck(options2); + } + async boundingBox() { + const value = (await this._elementChannel.boundingBox()).value; + return value === void 0 ? null : value; + } + async screenshot(options2 = {}) { + const mask = options2.mask; + const copy = { ...options2, mask: void 0, timeout: this._frame._timeout(options2) }; + if (!copy.type) + copy.type = determineScreenshotType(options2); + if (mask) { + copy.mask = mask.map((locator) => ({ + frame: locator._frame._channel, + selector: locator._selector + })); + } + const result = await this._elementChannel.screenshot(copy); + if (options2.path) { + await mkdirIfNeeded(this._platform, options2.path); + await this._platform.fs().promises.writeFile(options2.path, result.binary); + } + return result.binary; + } + async $(selector) { + return ElementHandle2.fromNullable((await this._elementChannel.querySelector({ selector })).element); + } + async $$(selector) { + const result = await this._elementChannel.querySelectorAll({ selector }); + return result.elements.map((h) => ElementHandle2.from(h)); + } + async $eval(selector, pageFunction, arg) { + const result = await this._elementChannel.evalOnSelector({ selector, expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async $$eval(selector, pageFunction, arg) { + const result = await this._elementChannel.evalOnSelectorAll({ selector, expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async waitForElementState(state2, options2 = {}) { + return await this._elementChannel.waitForElementState({ state: state2, ...options2, timeout: this._frame._timeout(options2) }); + } + async waitForSelector(selector, options2 = {}) { + const result = await this._elementChannel.waitForSelector({ selector, ...options2, timeout: this._frame._timeout(options2) }); + return ElementHandle2.fromNullable(result.element); + } +} +function convertSelectOptionValues(values) { + if (values === null) + return {}; + if (!Array.isArray(values)) + values = [values]; + if (!values.length) + return {}; + for (let i = 0; i < values.length; i++) + assert(values[i] !== null, `options[${i}]: expected object, got null`); + if (values[0] instanceof ElementHandle2) + return { elements: values.map((v) => v._elementChannel) }; + if (isString(values[0])) + return { options: values.map((valueOrLabel) => ({ valueOrLabel })) }; + return { options: values }; +} +function filePayloadExceedsSizeLimit(payloads) { + return payloads.reduce((size, item) => size + (item.buffer ? item.buffer.byteLength : 0), 0) >= fileUploadSizeLimit; +} +async function resolvePathsAndDirectoryForInputFiles(platform, items) { + let localPaths; + let localDirectory; + for (const item of items) { + const stat2 = await platform.fs().promises.stat(item); + if (stat2.isDirectory()) { + if (localDirectory) + throw new Error("Multiple directories are not supported"); + localDirectory = platform.path().resolve(item); + } else { + localPaths ?? (localPaths = []); + localPaths.push(platform.path().resolve(item)); + } + } + if ((localPaths == null ? void 0 : localPaths.length) && localDirectory) + throw new Error("File paths must be all files or a single directory"); + return [localPaths, localDirectory]; +} +async function convertInputFiles(platform, files, context) { + const items = Array.isArray(files) ? files.slice() : [files]; + if (items.some((item) => typeof item === "string")) { + if (!items.every((item) => typeof item === "string")) + throw new Error("File paths cannot be mixed with buffers"); + const [localPaths, localDirectory] = await resolvePathsAndDirectoryForInputFiles(platform, items); + if (context._connection.isRemote()) { + const files2 = localDirectory ? (await platform.fs().promises.readdir(localDirectory, { withFileTypes: true, recursive: true })).filter((f) => f.isFile()).map((f) => platform.path().join(f.path, f.name)) : localPaths; + const { writableStreams, rootDir } = await context._wrapApiCall(async () => context._channel.createTempFiles({ + rootDirName: localDirectory ? platform.path().basename(localDirectory) : void 0, + items: await Promise.all(files2.map(async (file) => { + const lastModifiedMs = (await platform.fs().promises.stat(file)).mtimeMs; + return { + name: localDirectory ? platform.path().relative(localDirectory, file) : platform.path().basename(file), + lastModifiedMs + }; + })) + }), { internal: true }); + for (let i = 0; i < files2.length; i++) { + const writable2 = WritableStream$1.from(writableStreams[i]); + await platform.streamFile(files2[i], writable2.stream()); + } + return { + directoryStream: rootDir, + streams: localDirectory ? void 0 : writableStreams + }; + } + return { + localPaths, + localDirectory + }; + } + const payloads = items; + if (filePayloadExceedsSizeLimit(payloads)) + throw new Error("Cannot set buffer larger than 50Mb, please write it to a file and pass its path instead."); + return { payloads }; +} +function determineScreenshotType(options2) { + if (options2.path) { + const mimeType = getMimeTypeForPath(options2.path); + if (mimeType === "image/png") + return "png"; + else if (mimeType === "image/jpeg") + return "jpeg"; + throw new Error(`path: unsupported mime type "${mimeType}"`); + } + return options2.type; +} +class FileChooser2 { + constructor(page, elementHandle, isMultiple) { + this._page = page; + this._elementHandle = elementHandle; + this._isMultiple = isMultiple; + } + element() { + return this._elementHandle; + } + isMultiple() { + return this._isMultiple; + } + page() { + return this._page; + } + async setFiles(files, options2) { + return await this._elementHandle.setInputFiles(files, options2); + } +} +class HarRouter { + static async create(localUtils, file, notFoundAction, options2) { + const { harId, error: error2 } = await localUtils.harOpen({ file }); + if (error2) + throw new Error(error2); + return new HarRouter(localUtils, harId, notFoundAction, options2); + } + constructor(localUtils, harId, notFoundAction, options2) { + this._localUtils = localUtils; + this._harId = harId; + this._options = options2; + this._notFoundAction = notFoundAction; + } + async _handle(route) { + const request2 = route.request(); + const response2 = await this._localUtils.harLookup({ + harId: this._harId, + url: request2.url(), + method: request2.method(), + headers: await request2.headersArray(), + postData: request2.postDataBuffer() || void 0, + isNavigationRequest: request2.isNavigationRequest() + }); + if (response2.action === "redirect") { + route._platform.log("api", `HAR: ${route.request().url()} redirected to ${response2.redirectURL}`); + await route._redirectNavigationRequest(response2.redirectURL); + return; + } + if (response2.action === "fulfill") { + if (response2.status === -1) + return; + await route.fulfill({ + status: response2.status, + headers: Object.fromEntries(response2.headers.map((h) => [h.name, h.value])), + body: response2.body + }); + return; + } + if (response2.action === "error") + route._platform.log("api", "HAR: " + response2.message); + if (this._notFoundAction === "abort") { + await route.abort(); + return; + } + await route.fallback(); + } + async addContextRoute(context) { + await context.route(this._options.urlMatch || "**/*", (route) => this._handle(route)); + } + async addPageRoute(page) { + await page.route(this._options.urlMatch || "**/*", (route) => this._handle(route)); + } + async [Symbol.asyncDispose]() { + await this.dispose(); + } + dispose() { + this._localUtils.harClose({ harId: this._harId }).catch(() => { + }); + } +} +class Keyboard2 { + constructor(page) { + this._page = page; + } + async down(key2) { + await this._page._channel.keyboardDown({ key: key2 }); + } + async up(key2) { + await this._page._channel.keyboardUp({ key: key2 }); + } + async insertText(text) { + await this._page._channel.keyboardInsertText({ text }); + } + async type(text, options2 = {}) { + await this._page._channel.keyboardType({ text, ...options2 }); + } + async press(key2, options2 = {}) { + await this._page._channel.keyboardPress({ key: key2, ...options2 }); + } +} +class Mouse2 { + constructor(page) { + this._page = page; + } + async move(x, y, options2 = {}) { + await this._page._channel.mouseMove({ x, y, ...options2 }); + } + async down(options2 = {}) { + await this._page._channel.mouseDown({ ...options2 }); + } + async up(options2 = {}) { + await this._page._channel.mouseUp(options2); + } + async click(x, y, options2 = {}) { + await this._page._channel.mouseClick({ x, y, ...options2 }); + } + async dblclick(x, y, options2 = {}) { + await this._page._wrapApiCall(async () => { + await this.click(x, y, { ...options2, clickCount: 2 }); + }, { title: "Double click" }); + } + async wheel(deltaX, deltaY) { + await this._page._channel.mouseWheel({ deltaX, deltaY }); + } +} +class Touchscreen2 { + constructor(page) { + this._page = page; + } + async tap(x, y) { + await this._page._channel.touchscreenTap({ x, y }); + } +} +class Video { + constructor(page, connection) { + this._artifact = null; + this._artifactReadyPromise = new ManualPromise(); + this._isRemote = false; + this._isRemote = connection.isRemote(); + this._artifact = page._closedOrCrashedScope.safeRace(this._artifactReadyPromise); + } + _artifactReady(artifact) { + this._artifactReadyPromise.resolve(artifact); + } + async path() { + if (this._isRemote) + throw new Error(`Path is not available when connecting remotely. Use saveAs() to save a local copy.`); + const artifact = await this._artifact; + if (!artifact) + throw new Error("Page did not produce any video frames"); + return artifact._initializer.absolutePath; + } + async saveAs(path2) { + const artifact = await this._artifact; + if (!artifact) + throw new Error("Page did not produce any video frames"); + return await artifact.saveAs(path2); + } + async delete() { + const artifact = await this._artifact; + if (artifact) + await artifact.delete(); + } +} +class Page extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._frames = /* @__PURE__ */ new Set(); + this._workers = /* @__PURE__ */ new Set(); + this._closed = false; + this._closedOrCrashedScope = new LongStandingScope(); + this._routes = []; + this._webSocketRoutes = []; + this._bindings = /* @__PURE__ */ new Map(); + this._video = null; + this._closeWasCalled = false; + this._harRouters = []; + this._locatorHandlers = /* @__PURE__ */ new Map(); + this._browserContext = parent; + this._timeoutSettings = new TimeoutSettings(this._platform, this._browserContext._timeoutSettings); + this.accessibility = new Accessibility2(this._channel); + this.keyboard = new Keyboard2(this); + this.mouse = new Mouse2(this); + this.request = this._browserContext.request; + this.touchscreen = new Touchscreen2(this); + this.clock = this._browserContext.clock; + this._mainFrame = Frame.from(initializer.mainFrame); + this._mainFrame._page = this; + this._frames.add(this._mainFrame); + this._viewportSize = initializer.viewportSize; + this._closed = initializer.isClosed; + this._opener = Page.fromNullable(initializer.opener); + this._channel.on("bindingCall", ({ binding: binding2 }) => this._onBinding(BindingCall.from(binding2))); + this._channel.on("close", () => this._onClose()); + this._channel.on("crash", () => this._onCrash()); + this._channel.on("download", ({ url: url2, suggestedFilename, artifact }) => { + const artifactObject = Artifact2.from(artifact); + this.emit(Events.Page.Download, new Download2(this, url2, suggestedFilename, artifactObject)); + }); + this._channel.on("fileChooser", ({ element, isMultiple }) => this.emit(Events.Page.FileChooser, new FileChooser2(this, ElementHandle2.from(element), isMultiple))); + this._channel.on("frameAttached", ({ frame }) => this._onFrameAttached(Frame.from(frame))); + this._channel.on("frameDetached", ({ frame }) => this._onFrameDetached(Frame.from(frame))); + this._channel.on("locatorHandlerTriggered", ({ uid }) => this._onLocatorHandlerTriggered(uid)); + this._channel.on("route", ({ route }) => this._onRoute(Route2.from(route))); + this._channel.on("webSocketRoute", ({ webSocketRoute }) => this._onWebSocketRoute(WebSocketRoute.from(webSocketRoute))); + this._channel.on("video", ({ artifact }) => { + const artifactObject = Artifact2.from(artifact); + this._forceVideo()._artifactReady(artifactObject); + }); + this._channel.on("viewportSizeChanged", ({ viewportSize }) => this._viewportSize = viewportSize); + this._channel.on("webSocket", ({ webSocket }) => this.emit(Events.Page.WebSocket, WebSocket.from(webSocket))); + this._channel.on("worker", ({ worker }) => this._onWorker(Worker.from(worker))); + this.coverage = new Coverage(this._channel); + this.once(Events.Page.Close, () => this._closedOrCrashedScope.close(this._closeErrorWithReason())); + this.once(Events.Page.Crash, () => this._closedOrCrashedScope.close(new TargetClosedError2())); + this._setEventToSubscriptionMapping(/* @__PURE__ */ new Map([ + [Events.Page.Console, "console"], + [Events.Page.Dialog, "dialog"], + [Events.Page.Request, "request"], + [Events.Page.Response, "response"], + [Events.Page.RequestFinished, "requestFinished"], + [Events.Page.RequestFailed, "requestFailed"], + [Events.Page.FileChooser, "fileChooser"] + ])); + } + static from(page) { + return page._object; + } + static fromNullable(page) { + return page ? Page.from(page) : null; + } + _onFrameAttached(frame) { + frame._page = this; + this._frames.add(frame); + if (frame._parentFrame) + frame._parentFrame._childFrames.add(frame); + this.emit(Events.Page.FrameAttached, frame); + } + _onFrameDetached(frame) { + this._frames.delete(frame); + frame._detached = true; + if (frame._parentFrame) + frame._parentFrame._childFrames.delete(frame); + this.emit(Events.Page.FrameDetached, frame); + } + async _onRoute(route) { + route._context = this.context(); + const routeHandlers = this._routes.slice(); + for (const routeHandler of routeHandlers) { + if (this._closeWasCalled || this._browserContext._closingStatus !== "none") + return; + if (!routeHandler.matches(route.request().url())) + continue; + const index2 = this._routes.indexOf(routeHandler); + if (index2 === -1) + continue; + if (routeHandler.willExpire()) + this._routes.splice(index2, 1); + const handled = await routeHandler.handle(route); + if (!this._routes.length) + this._wrapApiCall(() => this._updateInterceptionPatterns(), { internal: true }).catch(() => { + }); + if (handled) + return; + } + await this._browserContext._onRoute(route); + } + async _onWebSocketRoute(webSocketRoute) { + const routeHandler = this._webSocketRoutes.find((route) => route.matches(webSocketRoute.url())); + if (routeHandler) + await routeHandler.handle(webSocketRoute); + else + await this._browserContext._onWebSocketRoute(webSocketRoute); + } + async _onBinding(bindingCall) { + const func = this._bindings.get(bindingCall._initializer.name); + if (func) { + await bindingCall.call(func); + return; + } + await this._browserContext._onBinding(bindingCall); + } + _onWorker(worker) { + this._workers.add(worker); + worker._page = this; + this.emit(Events.Page.Worker, worker); + } + _onClose() { + this._closed = true; + this._browserContext._pages.delete(this); + this._browserContext._backgroundPages.delete(this); + this._disposeHarRouters(); + this.emit(Events.Page.Close, this); + } + _onCrash() { + this.emit(Events.Page.Crash, this); + } + context() { + return this._browserContext; + } + async opener() { + if (!this._opener || this._opener.isClosed()) + return null; + return this._opener; + } + mainFrame() { + return this._mainFrame; + } + frame(frameSelector) { + const name = isString(frameSelector) ? frameSelector : frameSelector.name; + const url2 = isObject(frameSelector) ? frameSelector.url : void 0; + assert(name || url2, "Either name or url matcher should be specified"); + return this.frames().find((f) => { + if (name) + return f.name() === name; + return urlMatches(this._browserContext._options.baseURL, f.url(), url2); + }) || null; + } + frames() { + return [...this._frames]; + } + setDefaultNavigationTimeout(timeout) { + this._timeoutSettings.setDefaultNavigationTimeout(timeout); + } + setDefaultTimeout(timeout) { + this._timeoutSettings.setDefaultTimeout(timeout); + } + _forceVideo() { + if (!this._video) + this._video = new Video(this, this._connection); + return this._video; + } + video() { + if (!this._browserContext._options.recordVideo) + return null; + return this._forceVideo(); + } + async $(selector, options2) { + return await this._mainFrame.$(selector, options2); + } + async waitForSelector(selector, options2) { + return await this._mainFrame.waitForSelector(selector, options2); + } + async dispatchEvent(selector, type2, eventInit, options2) { + return await this._mainFrame.dispatchEvent(selector, type2, eventInit, options2); + } + async evaluateHandle(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + return await this._mainFrame.evaluateHandle(pageFunction, arg); + } + async $eval(selector, pageFunction, arg) { + assertMaxArguments(arguments.length, 3); + return await this._mainFrame.$eval(selector, pageFunction, arg); + } + async $$eval(selector, pageFunction, arg) { + assertMaxArguments(arguments.length, 3); + return await this._mainFrame.$$eval(selector, pageFunction, arg); + } + async $$(selector) { + return await this._mainFrame.$$(selector); + } + async addScriptTag(options2 = {}) { + return await this._mainFrame.addScriptTag(options2); + } + async addStyleTag(options2 = {}) { + return await this._mainFrame.addStyleTag(options2); + } + async exposeFunction(name, callback) { + await this._channel.exposeBinding({ name }); + const binding2 = (source2, ...args) => callback(...args); + this._bindings.set(name, binding2); + } + async exposeBinding(name, callback, options2 = {}) { + await this._channel.exposeBinding({ name, needsHandle: options2.handle }); + this._bindings.set(name, callback); + } + async setExtraHTTPHeaders(headers) { + validateHeaders(headers); + await this._channel.setExtraHTTPHeaders({ headers: headersObjectToArray(headers) }); + } + url() { + return this._mainFrame.url(); + } + async content() { + return await this._mainFrame.content(); + } + async setContent(html, options2) { + return await this._mainFrame.setContent(html, options2); + } + async goto(url2, options2) { + return await this._mainFrame.goto(url2, options2); + } + async reload(options2 = {}) { + const waitUntil = verifyLoadState("waitUntil", options2.waitUntil === void 0 ? "load" : options2.waitUntil); + return Response2.fromNullable((await this._channel.reload({ ...options2, waitUntil, timeout: this._timeoutSettings.navigationTimeout(options2) })).response); + } + async addLocatorHandler(locator, handler, options2 = {}) { + if (locator._frame !== this._mainFrame) + throw new Error(`Locator must belong to the main frame of this page`); + if (options2.times === 0) + return; + const { uid } = await this._channel.registerLocatorHandler({ selector: locator._selector, noWaitAfter: options2.noWaitAfter }); + this._locatorHandlers.set(uid, { locator, handler, times: options2.times }); + } + async _onLocatorHandlerTriggered(uid) { + let remove = false; + try { + const handler = this._locatorHandlers.get(uid); + if (handler && handler.times !== 0) { + if (handler.times !== void 0) + handler.times--; + await handler.handler(handler.locator); + } + remove = (handler == null ? void 0 : handler.times) === 0; + } finally { + if (remove) + this._locatorHandlers.delete(uid); + this._wrapApiCall(() => this._channel.resolveLocatorHandlerNoReply({ uid, remove }), { internal: true }).catch(() => { + }); + } + } + async removeLocatorHandler(locator) { + for (const [uid, data2] of this._locatorHandlers) { + if (data2.locator._equals(locator)) { + this._locatorHandlers.delete(uid); + await this._channel.unregisterLocatorHandler({ uid }).catch(() => { + }); + } + } + } + async waitForLoadState(state2, options2) { + return await this._mainFrame.waitForLoadState(state2, options2); + } + async waitForNavigation(options2) { + return await this._mainFrame.waitForNavigation(options2); + } + async waitForURL(url2, options2) { + return await this._mainFrame.waitForURL(url2, options2); + } + async waitForRequest(urlOrPredicate, options2 = {}) { + const predicate = async (request2) => { + if (isString(urlOrPredicate) || isRegExp$4(urlOrPredicate)) + return urlMatches(this._browserContext._options.baseURL, request2.url(), urlOrPredicate); + return await urlOrPredicate(request2); + }; + const trimmedUrl = trimUrl(urlOrPredicate); + const logLine = trimmedUrl ? `waiting for request ${trimmedUrl}` : void 0; + return await this._waitForEvent(Events.Page.Request, { predicate, timeout: options2.timeout }, logLine); + } + async waitForResponse(urlOrPredicate, options2 = {}) { + const predicate = async (response2) => { + if (isString(urlOrPredicate) || isRegExp$4(urlOrPredicate)) + return urlMatches(this._browserContext._options.baseURL, response2.url(), urlOrPredicate); + return await urlOrPredicate(response2); + }; + const trimmedUrl = trimUrl(urlOrPredicate); + const logLine = trimmedUrl ? `waiting for response ${trimmedUrl}` : void 0; + return await this._waitForEvent(Events.Page.Response, { predicate, timeout: options2.timeout }, logLine); + } + async waitForEvent(event, optionsOrPredicate = {}) { + return await this._waitForEvent(event, optionsOrPredicate, `waiting for event "${event}"`); + } + _closeErrorWithReason() { + return new TargetClosedError2(this._closeReason || this._browserContext._effectiveCloseReason()); + } + async _waitForEvent(event, optionsOrPredicate, logLine) { + return await this._wrapApiCall(async () => { + const timeout = this._timeoutSettings.timeout(typeof optionsOrPredicate === "function" ? {} : optionsOrPredicate); + const predicate = typeof optionsOrPredicate === "function" ? optionsOrPredicate : optionsOrPredicate.predicate; + const waiter = Waiter.createForEvent(this, event); + if (logLine) + waiter.log(logLine); + waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded while waiting for event "${event}"`); + if (event !== Events.Page.Crash) + waiter.rejectOnEvent(this, Events.Page.Crash, new Error("Page crashed")); + if (event !== Events.Page.Close) + waiter.rejectOnEvent(this, Events.Page.Close, () => this._closeErrorWithReason()); + const result = await waiter.waitForEvent(this, event, predicate); + waiter.dispose(); + return result; + }); + } + async goBack(options2 = {}) { + const waitUntil = verifyLoadState("waitUntil", options2.waitUntil === void 0 ? "load" : options2.waitUntil); + return Response2.fromNullable((await this._channel.goBack({ ...options2, waitUntil, timeout: this._timeoutSettings.navigationTimeout(options2) })).response); + } + async goForward(options2 = {}) { + const waitUntil = verifyLoadState("waitUntil", options2.waitUntil === void 0 ? "load" : options2.waitUntil); + return Response2.fromNullable((await this._channel.goForward({ ...options2, waitUntil, timeout: this._timeoutSettings.navigationTimeout(options2) })).response); + } + async requestGC() { + await this._channel.requestGC(); + } + async emulateMedia(options2 = {}) { + await this._channel.emulateMedia({ + media: options2.media === null ? "no-override" : options2.media, + colorScheme: options2.colorScheme === null ? "no-override" : options2.colorScheme, + reducedMotion: options2.reducedMotion === null ? "no-override" : options2.reducedMotion, + forcedColors: options2.forcedColors === null ? "no-override" : options2.forcedColors, + contrast: options2.contrast === null ? "no-override" : options2.contrast + }); + } + async setViewportSize(viewportSize) { + this._viewportSize = viewportSize; + await this._channel.setViewportSize({ viewportSize }); + } + viewportSize() { + return this._viewportSize || null; + } + async evaluate(pageFunction, arg) { + assertMaxArguments(arguments.length, 2); + return await this._mainFrame.evaluate(pageFunction, arg); + } + async addInitScript(script, arg) { + const source2 = await evaluationScript(this._platform, script, arg); + await this._channel.addInitScript({ source: source2 }); + } + async route(url2, handler, options2 = {}) { + this._routes.unshift(new RouteHandler(this._platform, this._browserContext._options.baseURL, url2, handler, options2.times)); + await this._updateInterceptionPatterns(); + } + async routeFromHAR(har, options2 = {}) { + const localUtils = this._connection.localUtils(); + if (!localUtils) + throw new Error("Route from har is not supported in thin clients"); + if (options2.update) { + await this._browserContext._recordIntoHAR(har, this, options2); + return; + } + const harRouter = await HarRouter.create(localUtils, har, options2.notFound || "abort", { urlMatch: options2.url }); + this._harRouters.push(harRouter); + await harRouter.addPageRoute(this); + } + async routeWebSocket(url2, handler) { + this._webSocketRoutes.unshift(new WebSocketRouteHandler(this._browserContext._options.baseURL, url2, handler)); + await this._updateWebSocketInterceptionPatterns(); + } + _disposeHarRouters() { + this._harRouters.forEach((router) => router.dispose()); + this._harRouters = []; + } + async unrouteAll(options2) { + await this._unrouteInternal(this._routes, [], options2 == null ? void 0 : options2.behavior); + this._disposeHarRouters(); + } + async unroute(url2, handler) { + const removed = []; + const remaining = []; + for (const route of this._routes) { + if (urlMatchesEqual(route.url, url2) && (!handler || route.handler === handler)) + removed.push(route); + else + remaining.push(route); + } + await this._unrouteInternal(removed, remaining, "default"); + } + async _unrouteInternal(removed, remaining, behavior) { + this._routes = remaining; + await this._updateInterceptionPatterns(); + if (!behavior || behavior === "default") + return; + const promises2 = removed.map((routeHandler) => routeHandler.stop(behavior)); + await Promise.all(promises2); + } + async _updateInterceptionPatterns() { + const patterns = RouteHandler.prepareInterceptionPatterns(this._routes); + await this._channel.setNetworkInterceptionPatterns({ patterns }); + } + async _updateWebSocketInterceptionPatterns() { + const patterns = WebSocketRouteHandler.prepareInterceptionPatterns(this._webSocketRoutes); + await this._channel.setWebSocketInterceptionPatterns({ patterns }); + } + async screenshot(options2 = {}) { + const mask = options2.mask; + const copy = { ...options2, mask: void 0, timeout: this._timeoutSettings.timeout(options2) }; + if (!copy.type) + copy.type = determineScreenshotType(options2); + if (mask) { + copy.mask = mask.map((locator) => ({ + frame: locator._frame._channel, + selector: locator._selector + })); + } + const result = await this._channel.screenshot(copy); + if (options2.path) { + await mkdirIfNeeded(this._platform, options2.path); + await this._platform.fs().promises.writeFile(options2.path, result.binary); + } + return result.binary; + } + async _expectScreenshot(options2) { + const mask = (options2 == null ? void 0 : options2.mask) ? options2 == null ? void 0 : options2.mask.map((locator2) => ({ + frame: locator2._frame._channel, + selector: locator2._selector + })) : void 0; + const locator = options2.locator ? { + frame: options2.locator._frame._channel, + selector: options2.locator._selector + } : void 0; + return await this._channel.expectScreenshot({ + ...options2, + isNot: !!options2.isNot, + locator, + mask + }); + } + async title() { + return await this._mainFrame.title(); + } + async bringToFront() { + await this._channel.bringToFront(); + } + async [Symbol.asyncDispose]() { + await this.close(); + } + async close(options2 = {}) { + this._closeReason = options2.reason; + this._closeWasCalled = true; + try { + if (this._ownedContext) + await this._ownedContext.close(); + else + await this._channel.close(options2); + } catch (e) { + if (isTargetClosedError(e) && !options2.runBeforeUnload) + return; + throw e; + } + } + isClosed() { + return this._closed; + } + async click(selector, options2) { + return await this._mainFrame.click(selector, options2); + } + async dragAndDrop(source2, target, options2) { + return await this._mainFrame.dragAndDrop(source2, target, options2); + } + async dblclick(selector, options2) { + await this._mainFrame.dblclick(selector, options2); + } + async tap(selector, options2) { + return await this._mainFrame.tap(selector, options2); + } + async fill(selector, value, options2) { + return await this._mainFrame.fill(selector, value, options2); + } + locator(selector, options2) { + return this.mainFrame().locator(selector, options2); + } + getByTestId(testId) { + return this.mainFrame().getByTestId(testId); + } + getByAltText(text, options2) { + return this.mainFrame().getByAltText(text, options2); + } + getByLabel(text, options2) { + return this.mainFrame().getByLabel(text, options2); + } + getByPlaceholder(text, options2) { + return this.mainFrame().getByPlaceholder(text, options2); + } + getByText(text, options2) { + return this.mainFrame().getByText(text, options2); + } + getByTitle(text, options2) { + return this.mainFrame().getByTitle(text, options2); + } + getByRole(role, options2 = {}) { + return this.mainFrame().getByRole(role, options2); + } + frameLocator(selector) { + return this.mainFrame().frameLocator(selector); + } + async focus(selector, options2) { + return await this._mainFrame.focus(selector, options2); + } + async textContent(selector, options2) { + return await this._mainFrame.textContent(selector, options2); + } + async innerText(selector, options2) { + return await this._mainFrame.innerText(selector, options2); + } + async innerHTML(selector, options2) { + return await this._mainFrame.innerHTML(selector, options2); + } + async getAttribute(selector, name, options2) { + return await this._mainFrame.getAttribute(selector, name, options2); + } + async inputValue(selector, options2) { + return await this._mainFrame.inputValue(selector, options2); + } + async isChecked(selector, options2) { + return await this._mainFrame.isChecked(selector, options2); + } + async isDisabled(selector, options2) { + return await this._mainFrame.isDisabled(selector, options2); + } + async isEditable(selector, options2) { + return await this._mainFrame.isEditable(selector, options2); + } + async isEnabled(selector, options2) { + return await this._mainFrame.isEnabled(selector, options2); + } + async isHidden(selector, options2) { + return await this._mainFrame.isHidden(selector, options2); + } + async isVisible(selector, options2) { + return await this._mainFrame.isVisible(selector, options2); + } + async hover(selector, options2) { + return await this._mainFrame.hover(selector, options2); + } + async selectOption(selector, values, options2) { + return await this._mainFrame.selectOption(selector, values, options2); + } + async setInputFiles(selector, files, options2) { + return await this._mainFrame.setInputFiles(selector, files, options2); + } + async type(selector, text, options2) { + return await this._mainFrame.type(selector, text, options2); + } + async press(selector, key2, options2) { + return await this._mainFrame.press(selector, key2, options2); + } + async check(selector, options2) { + return await this._mainFrame.check(selector, options2); + } + async uncheck(selector, options2) { + return await this._mainFrame.uncheck(selector, options2); + } + async setChecked(selector, checked, options2) { + return await this._mainFrame.setChecked(selector, checked, options2); + } + async waitForTimeout(timeout) { + return await this._mainFrame.waitForTimeout(timeout); + } + async waitForFunction(pageFunction, arg, options2) { + return await this._mainFrame.waitForFunction(pageFunction, arg, options2); + } + workers() { + return [...this._workers]; + } + async pause(_options) { + var _a2; + if (this._platform.isJSDebuggerAttached()) + return; + const defaultNavigationTimeout = this._browserContext._timeoutSettings.defaultNavigationTimeout(); + const defaultTimeout = this._browserContext._timeoutSettings.defaultTimeout(); + this._browserContext.setDefaultNavigationTimeout(0); + this._browserContext.setDefaultTimeout(0); + (_a2 = this._instrumentation) == null ? void 0 : _a2.onWillPause({ keepTestTimeout: !!(_options == null ? void 0 : _options.__testHookKeepTestTimeout) }); + await this._closedOrCrashedScope.safeRace(this.context()._channel.pause()); + this._browserContext.setDefaultNavigationTimeout(defaultNavigationTimeout); + this._browserContext.setDefaultTimeout(defaultTimeout); + } + async pdf(options2 = {}) { + const transportOptions = { ...options2 }; + if (transportOptions.margin) + transportOptions.margin = { ...transportOptions.margin }; + if (typeof options2.width === "number") + transportOptions.width = options2.width + "px"; + if (typeof options2.height === "number") + transportOptions.height = options2.height + "px"; + for (const margin of ["top", "right", "bottom", "left"]) { + const index2 = margin; + if (options2.margin && typeof options2.margin[index2] === "number") + transportOptions.margin[index2] = transportOptions.margin[index2] + "px"; + } + const result = await this._channel.pdf(transportOptions); + if (options2.path) { + const platform = this._platform; + await platform.fs().promises.mkdir(platform.path().dirname(options2.path), { recursive: true }); + await platform.fs().promises.writeFile(options2.path, result.pdf); + } + return result.pdf; + } + async _snapshotForAI() { + const result = await this._channel.snapshotForAI(); + return result.snapshot; + } +} +class BindingCall extends ChannelOwner { + static from(channel) { + return channel._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + } + async call(func) { + try { + const frame = Frame.from(this._initializer.frame); + const source2 = { + context: frame._page.context(), + page: frame._page, + frame + }; + let result; + if (this._initializer.handle) + result = await func(source2, JSHandle2.from(this._initializer.handle)); + else + result = await func(source2, ...this._initializer.args.map(parseResult)); + this._channel.resolve({ result: serializeArgument(result) }).catch(() => { + }); + } catch (e) { + this._channel.reject({ error: serializeError(e) }).catch(() => { + }); + } + } +} +function trimUrl(param) { + if (isRegExp$4(param)) + return `/${trimStringWithEllipsis(param.source, 50)}/${param.flags}`; + if (isString(param)) + return `"${trimStringWithEllipsis(param, 50)}"`; +} +class ConsoleMessage2 { + constructor(platform, event) { + this._page = "page" in event && event.page ? Page.from(event.page) : null; + this._event = event; + if (platform.inspectCustom) + this[platform.inspectCustom] = () => this._inspect(); + } + page() { + return this._page; + } + type() { + return this._event.type; + } + text() { + return this._event.text; + } + args() { + return this._event.args.map(JSHandle2.from); + } + location() { + return this._event.location; + } + _inspect() { + return this.text(); + } +} +class Dialog2 extends ChannelOwner { + static from(dialog) { + return dialog._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._page = Page.fromNullable(initializer.page); + } + page() { + return this._page; + } + type() { + return this._initializer.type; + } + message() { + return this._initializer.message; + } + defaultValue() { + return this._initializer.defaultValue; + } + async accept(promptText) { + await this._channel.accept({ promptText }); + } + async dismiss() { + await this._channel.dismiss(); + } +} +class WebError { + constructor(page, error2) { + this._page = page; + this._error = error2; + } + page() { + return this._page; + } + error() { + return this._error; + } +} +class BrowserContext extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._pages = /* @__PURE__ */ new Set(); + this._routes = []; + this._webSocketRoutes = []; + this._browser = null; + this._bindings = /* @__PURE__ */ new Map(); + this._backgroundPages = /* @__PURE__ */ new Set(); + this._serviceWorkers = /* @__PURE__ */ new Set(); + this._harRecorders = /* @__PURE__ */ new Map(); + this._closingStatus = "none"; + this._harRouters = []; + this._options = initializer.options; + this._timeoutSettings = new TimeoutSettings(this._platform); + this.tracing = Tracing2.from(initializer.tracing); + this.request = APIRequestContext.from(initializer.requestContext); + this.request._timeoutSettings = this._timeoutSettings; + this.clock = new Clock2(this); + this._channel.on("bindingCall", ({ binding: binding2 }) => this._onBinding(BindingCall.from(binding2))); + this._channel.on("close", () => this._onClose()); + this._channel.on("page", ({ page }) => this._onPage(Page.from(page))); + this._channel.on("route", ({ route }) => this._onRoute(Route2.from(route))); + this._channel.on("webSocketRoute", ({ webSocketRoute }) => this._onWebSocketRoute(WebSocketRoute.from(webSocketRoute))); + this._channel.on("backgroundPage", ({ page }) => { + const backgroundPage = Page.from(page); + this._backgroundPages.add(backgroundPage); + this.emit(Events.BrowserContext.BackgroundPage, backgroundPage); + }); + this._channel.on("serviceWorker", ({ worker }) => { + const serviceWorker = Worker.from(worker); + serviceWorker._context = this; + this._serviceWorkers.add(serviceWorker); + this.emit(Events.BrowserContext.ServiceWorker, serviceWorker); + }); + this._channel.on("console", (event) => { + const consoleMessage = new ConsoleMessage2(this._platform, event); + this.emit(Events.BrowserContext.Console, consoleMessage); + const page = consoleMessage.page(); + if (page) + page.emit(Events.Page.Console, consoleMessage); + }); + this._channel.on("pageError", ({ error: error2, page }) => { + const pageObject = Page.from(page); + const parsedError = parseError(error2); + this.emit(Events.BrowserContext.WebError, new WebError(pageObject, parsedError)); + if (pageObject) + pageObject.emit(Events.Page.PageError, parsedError); + }); + this._channel.on("dialog", ({ dialog }) => { + const dialogObject = Dialog2.from(dialog); + let hasListeners = this.emit(Events.BrowserContext.Dialog, dialogObject); + const page = dialogObject.page(); + if (page) + hasListeners = page.emit(Events.Page.Dialog, dialogObject) || hasListeners; + if (!hasListeners) { + if (dialogObject.type() === "beforeunload") + dialog.accept({}).catch(() => { + }); + else + dialog.dismiss().catch(() => { + }); + } + }); + this._channel.on("request", ({ request: request2, page }) => this._onRequest(Request2.from(request2), Page.fromNullable(page))); + this._channel.on("requestFailed", ({ request: request2, failureText, responseEndTiming, page }) => this._onRequestFailed(Request2.from(request2), responseEndTiming, failureText, Page.fromNullable(page))); + this._channel.on("requestFinished", (params) => this._onRequestFinished(params)); + this._channel.on("response", ({ response: response2, page }) => this._onResponse(Response2.from(response2), Page.fromNullable(page))); + this._closedPromise = new Promise((f) => this.once(Events.BrowserContext.Close, f)); + this._setEventToSubscriptionMapping(/* @__PURE__ */ new Map([ + [Events.BrowserContext.Console, "console"], + [Events.BrowserContext.Dialog, "dialog"], + [Events.BrowserContext.Request, "request"], + [Events.BrowserContext.Response, "response"], + [Events.BrowserContext.RequestFinished, "requestFinished"], + [Events.BrowserContext.RequestFailed, "requestFailed"] + ])); + } + static from(context) { + return context._object; + } + static fromNullable(context) { + return context ? BrowserContext.from(context) : null; + } + async _initializeHarFromOptions(recordHar) { + if (!recordHar) + return; + const defaultContent = recordHar.path.endsWith(".zip") ? "attach" : "embed"; + await this._recordIntoHAR(recordHar.path, null, { + url: recordHar.urlFilter, + updateContent: recordHar.content ?? (recordHar.omitContent ? "omit" : defaultContent), + updateMode: recordHar.mode ?? "full" + }); + } + _onPage(page) { + this._pages.add(page); + this.emit(Events.BrowserContext.Page, page); + if (page._opener && !page._opener.isClosed()) + page._opener.emit(Events.Page.Popup, page); + } + _onRequest(request2, page) { + this.emit(Events.BrowserContext.Request, request2); + if (page) + page.emit(Events.Page.Request, request2); + } + _onResponse(response2, page) { + this.emit(Events.BrowserContext.Response, response2); + if (page) + page.emit(Events.Page.Response, response2); + } + _onRequestFailed(request2, responseEndTiming, failureText, page) { + request2._failureText = failureText || null; + request2._setResponseEndTiming(responseEndTiming); + this.emit(Events.BrowserContext.RequestFailed, request2); + if (page) + page.emit(Events.Page.RequestFailed, request2); + } + _onRequestFinished(params) { + const { responseEndTiming } = params; + const request2 = Request2.from(params.request); + const response2 = Response2.fromNullable(params.response); + const page = Page.fromNullable(params.page); + request2._setResponseEndTiming(responseEndTiming); + this.emit(Events.BrowserContext.RequestFinished, request2); + if (page) + page.emit(Events.Page.RequestFinished, request2); + if (response2) + response2._finishedPromise.resolve(null); + } + async _onRoute(route) { + route._context = this; + const page = route.request()._safePage(); + const routeHandlers = this._routes.slice(); + for (const routeHandler of routeHandlers) { + if ((page == null ? void 0 : page._closeWasCalled) || this._closingStatus !== "none") + return; + if (!routeHandler.matches(route.request().url())) + continue; + const index2 = this._routes.indexOf(routeHandler); + if (index2 === -1) + continue; + if (routeHandler.willExpire()) + this._routes.splice(index2, 1); + const handled = await routeHandler.handle(route); + if (!this._routes.length) + this._updateInterceptionPatterns().catch(() => { + }); + if (handled) + return; + } + await route._innerContinue( + true + /* isFallback */ + ).catch(() => { + }); + } + async _onWebSocketRoute(webSocketRoute) { + const routeHandler = this._webSocketRoutes.find((route) => route.matches(webSocketRoute.url())); + if (routeHandler) + await routeHandler.handle(webSocketRoute); + else + webSocketRoute.connectToServer(); + } + async _onBinding(bindingCall) { + const func = this._bindings.get(bindingCall._initializer.name); + if (!func) + return; + await bindingCall.call(func); + } + setDefaultNavigationTimeout(timeout) { + this._timeoutSettings.setDefaultNavigationTimeout(timeout); + } + setDefaultTimeout(timeout) { + this._timeoutSettings.setDefaultTimeout(timeout); + } + browser() { + return this._browser; + } + pages() { + return [...this._pages]; + } + async newPage() { + if (this._ownerPage) + throw new Error("Please use browser.newContext()"); + return Page.from((await this._channel.newPage()).page); + } + async cookies(urls) { + if (!urls) + urls = []; + if (urls && typeof urls === "string") + urls = [urls]; + return (await this._channel.cookies({ urls })).cookies; + } + async addCookies(cookies) { + await this._channel.addCookies({ cookies }); + } + async clearCookies(options2 = {}) { + await this._channel.clearCookies({ + name: isString(options2.name) ? options2.name : void 0, + nameRegexSource: isRegExp$4(options2.name) ? options2.name.source : void 0, + nameRegexFlags: isRegExp$4(options2.name) ? options2.name.flags : void 0, + domain: isString(options2.domain) ? options2.domain : void 0, + domainRegexSource: isRegExp$4(options2.domain) ? options2.domain.source : void 0, + domainRegexFlags: isRegExp$4(options2.domain) ? options2.domain.flags : void 0, + path: isString(options2.path) ? options2.path : void 0, + pathRegexSource: isRegExp$4(options2.path) ? options2.path.source : void 0, + pathRegexFlags: isRegExp$4(options2.path) ? options2.path.flags : void 0 + }); + } + async grantPermissions(permissions, options2) { + await this._channel.grantPermissions({ permissions, ...options2 }); + } + async clearPermissions() { + await this._channel.clearPermissions(); + } + async setGeolocation(geolocation) { + await this._channel.setGeolocation({ geolocation: geolocation || void 0 }); + } + async setExtraHTTPHeaders(headers) { + validateHeaders(headers); + await this._channel.setExtraHTTPHeaders({ headers: headersObjectToArray(headers) }); + } + async setOffline(offline) { + await this._channel.setOffline({ offline }); + } + async setHTTPCredentials(httpCredentials) { + await this._channel.setHTTPCredentials({ httpCredentials: httpCredentials || void 0 }); + } + async addInitScript(script, arg) { + const source2 = await evaluationScript(this._platform, script, arg); + await this._channel.addInitScript({ source: source2 }); + } + async exposeBinding(name, callback, options2 = {}) { + await this._channel.exposeBinding({ name, needsHandle: options2.handle }); + this._bindings.set(name, callback); + } + async exposeFunction(name, callback) { + await this._channel.exposeBinding({ name }); + const binding2 = (source2, ...args) => callback(...args); + this._bindings.set(name, binding2); + } + async route(url2, handler, options2 = {}) { + this._routes.unshift(new RouteHandler(this._platform, this._options.baseURL, url2, handler, options2.times)); + await this._updateInterceptionPatterns(); + } + async routeWebSocket(url2, handler) { + this._webSocketRoutes.unshift(new WebSocketRouteHandler(this._options.baseURL, url2, handler)); + await this._updateWebSocketInterceptionPatterns(); + } + async _recordIntoHAR(har, page, options2 = {}) { + const { harId } = await this._channel.harStart({ + page: page == null ? void 0 : page._channel, + options: { + zip: har.endsWith(".zip"), + content: options2.updateContent ?? "attach", + urlGlob: isString(options2.url) ? options2.url : void 0, + urlRegexSource: isRegExp$4(options2.url) ? options2.url.source : void 0, + urlRegexFlags: isRegExp$4(options2.url) ? options2.url.flags : void 0, + mode: options2.updateMode ?? "minimal" + } + }); + this._harRecorders.set(harId, { path: har, content: options2.updateContent ?? "attach" }); + } + async routeFromHAR(har, options2 = {}) { + const localUtils = this._connection.localUtils(); + if (!localUtils) + throw new Error("Route from har is not supported in thin clients"); + if (options2.update) { + await this._recordIntoHAR(har, null, options2); + return; + } + const harRouter = await HarRouter.create(localUtils, har, options2.notFound || "abort", { urlMatch: options2.url }); + this._harRouters.push(harRouter); + await harRouter.addContextRoute(this); + } + _disposeHarRouters() { + this._harRouters.forEach((router) => router.dispose()); + this._harRouters = []; + } + async unrouteAll(options2) { + await this._unrouteInternal(this._routes, [], options2 == null ? void 0 : options2.behavior); + this._disposeHarRouters(); + } + async unroute(url2, handler) { + const removed = []; + const remaining = []; + for (const route of this._routes) { + if (urlMatchesEqual(route.url, url2) && (!handler || route.handler === handler)) + removed.push(route); + else + remaining.push(route); + } + await this._unrouteInternal(removed, remaining, "default"); + } + async _unrouteInternal(removed, remaining, behavior) { + this._routes = remaining; + await this._updateInterceptionPatterns(); + if (!behavior || behavior === "default") + return; + const promises2 = removed.map((routeHandler) => routeHandler.stop(behavior)); + await Promise.all(promises2); + } + async _updateInterceptionPatterns() { + const patterns = RouteHandler.prepareInterceptionPatterns(this._routes); + await this._channel.setNetworkInterceptionPatterns({ patterns }); + } + async _updateWebSocketInterceptionPatterns() { + const patterns = WebSocketRouteHandler.prepareInterceptionPatterns(this._webSocketRoutes); + await this._channel.setWebSocketInterceptionPatterns({ patterns }); + } + _effectiveCloseReason() { + var _a2; + return this._closeReason || ((_a2 = this._browser) == null ? void 0 : _a2._closeReason); + } + async waitForEvent(event, optionsOrPredicate = {}) { + return await this._wrapApiCall(async () => { + const timeout = this._timeoutSettings.timeout(typeof optionsOrPredicate === "function" ? {} : optionsOrPredicate); + const predicate = typeof optionsOrPredicate === "function" ? optionsOrPredicate : optionsOrPredicate.predicate; + const waiter = Waiter.createForEvent(this, event); + waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded while waiting for event "${event}"`); + if (event !== Events.BrowserContext.Close) + waiter.rejectOnEvent(this, Events.BrowserContext.Close, () => new TargetClosedError2(this._effectiveCloseReason())); + const result = await waiter.waitForEvent(this, event, predicate); + waiter.dispose(); + return result; + }); + } + async storageState(options2 = {}) { + const state2 = await this._channel.storageState({ indexedDB: options2.indexedDB }); + if (options2.path) { + await mkdirIfNeeded(this._platform, options2.path); + await this._platform.fs().promises.writeFile(options2.path, JSON.stringify(state2, void 0, 2), "utf8"); + } + return state2; + } + backgroundPages() { + return [...this._backgroundPages]; + } + serviceWorkers() { + return [...this._serviceWorkers]; + } + async newCDPSession(page) { + if (!(page instanceof Page) && !(page instanceof Frame)) + throw new Error("page: expected Page or Frame"); + const result = await this._channel.newCDPSession(page instanceof Page ? { page: page._channel } : { frame: page._channel }); + return CDPSession.from(result.session); + } + _onClose() { + var _a2, _b2, _c2; + this._closingStatus = "closed"; + (_a2 = this._browser) == null ? void 0 : _a2._contexts.delete(this); + (_b2 = this._browser) == null ? void 0 : _b2._browserType._contexts.delete(this); + (_c2 = this._browser) == null ? void 0 : _c2._browserType._playwright.selectors._contextsForSelectors.delete(this); + this._disposeHarRouters(); + this.tracing._resetStackCounter(); + this.emit(Events.BrowserContext.Close, this); + } + async [Symbol.asyncDispose]() { + await this.close(); + } + async close(options2 = {}) { + if (this._closingStatus !== "none") + return; + this._closeReason = options2.reason; + this._closingStatus = "closing"; + await this.request.dispose(options2); + await this._wrapApiCall(async () => { + await this._instrumentation.runBeforeCloseBrowserContext(this); + for (const [harId, harParams] of this._harRecorders) { + const har = await this._channel.harExport({ harId }); + const artifact = Artifact2.from(har.artifact); + const isCompressed = harParams.content === "attach" || harParams.path.endsWith(".zip"); + const needCompressed = harParams.path.endsWith(".zip"); + if (isCompressed && !needCompressed) { + const localUtils = this._connection.localUtils(); + if (!localUtils) + throw new Error("Uncompressed har is not supported in thin clients"); + await artifact.saveAs(harParams.path + ".tmp"); + await localUtils.harUnzip({ zipFile: harParams.path + ".tmp", harFile: harParams.path }); + } else { + await artifact.saveAs(harParams.path); + } + await artifact.delete(); + } + }, { internal: true }); + await this._channel.close(options2); + await this._closedPromise; + } + async _enableRecorder(params) { + await this._channel.enableRecorder(params); + } +} +async function prepareStorageState(platform, options2) { + if (typeof options2.storageState !== "string") + return options2.storageState; + try { + return JSON.parse(await platform.fs().promises.readFile(options2.storageState, "utf8")); + } catch (e) { + rewriteErrorMessage(e, `Error reading storage state from ${options2.storageState}: +` + e.message); + throw e; + } +} +async function prepareBrowserContextParams(platform, options2) { + if (options2.videoSize && !options2.videosPath) + throw new Error(`"videoSize" option requires "videosPath" to be specified`); + if (options2.extraHTTPHeaders) + validateHeaders(options2.extraHTTPHeaders); + const contextParams = { + ...options2, + viewport: options2.viewport === null ? void 0 : options2.viewport, + noDefaultViewport: options2.viewport === null, + extraHTTPHeaders: options2.extraHTTPHeaders ? headersObjectToArray(options2.extraHTTPHeaders) : void 0, + storageState: await prepareStorageState(platform, options2), + serviceWorkers: options2.serviceWorkers, + colorScheme: options2.colorScheme === null ? "no-override" : options2.colorScheme, + reducedMotion: options2.reducedMotion === null ? "no-override" : options2.reducedMotion, + forcedColors: options2.forcedColors === null ? "no-override" : options2.forcedColors, + contrast: options2.contrast === null ? "no-override" : options2.contrast, + acceptDownloads: toAcceptDownloadsProtocol(options2.acceptDownloads), + clientCertificates: await toClientCertificatesProtocol(platform, options2.clientCertificates) + }; + if (!contextParams.recordVideo && options2.videosPath) { + contextParams.recordVideo = { + dir: options2.videosPath, + size: options2.videoSize + }; + } + if (contextParams.recordVideo && contextParams.recordVideo.dir) + contextParams.recordVideo.dir = platform.path().resolve(contextParams.recordVideo.dir); + return contextParams; +} +function toAcceptDownloadsProtocol(acceptDownloads) { + if (acceptDownloads === void 0) + return void 0; + if (acceptDownloads) + return "accept"; + return "deny"; +} +async function toClientCertificatesProtocol(platform, certs) { + if (!certs) + return void 0; + const bufferizeContent = async (value, path2) => { + if (value) + return value; + if (path2) + return await platform.fs().promises.readFile(path2); + }; + return await Promise.all(certs.map(async (cert) => ({ + origin: cert.origin, + cert: await bufferizeContent(cert.cert, cert.certPath), + key: await bufferizeContent(cert.key, cert.keyPath), + pfx: await bufferizeContent(cert.pfx, cert.pfxPath), + passphrase: cert.passphrase + }))); +} +async function connectOverWebSocket(parentConnection, params) { + const localUtils = parentConnection.localUtils(); + const transport = localUtils ? new JsonPipeTransport(localUtils) : new WebSocketTransport2(); + const connectHeaders = await transport.connect(params); + const connection = new Connection(parentConnection._platform, localUtils, parentConnection._instrumentation, connectHeaders); + connection.markAsRemote(); + connection.on("close", () => transport.close()); + let closeError; + const onTransportClosed = (reason) => { + connection.close(reason || closeError); + }; + transport.onClose((reason) => onTransportClosed(reason)); + connection.onmessage = (message) => transport.send(message).catch(() => onTransportClosed()); + transport.onMessage((message) => { + try { + connection.dispatch(message); + } catch (e) { + closeError = String(e); + transport.close().catch(() => { + }); + } + }); + return connection; +} +class JsonPipeTransport { + constructor(owner) { + this._owner = owner; + } + async connect(params) { + const { pipe, headers: connectHeaders } = await this._owner._channel.connect(params); + this._pipe = pipe; + return connectHeaders; + } + async send(message) { + await this._pipe.send({ message }); + } + onMessage(callback) { + this._pipe.on("message", ({ message }) => callback(message)); + } + onClose(callback) { + this._pipe.on("closed", ({ reason }) => callback(reason)); + } + async close() { + await this._pipe.close().catch(() => { + }); + } +} +class WebSocketTransport2 { + async connect(params) { + this._ws = new window.WebSocket(params.wsEndpoint); + return []; + } + async send(message) { + this._ws.send(JSON.stringify(message)); + } + onMessage(callback) { + this._ws.addEventListener("message", (event) => callback(JSON.parse(event.data))); + } + onClose(callback) { + this._ws.addEventListener("close", () => callback()); + } + async close() { + this._ws.close(); + } +} +class Android2 extends ChannelOwner { + static from(android) { + return android._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._timeoutSettings = new TimeoutSettings(this._platform); + } + setDefaultTimeout(timeout) { + this._timeoutSettings.setDefaultTimeout(timeout); + } + async devices(options2 = {}) { + const { devices } = await this._channel.devices(options2); + return devices.map((d) => AndroidDevice.from(d)); + } + async launchServer(options2 = {}) { + if (!this._serverLauncher) + throw new Error("Launching server is not supported"); + return await this._serverLauncher.launchServer(options2); + } + async connect(wsEndpoint, options2 = {}) { + return await this._wrapApiCall(async () => { + const deadline = options2.timeout ? monotonicTime() + options2.timeout : 0; + const headers = { "x-playwright-browser": "android", ...options2.headers }; + const connectParams = { wsEndpoint, headers, slowMo: options2.slowMo, timeout: options2.timeout || 0 }; + const connection = await connectOverWebSocket(this._connection, connectParams); + let device; + connection.on("close", () => { + device == null ? void 0 : device._didClose(); + }); + const result = await raceAgainstDeadline(async () => { + const playwright2 = await connection.initializePlaywright(); + if (!playwright2._initializer.preConnectedAndroidDevice) { + connection.close(); + throw new Error("Malformed endpoint. Did you use Android.launchServer method?"); + } + device = AndroidDevice.from(playwright2._initializer.preConnectedAndroidDevice); + device._shouldCloseConnectionOnClose = true; + device.on(Events.AndroidDevice.Close, () => connection.close()); + return device; + }, deadline); + if (!result.timedOut) { + return result.result; + } else { + connection.close(); + throw new Error(`Timeout ${options2.timeout}ms exceeded`); + } + }); + } +} +class AndroidDevice extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._webViews = /* @__PURE__ */ new Map(); + this._shouldCloseConnectionOnClose = false; + this._android = parent; + this.input = new AndroidInput(this); + this._timeoutSettings = new TimeoutSettings(this._platform, parent._timeoutSettings); + this._channel.on("webViewAdded", ({ webView }) => this._onWebViewAdded(webView)); + this._channel.on("webViewRemoved", ({ socketName }) => this._onWebViewRemoved(socketName)); + this._channel.on("close", () => this._didClose()); + } + static from(androidDevice) { + return androidDevice._object; + } + _onWebViewAdded(webView) { + const view = new AndroidWebView(this, webView); + this._webViews.set(webView.socketName, view); + this.emit(Events.AndroidDevice.WebView, view); + } + _onWebViewRemoved(socketName) { + const view = this._webViews.get(socketName); + this._webViews.delete(socketName); + if (view) + view.emit(Events.AndroidWebView.Close); + } + setDefaultTimeout(timeout) { + this._timeoutSettings.setDefaultTimeout(timeout); + } + serial() { + return this._initializer.serial; + } + model() { + return this._initializer.model; + } + webViews() { + return [...this._webViews.values()]; + } + async webView(selector, options2) { + const predicate = (v) => { + if (selector.pkg) + return v.pkg() === selector.pkg; + if (selector.socketName) + return v._socketName() === selector.socketName; + return false; + }; + const webView = [...this._webViews.values()].find(predicate); + if (webView) + return webView; + return await this.waitForEvent("webview", { ...options2, predicate }); + } + async wait(selector, options2 = {}) { + await this._channel.wait({ androidSelector: toSelectorChannel(selector), ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async fill(selector, text, options2 = {}) { + await this._channel.fill({ androidSelector: toSelectorChannel(selector), text, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async press(selector, key2, options2 = {}) { + await this.tap(selector, options2); + await this.input.press(key2); + } + async tap(selector, options2 = {}) { + await this._channel.tap({ androidSelector: toSelectorChannel(selector), ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async drag(selector, dest, options2 = {}) { + await this._channel.drag({ androidSelector: toSelectorChannel(selector), dest, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async fling(selector, direction, options2 = {}) { + await this._channel.fling({ androidSelector: toSelectorChannel(selector), direction, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async longTap(selector, options2 = {}) { + await this._channel.longTap({ androidSelector: toSelectorChannel(selector), ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async pinchClose(selector, percent, options2 = {}) { + await this._channel.pinchClose({ androidSelector: toSelectorChannel(selector), percent, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async pinchOpen(selector, percent, options2 = {}) { + await this._channel.pinchOpen({ androidSelector: toSelectorChannel(selector), percent, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async scroll(selector, direction, percent, options2 = {}) { + await this._channel.scroll({ androidSelector: toSelectorChannel(selector), direction, percent, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async swipe(selector, direction, percent, options2 = {}) { + await this._channel.swipe({ androidSelector: toSelectorChannel(selector), direction, percent, ...options2, timeout: this._timeoutSettings.timeout(options2) }); + } + async info(selector) { + return (await this._channel.info({ androidSelector: toSelectorChannel(selector) })).info; + } + async screenshot(options2 = {}) { + const { binary: binary2 } = await this._channel.screenshot(); + if (options2.path) + await this._platform.fs().promises.writeFile(options2.path, binary2); + return binary2; + } + async [Symbol.asyncDispose]() { + await this.close(); + } + async close() { + try { + if (this._shouldCloseConnectionOnClose) + this._connection.close(); + else + await this._channel.close(); + } catch (e) { + if (isTargetClosedError(e)) + return; + throw e; + } + } + _didClose() { + this.emit(Events.AndroidDevice.Close, this); + } + async shell(command2) { + const { result } = await this._channel.shell({ command: command2 }); + return result; + } + async open(command2) { + return AndroidSocket.from((await this._channel.open({ command: command2 })).socket); + } + async installApk(file, options2) { + await this._channel.installApk({ file: await loadFile(this._platform, file), args: options2 && options2.args }); + } + async push(file, path2, options2) { + await this._channel.push({ file: await loadFile(this._platform, file), path: path2, mode: options2 ? options2.mode : void 0 }); + } + async launchBrowser(options2 = {}) { + const contextOptions = await prepareBrowserContextParams(this._platform, options2); + const result = await this._channel.launchBrowser(contextOptions); + const context = BrowserContext.from(result.context); + const selectors2 = this._android._playwright.selectors; + selectors2._contextsForSelectors.add(context); + context.once(Events.BrowserContext.Close, () => selectors2._contextsForSelectors.delete(context)); + await context._initializeHarFromOptions(options2.recordHar); + return context; + } + async waitForEvent(event, optionsOrPredicate = {}) { + return await this._wrapApiCall(async () => { + const timeout = this._timeoutSettings.timeout(typeof optionsOrPredicate === "function" ? {} : optionsOrPredicate); + const predicate = typeof optionsOrPredicate === "function" ? optionsOrPredicate : optionsOrPredicate.predicate; + const waiter = Waiter.createForEvent(this, event); + waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded while waiting for event "${event}"`); + if (event !== Events.AndroidDevice.Close) + waiter.rejectOnEvent(this, Events.AndroidDevice.Close, () => new TargetClosedError2()); + const result = await waiter.waitForEvent(this, event, predicate); + waiter.dispose(); + return result; + }); + } +} +class AndroidSocket extends ChannelOwner { + static from(androidDevice) { + return androidDevice._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._channel.on("data", ({ data: data2 }) => this.emit(Events.AndroidSocket.Data, data2)); + this._channel.on("close", () => this.emit(Events.AndroidSocket.Close)); + } + async write(data2) { + await this._channel.write({ data: data2 }); + } + async close() { + await this._channel.close(); + } + async [Symbol.asyncDispose]() { + await this.close(); + } +} +async function loadFile(platform, file) { + if (isString(file)) + return await platform.fs().promises.readFile(file); + return file; +} +class AndroidInput { + constructor(device) { + this._device = device; + } + async type(text) { + await this._device._channel.inputType({ text }); + } + async press(key2) { + await this._device._channel.inputPress({ key: key2 }); + } + async tap(point) { + await this._device._channel.inputTap({ point }); + } + async swipe(from2, segments, steps) { + await this._device._channel.inputSwipe({ segments, steps }); + } + async drag(from2, to, steps) { + await this._device._channel.inputDrag({ from: from2, to, steps }); + } +} +function toSelectorChannel(selector) { + const { + checkable, + checked, + clazz, + clickable, + depth, + desc, + enabled, + focusable, + focused, + hasChild, + hasDescendant, + longClickable, + pkg, + res, + scrollable, + selected, + text + } = selector; + const toRegex = (value) => { + if (value === void 0) + return void 0; + if (isRegExp$4(value)) + return value.source; + return "^" + value.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d") + "$"; + }; + return { + checkable, + checked, + clazz: toRegex(clazz), + pkg: toRegex(pkg), + desc: toRegex(desc), + res: toRegex(res), + text: toRegex(text), + clickable, + depth, + enabled, + focusable, + focused, + hasChild: hasChild ? { androidSelector: toSelectorChannel(hasChild.selector) } : void 0, + hasDescendant: hasDescendant ? { androidSelector: toSelectorChannel(hasDescendant.selector), maxDepth: hasDescendant.maxDepth } : void 0, + longClickable, + scrollable, + selected + }; +} +class AndroidWebView extends EventEmitter { + constructor(device, data2) { + super(device._platform); + this._device = device; + this._data = data2; + } + pid() { + return this._data.pid; + } + pkg() { + return this._data.pkg; + } + _socketName() { + return this._data.socketName; + } + async page() { + if (!this._pagePromise) + this._pagePromise = this._fetchPage(); + return await this._pagePromise; + } + async _fetchPage() { + const { context } = await this._device._channel.connectToWebView({ socketName: this._data.socketName }); + return BrowserContext.from(context).pages()[0]; + } +} +class Browser extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._contexts = /* @__PURE__ */ new Set(); + this._isConnected = true; + this._shouldCloseConnectionOnClose = false; + this._options = {}; + this._name = initializer.name; + this._channel.on("context", ({ context }) => this._didCreateContext(BrowserContext.from(context))); + this._channel.on("close", () => this._didClose()); + this._closedPromise = new Promise((f) => this.once(Events.Browser.Disconnected, f)); + } + static from(browser2) { + return browser2._object; + } + browserType() { + return this._browserType; + } + async newContext(options2 = {}) { + return await this._innerNewContext(options2, false); + } + async _newContextForReuse(options2 = {}) { + return await this._wrapApiCall(async () => { + for (const context of this._contexts) { + await this._instrumentation.runBeforeCloseBrowserContext(context); + for (const page of context.pages()) + page._onClose(); + context._onClose(); + } + return await this._innerNewContext(options2, true); + }, { internal: true }); + } + async _stopPendingOperations(reason) { + await this._channel.stopPendingOperations({ reason }); + } + async _innerNewContext(options2 = {}, forReuse) { + options2 = this._browserType._playwright.selectors._withSelectorOptions({ + ...this._browserType._playwright._defaultContextOptions, + ...options2 + }); + const contextOptions = await prepareBrowserContextParams(this._platform, options2); + const response2 = forReuse ? await this._channel.newContextForReuse(contextOptions) : await this._channel.newContext(contextOptions); + const context = BrowserContext.from(response2.context); + if (options2.logger) + context._logger = options2.logger; + await context._initializeHarFromOptions(options2.recordHar); + await this._instrumentation.runAfterCreateBrowserContext(context); + return context; + } + _connectToBrowserType(browserType, browserOptions, logger) { + this._browserType = browserType; + this._options = browserOptions; + this._logger = logger; + for (const context of this._contexts) + this._setupBrowserContext(context); + } + _didCreateContext(context) { + context._browser = this; + this._contexts.add(context); + if (this._browserType) + this._setupBrowserContext(context); + } + _setupBrowserContext(context) { + context._logger = this._logger; + context.tracing._tracesDir = this._options.tracesDir; + this._browserType._contexts.add(context); + this._browserType._playwright.selectors._contextsForSelectors.add(context); + context.setDefaultTimeout(this._browserType._playwright._defaultContextTimeout); + context.setDefaultNavigationTimeout(this._browserType._playwright._defaultContextNavigationTimeout); + } + contexts() { + return [...this._contexts]; + } + version() { + return this._initializer.version; + } + async newPage(options2 = {}) { + return await this._wrapApiCall(async () => { + const context = await this.newContext(options2); + const page = await context.newPage(); + page._ownedContext = context; + context._ownerPage = page; + return page; + }, { title: "Create page" }); + } + isConnected() { + return this._isConnected; + } + async newBrowserCDPSession() { + return CDPSession.from((await this._channel.newBrowserCDPSession()).session); + } + async startTracing(page, options2 = {}) { + this._path = options2.path; + await this._channel.startTracing({ ...options2, page: page ? page._channel : void 0 }); + } + async stopTracing() { + const artifact = Artifact2.from((await this._channel.stopTracing()).artifact); + const buffer2 = await artifact.readIntoBuffer(); + await artifact.delete(); + if (this._path) { + await mkdirIfNeeded(this._platform, this._path); + await this._platform.fs().promises.writeFile(this._path, buffer2); + this._path = void 0; + } + return buffer2; + } + async [Symbol.asyncDispose]() { + await this.close(); + } + async close(options2 = {}) { + this._closeReason = options2.reason; + try { + if (this._shouldCloseConnectionOnClose) + this._connection.close(); + else + await this._channel.close(options2); + await this._closedPromise; + } catch (e) { + if (isTargetClosedError(e)) + return; + throw e; + } + } + _didClose() { + this._isConnected = false; + this.emit(Events.Browser.Disconnected, this); + } +} +class BrowserType2 extends ChannelOwner { + constructor() { + super(...arguments); + this._contexts = /* @__PURE__ */ new Set(); + } + static from(browserType) { + return browserType._object; + } + executablePath() { + if (!this._initializer.executablePath) + throw new Error("Browser is not supported on current platform"); + return this._initializer.executablePath; + } + name() { + return this._initializer.name; + } + async launch(options2 = {}) { + var _a2; + assert(!options2.userDataDir, "userDataDir option is not supported in `browserType.launch`. Use `browserType.launchPersistentContext` instead"); + assert(!options2.port, "Cannot specify a port without launching as a server."); + const logger = options2.logger || ((_a2 = this._playwright._defaultLaunchOptions) == null ? void 0 : _a2.logger); + options2 = { ...this._playwright._defaultLaunchOptions, ...options2 }; + const launchOptions = { + ...options2, + ignoreDefaultArgs: Array.isArray(options2.ignoreDefaultArgs) ? options2.ignoreDefaultArgs : void 0, + ignoreAllDefaultArgs: !!options2.ignoreDefaultArgs && !Array.isArray(options2.ignoreDefaultArgs), + env: options2.env ? envObjectToArray(options2.env) : void 0, + timeout: new TimeoutSettings(this._platform).launchTimeout(options2) + }; + return await this._wrapApiCall(async () => { + const browser2 = Browser.from((await this._channel.launch(launchOptions)).browser); + browser2._connectToBrowserType(this, options2, logger); + return browser2; + }); + } + async launchServer(options2 = {}) { + if (!this._serverLauncher) + throw new Error("Launching server is not supported"); + options2 = { ...this._playwright._defaultLaunchOptions, ...options2 }; + return await this._serverLauncher.launchServer(options2); + } + async launchPersistentContext(userDataDir, options2 = {}) { + var _a2; + const logger = options2.logger || ((_a2 = this._playwright._defaultLaunchOptions) == null ? void 0 : _a2.logger); + assert(!options2.port, "Cannot specify a port without launching as a server."); + options2 = this._playwright.selectors._withSelectorOptions({ + ...this._playwright._defaultLaunchOptions, + ...this._playwright._defaultContextOptions, + ...options2 + }); + const contextParams = await prepareBrowserContextParams(this._platform, options2); + const persistentParams = { + ...contextParams, + ignoreDefaultArgs: Array.isArray(options2.ignoreDefaultArgs) ? options2.ignoreDefaultArgs : void 0, + ignoreAllDefaultArgs: !!options2.ignoreDefaultArgs && !Array.isArray(options2.ignoreDefaultArgs), + env: options2.env ? envObjectToArray(options2.env) : void 0, + channel: options2.channel, + userDataDir: this._platform.path().isAbsolute(userDataDir) || !userDataDir ? userDataDir : this._platform.path().resolve(userDataDir), + timeout: new TimeoutSettings(this._platform).launchTimeout(options2) + }; + return await this._wrapApiCall(async () => { + const result = await this._channel.launchPersistentContext(persistentParams); + const browser2 = Browser.from(result.browser); + browser2._connectToBrowserType(this, options2, logger); + const context = BrowserContext.from(result.context); + await context._initializeHarFromOptions(options2.recordHar); + await this._instrumentation.runAfterCreateBrowserContext(context); + return context; + }); + } + async connect(optionsOrWsEndpoint, options2) { + if (typeof optionsOrWsEndpoint === "string") + return await this._connect({ ...options2, wsEndpoint: optionsOrWsEndpoint }); + assert(optionsOrWsEndpoint.wsEndpoint, "options.wsEndpoint is required"); + return await this._connect(optionsOrWsEndpoint); + } + async _connect(params) { + const logger = params.logger; + return await this._wrapApiCall(async () => { + const deadline = params.timeout ? monotonicTime() + params.timeout : 0; + const headers = { "x-playwright-browser": this.name(), ...params.headers }; + const connectParams = { + wsEndpoint: params.wsEndpoint, + headers, + exposeNetwork: params.exposeNetwork ?? params._exposeNetwork, + slowMo: params.slowMo, + timeout: params.timeout || 0 + }; + if (params.__testHookRedirectPortForwarding) + connectParams.socksProxyRedirectPortForTest = params.__testHookRedirectPortForwarding; + const connection = await connectOverWebSocket(this._connection, connectParams); + let browser2; + connection.on("close", () => { + for (const context of (browser2 == null ? void 0 : browser2.contexts()) || []) { + for (const page of context.pages()) + page._onClose(); + context._onClose(); + } + setTimeout(() => browser2 == null ? void 0 : browser2._didClose(), 0); + }); + const result = await raceAgainstDeadline(async () => { + if (params.__testHookBeforeCreateBrowser) + await params.__testHookBeforeCreateBrowser(); + const playwright2 = await connection.initializePlaywright(); + if (!playwright2._initializer.preLaunchedBrowser) { + connection.close(); + throw new Error("Malformed endpoint. Did you use BrowserType.launchServer method?"); + } + playwright2.selectors = this._playwright.selectors; + browser2 = Browser.from(playwright2._initializer.preLaunchedBrowser); + browser2._connectToBrowserType(this, {}, logger); + browser2._shouldCloseConnectionOnClose = true; + browser2.on(Events.Browser.Disconnected, () => connection.close()); + return browser2; + }, deadline); + if (!result.timedOut) { + return result.result; + } else { + connection.close(); + throw new Error(`Timeout ${params.timeout}ms exceeded`); + } + }); + } + async connectOverCDP(endpointURLOrOptions, options2) { + if (typeof endpointURLOrOptions === "string") + return await this._connectOverCDP(endpointURLOrOptions, options2); + const endpointURL = "endpointURL" in endpointURLOrOptions ? endpointURLOrOptions.endpointURL : endpointURLOrOptions.wsEndpoint; + assert(endpointURL, "Cannot connect over CDP without wsEndpoint."); + return await this.connectOverCDP(endpointURL, endpointURLOrOptions); + } + async _connectOverCDP(endpointURL, params = {}) { + if (this.name() !== "chromium") + throw new Error("Connecting over CDP is only supported in Chromium."); + const headers = params.headers ? headersObjectToArray(params.headers) : void 0; + const result = await this._channel.connectOverCDP({ + endpointURL, + headers, + slowMo: params.slowMo, + timeout: new TimeoutSettings(this._platform).timeout(params) + }); + const browser2 = Browser.from(result.browser); + browser2._connectToBrowserType(this, {}, params.logger); + if (result.defaultContext) + await this._instrumentation.runAfterCreateBrowserContext(BrowserContext.from(result.defaultContext)); + return browser2; + } +} +function createInstrumentation() { + const listeners = []; + return new Proxy({}, { + get: (obj, prop) => { + if (typeof prop !== "string") + return obj[prop]; + if (prop === "addListener") + return (listener) => listeners.push(listener); + if (prop === "removeListener") + return (listener) => listeners.splice(listeners.indexOf(listener), 1); + if (prop === "removeAllListeners") + return () => listeners.splice(0, listeners.length); + if (prop.startsWith("run")) { + return async (...params) => { + var _a2; + for (const listener of listeners) + await ((_a2 = listener[prop]) == null ? void 0 : _a2.call(listener, ...params)); + }; + } + if (prop.startsWith("on")) { + return (...params) => { + var _a2; + for (const listener of listeners) + (_a2 = listener[prop]) == null ? void 0 : _a2.call(listener, ...params); + }; + } + return obj[prop]; + } + }); +} +class Electron2 extends ChannelOwner { + static from(electron) { + return electron._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + } + async launch(options2 = {}) { + options2 = this._playwright.selectors._withSelectorOptions(options2); + const params = { + ...await prepareBrowserContextParams(this._platform, options2), + env: envObjectToArray(options2.env ? options2.env : this._platform.env), + tracesDir: options2.tracesDir, + timeout: new TimeoutSettings(this._platform).launchTimeout(options2) + }; + const app = ElectronApplication.from((await this._channel.launch(params)).electronApplication); + this._playwright.selectors._contextsForSelectors.add(app._context); + app.once(Events.ElectronApplication.Close, () => this._playwright.selectors._contextsForSelectors.delete(app._context)); + await app._context._initializeHarFromOptions(options2.recordHar); + app._context.tracing._tracesDir = options2.tracesDir; + return app; + } +} +class ElectronApplication extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this._windows = /* @__PURE__ */ new Set(); + this._timeoutSettings = new TimeoutSettings(this._platform); + this._context = BrowserContext.from(initializer.context); + for (const page of this._context._pages) + this._onPage(page); + this._context.on(Events.BrowserContext.Page, (page) => this._onPage(page)); + this._channel.on("close", () => { + this.emit(Events.ElectronApplication.Close); + }); + this._channel.on("console", (event) => this.emit(Events.ElectronApplication.Console, new ConsoleMessage2(this._platform, event))); + this._setEventToSubscriptionMapping(/* @__PURE__ */ new Map([ + [Events.ElectronApplication.Console, "console"] + ])); + } + static from(electronApplication) { + return electronApplication._object; + } + process() { + return this._toImpl().process(); + } + _onPage(page) { + this._windows.add(page); + this.emit(Events.ElectronApplication.Window, page); + page.once(Events.Page.Close, () => this._windows.delete(page)); + } + windows() { + return [...this._windows]; + } + async firstWindow(options2) { + if (this._windows.size) + return this._windows.values().next().value; + return await this.waitForEvent("window", options2); + } + context() { + return this._context; + } + async [Symbol.asyncDispose]() { + await this.close(); + } + async close() { + try { + await this._context.close(); + } catch (e) { + if (isTargetClosedError(e)) + return; + throw e; + } + } + async waitForEvent(event, optionsOrPredicate = {}) { + return await this._wrapApiCall(async () => { + const timeout = this._timeoutSettings.timeout(typeof optionsOrPredicate === "function" ? {} : optionsOrPredicate); + const predicate = typeof optionsOrPredicate === "function" ? optionsOrPredicate : optionsOrPredicate.predicate; + const waiter = Waiter.createForEvent(this, event); + waiter.rejectOnTimeout(timeout, `Timeout ${timeout}ms exceeded while waiting for event "${event}"`); + if (event !== Events.ElectronApplication.Close) + waiter.rejectOnEvent(this, Events.ElectronApplication.Close, () => new TargetClosedError2()); + const result = await waiter.waitForEvent(this, event, predicate); + waiter.dispose(); + return result; + }); + } + async browserWindow(page) { + const result = await this._channel.browserWindow({ page: page._channel }); + return JSHandle2.from(result.handle); + } + async evaluate(pageFunction, arg) { + const result = await this._channel.evaluateExpression({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return parseResult(result.value); + } + async evaluateHandle(pageFunction, arg) { + const result = await this._channel.evaluateExpressionHandle({ expression: String(pageFunction), isFunction: typeof pageFunction === "function", arg: serializeArgument(arg) }); + return JSHandle2.from(result.handle); + } +} +class JsonPipe extends ChannelOwner { + static from(jsonPipe) { + return jsonPipe._object; + } + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + } + channel() { + return this._channel; + } +} +class LocalUtils extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + this.devices = {}; + for (const { name, descriptor } of initializer.deviceDescriptors) + this.devices[name] = descriptor; + } + async zip(params) { + return await this._channel.zip(params); + } + async harOpen(params) { + return await this._channel.harOpen(params); + } + async harLookup(params) { + return await this._channel.harLookup(params); + } + async harClose(params) { + return await this._channel.harClose(params); + } + async harUnzip(params) { + return await this._channel.harUnzip(params); + } + async tracingStarted(params) { + return await this._channel.tracingStarted(params); + } + async traceDiscarded(params) { + return await this._channel.traceDiscarded(params); + } + async addStackToTracingNoReply(params) { + return await this._channel.addStackToTracingNoReply(params); + } +} +class Selectors2 { + constructor(platform) { + this._selectorEngines = []; + this._contextsForSelectors = /* @__PURE__ */ new Set(); + this._platform = platform; + } + async register(name, script, options2 = {}) { + const source2 = await evaluationScript(this._platform, script, void 0, false); + const selectorEngine = { ...options2, name, source: source2 }; + for (const context of this._contextsForSelectors) + await context._channel.registerSelectorEngine({ selectorEngine }); + this._selectorEngines.push(selectorEngine); + } + setTestIdAttribute(attributeName) { + this._testIdAttributeName = attributeName; + setTestIdAttribute(attributeName); + for (const context of this._contextsForSelectors) + context._channel.setTestIdAttributeName({ testIdAttributeName: attributeName }).catch(() => { + }); + } + _withSelectorOptions(options2) { + return { ...options2, selectorEngines: this._selectorEngines, testIdAttributeName: this._testIdAttributeName }; + } +} +class Playwright2 extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + var _a2; + super(parent, type2, guid, initializer); + this.request = new APIRequest(this); + this.chromium = BrowserType2.from(initializer.chromium); + this.chromium._playwright = this; + this.firefox = BrowserType2.from(initializer.firefox); + this.firefox._playwright = this; + this.webkit = BrowserType2.from(initializer.webkit); + this.webkit._playwright = this; + this._android = Android2.from(initializer.android); + this._android._playwright = this; + this._electron = Electron2.from(initializer.electron); + this._electron._playwright = this; + this._bidiChromium = BrowserType2.from(initializer.bidiChromium); + this._bidiChromium._playwright = this; + this._bidiFirefox = BrowserType2.from(initializer.bidiFirefox); + this._bidiFirefox._playwright = this; + this.devices = ((_a2 = this._connection.localUtils()) == null ? void 0 : _a2.devices) ?? {}; + this.selectors = new Selectors2(this._connection._platform); + this.errors = { TimeoutError: TimeoutError2 }; + global._playwrightInstance = this; + } + static from(channel) { + return channel._object; + } + _browserTypes() { + return [this.chromium, this.firefox, this.webkit, this._bidiChromium, this._bidiFirefox]; + } + _preLaunchedBrowser() { + const browser2 = Browser.from(this._initializer.preLaunchedBrowser); + browser2._connectToBrowserType(this[browser2._name], {}, void 0); + return browser2; + } + _allContexts() { + return this._browserTypes().flatMap((type2) => [...type2._contexts]); + } + _allPages() { + return this._allContexts().flatMap((context) => context.pages()); + } +} +class Root extends ChannelOwner { + constructor(connection) { + super(connection, "Root", "", {}); + } + async initialize() { + return Playwright2.from((await this._channel.initialize({ + sdkLanguage: "javascript" + })).playwright); + } +} +class DummyChannelOwner extends ChannelOwner { +} +class Connection extends EventEmitter { + constructor(platform, localUtils, instrumentation, headers = []) { + super(platform); + this._objects = /* @__PURE__ */ new Map(); + this.onmessage = (message) => { + }; + this._lastId = 0; + this._callbacks = /* @__PURE__ */ new Map(); + this._isRemote = false; + this._rawBuffers = false; + this._tracingCount = 0; + this._instrumentation = instrumentation || createInstrumentation(); + this._localUtils = localUtils; + this._rootObject = new Root(this); + this.headers = headers; + } + markAsRemote() { + this._isRemote = true; + } + isRemote() { + return this._isRemote; + } + useRawBuffers() { + this._rawBuffers = true; + } + rawBuffers() { + return this._rawBuffers; + } + localUtils() { + return this._localUtils; + } + async initializePlaywright() { + return await this._rootObject.initialize(); + } + getObjectWithKnownName(guid) { + return this._objects.get(guid); + } + setIsTracing(isTracing) { + if (isTracing) + this._tracingCount++; + else + this._tracingCount--; + } + async sendMessageToServer(object, method, params, options2) { + var _a2, _b2; + if (this._closedError) + throw this._closedError; + if (object._wasCollected) + throw new Error("The object has been collected to prevent unbounded heap growth."); + const guid = object._guid; + const type2 = object._type; + const id = ++this._lastId; + const message = { id, guid, method, params }; + if (this._platform.isLogEnabled("channel")) { + this._platform.log("channel", "SEND> " + JSON.stringify(message)); + } + const location2 = ((_a2 = options2.frames) == null ? void 0 : _a2[0]) ? { file: options2.frames[0].file, line: options2.frames[0].line, column: options2.frames[0].column } : void 0; + const metadata = { title: options2.title, location: location2, internal: options2.internal, stepId: options2.stepId }; + if (this._tracingCount && options2.frames && type2 !== "LocalUtils") + (_b2 = this._localUtils) == null ? void 0 : _b2.addStackToTracingNoReply({ callData: { stack: options2.frames ?? [], id } }).catch(() => { + }); + this._platform.zones.empty.run(() => this.onmessage({ ...message, metadata })); + return await new Promise((resolve, reject) => this._callbacks.set(id, { resolve, reject, title: options2.title, type: type2, method })); + } + _validatorFromWireContext() { + return { + tChannelImpl: this._tChannelImplFromWire.bind(this), + binary: this._rawBuffers ? "buffer" : "fromBase64", + isUnderTest: () => this._platform.isUnderTest() + }; + } + dispatch(message) { + if (this._closedError) + return; + const { id, guid, method, params, result, error: error2, log } = message; + if (id) { + if (this._platform.isLogEnabled("channel")) + this._platform.log("channel", " !!l)) + return ""; + return ` +Call log: +${platform.colors.dim(log.join("\n"))} +`; +} +function from(obj) { + return obj._object; +} +let Crx$1 = class Crx extends ChannelOwner { + constructor() { + super(...arguments); + __publicField(this, "fs", fs); + __publicField(this, "_crxAppPromise"); + __publicField(this, "_incognitoCrxPromise"); + } + static from(crx2) { + return crx2._object; + } + async start(options2) { + if (options2 == null ? void 0 : options2.incognito) { + if (this._incognitoCrxPromise) + throw new Error(`incognito crxApplication is already started`); + this._incognitoCrxPromise = this._start(options2, () => this._incognitoCrxPromise = void 0); + return await this._incognitoCrxPromise; + } else { + if (this._crxAppPromise) + throw new Error(`crxApplication is already started`); + this._crxAppPromise = this._start(options2 ?? {}, () => this._crxAppPromise = void 0); + return await this._crxAppPromise; + } + } + async _start(options2, onClose) { + const crxApp = from((await this._channel.start(options2 ?? {})).crxApplication); + crxApp.on("close", onClose); + return crxApp; + } + async get(options2) { + if (options2 == null ? void 0 : options2.incognito) + return await this._incognitoCrxPromise; + else + return await this._crxAppPromise; + } +}; +class CrxRecorder extends eventsExports.EventEmitter { + constructor(channel) { + super(); + __publicField(this, "_channel"); + __publicField(this, "_hidden", true); + __publicField(this, "_mode", "none"); + this._channel = channel; + this._channel.on("hide", () => { + this._hidden = true; + this.emit("hide"); + }); + this._channel.on("show", () => { + this._hidden = false; + this.emit("show"); + }); + this._channel.on("modeChanged", (event) => { + this._mode = event.mode; + this.emit("modechanged", event); + }); + } + mode() { + return this._mode; + } + isHidden() { + return this._hidden; + } + async setMode(mode) { + await this._channel.setMode({ mode }); + } + async show(options2) { + await this._channel.showRecorder(options2 ?? {}); + } + async hide() { + await this._channel.hideRecorder(); + } + async list(code) { + const { tests } = await this._channel.list({ code }); + return tests; + } + async load(code) { + await this._channel.load({ code }); + } + async run(code, page) { + await this._channel.run({ code, page: page == null ? void 0 : page._channel }); + } +} +let CrxApplication$1 = class CrxApplication extends ChannelOwner { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + __publicField(this, "_context"); + __publicField(this, "recorder"); + this._context = initializer.context._object; + this.recorder = new CrxRecorder(this._channel); + this._channel.on("attached", ({ page, tabId }) => { + this.emit("attached", { tabId, page: Page.from(page) }); + }); + this._channel.on("detached", ({ tabId }) => { + this.emit("detached", tabId); + }); + this._context.on("close", () => { + this.emit("close"); + }); + } + static from(crxApplication) { + return crxApplication._object; + } + context() { + return this._context; + } + pages() { + return this._context.pages(); + } + async attach(tabId) { + return from((await this._channel.attach({ tabId })).page); + } + async attachAll(options2) { + const { url: urlOrUrls, ...remaining } = options2 ?? {}; + const url2 = urlOrUrls ? typeof urlOrUrls === "string" ? [urlOrUrls] : urlOrUrls : void 0; + const params = { ...remaining, url: url2 }; + return (await this._channel.attachAll(params)).pages.map((p) => from(p)); + } + async detach(tabIdOrPage) { + const params = typeof tabIdOrPage === "number" ? { tabId: tabIdOrPage } : { page: tabIdOrPage._channel }; + await this._channel.detach(params); + } + async detachAll() { + await this._channel.detachAll(); + } + async newPage(options2) { + return from((await this._channel.newPage(options2 ?? {})).page); + } + async close() { + await this._channel.close(); + } +}; +let CrxPlaywright$1 = class CrxPlaywright extends Playwright2 { + constructor(parent, type2, guid, initializer) { + super(parent, type2, guid, initializer); + __publicField(this, "_crx"); + this._crx = Crx$1.from(initializer._crx); + } +}; +class CrxConnection extends Connection { + constructor(platform) { + super(platform, void 0, void 0); + this.useRawBuffers(); + } + dispatch(message) { + const { guid: parentGuid, method, params } = message; + if (method === "__create__") { + const { type: type2, guid } = params; + let initializer = params.initializer; + const parent = this._objects.get(parentGuid); + const validator = findValidator(type2, "", "Initializer"); + initializer = validator(initializer, "", { + tChannelImpl: this._tChannelImplFromWire.bind(this), + binary: "buffer", + isUnderTest: () => this._platform.isUnderTest() + }); + switch (type2) { + case "Playwright": + new CrxPlaywright$1(parent, type2, guid, initializer); + return; + case "Crx": + new Crx$1(parent, type2, guid, initializer); + return; + case "CrxApplication": + new CrxApplication$1(parent, type2, guid, initializer); + return; + } + } + return super.dispatch(message); + } +} +class PopupRecorderWindow { + constructor(recorderUrl) { + __publicField(this, "_recorderUrl"); + __publicField(this, "_window"); + __publicField(this, "id"); + __publicField(this, "_portPromise"); + __publicField(this, "_isClosing", false); + __publicField(this, "onMessage"); + __publicField(this, "hideApp"); + this._recorderUrl = recorderUrl ?? "index.html"; + chrome.windows.onRemoved.addListener((window2) => { + var _a2; + if (((_a2 = this._window) == null ? void 0 : _a2.id) === window2) + this.close().catch(() => { + }); + }); + } + isClosed() { + return !this._window; + } + postMessage(msg) { + var _a2; + (_a2 = this._portPromise) == null ? void 0 : _a2.then((port) => port.postMessage({ ...msg })).catch(() => { + }); + } + async open() { + if (this._window) + return; + this._portPromise = new Promise((resolve) => { + const onConnect = (port) => { + chrome.runtime.onConnect.removeListener(onConnect); + port.onDisconnect.addListener(this.close.bind(this)); + if (this.onMessage) + port.onMessage.addListener(this.onMessage); + resolve(port); + }; + chrome.runtime.onConnect.addListener(onConnect); + }); + const [wnd] = await Promise.all([ + chrome.windows.create({ type: "popup", url: this._recorderUrl }), + this._portPromise + ]); + this._window = wnd; + } + async focus() { + await chrome.windows.update(this.id, { drawAttention: true, focused: true }); + } + async close() { + var _a2, _b2, _c2; + if (!this._portPromise || this._isClosing) + return; + this._isClosing = true; + try { + (_a2 = this.hideApp) == null ? void 0 : _a2.call(this); + if ((_b2 = this._window) == null ? void 0 : _b2.id) + chrome.windows.remove(this._window.id).catch(() => { + }); + (_c2 = this._portPromise) == null ? void 0 : _c2.then((port) => port.disconnect()).catch(() => { + }); + this._window = void 0; + this._portPromise = void 0; + } finally { + this._isClosing = false; + } + } +} +class SidepanelRecorderWindow { + constructor(recorderUrl) { + __publicField(this, "_recorderUrl"); + __publicField(this, "_portPromise"); + __publicField(this, "_closed", true); + __publicField(this, "onMessage"); + __publicField(this, "hideApp"); + this._recorderUrl = recorderUrl ?? "index.html"; + this._portPromise = this._waitConnect(); + } + isClosed() { + return this._closed; + } + postMessage(msg) { + this._portPromise.then((port) => port.postMessage({ ...msg })).catch(() => { + }); + } + async open() { + await chrome.sidePanel.setOptions({ path: this._recorderUrl }); + await this._portPromise; + this._closed = false; + } + async focus() { + } + async close() { + var _a2; + if (this._closed) + return; + this._closed = true; + this._portPromise.then((port) => port.disconnect()); + this._portPromise = this._waitConnect(); + (_a2 = this.hideApp) == null ? void 0 : _a2.call(this); + } + _waitConnect() { + return new Promise((resolve) => { + const onConnect = (port) => { + chrome.runtime.onConnect.removeListener(onConnect); + port.onDisconnect.addListener(this.close.bind(this)); + if (this.onMessage) + port.onMessage.addListener(this.onMessage.bind(this)); + resolve(port); + }; + chrome.runtime.onConnect.addListener(onConnect); + }); + } +} +var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 7, 9, 32, 4, 318, 1, 80, 3, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 68, 8, 2, 0, 3, 0, 2, 3, 2, 4, 2, 0, 15, 1, 83, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 7, 19, 58, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 343, 9, 54, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 10, 5350, 0, 7, 14, 11465, 27, 2343, 9, 87, 9, 39, 4, 60, 6, 26, 9, 535, 9, 470, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4178, 9, 519, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 245, 1, 2, 9, 726, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; +var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 4, 51, 13, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 39, 27, 10, 22, 251, 41, 7, 1, 17, 2, 60, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 31, 9, 2, 0, 3, 0, 2, 37, 2, 0, 26, 0, 2, 0, 45, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 200, 32, 32, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 26, 3994, 6, 582, 6842, 29, 1763, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 433, 44, 212, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 42, 9, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 229, 29, 3, 0, 496, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; +var nonASCIIidentifierChars = "‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࢗ-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-ᫎᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‌‍‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・"; +var nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-ࢎࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೝೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲊᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꟍꟐꟑꟓꟕ-Ƛꟲ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ"; +var reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" +}; +var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; +var keywords$1 = { + 5: ecma5AndLessKeywords, + "5module": ecma5AndLessKeywords + " export import", + 6: ecma5AndLessKeywords + " const class extends export import super" +}; +var keywordRelationalOperator = /^in(stanceof)?$/; +var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); +var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); +function isInAstralSet(code, set2) { + var pos = 65536; + for (var i = 0; i < set2.length; i += 2) { + pos += set2[i]; + if (pos > code) { + return false; + } + pos += set2[i + 1]; + if (pos >= code) { + return true; + } + } + return false; +} +function isIdentifierStart(code, astral) { + if (code < 65) { + return code === 36; + } + if (code < 91) { + return true; + } + if (code < 97) { + return code === 95; + } + if (code < 123) { + return true; + } + if (code <= 65535) { + return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + if (astral === false) { + return false; + } + return isInAstralSet(code, astralIdentifierStartCodes); +} +function isIdentifierChar(code, astral) { + if (code < 48) { + return code === 36; + } + if (code < 58) { + return true; + } + if (code < 65) { + return false; + } + if (code < 91) { + return true; + } + if (code < 97) { + return code === 95; + } + if (code < 123) { + return true; + } + if (code <= 65535) { + return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code)); + } + if (astral === false) { + return false; + } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); +} +var TokenType = function TokenType2(label, conf) { + if (conf === void 0) conf = {}; + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; +}; +function binop(name, prec) { + return new TokenType(name, { beforeExpr: true, binop: prec }); +} +var beforeExpr = { beforeExpr: true }, startsExpr = { startsExpr: true }; +var keywords = {}; +function kw(name, options2) { + if (options2 === void 0) options2 = {}; + options2.keyword = name; + return keywords[name] = new TokenType(name, options2); +} +var types$1 = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + privateId: new TokenType("privateId", startsExpr), + eof: new TokenType("eof"), + // Punctuation token types. + bracketL: new TokenType("[", { beforeExpr: true, startsExpr: true }), + bracketR: new TokenType("]"), + braceL: new TokenType("{", { beforeExpr: true, startsExpr: true }), + braceR: new TokenType("}"), + parenL: new TokenType("(", { beforeExpr: true, startsExpr: true }), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + questionDot: new TokenType("?."), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", { beforeExpr: true, startsExpr: true }), + // Operators. These carry several kinds of properties to help the + // parser use them properly (the presence of these properties is + // what categorizes them as operators). + // + // `binop`, when present, specifies that this operator is a binary + // operator, and will refer to its precedence. + // + // `prefix` and `postfix` mark the operator as a prefix or postfix + // unary operator. + // + // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as + // binary operators with a very low precedence, that should result + // in AssignmentExpression nodes. + eq: new TokenType("=", { beforeExpr: true, isAssign: true }), + assign: new TokenType("_=", { beforeExpr: true, isAssign: true }), + incDec: new TokenType("++/--", { prefix: true, postfix: true, startsExpr: true }), + prefix: new TokenType("!/~", { beforeExpr: true, prefix: true, startsExpr: true }), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=/===/!==", 6), + relational: binop("/<=/>=", 7), + bitShift: binop("<>/>>>", 8), + plusMin: new TokenType("+/-", { beforeExpr: true, binop: 9, prefix: true, startsExpr: true }), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", { beforeExpr: true }), + coalesce: binop("??", 1), + // Keyword token types. + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", { isLoop: true, beforeExpr: true }), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", { isLoop: true }), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", { isLoop: true }), + _with: kw("with"), + _new: kw("new", { beforeExpr: true, startsExpr: true }), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import", startsExpr), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", { beforeExpr: true, binop: 7 }), + _instanceof: kw("instanceof", { beforeExpr: true, binop: 7 }), + _typeof: kw("typeof", { beforeExpr: true, prefix: true, startsExpr: true }), + _void: kw("void", { beforeExpr: true, prefix: true, startsExpr: true }), + _delete: kw("delete", { beforeExpr: true, prefix: true, startsExpr: true }) +}; +var lineBreak = /\r\n?|\n|\u2028|\u2029/; +var lineBreakG = new RegExp(lineBreak.source, "g"); +function isNewLine(code) { + return code === 10 || code === 13 || code === 8232 || code === 8233; +} +function nextLineBreak(code, from2, end) { + if (end === void 0) end = code.length; + for (var i = from2; i < end; i++) { + var next = code.charCodeAt(i); + if (isNewLine(next)) { + return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1; + } + } + return -1; +} +var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/; +var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; +var ref = Object.prototype; +var hasOwnProperty = ref.hasOwnProperty; +var toString = ref.toString; +var hasOwn = Object.hasOwn || function(obj, propName) { + return hasOwnProperty.call(obj, propName); +}; +var isArray = Array.isArray || function(obj) { + return toString.call(obj) === "[object Array]"; +}; +var regexpCache = /* @__PURE__ */ Object.create(null); +function wordsRegexp(words) { + return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")); +} +function codePointToString(code) { + if (code <= 65535) { + return String.fromCharCode(code); + } + code -= 65536; + return String.fromCharCode((code >> 10) + 55296, (code & 1023) + 56320); +} +var loneSurrogate = /(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/; +var Position = function Position2(line, col) { + this.line = line; + this.column = col; +}; +Position.prototype.offset = function offset(n) { + return new Position(this.line, this.column + n); +}; +var SourceLocation = function SourceLocation2(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { + this.source = p.sourceFile; + } +}; +function getLineInfo(input, offset2) { + for (var line = 1, cur = 0; ; ) { + var nextBreak = nextLineBreak(input, cur, offset2); + if (nextBreak < 0) { + return new Position(line, offset2 - cur); + } + ++line; + cur = nextBreak; + } +} +var defaultOptions = { + // `ecmaVersion` indicates the ECMAScript version to parse. Must be + // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 + // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` + // (the latest version the library supports). This influences + // support for strict mode, the set of reserved words, and support + // for new syntax features. + ecmaVersion: null, + // `sourceType` indicates the mode the code should be parsed in. + // Can be either `"script"` or `"module"`. This influences global + // strict mode and parsing of `import` and `export` declarations. + sourceType: "script", + // `onInsertedSemicolon` can be a callback that will be called when + // a semicolon is automatically inserted. It will be passed the + // position of the inserted semicolon as an offset, and if + // `locations` is enabled, it is given the location as a `{line, + // column}` object as second argument. + onInsertedSemicolon: null, + // `onTrailingComma` is similar to `onInsertedSemicolon`, but for + // trailing commas. + onTrailingComma: null, + // By default, reserved words are only enforced if ecmaVersion >= 5. + // Set `allowReserved` to a boolean value to explicitly turn this on + // an off. When this option has the value "never", reserved words + // and keywords can also not be used as property names. + allowReserved: null, + // When enabled, a return at the top level is not considered an + // error. + allowReturnOutsideFunction: false, + // When enabled, import/export statements are not constrained to + // appearing at the top of the program, and an import.meta expression + // in a script isn't considered an error. + allowImportExportEverywhere: false, + // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022. + // When enabled, await identifiers are allowed to appear at the top-level scope, + // but they are still not allowed in non-async functions. + allowAwaitOutsideFunction: null, + // When enabled, super identifiers are not constrained to + // appearing in methods and do not raise an error when they appear elsewhere. + allowSuperOutsideMethod: null, + // When enabled, hashbang directive in the beginning of file is + // allowed and treated as a line comment. Enabled by default when + // `ecmaVersion` >= 2023. + allowHashBang: false, + // By default, the parser will verify that private properties are + // only used in places where they are valid and have been declared. + // Set this to false to turn such checks off. + checkPrivateFields: true, + // When `locations` is on, `loc` properties holding objects with + // `start` and `end` properties in `{line, column}` form (with + // line being 1-based and column 0-based) will be attached to the + // nodes. + locations: false, + // A function can be passed as `onToken` option, which will + // cause Acorn to call that function with object in the same + // format as tokens returned from `tokenizer().getToken()`. Note + // that you are not allowed to call the parser from the + // callback—that will corrupt its internal state. + onToken: null, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. Note that you are not allowed to call the + // parser from the callback—that will corrupt its internal state. + // When this option has an array as value, objects representing the + // comments are pushed to it. + onComment: null, + // Nodes have their start and end characters offsets recorded in + // `start` and `end` properties (directly on the node, rather than + // the `loc` object, which holds line/column data. To also add a + // [semi-standardized][range] `range` property holding a `[start, + // end]` array with the same numbers, set the `ranges` option to + // `true`. + // + // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + ranges: false, + // It is possible to parse multiple files into a single AST by + // passing the tree produced by parsing the first file as + // `program` option in subsequent parses. This will add the + // toplevel forms of the parsed file to the `Program` (top) node + // of an existing parse tree. + program: null, + // When `locations` is on, you can pass this to record the source + // file in every node's `loc` object. + sourceFile: null, + // This value, if given, is stored in every node, whether + // `locations` is on or off. + directSourceFile: null, + // When enabled, parenthesized expressions are represented by + // (non-standard) ParenthesizedExpression nodes + preserveParens: false +}; +var warnedAboutEcmaVersion = false; +function getOptions(opts) { + var options2 = {}; + for (var opt in defaultOptions) { + options2[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; + } + if (options2.ecmaVersion === "latest") { + options2.ecmaVersion = 1e8; + } else if (options2.ecmaVersion == null) { + if (!warnedAboutEcmaVersion && typeof console === "object" && console.warn) { + warnedAboutEcmaVersion = true; + console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future."); + } + options2.ecmaVersion = 11; + } else if (options2.ecmaVersion >= 2015) { + options2.ecmaVersion -= 2009; + } + if (options2.allowReserved == null) { + options2.allowReserved = options2.ecmaVersion < 5; + } + if (!opts || opts.allowHashBang == null) { + options2.allowHashBang = options2.ecmaVersion >= 14; + } + if (isArray(options2.onToken)) { + var tokens = options2.onToken; + options2.onToken = function(token) { + return tokens.push(token); + }; + } + if (isArray(options2.onComment)) { + options2.onComment = pushComment(options2, options2.onComment); + } + return options2; +} +function pushComment(options2, array) { + return function(block, text, start, end, startLoc, endLoc) { + var comment2 = { + type: block ? "Block" : "Line", + value: text, + start, + end + }; + if (options2.locations) { + comment2.loc = new SourceLocation(this, startLoc, endLoc); + } + if (options2.ranges) { + comment2.range = [start, end]; + } + array.push(comment2); + }; +} +var SCOPE_TOP = 1, SCOPE_FUNCTION = 2, SCOPE_ASYNC = 4, SCOPE_GENERATOR = 8, SCOPE_ARROW = 16, SCOPE_SIMPLE_CATCH = 32, SCOPE_SUPER = 64, SCOPE_DIRECT_SUPER = 128, SCOPE_CLASS_STATIC_BLOCK = 256, SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; +function functionFlags(async2, generator) { + return SCOPE_FUNCTION | (async2 ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0); +} +var BIND_NONE = 0, BIND_VAR = 1, BIND_LEXICAL = 2, BIND_FUNCTION = 3, BIND_SIMPLE_CATCH = 4, BIND_OUTSIDE = 5; +var Parser2 = function Parser3(options2, input, startPos) { + this.options = options2 = getOptions(options2); + this.sourceFile = options2.sourceFile; + this.keywords = wordsRegexp(keywords$1[options2.ecmaVersion >= 6 ? 6 : options2.sourceType === "module" ? "5module" : 5]); + var reserved = ""; + if (options2.allowReserved !== true) { + reserved = reservedWords[options2.ecmaVersion >= 6 ? 6 : options2.ecmaVersion === 5 ? 5 : 3]; + if (options2.sourceType === "module") { + reserved += " await"; + } + } + this.reservedWords = wordsRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = wordsRegexp(reservedStrict); + this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + this.containsEsc = false; + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + this.type = types$1.eof; + this.value = null; + this.start = this.end = this.pos; + this.startLoc = this.endLoc = this.curPosition(); + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + this.context = this.initialContext(); + this.exprAllowed = true; + this.inModule = options2.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + this.potentialArrowAt = -1; + this.potentialArrowInForAwait = false; + this.yieldPos = this.awaitPos = this.awaitIdentPos = 0; + this.labels = []; + this.undefinedExports = /* @__PURE__ */ Object.create(null); + if (this.pos === 0 && options2.allowHashBang && this.input.slice(0, 2) === "#!") { + this.skipLineComment(2); + } + this.scopeStack = []; + this.enterScope(SCOPE_TOP); + this.regexpState = null; + this.privateNameStack = []; +}; +var prototypeAccessors = { inFunction: { configurable: true }, inGenerator: { configurable: true }, inAsync: { configurable: true }, canAwait: { configurable: true }, allowSuper: { configurable: true }, allowDirectSuper: { configurable: true }, treatFunctionsAsVar: { configurable: true }, allowNewDotTarget: { configurable: true }, inClassStaticBlock: { configurable: true } }; +Parser2.prototype.parse = function parse() { + var node2 = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node2); +}; +prototypeAccessors.inFunction.get = function() { + return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0; +}; +prototypeAccessors.inGenerator.get = function() { + return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit; +}; +prototypeAccessors.inAsync.get = function() { + return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit; +}; +prototypeAccessors.canAwait.get = function() { + for (var i = this.scopeStack.length - 1; i >= 0; i--) { + var scope = this.scopeStack[i]; + if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { + return false; + } + if (scope.flags & SCOPE_FUNCTION) { + return (scope.flags & SCOPE_ASYNC) > 0; + } + } + return this.inModule && this.options.ecmaVersion >= 13 || this.options.allowAwaitOutsideFunction; +}; +prototypeAccessors.allowSuper.get = function() { + var ref2 = this.currentThisScope(); + var flags = ref2.flags; + var inClassFieldInit = ref2.inClassFieldInit; + return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod; +}; +prototypeAccessors.allowDirectSuper.get = function() { + return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0; +}; +prototypeAccessors.treatFunctionsAsVar.get = function() { + return this.treatFunctionsAsVarInScope(this.currentScope()); +}; +prototypeAccessors.allowNewDotTarget.get = function() { + var ref2 = this.currentThisScope(); + var flags = ref2.flags; + var inClassFieldInit = ref2.inClassFieldInit; + return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit; +}; +prototypeAccessors.inClassStaticBlock.get = function() { + return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0; +}; +Parser2.extend = function extend() { + var plugins = [], len = arguments.length; + while (len--) plugins[len] = arguments[len]; + var cls = this; + for (var i = 0; i < plugins.length; i++) { + cls = plugins[i](cls); + } + return cls; +}; +Parser2.parse = function parse2(input, options2) { + return new this(options2, input).parse(); +}; +Parser2.parseExpressionAt = function parseExpressionAt(input, pos, options2) { + var parser2 = new this(options2, input, pos); + parser2.nextToken(); + return parser2.parseExpression(); +}; +Parser2.tokenizer = function tokenizer(input, options2) { + return new this(options2, input); +}; +Object.defineProperties(Parser2.prototype, prototypeAccessors); +var pp$9 = Parser2.prototype; +var literal = /^(?:'((?:\\[^]|[^'\\])*?)'|"((?:\\[^]|[^"\\])*?)")/; +pp$9.strictDirective = function(start) { + if (this.options.ecmaVersion < 5) { + return false; + } + for (; ; ) { + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + var match = literal.exec(this.input.slice(start)); + if (!match) { + return false; + } + if ((match[1] || match[2]) === "use strict") { + skipWhiteSpace.lastIndex = start + match[0].length; + var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length; + var next = this.input.charAt(end); + return next === ";" || next === "}" || lineBreak.test(spaceAfter[0]) && !(/[(`.[+\-/*%<>=,?^&]/.test(next) || next === "!" && this.input.charAt(end + 1) === "="); + } + start += match[0].length; + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + if (this.input[start] === ";") { + start++; + } + } +}; +pp$9.eat = function(type2) { + if (this.type === type2) { + this.next(); + return true; + } else { + return false; + } +}; +pp$9.isContextual = function(name) { + return this.type === types$1.name && this.value === name && !this.containsEsc; +}; +pp$9.eatContextual = function(name) { + if (!this.isContextual(name)) { + return false; + } + this.next(); + return true; +}; +pp$9.expectContextual = function(name) { + if (!this.eatContextual(name)) { + this.unexpected(); + } +}; +pp$9.canInsertSemicolon = function() { + return this.type === types$1.eof || this.type === types$1.braceR || lineBreak.test(this.input.slice(this.lastTokEnd, this.start)); +}; +pp$9.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) { + this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); + } + return true; + } +}; +pp$9.semicolon = function() { + if (!this.eat(types$1.semi) && !this.insertSemicolon()) { + this.unexpected(); + } +}; +pp$9.afterTrailingComma = function(tokType, notNext) { + if (this.type === tokType) { + if (this.options.onTrailingComma) { + this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); + } + if (!notNext) { + this.next(); + } + return true; + } +}; +pp$9.expect = function(type2) { + this.eat(type2) || this.unexpected(); +}; +pp$9.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); +}; +var DestructuringErrors = function DestructuringErrors2() { + this.shorthandAssign = this.trailingComma = this.parenthesizedAssign = this.parenthesizedBind = this.doubleProto = -1; +}; +pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { + return; + } + if (refDestructuringErrors.trailingComma > -1) { + this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); + } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { + this.raiseRecoverable(parens, isAssign ? "Assigning to rvalue" : "Parenthesized pattern"); + } +}; +pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + if (!refDestructuringErrors) { + return false; + } + var shorthandAssign = refDestructuringErrors.shorthandAssign; + var doubleProto = refDestructuringErrors.doubleProto; + if (!andThrow) { + return shorthandAssign >= 0 || doubleProto >= 0; + } + if (shorthandAssign >= 0) { + this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); + } + if (doubleProto >= 0) { + this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); + } +}; +pp$9.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) { + this.raise(this.yieldPos, "Yield expression cannot be a default value"); + } + if (this.awaitPos) { + this.raise(this.awaitPos, "Await expression cannot be a default value"); + } +}; +pp$9.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") { + return this.isSimpleAssignTarget(expr.expression); + } + return expr.type === "Identifier" || expr.type === "MemberExpression"; +}; +var pp$8 = Parser2.prototype; +pp$8.parseTopLevel = function(node2) { + var exports = /* @__PURE__ */ Object.create(null); + if (!node2.body) { + node2.body = []; + } + while (this.type !== types$1.eof) { + var stmt = this.parseStatement(null, true, exports); + node2.body.push(stmt); + } + if (this.inModule) { + for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1) { + var name = list[i]; + this.raiseRecoverable(this.undefinedExports[name].start, "Export '" + name + "' is not defined"); + } + } + this.adaptDirectivePrologue(node2.body); + this.next(); + node2.sourceType = this.options.sourceType; + return this.finishNode(node2, "Program"); +}; +var loopLabel = { kind: "loop" }, switchLabel = { kind: "switch" }; +pp$8.isLet = function(context) { + if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { + return false; + } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 91 || nextCh === 92) { + return true; + } + if (context) { + return false; + } + if (nextCh === 123 || nextCh > 55295 && nextCh < 56320) { + return true; + } + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { + ++pos; + } + if (nextCh === 92 || nextCh > 55295 && nextCh < 56320) { + return true; + } + var ident = this.input.slice(next, pos); + if (!keywordRelationalOperator.test(ident)) { + return true; + } + } + return false; +}; +pp$8.isAsyncFunction = function() { + if (this.options.ecmaVersion < 8 || !this.isContextual("async")) { + return false; + } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, after; + return !lineBreak.test(this.input.slice(this.pos, next)) && this.input.slice(next, next + 8) === "function" && (next + 8 === this.input.length || !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 55295 && after < 56320)); +}; +pp$8.parseStatement = function(context, topLevel, exports) { + var starttype = this.type, node2 = this.startNode(), kind; + if (this.isLet(context)) { + starttype = types$1._var; + kind = "let"; + } + switch (starttype) { + case types$1._break: + case types$1._continue: + return this.parseBreakContinueStatement(node2, starttype.keyword); + case types$1._debugger: + return this.parseDebuggerStatement(node2); + case types$1._do: + return this.parseDoStatement(node2); + case types$1._for: + return this.parseForStatement(node2); + case types$1._function: + if (context && (this.strict || context !== "if" && context !== "label") && this.options.ecmaVersion >= 6) { + this.unexpected(); + } + return this.parseFunctionStatement(node2, false, !context); + case types$1._class: + if (context) { + this.unexpected(); + } + return this.parseClass(node2, true); + case types$1._if: + return this.parseIfStatement(node2); + case types$1._return: + return this.parseReturnStatement(node2); + case types$1._switch: + return this.parseSwitchStatement(node2); + case types$1._throw: + return this.parseThrowStatement(node2); + case types$1._try: + return this.parseTryStatement(node2); + case types$1._const: + case types$1._var: + kind = kind || this.value; + if (context && kind !== "var") { + this.unexpected(); + } + return this.parseVarStatement(node2, kind); + case types$1._while: + return this.parseWhileStatement(node2); + case types$1._with: + return this.parseWithStatement(node2); + case types$1.braceL: + return this.parseBlock(true, node2); + case types$1.semi: + return this.parseEmptyStatement(node2); + case types$1._export: + case types$1._import: + if (this.options.ecmaVersion > 10 && starttype === types$1._import) { + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 40 || nextCh === 46) { + return this.parseExpressionStatement(node2, this.parseExpression()); + } + } + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) { + this.raise(this.start, "'import' and 'export' may only appear at the top level"); + } + if (!this.inModule) { + this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); + } + } + return starttype === types$1._import ? this.parseImport(node2) : this.parseExport(node2, exports); + // If the statement does not start with a statement keyword or a + // brace, it's an ExpressionStatement or LabeledStatement. We + // simply start parsing an expression, and afterwards, if the + // next token is a colon and the expression was a simple + // Identifier node, we switch to interpreting it as a label. + default: + if (this.isAsyncFunction()) { + if (context) { + this.unexpected(); + } + this.next(); + return this.parseFunctionStatement(node2, true, !context); + } + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon)) { + return this.parseLabeledStatement(node2, maybeName, expr, context); + } else { + return this.parseExpressionStatement(node2, expr); + } + } +}; +pp$8.parseBreakContinueStatement = function(node2, keyword) { + var isBreak = keyword === "break"; + this.next(); + if (this.eat(types$1.semi) || this.insertSemicolon()) { + node2.label = null; + } else if (this.type !== types$1.name) { + this.unexpected(); + } else { + node2.label = this.parseIdent(); + this.semicolon(); + } + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this.labels[i]; + if (node2.label == null || lab.name === node2.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { + break; + } + if (node2.label && isBreak) { + break; + } + } + } + if (i === this.labels.length) { + this.raise(node2.start, "Unsyntactic " + keyword); + } + return this.finishNode(node2, isBreak ? "BreakStatement" : "ContinueStatement"); +}; +pp$8.parseDebuggerStatement = function(node2) { + this.next(); + this.semicolon(); + return this.finishNode(node2, "DebuggerStatement"); +}; +pp$8.parseDoStatement = function(node2) { + this.next(); + this.labels.push(loopLabel); + node2.body = this.parseStatement("do"); + this.labels.pop(); + this.expect(types$1._while); + node2.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) { + this.eat(types$1.semi); + } else { + this.semicolon(); + } + return this.finishNode(node2, "DoWhileStatement"); +}; +pp$8.parseForStatement = function(node2) { + this.next(); + var awaitAt = this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual("await") ? this.lastTokStart : -1; + this.labels.push(loopLabel); + this.enterScope(0); + this.expect(types$1.parenL); + if (this.type === types$1.semi) { + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + return this.parseFor(node2, null); + } + var isLet = this.isLet(); + if (this.type === types$1._var || this.type === types$1._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types$1._in || this.options.ecmaVersion >= 6 && this.isContextual("of")) && init$1.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + } else { + node2.await = awaitAt > -1; + } + } + return this.parseForIn(node2, init$1); + } + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + return this.parseFor(node2, init$1); + } + var startsWithLet = this.isContextual("let"), isForOf = false; + var containsEsc = this.containsEsc; + var refDestructuringErrors = new DestructuringErrors(); + var initPos = this.start; + var init = awaitAt > -1 ? this.parseExprSubscripts(refDestructuringErrors, "await") : this.parseExpression(true, refDestructuringErrors); + if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + if (awaitAt > -1) { + if (this.type === types$1._in) { + this.unexpected(awaitAt); + } + node2.await = true; + } else if (isForOf && this.options.ecmaVersion >= 8) { + if (init.start === initPos && !containsEsc && init.type === "Identifier" && init.name === "async") { + this.unexpected(); + } else if (this.options.ecmaVersion >= 9) { + node2.await = false; + } + } + if (startsWithLet && isForOf) { + this.raise(init.start, "The left-hand side of a for-of loop may not start with 'let'."); + } + this.toAssignable(init, false, refDestructuringErrors); + this.checkLValPattern(init); + return this.parseForIn(node2, init); + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + return this.parseFor(node2, init); +}; +pp$8.parseFunctionStatement = function(node2, isAsync, declarationPosition) { + this.next(); + return this.parseFunction(node2, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync); +}; +pp$8.parseIfStatement = function(node2) { + this.next(); + node2.test = this.parseParenExpression(); + node2.consequent = this.parseStatement("if"); + node2.alternate = this.eat(types$1._else) ? this.parseStatement("if") : null; + return this.finishNode(node2, "IfStatement"); +}; +pp$8.parseReturnStatement = function(node2) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) { + this.raise(this.start, "'return' outside of function"); + } + this.next(); + if (this.eat(types$1.semi) || this.insertSemicolon()) { + node2.argument = null; + } else { + node2.argument = this.parseExpression(); + this.semicolon(); + } + return this.finishNode(node2, "ReturnStatement"); +}; +pp$8.parseSwitchStatement = function(node2) { + this.next(); + node2.discriminant = this.parseParenExpression(); + node2.cases = []; + this.expect(types$1.braceL); + this.labels.push(switchLabel); + this.enterScope(0); + var cur; + for (var sawDefault = false; this.type !== types$1.braceR; ) { + if (this.type === types$1._case || this.type === types$1._default) { + var isCase = this.type === types$1._case; + if (cur) { + this.finishNode(cur, "SwitchCase"); + } + node2.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) { + this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); + } + sawDefault = true; + cur.test = null; + } + this.expect(types$1.colon); + } else { + if (!cur) { + this.unexpected(); + } + cur.consequent.push(this.parseStatement(null)); + } + } + this.exitScope(); + if (cur) { + this.finishNode(cur, "SwitchCase"); + } + this.next(); + this.labels.pop(); + return this.finishNode(node2, "SwitchStatement"); +}; +pp$8.parseThrowStatement = function(node2) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) { + this.raise(this.lastTokEnd, "Illegal newline after throw"); + } + node2.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node2, "ThrowStatement"); +}; +var empty$1 = []; +pp$8.parseCatchClauseParam = function() { + var param = this.parseBindingAtom(); + var simple = param.type === "Identifier"; + this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); + this.checkLValPattern(param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); + this.expect(types$1.parenR); + return param; +}; +pp$8.parseTryStatement = function(node2) { + this.next(); + node2.block = this.parseBlock(); + node2.handler = null; + if (this.type === types$1._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(types$1.parenL)) { + clause.param = this.parseCatchClauseParam(); + } else { + if (this.options.ecmaVersion < 10) { + this.unexpected(); + } + clause.param = null; + this.enterScope(0); + } + clause.body = this.parseBlock(false); + this.exitScope(); + node2.handler = this.finishNode(clause, "CatchClause"); + } + node2.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null; + if (!node2.handler && !node2.finalizer) { + this.raise(node2.start, "Missing catch or finally clause"); + } + return this.finishNode(node2, "TryStatement"); +}; +pp$8.parseVarStatement = function(node2, kind, allowMissingInitializer) { + this.next(); + this.parseVar(node2, false, kind, allowMissingInitializer); + this.semicolon(); + return this.finishNode(node2, "VariableDeclaration"); +}; +pp$8.parseWhileStatement = function(node2) { + this.next(); + node2.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node2.body = this.parseStatement("while"); + this.labels.pop(); + return this.finishNode(node2, "WhileStatement"); +}; +pp$8.parseWithStatement = function(node2) { + if (this.strict) { + this.raise(this.start, "'with' in strict mode"); + } + this.next(); + node2.object = this.parseParenExpression(); + node2.body = this.parseStatement("with"); + return this.finishNode(node2, "WithStatement"); +}; +pp$8.parseEmptyStatement = function(node2) { + this.next(); + return this.finishNode(node2, "EmptyStatement"); +}; +pp$8.parseLabeledStatement = function(node2, maybeName, expr, context) { + for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1) { + var label = list[i$1]; + if (label.name === maybeName) { + this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } + } + var kind = this.type.isLoop ? "loop" : this.type === types$1._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this.labels[i]; + if (label$1.statementStart === node2.start) { + label$1.statementStart = this.start; + label$1.kind = kind; + } else { + break; + } + } + this.labels.push({ name: maybeName, kind, statementStart: this.start }); + node2.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); + this.labels.pop(); + node2.label = expr; + return this.finishNode(node2, "LabeledStatement"); +}; +pp$8.parseExpressionStatement = function(node2, expr) { + node2.expression = expr; + this.semicolon(); + return this.finishNode(node2, "ExpressionStatement"); +}; +pp$8.parseBlock = function(createNewLexicalScope, node2, exitStrict) { + if (createNewLexicalScope === void 0) createNewLexicalScope = true; + if (node2 === void 0) node2 = this.startNode(); + node2.body = []; + this.expect(types$1.braceL); + if (createNewLexicalScope) { + this.enterScope(0); + } + while (this.type !== types$1.braceR) { + var stmt = this.parseStatement(null); + node2.body.push(stmt); + } + if (exitStrict) { + this.strict = false; + } + this.next(); + if (createNewLexicalScope) { + this.exitScope(); + } + return this.finishNode(node2, "BlockStatement"); +}; +pp$8.parseFor = function(node2, init) { + node2.init = init; + this.expect(types$1.semi); + node2.test = this.type === types$1.semi ? null : this.parseExpression(); + this.expect(types$1.semi); + node2.update = this.type === types$1.parenR ? null : this.parseExpression(); + this.expect(types$1.parenR); + node2.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node2, "ForStatement"); +}; +pp$8.parseForIn = function(node2, init) { + var isForIn = this.type === types$1._in; + this.next(); + if (init.type === "VariableDeclaration" && init.declarations[0].init != null && (!isForIn || this.options.ecmaVersion < 8 || this.strict || init.kind !== "var" || init.declarations[0].id.type !== "Identifier")) { + this.raise( + init.start, + (isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer" + ); + } + node2.left = init; + node2.right = isForIn ? this.parseExpression() : this.parseMaybeAssign(); + this.expect(types$1.parenR); + node2.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node2, isForIn ? "ForInStatement" : "ForOfStatement"); +}; +pp$8.parseVar = function(node2, isFor, kind, allowMissingInitializer) { + node2.declarations = []; + node2.kind = kind; + for (; ; ) { + var decl = this.startNode(); + this.parseVarId(decl, kind); + if (this.eat(types$1.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else if (!allowMissingInitializer && kind === "const" && !(this.type === types$1._in || this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + this.unexpected(); + } else if (!allowMissingInitializer && decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) { + this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node2.declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(types$1.comma)) { + break; + } + } + return node2; +}; +pp$8.parseVarId = function(decl, kind) { + decl.id = this.parseBindingAtom(); + this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); +}; +var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4; +pp$8.parseFunction = function(node2, statement, allowExpressionBody, isAsync, forInit) { + this.initFunction(node2); + if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { + if (this.type === types$1.star && statement & FUNC_HANGING_STATEMENT) { + this.unexpected(); + } + node2.generator = this.eat(types$1.star); + } + if (this.options.ecmaVersion >= 8) { + node2.async = !!isAsync; + } + if (statement & FUNC_STATEMENT) { + node2.id = statement & FUNC_NULLABLE_ID && this.type !== types$1.name ? null : this.parseIdent(); + if (node2.id && !(statement & FUNC_HANGING_STATEMENT)) { + this.checkLValSimple(node2.id, this.strict || node2.generator || node2.async ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); + } + } + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(node2.async, node2.generator)); + if (!(statement & FUNC_STATEMENT)) { + node2.id = this.type === types$1.name ? this.parseIdent() : null; + } + this.parseFunctionParams(node2); + this.parseFunctionBody(node2, allowExpressionBody, false, forInit); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node2, statement & FUNC_STATEMENT ? "FunctionDeclaration" : "FunctionExpression"); +}; +pp$8.parseFunctionParams = function(node2) { + this.expect(types$1.parenL); + node2.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); +}; +pp$8.parseClass = function(node2, isStatement) { + this.next(); + var oldStrict = this.strict; + this.strict = true; + this.parseClassId(node2, isStatement); + this.parseClassSuper(node2); + var privateNameMap = this.enterClassBody(); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types$1.braceL); + while (this.type !== types$1.braceR) { + var element = this.parseClassElement(node2.superClass !== null); + if (element) { + classBody.body.push(element); + if (element.type === "MethodDefinition" && element.kind === "constructor") { + if (hadConstructor) { + this.raiseRecoverable(element.start, "Duplicate constructor in the same class"); + } + hadConstructor = true; + } else if (element.key && element.key.type === "PrivateIdentifier" && isPrivateNameConflicted(privateNameMap, element)) { + this.raiseRecoverable(element.key.start, "Identifier '#" + element.key.name + "' has already been declared"); + } + } + } + this.strict = oldStrict; + this.next(); + node2.body = this.finishNode(classBody, "ClassBody"); + this.exitClassBody(); + return this.finishNode(node2, isStatement ? "ClassDeclaration" : "ClassExpression"); +}; +pp$8.parseClassElement = function(constructorAllowsSuper) { + if (this.eat(types$1.semi)) { + return null; + } + var ecmaVersion = this.options.ecmaVersion; + var node2 = this.startNode(); + var keyName = ""; + var isGenerator = false; + var isAsync = false; + var kind = "method"; + var isStatic = false; + if (this.eatContextual("static")) { + if (ecmaVersion >= 13 && this.eat(types$1.braceL)) { + this.parseClassStaticBlock(node2); + return node2; + } + if (this.isClassElementNameStart() || this.type === types$1.star) { + isStatic = true; + } else { + keyName = "static"; + } + } + node2.static = isStatic; + if (!keyName && ecmaVersion >= 8 && this.eatContextual("async")) { + if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) { + isAsync = true; + } else { + keyName = "async"; + } + } + if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) { + isGenerator = true; + } + if (!keyName && !isAsync && !isGenerator) { + var lastValue = this.value; + if (this.eatContextual("get") || this.eatContextual("set")) { + if (this.isClassElementNameStart()) { + kind = lastValue; + } else { + keyName = lastValue; + } + } + } + if (keyName) { + node2.computed = false; + node2.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc); + node2.key.name = keyName; + this.finishNode(node2.key, "Identifier"); + } else { + this.parseClassElementName(node2); + } + if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== "method" || isGenerator || isAsync) { + var isConstructor = !node2.static && checkKeyName(node2, "constructor"); + var allowsDirectSuper = isConstructor && constructorAllowsSuper; + if (isConstructor && kind !== "method") { + this.raise(node2.key.start, "Constructor can't have get/set modifier"); + } + node2.kind = isConstructor ? "constructor" : kind; + this.parseClassMethod(node2, isGenerator, isAsync, allowsDirectSuper); + } else { + this.parseClassField(node2); + } + return node2; +}; +pp$8.isClassElementNameStart = function() { + return this.type === types$1.name || this.type === types$1.privateId || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword; +}; +pp$8.parseClassElementName = function(element) { + if (this.type === types$1.privateId) { + if (this.value === "constructor") { + this.raise(this.start, "Classes can't have an element named '#constructor'"); + } + element.computed = false; + element.key = this.parsePrivateIdent(); + } else { + this.parsePropertyName(element); + } +}; +pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { + var key2 = method.key; + if (method.kind === "constructor") { + if (isGenerator) { + this.raise(key2.start, "Constructor can't be a generator"); + } + if (isAsync) { + this.raise(key2.start, "Constructor can't be an async method"); + } + } else if (method.static && checkKeyName(method, "prototype")) { + this.raise(key2.start, "Classes may not have a static property named prototype"); + } + var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); + if (method.kind === "get" && value.params.length !== 0) { + this.raiseRecoverable(value.start, "getter should have no params"); + } + if (method.kind === "set" && value.params.length !== 1) { + this.raiseRecoverable(value.start, "setter should have exactly one param"); + } + if (method.kind === "set" && value.params[0].type === "RestElement") { + this.raiseRecoverable(value.params[0].start, "Setter cannot use rest params"); + } + return this.finishNode(method, "MethodDefinition"); +}; +pp$8.parseClassField = function(field) { + if (checkKeyName(field, "constructor")) { + this.raise(field.key.start, "Classes can't have a field named 'constructor'"); + } else if (field.static && checkKeyName(field, "prototype")) { + this.raise(field.key.start, "Classes can't have a static field named 'prototype'"); + } + if (this.eat(types$1.eq)) { + var scope = this.currentThisScope(); + var inClassFieldInit = scope.inClassFieldInit; + scope.inClassFieldInit = true; + field.value = this.parseMaybeAssign(); + scope.inClassFieldInit = inClassFieldInit; + } else { + field.value = null; + } + this.semicolon(); + return this.finishNode(field, "PropertyDefinition"); +}; +pp$8.parseClassStaticBlock = function(node2) { + node2.body = []; + var oldLabels = this.labels; + this.labels = []; + this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER); + while (this.type !== types$1.braceR) { + var stmt = this.parseStatement(null); + node2.body.push(stmt); + } + this.next(); + this.exitScope(); + this.labels = oldLabels; + return this.finishNode(node2, "StaticBlock"); +}; +pp$8.parseClassId = function(node2, isStatement) { + if (this.type === types$1.name) { + node2.id = this.parseIdent(); + if (isStatement) { + this.checkLValSimple(node2.id, BIND_LEXICAL, false); + } + } else { + if (isStatement === true) { + this.unexpected(); + } + node2.id = null; + } +}; +pp$8.parseClassSuper = function(node2) { + node2.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(null, false) : null; +}; +pp$8.enterClassBody = function() { + var element = { declared: /* @__PURE__ */ Object.create(null), used: [] }; + this.privateNameStack.push(element); + return element.declared; +}; +pp$8.exitClassBody = function() { + var ref2 = this.privateNameStack.pop(); + var declared = ref2.declared; + var used = ref2.used; + if (!this.options.checkPrivateFields) { + return; + } + var len = this.privateNameStack.length; + var parent = len === 0 ? null : this.privateNameStack[len - 1]; + for (var i = 0; i < used.length; ++i) { + var id = used[i]; + if (!hasOwn(declared, id.name)) { + if (parent) { + parent.used.push(id); + } else { + this.raiseRecoverable(id.start, "Private field '#" + id.name + "' must be declared in an enclosing class"); + } + } + } +}; +function isPrivateNameConflicted(privateNameMap, element) { + var name = element.key.name; + var curr = privateNameMap[name]; + var next = "true"; + if (element.type === "MethodDefinition" && (element.kind === "get" || element.kind === "set")) { + next = (element.static ? "s" : "i") + element.kind; + } + if (curr === "iget" && next === "iset" || curr === "iset" && next === "iget" || curr === "sget" && next === "sset" || curr === "sset" && next === "sget") { + privateNameMap[name] = "true"; + return false; + } else if (!curr) { + privateNameMap[name] = next; + return false; + } else { + return true; + } +} +function checkKeyName(node2, name) { + var computed = node2.computed; + var key2 = node2.key; + return !computed && (key2.type === "Identifier" && key2.name === name || key2.type === "Literal" && key2.value === name); +} +pp$8.parseExportAllDeclaration = function(node2, exports) { + if (this.options.ecmaVersion >= 11) { + if (this.eatContextual("as")) { + node2.exported = this.parseModuleExportName(); + this.checkExport(exports, node2.exported, this.lastTokStart); + } else { + node2.exported = null; + } + } + this.expectContextual("from"); + if (this.type !== types$1.string) { + this.unexpected(); + } + node2.source = this.parseExprAtom(); + if (this.options.ecmaVersion >= 16) { + node2.attributes = this.parseWithClause(); + } + this.semicolon(); + return this.finishNode(node2, "ExportAllDeclaration"); +}; +pp$8.parseExport = function(node2, exports) { + this.next(); + if (this.eat(types$1.star)) { + return this.parseExportAllDeclaration(node2, exports); + } + if (this.eat(types$1._default)) { + this.checkExport(exports, "default", this.lastTokStart); + node2.declaration = this.parseExportDefaultDeclaration(); + return this.finishNode(node2, "ExportDefaultDeclaration"); + } + if (this.shouldParseExportStatement()) { + node2.declaration = this.parseExportDeclaration(node2); + if (node2.declaration.type === "VariableDeclaration") { + this.checkVariableExport(exports, node2.declaration.declarations); + } else { + this.checkExport(exports, node2.declaration.id, node2.declaration.id.start); + } + node2.specifiers = []; + node2.source = null; + } else { + node2.declaration = null; + node2.specifiers = this.parseExportSpecifiers(exports); + if (this.eatContextual("from")) { + if (this.type !== types$1.string) { + this.unexpected(); + } + node2.source = this.parseExprAtom(); + if (this.options.ecmaVersion >= 16) { + node2.attributes = this.parseWithClause(); + } + } else { + for (var i = 0, list = node2.specifiers; i < list.length; i += 1) { + var spec = list[i]; + this.checkUnreserved(spec.local); + this.checkLocalExport(spec.local); + if (spec.local.type === "Literal") { + this.raise(spec.local.start, "A string literal cannot be used as an exported binding without `from`."); + } + } + node2.source = null; + } + this.semicolon(); + } + return this.finishNode(node2, "ExportNamedDeclaration"); +}; +pp$8.parseExportDeclaration = function(node2) { + return this.parseStatement(null); +}; +pp$8.parseExportDefaultDeclaration = function() { + var isAsync; + if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { + this.next(); + } + return this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync); + } else if (this.type === types$1._class) { + var cNode = this.startNode(); + return this.parseClass(cNode, "nullableID"); + } else { + var declaration = this.parseMaybeAssign(); + this.semicolon(); + return declaration; + } +}; +pp$8.checkExport = function(exports, name, pos) { + if (!exports) { + return; + } + if (typeof name !== "string") { + name = name.type === "Identifier" ? name.name : name.value; + } + if (hasOwn(exports, name)) { + this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); + } + exports[name] = true; +}; +pp$8.checkPatternExport = function(exports, pat) { + var type2 = pat.type; + if (type2 === "Identifier") { + this.checkExport(exports, pat, pat.start); + } else if (type2 === "ObjectPattern") { + for (var i = 0, list = pat.properties; i < list.length; i += 1) { + var prop = list[i]; + this.checkPatternExport(exports, prop); + } + } else if (type2 === "ArrayPattern") { + for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + if (elt) { + this.checkPatternExport(exports, elt); + } + } + } else if (type2 === "Property") { + this.checkPatternExport(exports, pat.value); + } else if (type2 === "AssignmentPattern") { + this.checkPatternExport(exports, pat.left); + } else if (type2 === "RestElement") { + this.checkPatternExport(exports, pat.argument); + } +}; +pp$8.checkVariableExport = function(exports, decls) { + if (!exports) { + return; + } + for (var i = 0, list = decls; i < list.length; i += 1) { + var decl = list[i]; + this.checkPatternExport(exports, decl.id); + } +}; +pp$8.shouldParseExportStatement = function() { + return this.type.keyword === "var" || this.type.keyword === "const" || this.type.keyword === "class" || this.type.keyword === "function" || this.isLet() || this.isAsyncFunction(); +}; +pp$8.parseExportSpecifier = function(exports) { + var node2 = this.startNode(); + node2.local = this.parseModuleExportName(); + node2.exported = this.eatContextual("as") ? this.parseModuleExportName() : node2.local; + this.checkExport( + exports, + node2.exported, + node2.exported.start + ); + return this.finishNode(node2, "ExportSpecifier"); +}; +pp$8.parseExportSpecifiers = function(exports) { + var nodes = [], first = true; + this.expect(types$1.braceL); + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first = false; + } + nodes.push(this.parseExportSpecifier(exports)); + } + return nodes; +}; +pp$8.parseImport = function(node2) { + this.next(); + if (this.type === types$1.string) { + node2.specifiers = empty$1; + node2.source = this.parseExprAtom(); + } else { + node2.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node2.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected(); + } + if (this.options.ecmaVersion >= 16) { + node2.attributes = this.parseWithClause(); + } + this.semicolon(); + return this.finishNode(node2, "ImportDeclaration"); +}; +pp$8.parseImportSpecifier = function() { + var node2 = this.startNode(); + node2.imported = this.parseModuleExportName(); + if (this.eatContextual("as")) { + node2.local = this.parseIdent(); + } else { + this.checkUnreserved(node2.imported); + node2.local = node2.imported; + } + this.checkLValSimple(node2.local, BIND_LEXICAL); + return this.finishNode(node2, "ImportSpecifier"); +}; +pp$8.parseImportDefaultSpecifier = function() { + var node2 = this.startNode(); + node2.local = this.parseIdent(); + this.checkLValSimple(node2.local, BIND_LEXICAL); + return this.finishNode(node2, "ImportDefaultSpecifier"); +}; +pp$8.parseImportNamespaceSpecifier = function() { + var node2 = this.startNode(); + this.next(); + this.expectContextual("as"); + node2.local = this.parseIdent(); + this.checkLValSimple(node2.local, BIND_LEXICAL); + return this.finishNode(node2, "ImportNamespaceSpecifier"); +}; +pp$8.parseImportSpecifiers = function() { + var nodes = [], first = true; + if (this.type === types$1.name) { + nodes.push(this.parseImportDefaultSpecifier()); + if (!this.eat(types$1.comma)) { + return nodes; + } + } + if (this.type === types$1.star) { + nodes.push(this.parseImportNamespaceSpecifier()); + return nodes; + } + this.expect(types$1.braceL); + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first = false; + } + nodes.push(this.parseImportSpecifier()); + } + return nodes; +}; +pp$8.parseWithClause = function() { + var nodes = []; + if (!this.eat(types$1._with)) { + return nodes; + } + this.expect(types$1.braceL); + var attributeKeys = {}; + var first = true; + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first = false; + } + var attr = this.parseImportAttribute(); + var keyName = attr.key.type === "Identifier" ? attr.key.name : attr.key.value; + if (hasOwn(attributeKeys, keyName)) { + this.raiseRecoverable(attr.key.start, "Duplicate attribute key '" + keyName + "'"); + } + attributeKeys[keyName] = true; + nodes.push(attr); + } + return nodes; +}; +pp$8.parseImportAttribute = function() { + var node2 = this.startNode(); + node2.key = this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never"); + this.expect(types$1.colon); + if (this.type !== types$1.string) { + this.unexpected(); + } + node2.value = this.parseExprAtom(); + return this.finishNode(node2, "ImportAttribute"); +}; +pp$8.parseModuleExportName = function() { + if (this.options.ecmaVersion >= 13 && this.type === types$1.string) { + var stringLiteral = this.parseLiteral(this.value); + if (loneSurrogate.test(stringLiteral.value)) { + this.raise(stringLiteral.start, "An export name cannot include a lone surrogate."); + } + return stringLiteral; + } + return this.parseIdent(true); +}; +pp$8.adaptDirectivePrologue = function(statements) { + for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { + statements[i].directive = statements[i].expression.raw.slice(1, -1); + } +}; +pp$8.isDirectiveCandidate = function(statement) { + return this.options.ecmaVersion >= 5 && statement.type === "ExpressionStatement" && statement.expression.type === "Literal" && typeof statement.expression.value === "string" && // Reject parenthesized strings. + (this.input[statement.start] === '"' || this.input[statement.start] === "'"); +}; +var pp$7 = Parser2.prototype; +pp$7.toAssignable = function(node2, isBinding, refDestructuringErrors) { + if (this.options.ecmaVersion >= 6 && node2) { + switch (node2.type) { + case "Identifier": + if (this.inAsync && node2.name === "await") { + this.raise(node2.start, "Cannot use 'await' as identifier inside an async function"); + } + break; + case "ObjectPattern": + case "ArrayPattern": + case "AssignmentPattern": + case "RestElement": + break; + case "ObjectExpression": + node2.type = "ObjectPattern"; + if (refDestructuringErrors) { + this.checkPatternErrors(refDestructuringErrors, true); + } + for (var i = 0, list = node2.properties; i < list.length; i += 1) { + var prop = list[i]; + this.toAssignable(prop, isBinding); + if (prop.type === "RestElement" && (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern")) { + this.raise(prop.argument.start, "Unexpected token"); + } + } + break; + case "Property": + if (node2.kind !== "init") { + this.raise(node2.key.start, "Object pattern can't contain getter or setter"); + } + this.toAssignable(node2.value, isBinding); + break; + case "ArrayExpression": + node2.type = "ArrayPattern"; + if (refDestructuringErrors) { + this.checkPatternErrors(refDestructuringErrors, true); + } + this.toAssignableList(node2.elements, isBinding); + break; + case "SpreadElement": + node2.type = "RestElement"; + this.toAssignable(node2.argument, isBinding); + if (node2.argument.type === "AssignmentPattern") { + this.raise(node2.argument.start, "Rest elements cannot have a default value"); + } + break; + case "AssignmentExpression": + if (node2.operator !== "=") { + this.raise(node2.left.end, "Only '=' operator can be used for specifying default value."); + } + node2.type = "AssignmentPattern"; + delete node2.operator; + this.toAssignable(node2.left, isBinding); + break; + case "ParenthesizedExpression": + this.toAssignable(node2.expression, isBinding, refDestructuringErrors); + break; + case "ChainExpression": + this.raiseRecoverable(node2.start, "Optional chaining cannot appear in left-hand side"); + break; + case "MemberExpression": + if (!isBinding) { + break; + } + default: + this.raise(node2.start, "Assigning to rvalue"); + } + } else if (refDestructuringErrors) { + this.checkPatternErrors(refDestructuringErrors, true); + } + return node2; +}; +pp$7.toAssignableList = function(exprList, isBinding) { + var end = exprList.length; + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { + this.toAssignable(elt, isBinding); + } + } + if (end) { + var last = exprList[end - 1]; + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") { + this.unexpected(last.argument.start); + } + } + return exprList; +}; +pp$7.parseSpread = function(refDestructuringErrors) { + var node2 = this.startNode(); + this.next(); + node2.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node2, "SpreadElement"); +}; +pp$7.parseRestBinding = function() { + var node2 = this.startNode(); + this.next(); + if (this.options.ecmaVersion === 6 && this.type !== types$1.name) { + this.unexpected(); + } + node2.argument = this.parseBindingAtom(); + return this.finishNode(node2, "RestElement"); +}; +pp$7.parseBindingAtom = function() { + if (this.options.ecmaVersion >= 6) { + switch (this.type) { + case types$1.bracketL: + var node2 = this.startNode(); + this.next(); + node2.elements = this.parseBindingList(types$1.bracketR, true, true); + return this.finishNode(node2, "ArrayPattern"); + case types$1.braceL: + return this.parseObj(true); + } + } + return this.parseIdent(); +}; +pp$7.parseBindingList = function(close2, allowEmpty, allowTrailingComma, allowModifiers) { + var elts = [], first = true; + while (!this.eat(close2)) { + if (first) { + first = false; + } else { + this.expect(types$1.comma); + } + if (allowEmpty && this.type === types$1.comma) { + elts.push(null); + } else if (allowTrailingComma && this.afterTrailingComma(close2)) { + break; + } else if (this.type === types$1.ellipsis) { + var rest = this.parseRestBinding(); + this.parseBindingListItem(rest); + elts.push(rest); + if (this.type === types$1.comma) { + this.raiseRecoverable(this.start, "Comma is not permitted after the rest element"); + } + this.expect(close2); + break; + } else { + elts.push(this.parseAssignableListItem(allowModifiers)); + } + } + return elts; +}; +pp$7.parseAssignableListItem = function(allowModifiers) { + var elem = this.parseMaybeDefault(this.start, this.startLoc); + this.parseBindingListItem(elem); + return elem; +}; +pp$7.parseBindingListItem = function(param) { + return param; +}; +pp$7.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { + return left; + } + var node2 = this.startNodeAt(startPos, startLoc); + node2.left = left; + node2.right = this.parseMaybeAssign(); + return this.finishNode(node2, "AssignmentPattern"); +}; +pp$7.checkLValSimple = function(expr, bindingType, checkClashes) { + if (bindingType === void 0) bindingType = BIND_NONE; + var isBind = bindingType !== BIND_NONE; + switch (expr.type) { + case "Identifier": + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) { + this.raiseRecoverable(expr.start, (isBind ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); + } + if (isBind) { + if (bindingType === BIND_LEXICAL && expr.name === "let") { + this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); + } + if (checkClashes) { + if (hasOwn(checkClashes, expr.name)) { + this.raiseRecoverable(expr.start, "Argument name clash"); + } + checkClashes[expr.name] = true; + } + if (bindingType !== BIND_OUTSIDE) { + this.declareName(expr.name, bindingType, expr.start); + } + } + break; + case "ChainExpression": + this.raiseRecoverable(expr.start, "Optional chaining cannot appear in left-hand side"); + break; + case "MemberExpression": + if (isBind) { + this.raiseRecoverable(expr.start, "Binding member expression"); + } + break; + case "ParenthesizedExpression": + if (isBind) { + this.raiseRecoverable(expr.start, "Binding parenthesized expression"); + } + return this.checkLValSimple(expr.expression, bindingType, checkClashes); + default: + this.raise(expr.start, (isBind ? "Binding" : "Assigning to") + " rvalue"); + } +}; +pp$7.checkLValPattern = function(expr, bindingType, checkClashes) { + if (bindingType === void 0) bindingType = BIND_NONE; + switch (expr.type) { + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) { + var prop = list[i]; + this.checkLValInnerPattern(prop, bindingType, checkClashes); + } + break; + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + if (elem) { + this.checkLValInnerPattern(elem, bindingType, checkClashes); + } + } + break; + default: + this.checkLValSimple(expr, bindingType, checkClashes); + } +}; +pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) { + if (bindingType === void 0) bindingType = BIND_NONE; + switch (expr.type) { + case "Property": + this.checkLValInnerPattern(expr.value, bindingType, checkClashes); + break; + case "AssignmentPattern": + this.checkLValPattern(expr.left, bindingType, checkClashes); + break; + case "RestElement": + this.checkLValPattern(expr.argument, bindingType, checkClashes); + break; + default: + this.checkLValPattern(expr, bindingType, checkClashes); + } +}; +var TokContext = function TokContext2(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; +}; +var types = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function(p) { + return p.tryReadTemplateToken(); + }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) +}; +var pp$6 = Parser2.prototype; +pp$6.initialContext = function() { + return [types.b_stat]; +}; +pp$6.curContext = function() { + return this.context[this.context.length - 1]; +}; +pp$6.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types.f_expr || parent === types.f_stat) { + return true; + } + if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr)) { + return !parent.isExpr; + } + if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed) { + return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)); + } + if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow) { + return true; + } + if (prevType === types$1.braceL) { + return parent === types.b_stat; + } + if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name) { + return false; + } + return !this.exprAllowed; +}; +pp$6.inGeneratorContext = function() { + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this.context[i]; + if (context.token === "function") { + return context.generator; + } + } + return false; +}; +pp$6.updateContext = function(prevType) { + var update, type2 = this.type; + if (type2.keyword && prevType === types$1.dot) { + this.exprAllowed = false; + } else if (update = type2.updateContext) { + update.call(this, prevType); + } else { + this.exprAllowed = type2.beforeExpr; + } +}; +pp$6.overrideContext = function(tokenCtx) { + if (this.curContext() !== tokenCtx) { + this.context[this.context.length - 1] = tokenCtx; + } +}; +types$1.parenR.updateContext = types$1.braceR.updateContext = function() { + if (this.context.length === 1) { + this.exprAllowed = true; + return; + } + var out = this.context.pop(); + if (out === types.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; +}; +types$1.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr); + this.exprAllowed = true; +}; +types$1.dollarBraceL.updateContext = function() { + this.context.push(types.b_tmpl); + this.exprAllowed = true; +}; +types$1.parenL.updateContext = function(prevType) { + var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while; + this.context.push(statementParens ? types.p_stat : types.p_expr); + this.exprAllowed = true; +}; +types$1.incDec.updateContext = function() { +}; +types$1._function.updateContext = types$1._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types$1._else && !(prevType === types$1.semi && this.curContext() !== types.p_stat) && !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat)) { + this.context.push(types.f_expr); + } else { + this.context.push(types.f_stat); + } + this.exprAllowed = false; +}; +types$1.colon.updateContext = function() { + if (this.curContext().token === "function") { + this.context.pop(); + } + this.exprAllowed = true; +}; +types$1.backQuote.updateContext = function() { + if (this.curContext() === types.q_tmpl) { + this.context.pop(); + } else { + this.context.push(types.q_tmpl); + } + this.exprAllowed = false; +}; +types$1.star.updateContext = function(prevType) { + if (prevType === types$1._function) { + var index2 = this.context.length - 1; + if (this.context[index2] === types.f_expr) { + this.context[index2] = types.f_expr_gen; + } else { + this.context[index2] = types.f_gen; + } + } + this.exprAllowed = true; +}; +types$1.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) { + if (this.value === "of" && !this.exprAllowed || this.value === "yield" && this.inGeneratorContext()) { + allowed = true; + } + } + this.exprAllowed = allowed; +}; +var pp$5 = Parser2.prototype; +pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) { + if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") { + return; + } + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) { + return; + } + var key2 = prop.key; + var name; + switch (key2.type) { + case "Identifier": + name = key2.name; + break; + case "Literal": + name = String(key2.value); + break; + default: + return; + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name === "__proto__" && kind === "init") { + if (propHash.proto) { + if (refDestructuringErrors) { + if (refDestructuringErrors.doubleProto < 0) { + refDestructuringErrors.doubleProto = key2.start; + } + } else { + this.raiseRecoverable(key2.start, "Redefinition of __proto__ property"); + } + } + propHash.proto = true; + } + return; + } + name = "$" + name; + var other2 = propHash[name]; + if (other2) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other2.init || other2.get || other2.set; + } else { + redefinition = other2.init || other2[kind]; + } + if (redefinition) { + this.raiseRecoverable(key2.start, "Redefinition of property"); + } + } else { + other2 = propHash[name] = { + init: false, + get: false, + set: false + }; + } + other2[kind] = true; +}; +pp$5.parseExpression = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(forInit, refDestructuringErrors); + if (this.type === types$1.comma) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.expressions = [expr]; + while (this.eat(types$1.comma)) { + node2.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); + } + return this.finishNode(node2, "SequenceExpression"); + } + return expr; +}; +pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) { + if (this.isContextual("yield")) { + if (this.inGenerator) { + return this.parseYield(forInit); + } else { + this.exprAllowed = false; + } + } + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + oldDoubleProto = refDestructuringErrors.doubleProto; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1; + } else { + refDestructuringErrors = new DestructuringErrors(); + ownDestructuringErrors = true; + } + var startPos = this.start, startLoc = this.startLoc; + if (this.type === types$1.parenL || this.type === types$1.name) { + this.potentialArrowAt = this.start; + this.potentialArrowInForAwait = forInit === "await"; + } + var left = this.parseMaybeConditional(forInit, refDestructuringErrors); + if (afterLeftParse) { + left = afterLeftParse.call(this, left, startPos, startLoc); + } + if (this.type.isAssign) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.operator = this.value; + if (this.type === types$1.eq) { + left = this.toAssignable(left, false, refDestructuringErrors); + } + if (!ownDestructuringErrors) { + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1; + } + if (refDestructuringErrors.shorthandAssign >= left.start) { + refDestructuringErrors.shorthandAssign = -1; + } + if (this.type === types$1.eq) { + this.checkLValPattern(left); + } else { + this.checkLValSimple(left); + } + node2.left = left; + this.next(); + node2.right = this.parseMaybeAssign(forInit); + if (oldDoubleProto > -1) { + refDestructuringErrors.doubleProto = oldDoubleProto; + } + return this.finishNode(node2, "AssignmentExpression"); + } else { + if (ownDestructuringErrors) { + this.checkExpressionErrors(refDestructuringErrors, true); + } + } + if (oldParenAssign > -1) { + refDestructuringErrors.parenthesizedAssign = oldParenAssign; + } + if (oldTrailingComma > -1) { + refDestructuringErrors.trailingComma = oldTrailingComma; + } + return left; +}; +pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(forInit, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { + return expr; + } + if (this.eat(types$1.question)) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.test = expr; + node2.consequent = this.parseMaybeAssign(); + this.expect(types$1.colon); + node2.alternate = this.parseMaybeAssign(forInit); + return this.finishNode(node2, "ConditionalExpression"); + } + return expr; +}; +pp$5.parseExprOps = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit); + if (this.checkExpressionErrors(refDestructuringErrors)) { + return expr; + } + return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit); +}; +pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) { + var prec = this.type.binop; + if (prec != null && (!forInit || this.type !== types$1._in)) { + if (prec > minPrec) { + var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND; + var coalesce = this.type === types$1.coalesce; + if (coalesce) { + prec = types$1.logicalAND.binop; + } + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit); + var node2 = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce); + if (logical && this.type === types$1.coalesce || coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND)) { + this.raiseRecoverable(this.start, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses"); + } + return this.parseExprOp(node2, leftStartPos, leftStartLoc, minPrec, forInit); + } + } + return left; +}; +pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) { + if (right.type === "PrivateIdentifier") { + this.raise(right.start, "Private identifier can only be left side of binary expression"); + } + var node2 = this.startNodeAt(startPos, startLoc); + node2.left = left; + node2.operator = op; + node2.right = right; + return this.finishNode(node2, logical ? "LogicalExpression" : "BinaryExpression"); +}; +pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) { + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.isContextual("await") && this.canAwait) { + expr = this.parseAwait(forInit); + sawUnary = true; + } else if (this.type.prefix) { + var node2 = this.startNode(), update = this.type === types$1.incDec; + node2.operator = this.value; + node2.prefix = true; + this.next(); + node2.argument = this.parseMaybeUnary(null, true, update, forInit); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { + this.checkLValSimple(node2.argument); + } else if (this.strict && node2.operator === "delete" && isLocalVariableAccess(node2.argument)) { + this.raiseRecoverable(node2.start, "Deleting local variable in strict mode"); + } else if (node2.operator === "delete" && isPrivateFieldAccess(node2.argument)) { + this.raiseRecoverable(node2.start, "Private fields can not be deleted"); + } else { + sawUnary = true; + } + expr = this.finishNode(node2, update ? "UpdateExpression" : "UnaryExpression"); + } else if (!sawUnary && this.type === types$1.privateId) { + if ((forInit || this.privateNameStack.length === 0) && this.options.checkPrivateFields) { + this.unexpected(); + } + expr = this.parsePrivateIdent(); + if (this.type !== types$1._in) { + this.unexpected(); + } + } else { + expr = this.parseExprSubscripts(refDestructuringErrors, forInit); + if (this.checkExpressionErrors(refDestructuringErrors)) { + return expr; + } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$12 = this.startNodeAt(startPos, startLoc); + node$12.operator = this.value; + node$12.prefix = false; + node$12.argument = expr; + this.checkLValSimple(expr); + this.next(); + expr = this.finishNode(node$12, "UpdateExpression"); + } + } + if (!incDec && this.eat(types$1.starstar)) { + if (sawUnary) { + this.unexpected(this.lastTokStart); + } else { + return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), "**", false); + } + } else { + return expr; + } +}; +function isLocalVariableAccess(node2) { + return node2.type === "Identifier" || node2.type === "ParenthesizedExpression" && isLocalVariableAccess(node2.expression); +} +function isPrivateFieldAccess(node2) { + return node2.type === "MemberExpression" && node2.property.type === "PrivateIdentifier" || node2.type === "ChainExpression" && isPrivateFieldAccess(node2.expression) || node2.type === "ParenthesizedExpression" && isPrivateFieldAccess(node2.expression); +} +pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors, forInit); + if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")") { + return expr; + } + var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { + refDestructuringErrors.parenthesizedAssign = -1; + } + if (refDestructuringErrors.parenthesizedBind >= result.start) { + refDestructuringErrors.parenthesizedBind = -1; + } + if (refDestructuringErrors.trailingComma >= result.start) { + refDestructuringErrors.trailingComma = -1; + } + } + return result; +}; +pp$5.parseSubscripts = function(base2, startPos, startLoc, noCalls, forInit) { + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base2.type === "Identifier" && base2.name === "async" && this.lastTokEnd === base2.end && !this.canInsertSemicolon() && base2.end - base2.start === 5 && this.potentialArrowAt === base2.start; + var optionalChained = false; + while (true) { + var element = this.parseSubscript(base2, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit); + if (element.optional) { + optionalChained = true; + } + if (element === base2 || element.type === "ArrowFunctionExpression") { + if (optionalChained) { + var chainNode = this.startNodeAt(startPos, startLoc); + chainNode.expression = element; + element = this.finishNode(chainNode, "ChainExpression"); + } + return element; + } + base2 = element; + } +}; +pp$5.shouldParseAsyncArrow = function() { + return !this.canInsertSemicolon() && this.eat(types$1.arrow); +}; +pp$5.parseSubscriptAsyncArrow = function(startPos, startLoc, exprList, forInit) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit); +}; +pp$5.parseSubscript = function(base2, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) { + var optionalSupported = this.options.ecmaVersion >= 11; + var optional = optionalSupported && this.eat(types$1.questionDot); + if (noCalls && optional) { + this.raise(this.lastTokStart, "Optional chaining cannot appear in the callee of new expressions"); + } + var computed = this.eat(types$1.bracketL); + if (computed || optional && this.type !== types$1.parenL && this.type !== types$1.backQuote || this.eat(types$1.dot)) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.object = base2; + if (computed) { + node2.property = this.parseExpression(); + this.expect(types$1.bracketR); + } else if (this.type === types$1.privateId && base2.type !== "Super") { + node2.property = this.parsePrivateIdent(); + } else { + node2.property = this.parseIdent(this.options.allowReserved !== "never"); + } + node2.computed = !!computed; + if (optionalSupported) { + node2.optional = optional; + } + base2 = this.finishNode(node2, "MemberExpression"); + } else if (!noCalls && this.eat(types$1.parenL)) { + var refDestructuringErrors = new DestructuringErrors(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors); + if (maybeAsyncArrow && !optional && this.shouldParseAsyncArrow()) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + if (this.awaitIdentPos > 0) { + this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); + } + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.parseSubscriptAsyncArrow(startPos, startLoc, exprList, forInit); + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos; + var node$12 = this.startNodeAt(startPos, startLoc); + node$12.callee = base2; + node$12.arguments = exprList; + if (optionalSupported) { + node$12.optional = optional; + } + base2 = this.finishNode(node$12, "CallExpression"); + } else if (this.type === types$1.backQuote) { + if (optional || optionalChained) { + this.raise(this.start, "Optional chaining cannot appear in the tag of tagged template expressions"); + } + var node$2 = this.startNodeAt(startPos, startLoc); + node$2.tag = base2; + node$2.quasi = this.parseTemplate({ isTagged: true }); + base2 = this.finishNode(node$2, "TaggedTemplateExpression"); + } + return base2; +}; +pp$5.parseExprAtom = function(refDestructuringErrors, forInit, forNew) { + if (this.type === types$1.slash) { + this.readRegexp(); + } + var node2, canBeArrow = this.potentialArrowAt === this.start; + switch (this.type) { + case types$1._super: + if (!this.allowSuper) { + this.raise(this.start, "'super' keyword outside a method"); + } + node2 = this.startNode(); + this.next(); + if (this.type === types$1.parenL && !this.allowDirectSuper) { + this.raise(node2.start, "super() call outside constructor of a subclass"); + } + if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL) { + this.unexpected(); + } + return this.finishNode(node2, "Super"); + case types$1._this: + node2 = this.startNode(); + this.next(); + return this.finishNode(node2, "ThisExpression"); + case types$1.name: + var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; + var id = this.parseIdent(false); + if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types$1._function)) { + this.overrideContext(types.f_expr); + return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit); + } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types$1.arrow)) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit); + } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types$1.name && !containsEsc && (!this.potentialArrowInForAwait || this.value !== "of" || this.containsEsc)) { + id = this.parseIdent(false); + if (this.canInsertSemicolon() || !this.eat(types$1.arrow)) { + this.unexpected(); + } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit); + } + } + return id; + case types$1.regexp: + var value = this.value; + node2 = this.parseLiteral(value.value); + node2.regex = { pattern: value.pattern, flags: value.flags }; + return node2; + case types$1.num: + case types$1.string: + return this.parseLiteral(this.value); + case types$1._null: + case types$1._true: + case types$1._false: + node2 = this.startNode(); + node2.value = this.type === types$1._null ? null : this.type === types$1._true; + node2.raw = this.type.keyword; + this.next(); + return this.finishNode(node2, "Literal"); + case types$1.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) { + refDestructuringErrors.parenthesizedAssign = start; + } + if (refDestructuringErrors.parenthesizedBind < 0) { + refDestructuringErrors.parenthesizedBind = start; + } + } + return expr; + case types$1.bracketL: + node2 = this.startNode(); + this.next(); + node2.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node2, "ArrayExpression"); + case types$1.braceL: + this.overrideContext(types.b_expr); + return this.parseObj(false, refDestructuringErrors); + case types$1._function: + node2 = this.startNode(); + this.next(); + return this.parseFunction(node2, 0); + case types$1._class: + return this.parseClass(this.startNode(), false); + case types$1._new: + return this.parseNew(); + case types$1.backQuote: + return this.parseTemplate(); + case types$1._import: + if (this.options.ecmaVersion >= 11) { + return this.parseExprImport(forNew); + } else { + return this.unexpected(); + } + default: + return this.parseExprAtomDefault(); + } +}; +pp$5.parseExprAtomDefault = function() { + this.unexpected(); +}; +pp$5.parseExprImport = function(forNew) { + var node2 = this.startNode(); + if (this.containsEsc) { + this.raiseRecoverable(this.start, "Escape sequence in keyword import"); + } + this.next(); + if (this.type === types$1.parenL && !forNew) { + return this.parseDynamicImport(node2); + } else if (this.type === types$1.dot) { + var meta = this.startNodeAt(node2.start, node2.loc && node2.loc.start); + meta.name = "import"; + node2.meta = this.finishNode(meta, "Identifier"); + return this.parseImportMeta(node2); + } else { + this.unexpected(); + } +}; +pp$5.parseDynamicImport = function(node2) { + this.next(); + node2.source = this.parseMaybeAssign(); + if (this.options.ecmaVersion >= 16) { + if (!this.eat(types$1.parenR)) { + this.expect(types$1.comma); + if (!this.afterTrailingComma(types$1.parenR)) { + node2.options = this.parseMaybeAssign(); + if (!this.eat(types$1.parenR)) { + this.expect(types$1.comma); + if (!this.afterTrailingComma(types$1.parenR)) { + this.unexpected(); + } + } + } else { + node2.options = null; + } + } else { + node2.options = null; + } + } else { + if (!this.eat(types$1.parenR)) { + var errorPos = this.start; + if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { + this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + } else { + this.unexpected(errorPos); + } + } + } + return this.finishNode(node2, "ImportExpression"); +}; +pp$5.parseImportMeta = function(node2) { + this.next(); + var containsEsc = this.containsEsc; + node2.property = this.parseIdent(true); + if (node2.property.name !== "meta") { + this.raiseRecoverable(node2.property.start, "The only valid meta property for import is 'import.meta'"); + } + if (containsEsc) { + this.raiseRecoverable(node2.start, "'import.meta' must not contain escaped characters"); + } + if (this.options.sourceType !== "module" && !this.options.allowImportExportEverywhere) { + this.raiseRecoverable(node2.start, "Cannot use 'import.meta' outside a module"); + } + return this.finishNode(node2, "MetaProperty"); +}; +pp$5.parseLiteral = function(value) { + var node2 = this.startNode(); + node2.value = value; + node2.raw = this.input.slice(this.start, this.end); + if (node2.raw.charCodeAt(node2.raw.length - 1) === 110) { + node2.bigint = node2.raw.slice(0, -1).replace(/_/g, ""); + } + this.next(); + return this.finishNode(node2, "Literal"); +}; +pp$5.parseParenExpression = function() { + this.expect(types$1.parenL); + var val = this.parseExpression(); + this.expect(types$1.parenR); + return val; +}; +pp$5.shouldParseArrow = function(exprList) { + return !this.canInsertSemicolon(); +}; +pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) { + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; + this.yieldPos = 0; + this.awaitPos = 0; + while (this.type !== types$1.parenR) { + first ? first = false : this.expect(types$1.comma); + if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) { + lastIsComma = true; + break; + } else if (this.type === types$1.ellipsis) { + spreadStart = this.start; + exprList.push(this.parseParenItem(this.parseRestBinding())); + if (this.type === types$1.comma) { + this.raiseRecoverable( + this.start, + "Comma is not permitted after the rest element" + ); + } + break; + } else { + exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)); + } + } + var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc; + this.expect(types$1.parenR); + if (canBeArrow && this.shouldParseArrow(exprList) && this.eat(types$1.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList, forInit); + } + if (!exprList.length || lastIsComma) { + this.unexpected(this.lastTokStart); + } + if (spreadStart) { + this.unexpected(spreadStart); + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression"); + } else { + return val; + } +}; +pp$5.parseParenItem = function(item) { + return item; +}; +pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit); +}; +var empty = []; +pp$5.parseNew = function() { + if (this.containsEsc) { + this.raiseRecoverable(this.start, "Escape sequence in keyword new"); + } + var node2 = this.startNode(); + this.next(); + if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) { + var meta = this.startNodeAt(node2.start, node2.loc && node2.loc.start); + meta.name = "new"; + node2.meta = this.finishNode(meta, "Identifier"); + this.next(); + var containsEsc = this.containsEsc; + node2.property = this.parseIdent(true); + if (node2.property.name !== "target") { + this.raiseRecoverable(node2.property.start, "The only valid meta property for new is 'new.target'"); + } + if (containsEsc) { + this.raiseRecoverable(node2.start, "'new.target' must not contain escaped characters"); + } + if (!this.allowNewDotTarget) { + this.raiseRecoverable(node2.start, "'new.target' can only be used in functions and class static block"); + } + return this.finishNode(node2, "MetaProperty"); + } + var startPos = this.start, startLoc = this.startLoc; + node2.callee = this.parseSubscripts(this.parseExprAtom(null, false, true), startPos, startLoc, true, false); + if (this.eat(types$1.parenL)) { + node2.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); + } else { + node2.arguments = empty; + } + return this.finishNode(node2, "NewExpression"); +}; +pp$5.parseTemplateElement = function(ref2) { + var isTagged = ref2.isTagged; + var elem = this.startNode(); + if (this.type === types$1.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value.replace(/\r\n?/g, "\n"), + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types$1.backQuote; + return this.finishNode(elem, "TemplateElement"); +}; +pp$5.parseTemplate = function(ref2) { + if (ref2 === void 0) ref2 = {}; + var isTagged = ref2.isTagged; + if (isTagged === void 0) isTagged = false; + var node2 = this.startNode(); + this.next(); + node2.expressions = []; + var curElt = this.parseTemplateElement({ isTagged }); + node2.quasis = [curElt]; + while (!curElt.tail) { + if (this.type === types$1.eof) { + this.raise(this.pos, "Unterminated template literal"); + } + this.expect(types$1.dollarBraceL); + node2.expressions.push(this.parseExpression()); + this.expect(types$1.braceR); + node2.quasis.push(curElt = this.parseTemplateElement({ isTagged })); + } + this.next(); + return this.finishNode(node2, "TemplateLiteral"); +}; +pp$5.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || this.options.ecmaVersion >= 9 && this.type === types$1.star) && !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)); +}; +pp$5.parseObj = function(isPattern, refDestructuringErrors) { + var node2 = this.startNode(), first = true, propHash = {}; + node2.properties = []; + this.next(); + while (!this.eat(types$1.braceR)) { + if (!first) { + this.expect(types$1.comma); + if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first = false; + } + var prop = this.parseProperty(isPattern, refDestructuringErrors); + if (!isPattern) { + this.checkPropClash(prop, propHash, refDestructuringErrors); + } + node2.properties.push(prop); + } + return this.finishNode(node2, isPattern ? "ObjectPattern" : "ObjectExpression"); +}; +pp$5.parseProperty = function(isPattern, refDestructuringErrors) { + var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; + if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) { + if (isPattern) { + prop.argument = this.parseIdent(false); + if (this.type === types$1.comma) { + this.raiseRecoverable(this.start, "Comma is not permitted after the rest element"); + } + return this.finishNode(prop, "RestElement"); + } + prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); + if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + return this.finishNode(prop, "SpreadElement"); + } + if (this.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this.start; + startLoc = this.startLoc; + } + if (!isPattern) { + isGenerator = this.eat(types$1.star); + } + } + var containsEsc = this.containsEsc; + this.parsePropertyName(prop); + if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star); + this.parsePropertyName(prop); + } else { + isAsync = false; + } + this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); + return this.finishNode(prop, "Property"); +}; +pp$5.parseGetterSetter = function(prop) { + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") { + this.raiseRecoverable(start, "getter should have no params"); + } else { + this.raiseRecoverable(start, "setter should have exactly one param"); + } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") { + this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); + } + } +}; +pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { + if ((isGenerator || isAsync) && this.type === types$1.colon) { + this.unexpected(); + } + if (this.eat(types$1.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) { + if (isPattern) { + this.unexpected(); + } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (!isPattern && !containsEsc && this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) { + if (isGenerator || isAsync) { + this.unexpected(); + } + this.parseGetterSetter(prop); + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + if (isGenerator || isAsync) { + this.unexpected(); + } + this.checkUnreserved(prop.key); + if (prop.key.name === "await" && !this.awaitIdentPos) { + this.awaitIdentPos = startPos; + } + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); + } else if (this.type === types$1.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) { + refDestructuringErrors.shorthandAssign = this.start; + } + prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); + } else { + prop.value = this.copyNode(prop.key); + } + prop.shorthand = true; + } else { + this.unexpected(); + } +}; +pp$5.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types$1.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types$1.bracketR); + return prop.key; + } else { + prop.computed = false; + } + } + return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never"); +}; +pp$5.initFunction = function(node2) { + node2.id = null; + if (this.options.ecmaVersion >= 6) { + node2.generator = node2.expression = false; + } + if (this.options.ecmaVersion >= 8) { + node2.async = false; + } +}; +pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { + var node2 = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.initFunction(node2); + if (this.options.ecmaVersion >= 6) { + node2.generator = isGenerator; + } + if (this.options.ecmaVersion >= 8) { + node2.async = !!isAsync; + } + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(isAsync, node2.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); + this.expect(types$1.parenL); + node2.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node2, false, true, false); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node2, "FunctionExpression"); +}; +pp$5.parseArrowExpression = function(node2, params, isAsync, forInit) { + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); + this.initFunction(node2); + if (this.options.ecmaVersion >= 8) { + node2.async = !!isAsync; + } + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + node2.params = this.toAssignableList(params, true); + this.parseFunctionBody(node2, true, false, forInit); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node2, "ArrowFunctionExpression"); +}; +pp$5.parseFunctionBody = function(node2, isArrowFunction, isMethod, forInit) { + var isExpression = isArrowFunction && this.type !== types$1.braceL; + var oldStrict = this.strict, useStrict = false; + if (isExpression) { + node2.body = this.parseMaybeAssign(forInit); + node2.expression = true; + this.checkParams(node2, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node2.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + if (useStrict && nonSimple) { + this.raiseRecoverable(node2.start, "Illegal 'use strict' directive in function with non-simple parameter list"); + } + } + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { + this.strict = true; + } + this.checkParams(node2, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node2.params)); + if (this.strict && node2.id) { + this.checkLValSimple(node2.id, BIND_OUTSIDE); + } + node2.body = this.parseBlock(false, void 0, useStrict && !oldStrict); + node2.expression = false; + this.adaptDirectivePrologue(node2.body.body); + this.labels = oldLabels; + } + this.exitScope(); +}; +pp$5.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) { + var param = list[i]; + if (param.type !== "Identifier") { + return false; + } + } + return true; +}; +pp$5.checkParams = function(node2, allowDuplicates) { + var nameHash = /* @__PURE__ */ Object.create(null); + for (var i = 0, list = node2.params; i < list.length; i += 1) { + var param = list[i]; + this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash); + } +}; +pp$5.parseExprList = function(close2, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var elts = [], first = true; + while (!this.eat(close2)) { + if (!first) { + this.expect(types$1.comma); + if (allowTrailingComma && this.afterTrailingComma(close2)) { + break; + } + } else { + first = false; + } + var elt = void 0; + if (allowEmpty && this.type === types$1.comma) { + elt = null; + } else if (this.type === types$1.ellipsis) { + elt = this.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + } else { + elt = this.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts; +}; +pp$5.checkUnreserved = function(ref2) { + var start = ref2.start; + var end = ref2.end; + var name = ref2.name; + if (this.inGenerator && name === "yield") { + this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); + } + if (this.inAsync && name === "await") { + this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); + } + if (this.currentThisScope().inClassFieldInit && name === "arguments") { + this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); + } + if (this.inClassStaticBlock && (name === "arguments" || name === "await")) { + this.raise(start, "Cannot use " + name + " in class static initialization block"); + } + if (this.keywords.test(name)) { + this.raise(start, "Unexpected keyword '" + name + "'"); + } + if (this.options.ecmaVersion < 6 && this.input.slice(start, end).indexOf("\\") !== -1) { + return; + } + var re2 = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re2.test(name)) { + if (!this.inAsync && name === "await") { + this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); + } + this.raiseRecoverable(start, "The keyword '" + name + "' is reserved"); + } +}; +pp$5.parseIdent = function(liberal) { + var node2 = this.parseIdentNode(); + this.next(!!liberal); + this.finishNode(node2, "Identifier"); + if (!liberal) { + this.checkUnreserved(node2); + if (node2.name === "await" && !this.awaitIdentPos) { + this.awaitIdentPos = node2.start; + } + } + return node2; +}; +pp$5.parseIdentNode = function() { + var node2 = this.startNode(); + if (this.type === types$1.name) { + node2.name = this.value; + } else if (this.type.keyword) { + node2.name = this.type.keyword; + if ((node2.name === "class" || node2.name === "function") && (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { + this.context.pop(); + } + this.type = types$1.name; + } else { + this.unexpected(); + } + return node2; +}; +pp$5.parsePrivateIdent = function() { + var node2 = this.startNode(); + if (this.type === types$1.privateId) { + node2.name = this.value; + } else { + this.unexpected(); + } + this.next(); + this.finishNode(node2, "PrivateIdentifier"); + if (this.options.checkPrivateFields) { + if (this.privateNameStack.length === 0) { + this.raise(node2.start, "Private field '#" + node2.name + "' must be declared in an enclosing class"); + } else { + this.privateNameStack[this.privateNameStack.length - 1].used.push(node2); + } + } + return node2; +}; +pp$5.parseYield = function(forInit) { + if (!this.yieldPos) { + this.yieldPos = this.start; + } + var node2 = this.startNode(); + this.next(); + if (this.type === types$1.semi || this.canInsertSemicolon() || this.type !== types$1.star && !this.type.startsExpr) { + node2.delegate = false; + node2.argument = null; + } else { + node2.delegate = this.eat(types$1.star); + node2.argument = this.parseMaybeAssign(forInit); + } + return this.finishNode(node2, "YieldExpression"); +}; +pp$5.parseAwait = function(forInit) { + if (!this.awaitPos) { + this.awaitPos = this.start; + } + var node2 = this.startNode(); + this.next(); + node2.argument = this.parseMaybeUnary(null, true, false, forInit); + return this.finishNode(node2, "AwaitExpression"); +}; +var pp$4 = Parser2.prototype; +pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; + err.loc = loc; + err.raisedAt = this.pos; + throw err; +}; +pp$4.raiseRecoverable = pp$4.raise; +pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart); + } +}; +var pp$3 = Parser2.prototype; +var Scope = function Scope2(flags) { + this.flags = flags; + this.var = []; + this.lexical = []; + this.functions = []; + this.inClassFieldInit = false; +}; +pp$3.enterScope = function(flags) { + this.scopeStack.push(new Scope(flags)); +}; +pp$3.exitScope = function() { + this.scopeStack.pop(); +}; +pp$3.treatFunctionsAsVarInScope = function(scope) { + return scope.flags & SCOPE_FUNCTION || !this.inModule && scope.flags & SCOPE_TOP; +}; +pp$3.declareName = function(name, bindingType, pos) { + var redeclared = false; + if (bindingType === BIND_LEXICAL) { + var scope = this.currentScope(); + redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1; + scope.lexical.push(name); + if (this.inModule && scope.flags & SCOPE_TOP) { + delete this.undefinedExports[name]; + } + } else if (bindingType === BIND_SIMPLE_CATCH) { + var scope$1 = this.currentScope(); + scope$1.lexical.push(name); + } else if (bindingType === BIND_FUNCTION) { + var scope$2 = this.currentScope(); + if (this.treatFunctionsAsVar) { + redeclared = scope$2.lexical.indexOf(name) > -1; + } else { + redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; + } + scope$2.functions.push(name); + } else { + for (var i = this.scopeStack.length - 1; i >= 0; --i) { + var scope$3 = this.scopeStack[i]; + if (scope$3.lexical.indexOf(name) > -1 && !(scope$3.flags & SCOPE_SIMPLE_CATCH && scope$3.lexical[0] === name) || !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) { + redeclared = true; + break; + } + scope$3.var.push(name); + if (this.inModule && scope$3.flags & SCOPE_TOP) { + delete this.undefinedExports[name]; + } + if (scope$3.flags & SCOPE_VAR) { + break; + } + } + } + if (redeclared) { + this.raiseRecoverable(pos, "Identifier '" + name + "' has already been declared"); + } +}; +pp$3.checkLocalExport = function(id) { + if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && this.scopeStack[0].var.indexOf(id.name) === -1) { + this.undefinedExports[id.name] = id; + } +}; +pp$3.currentScope = function() { + return this.scopeStack[this.scopeStack.length - 1]; +}; +pp$3.currentVarScope = function() { + for (var i = this.scopeStack.length - 1; ; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR) { + return scope; + } + } +}; +pp$3.currentThisScope = function() { + for (var i = this.scopeStack.length - 1; ; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { + return scope; + } + } +}; +var Node$1 = function Node2(parser2, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser2.options.locations) { + this.loc = new SourceLocation(parser2, loc); + } + if (parser2.options.directSourceFile) { + this.sourceFile = parser2.options.directSourceFile; + } + if (parser2.options.ranges) { + this.range = [pos, 0]; + } +}; +var pp$2 = Parser2.prototype; +pp$2.startNode = function() { + return new Node$1(this, this.start, this.startLoc); +}; +pp$2.startNodeAt = function(pos, loc) { + return new Node$1(this, pos, loc); +}; +function finishNodeAt(node2, type2, pos, loc) { + node2.type = type2; + node2.end = pos; + if (this.options.locations) { + node2.loc.end = loc; + } + if (this.options.ranges) { + node2.range[1] = pos; + } + return node2; +} +pp$2.finishNode = function(node2, type2) { + return finishNodeAt.call(this, node2, type2, this.lastTokEnd, this.lastTokEndLoc); +}; +pp$2.finishNodeAt = function(node2, type2, pos, loc) { + return finishNodeAt.call(this, node2, type2, pos, loc); +}; +pp$2.copyNode = function(node2) { + var newNode = new Node$1(this, node2.start, this.startLoc); + for (var prop in node2) { + newNode[prop] = node2[prop]; + } + return newNode; +}; +var scriptValuesAddedInUnicode = "Gara Garay Gukh Gurung_Khema Hrkt Katakana_Or_Hiragana Kawi Kirat_Rai Krai Nag_Mundari Nagm Ol_Onal Onao Sunu Sunuwar Todhri Todr Tulu_Tigalari Tutg Unknown Zzzz"; +var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS"; +var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic"; +var ecma11BinaryProperties = ecma10BinaryProperties; +var ecma12BinaryProperties = ecma11BinaryProperties + " EBase EComp EMod EPres ExtPict"; +var ecma13BinaryProperties = ecma12BinaryProperties; +var ecma14BinaryProperties = ecma13BinaryProperties; +var unicodeBinaryProperties = { + 9: ecma9BinaryProperties, + 10: ecma10BinaryProperties, + 11: ecma11BinaryProperties, + 12: ecma12BinaryProperties, + 13: ecma13BinaryProperties, + 14: ecma14BinaryProperties +}; +var ecma14BinaryPropertiesOfStrings = "Basic_Emoji Emoji_Keycap_Sequence RGI_Emoji_Modifier_Sequence RGI_Emoji_Flag_Sequence RGI_Emoji_Tag_Sequence RGI_Emoji_ZWJ_Sequence RGI_Emoji"; +var unicodeBinaryPropertiesOfStrings = { + 9: "", + 10: "", + 11: "", + 12: "", + 13: "", + 14: ecma14BinaryPropertiesOfStrings +}; +var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu"; +var ecma9ScriptValues = "Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb"; +var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd"; +var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; +var ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi"; +var ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith"; +var ecma14ScriptValues = ecma13ScriptValues + " " + scriptValuesAddedInUnicode; +var unicodeScriptValues = { + 9: ecma9ScriptValues, + 10: ecma10ScriptValues, + 11: ecma11ScriptValues, + 12: ecma12ScriptValues, + 13: ecma13ScriptValues, + 14: ecma14ScriptValues +}; +var data = {}; +function buildUnicodeData(ecmaVersion) { + var d = data[ecmaVersion] = { + binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues), + binaryOfStrings: wordsRegexp(unicodeBinaryPropertiesOfStrings[ecmaVersion]), + nonBinary: { + General_Category: wordsRegexp(unicodeGeneralCategoryValues), + Script: wordsRegexp(unicodeScriptValues[ecmaVersion]) + } + }; + d.nonBinary.Script_Extensions = d.nonBinary.Script; + d.nonBinary.gc = d.nonBinary.General_Category; + d.nonBinary.sc = d.nonBinary.Script; + d.nonBinary.scx = d.nonBinary.Script_Extensions; +} +for (var i = 0, list = [9, 10, 11, 12, 13, 14]; i < list.length; i += 1) { + var ecmaVersion = list[i]; + buildUnicodeData(ecmaVersion); +} +var pp$1 = Parser2.prototype; +var BranchID = function BranchID2(parent, base2) { + this.parent = parent; + this.base = base2 || this; +}; +BranchID.prototype.separatedFrom = function separatedFrom(alt) { + for (var self2 = this; self2; self2 = self2.parent) { + for (var other2 = alt; other2; other2 = other2.parent) { + if (self2.base === other2.base && self2 !== other2) { + return true; + } + } + } + return false; +}; +BranchID.prototype.sibling = function sibling() { + return new BranchID(this.parent, this.base); +}; +var RegExpValidationState = function RegExpValidationState2(parser2) { + this.parser = parser2; + this.validFlags = "gim" + (parser2.options.ecmaVersion >= 6 ? "uy" : "") + (parser2.options.ecmaVersion >= 9 ? "s" : "") + (parser2.options.ecmaVersion >= 13 ? "d" : "") + (parser2.options.ecmaVersion >= 15 ? "v" : ""); + this.unicodeProperties = data[parser2.options.ecmaVersion >= 14 ? 14 : parser2.options.ecmaVersion]; + this.source = ""; + this.flags = ""; + this.start = 0; + this.switchU = false; + this.switchV = false; + this.switchN = false; + this.pos = 0; + this.lastIntValue = 0; + this.lastStringValue = ""; + this.lastAssertionIsQuantifiable = false; + this.numCapturingParens = 0; + this.maxBackReference = 0; + this.groupNames = /* @__PURE__ */ Object.create(null); + this.backReferenceNames = []; + this.branchID = null; +}; +RegExpValidationState.prototype.reset = function reset(start, pattern, flags) { + var unicodeSets = flags.indexOf("v") !== -1; + var unicode = flags.indexOf("u") !== -1; + this.start = start | 0; + this.source = pattern + ""; + this.flags = flags; + if (unicodeSets && this.parser.options.ecmaVersion >= 15) { + this.switchU = true; + this.switchV = true; + this.switchN = true; + } else { + this.switchU = unicode && this.parser.options.ecmaVersion >= 6; + this.switchV = false; + this.switchN = unicode && this.parser.options.ecmaVersion >= 9; + } +}; +RegExpValidationState.prototype.raise = function raise(message) { + this.parser.raiseRecoverable(this.start, "Invalid regular expression: /" + this.source + "/: " + message); +}; +RegExpValidationState.prototype.at = function at(i, forceU) { + if (forceU === void 0) forceU = false; + var s = this.source; + var l = s.length; + if (i >= l) { + return -1; + } + var c = s.charCodeAt(i); + if (!(forceU || this.switchU) || c <= 55295 || c >= 57344 || i + 1 >= l) { + return c; + } + var next = s.charCodeAt(i + 1); + return next >= 56320 && next <= 57343 ? (c << 10) + next - 56613888 : c; +}; +RegExpValidationState.prototype.nextIndex = function nextIndex(i, forceU) { + if (forceU === void 0) forceU = false; + var s = this.source; + var l = s.length; + if (i >= l) { + return l; + } + var c = s.charCodeAt(i), next; + if (!(forceU || this.switchU) || c <= 55295 || c >= 57344 || i + 1 >= l || (next = s.charCodeAt(i + 1)) < 56320 || next > 57343) { + return i + 1; + } + return i + 2; +}; +RegExpValidationState.prototype.current = function current(forceU) { + if (forceU === void 0) forceU = false; + return this.at(this.pos, forceU); +}; +RegExpValidationState.prototype.lookahead = function lookahead(forceU) { + if (forceU === void 0) forceU = false; + return this.at(this.nextIndex(this.pos, forceU), forceU); +}; +RegExpValidationState.prototype.advance = function advance(forceU) { + if (forceU === void 0) forceU = false; + this.pos = this.nextIndex(this.pos, forceU); +}; +RegExpValidationState.prototype.eat = function eat(ch, forceU) { + if (forceU === void 0) forceU = false; + if (this.current(forceU) === ch) { + this.advance(forceU); + return true; + } + return false; +}; +RegExpValidationState.prototype.eatChars = function eatChars(chs, forceU) { + if (forceU === void 0) forceU = false; + var pos = this.pos; + for (var i = 0, list = chs; i < list.length; i += 1) { + var ch = list[i]; + var current2 = this.at(pos, forceU); + if (current2 === -1 || current2 !== ch) { + return false; + } + pos = this.nextIndex(pos, forceU); + } + this.pos = pos; + return true; +}; +pp$1.validateRegExpFlags = function(state2) { + var validFlags = state2.validFlags; + var flags = state2.flags; + var u = false; + var v = false; + for (var i = 0; i < flags.length; i++) { + var flag = flags.charAt(i); + if (validFlags.indexOf(flag) === -1) { + this.raise(state2.start, "Invalid regular expression flag"); + } + if (flags.indexOf(flag, i + 1) > -1) { + this.raise(state2.start, "Duplicate regular expression flag"); + } + if (flag === "u") { + u = true; + } + if (flag === "v") { + v = true; + } + } + if (this.options.ecmaVersion >= 15 && u && v) { + this.raise(state2.start, "Invalid regular expression flag"); + } +}; +function hasProp(obj) { + for (var _ in obj) { + return true; + } + return false; +} +pp$1.validateRegExpPattern = function(state2) { + this.regexp_pattern(state2); + if (!state2.switchN && this.options.ecmaVersion >= 9 && hasProp(state2.groupNames)) { + state2.switchN = true; + this.regexp_pattern(state2); + } +}; +pp$1.regexp_pattern = function(state2) { + state2.pos = 0; + state2.lastIntValue = 0; + state2.lastStringValue = ""; + state2.lastAssertionIsQuantifiable = false; + state2.numCapturingParens = 0; + state2.maxBackReference = 0; + state2.groupNames = /* @__PURE__ */ Object.create(null); + state2.backReferenceNames.length = 0; + state2.branchID = null; + this.regexp_disjunction(state2); + if (state2.pos !== state2.source.length) { + if (state2.eat( + 41 + /* ) */ + )) { + state2.raise("Unmatched ')'"); + } + if (state2.eat( + 93 + /* ] */ + ) || state2.eat( + 125 + /* } */ + )) { + state2.raise("Lone quantifier brackets"); + } + } + if (state2.maxBackReference > state2.numCapturingParens) { + state2.raise("Invalid escape"); + } + for (var i = 0, list = state2.backReferenceNames; i < list.length; i += 1) { + var name = list[i]; + if (!state2.groupNames[name]) { + state2.raise("Invalid named capture referenced"); + } + } +}; +pp$1.regexp_disjunction = function(state2) { + var trackDisjunction = this.options.ecmaVersion >= 16; + if (trackDisjunction) { + state2.branchID = new BranchID(state2.branchID, null); + } + this.regexp_alternative(state2); + while (state2.eat( + 124 + /* | */ + )) { + if (trackDisjunction) { + state2.branchID = state2.branchID.sibling(); + } + this.regexp_alternative(state2); + } + if (trackDisjunction) { + state2.branchID = state2.branchID.parent; + } + if (this.regexp_eatQuantifier(state2, true)) { + state2.raise("Nothing to repeat"); + } + if (state2.eat( + 123 + /* { */ + )) { + state2.raise("Lone quantifier brackets"); + } +}; +pp$1.regexp_alternative = function(state2) { + while (state2.pos < state2.source.length && this.regexp_eatTerm(state2)) { + } +}; +pp$1.regexp_eatTerm = function(state2) { + if (this.regexp_eatAssertion(state2)) { + if (state2.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state2)) { + if (state2.switchU) { + state2.raise("Invalid quantifier"); + } + } + return true; + } + if (state2.switchU ? this.regexp_eatAtom(state2) : this.regexp_eatExtendedAtom(state2)) { + this.regexp_eatQuantifier(state2); + return true; + } + return false; +}; +pp$1.regexp_eatAssertion = function(state2) { + var start = state2.pos; + state2.lastAssertionIsQuantifiable = false; + if (state2.eat( + 94 + /* ^ */ + ) || state2.eat( + 36 + /* $ */ + )) { + return true; + } + if (state2.eat( + 92 + /* \ */ + )) { + if (state2.eat( + 66 + /* B */ + ) || state2.eat( + 98 + /* b */ + )) { + return true; + } + state2.pos = start; + } + if (state2.eat( + 40 + /* ( */ + ) && state2.eat( + 63 + /* ? */ + )) { + var lookbehind = false; + if (this.options.ecmaVersion >= 9) { + lookbehind = state2.eat( + 60 + /* < */ + ); + } + if (state2.eat( + 61 + /* = */ + ) || state2.eat( + 33 + /* ! */ + )) { + this.regexp_disjunction(state2); + if (!state2.eat( + 41 + /* ) */ + )) { + state2.raise("Unterminated group"); + } + state2.lastAssertionIsQuantifiable = !lookbehind; + return true; + } + } + state2.pos = start; + return false; +}; +pp$1.regexp_eatQuantifier = function(state2, noError) { + if (noError === void 0) noError = false; + if (this.regexp_eatQuantifierPrefix(state2, noError)) { + state2.eat( + 63 + /* ? */ + ); + return true; + } + return false; +}; +pp$1.regexp_eatQuantifierPrefix = function(state2, noError) { + return state2.eat( + 42 + /* * */ + ) || state2.eat( + 43 + /* + */ + ) || state2.eat( + 63 + /* ? */ + ) || this.regexp_eatBracedQuantifier(state2, noError); +}; +pp$1.regexp_eatBracedQuantifier = function(state2, noError) { + var start = state2.pos; + if (state2.eat( + 123 + /* { */ + )) { + var min2 = 0, max2 = -1; + if (this.regexp_eatDecimalDigits(state2)) { + min2 = state2.lastIntValue; + if (state2.eat( + 44 + /* , */ + ) && this.regexp_eatDecimalDigits(state2)) { + max2 = state2.lastIntValue; + } + if (state2.eat( + 125 + /* } */ + )) { + if (max2 !== -1 && max2 < min2 && !noError) { + state2.raise("numbers out of order in {} quantifier"); + } + return true; + } + } + if (state2.switchU && !noError) { + state2.raise("Incomplete quantifier"); + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatAtom = function(state2) { + return this.regexp_eatPatternCharacters(state2) || state2.eat( + 46 + /* . */ + ) || this.regexp_eatReverseSolidusAtomEscape(state2) || this.regexp_eatCharacterClass(state2) || this.regexp_eatUncapturingGroup(state2) || this.regexp_eatCapturingGroup(state2); +}; +pp$1.regexp_eatReverseSolidusAtomEscape = function(state2) { + var start = state2.pos; + if (state2.eat( + 92 + /* \ */ + )) { + if (this.regexp_eatAtomEscape(state2)) { + return true; + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatUncapturingGroup = function(state2) { + var start = state2.pos; + if (state2.eat( + 40 + /* ( */ + )) { + if (state2.eat( + 63 + /* ? */ + )) { + if (this.options.ecmaVersion >= 16) { + var addModifiers = this.regexp_eatModifiers(state2); + var hasHyphen = state2.eat( + 45 + /* - */ + ); + if (addModifiers || hasHyphen) { + for (var i = 0; i < addModifiers.length; i++) { + var modifier = addModifiers.charAt(i); + if (addModifiers.indexOf(modifier, i + 1) > -1) { + state2.raise("Duplicate regular expression modifiers"); + } + } + if (hasHyphen) { + var removeModifiers = this.regexp_eatModifiers(state2); + if (!addModifiers && !removeModifiers && state2.current() === 58) { + state2.raise("Invalid regular expression modifiers"); + } + for (var i$1 = 0; i$1 < removeModifiers.length; i$1++) { + var modifier$1 = removeModifiers.charAt(i$1); + if (removeModifiers.indexOf(modifier$1, i$1 + 1) > -1 || addModifiers.indexOf(modifier$1) > -1) { + state2.raise("Duplicate regular expression modifiers"); + } + } + } + } + } + if (state2.eat( + 58 + /* : */ + )) { + this.regexp_disjunction(state2); + if (state2.eat( + 41 + /* ) */ + )) { + return true; + } + state2.raise("Unterminated group"); + } + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatCapturingGroup = function(state2) { + if (state2.eat( + 40 + /* ( */ + )) { + if (this.options.ecmaVersion >= 9) { + this.regexp_groupSpecifier(state2); + } else if (state2.current() === 63) { + state2.raise("Invalid group"); + } + this.regexp_disjunction(state2); + if (state2.eat( + 41 + /* ) */ + )) { + state2.numCapturingParens += 1; + return true; + } + state2.raise("Unterminated group"); + } + return false; +}; +pp$1.regexp_eatModifiers = function(state2) { + var modifiers = ""; + var ch = 0; + while ((ch = state2.current()) !== -1 && isRegularExpressionModifier(ch)) { + modifiers += codePointToString(ch); + state2.advance(); + } + return modifiers; +}; +function isRegularExpressionModifier(ch) { + return ch === 105 || ch === 109 || ch === 115; +} +pp$1.regexp_eatExtendedAtom = function(state2) { + return state2.eat( + 46 + /* . */ + ) || this.regexp_eatReverseSolidusAtomEscape(state2) || this.regexp_eatCharacterClass(state2) || this.regexp_eatUncapturingGroup(state2) || this.regexp_eatCapturingGroup(state2) || this.regexp_eatInvalidBracedQuantifier(state2) || this.regexp_eatExtendedPatternCharacter(state2); +}; +pp$1.regexp_eatInvalidBracedQuantifier = function(state2) { + if (this.regexp_eatBracedQuantifier(state2, true)) { + state2.raise("Nothing to repeat"); + } + return false; +}; +pp$1.regexp_eatSyntaxCharacter = function(state2) { + var ch = state2.current(); + if (isSyntaxCharacter(ch)) { + state2.lastIntValue = ch; + state2.advance(); + return true; + } + return false; +}; +function isSyntaxCharacter(ch) { + return ch === 36 || ch >= 40 && ch <= 43 || ch === 46 || ch === 63 || ch >= 91 && ch <= 94 || ch >= 123 && ch <= 125; +} +pp$1.regexp_eatPatternCharacters = function(state2) { + var start = state2.pos; + var ch = 0; + while ((ch = state2.current()) !== -1 && !isSyntaxCharacter(ch)) { + state2.advance(); + } + return state2.pos !== start; +}; +pp$1.regexp_eatExtendedPatternCharacter = function(state2) { + var ch = state2.current(); + if (ch !== -1 && ch !== 36 && !(ch >= 40 && ch <= 43) && ch !== 46 && ch !== 63 && ch !== 91 && ch !== 94 && ch !== 124) { + state2.advance(); + return true; + } + return false; +}; +pp$1.regexp_groupSpecifier = function(state2) { + if (state2.eat( + 63 + /* ? */ + )) { + if (!this.regexp_eatGroupName(state2)) { + state2.raise("Invalid group"); + } + var trackDisjunction = this.options.ecmaVersion >= 16; + var known = state2.groupNames[state2.lastStringValue]; + if (known) { + if (trackDisjunction) { + for (var i = 0, list = known; i < list.length; i += 1) { + var altID = list[i]; + if (!altID.separatedFrom(state2.branchID)) { + state2.raise("Duplicate capture group name"); + } + } + } else { + state2.raise("Duplicate capture group name"); + } + } + if (trackDisjunction) { + (known || (state2.groupNames[state2.lastStringValue] = [])).push(state2.branchID); + } else { + state2.groupNames[state2.lastStringValue] = true; + } + } +}; +pp$1.regexp_eatGroupName = function(state2) { + state2.lastStringValue = ""; + if (state2.eat( + 60 + /* < */ + )) { + if (this.regexp_eatRegExpIdentifierName(state2) && state2.eat( + 62 + /* > */ + )) { + return true; + } + state2.raise("Invalid capture group name"); + } + return false; +}; +pp$1.regexp_eatRegExpIdentifierName = function(state2) { + state2.lastStringValue = ""; + if (this.regexp_eatRegExpIdentifierStart(state2)) { + state2.lastStringValue += codePointToString(state2.lastIntValue); + while (this.regexp_eatRegExpIdentifierPart(state2)) { + state2.lastStringValue += codePointToString(state2.lastIntValue); + } + return true; + } + return false; +}; +pp$1.regexp_eatRegExpIdentifierStart = function(state2) { + var start = state2.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state2.current(forceU); + state2.advance(forceU); + if (ch === 92 && this.regexp_eatRegExpUnicodeEscapeSequence(state2, forceU)) { + ch = state2.lastIntValue; + } + if (isRegExpIdentifierStart(ch)) { + state2.lastIntValue = ch; + return true; + } + state2.pos = start; + return false; +}; +function isRegExpIdentifierStart(ch) { + return isIdentifierStart(ch, true) || ch === 36 || ch === 95; +} +pp$1.regexp_eatRegExpIdentifierPart = function(state2) { + var start = state2.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state2.current(forceU); + state2.advance(forceU); + if (ch === 92 && this.regexp_eatRegExpUnicodeEscapeSequence(state2, forceU)) { + ch = state2.lastIntValue; + } + if (isRegExpIdentifierPart(ch)) { + state2.lastIntValue = ch; + return true; + } + state2.pos = start; + return false; +}; +function isRegExpIdentifierPart(ch) { + return isIdentifierChar(ch, true) || ch === 36 || ch === 95 || ch === 8204 || ch === 8205; +} +pp$1.regexp_eatAtomEscape = function(state2) { + if (this.regexp_eatBackReference(state2) || this.regexp_eatCharacterClassEscape(state2) || this.regexp_eatCharacterEscape(state2) || state2.switchN && this.regexp_eatKGroupName(state2)) { + return true; + } + if (state2.switchU) { + if (state2.current() === 99) { + state2.raise("Invalid unicode escape"); + } + state2.raise("Invalid escape"); + } + return false; +}; +pp$1.regexp_eatBackReference = function(state2) { + var start = state2.pos; + if (this.regexp_eatDecimalEscape(state2)) { + var n = state2.lastIntValue; + if (state2.switchU) { + if (n > state2.maxBackReference) { + state2.maxBackReference = n; + } + return true; + } + if (n <= state2.numCapturingParens) { + return true; + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatKGroupName = function(state2) { + if (state2.eat( + 107 + /* k */ + )) { + if (this.regexp_eatGroupName(state2)) { + state2.backReferenceNames.push(state2.lastStringValue); + return true; + } + state2.raise("Invalid named reference"); + } + return false; +}; +pp$1.regexp_eatCharacterEscape = function(state2) { + return this.regexp_eatControlEscape(state2) || this.regexp_eatCControlLetter(state2) || this.regexp_eatZero(state2) || this.regexp_eatHexEscapeSequence(state2) || this.regexp_eatRegExpUnicodeEscapeSequence(state2, false) || !state2.switchU && this.regexp_eatLegacyOctalEscapeSequence(state2) || this.regexp_eatIdentityEscape(state2); +}; +pp$1.regexp_eatCControlLetter = function(state2) { + var start = state2.pos; + if (state2.eat( + 99 + /* c */ + )) { + if (this.regexp_eatControlLetter(state2)) { + return true; + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatZero = function(state2) { + if (state2.current() === 48 && !isDecimalDigit(state2.lookahead())) { + state2.lastIntValue = 0; + state2.advance(); + return true; + } + return false; +}; +pp$1.regexp_eatControlEscape = function(state2) { + var ch = state2.current(); + if (ch === 116) { + state2.lastIntValue = 9; + state2.advance(); + return true; + } + if (ch === 110) { + state2.lastIntValue = 10; + state2.advance(); + return true; + } + if (ch === 118) { + state2.lastIntValue = 11; + state2.advance(); + return true; + } + if (ch === 102) { + state2.lastIntValue = 12; + state2.advance(); + return true; + } + if (ch === 114) { + state2.lastIntValue = 13; + state2.advance(); + return true; + } + return false; +}; +pp$1.regexp_eatControlLetter = function(state2) { + var ch = state2.current(); + if (isControlLetter(ch)) { + state2.lastIntValue = ch % 32; + state2.advance(); + return true; + } + return false; +}; +function isControlLetter(ch) { + return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122; +} +pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state2, forceU) { + if (forceU === void 0) forceU = false; + var start = state2.pos; + var switchU = forceU || state2.switchU; + if (state2.eat( + 117 + /* u */ + )) { + if (this.regexp_eatFixedHexDigits(state2, 4)) { + var lead = state2.lastIntValue; + if (switchU && lead >= 55296 && lead <= 56319) { + var leadSurrogateEnd = state2.pos; + if (state2.eat( + 92 + /* \ */ + ) && state2.eat( + 117 + /* u */ + ) && this.regexp_eatFixedHexDigits(state2, 4)) { + var trail = state2.lastIntValue; + if (trail >= 56320 && trail <= 57343) { + state2.lastIntValue = (lead - 55296) * 1024 + (trail - 56320) + 65536; + return true; + } + } + state2.pos = leadSurrogateEnd; + state2.lastIntValue = lead; + } + return true; + } + if (switchU && state2.eat( + 123 + /* { */ + ) && this.regexp_eatHexDigits(state2) && state2.eat( + 125 + /* } */ + ) && isValidUnicode(state2.lastIntValue)) { + return true; + } + if (switchU) { + state2.raise("Invalid unicode escape"); + } + state2.pos = start; + } + return false; +}; +function isValidUnicode(ch) { + return ch >= 0 && ch <= 1114111; +} +pp$1.regexp_eatIdentityEscape = function(state2) { + if (state2.switchU) { + if (this.regexp_eatSyntaxCharacter(state2)) { + return true; + } + if (state2.eat( + 47 + /* / */ + )) { + state2.lastIntValue = 47; + return true; + } + return false; + } + var ch = state2.current(); + if (ch !== 99 && (!state2.switchN || ch !== 107)) { + state2.lastIntValue = ch; + state2.advance(); + return true; + } + return false; +}; +pp$1.regexp_eatDecimalEscape = function(state2) { + state2.lastIntValue = 0; + var ch = state2.current(); + if (ch >= 49 && ch <= 57) { + do { + state2.lastIntValue = 10 * state2.lastIntValue + (ch - 48); + state2.advance(); + } while ((ch = state2.current()) >= 48 && ch <= 57); + return true; + } + return false; +}; +var CharSetNone = 0; +var CharSetOk = 1; +var CharSetString = 2; +pp$1.regexp_eatCharacterClassEscape = function(state2) { + var ch = state2.current(); + if (isCharacterClassEscape(ch)) { + state2.lastIntValue = -1; + state2.advance(); + return CharSetOk; + } + var negate = false; + if (state2.switchU && this.options.ecmaVersion >= 9 && ((negate = ch === 80) || ch === 112)) { + state2.lastIntValue = -1; + state2.advance(); + var result; + if (state2.eat( + 123 + /* { */ + ) && (result = this.regexp_eatUnicodePropertyValueExpression(state2)) && state2.eat( + 125 + /* } */ + )) { + if (negate && result === CharSetString) { + state2.raise("Invalid property name"); + } + return result; + } + state2.raise("Invalid property name"); + } + return CharSetNone; +}; +function isCharacterClassEscape(ch) { + return ch === 100 || ch === 68 || ch === 115 || ch === 83 || ch === 119 || ch === 87; +} +pp$1.regexp_eatUnicodePropertyValueExpression = function(state2) { + var start = state2.pos; + if (this.regexp_eatUnicodePropertyName(state2) && state2.eat( + 61 + /* = */ + )) { + var name = state2.lastStringValue; + if (this.regexp_eatUnicodePropertyValue(state2)) { + var value = state2.lastStringValue; + this.regexp_validateUnicodePropertyNameAndValue(state2, name, value); + return CharSetOk; + } + } + state2.pos = start; + if (this.regexp_eatLoneUnicodePropertyNameOrValue(state2)) { + var nameOrValue = state2.lastStringValue; + return this.regexp_validateUnicodePropertyNameOrValue(state2, nameOrValue); + } + return CharSetNone; +}; +pp$1.regexp_validateUnicodePropertyNameAndValue = function(state2, name, value) { + if (!hasOwn(state2.unicodeProperties.nonBinary, name)) { + state2.raise("Invalid property name"); + } + if (!state2.unicodeProperties.nonBinary[name].test(value)) { + state2.raise("Invalid property value"); + } +}; +pp$1.regexp_validateUnicodePropertyNameOrValue = function(state2, nameOrValue) { + if (state2.unicodeProperties.binary.test(nameOrValue)) { + return CharSetOk; + } + if (state2.switchV && state2.unicodeProperties.binaryOfStrings.test(nameOrValue)) { + return CharSetString; + } + state2.raise("Invalid property name"); +}; +pp$1.regexp_eatUnicodePropertyName = function(state2) { + var ch = 0; + state2.lastStringValue = ""; + while (isUnicodePropertyNameCharacter(ch = state2.current())) { + state2.lastStringValue += codePointToString(ch); + state2.advance(); + } + return state2.lastStringValue !== ""; +}; +function isUnicodePropertyNameCharacter(ch) { + return isControlLetter(ch) || ch === 95; +} +pp$1.regexp_eatUnicodePropertyValue = function(state2) { + var ch = 0; + state2.lastStringValue = ""; + while (isUnicodePropertyValueCharacter(ch = state2.current())) { + state2.lastStringValue += codePointToString(ch); + state2.advance(); + } + return state2.lastStringValue !== ""; +}; +function isUnicodePropertyValueCharacter(ch) { + return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch); +} +pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state2) { + return this.regexp_eatUnicodePropertyValue(state2); +}; +pp$1.regexp_eatCharacterClass = function(state2) { + if (state2.eat( + 91 + /* [ */ + )) { + var negate = state2.eat( + 94 + /* ^ */ + ); + var result = this.regexp_classContents(state2); + if (!state2.eat( + 93 + /* ] */ + )) { + state2.raise("Unterminated character class"); + } + if (negate && result === CharSetString) { + state2.raise("Negated character class may contain strings"); + } + return true; + } + return false; +}; +pp$1.regexp_classContents = function(state2) { + if (state2.current() === 93) { + return CharSetOk; + } + if (state2.switchV) { + return this.regexp_classSetExpression(state2); + } + this.regexp_nonEmptyClassRanges(state2); + return CharSetOk; +}; +pp$1.regexp_nonEmptyClassRanges = function(state2) { + while (this.regexp_eatClassAtom(state2)) { + var left = state2.lastIntValue; + if (state2.eat( + 45 + /* - */ + ) && this.regexp_eatClassAtom(state2)) { + var right = state2.lastIntValue; + if (state2.switchU && (left === -1 || right === -1)) { + state2.raise("Invalid character class"); + } + if (left !== -1 && right !== -1 && left > right) { + state2.raise("Range out of order in character class"); + } + } + } +}; +pp$1.regexp_eatClassAtom = function(state2) { + var start = state2.pos; + if (state2.eat( + 92 + /* \ */ + )) { + if (this.regexp_eatClassEscape(state2)) { + return true; + } + if (state2.switchU) { + var ch$1 = state2.current(); + if (ch$1 === 99 || isOctalDigit(ch$1)) { + state2.raise("Invalid class escape"); + } + state2.raise("Invalid escape"); + } + state2.pos = start; + } + var ch = state2.current(); + if (ch !== 93) { + state2.lastIntValue = ch; + state2.advance(); + return true; + } + return false; +}; +pp$1.regexp_eatClassEscape = function(state2) { + var start = state2.pos; + if (state2.eat( + 98 + /* b */ + )) { + state2.lastIntValue = 8; + return true; + } + if (state2.switchU && state2.eat( + 45 + /* - */ + )) { + state2.lastIntValue = 45; + return true; + } + if (!state2.switchU && state2.eat( + 99 + /* c */ + )) { + if (this.regexp_eatClassControlLetter(state2)) { + return true; + } + state2.pos = start; + } + return this.regexp_eatCharacterClassEscape(state2) || this.regexp_eatCharacterEscape(state2); +}; +pp$1.regexp_classSetExpression = function(state2) { + var result = CharSetOk, subResult; + if (this.regexp_eatClassSetRange(state2)) ; + else if (subResult = this.regexp_eatClassSetOperand(state2)) { + if (subResult === CharSetString) { + result = CharSetString; + } + var start = state2.pos; + while (state2.eatChars( + [38, 38] + /* && */ + )) { + if (state2.current() !== 38 && (subResult = this.regexp_eatClassSetOperand(state2))) { + if (subResult !== CharSetString) { + result = CharSetOk; + } + continue; + } + state2.raise("Invalid character in character class"); + } + if (start !== state2.pos) { + return result; + } + while (state2.eatChars( + [45, 45] + /* -- */ + )) { + if (this.regexp_eatClassSetOperand(state2)) { + continue; + } + state2.raise("Invalid character in character class"); + } + if (start !== state2.pos) { + return result; + } + } else { + state2.raise("Invalid character in character class"); + } + for (; ; ) { + if (this.regexp_eatClassSetRange(state2)) { + continue; + } + subResult = this.regexp_eatClassSetOperand(state2); + if (!subResult) { + return result; + } + if (subResult === CharSetString) { + result = CharSetString; + } + } +}; +pp$1.regexp_eatClassSetRange = function(state2) { + var start = state2.pos; + if (this.regexp_eatClassSetCharacter(state2)) { + var left = state2.lastIntValue; + if (state2.eat( + 45 + /* - */ + ) && this.regexp_eatClassSetCharacter(state2)) { + var right = state2.lastIntValue; + if (left !== -1 && right !== -1 && left > right) { + state2.raise("Range out of order in character class"); + } + return true; + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatClassSetOperand = function(state2) { + if (this.regexp_eatClassSetCharacter(state2)) { + return CharSetOk; + } + return this.regexp_eatClassStringDisjunction(state2) || this.regexp_eatNestedClass(state2); +}; +pp$1.regexp_eatNestedClass = function(state2) { + var start = state2.pos; + if (state2.eat( + 91 + /* [ */ + )) { + var negate = state2.eat( + 94 + /* ^ */ + ); + var result = this.regexp_classContents(state2); + if (state2.eat( + 93 + /* ] */ + )) { + if (negate && result === CharSetString) { + state2.raise("Negated character class may contain strings"); + } + return result; + } + state2.pos = start; + } + if (state2.eat( + 92 + /* \ */ + )) { + var result$1 = this.regexp_eatCharacterClassEscape(state2); + if (result$1) { + return result$1; + } + state2.pos = start; + } + return null; +}; +pp$1.regexp_eatClassStringDisjunction = function(state2) { + var start = state2.pos; + if (state2.eatChars( + [92, 113] + /* \q */ + )) { + if (state2.eat( + 123 + /* { */ + )) { + var result = this.regexp_classStringDisjunctionContents(state2); + if (state2.eat( + 125 + /* } */ + )) { + return result; + } + } else { + state2.raise("Invalid escape"); + } + state2.pos = start; + } + return null; +}; +pp$1.regexp_classStringDisjunctionContents = function(state2) { + var result = this.regexp_classString(state2); + while (state2.eat( + 124 + /* | */ + )) { + if (this.regexp_classString(state2) === CharSetString) { + result = CharSetString; + } + } + return result; +}; +pp$1.regexp_classString = function(state2) { + var count = 0; + while (this.regexp_eatClassSetCharacter(state2)) { + count++; + } + return count === 1 ? CharSetOk : CharSetString; +}; +pp$1.regexp_eatClassSetCharacter = function(state2) { + var start = state2.pos; + if (state2.eat( + 92 + /* \ */ + )) { + if (this.regexp_eatCharacterEscape(state2) || this.regexp_eatClassSetReservedPunctuator(state2)) { + return true; + } + if (state2.eat( + 98 + /* b */ + )) { + state2.lastIntValue = 8; + return true; + } + state2.pos = start; + return false; + } + var ch = state2.current(); + if (ch < 0 || ch === state2.lookahead() && isClassSetReservedDoublePunctuatorCharacter(ch)) { + return false; + } + if (isClassSetSyntaxCharacter(ch)) { + return false; + } + state2.advance(); + state2.lastIntValue = ch; + return true; +}; +function isClassSetReservedDoublePunctuatorCharacter(ch) { + return ch === 33 || ch >= 35 && ch <= 38 || ch >= 42 && ch <= 44 || ch === 46 || ch >= 58 && ch <= 64 || ch === 94 || ch === 96 || ch === 126; +} +function isClassSetSyntaxCharacter(ch) { + return ch === 40 || ch === 41 || ch === 45 || ch === 47 || ch >= 91 && ch <= 93 || ch >= 123 && ch <= 125; +} +pp$1.regexp_eatClassSetReservedPunctuator = function(state2) { + var ch = state2.current(); + if (isClassSetReservedPunctuator(ch)) { + state2.lastIntValue = ch; + state2.advance(); + return true; + } + return false; +}; +function isClassSetReservedPunctuator(ch) { + return ch === 33 || ch === 35 || ch === 37 || ch === 38 || ch === 44 || ch === 45 || ch >= 58 && ch <= 62 || ch === 64 || ch === 96 || ch === 126; +} +pp$1.regexp_eatClassControlLetter = function(state2) { + var ch = state2.current(); + if (isDecimalDigit(ch) || ch === 95) { + state2.lastIntValue = ch % 32; + state2.advance(); + return true; + } + return false; +}; +pp$1.regexp_eatHexEscapeSequence = function(state2) { + var start = state2.pos; + if (state2.eat( + 120 + /* x */ + )) { + if (this.regexp_eatFixedHexDigits(state2, 2)) { + return true; + } + if (state2.switchU) { + state2.raise("Invalid escape"); + } + state2.pos = start; + } + return false; +}; +pp$1.regexp_eatDecimalDigits = function(state2) { + var start = state2.pos; + var ch = 0; + state2.lastIntValue = 0; + while (isDecimalDigit(ch = state2.current())) { + state2.lastIntValue = 10 * state2.lastIntValue + (ch - 48); + state2.advance(); + } + return state2.pos !== start; +}; +function isDecimalDigit(ch) { + return ch >= 48 && ch <= 57; +} +pp$1.regexp_eatHexDigits = function(state2) { + var start = state2.pos; + var ch = 0; + state2.lastIntValue = 0; + while (isHexDigit(ch = state2.current())) { + state2.lastIntValue = 16 * state2.lastIntValue + hexToInt(ch); + state2.advance(); + } + return state2.pos !== start; +}; +function isHexDigit(ch) { + return ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102; +} +function hexToInt(ch) { + if (ch >= 65 && ch <= 70) { + return 10 + (ch - 65); + } + if (ch >= 97 && ch <= 102) { + return 10 + (ch - 97); + } + return ch - 48; +} +pp$1.regexp_eatLegacyOctalEscapeSequence = function(state2) { + if (this.regexp_eatOctalDigit(state2)) { + var n1 = state2.lastIntValue; + if (this.regexp_eatOctalDigit(state2)) { + var n2 = state2.lastIntValue; + if (n1 <= 3 && this.regexp_eatOctalDigit(state2)) { + state2.lastIntValue = n1 * 64 + n2 * 8 + state2.lastIntValue; + } else { + state2.lastIntValue = n1 * 8 + n2; + } + } else { + state2.lastIntValue = n1; + } + return true; + } + return false; +}; +pp$1.regexp_eatOctalDigit = function(state2) { + var ch = state2.current(); + if (isOctalDigit(ch)) { + state2.lastIntValue = ch - 48; + state2.advance(); + return true; + } + state2.lastIntValue = 0; + return false; +}; +function isOctalDigit(ch) { + return ch >= 48 && ch <= 55; +} +pp$1.regexp_eatFixedHexDigits = function(state2, length) { + var start = state2.pos; + state2.lastIntValue = 0; + for (var i = 0; i < length; ++i) { + var ch = state2.current(); + if (!isHexDigit(ch)) { + state2.pos = start; + return false; + } + state2.lastIntValue = 16 * state2.lastIntValue + hexToInt(ch); + state2.advance(); + } + return true; +}; +var Token = function Token2(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) { + this.loc = new SourceLocation(p, p.startLoc, p.endLoc); + } + if (p.options.ranges) { + this.range = [p.start, p.end]; + } +}; +var pp = Parser2.prototype; +pp.next = function(ignoreEscapeSequenceInKeyword) { + if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc) { + this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); + } + if (this.options.onToken) { + this.options.onToken(new Token(this)); + } + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); +}; +pp.getToken = function() { + this.next(); + return new Token(this); +}; +if (typeof Symbol !== "undefined") { + pp[Symbol.iterator] = function() { + var this$1$1 = this; + return { + next: function() { + var token = this$1$1.getToken(); + return { + done: token.type === types$1.eof, + value: token + }; + } + }; + }; +} +pp.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { + this.skipSpace(); + } + this.start = this.pos; + if (this.options.locations) { + this.startLoc = this.curPosition(); + } + if (this.pos >= this.input.length) { + return this.finishToken(types$1.eof); + } + if (curContext.override) { + return curContext.override(this); + } else { + this.readToken(this.fullCharCodeAtPos()); + } +}; +pp.readToken = function(code) { + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92) { + return this.readWord(); + } + return this.getTokenFromCode(code); +}; +pp.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 55295 || code >= 56320) { + return code; + } + var next = this.input.charCodeAt(this.pos + 1); + return next <= 56319 || next >= 57344 ? code : (code << 10) + next - 56613888; +}; +pp.skipBlockComment = function() { + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { + this.raise(this.pos - 2, "Unterminated comment"); + } + this.pos = end + 2; + if (this.options.locations) { + for (var nextBreak = void 0, pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1; ) { + ++this.curLine; + pos = this.lineStart = nextBreak; + } + } + if (this.options.onComment) { + this.options.onComment( + true, + this.input.slice(start + 2, end), + start, + this.pos, + startLoc, + this.curPosition() + ); + } +}; +pp.skipLineComment = function(startSkip) { + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this.input.charCodeAt(++this.pos); + } + if (this.options.onComment) { + this.options.onComment( + false, + this.input.slice(start + startSkip, this.pos), + start, + this.pos, + startLoc, + this.curPosition() + ); + } +}; +pp.skipSpace = function() { + loop: while (this.pos < this.input.length) { + var ch = this.input.charCodeAt(this.pos); + switch (ch) { + case 32: + case 160: + ++this.pos; + break; + case 13: + if (this.input.charCodeAt(this.pos + 1) === 10) { + ++this.pos; + } + case 10: + case 8232: + case 8233: + ++this.pos; + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + break; + case 47: + switch (this.input.charCodeAt(this.pos + 1)) { + case 42: + this.skipBlockComment(); + break; + case 47: + this.skipLineComment(2); + break; + default: + break loop; + } + break; + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.pos; + } else { + break loop; + } + } + } +}; +pp.finishToken = function(type2, val) { + this.end = this.pos; + if (this.options.locations) { + this.endLoc = this.curPosition(); + } + var prevType = this.type; + this.type = type2; + this.value = val; + this.updateContext(prevType); +}; +pp.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { + return this.readNumber(true); + } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { + this.pos += 3; + return this.finishToken(types$1.ellipsis); + } else { + ++this.pos; + return this.finishToken(types$1.dot); + } +}; +pp.readToken_slash = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { + ++this.pos; + return this.readRegexp(); + } + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(types$1.slash, 1); +}; +pp.readToken_mult_modulo_exp = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types$1.star : types$1.modulo; + if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { + ++size; + tokentype = types$1.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + if (next === 61) { + return this.finishOp(types$1.assign, size + 1); + } + return this.finishOp(tokentype, size); +}; +pp.readToken_pipe_amp = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (this.options.ecmaVersion >= 12) { + var next2 = this.input.charCodeAt(this.pos + 2); + if (next2 === 61) { + return this.finishOp(types$1.assign, 3); + } + } + return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2); + } + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1); +}; +pp.readToken_caret = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(types$1.bitwiseXOR, 1); +}; +pp.readToken_plus_min = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken(); + } + return this.finishOp(types$1.incDec, 2); + } + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(types$1.plusMin, 1); +}; +pp.readToken_lt_gt = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { + return this.finishOp(types$1.assign, size + 1); + } + return this.finishOp(types$1.bitShift, size); + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && this.input.charCodeAt(this.pos + 3) === 45) { + this.skipLineComment(4); + this.skipSpace(); + return this.nextToken(); + } + if (next === 61) { + size = 2; + } + return this.finishOp(types$1.relational, size); +}; +pp.readToken_eq_excl = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { + return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2); + } + if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { + this.pos += 2; + return this.finishToken(types$1.arrow); + } + return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1); +}; +pp.readToken_question = function() { + var ecmaVersion = this.options.ecmaVersion; + if (ecmaVersion >= 11) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 46) { + var next2 = this.input.charCodeAt(this.pos + 2); + if (next2 < 48 || next2 > 57) { + return this.finishOp(types$1.questionDot, 2); + } + } + if (next === 63) { + if (ecmaVersion >= 12) { + var next2$1 = this.input.charCodeAt(this.pos + 2); + if (next2$1 === 61) { + return this.finishOp(types$1.assign, 3); + } + } + return this.finishOp(types$1.coalesce, 2); + } + } + return this.finishOp(types$1.question, 1); +}; +pp.readToken_numberSign = function() { + var ecmaVersion = this.options.ecmaVersion; + var code = 35; + if (ecmaVersion >= 13) { + ++this.pos; + code = this.fullCharCodeAtPos(); + if (isIdentifierStart(code, true) || code === 92) { + return this.finishToken(types$1.privateId, this.readWord1()); + } + } + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); +}; +pp.getTokenFromCode = function(code) { + switch (code) { + // The interpretation of a dot depends on whether it is followed + // by a digit or another two dots. + case 46: + return this.readToken_dot(); + // Punctuation tokens. + case 40: + ++this.pos; + return this.finishToken(types$1.parenL); + case 41: + ++this.pos; + return this.finishToken(types$1.parenR); + case 59: + ++this.pos; + return this.finishToken(types$1.semi); + case 44: + ++this.pos; + return this.finishToken(types$1.comma); + case 91: + ++this.pos; + return this.finishToken(types$1.bracketL); + case 93: + ++this.pos; + return this.finishToken(types$1.bracketR); + case 123: + ++this.pos; + return this.finishToken(types$1.braceL); + case 125: + ++this.pos; + return this.finishToken(types$1.braceR); + case 58: + ++this.pos; + return this.finishToken(types$1.colon); + case 96: + if (this.options.ecmaVersion < 6) { + break; + } + ++this.pos; + return this.finishToken(types$1.backQuote); + case 48: + var next = this.input.charCodeAt(this.pos + 1); + if (next === 120 || next === 88) { + return this.readRadixNumber(16); + } + if (this.options.ecmaVersion >= 6) { + if (next === 111 || next === 79) { + return this.readRadixNumber(8); + } + if (next === 98 || next === 66) { + return this.readRadixNumber(2); + } + } + // Anything else beginning with a digit is an integer, octal + // number, or float. + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + return this.readNumber(false); + // Quotes produce strings. + case 34: + case 39: + return this.readString(code); + // Operators are parsed inline in tiny state machines. '=' (61) is + // often referred to. `finishOp` simply skips the amount of + // characters it is given as second argument, and returns a token + // of the type given by its first argument. + case 47: + return this.readToken_slash(); + case 37: + case 42: + return this.readToken_mult_modulo_exp(code); + case 124: + case 38: + return this.readToken_pipe_amp(code); + case 94: + return this.readToken_caret(); + case 43: + case 45: + return this.readToken_plus_min(code); + case 60: + case 62: + return this.readToken_lt_gt(code); + case 61: + case 33: + return this.readToken_eq_excl(code); + case 63: + return this.readToken_question(); + case 126: + return this.finishOp(types$1.prefix, 1); + case 35: + return this.readToken_numberSign(); + } + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); +}; +pp.finishOp = function(type2, size) { + var str = this.input.slice(this.pos, this.pos + size); + this.pos += size; + return this.finishToken(type2, str); +}; +pp.readRegexp = function() { + var escaped2, inClass, start = this.pos; + for (; ; ) { + if (this.pos >= this.input.length) { + this.raise(start, "Unterminated regular expression"); + } + var ch = this.input.charAt(this.pos); + if (lineBreak.test(ch)) { + this.raise(start, "Unterminated regular expression"); + } + if (!escaped2) { + if (ch === "[") { + inClass = true; + } else if (ch === "]" && inClass) { + inClass = false; + } else if (ch === "/" && !inClass) { + break; + } + escaped2 = ch === "\\"; + } else { + escaped2 = false; + } + ++this.pos; + } + var pattern = this.input.slice(start, this.pos); + ++this.pos; + var flagsStart = this.pos; + var flags = this.readWord1(); + if (this.containsEsc) { + this.unexpected(flagsStart); + } + var state2 = this.regexpState || (this.regexpState = new RegExpValidationState(this)); + state2.reset(start, pattern, flags); + this.validateRegExpFlags(state2); + this.validateRegExpPattern(state2); + var value = null; + try { + value = new RegExp(pattern, flags); + } catch (e) { + } + return this.finishToken(types$1.regexp, { pattern, flags, value }); +}; +pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) { + var allowSeparators = this.options.ecmaVersion >= 12 && len === void 0; + var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48; + var start = this.pos, total = 0, lastCode = 0; + for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) { + var code = this.input.charCodeAt(this.pos), val = void 0; + if (allowSeparators && code === 95) { + if (isLegacyOctalNumericLiteral) { + this.raiseRecoverable(this.pos, "Numeric separator is not allowed in legacy octal numeric literals"); + } + if (lastCode === 95) { + this.raiseRecoverable(this.pos, "Numeric separator must be exactly one underscore"); + } + if (i === 0) { + this.raiseRecoverable(this.pos, "Numeric separator is not allowed at the first of digits"); + } + lastCode = code; + continue; + } + if (code >= 97) { + val = code - 97 + 10; + } else if (code >= 65) { + val = code - 65 + 10; + } else if (code >= 48 && code <= 57) { + val = code - 48; + } else { + val = Infinity; + } + if (val >= radix) { + break; + } + lastCode = code; + total = total * radix + val; + } + if (allowSeparators && lastCode === 95) { + this.raiseRecoverable(this.pos - 1, "Numeric separator is not allowed at the last of digits"); + } + if (this.pos === start || len != null && this.pos - start !== len) { + return null; + } + return total; +}; +function stringToNumber(str, isLegacyOctalNumericLiteral) { + if (isLegacyOctalNumericLiteral) { + return parseInt(str, 8); + } + return parseFloat(str.replace(/_/g, "")); +} +function stringToBigInt(str) { + if (typeof BigInt !== "function") { + return null; + } + return BigInt(str.replace(/_/g, "")); +} +pp.readRadixNumber = function(radix) { + var start = this.pos; + this.pos += 2; + var val = this.readInt(radix); + if (val == null) { + this.raise(this.start + 2, "Expected number in radix " + radix); + } + if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) { + val = stringToBigInt(this.input.slice(start, this.pos)); + ++this.pos; + } else if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.pos, "Identifier directly after number"); + } + return this.finishToken(types$1.num, val); +}; +pp.readNumber = function(startsWithDot) { + var start = this.pos; + if (!startsWithDot && this.readInt(10, void 0, true) === null) { + this.raise(start, "Invalid number"); + } + var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48; + if (octal && this.strict) { + this.raise(start, "Invalid number"); + } + var next = this.input.charCodeAt(this.pos); + if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) { + var val$1 = stringToBigInt(this.input.slice(start, this.pos)); + ++this.pos; + if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.pos, "Identifier directly after number"); + } + return this.finishToken(types$1.num, val$1); + } + if (octal && /[89]/.test(this.input.slice(start, this.pos))) { + octal = false; + } + if (next === 46 && !octal) { + ++this.pos; + this.readInt(10); + next = this.input.charCodeAt(this.pos); + } + if ((next === 69 || next === 101) && !octal) { + next = this.input.charCodeAt(++this.pos); + if (next === 43 || next === 45) { + ++this.pos; + } + if (this.readInt(10) === null) { + this.raise(start, "Invalid number"); + } + } + if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.pos, "Identifier directly after number"); + } + var val = stringToNumber(this.input.slice(start, this.pos), octal); + return this.finishToken(types$1.num, val); +}; +pp.readCodePoint = function() { + var ch = this.input.charCodeAt(this.pos), code; + if (ch === 123) { + if (this.options.ecmaVersion < 6) { + this.unexpected(); + } + var codePos = ++this.pos; + code = this.readHexChar(this.input.indexOf("}", this.pos) - this.pos); + ++this.pos; + if (code > 1114111) { + this.invalidStringToken(codePos, "Code point out of bounds"); + } + } else { + code = this.readHexChar(4); + } + return code; +}; +pp.readString = function(quote2) { + var out = "", chunkStart = ++this.pos; + for (; ; ) { + if (this.pos >= this.input.length) { + this.raise(this.start, "Unterminated string constant"); + } + var ch = this.input.charCodeAt(this.pos); + if (ch === quote2) { + break; + } + if (ch === 92) { + out += this.input.slice(chunkStart, this.pos); + out += this.readEscapedChar(false); + chunkStart = this.pos; + } else if (ch === 8232 || ch === 8233) { + if (this.options.ecmaVersion < 10) { + this.raise(this.start, "Unterminated string constant"); + } + ++this.pos; + if (this.options.locations) { + this.curLine++; + this.lineStart = this.pos; + } + } else { + if (isNewLine(ch)) { + this.raise(this.start, "Unterminated string constant"); + } + ++this.pos; + } + } + out += this.input.slice(chunkStart, this.pos++); + return this.finishToken(types$1.string, out); +}; +var INVALID_TEMPLATE_ESCAPE_ERROR = {}; +pp.tryReadTemplateToken = function() { + this.inTemplateElement = true; + try { + this.readTmplToken(); + } catch (err) { + if (err === INVALID_TEMPLATE_ESCAPE_ERROR) { + this.readInvalidTemplateToken(); + } else { + throw err; + } + } + this.inTemplateElement = false; +}; +pp.invalidStringToken = function(position, message) { + if (this.inTemplateElement && this.options.ecmaVersion >= 9) { + throw INVALID_TEMPLATE_ESCAPE_ERROR; + } else { + this.raise(position, message); + } +}; +pp.readTmplToken = function() { + var out = "", chunkStart = this.pos; + for (; ; ) { + if (this.pos >= this.input.length) { + this.raise(this.start, "Unterminated template"); + } + var ch = this.input.charCodeAt(this.pos); + if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { + if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) { + if (ch === 36) { + this.pos += 2; + return this.finishToken(types$1.dollarBraceL); + } else { + ++this.pos; + return this.finishToken(types$1.backQuote); + } + } + out += this.input.slice(chunkStart, this.pos); + return this.finishToken(types$1.template, out); + } + if (ch === 92) { + out += this.input.slice(chunkStart, this.pos); + out += this.readEscapedChar(true); + chunkStart = this.pos; + } else if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.pos); + ++this.pos; + switch (ch) { + case 13: + if (this.input.charCodeAt(this.pos) === 10) { + ++this.pos; + } + case 10: + out += "\n"; + break; + default: + out += String.fromCharCode(ch); + break; + } + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + chunkStart = this.pos; + } else { + ++this.pos; + } + } +}; +pp.readInvalidTemplateToken = function() { + for (; this.pos < this.input.length; this.pos++) { + switch (this.input[this.pos]) { + case "\\": + ++this.pos; + break; + case "$": + if (this.input[this.pos + 1] !== "{") { + break; + } + // fall through + case "`": + return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos)); + case "\r": + if (this.input[this.pos + 1] === "\n") { + ++this.pos; + } + // fall through + case "\n": + case "\u2028": + case "\u2029": + ++this.curLine; + this.lineStart = this.pos + 1; + break; + } + } + this.raise(this.start, "Unterminated template"); +}; +pp.readEscapedChar = function(inTemplate) { + var ch = this.input.charCodeAt(++this.pos); + ++this.pos; + switch (ch) { + case 110: + return "\n"; + // 'n' -> '\n' + case 114: + return "\r"; + // 'r' -> '\r' + case 120: + return String.fromCharCode(this.readHexChar(2)); + // 'x' + case 117: + return codePointToString(this.readCodePoint()); + // 'u' + case 116: + return " "; + // 't' -> '\t' + case 98: + return "\b"; + // 'b' -> '\b' + case 118: + return "\v"; + // 'v' -> '\u000b' + case 102: + return "\f"; + // 'f' -> '\f' + case 13: + if (this.input.charCodeAt(this.pos) === 10) { + ++this.pos; + } + // '\r\n' + case 10: + if (this.options.locations) { + this.lineStart = this.pos; + ++this.curLine; + } + return ""; + case 56: + case 57: + if (this.strict) { + this.invalidStringToken( + this.pos - 1, + "Invalid escape sequence" + ); + } + if (inTemplate) { + var codePos = this.pos - 1; + this.invalidStringToken( + codePos, + "Invalid escape sequence in template string" + ); + } + default: + if (ch >= 48 && ch <= 55) { + var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0]; + var octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + this.pos += octalStr.length - 1; + ch = this.input.charCodeAt(this.pos); + if ((octalStr !== "0" || ch === 56 || ch === 57) && (this.strict || inTemplate)) { + this.invalidStringToken( + this.pos - 1 - octalStr.length, + inTemplate ? "Octal literal in template string" : "Octal literal in strict mode" + ); + } + return String.fromCharCode(octal); + } + if (isNewLine(ch)) { + if (this.options.locations) { + this.lineStart = this.pos; + ++this.curLine; + } + return ""; + } + return String.fromCharCode(ch); + } +}; +pp.readHexChar = function(len) { + var codePos = this.pos; + var n = this.readInt(16, len); + if (n === null) { + this.invalidStringToken(codePos, "Bad character escape sequence"); + } + return n; +}; +pp.readWord1 = function() { + this.containsEsc = false; + var word = "", first = true, chunkStart = this.pos; + var astral = this.options.ecmaVersion >= 6; + while (this.pos < this.input.length) { + var ch = this.fullCharCodeAtPos(); + if (isIdentifierChar(ch, astral)) { + this.pos += ch <= 65535 ? 1 : 2; + } else if (ch === 92) { + this.containsEsc = true; + word += this.input.slice(chunkStart, this.pos); + var escStart = this.pos; + if (this.input.charCodeAt(++this.pos) !== 117) { + this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX"); + } + ++this.pos; + var esc = this.readCodePoint(); + if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) { + this.invalidStringToken(escStart, "Invalid Unicode escape"); + } + word += codePointToString(esc); + chunkStart = this.pos; + } else { + break; + } + first = false; + } + return word + this.input.slice(chunkStart, this.pos); +}; +pp.readWord = function() { + var word = this.readWord1(); + var type2 = types$1.name; + if (this.keywords.test(word)) { + type2 = keywords[word]; + } + return this.finishToken(type2, word); +}; +var version = "8.14.0"; +Parser2.acorn = { + Parser: Parser2, + version, + defaultOptions, + Position, + SourceLocation, + getLineInfo, + Node: Node$1, + TokenType, + tokTypes: types$1, + keywordTypes: keywords, + TokContext, + tokContexts: types, + isIdentifierChar, + isIdentifierStart, + Token, + isNewLine, + lineBreak, + lineBreakG, + nonASCIIwhitespace +}; +function parse$1(input, options2) { + return Parser2.parse(input, options2); +} +function ancestor(node2, visitors, baseVisitor, state2, override) { + var ancestors = []; + if (!baseVisitor) { + baseVisitor = base; + } + (function c(node3, st, override2) { + var type2 = override2 || node3.type; + var isNew = node3 !== ancestors[ancestors.length - 1]; + if (isNew) { + ancestors.push(node3); + } + baseVisitor[type2](node3, st, c); + if (visitors[type2]) { + visitors[type2](node3, st || ancestors, ancestors); + } + if (isNew) { + ancestors.pop(); + } + })(node2, state2, override); +} +function skipThrough(node2, st, c) { + c(node2, st); +} +function ignore(_node, _st, _c2) { +} +var base = {}; +base.Program = base.BlockStatement = base.StaticBlock = function(node2, st, c) { + for (var i = 0, list = node2.body; i < list.length; i += 1) { + var stmt = list[i]; + c(stmt, st, "Statement"); + } +}; +base.Statement = skipThrough; +base.EmptyStatement = ignore; +base.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression = function(node2, st, c) { + return c(node2.expression, st, "Expression"); +}; +base.IfStatement = function(node2, st, c) { + c(node2.test, st, "Expression"); + c(node2.consequent, st, "Statement"); + if (node2.alternate) { + c(node2.alternate, st, "Statement"); + } +}; +base.LabeledStatement = function(node2, st, c) { + return c(node2.body, st, "Statement"); +}; +base.BreakStatement = base.ContinueStatement = ignore; +base.WithStatement = function(node2, st, c) { + c(node2.object, st, "Expression"); + c(node2.body, st, "Statement"); +}; +base.SwitchStatement = function(node2, st, c) { + c(node2.discriminant, st, "Expression"); + for (var i = 0, list = node2.cases; i < list.length; i += 1) { + var cs = list[i]; + c(cs, st); + } +}; +base.SwitchCase = function(node2, st, c) { + if (node2.test) { + c(node2.test, st, "Expression"); + } + for (var i = 0, list = node2.consequent; i < list.length; i += 1) { + var cons = list[i]; + c(cons, st, "Statement"); + } +}; +base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function(node2, st, c) { + if (node2.argument) { + c(node2.argument, st, "Expression"); + } +}; +base.ThrowStatement = base.SpreadElement = function(node2, st, c) { + return c(node2.argument, st, "Expression"); +}; +base.TryStatement = function(node2, st, c) { + c(node2.block, st, "Statement"); + if (node2.handler) { + c(node2.handler, st); + } + if (node2.finalizer) { + c(node2.finalizer, st, "Statement"); + } +}; +base.CatchClause = function(node2, st, c) { + if (node2.param) { + c(node2.param, st, "Pattern"); + } + c(node2.body, st, "Statement"); +}; +base.WhileStatement = base.DoWhileStatement = function(node2, st, c) { + c(node2.test, st, "Expression"); + c(node2.body, st, "Statement"); +}; +base.ForStatement = function(node2, st, c) { + if (node2.init) { + c(node2.init, st, "ForInit"); + } + if (node2.test) { + c(node2.test, st, "Expression"); + } + if (node2.update) { + c(node2.update, st, "Expression"); + } + c(node2.body, st, "Statement"); +}; +base.ForInStatement = base.ForOfStatement = function(node2, st, c) { + c(node2.left, st, "ForInit"); + c(node2.right, st, "Expression"); + c(node2.body, st, "Statement"); +}; +base.ForInit = function(node2, st, c) { + if (node2.type === "VariableDeclaration") { + c(node2, st); + } else { + c(node2, st, "Expression"); + } +}; +base.DebuggerStatement = ignore; +base.FunctionDeclaration = function(node2, st, c) { + return c(node2, st, "Function"); +}; +base.VariableDeclaration = function(node2, st, c) { + for (var i = 0, list = node2.declarations; i < list.length; i += 1) { + var decl = list[i]; + c(decl, st); + } +}; +base.VariableDeclarator = function(node2, st, c) { + c(node2.id, st, "Pattern"); + if (node2.init) { + c(node2.init, st, "Expression"); + } +}; +base.Function = function(node2, st, c) { + if (node2.id) { + c(node2.id, st, "Pattern"); + } + for (var i = 0, list = node2.params; i < list.length; i += 1) { + var param = list[i]; + c(param, st, "Pattern"); + } + c(node2.body, st, node2.expression ? "Expression" : "Statement"); +}; +base.Pattern = function(node2, st, c) { + if (node2.type === "Identifier") { + c(node2, st, "VariablePattern"); + } else if (node2.type === "MemberExpression") { + c(node2, st, "MemberPattern"); + } else { + c(node2, st); + } +}; +base.VariablePattern = ignore; +base.MemberPattern = skipThrough; +base.RestElement = function(node2, st, c) { + return c(node2.argument, st, "Pattern"); +}; +base.ArrayPattern = function(node2, st, c) { + for (var i = 0, list = node2.elements; i < list.length; i += 1) { + var elt = list[i]; + if (elt) { + c(elt, st, "Pattern"); + } + } +}; +base.ObjectPattern = function(node2, st, c) { + for (var i = 0, list = node2.properties; i < list.length; i += 1) { + var prop = list[i]; + if (prop.type === "Property") { + if (prop.computed) { + c(prop.key, st, "Expression"); + } + c(prop.value, st, "Pattern"); + } else if (prop.type === "RestElement") { + c(prop.argument, st, "Pattern"); + } + } +}; +base.Expression = skipThrough; +base.ThisExpression = base.Super = base.MetaProperty = ignore; +base.ArrayExpression = function(node2, st, c) { + for (var i = 0, list = node2.elements; i < list.length; i += 1) { + var elt = list[i]; + if (elt) { + c(elt, st, "Expression"); + } + } +}; +base.ObjectExpression = function(node2, st, c) { + for (var i = 0, list = node2.properties; i < list.length; i += 1) { + var prop = list[i]; + c(prop, st); + } +}; +base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; +base.SequenceExpression = function(node2, st, c) { + for (var i = 0, list = node2.expressions; i < list.length; i += 1) { + var expr = list[i]; + c(expr, st, "Expression"); + } +}; +base.TemplateLiteral = function(node2, st, c) { + for (var i = 0, list = node2.quasis; i < list.length; i += 1) { + var quasi = list[i]; + c(quasi, st); + } + for (var i$1 = 0, list$1 = node2.expressions; i$1 < list$1.length; i$1 += 1) { + var expr = list$1[i$1]; + c(expr, st, "Expression"); + } +}; +base.TemplateElement = ignore; +base.UnaryExpression = base.UpdateExpression = function(node2, st, c) { + c(node2.argument, st, "Expression"); +}; +base.BinaryExpression = base.LogicalExpression = function(node2, st, c) { + c(node2.left, st, "Expression"); + c(node2.right, st, "Expression"); +}; +base.AssignmentExpression = base.AssignmentPattern = function(node2, st, c) { + c(node2.left, st, "Pattern"); + c(node2.right, st, "Expression"); +}; +base.ConditionalExpression = function(node2, st, c) { + c(node2.test, st, "Expression"); + c(node2.consequent, st, "Expression"); + c(node2.alternate, st, "Expression"); +}; +base.NewExpression = base.CallExpression = function(node2, st, c) { + c(node2.callee, st, "Expression"); + if (node2.arguments) { + for (var i = 0, list = node2.arguments; i < list.length; i += 1) { + var arg = list[i]; + c(arg, st, "Expression"); + } + } +}; +base.MemberExpression = function(node2, st, c) { + c(node2.object, st, "Expression"); + if (node2.computed) { + c(node2.property, st, "Expression"); + } +}; +base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function(node2, st, c) { + if (node2.declaration) { + c(node2.declaration, st, node2.type === "ExportNamedDeclaration" || node2.declaration.id ? "Statement" : "Expression"); + } + if (node2.source) { + c(node2.source, st, "Expression"); + } +}; +base.ExportAllDeclaration = function(node2, st, c) { + if (node2.exported) { + c(node2.exported, st); + } + c(node2.source, st, "Expression"); +}; +base.ImportDeclaration = function(node2, st, c) { + for (var i = 0, list = node2.specifiers; i < list.length; i += 1) { + var spec = list[i]; + c(spec, st); + } + c(node2.source, st, "Expression"); +}; +base.ImportExpression = function(node2, st, c) { + c(node2.source, st, "Expression"); +}; +base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore; +base.TaggedTemplateExpression = function(node2, st, c) { + c(node2.tag, st, "Expression"); + c(node2.quasi, st, "Expression"); +}; +base.ClassDeclaration = base.ClassExpression = function(node2, st, c) { + return c(node2, st, "Class"); +}; +base.Class = function(node2, st, c) { + if (node2.id) { + c(node2.id, st, "Pattern"); + } + if (node2.superClass) { + c(node2.superClass, st, "Expression"); + } + c(node2.body, st); +}; +base.ClassBody = function(node2, st, c) { + for (var i = 0, list = node2.body; i < list.length; i += 1) { + var elt = list[i]; + c(elt, st); + } +}; +base.MethodDefinition = base.PropertyDefinition = base.Property = function(node2, st, c) { + if (node2.computed) { + c(node2.key, st, "Expression"); + } + if (node2.value) { + c(node2.value, st, "Expression"); + } +}; +const expectFnActions = { + "toHaveText": (text) => ["assertText", { text }], + "toContainText": (text) => ["assertText", { text, substring: true }], + "toBeChecked": () => ["assertChecked", { checked: true }], + "toBeVisible": () => ["assertVisible"], + "toHaveValue": (value) => ["assertValue", { value }], + "toBeEmpty": () => ["assertValue"], + "toMatchAriaSnapshot": (snapshot) => ["assertSnapshot", { snapshot }] +}; +const fnActions = { + "check": () => ["check"], + "click": (options2) => ["click", parseClickOptions(options2)], + "dblclick": (options2) => ["click", parseClickOptions({ ...options2, clickCount: 2 })], + "close": () => ["closePage"], + "fill": (text) => ["fill", { text }], + "goto": (url2) => ["navigate", { url: url2 }], + "newPage": () => ["openPage"], + "press": (shortcut) => ["press", parseShortcut(shortcut)], + "selectOption": (options2) => ["select", { options: typeof options2 === "string" ? [options2] : options2 }], + "uncheck": () => ["uncheck"], + "setInputFiles": (files) => ["setInputFiles", { files: typeof files === "string" ? [files] : files }], + "routeFromHAR": (har, options2) => ["routeFromHAR", { har, ...options2 }] +}; +const variableCallRegex = /^([a-zA-Z_$][\w$]*)\./; +function parseShortcut(shortcut) { + const parts = shortcut.split("+").map((s) => s.trim()); + return { + modifiers: fromKeyboardModifiers(parts.slice(0, parts.length - 1)), + key: parts[parts.length - 1] + }; +} +function cleanParams(params) { + if (!params) + return {}; + return Object.fromEntries(Object.entries(params).filter(([_, v]) => v !== void 0)); +} +function parseClickOptions(options2) { + const { modifiers, button, clickCount, position } = options2 ?? {}; + return { + button: button ?? "left", + modifiers: modifiers ? fromKeyboardModifiers(modifiers) : 0, + clickCount: clickCount ?? 1, + position: position ?? void 0 + }; +} +function indexToLineColumn(code, index2) { + const lines = code.split(/\r?\n/); + let line = 0; + let column = index2; + while (line < lines.length && column >= lines[line].length + 1) { + column -= lines[line].length + 1; + line++; + } + return { line: line + 1, column: column + 1 }; +} +class ParserError2 extends Error { + constructor(message, loc) { + super(`${message}${loc ? ` (${loc.start.line}:${loc.start.column})` : ""}`); + __publicField(this, "loc"); + this.loc = loc; + } +} +function parserError(message, loc) { + throw new ParserError2(message, loc ?? void 0); +} +const argsParser = (arg) => { + var _a2, _b2; + if (arg === null) + return arg; + if (arg.type === "SpreadElement") + parserError("Invalid spread element", arg.loc); + switch (arg.type) { + case "Literal": + return arg.value; + case "TemplateLiteral": + if (arg.quasis.length !== 1) + parserError("Invalid template literal", arg.loc); + const templateLiteral = arg.quasis[0].value.cooked ?? ""; + const indent = ((_b2 = (_a2 = templateLiteral.split(/\r?\n/).filter(Boolean)[0]) == null ? void 0 : _a2.match(/^( +)[^ ]/)) == null ? void 0 : _b2[1]) ?? ""; + return templateLiteral.replace(new RegExp(`^${indent}`, "gm"), "").trim(); + case "ArrayExpression": + return arg.elements.map(argsParser); + case "UnaryExpression": + if (arg.operator !== "-" || arg.argument.type !== "Literal" || typeof arg.argument.value !== "number") + parserError("Invalid number", arg.loc); + return -arg.argument.value; + case "ObjectExpression": + if (arg.properties.some((p) => p.type !== "Property" || p.key.type !== "Identifier" || !["Literal", "ObjectExpression", "ArrayExpression", "UnaryExpression"].includes(p.value.type))) + parserError("Invalid object property", arg.loc); + return Object.fromEntries(arg.properties.map((p) => p).map((p) => [p.key.name, argsParser(p.value)])); + } +}; +function parse3(code, file = "playwright-test") { + const ast = parse$1(code, { + ecmaVersion: 2020, + sourceType: "module", + locations: true + }); + function parseActionExpression(expr, pages) { + var _a2; + let pageAlias; + if (expr.type === "VariableDeclaration") { + if (expr.declarations.length !== 1 || expr.declarations[0].type !== "VariableDeclarator" || expr.declarations[0].id.type !== "Identifier" || ((_a2 = expr.declarations[0].init) == null ? void 0 : _a2.type) !== "AwaitExpression") + parserError("Invalid action expression", expr.loc); + pageAlias = expr.declarations[0].id.name; + expr = expr.declarations[0].init; + } + if (expr.type !== "AwaitExpression" || expr.argument.type !== "CallExpression" || expr.argument.callee.type !== "MemberExpression" || expr.argument.callee.property.type !== "Identifier") + parserError("Invalid action expression", expr.loc); + const actionFnName = expr.argument.callee.property.name; + let locator; + let expectAction = false; + let expectActionNegated = false; + if (pageAlias && actionFnName !== "newPage") + parserError("Invalid action expression, only newPage can be assigned variables", expr.argument.callee.loc); + if (!["newPage"].includes(actionFnName)) { + const [, variable] = variableCallRegex.exec(code.substring(expr.argument.start)) ?? []; + if (variable && !pages.has(variable)) + parserError("Invalid page variable", expr.argument.callee.loc); + if (variable) { + pageAlias = variable; + if (!["goto", "close", "routeFromHAR"].includes(actionFnName)) + locator = code.substring(expr.argument.callee.object.start + (variable.length + 1), expr.argument.callee.object.end); + } else if (code.startsWith("expect(", expr.argument.start)) { + let object = expr.argument.callee.object; + if (object.type === "MemberExpression" && object.property.type === "Identifier" && object.property.name === "not") { + if (actionFnName !== "toBeChecked") + parserError("Invalid expect expression, .not can only applied to toBeChecked", expr.argument.callee.loc); + expectActionNegated = true; + object = object.object; + } + if (object.type !== "CallExpression" || object.arguments.length !== 1 || object.arguments[0].type !== "CallExpression") + parserError("Invalid expect expression", expr.argument.callee.loc); + const expectArg = code.substring(object.arguments[0].start, object.arguments[0].end); + const [, variable2] = variableCallRegex.exec(expectArg) ?? []; + if (!variable2 || !pages.has(variable2)) + parserError("Invalid page variable", expr.argument.callee.loc); + pageAlias = variable2; + locator = expectArg.substring(variable2.length + 1); + expectAction = true; + } + } + let action; + const args = expr.argument.arguments.map(argsParser); + const selector = locator ? locatorOrSelectorAsSelector("javascript", locator, "data-testid") : void 0; + if (selector === "") + parserError("Invalid locator", expr.argument.callee.loc); + if (expectAction) { + if (!expectFnActions[actionFnName]) + parserError(`Invalid assertion ${actionFnName}`, expr.argument.callee.loc); + const [name, params] = expectFnActions[actionFnName](...args); + action = { name, selector, signals: [], ...cleanParams(params) }; + if (expectActionNegated) + action.checked = false; + } else { + if (!fnActions[actionFnName]) + parserError(`Invalid action ${actionFnName}`, expr.argument.callee.loc); + const [name, params] = fnActions[actionFnName](...args); + action = { name, selector, signals: [], ...cleanParams(params) }; + } + if (pageAlias) + pages.add(pageAlias); + return { + action, + frame: { pageAlias: pageAlias ?? "page", framePath: [] }, + startTime: 0, + location: { file, ...indexToLineColumn(code, expr.start) } + }; + } + let deviceName; + let harAction; + const contextOptions = {}; + function handleOptions(options2) { + let props = options2.properties; + const [first] = options2.properties; + if ((first == null ? void 0 : first.type) === "SpreadElement") { + const deviceProp = first; + if (deviceProp.argument.type !== "MemberExpression" || deviceProp.argument.object.type !== "Identifier" || deviceProp.argument.object.name !== "devices" || deviceProp.argument.property.type !== "Literal" || typeof deviceProp.argument.property.value !== "string") + parserError("Invalid device property", deviceProp.loc); + deviceName = deviceProp.argument.property.value; + props = props.slice(1); + } + const assertString = (v, loc) => { + if (typeof v !== "string") + parserError("Invalid string", loc); + }; + const assertEnum = (v, values, loc) => { + if (!values.includes(v)) + parserError(`Invalid enum value, expected one of ${values.join(", ")}`, loc); + }; + const assertStringArray = (v, loc) => { + if (!Array.isArray(v) || !v.every((e) => typeof e === "string")) + parserError("Invalid string array", loc); + }; + const assertObjectWithRequiredNumberProperties = (v, props2, loc) => { + if (typeof v !== "object" || Object.keys(v).length !== props2.length || !props2.every((p) => typeof v[p] === "number")) + parserError(`Invalid object with required number properties, expected ${props2.join(", ")}`, loc); + }; + const propValidators = { + colorScheme: (v, loc) => assertEnum(v, ["dark", "light", "no-preference"], loc), + locale: assertString, + timezoneId: assertString, + geolocation: (v, loc) => assertObjectWithRequiredNumberProperties(v, ["latitude", "longitude"], loc), + viewport: (v, loc) => assertObjectWithRequiredNumberProperties(v, ["width", "height"], loc), + permissions: assertStringArray, + serviceWorkers: (v, loc) => assertEnum(v, ["allow", "block"], loc), + storageState: assertString + }; + for (const prop of props) { + if (prop.type !== "Property" || prop.key.type !== "Identifier" || !Object.keys(propValidators).includes(prop.key.name)) + parserError("Invalid context option", prop.loc); + const propKey = prop.key.name; + const propValidator = propValidators[propKey]; + if (!propValidator) + parserError(`Invalid context option ${prop.key.name}`, prop.loc); + const value = argsParser(prop.value); + propValidator(value, prop.loc ?? void 0); + contextOptions[propKey] = value; + } + } + const tests = []; + ancestor(ast, { + CallExpression({ callee, arguments: args }, _, ancestors) { + var _a2, _b2; + if (ancestors.length !== 3 || ((_a2 = ancestors[0]) == null ? void 0 : _a2.type) !== "Program" || ((_b2 = ancestors[1]) == null ? void 0 : _b2.type) !== "ExpressionStatement") + return; + if (callee.type === "MemberExpression" && callee.object.type === "Identifier" && callee.object.name === "test" && callee.property.type === "Identifier" && callee.property.name === "use" && args.length === 1 && args[0].type === "ObjectExpression") { + handleOptions(args[0]); + return; + } + if (args.length !== 2) + parserError("Invalid call expression", callee.loc); + const [title, fn] = args; + if (callee.type !== "Identifier" || callee.name !== "test") + parserError("Invalid call expression", callee.loc); + if (title.type !== "Literal" || typeof title.value !== "string") + parserError("Invalid test title", title.loc); + if (fn.type !== "ArrowFunctionExpression" || fn.params.length !== 1 || fn.params[0].type !== "ObjectPattern" || fn.params[0].properties.some((p) => p.type !== "Property" || p.key.type !== "Identifier" || p.value.type !== "Identifier" || !["page", "context"].includes(p.key.name))) + parserError("Invalid test function", fn.loc); + const actions = []; + actions.push({ + action: { name: "openPage", signals: [], url: "" }, + frame: { pageAlias: "page", framePath: [] }, + location: { file, ...indexToLineColumn(code, fn.start) }, + startTime: 0 + }); + if (fn.body.type !== "BlockStatement" || !fn.body.body.every((e) => e.type === "ExpressionStatement" && e.expression.type === "AwaitExpression" || e.type === "VariableDeclaration")) + parserError("Invalid test function body", fn.body.loc); + const stmts = fn.body.body; + const pages = /* @__PURE__ */ new Set(["page"]); + for (const stmt of stmts) { + const actionExpr = stmt.type === "VariableDeclaration" ? stmt : stmt.expression; + const candidateAction = parseActionExpression(actionExpr, pages); + if (candidateAction.action.name === "routeFromHAR") { + if (!(actions.length === 0 || actions.length === 1 && actions[0].action.name === "openPage")) + parserError("routeFromHAR must be the first action", actionExpr.loc); + if (harAction) + parserError("Only one routeFromHAR is allowed", actionExpr.loc); + harAction = candidateAction.action; + continue; + } + actions.push(candidateAction); + } + if (contextOptions && harAction) { + contextOptions.recordHar = { + path: harAction.har, + content: harAction.updateContent, + mode: harAction.updateMode, + urlGlob: harAction.url + }; + } + tests.push({ + title: title.value, + actions, + options: deviceName || harAction || contextOptions && Object.keys(contextOptions).length > 0 ? { + deviceName, + contextOptions + } : void 0, + location: { file, ...indexToLineColumn(code, callee.start) } + }); + } + }); + return tests; +} +class CrxRecorderApp extends eventsExports.EventEmitter { + constructor(crx2, recorder) { + super(); + __publicField(this, "wsEndpointForTest"); + __publicField(this, "_crx"); + __publicField(this, "_recorder"); + __publicField(this, "_filename"); + __publicField(this, "_sources"); + __publicField(this, "_mode", "none"); + __publicField(this, "_window"); + __publicField(this, "_editedCode"); + __publicField(this, "_recordedActions", []); + __publicField(this, "_playInIncognito", false); + __publicField(this, "_currentCursorPosition"); + this._crx = crx2; + this._recorder = recorder; + this._crx.player.on("start", () => { + this._recorder.clearErrors(); + this.resetCallLogs().catch(() => { + }); + }); + } + async open(options2) { + var _a2, _b2; + const mode = (options2 == null ? void 0 : options2.mode) ?? "none"; + const language = (options2 == null ? void 0 : options2.language) ?? "playwright-test"; + if (this._window) + await this._window.close(); + this._playInIncognito = (options2 == null ? void 0 : options2.playInIncognito) ?? false; + this._window = ((_a2 = options2 == null ? void 0 : options2.window) == null ? void 0 : _a2.type) === "sidepanel" ? new SidepanelRecorderWindow(options2.window.url) : new PopupRecorderWindow((_b2 = options2 == null ? void 0 : options2.window) == null ? void 0 : _b2.url); + this._window.onMessage = this._onMessage.bind(this); + this._window.hideApp = this._hide.bind(this); + this._onMessage({ type: "recorderEvent", event: "clear", params: {} }); + this._onMessage({ type: "recorderEvent", event: "fileChanged", params: { file: language } }); + this._recorder.setOutput(language, void 0); + this._recorder.setMode(mode); + if (this._window.isClosed()) { + await this._window.open(); + this.emit("show"); + } else { + await this._window.focus(); + } + this.setMode(mode); + } + load(code) { + var _a2; + this._updateCode(code); + (_a2 = this._editedCode) == null ? void 0 : _a2.load(); + } + async close() { + if (!this._window || this._window.isClosed()) + return; + this._hide(); + this._window = void 0; + } + _hide() { + var _a2; + this._recorder.setMode("none"); + this.setMode("none"); + (_a2 = this._window) == null ? void 0 : _a2.close(); + this.emit("hide"); + } + async setPaused(paused) { + this._sendMessage({ type: "recorder", method: "setPaused", paused }); + } + async setMode(mode) { + if (!this._recorder._isRecording()) + this._crx.player.pause().catch(() => { + }); + else + this._crx.player.stop().catch(() => { + }); + if (this._mode !== mode) { + this._mode = mode; + this.emit("modeChanged", { mode }); + } + this._sendMessage({ type: "recorder", method: "setMode", mode }); + } + async setRunningFile() { + } + async setSources(sources) { + sources = sources.filter((s) => s.isRecorded).map((s) => { + var _a2; + return ((_a2 = this._editedCode) == null ? void 0 : _a2.decorate(s)) ?? s; + }); + this._sendMessage({ type: "recorder", method: "setSources", sources }); + } + async elementPicked(elementInfo, userGesture) { + var _a2; + if (userGesture) { + if (this._recorder.mode() === "inspecting") { + this._recorder.setMode("standby"); + (_a2 = this._window) == null ? void 0 : _a2.focus(); + } + } + this._sendMessage({ type: "recorder", method: "elementPicked", elementInfo, userGesture }); + } + async resetCallLogs() { + this._sendMessage({ type: "recorder", method: "resetCallLogs" }); + } + async updateCallLogs(callLogs) { + this._sendMessage({ type: "recorder", method: "updateCallLogs", callLogs }); + } + async setActions(actions, sources) { + this._recordedActions = Array.from(actions); + this._sources = Array.from(sources); + if (this._recorder._isRecording()) + this._updateCode(null); + } + _updateCode(code) { + var _a2, _b2; + if (((_a2 = this._editedCode) == null ? void 0 : _a2.code) === code) + return; + (_b2 = this._editedCode) == null ? void 0 : _b2.stopLoad(); + this._editedCode = void 0; + if (!code) + return; + this._editedCode = new EditedCode(this._recorder, code, () => this._updateLocator(this._currentCursorPosition)); + } + async _updateLocator(position) { + if (!position) + return; + const action = this._getActions(true).find((a) => { + var _a2; + return ((_a2 = a.location) == null ? void 0 : _a2.line) === position.line + 1; + }); + if (!action || !action.action.selector) + return; + const selector = action.action.selector; + this.elementPicked({ selector, ariaSnapshot: "" }, false); + this._onMessage({ type: "recorderEvent", event: "highlightRequested", params: { selector } }); + } + _onMessage({ type: type2, event, params }) { + var _a2; + if (type2 === "recorderEvent") { + switch (event) { + case "fileChanged": + this._filename = params.file; + if ((_a2 = this._editedCode) == null ? void 0 : _a2.hasErrors()) { + this._updateCode(null); + if (this._sources) + this.setSources(this._sources); + } + break; + case "codeChanged": + this._updateCode(params.code); + break; + case "cursorActivity": + this._currentCursorPosition = params.position; + this._updateLocator(this._currentCursorPosition); + break; + case "resume": + case "step": + this._run().catch(() => { + }); + break; + case "setMode": + const { mode } = params; + if (this._mode !== mode) { + this._mode = mode; + this.emit("modeChanged", { mode }); + } + break; + } + this.emit("event", { event, params }); + } + } + async _run() { + if (this._crx.player.isPlaying()) + return; + const incognito = this._playInIncognito; + if (incognito) { + const incognitoCrxApp = await this._crx.get({ incognito }); + await (incognitoCrxApp == null ? void 0 : incognitoCrxApp.close({ closeWindows: true })); + } + const crxApp = await this._crx.get({ incognito }) ?? await this._crx.start({ incognito }, serverSideCallMetadata()); + await this._crx.player.run(crxApp._context, this._getActions()); + } + _sendMessage(msg) { + var _a2; + return (_a2 = this._window) == null ? void 0 : _a2.postMessage(msg); + } + async uninstall(page) { + await this._recorder._uninstallInjectedRecorder(page); + } + _getActions(skipLoad = false) { + var _a2, _b2; + if (this._editedCode && !skipLoad) { + this._editedCode.load(); + const actions2 = this._editedCode.actions(); + if (!this._filename || this._filename === "playwright-test") + return actions2; + } + const source2 = (_a2 = this._sources) == null ? void 0 : _a2.find((s) => s.id === this._filename); + if (!source2) + return []; + const actions = ((_b2 = this._editedCode) == null ? void 0 : _b2.hasLoaded()) && !this._editedCode.hasErrors() ? this._editedCode.actions() : this._recordedActions; + const { header } = source2; + const languageGenerator = [...languageSet()].find((l) => l.id === this._filename); + const actionTexts = actions.map((a) => languageGenerator.generateAction(a)); + const sourceLine = (index2) => { + const numLines = (str) => str ? str.split(/\r?\n/).length : 0; + return numLines(header) + numLines(actionTexts.slice(0, index2).filter(Boolean).join("\n")) + 1; + }; + return actions.map((action, index2) => ({ + ...action, + location: { + file: this._filename, + line: sourceLine(index2), + column: 1 + } + })); + } +} +class EditedCode { + constructor(recorder, code, onLoaded) { + __publicField(this, "code"); + __publicField(this, "_recorder"); + __publicField(this, "_actions", []); + __publicField(this, "_highlight", []); + __publicField(this, "_codeLoadDebounceTimeout"); + __publicField(this, "_onLoaded"); + this.code = code; + this._recorder = recorder; + this._onLoaded = onLoaded; + this._codeLoadDebounceTimeout = setTimeout(this.load.bind(this), 500); + } + actions() { + return Array.from(this._actions); + } + hasErrors() { + var _a2; + return ((_a2 = this._highlight) == null ? void 0 : _a2.length) > 0; + } + hasLoaded() { + return !this._codeLoadDebounceTimeout; + } + decorate(source2) { + if (source2.id !== "playwright-test") + return; + return { + ...source2, + highlight: this.hasLoaded() && this.hasErrors() ? this._highlight : source2.highlight, + text: this.code + }; + } + stopLoad() { + clearTimeout(this._codeLoadDebounceTimeout); + this._codeLoadDebounceTimeout = void 0; + } + load() { + var _a2; + if (this.hasLoaded()) + return; + this.stopLoad(); + try { + const [{ actions, options: options2 }] = parse3(this.code); + this._actions = actions; + const { deviceName, contextOptions } = { deviceName: "", contextOptions: {}, ...options2 }; + this._recorder.loadScript({ actions, deviceName, contextOptions, text: this.code }); + } catch (error2) { + this._actions = []; + const line = error2.loc.line ?? error2.loc.start.line ?? this.code.split("\n").length; + this._highlight = [{ line, type: "error", message: error2.message }]; + this._recorder.loadScript({ actions: this._actions, deviceName: "", contextOptions: {}, text: this.code, highlight: this._highlight }); + } + (_a2 = this._onLoaded) == null ? void 0 : _a2.call(this); + } +} +async function createTab({ incognito, ...params }) { + var _a2; + const windows = (await chrome.windows.getAll()).filter((wnd) => wnd.incognito === incognito); + const windowId = (_a2 = windows.find((w) => !params.windowId || w.id === params.windowId)) == null ? void 0 : _a2.id; + if (!windowId && params.windowId) + throw new Error(`Window with id ${params.windowId} not found or bound to a different context`); + const url2 = params.url || "about:blank"; + const [tab] = await Promise.all([ + new Promise((resolve) => { + const tabCreated = (tab2) => { + if (tab2.incognito !== incognito) + return; + chrome.tabs.onCreated.removeListener(tabCreated); + resolve(tab2); + }; + chrome.tabs.onCreated.addListener(tabCreated); + }), + windowId ? chrome.tabs.create({ ...params, url: url2, windowId }) : chrome.windows.create({ url: url2, incognito }) + ]); + const tabId = tab.id; + if (!windowId) { + const { index: index2, windowId: windowId2, ...updateParams } = params; + if (typeof index2 === "number") + await chrome.tabs.move(tabId, { index: index2 }); + await chrome.tabs.update(tabId, updateParams); + } + return tab; +} +class CrxTransport { + constructor(progress2) { + __publicField(this, "_progress"); + __publicField(this, "_detachedPromise"); + __publicField(this, "_targetToTab"); + __publicField(this, "_tabToTarget"); + __publicField(this, "_sessions"); + __publicField(this, "_defaultBrowserContextId"); + __publicField(this, "onmessage"); + __publicField(this, "onclose"); + __publicField(this, "_onPopupCreated", async ({ openerTabId, id }) => { + if (!openerTabId || !id) + return; + if (this._tabToTarget.has(openerTabId)) + await this.attach(id).catch(() => { + }); + }); + __publicField(this, "_onRemoved", (tabIdOrDebuggee) => { + const tabId = typeof tabIdOrDebuggee === "number" ? tabIdOrDebuggee : tabIdOrDebuggee.tabId; + if (!tabId) + return; + const targetInfo = this._tabToTarget.get(tabId); + this._tabToTarget.delete(tabId); + if (targetInfo) { + this._targetToTab.delete(targetInfo.targetId); + this._emitDetachedToTarget(tabId, targetInfo.targetId); + } + }); + __publicField(this, "_onDebuggerEvent", ({ tabId, sessionId }, message, params) => { + if (!tabId) + return; + if (!sessionId) + sessionId = this._sessionIdFor(tabId); + if (message === "Target.attachedToTarget") + this._sessions.set(params.sessionId, tabId); + else if (message === "Target.detachedFromTarget") + this._sessions.delete(params.sessionId); + if (debugLogger.isEnabled(`chromedebugger`)) + debugLogger.log("chromedebugger", `= 126 ? [{}] : [] + ] }); + } else if (message.method === "Target.getTargetInfo" && !debuggee.tabId) { + result = await Promise.resolve(); + } else if (message.method === "Target.createTarget") { + const { browserContextId } = message.params; + const incognito = !!browserContextId && browserContextId !== this._defaultBrowserContextId; + const tab = await createTab({ incognito }); + const { targetId } = await this.attach(tab.id); + result = { targetId }; + } else if (message.method === "Target.closeTarget") { + const { targetId } = message.params; + const tabId = this._targetToTab.get(targetId); + if (tabId) { + await chrome.tabs.remove(tabId); + result = true; + } else { + result = false; + } + } else if (message.method === "Target.disposeBrowserContext") { + result = await Promise.resolve(); + } else if (message.method === "Browser.getVersion") { + const userAgent = navigator.userAgent; + const [, product] = userAgent.match(/(Chrome\/[0-9\.]+)\b/) ?? []; + result = await Promise.resolve({ product, userAgent }).then(); + } else if (message.method === "Browser.getWindowForTarget") { + result = await Promise.resolve({}).then(); + } else if (message.method === "Browser.setDownloadBehavior") { + result = await Promise.resolve(); + } else if (message.method === "Emulation.setEmulatedMedia") { + result = await Promise.resolve(); + } else if (message.method === "Storage.getCookies") { + const { browserContextId, ...params } = message.params; + const debuggees = this._debuggeesFromBrowserContextId(browserContextId); + const results = await Promise.all(debuggees.map((debuggee2) => this._send(debuggee2, "Network.getCookies", params))); + const cookies = new Map(results.flatMap(({ cookies: cookies2 }) => cookies2.map((cookie) => [JSON.stringify(cookie), cookie]))); + result = { cookies: [...cookies.values()] }; + } else if (message.method === "Storage.setCookies") { + const { browserContextId, ...params } = message.params; + const debuggees = this._debuggeesFromBrowserContextId(browserContextId); + await Promise.all(debuggees.map((debuggee2) => this._send(debuggee2, "Network.setCookies", params))); + result = {}; + } else { + result = await this._send(debuggee, message.method, { ...message.params }); + } + this._emitMessage({ + ...message, + result + }); + } catch (error2) { + this._emitMessage({ + ...message, + error: error2 + }); + } + } + async attach(tabId, onBeforeEmitAttachedToTarget) { + var _a2; + let targetInfo = this._tabToTarget.get(tabId); + if (!targetInfo) { + const debuggee = { tabId }; + await chrome.debugger.attach(debuggee, "1.3"); + (_a2 = this._progress) == null ? void 0 : _a2.log(``); + const response2 = await this._send(debuggee, "Target.getTargetInfo"); + targetInfo = response2.targetInfo; + if (!this._defaultBrowserContextId) { + const tab = await chrome.tabs.get(tabId); + if (!tab.incognito) + this._defaultBrowserContextId = targetInfo.browserContextId; + } + await (onBeforeEmitAttachedToTarget == null ? void 0 : onBeforeEmitAttachedToTarget(targetInfo)); + this._emitAttachedToTarget(tabId, targetInfo); + this._tabToTarget.set(tabId, targetInfo); + this._targetToTab.set(targetInfo.targetId, tabId); + } + return targetInfo; + } + async detach(tabOrTarget) { + var _a2; + const tabId = typeof tabOrTarget === "number" ? tabOrTarget : this._targetToTab.get(tabOrTarget); + if (!tabId) + return; + const targetInfo = this._tabToTarget.get(tabId); + this._tabToTarget.delete(tabId); + if (targetInfo) { + this._targetToTab.delete(targetInfo.targetId); + this._emitDetachedToTarget(tabId, targetInfo.targetId); + } + await chrome.debugger.detach({ tabId }).catch(() => { + }); + (_a2 = this._progress) == null ? void 0 : _a2.log(``); + } + close() { + if (this._detachedPromise) + return; + this._detachedPromise = Promise.all([...this._tabToTarget.keys()].map(this.detach)).then(() => { + var _a2; + return (_a2 = this.onclose) == null ? void 0 : _a2.call(this); + }); + } + async closeAndWait() { + var _a2, _b2; + (_a2 = this._progress) == null ? void 0 : _a2.log(``); + chrome.debugger.onEvent.removeListener(this._onDebuggerEvent); + chrome.tabs.onCreated.removeListener(this._onPopupCreated); + this.close(); + await this._detachedPromise; + chrome.tabs.onRemoved.removeListener(this._onRemoved); + chrome.tabs.onDetached.removeListener(this._onRemoved); + (_b2 = this._progress) == null ? void 0 : _b2.log(``); + } + async _send(debuggee, method, commandParams) { + if (debugLogger.isEnabled("chromedebugger")) + debugLogger.log("chromedebugger", `SEND> ${method} #${debuggee.tabId}`); + return await chrome.debugger.sendCommand(debuggee, method, commandParams); + } + _emitMessage(message) { + if (this.onmessage) + this.onmessage(message); + } + _sessionIdFor(tabId) { + return `crx-tab-${tabId}`; + } + _emitAttachedToTarget(tabId, targetInfo) { + const sessionId = this._sessionIdFor(tabId); + this._emitMessage({ + method: "Target.attachedToTarget", + sessionId: "", + params: { + sessionId, + targetInfo + } + }); + } + _emitDetachedToTarget(tabId, targetId) { + const sessionId = this._sessionIdFor(tabId); + this._emitMessage({ + method: "Target.detachedFromTarget", + sessionId: "", + params: { + sessionId, + targetId + } + }); + } + _debuggeesFromBrowserContextId(browserContextId) { + if (!browserContextId) + browserContextId = this._defaultBrowserContextId; + if (!browserContextId) + throw new Error(`No attached tab found for browserContextId ${browserContextId}`); + return [...this._tabToTarget].filter(([, targetInfo]) => targetInfo.browserContextId === browserContextId).map(([tabId, targetInfo]) => ({ tabId, targetId: targetInfo == null ? void 0 : targetInfo.targetId })); + } +} +const kDefaultTimeout = 5e3; +function traceParamsForAction(actionInContext) { + const { action } = actionInContext; + switch (action.name) { + case "navigate": { + const params = { + url: action.url + }; + return { method: "goto", apiName: "page.goto", params }; + } + case "openPage": { + return { method: "newPage", params: {}, apiName: "browserContext.newPage" }; + } + case "closePage": { + return { method: "close", params: {}, apiName: "page.close" }; + } + } + const selector = buildFullSelector(actionInContext.frame.framePath, action.selector); + switch (action.name) { + case "click": { + const params = { + selector, + strict: true, + modifiers: toKeyboardModifiers(action.modifiers), + button: action.button, + clickCount: action.clickCount, + position: action.position + }; + return { method: "click", apiName: "locator.click", params }; + } + case "press": { + const params = { + selector, + strict: true, + key: [...toKeyboardModifiers(action.modifiers), action.key].join("+") + }; + return { method: "press", apiName: "locator.press", params }; + } + case "fill": { + const params = { + selector, + strict: true, + value: action.text + }; + return { method: "fill", apiName: "locator.fill", params }; + } + case "setInputFiles": { + const params = { + selector, + strict: true, + localPaths: action.files + }; + return { method: "setInputFiles", apiName: "locator.setInputFiles", params }; + } + case "check": { + const params = { + selector, + strict: true + }; + return { method: "check", apiName: "locator.check", params }; + } + case "uncheck": { + const params = { + selector, + strict: true + }; + return { method: "uncheck", apiName: "locator.uncheck", params }; + } + case "select": { + const params = { + selector, + strict: true, + options: action.options.map((option2) => ({ value: option2 })) + }; + return { method: "selectOption", apiName: "locator.selectOption", params }; + } + case "assertChecked": { + const params = { + selector: action.selector, + expression: "to.be.checked", + isNot: !action.checked, + timeout: kDefaultTimeout + }; + return { method: "expect", apiName: "expect.toBeChecked", params }; + } + case "assertText": { + const params = { + selector, + expression: "to.have.text", + expectedText: [], + isNot: false, + timeout: kDefaultTimeout + }; + return { method: "expect", apiName: "expect.toContainText", params }; + } + case "assertValue": { + const params = { + selector, + expression: "to.have.value", + expectedValue: void 0, + isNot: false, + timeout: kDefaultTimeout + }; + return { method: "expect", apiName: "expect.toHaveValue", params }; + } + case "assertVisible": { + const params = { + selector, + expression: "to.be.visible", + isNot: false, + timeout: kDefaultTimeout + }; + return { method: "expect", apiName: "expect.toBeVisible", params }; + } + case "assertSnapshot": { + const params = { + selector, + expression: "to.match.aria", + isNot: false, + timeout: kDefaultTimeout + }; + return { method: "expect", apiName: "expect.toMatchAriaSnapshot", params }; + } + } +} +class Stopped extends Error { +} +class CrxPlayer extends EventEmitter$1 { + constructor(crx2) { + super(); + __publicField(this, "_crx"); + __publicField(this, "_currAction"); + __publicField(this, "_stopping"); + __publicField(this, "_pageAliases", /* @__PURE__ */ new Map()); + __publicField(this, "_pause"); + this._crx = crx2; + } + async pause() { + if (!this._pause) { + const context = (await this._crx.get({ incognito: false }))._context; + const pauseAction = { + action: { name: "pause" }, + frame: { pageAlias: "page", framePath: [] } + }; + this._pause = this._performAction(context, pauseAction).finally(() => this._pause = void 0).catch(() => { + }); + } + await this._pause; + } + async run(pageOrContext, actions) { + if (this.isPlaying()) + return; + let page; + let context; + if (pageOrContext instanceof Page$1) { + page = pageOrContext; + context = page.context(); + } else { + context = pageOrContext; + page = context.pages()[0] ?? await context.newPage(serverSideCallMetadata()); + } + const crxApp = await this._crx.get({ incognito: false }); + const recorder = crxApp == null ? void 0 : crxApp._recorder(); + if (recorder && crxApp && crxApp._context !== context) { + const instrumentationListener2 = { + onBeforeCall: recorder.onBeforeCall.bind(recorder), + onBeforeInputAction: recorder.onBeforeInputAction.bind(recorder), + onCallLog: recorder.onCallLog.bind(recorder), + onAfterCall: recorder.onAfterCall.bind(recorder) + }; + if (instrumentationListener2) + context.instrumentation.addListener(instrumentationListener2, context); + } + this._pageAliases.clear(); + this._pageAliases.set(page, "page"); + this.emit("start"); + try { + for (const action of actions) { + if (action.action.name === "openPage" && action.frame.pageAlias === "page") + continue; + this._currAction = action; + await this._performAction(context, action); + } + } catch (e) { + if (e instanceof Stopped) + return; + throw e; + } finally { + this._currAction = void 0; + this.pause().catch(() => { + }); + } + } + isPlaying() { + return !!this._currAction; + } + async stop() { + if (this._currAction || this._pause) { + this._currAction = void 0; + this._stopping = new ManualPromise(); + await Promise.all([ + this._stopping, + this._pause + ]); + this._stopping = void 0; + this._pause = void 0; + this.emit("stop"); + } + } + // "borrowed" from ContextRecorder + async _performAction(browserContext, actionInContext) { + var _a2; + this._checkStopped(); + const innerPerformAction = async (mainFrame2, actionInContext2, cb) => { + const context2 = mainFrame2 ?? browserContext; + const traceParams = actionInContext2.action.name === "pause" ? { method: "pause", params: {}, apiName: "page.pause" } : traceParamsForAction(actionInContext2); + const callMetadata = { + id: `call@${createGuid()}`, + internal: actionInContext2.action.name === "pause", + objectId: context2.guid, + pageId: mainFrame2 == null ? void 0 : mainFrame2._page.guid, + frameId: mainFrame2 == null ? void 0 : mainFrame2.guid, + startTime: monotonicTime(), + endTime: 0, + type: "Frame", + log: [], + location: actionInContext2.location, + playing: true, + ...traceParams + }; + try { + this._checkStopped(); + await context2.instrumentation.onBeforeCall(context2, callMetadata); + this._checkStopped(); + await cb(callMetadata); + } catch (e) { + callMetadata.error = serializeError$1(e); + } finally { + callMetadata.endTime = monotonicTime(); + await context2.instrumentation.onAfterCall(context2, callMetadata); + if (callMetadata.error) + throw callMetadata.error.error; + } + }; + const kActionTimeout = isUnderTest() ? 2e3 : 5e3; + const { action } = actionInContext; + const pageAliases = this._pageAliases; + const context = browserContext; + if (action.name === "pause") + return await innerPerformAction(null, actionInContext, () => Promise.resolve()); + if (action.name === "openPage") { + return await innerPerformAction(null, actionInContext, async (callMetadata) => { + const pageAlias2 = actionInContext.frame.pageAlias; + if ([...pageAliases.values()].includes(pageAlias2)) + throw new Error(`Page with alias ${pageAlias2} already exists`); + const newPage = await context.newPage(callMetadata); + if (action.url && action.url !== "about:blank" && action.url !== "chrome://newtab/") { + const navigateCallMetadata = { + ...callMetadata, + ...traceParamsForAction({ ...actionInContext, action: { name: "navigate", url: action.url } }) + }; + await newPage.mainFrame().goto(navigateCallMetadata, action.url, { timeout: kActionTimeout }); + } + pageAliases.set(newPage, pageAlias2); + }); + } + const pageAlias = actionInContext.frame.pageAlias; + const page = (_a2 = [...pageAliases.entries()].find(([, alias]) => pageAlias === alias)) == null ? void 0 : _a2[0]; + if (!page) + throw new Error("Internal error: page not found"); + const mainFrame = page.mainFrame(); + if (action.name === "navigate") + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.goto(callMetadata, action.url, { timeout: kActionTimeout })); + if (action.name === "closePage") { + return await innerPerformAction(mainFrame, actionInContext, async (callMetadata) => { + pageAliases.delete(page); + await page.close(callMetadata, { runBeforeUnload: true }); + }); + } + const selector = buildFullSelector(actionInContext.frame.framePath, action.selector); + if (action.name === "click") { + const options2 = toClickOptions(action); + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.click(callMetadata, selector, { ...options2, timeout: kActionTimeout, strict: true })); + } + if (action.name === "press") { + const modifiers = toKeyboardModifiers(action.modifiers); + const shortcut = [...modifiers, action.key].join("+"); + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.press(callMetadata, selector, shortcut, { timeout: kActionTimeout, strict: true })); + } + if (action.name === "fill") + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.fill(callMetadata, selector, action.text, { timeout: kActionTimeout, strict: true })); + if (action.name === "setInputFiles") + return await innerPerformAction(mainFrame, actionInContext, () => Promise.reject(new Error(`player does not support setInputFiles yet`))); + if (action.name === "check") + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.check(callMetadata, selector, { timeout: kActionTimeout, strict: true })); + if (action.name === "uncheck") + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.uncheck(callMetadata, selector, { timeout: kActionTimeout, strict: true })); + if (action.name === "select") { + const values = action.options.map((value) => ({ value })); + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.selectOption(callMetadata, selector, [], values, { timeout: kActionTimeout, strict: true })); + } + if (action.name === "assertChecked") { + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.expect(callMetadata, selector, { + selector, + expression: "to.be.checked", + expectedValue: { checked: true }, + isNot: !action.checked, + timeout: kActionTimeout + })); + } + if (action.name === "assertText") { + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.expect(callMetadata, selector, { + selector, + expression: "to.have.text", + expectedText: serializeExpectedTextValues([action.text], { matchSubstring: true, normalizeWhiteSpace: true }), + isNot: false, + timeout: kActionTimeout + })); + } + if (action.name === "assertValue") { + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.expect(callMetadata, selector, { + selector, + expression: "to.have.value", + expectedText: serializeExpectedTextValues([action.value], { matchSubstring: false, normalizeWhiteSpace: true }), + isNot: false, + timeout: kActionTimeout + })); + } + if (action.name === "assertVisible") { + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.expect(callMetadata, selector, { + selector, + expression: "to.be.visible", + isNot: false, + timeout: kActionTimeout + })); + } + if (action.name === "assertSnapshot") { + return await innerPerformAction(mainFrame, actionInContext, (callMetadata) => mainFrame.expect(callMetadata, selector, { + selector, + expression: "to.match.aria", + expectedValue: parseAriaSnapshotUnsafe(yaml, action.snapshot), + isNot: false, + timeout: kActionTimeout + })); + } + throw new Error("Internal error: unexpected action " + action.name); + } + _checkStopped() { + if (this._stopping) { + this._stopping.resolve(); + throw new Stopped(); + } + } +} +const kTabIdSymbol = Symbol("kTabIdSymbol"); +class Crx2 extends SdkObject { + constructor(playwright2) { + super(playwright2, "crx"); + __publicField(this, "_transport"); + __publicField(this, "_browserPromise"); + __publicField(this, "_crxApplicationPromise"); + __publicField(this, "_incognitoCrxApplicationPromise"); + __publicField(this, "player"); + this.player = new CrxPlayer(this); + } + async start(options2) { + const { incognito, contextOptions } = options2 ?? {}; + const device = deviceDescriptors[options2 == null ? void 0 : options2.deviceName] ?? {}; + const viewport = (contextOptions == null ? void 0 : contextOptions.viewport) ?? device.viewport; + const newContextOptions = { + noDefaultViewport: !viewport, + ...device, + ...contextOptions, + viewport + }; + if (!this._transport && !this._browserPromise) { + const browserLogsCollector = new RecentLogsCollector(); + const browserProcess = { + onclose: void 0, + process: void 0, + // browser.close() calls this function, and closing transport will trigger + // Browser.Events.Disconnected and force the browser to resolve the close promise. + close: () => this._transport.closeAndWait(), + kill: () => Promise.resolve() + }; + const browserOptions = { + name: "chromium", + isChromium: true, + headful: true, + persistent: newContextOptions, + browserProcess, + protocolLogger: helper.debugProtocolLogger(), + browserLogsCollector, + originalLaunchOptions: {}, + artifactsDir: "/tmp/artifacts", + downloadsPath: "/tmp/downloads", + tracesDir: "/tmp/traces", + ...options2 + }; + this._transport = new CrxTransport(); + this._browserPromise = CRBrowser.connect(this.attribution.playwright, this._transport, browserOptions); + } + const browser2 = await this._browserPromise; + const transport = this._transport; + if (incognito) { + if (this._incognitoCrxApplicationPromise) + throw new Error(`incognito crxApplication is already started`); + this._incognitoCrxApplicationPromise = this._startIncognitoCrxApplication(browser2, transport, newContextOptions); + return await this._incognitoCrxApplicationPromise; + } else { + if (this._crxApplicationPromise) + throw new Error(`crxApplication is already started`); + this._crxApplicationPromise = this._startCrxApplication(browser2, transport); + return await this._crxApplicationPromise; + } + } + async _startCrxApplication(browser2, transport) { + const context = browser2._defaultContext; + const crxApp = new CrxApplication2(this, context, transport); + context.on(BrowserContext$1.Events.Close, () => { + this._crxApplicationPromise = void 0; + }); + browser2.on(CRBrowser.Events.Disconnected, () => { + this._browserPromise = void 0; + this._transport = void 0; + }); + RecorderApp.factory = () => { + return async (recorder) => { + if (recorder instanceof Recorder && recorder._context === context) + return await crxApp._createRecorderApp(recorder); + else + return new EmptyRecorderApp(); + }; + }; + return crxApp; + } + async _startIncognitoCrxApplication(browser2, transport, options2) { + var _a2; + const windows = await chrome.windows.getAll().catch(() => { + }) ?? []; + const activeTabs = await chrome.tabs.query({ active: true }); + const incognitoTab = activeTabs.find((t) => { + var _a3; + return t.incognito && !((_a3 = t.url) == null ? void 0 : _a3.startsWith("chrome://")); + }) ?? await createTab({ incognito: true, windowId: (_a2 = windows.find((w) => w.incognito)) == null ? void 0 : _a2.id, url: "about:blank" }); + const incognitoTabId = incognitoTab.id; + let context; + await transport.attach(incognitoTabId, async ({ browserContextId }) => { + assert(browserContextId); + context = new CRBrowserContext(browser2, browserContextId, options2 ?? {}); + await context._initialize(); + browser2._contexts.set(browserContextId, context); + }); + context.on(BrowserContext$1.Events.Close, () => { + this._incognitoCrxApplicationPromise = void 0; + }); + const crxApp = new CrxApplication2(this, context, transport); + await crxApp.attach(incognitoTabId); + return crxApp; + } + async get(options2) { + return options2.incognito ? await this._incognitoCrxApplicationPromise : await this._crxApplicationPromise; + } +} +const _CrxApplication = class _CrxApplication2 extends SdkObject { + constructor(crx2, context, transport) { + super(context, "crxApplication"); + __publicField(this, "_crx"); + __publicField(this, "_context"); + __publicField(this, "_transport"); + __publicField(this, "_recorderApp"); + __publicField(this, "_closed", false); + __publicField(this, "onWindowRemoved", async () => { + const windows = await chrome.windows.getAll(); + if (this.isIncognito() && windows.every((w) => !w.incognito)) + await this.close({}); + }); + this.instrumentation.addListener({ + onPageClose: (page) => { + page.hideHighlight(); + } + }, null); + this._crx = crx2; + this._context = context; + this._transport = transport; + context.on(BrowserContext$1.Events.Page, (page) => { + const tabId = this.tabIdForPage(page); + if (!tabId) + return; + page[kTabIdSymbol] = tabId; + page.on(Page$1.Events.Close, () => { + this.emit(_CrxApplication2.Events.Detached, { tabId }); + }); + this.emit(_CrxApplication2.Events.Attached, { page, tabId }); + }); + context.on(BrowserContext$1.Events.Close, () => this.close().catch(() => { + })); + chrome.windows.onRemoved.addListener(this.onWindowRemoved); + } + _browser() { + return this._context._browser; + } + isIncognito() { + return this._context._browser._defaultContext !== this._context; + } + _crPages() { + return [...this._browser()._crPages.values()].filter((p) => this._transport.isIncognito(p._targetId) === this.isIncognito()); + } + _crPageByTargetId(targetId) { + const crPage = this._browser()._crPages.get(targetId); + if (crPage && this._transport.isIncognito(crPage._targetId) === this.isIncognito()) + return crPage; + } + tabIdForPage(page) { + var _a2; + const targetId = (_a2 = this._crPages().find((crPage) => crPage._page === page)) == null ? void 0 : _a2._targetId; + if (!targetId) + return; + return this._transport.getTabId(targetId); + } + async showRecorder(options2) { + if (!this._recorderApp) { + const { mode, ...otherOptions } = options2 ?? {}; + const recorderParams = { + language: (options2 == null ? void 0 : options2.language) ?? "playwright-test", + mode: mode === "none" ? void 0 : mode, + ...otherOptions + }; + Recorder.show(this._context, (recorder) => this._createRecorderApp(recorder), recorderParams); + } + await this._recorderApp.open(options2); + } + async hideRecorder() { + var _a2; + await ((_a2 = this._recorderApp) == null ? void 0 : _a2.close()); + } + setMode(mode) { + var _a2; + (_a2 = this._recorderApp) == null ? void 0 : _a2._recorder.setMode(mode); + } + async attach(tabId) { + const { targetId, browserContextId } = await this._transport.attach(tabId); + const tab = await chrome.tabs.get(tabId); + if (tab.incognito !== this.isIncognito() || this._context._browserContextId && browserContextId !== this._context._browserContextId) { + await this._transport.detach(targetId); + throw new Error("Tab is not in the expected browser context"); + } + const crPage = this._crPageByTargetId(targetId); + assert(crPage); + const pageOrError = await crPage._page.waitForInitializedOrError(); + if (pageOrError instanceof Error) + throw pageOrError; + return pageOrError; + } + async attachAll(params) { + const tabs = await chrome.tabs.query(params); + const pages = await Promise.all(tabs.map(async (tab) => { + var _a2; + const baseUrl = chrome.runtime.getURL(""); + if (tab.incognito === this.isIncognito() && tab.id && !((_a2 = tab.url) == null ? void 0 : _a2.startsWith(baseUrl))) + return await this.attach(tab.id).catch(() => { + }); + })); + return pages.filter(Boolean); + } + async detach(tabIdOrPage) { + const targetId = tabIdOrPage instanceof Page$1 ? tabIdOrPage.delegate._targetId : this._transport.getTargetId(tabIdOrPage); + await this._doDetach(targetId); + } + async detachAll() { + const tabs = await chrome.tabs.query({}); + await Promise.all(tabs.map(async (tab) => { + if (tab.id && tab.incognito === this.isIncognito()) + await this.detach(tab.id).catch(() => { + }); + })); + } + async newPage(params) { + const tab = await createTab({ incognito: this.isIncognito(), ...params }); + if (!(tab == null ? void 0 : tab.id)) + throw new Error(`No ID found for tab`); + return await this.attach(tab.id); + } + async close(options2) { + if (this._closed) + return; + if ((options2 == null ? void 0 : options2.closeWindows) && !this.isIncognito()) + throw new Error("closeWindows is only supported in incognito mode"); + this._closed = true; + chrome.windows.onRemoved.removeListener(this.onWindowRemoved); + if (options2 == null ? void 0 : options2.closeWindows) { + const windows = await chrome.windows.getAll(); + await Promise.all(windows.filter((w) => w.incognito && w.id).map((w) => chrome.windows.remove(w.id))); + } else { + await Promise.all(this._crPages().map((crPage) => (options2 == null ? void 0 : options2.closePages) ? crPage.closePage(false) : this._doDetach(crPage._targetId))); + } + await this._context.close({}); + } + list(code) { + const tests = parse3(code); + return tests.map(({ title, options: options2, location: location2 }) => ({ title, options: options2, location: location2 })); + } + load(code) { + var _a2; + (_a2 = this._recorderApp) == null ? void 0 : _a2.load(code); + } + async run(code, page) { + const [{ actions }] = parse3(code); + await this._crx.player.run(page ?? this._context, actions); + } + async parseForTest(originCode) { + const [{ actions, options: options2 }] = parse3(originCode); + const jsLanguage = [...languageSet()].find((l) => l.id === "playwright-test"); + const code = generateCode(actions, jsLanguage, { browserName: "", launchOptions: {}, contextOptions: {}, ...options2 }).text; + return { actions, options: options2, code }; + } + async _createRecorderApp(recorder) { + if (!this._recorderApp) { + this._recorderApp = new CrxRecorderApp(this._crx, recorder); + this._recorderApp.on("show", () => this.emit(_CrxApplication2.Events.RecorderShow)); + this._recorderApp.on("hide", () => this.emit(_CrxApplication2.Events.RecorderHide)); + this._recorderApp.on("modeChanged", (event) => { + this.emit(_CrxApplication2.Events.ModeChanged, event); + }); + } + return this._recorderApp; + } + _recorder() { + var _a2; + return (_a2 = this._recorderApp) == null ? void 0 : _a2._recorder; + } + async _doDetach(targetId) { + var _a2; + if (!targetId) + return; + if (this._transport.isIncognito(targetId) !== this.isIncognito()) + throw new Error("Tab is not in the expected browser context"); + const crPage = this._crPageByTargetId(targetId); + if (!crPage) + return; + const pageOrError = await crPage._page.waitForInitializedOrError(); + if (pageOrError instanceof Error) + throw pageOrError; + await Promise.all([ + (_a2 = this._recorderApp) == null ? void 0 : _a2.uninstall(pageOrError), + pageOrError.hideHighlight() + ]); + const closed = new Promise((x) => pageOrError.once(Page$1.Events.Close, x)); + await this._transport.detach(targetId); + await closed; + } +}; +__publicField(_CrxApplication, "Events", { + RecorderHide: "hide", + RecorderShow: "show", + Attached: "attached", + Detached: "detached", + ModeChanged: "modeChanged" +}); +let CrxApplication2 = _CrxApplication; +class CrxPlaywright2 extends Playwright$1 { + constructor() { + super({ sdkLanguage: "javascript" }); + __publicField(this, "_crx"); + this._crx = new Crx2(this); + } +} +class CrxDispatcher extends Dispatcher { + constructor(scope, crx2) { + super(scope, crx2, "Crx", {}); + __publicField(this, "_type_Crx", true); + } + async start(params) { + return { crxApplication: new CrxApplicationDispatcher(this, await this._object.start(params)) }; + } +} +class CrxApplicationDispatcher extends Dispatcher { + constructor(scope, crxApplication) { + const context = new BrowserContextDispatcher(scope, crxApplication._context); + super(scope, crxApplication, "CrxApplication", { context }); + __publicField(this, "_type_CrxApplication", true); + __publicField(this, "_context"); + this._context = context; + const dispatchEvent = this._dispatchEvent.bind(this); + this.addObjectListener(CrxApplication2.Events.RecorderHide, () => { + dispatchEvent("hide"); + }); + this.addObjectListener(CrxApplication2.Events.RecorderShow, () => { + dispatchEvent("show"); + }); + this.addObjectListener(CrxApplication2.Events.Attached, ({ tabId, page }) => { + dispatchEvent("attached", { tabId, page: PageDispatcher.from(this._context, page) }); + }); + this.addObjectListener(CrxApplication2.Events.Detached, ({ tabId }) => { + dispatchEvent("detached", { tabId }); + }); + this.addObjectListener(CrxApplication2.Events.ModeChanged, (event) => { + dispatchEvent("modeChanged", event); + }); + } + async attach(params) { + return { page: PageDispatcher.from(this._context, await this._object.attach(params.tabId)) }; + } + async attachAll(params) { + return { pages: (await this._object.attachAll(params)).map((page) => PageDispatcher.from(this._context, page)) }; + } + async detach(params) { + if (params.tabId && params.page) + throw new Error(`Only either tabId or page must be specified, not both`); + if (!params.tabId && !params.page) + throw new Error(`Either tabId or page must be specified, not none`); + await this._object.detach(params.tabId ?? params.page._object); + } + async detachAll() { + await this._object.detachAll(); + } + async newPage(params) { + return { page: PageDispatcher.from(this._context, await this._object.newPage(params)) }; + } + async showRecorder(params) { + await this._object.showRecorder(params); + } + async hideRecorder() { + await this._object.hideRecorder(); + } + async setMode(params) { + this._object.setMode(params.mode); + } + async close() { + await this._object.close(); + this._dispose(); + } + async list(params) { + const tests = this._object.list(params.code); + return { tests }; + } + async load(params) { + this._object.load(params.code); + } + async run(params) { + var _a2; + await this._object.run(params.code, (_a2 = params.page) == null ? void 0 : _a2._object); + } +} +class CrxPlaywrightDispatcher extends Dispatcher { + constructor(scope, playwright2) { + super(scope, playwright2, "Playwright", { + chromium: new BrowserTypeDispatcher(scope, playwright2.chromium), + firefox: new BrowserTypeDispatcher(scope, playwright2.firefox), + webkit: new BrowserTypeDispatcher(scope, playwright2.webkit), + bidiChromium: new BrowserTypeDispatcher(scope, playwright2.bidiChromium), + bidiFirefox: new BrowserTypeDispatcher(scope, playwright2.bidiFirefox), + android: new AndroidDispatcher(scope, playwright2.android), + electron: new ElectronDispatcher(scope, playwright2.electron), + utils: new LocalUtilsDispatcher(scope, playwright2), + _crx: new CrxDispatcher(scope, playwright2._crx) + }); + __publicField(this, "_type_Playwright"); + this._type_Playwright = true; + } + async newRequest(params) { + const request2 = new GlobalAPIRequestContext(this._object, params); + return { request: APIRequestContextDispatcher.from(this.parentScope(), request2) }; + } + async cleanup() { + } +} +const apis = { + accessibility: [Accessibility2.prototype, { snapshot: true }], + // android: [Android.prototype], + // androidDevice: [AndroidDevice.prototype], + // androidWebView: [AndroidWebView.prototype], + // androidInput: [AndroidInput.prototype], + // androidSocket: [AndroidSocket.prototype], + browser: [Browser.prototype, { newContext: true, newPage: true, newBrowserCDPSession: true, startTracing: true, stopTracing: true, close: true }], + browserContext: [BrowserContext.prototype, { + newPage: true, + cookies: true, + addCookies: true, + clearCookies: true, + grantPermissions: true, + clearPermissions: true, + setGeolocation: true, + setExtraHTTPHeaders: true, + setOffline: true, + setHTTPCredentials: true, + addInitScript: true, + exposeBinding: true, + exposeFunction: true, + route: true, + routeWebSocket: true, + routeFromHAR: true, + unrouteAll: true, + unroute: true, + waitForEvent: true, + storageState: true, + newCDPSession: true, + close: true + }], + browserType: [BrowserType2.prototype, { launch: true, launchServer: true, launchPersistentContext: true, connect: true, connectOverCDP: true }], + clock: [Clock2.prototype, { install: true, fastForward: true, pauseAt: true, resume: true, runFor: true, setFixedTime: true, setSystemTime: true }], + consoleMessage: [ConsoleMessage2.prototype, {}], + coverage: [Coverage.prototype, { startCSSCoverage: true, stopCSSCoverage: true, startJSCoverage: true, stopJSCoverage: true }], + dialog: [Dialog2.prototype, { accept: true, dismiss: true }], + download: [Download2.prototype, { cancel: true, createReadStream: true, path: true, failure: true, delete: true, saveAs: true }], + // electron: [Electron.prototype, {}], + // electronApplication: [ElectronApplication.prototype, {}], + locator: [Locator.prototype, { + boundingBox: true, + check: true, + click: true, + dblclick: true, + dispatchEvent: true, + dragTo: true, + evaluate: true, + evaluateAll: true, + evaluateHandle: true, + fill: true, + clear: true, + highlight: true, + elementHandle: true, + elementHandles: true, + focus: true, + blur: true, + count: true, + getAttribute: true, + hover: true, + innerHTML: true, + innerText: true, + inputValue: true, + isChecked: true, + isDisabled: true, + isEditable: true, + isEnabled: true, + isHidden: true, + isVisible: true, + press: true, + screenshot: true, + ariaSnapshot: true, + scrollIntoViewIfNeeded: true, + selectOption: true, + selectText: true, + setChecked: true, + setInputFiles: true, + tap: true, + textContent: true, + type: true, + pressSequentially: true, + uncheck: true, + all: true, + allInnerTexts: true, + allTextContents: true, + waitFor: true + }], + frameLocator: [FrameLocator.prototype, {}], + elementHandle: [ElementHandle2.prototype, { + // from JSHandle + evaluate: true, + evaluateHandle: true, + getProperty: true, + getProperties: true, + jsonValue: true, + dispose: true, + // from ElementHandle + ownerFrame: true, + contentFrame: true, + getAttribute: true, + inputValue: true, + textContent: true, + innerText: true, + innerHTML: true, + isChecked: true, + isDisabled: true, + isEditable: true, + isEnabled: true, + isHidden: true, + isVisible: true, + dispatchEvent: true, + scrollIntoViewIfNeeded: true, + hover: true, + click: true, + dblclick: true, + tap: true, + selectOption: true, + fill: true, + selectText: true, + setInputFiles: true, + focus: true, + type: true, + press: true, + check: true, + uncheck: true, + setChecked: true, + boundingBox: true, + screenshot: true, + $: true, + $$: true, + $eval: true, + $$eval: true, + waitForElementState: true, + waitForSelector: true + }], + fileChooser: [FileChooser2.prototype, { setFiles: true }], + timeoutError: [TimeoutError2.prototype, {}], + frame: [Frame.prototype, { + goto: true, + waitForNavigation: true, + waitForLoadState: true, + waitForURL: true, + frameElement: true, + evaluateHandle: true, + evaluate: true, + $: true, + $$: true, + waitForSelector: true, + dispatchEvent: true, + $eval: true, + $$eval: true, + content: true, + setContent: true, + addScriptTag: true, + addStyleTag: true, + click: true, + dblclick: true, + dragAndDrop: true, + tap: true, + fill: true, + focus: true, + textContent: true, + innerText: true, + innerHTML: true, + getAttribute: true, + inputValue: true, + isChecked: true, + isDisabled: true, + isEditable: true, + isEnabled: true, + isHidden: true, + isVisible: true, + hover: true, + selectOption: true, + setInputFiles: true, + type: true, + press: true, + check: true, + uncheck: true, + setChecked: true, + waitForTimeout: true, + waitForFunction: true, + title: true + }], + keyboard: [Keyboard2.prototype, { down: true, up: true, insertText: true, type: true, press: true }], + mouse: [Mouse2.prototype, { click: true, dblclick: true, down: true, up: true, move: true, wheel: true }], + touchscreen: [Touchscreen2.prototype, { tap: true }], + jSHandle: [JSHandle2.prototype, { evaluate: true, evaluateHandle: true, getProperty: true, jsonValue: true, getProperties: true, dispose: true }], + route: [Route2.prototype, { fallback: true, abort: true, fetch: true, fulfill: true, continue: true }], + webSocket: [WebSocket.prototype, { waitForEvent: true }], + webSocketRoute: [WebSocketRoute.prototype, { close: true }], + // request: [APIRequest.prototype, {}], + // requestContext: [APIRequestContext.prototype, {}], + // response: [APIResponse.prototype, {}], + page: [Page.prototype, { + opener: true, + waitForSelector: true, + dispatchEvent: true, + evaluateHandle: true, + $: true, + $$: true, + $eval: true, + $$eval: true, + addScriptTag: true, + addStyleTag: true, + exposeFunction: true, + exposeBinding: true, + setExtraHTTPHeaders: true, + content: true, + setContent: true, + goto: true, + reload: true, + addLocatorHandler: true, + removeLocatorHandler: true, + waitForLoadState: true, + waitForNavigation: true, + waitForURL: true, + waitForRequest: true, + waitForResponse: true, + waitForEvent: true, + goBack: true, + goForward: true, + requestGC: true, + emulateMedia: true, + setViewportSize: true, + evaluate: true, + addInitScript: true, + route: true, + routeFromHAR: true, + routeWebSocket: true, + unrouteAll: true, + unroute: true, + screenshot: true, + title: true, + bringToFront: true, + close: true, + click: true, + dragAndDrop: true, + dblclick: true, + tap: true, + fill: true, + focus: true, + textContent: true, + innerText: true, + innerHTML: true, + getAttribute: true, + inputValue: true, + isChecked: true, + isDisabled: true, + isEditable: true, + isEnabled: true, + isHidden: true, + isVisible: true, + hover: true, + selectOption: true, + setInputFiles: true, + type: true, + press: true, + check: true, + uncheck: true, + setChecked: true, + waitForTimeout: true, + waitForFunction: true, + pause: true, + pdf: true + }], + selectors: [Selectors2.prototype, { register: true }], + tracing: [Tracing2.prototype, { group: true, groupEnd: true, start: true, startChunk: true, stop: true, stopChunk: true }], + video: [Video.prototype, { delete: true, path: true, saveAs: true }], + worker: [Worker.prototype, { evaluate: true, evaluateHandle: true }], + session: [CDPSession.prototype, { send: true, detach: true }], + playwright: [Playwright2.prototype, { devices: false }], + webError: [WebError.prototype, {}], + // from crx + crx: [Crx$1.prototype, { start: true, get: true }], + crxApplication: [CrxApplication$1.prototype, { attach: true, attachAll: true, close: true, detach: true, detachAll: true, newPage: true }], + crxRecorder: [CrxRecorder.prototype, { hide: true, list: true, load: true, run: true, setMode: true, show: true }] +}; +const kCrxZoneWrapped = Symbol("crxZone"); +function wrapClientApis() { + for (const [typeName, [proto, props]] of Object.entries(apis)) { + for (const [key2, needsWrap] of Object.entries(props)) { + if (!needsWrap) + continue; + const originalFn = proto[key2]; + if (!originalFn || typeof originalFn !== "function") + throw new Error(`Method ${key2} not found in ${typeName}`); + if (originalFn[kCrxZoneWrapped] === true) + continue; + const wrapFn = async function(...args) { + const apiName = currentZone().data("crxZone"); + if (apiName) + return await originalFn.apply(this, args); + return await currentZone().with("crxZone", { apiName: `${typeName}.${key2}` }).run(async () => await originalFn.apply(this, args)); + }; + wrapFn[kCrxZoneWrapped] = true; + proto[key2] = wrapFn; + } + } +} +PageBinding.kBindingName = "__crx__binding__"; +const playwright = new CrxPlaywright2(); +const clientConnection = new CrxConnection(nodePlatform); +const dispatcherConnection = new DispatcherConnection( + true + /* local */ +); +dispatcherConnection.onmessage = (message) => clientConnection.dispatch(message); +clientConnection.onmessage = (message) => dispatcherConnection.dispatch(message); +const rootScope = new RootDispatcher(dispatcherConnection); +new CrxPlaywrightDispatcher(rootScope, playwright); +const playwrightAPI = clientConnection.getObjectWithKnownName("Playwright"); +dispatcherConnection.onmessage = (message) => setImmediate(() => clientConnection.dispatch(message)); +clientConnection.onmessage = (message) => setImmediate(() => dispatcherConnection.dispatch(message)); +clientConnection.toImpl = (x) => x ? dispatcherConnection._dispatcherByGuid.get(x._guid)._object : dispatcherConnection._dispatcherByGuid.get(""); +playwrightAPI._toImpl = clientConnection.toImpl; +const { _crx: crx, selectors, errors } = playwrightAPI; +wrapClientApis(); +const debug = browserExports$2.debug; +const stoppedModes = ["none", "standby", "detached"]; +const recordingModes = ["recording", "assertingText", "assertingVisibility", "assertingValue", "assertingSnapshot"]; +let crxAppPromise; +const attachedTabIds = /* @__PURE__ */ new Set(); +let currentMode; +let settings = defaultSettings; +const settingsInitializing = loadSettings().then((s) => settings = s).catch(() => { +}); +addSettingsChangedListener((newSettings) => { + settings = newSettings; + setTestIdAttributeName(newSettings.testIdAttributeName); +}); +let allowsIncognitoAccess = false; +chrome.extension.isAllowedIncognitoAccess().then((allowed) => { + allowsIncognitoAccess = allowed; +}); +async function changeAction(tabId, mode) { + if (!mode) + mode = attachedTabIds.has(tabId) ? currentMode : "detached"; + else if (mode !== "detached") + currentMode = mode; + if (!mode || stoppedModes.includes(mode)) { + await Promise.all([ + chrome.action.setTitle({ title: mode === "none" ? "Stopped" : "Record", tabId }), + chrome.action.setBadgeText({ text: "", tabId }) + ]).catch(() => { + }); + return; + } + const { text, title, color, bgColor } = recordingModes.includes(mode) ? { text: "REC", title: "Recording", color: "white", bgColor: "darkred" } : { text: "INS", title: "Inspecting", color: "white", bgColor: "dodgerblue" }; + await Promise.all([ + chrome.action.setTitle({ title, tabId }), + chrome.action.setBadgeText({ text, tabId }), + chrome.action.setBadgeTextColor({ color, tabId }), + chrome.action.setBadgeBackgroundColor({ color: bgColor, tabId }) + ]).catch(() => { + }); +} +chrome.tabs.onUpdated.addListener((tabId) => changeAction(tabId)); +async function getCrxApp(incognito) { + if (!crxAppPromise) { + await settingsInitializing; + crxAppPromise = crx.start({ incognito }).then((crxApp) => { + crxApp.recorder.addListener("hide", async () => { + await crxApp.close(); + crxAppPromise = void 0; + }); + crxApp.recorder.addListener("modechanged", async ({ mode }) => { + await Promise.all([...attachedTabIds].map((tabId) => changeAction(tabId, mode))); + }); + crxApp.addListener("attached", async ({ tabId }) => { + attachedTabIds.add(tabId); + await changeAction(tabId, crxApp.recorder.mode()); + }); + crxApp.addListener("detached", async (tabId) => { + attachedTabIds.delete(tabId); + await changeAction(tabId, "detached"); + }); + setTestIdAttributeName(settings.testIdAttributeName); + return crxApp; + }); + } + return await crxAppPromise; +} +async function attach(tab, mode) { + var _a2; + if (!(tab == null ? void 0 : tab.id) || attachedTabIds.has(tab.id) && !mode) + return; + if (tab.incognito && !allowsIncognitoAccess) + throw new Error("Not authorized to launch in Incognito mode."); + const sidepanel = !isUnderTest() && settings.sidepanel; + if (sidepanel) + await chrome.sidePanel.open({ windowId: tab.windowId }); + chrome.action.disable(); + if ((_a2 = tab.url) == null ? void 0 : _a2.startsWith("chrome://")) { + const windowId = tab.windowId; + tab = await new Promise((resolve) => { + chrome.tabs.create({ windowId, url: "about:blank" }).then((tab2) => { + resolve(tab2); + }).catch(() => { + }); + }); + } + const crxApp = await getCrxApp(tab.incognito); + try { + if (crxApp.recorder.isHidden()) { + await crxApp.recorder.show({ + mode: mode ?? "recording", + language: settings.targetLanguage, + window: { type: sidepanel ? "sidepanel" : "popup", url: "index.html" }, + playInIncognito: settings.playInIncognito + }); + } + await crxApp.attach(tab.id); + if (mode) + await crxApp.recorder.setMode(mode); + } finally { + chrome.action.enable(); + } +} +async function setTestIdAttributeName(testIdAttributeName2) { + playwrightAPI.selectors.setTestIdAttribute(testIdAttributeName2); +} +chrome.action.onClicked.addListener(attach); +chrome.contextMenus.create({ + id: "pw-recorder", + title: "Attach to Playwright Recorder", + contexts: ["all"] +}); +chrome.contextMenus.onClicked.addListener(async (_, tab) => { + if (tab) + await attach(tab); +}); +chrome.commands.onCommand.addListener(async (command2, tab) => { + if (!tab.id) + return; + if (command2 === "inspect") + await attach(tab, "inspecting"); + else if (command2 === "record") + await attach(tab, "recording"); +}); +async function getStorageState() { + const crxApp = await crxAppPromise; + if (!crxApp) + return; + return await crxApp.context().storageState(); +} +chrome.runtime.onMessage.addListener((message, _, sendResponse) => { + if (message.event === "storageStateRequested") { + getStorageState().then(sendResponse).catch(() => { + }); + return true; + } +}); +chrome.runtime.onInstalled.addListener((details) => { + if (globalThis.__crxTest) + return; + void details; +}); +Object.assign(self, { attach, setTestIdAttributeName, getCrxApp, _debug: debug, _setUnderTest: setUnderTest }); +import("./edge_share_relay.js").catch((error) => console.error(error)); diff --git a/extension/edge-share-crx/codeMirrorModule.css b/extension/edge-share-crx/codeMirrorModule.css new file mode 100644 index 0000000..f4d5718 --- /dev/null +++ b/extension/edge-share-crx/codeMirrorModule.css @@ -0,0 +1,344 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} +.cm-fat-cursor .CodeMirror-line::selection, +.cm-fat-cursor .CodeMirror-line > span::selection, +.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } +.cm-fat-cursor .CodeMirror-line::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } +.cm-fat-cursor { caret-color: transparent; } +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: 0; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 50px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -50px; margin-right: -50px; + padding-bottom: 50px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; + z-index: 0; +} +.CodeMirror-sizer { + position: relative; + border-right: 50px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; + outline: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -50px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre.CodeMirror-line, +.CodeMirror-wrap pre.CodeMirror-line-like { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/extension/edge-share-crx/codeMirrorModule.js b/extension/edge-share-crx/codeMirrorModule.js new file mode 100644 index 0000000..39e69d5 --- /dev/null +++ b/extension/edge-share-crx/codeMirrorModule.js @@ -0,0 +1,16684 @@ +import { g as getDefaultExportFromCjs } from "./form.js"; +import "./settings.js"; +var codemirror$2 = { exports: {} }; +var codemirror$1 = codemirror$2.exports; +var hasRequiredCodemirror; +function requireCodemirror() { + if (hasRequiredCodemirror) return codemirror$2.exports; + hasRequiredCodemirror = 1; + (function(module, exports) { + (function(global, factory) { + module.exports = factory(); + })(codemirror$1, function() { + var userAgent = navigator.userAgent; + var platform = navigator.platform; + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\/(\d+)/.exec(userAgent); + var chrome_version = chrome && +chrome[1]; + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { + presto_version = Number(presto_version[1]); + } + if (presto_version && presto_version >= 15) { + presto = false; + webkit = true; + } + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || ie && ie_version >= 9; + function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); + } + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) { + e.removeChild(e.firstChild); + } + return e; + } + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e); + } + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { + e.className = className; + } + if (style) { + e.style.cssText = style; + } + if (typeof content == "string") { + e.appendChild(document.createTextNode(content)); + } else if (content) { + for (var i2 = 0; i2 < content.length; ++i2) { + e.appendChild(content[i2]); + } + } + return e; + } + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e; + } + var range; + if (document.createRange) { + range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r; + }; + } else { + range = function(node, start, end) { + var r = document.body.createTextRange(); + try { + r.moveToElementText(node.parentNode); + } catch (e) { + return r; + } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r; + }; + } + function contains(parent, child) { + if (child.nodeType == 3) { + child = child.parentNode; + } + if (parent.contains) { + return parent.contains(child); + } + do { + if (child.nodeType == 11) { + child = child.host; + } + if (child == parent) { + return true; + } + } while (child = child.parentNode); + } + function activeElt(rootNode2) { + var doc2 = rootNode2.ownerDocument || rootNode2; + var activeElement; + try { + activeElement = rootNode2.activeElement; + } catch (e) { + activeElement = doc2.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) { + activeElement = activeElement.shadowRoot.activeElement; + } + return activeElement; + } + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { + node.className += (current ? " " : "") + cls; + } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i2 = 0; i2 < as.length; i2++) { + if (as[i2] && !classTest(as[i2]).test(b)) { + b += " " + as[i2]; + } + } + return b; + } + var selectInput = function(node) { + node.select(); + }; + if (ios) { + selectInput = function(node) { + node.selectionStart = 0; + node.selectionEnd = node.value.length; + }; + } else if (ie) { + selectInput = function(node) { + try { + node.select(); + } catch (_e) { + } + }; + } + function doc(cm) { + return cm.display.wrapper.ownerDocument; + } + function root(cm) { + return rootNode(cm.display.wrapper); + } + function rootNode(element) { + return element.getRootNode ? element.getRootNode() : element.ownerDocument; + } + function win(cm) { + return doc(cm).defaultView; + } + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function() { + return f.apply(null, args); + }; + } + function copyObj(obj, target, overwrite) { + if (!target) { + target = {}; + } + for (var prop2 in obj) { + if (obj.hasOwnProperty(prop2) && (overwrite !== false || !target.hasOwnProperty(prop2))) { + target[prop2] = obj[prop2]; + } + } + return target; + } + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { + end = string.length; + } + } + for (var i2 = startIndex || 0, n = startValue || 0; ; ) { + var nextTab = string.indexOf(" ", i2); + if (nextTab < 0 || nextTab >= end) { + return n + (end - i2); + } + n += nextTab - i2; + n += tabSize - n % tabSize; + i2 = nextTab + 1; + } + } + var Delayed = function() { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function(self) { + self.id = 0; + if (self.time <= +/* @__PURE__ */ new Date()) { + self.f(); + } else { + setTimeout(self.handler, self.time - +/* @__PURE__ */ new Date()); + } + }; + Delayed.prototype.set = function(ms, f) { + this.f = f; + var time = +/* @__PURE__ */ new Date() + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + function indexOf(array, elt2) { + for (var i2 = 0; i2 < array.length; ++i2) { + if (array[i2] == elt2) { + return i2; + } + } + return -1; + } + var scrollerGap = 50; + var Pass = { toString: function() { + return "CodeMirror.Pass"; + } }; + var sel_dontScroll = { scroll: false }, sel_mouse = { origin: "*mouse" }, sel_move = { origin: "+move" }; + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0; ; ) { + var nextTab = string.indexOf(" ", pos); + if (nextTab == -1) { + nextTab = string.length; + } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) { + return pos + Math.min(skipped, goal - col); + } + col += nextTab - pos; + col += tabSize - col % tabSize; + pos = nextTab + 1; + if (col >= goal) { + return pos; + } + } + } + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) { + spaceStrs.push(lst(spaceStrs) + " "); + } + return spaceStrs[n]; + } + function lst(arr) { + return arr[arr.length - 1]; + } + function map(array, f) { + var out = []; + for (var i2 = 0; i2 < array.length; i2++) { + out[i2] = f(array[i2], i2); + } + return out; + } + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { + pos++; + } + array.splice(pos, 0, value); + } + function nothing() { + } + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { + copyObj(props, inst); + } + return inst; + } + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "€" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); + } + function isWordChar(ch, helper) { + if (!helper) { + return isWordCharBasic(ch); + } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { + return true; + } + return helper.test(ch); + } + function isEmpty(obj) { + for (var n in obj) { + if (obj.hasOwnProperty(n) && obj[n]) { + return false; + } + } + return true; + } + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { + return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); + } + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { + pos += dir; + } + return pos; + } + function findFirst(pred, from, to) { + var dir = from > to ? -1 : 1; + for (; ; ) { + if (from == to) { + return from; + } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { + return pred(mid) ? from : to; + } + if (pred(mid)) { + to = mid; + } else { + from = mid + dir; + } + } + } + function iterateBidiSections(order, from, to, f) { + if (!order) { + return f(from, to, "ltr", 0); + } + var found = false; + for (var i2 = 0; i2 < order.length; ++i2) { + var part = order[i2]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i2); + found = true; + } + } + if (!found) { + f(from, to, "ltr"); + } + } + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i2 = 0; i2 < order.length; ++i2) { + var cur = order[i2]; + if (cur.from < ch && cur.to > ch) { + return i2; + } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { + found = i2; + } else { + bidiOther = i2; + } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { + found = i2; + } else { + bidiOther = i2; + } + } + } + return found != null ? found : bidiOther; + } + var bidiOrdering = /* @__PURE__ */ function() { + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 247) { + return lowTypes.charAt(code); + } else if (1424 <= code && code <= 1524) { + return "R"; + } else if (1536 <= code && code <= 1785) { + return arabicTypes.charAt(code - 1536); + } else if (1774 <= code && code <= 2220) { + return "r"; + } else if (8192 <= code && code <= 8203) { + return "w"; + } else if (code == 8204) { + return "b"; + } else { + return "L"; + } + } + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; + this.to = to; + } + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { + return false; + } + var len = str.length, types = []; + for (var i2 = 0; i2 < len; ++i2) { + types.push(charType(str.charCodeAt(i2))); + } + for (var i$12 = 0, prev = outerType; i$12 < len; ++i$12) { + var type = types[i$12]; + if (type == "m") { + types[i$12] = prev; + } else { + prev = type; + } + } + for (var i$22 = 0, cur = outerType; i$22 < len; ++i$22) { + var type$1 = types[i$22]; + if (type$1 == "1" && cur == "r") { + types[i$22] = "n"; + } else if (isStrong.test(type$1)) { + cur = type$1; + if (type$1 == "r") { + types[i$22] = "R"; + } + } + } + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3 + 1] == "1") { + types[i$3] = "1"; + } else if (type$2 == "," && prev$1 == types[i$3 + 1] && (prev$1 == "1" || prev$1 == "n")) { + types[i$3] = prev$1; + } + prev$1 = type$2; + } + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { + types[i$4] = "N"; + } else if (type$3 == "%") { + var end = void 0; + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) { + } + var replace = i$4 && types[i$4 - 1] == "!" || end < len && types[end] == "1" ? "1" : "N"; + for (var j = i$4; j < end; ++j) { + types[j] = replace; + } + i$4 = end - 1; + } + } + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { + types[i$5] = "L"; + } else if (isStrong.test(type$4)) { + cur$1 = type$4; + } + } + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = void 0; + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) { + } + var before = (i$6 ? types[i$6 - 1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? before ? "L" : "R" : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { + types[j$1] = replace$1; + } + i$6 = end$1 - 1; + } + } + var order = [], m; + for (var i$7 = 0; i$7 < len; ) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) { + } + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) { + } + for (var j$2 = pos; j$2 < i$7; ) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { + order.splice(at, 0, new BidiSpan(1, pos, j$2)); + at += isRTL; + } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) { + } + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { + ++j$2; + } + } + if (pos < i$7) { + order.splice(at, 0, new BidiSpan(1, pos, i$7)); + } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + return direction == "rtl" ? order.reverse() : order; + }; + }(); + function getOrder(line, direction) { + var order = line.order; + if (order == null) { + order = line.order = bidiOrdering(line.text, direction); + } + return order; + } + var noHandlers = []; + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map2 = emitter._handlers || (emitter._handlers = {}); + map2[type] = (map2[type] || noHandlers).concat(f); + } + }; + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers; + } + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map2 = emitter._handlers, arr = map2 && map2[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) { + map2[type] = arr.slice(0, index).concat(arr.slice(index + 1)); + } + } + } + } + function signal(emitter, type) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { + return; + } + var args = Array.prototype.slice.call(arguments, 2); + for (var i2 = 0; i2 < handlers.length; ++i2) { + handlers[i2].apply(null, args); + } + } + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") { + e = { type: e, preventDefault: function() { + this.defaultPrevented = true; + } }; + } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore; + } + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { + return; + } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i2 = 0; i2 < arr.length; ++i2) { + if (indexOf(set, arr[i2]) == -1) { + set.push(arr[i2]); + } + } + } + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0; + } + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) { + on(this, type, f); + }; + ctor.prototype.off = function(type, f) { + off(this, type, f); + }; + } + function e_preventDefault(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; + } + function e_stop(e) { + e_preventDefault(e); + e_stopPropagation(e); + } + function e_target(e) { + return e.target || e.srcElement; + } + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { + b = 1; + } else if (e.button & 2) { + b = 3; + } else if (e.button & 4) { + b = 2; + } + } + if (mac && e.ctrlKey && b == 1) { + b = 3; + } + return b; + } + var dragAndDrop = function() { + if (ie && ie_version < 9) { + return false; + } + var div = elt("div"); + return "draggable" in div || "dragDrop" in div; + }(); + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "​"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) { + zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); + } + } + var node = zwspSupported ? elt("span", "​") : elt("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node; + } + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { + return badBidiRects; + } + var txt = removeChildrenAndAdd(measure, document.createTextNode("AخA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { + return false; + } + return badBidiRects = r1.right - r0.right < 3; + } + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function(string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { + nl = string.length; + } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result; + } : function(string) { + return string.split(/\r\n?|\n/); + }; + var hasSelection = window.getSelection ? function(te) { + try { + return te.selectionStart != te.selectionEnd; + } catch (e) { + return false; + } + } : function(te) { + var range2; + try { + range2 = te.ownerDocument.selection.createRange(); + } catch (e) { + } + if (!range2 || range2.parentElement() != te) { + return false; + } + return range2.compareEndPoints("StartToEnd", range2) != 0; + }; + var hasCopyEvent = function() { + var e = elt("div"); + if ("oncopy" in e) { + return true; + } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function"; + }(); + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { + return badZoomedRects; + } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1; + } + var modes = {}, mimeModes = {}; + function defineMode(name, mode) { + if (arguments.length > 2) { + mode.dependencies = Array.prototype.slice.call(arguments, 2); + } + modes[name] = mode; + } + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { + found = { name: found }; + } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml"); + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json"); + } + if (typeof spec == "string") { + return { name: spec }; + } else { + return spec || { name: "null" }; + } + } + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { + return getMode(options, "text/plain"); + } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop2 in exts) { + if (!exts.hasOwnProperty(prop2)) { + continue; + } + if (modeObj.hasOwnProperty(prop2)) { + modeObj["_" + prop2] = modeObj[prop2]; + } + modeObj[prop2] = exts[prop2]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { + modeObj.helperType = spec.helperType; + } + if (spec.modeProps) { + for (var prop$1 in spec.modeProps) { + modeObj[prop$1] = spec.modeProps[prop$1]; + } + } + return modeObj; + } + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : modeExtensions[mode] = {}; + copyObj(properties, exts); + } + function copyState(mode, state) { + if (state === true) { + return state; + } + if (mode.copyState) { + return mode.copyState(state); + } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { + val = val.concat([]); + } + nstate[n] = val; + } + return nstate; + } + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { + break; + } + state = info.state; + mode = info.mode; + } + return info || { mode, state }; + } + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; + } + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + StringStream.prototype.eol = function() { + return this.pos >= this.string.length; + }; + StringStream.prototype.sol = function() { + return this.pos == this.lineStart; + }; + StringStream.prototype.peek = function() { + return this.string.charAt(this.pos) || void 0; + }; + StringStream.prototype.next = function() { + if (this.pos < this.string.length) { + return this.string.charAt(this.pos++); + } + }; + StringStream.prototype.eat = function(match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { + ok = ch == match; + } else { + ok = ch && (match.test ? match.test(ch) : match(ch)); + } + if (ok) { + ++this.pos; + return ch; + } + }; + StringStream.prototype.eatWhile = function(match) { + var start = this.pos; + while (this.eat(match)) { + } + return this.pos > start; + }; + StringStream.prototype.eatSpace = function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { + ++this.pos; + } + return this.pos > start; + }; + StringStream.prototype.skipToEnd = function() { + this.pos = this.string.length; + }; + StringStream.prototype.skipTo = function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) { + this.pos = found; + return true; + } + }; + StringStream.prototype.backUp = function(n) { + this.pos -= n; + }; + StringStream.prototype.column = function() { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); + }; + StringStream.prototype.indentation = function() { + return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); + }; + StringStream.prototype.match = function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) { + return caseInsensitive ? str.toLowerCase() : str; + }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { + this.pos += pattern.length; + } + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { + return null; + } + if (match && consume !== false) { + this.pos += match[0].length; + } + return match; + } + }; + StringStream.prototype.current = function() { + return this.string.slice(this.start, this.pos); + }; + StringStream.prototype.hideFirstChars = function(n, inner) { + this.lineStart += n; + try { + return inner(); + } finally { + this.lineStart -= n; + } + }; + StringStream.prototype.lookAhead = function(n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n); + }; + StringStream.prototype.baseToken = function() { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos); + }; + function getLine(doc2, n) { + n -= doc2.first; + if (n < 0 || n >= doc2.size) { + throw new Error("There is no line " + (n + doc2.first) + " in the document."); + } + var chunk = doc2; + while (!chunk.lines) { + for (var i2 = 0; ; ++i2) { + var child = chunk.children[i2], sz = child.chunkSize(); + if (n < sz) { + chunk = child; + break; + } + n -= sz; + } + } + return chunk.lines[n]; + } + function getBetween(doc2, start, end) { + var out = [], n = start.line; + doc2.iter(start.line, end.line + 1, function(line) { + var text = line.text; + if (n == end.line) { + text = text.slice(0, end.ch); + } + if (n == start.line) { + text = text.slice(start.ch); + } + out.push(text); + ++n; + }); + return out; + } + function getLines(doc2, from, to) { + var out = []; + doc2.iter(from, to, function(line) { + out.push(line.text); + }); + return out; + } + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { + for (var n = line; n; n = n.parent) { + n.height += diff; + } + } + } + function lineNo(line) { + if (line.parent == null) { + return null; + } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i2 = 0; ; ++i2) { + if (chunk.children[i2] == cur) { + break; + } + no += chunk.children[i2].chunkSize(); + } + } + return no + cur.first; + } + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$12 = 0; i$12 < chunk.children.length; ++i$12) { + var child = chunk.children[i$12], ch = child.height; + if (h < ch) { + chunk = child; + continue outer; + } + h -= ch; + n += child.chunkSize(); + } + return n; + } while (!chunk.lines); + var i2 = 0; + for (; i2 < chunk.lines.length; ++i2) { + var line = chunk.lines[i2], lh = line.height; + if (h < lh) { + break; + } + h -= lh; + } + return n + i2; + } + function isLine(doc2, l) { + return l >= doc2.first && l < doc2.first + doc2.size; + } + function lineNumberFor(options, i2) { + return String(options.lineNumberFormatter(i2 + options.firstLineNumber)); + } + function Pos(line, ch, sticky) { + if (sticky === void 0) sticky = null; + if (!(this instanceof Pos)) { + return new Pos(line, ch, sticky); + } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + function cmp(a, b) { + return a.line - b.line || a.ch - b.ch; + } + function equalCursorPos(a, b) { + return a.sticky == b.sticky && cmp(a, b) == 0; + } + function copyPos(x) { + return Pos(x.line, x.ch); + } + function maxPos(a, b) { + return cmp(a, b) < 0 ? b : a; + } + function minPos(a, b) { + return cmp(a, b) < 0 ? a : b; + } + function clipLine(doc2, n) { + return Math.max(doc2.first, Math.min(n, doc2.first + doc2.size - 1)); + } + function clipPos(doc2, pos) { + if (pos.line < doc2.first) { + return Pos(doc2.first, 0); + } + var last = doc2.first + doc2.size - 1; + if (pos.line > last) { + return Pos(last, getLine(doc2, last).text.length); + } + return clipToLen(pos, getLine(doc2, pos.line).text.length); + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { + return Pos(pos.line, linelen); + } else if (ch < 0) { + return Pos(pos.line, 0); + } else { + return pos; + } + } + function clipPosArray(doc2, array) { + var out = []; + for (var i2 = 0; i2 < array.length; i2++) { + out[i2] = clipPos(doc2, array[i2]); + } + return out; + } + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + var Context = function(doc2, state, line, lookAhead) { + this.state = state; + this.doc = doc2; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + Context.prototype.lookAhead = function(n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { + this.maxLookAhead = n; + } + return line; + }; + Context.prototype.baseToken = function(n) { + if (!this.baseTokens) { + return null; + } + while (this.baseTokens[this.baseTokenPos] <= n) { + this.baseTokenPos += 2; + } + var type = this.baseTokens[this.baseTokenPos + 1]; + return { + type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n + }; + }; + Context.prototype.nextLine = function() { + this.line++; + if (this.maxLookAhead > 0) { + this.maxLookAhead--; + } + }; + Context.fromSaved = function(doc2, saved, line) { + if (saved instanceof SavedContext) { + return new Context(doc2, copyState(doc2.mode, saved.state), line, saved.lookAhead); + } else { + return new Context(doc2, copyState(doc2.mode, saved), line); + } + }; + Context.prototype.save = function(copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state; + }; + function highlightLine(cm, line, context, forceToEnd) { + var st = [cm.state.modeGen], lineClasses = {}; + runMode( + cm, + line.text, + cm.doc.mode, + context, + function(end, style) { + return st.push(end, style); + }, + lineClasses, + forceToEnd + ); + var state = context.state; + var loop = function(o2) { + context.baseTokens = st; + var overlay = cm.state.overlays[o2], i2 = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function(end, style) { + var start = i2; + while (at < end) { + var i_end = st[i2]; + if (i_end > end) { + st.splice(i2, 1, end, st[i2 + 1], i_end); + } + i2 += 2; + at = Math.min(end, i_end); + } + if (!style) { + return; + } + if (overlay.opaque) { + st.splice(start, i2 - start, end, "overlay " + style); + i2 = start + 2; + } else { + for (; start < i2; start += 2) { + var cur = st[start + 1]; + st[start + 1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + for (var o = 0; o < cm.state.overlays.length; ++o) loop(o); + return { styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null }; + } + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { + context.state = resetState; + } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { + line.styleClasses = result.classes; + } else if (line.styleClasses) { + line.styleClasses = null; + } + if (updateFrontier === cm.doc.highlightFrontier) { + cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); + } + } + return line.styles; + } + function getContextBefore(cm, n, precise) { + var doc2 = cm.doc, display = cm.display; + if (!doc2.mode.startState) { + return new Context(doc2, true, n); + } + var start = findStartLine(cm, n, precise); + var saved = start > doc2.first && getLine(doc2, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc2, saved, start) : new Context(doc2, startState(doc2.mode), start); + doc2.iter(start, n, function(line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { + doc2.modeFrontier = context.line; + } + return context; + } + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { + callBlankLine(mode, context.state); + } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + function callBlankLine(mode, state) { + if (mode.blankLine) { + return mode.blankLine(state); + } + if (!mode.innerMode) { + return; + } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { + return inner.mode.blankLine(inner.state); + } + } + function readToken(mode, stream, state, inner) { + for (var i2 = 0; i2 < 10; i2++) { + if (inner) { + inner[0] = innerMode(mode, state).mode; + } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { + return style; + } + } + throw new Error("Mode " + mode.name + " failed to advance stream."); + } + var Token = function(stream, type, state) { + this.start = stream.start; + this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + function takeToken(cm, pos, precise, asArray) { + var doc2 = cm.doc, mode = doc2.mode, style; + pos = clipPos(doc2, pos); + var line = getLine(doc2, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { + tokens = []; + } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { + tokens.push(new Token(stream, style, copyState(doc2.mode, context.state))); + } + } + return asArray ? tokens : new Token(stream, style, context.state); + } + function extractLineClasses(type, output) { + if (type) { + for (; ; ) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { + break; + } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop2 = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop2] == null) { + output[prop2] = lineClass[2]; + } else if (!new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)").test(output[prop2])) { + output[prop2] += " " + lineClass[2]; + } + } + } + return type; + } + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { + flattenSpans = cm.options.flattenSpans; + } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { + extractLineClasses(callBlankLine(mode, context.state), lineClasses); + } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { + processLine(cm, text, context, stream.pos); + } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { + style = "m-" + (style ? mName + " " + style : mName); + } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5e3); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + var pos = Math.min(stream.pos, curStart + 5e3); + f(pos, curStyle); + curStart = pos; + } + } + function findStartLine(cm, n, precise) { + var minindent, minline, doc2 = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1e3 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc2.first) { + return doc2.first; + } + var line = getLine(doc2, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc2.modeFrontier)) { + return search; + } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline; + } + function retreatFrontier(doc2, n) { + doc2.modeFrontier = Math.min(doc2.modeFrontier, n); + if (doc2.highlightFrontier < n - 10) { + return; + } + var start = doc2.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc2, line).stateAfter; + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break; + } + } + doc2.highlightFrontier = Math.min(doc2.highlightFrontier, start); + } + var sawReadOnlySpans = false, sawCollapsedSpans = false; + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; + this.to = to; + } + function getMarkedSpanFor(spans, marker) { + if (spans) { + for (var i2 = 0; i2 < spans.length; ++i2) { + var span = spans[i2]; + if (span.marker == marker) { + return span; + } + } + } + } + function removeMarkedSpan(spans, span) { + var r; + for (var i2 = 0; i2 < spans.length; ++i2) { + if (spans[i2] != span) { + (r || (r = [])).push(spans[i2]); + } + } + return r; + } + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = /* @__PURE__ */ new WeakSet())); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { + inThisOp.add(line.markedSpans); + } + } + span.marker.attachLine(line); + } + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { + for (var i2 = 0; i2 < old.length; ++i2) { + var span = old[i2], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); + (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } + } + return nw; + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { + for (var i2 = 0; i2 < old.length; ++i2) { + var span = old[i2], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); + (nw || (nw = [])).push(new MarkedSpan( + marker, + startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh + )); + } + } + } + return nw; + } + function stretchSpansOverChange(doc2, change) { + if (change.full) { + return null; + } + var oldFirst = isLine(doc2, change.from.line) && getLine(doc2, change.from.line).markedSpans; + var oldLast = isLine(doc2, change.to.line) && getLine(doc2, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { + return null; + } + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + for (var i2 = 0; i2 < first.length; ++i2) { + var span = first[i2]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { + span.to = startCh; + } else if (sameLine) { + span.to = found.to == null ? null : found.to + offset; + } + } + } + } + if (last) { + for (var i$12 = 0; i$12 < last.length; ++i$12) { + var span$1 = last[i$12]; + if (span$1.to != null) { + span$1.to += offset; + } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { + (first || (first = [])).push(span$1); + } + } + } else { + span$1.from += offset; + if (sameLine) { + (first || (first = [])).push(span$1); + } + } + } + } + if (first) { + first = clearEmptySpans(first); + } + if (last && last != first) { + last = clearEmptySpans(last); + } + var newMarkers = [first]; + if (!sameLine) { + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) { + for (var i$22 = 0; i$22 < first.length; ++i$22) { + if (first[i$22].to == null) { + (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$22].marker, null, null)); + } + } + } + for (var i$3 = 0; i$3 < gap; ++i$3) { + newMarkers.push(gapMarkers); + } + newMarkers.push(last); + } + return newMarkers; + } + function clearEmptySpans(spans) { + for (var i2 = 0; i2 < spans.length; ++i2) { + var span = spans[i2]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) { + spans.splice(i2--, 1); + } + } + if (!spans.length) { + return null; + } + return spans; + } + function removeReadOnlyRanges(doc2, from, to) { + var markers = null; + doc2.iter(from.line, to.line + 1, function(line) { + if (line.markedSpans) { + for (var i3 = 0; i3 < line.markedSpans.length; ++i3) { + var mark = line.markedSpans[i3].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) { + (markers || (markers = [])).push(mark); + } + } + } + }); + if (!markers) { + return null; + } + var parts = [{ from, to }]; + for (var i2 = 0; i2 < markers.length; ++i2) { + var mk = markers[i2], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { + continue; + } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) { + newParts.push({ from: p.from, to: m.from }); + } + if (dto > 0 || !mk.inclusiveRight && !dto) { + newParts.push({ from: m.to, to: p.to }); + } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts; + } + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { + return; + } + for (var i2 = 0; i2 < spans.length; ++i2) { + spans[i2].marker.detachLine(line); + } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { + return; + } + for (var i2 = 0; i2 < spans.length; ++i2) { + spans[i2].marker.attachLine(line); + } + line.markedSpans = spans; + } + function extraLeft(marker) { + return marker.inclusiveLeft ? -1 : 0; + } + function extraRight(marker) { + return marker.inclusiveRight ? 1 : 0; + } + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { + return lenDiff; + } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { + return -fromCmp; + } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { + return toCmp; + } + return b.id - a.id; + } + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { + for (var sp = void 0, i2 = 0; i2 < sps.length; ++i2) { + sp = sps[i2]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { + found = sp.marker; + } + } + } + return found; + } + function collapsedSpanAtStart(line) { + return collapsedSpanAtSide(line, true); + } + function collapsedSpanAtEnd(line) { + return collapsedSpanAtSide(line, false); + } + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { + for (var i2 = 0; i2 < sps.length; ++i2) { + var sp = sps[i2]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { + found = sp.marker; + } + } + } + return found; + } + function conflictingCollapsedRange(doc2, lineNo2, from, to, marker) { + var line = getLine(doc2, lineNo2); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { + for (var i2 = 0; i2 < sps.length; ++i2) { + var sp = sps[i2]; + if (!sp.marker.collapsed) { + continue; + } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { + continue; + } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) { + return true; + } + } + } + } + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) { + line = merged.find(-1, true).line; + } + return line; + } + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + } + return line; + } + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + (lines || (lines = [])).push(line); + } + return lines; + } + function visualLineNo(doc2, lineN) { + var line = getLine(doc2, lineN), vis = visualLine(line); + if (line == vis) { + return lineN; + } + return lineNo(vis); + } + function visualLineEndNo(doc2, lineN) { + if (lineN > doc2.lastLine()) { + return lineN; + } + var line = getLine(doc2, lineN), merged; + if (!lineIsHidden(doc2, line)) { + return lineN; + } + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + } + return lineNo(line) + 1; + } + function lineIsHidden(doc2, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { + for (var sp = void 0, i2 = 0; i2 < sps.length; ++i2) { + sp = sps[i2]; + if (!sp.marker.collapsed) { + continue; + } + if (sp.from == null) { + return true; + } + if (sp.marker.widgetNode) { + continue; + } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc2, line, sp)) { + return true; + } + } + } + } + function lineIsHiddenInner(doc2, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc2, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)); + } + if (span.marker.inclusiveRight && span.to == line.text.length) { + return true; + } + for (var sp = void 0, i2 = 0; i2 < line.markedSpans.length; ++i2) { + sp = line.markedSpans[i2]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc2, line, sp)) { + return true; + } + } + } + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + var h = 0, chunk = lineObj.parent; + for (var i2 = 0; i2 < chunk.lines.length; ++i2) { + var line = chunk.lines[i2]; + if (line == lineObj) { + break; + } else { + h += line.height; + } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$12 = 0; i$12 < p.children.length; ++i$12) { + var cur = p.children[i$12]; + if (cur == chunk) { + break; + } else { + h += cur.height; + } + } + } + return h; + } + function lineLength(line) { + if (line.height == 0) { + return 0; + } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len; + } + function findMaxLine(cm) { + var d = cm.display, doc2 = cm.doc; + d.maxLine = getLine(doc2, doc2.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc2.iter(function(line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + var Line = function(text, markedSpans, estimateHeight2) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight2 ? estimateHeight2(this) : 1; + }; + Line.prototype.lineNo = function() { + return lineNo(this); + }; + eventMixin(Line); + function updateLine(line, text, markedSpans, estimateHeight2) { + line.text = text; + if (line.stateAfter) { + line.stateAfter = null; + } + if (line.styles) { + line.styles = null; + } + if (line.order != null) { + line.order = null; + } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight2 ? estimateHeight2(line) : 1; + if (estHeight != line.height) { + updateLineHeight(line, estHeight); + } + } + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { + return null; + } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); + } + function buildLineContent(cm, lineView) { + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = { + pre: eltP("pre", [content], "CodeMirror-line"), + content, + col: 0, + pos: 0, + cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping") + }; + lineView.measure = {}; + for (var i2 = 0; i2 <= (lineView.rest ? lineView.rest.length : 0); i2++) { + var line = i2 ? lineView.rest[i2 - 1] : lineView.line, order = void 0; + builder.pos = 0; + builder.addToken = buildToken; + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) { + builder.addToken = buildTokenBadBidi(builder.addToken, order); + } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) { + builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); + } + if (line.styleClasses.textClass) { + builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); + } + } + if (builder.map.length == 0) { + builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); + } + if (i2 == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map); + (lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || last.querySelector && last.querySelector(".cm-tab")) { + builder.content.className = "cm-tab-wrap-hack"; + } + } + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) { + builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); + } + return builder; + } + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "•", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token; + } + function buildToken(builder, text, style, startStyle, endStyle, css2, attributes) { + if (!text) { + return; + } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { + mustWrap = true; + } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { + content.appendChild(elt("span", [txt])); + } else { + content.appendChild(txt); + } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { + break; + } + pos += skipped + 1; + var txt$1 = void 0; + if (m[0] == " ") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", " "); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "␍" : "␤", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { + content.appendChild(elt("span", [txt$1])); + } else { + content.appendChild(txt$1); + } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css2 || attributes) { + var fullStyle = style || ""; + if (startStyle) { + fullStyle += startStyle; + } + if (endStyle) { + fullStyle += endStyle; + } + var token = elt("span", [content], fullStyle, css2); + if (attributes) { + for (var attr in attributes) { + if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") { + token.setAttribute(attr, attributes[attr]); + } + } + } + return builder.content.appendChild(token); + } + builder.content.appendChild(content); + } + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { + return text; + } + var spaceBefore = trailingBefore, result = ""; + for (var i2 = 0; i2 < text.length; i2++) { + var ch = text.charAt(i2); + if (ch == " " && spaceBefore && (i2 == text.length - 1 || text.charCodeAt(i2 + 1) == 32)) { + ch = " "; + } + result += ch; + spaceBefore = ch == " "; + } + return result; + } + function buildTokenBadBidi(inner, order) { + return function(builder, text, style, startStyle, endStyle, css2, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (; ; ) { + var part = void 0; + for (var i2 = 0; i2 < order.length; i2++) { + part = order[i2]; + if (part.to > start && part.from <= start) { + break; + } + } + if (part.to >= end) { + return inner(builder, text, style, startStyle, endStyle, css2, attributes); + } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css2, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + }; + } + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { + builder.map.push(builder.pos, builder.pos + size, widget); + } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) { + widget = builder.content.appendChild(document.createElement("span")); + } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$12 = 1; i$12 < styles.length; i$12 += 2) { + builder.addToken(builder, allText.slice(at, at = styles[i$12]), interpretTokenStyle(styles[i$12 + 1], builder.cm.options)); + } + return; + } + var len = allText.length, pos = 0, i2 = 1, text = "", style, css2; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (; ; ) { + if (nextChange == pos) { + spanStyle = spanEndStyle = spanStartStyle = css2 = ""; + attributes = null; + collapsed = null; + nextChange = Infinity; + var foundBookmarks = [], endStyles = void 0; + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { + spanStyle += " " + m.className; + } + if (m.css) { + css2 = (css2 ? css2 + ";" : "") + m.css; + } + if (m.startStyle && sp.from == pos) { + spanStartStyle += " " + m.startStyle; + } + if (m.endStyle && sp.to == nextChange) { + (endStyles || (endStyles = [])).push(m.endStyle, sp.to); + } + if (m.title) { + (attributes || (attributes = {})).title = m.title; + } + if (m.attributes) { + for (var attr in m.attributes) { + (attributes || (attributes = {}))[attr] = m.attributes[attr]; + } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) { + collapsed = sp; + } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { + for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) { + if (endStyles[j$1 + 1] == nextChange) { + spanEndStyle += " " + endStyles[j$1]; + } + } + } + if (!collapsed || collapsed.from == pos) { + for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) { + buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); + } + } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan( + builder, + (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, + collapsed.from == null + ); + if (collapsed.to == null) { + return; + } + if (collapsed.to == pos) { + collapsed = false; + } + } + } + if (pos >= len) { + break; + } + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken( + builder, + tokenText, + style ? style + spanStyle : spanStyle, + spanStartStyle, + pos + tokenText.length == nextChange ? spanEndStyle : "", + css2, + attributes + ); + } + if (end >= upto) { + text = text.slice(upto - pos); + pos = upto; + break; + } + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i2++]); + style = interpretTokenStyle(styles[i2++], builder.cm.options); + } + } + } + function LineView(doc2, line, lineN) { + this.line = line; + this.rest = visualLineContinued(line); + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc2, line); + } + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array; + } + var operationGroup = null; + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + function fireCallbacksForOps(group) { + var callbacks = group.delayedCallbacks, i2 = 0; + do { + for (; i2 < callbacks.length; i2++) { + callbacks[i2].call(null); + } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) { + while (op.cursorActivityCalled < op.cursorActivityHandlers.length) { + op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); + } + } + } + } while (i2 < callbacks.length); + } + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { + return; + } + try { + fireCallbacksForOps(group); + } finally { + operationGroup = null; + endCb(group); + } + } + var orphanDelayedCallbacks = null; + function signalLater(emitter, type) { + var arr = getHandlers(emitter, type); + if (!arr.length) { + return; + } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function(i3) { + list.push(function() { + return arr[i3].apply(null, args); + }); + }; + for (var i2 = 0; i2 < arr.length; ++i2) + loop(i2); + } + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i2 = 0; i2 < delayed.length; ++i2) { + delayed[i2](); + } + } + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { + updateLineText(cm, lineView); + } else if (type == "gutter") { + updateLineGutter(cm, lineView, lineN, dims); + } else if (type == "class") { + updateLineClasses(cm, lineView); + } else if (type == "widget") { + updateLineWidgets(cm, lineView, dims); + } + } + lineView.changes = null; + } + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) { + lineView.text.parentNode.replaceChild(lineView.node, lineView.text); + } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { + lineView.node.style.zIndex = 2; + } + } + return lineView.node; + } + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { + cls += " CodeMirror-linebackground"; + } + if (lineView.background) { + if (cls) { + lineView.background.className = cls; + } else { + lineView.background.parentNode.removeChild(lineView.background); + lineView.background = null; + } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built; + } + return buildLineContent(cm, lineView); + } + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { + lineView.node = built.pre; + } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) { + ensureLineWrapped(lineView).className = lineView.line.wrapClass; + } else if (lineView.node != lineView.text) { + lineView.node.className = ""; + } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt( + "div", + null, + "CodeMirror-gutter-background " + lineView.line.gutterClass, + "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + dims.gutterTotalWidth + "px" + ); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) { + gutterWrap.className += " " + lineView.line.gutterClass; + } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) { + lineView.lineNumber = gutterWrap.appendChild( + elt( + "div", + lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + cm.display.lineNumInnerWidth + "px" + ) + ); + } + if (markers) { + for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) { + gutterWrap.appendChild(elt( + "div", + [found], + "CodeMirror-gutter-elt", + "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px" + )); + } + } + } + } + } + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { + lineView.alignable = null; + } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = void 0; node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { + lineView.node.removeChild(node); + } + } + insertLineWidgets(cm, lineView, dims); + } + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { + lineView.bgClass = built.bgClass; + } + if (built.textClass) { + lineView.textClass = built.textClass; + } + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node; + } + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { + for (var i2 = 0; i2 < lineView.rest.length; i2++) { + insertLineWidgetsFor(cm, lineView.rest[i2], lineView, dims, false); + } + } + } + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { + return; + } + var wrap = ensureLineWrapped(lineView); + for (var i2 = 0, ws = line.widgets; i2 < ws.length; ++i2) { + var widget = ws[i2], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { + node.setAttribute("cm-ignore-events", "true"); + } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) { + wrap.insertBefore(node, lineView.gutter || lineView.text); + } else { + wrap.appendChild(node); + } + signalLater(widget, "redraw"); + } + } + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { + node.style.marginLeft = -dims.gutterTotalWidth + "px"; + } + } + } + function widgetHeight(widget) { + if (widget.height != null) { + return widget.height; + } + var cm = widget.doc.cm; + if (!cm) { + return 0; + } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) { + parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; + } + if (widget.noHScroll) { + parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; + } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight; + } + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true" || n.parentNode == display.sizer && n != display.mover) { + return true; + } + } + } + function paddingTop(display) { + return display.lineSpace.offsetTop; + } + function paddingVert(display) { + return display.mover.offsetHeight - display.lineSpace.offsetHeight; + } + function paddingH(display) { + if (display.cachedPaddingH) { + return display.cachedPaddingH; + } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = { left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight) }; + if (!isNaN(data.left) && !isNaN(data.right)) { + display.cachedPaddingH = data; + } + return data; + } + function scrollGap(cm) { + return scrollerGap - cm.display.nativeBarWidth; + } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth; + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight; + } + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i2 = 0; i2 < rects.length - 1; i2++) { + var cur = rects[i2], next = rects[i2 + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) { + heights.push((cur.bottom + next.top) / 2 - rect.top); + } + } + } + heights.push(rect.bottom - rect.top); + } + } + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) { + return { map: lineView.measure.map, cache: lineView.measure.cache }; + } + if (lineView.rest) { + for (var i2 = 0; i2 < lineView.rest.length; i2++) { + if (lineView.rest[i2] == line) { + return { map: lineView.measure.maps[i2], cache: lineView.measure.caches[i2] }; + } + } + for (var i$12 = 0; i$12 < lineView.rest.length; i$12++) { + if (lineNo(lineView.rest[i$12]) > lineN) { + return { map: lineView.measure.maps[i$12], cache: lineView.measure.caches[i$12], before: true }; + } + } + } + } + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view; + } + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias); + } + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) { + return cm.display.view[findViewIndex(cm, lineN)]; + } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) { + return ext; + } + } + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) { + view = updateExternalMeasurement(cm, line); + } + var info = mapFromLineView(view, line, lineN); + return { + line, + view, + rect: null, + map: info.map, + cache: info.cache, + before: info.before, + hasHeights: false + }; + } + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { + ch = -1; + } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) { + prepared.rect = prepared.view.text.getBoundingClientRect(); + } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { + prepared.cache[key] = found; + } + } + return { + left: found.left, + right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom + }; + } + var nullRect = { left: 0, right: 0, top: 0, bottom: 0 }; + function nodeAndOffsetInLineMap(map2, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + for (var i2 = 0; i2 < map2.length; i2 += 3) { + mStart = map2[i2]; + mEnd = map2[i2 + 1]; + if (ch < mStart) { + start = 0; + end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i2 == map2.length - 3 || ch == mEnd && map2[i2 + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { + collapse = "right"; + } + } + if (start != null) { + node = map2[i2 + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) { + collapse = bias; + } + if (bias == "left" && start == 0) { + while (i2 && map2[i2 - 2] == map2[i2 - 3] && map2[i2 - 1].insertLeft) { + node = map2[(i2 -= 3) + 2]; + collapse = "left"; + } + } + if (bias == "right" && start == mEnd - mStart) { + while (i2 < map2.length - 3 && map2[i2 + 3] == map2[i2 + 4] && !map2[i2 + 5].insertLeft) { + node = map2[(i2 += 3) + 2]; + collapse = "right"; + } + } + break; + } + } + return { node, start, end, collapse, coverStart: mStart, coverEnd: mEnd }; + } + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { + for (var i2 = 0; i2 < rects.length; i2++) { + if ((rect = rects[i2]).left != rect.right) { + break; + } + } + } else { + for (var i$12 = rects.length - 1; i$12 >= 0; i$12--) { + if ((rect = rects[i$12]).left != rect.right) { + break; + } + } + } + return rect; + } + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + var rect; + if (node.nodeType == 3) { + for (var i$12 = 0; i$12 < 4; i$12++) { + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { + --start; + } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { + ++end; + } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) { + rect = node.parentNode.getBoundingClientRect(); + } else { + rect = getUsefulRect(range(node, start, end).getClientRects(), bias); + } + if (rect.left || rect.right || start == 0) { + break; + } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { + rect = maybeUpdateRectForZooming(cm.display.measure, rect); + } + } else { + if (start > 0) { + collapse = bias = "right"; + } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) { + rect = rects[bias == "right" ? rects.length - 1 : 0]; + } else { + rect = node.getBoundingClientRect(); + } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) { + rect = { left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom }; + } else { + rect = nullRect; + } + } + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i2 = 0; + for (; i2 < heights.length - 1; i2++) { + if (mid < heights[i2]) { + break; + } + } + var top = i2 ? heights[i2 - 1] : 0, bot = heights[i2]; + var result = { + left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top, + bottom: bot + }; + if (!rect.left && !rect.right) { + result.bogus = true; + } + if (!cm.options.singleCursorHeightPerLine) { + result.rtop = rtop; + result.rbottom = rbot; + } + return result; + } + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) { + return rect; + } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return { + left: rect.left * scaleX, + right: rect.right * scaleX, + top: rect.top * scaleY, + bottom: rect.bottom * scaleY + }; + } + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { + for (var i2 = 0; i2 < lineView.rest.length; i2++) { + lineView.measure.caches[i2] = {}; + } + } + } + } + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i2 = 0; i2 < cm.display.view.length; i2++) { + clearLineMeasurementCacheFor(cm.display.view[i2]); + } + } + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { + cm.display.maxLineChanged = true; + } + cm.display.lineNumChars = null; + } + function pageScrollX(doc2) { + if (chrome && android) { + return -(doc2.body.getBoundingClientRect().left - parseInt(getComputedStyle(doc2.body).marginLeft)); + } + return doc2.defaultView.pageXOffset || (doc2.documentElement || doc2.body).scrollLeft; + } + function pageScrollY(doc2) { + if (chrome && android) { + return -(doc2.body.getBoundingClientRect().top - parseInt(getComputedStyle(doc2.body).marginTop)); + } + return doc2.defaultView.pageYOffset || (doc2.documentElement || doc2.body).scrollTop; + } + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { + for (var i2 = 0; i2 < widgets.length; ++i2) { + if (widgets[i2].above) { + height += widgetHeight(widgets[i2]); + } + } + } + return height; + } + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; + rect.bottom += height; + } + if (context == "line") { + return rect; + } + if (!context) { + context = "local"; + } + var yOff = heightAtLine(lineObj); + if (context == "local") { + yOff += paddingTop(cm.display); + } else { + yOff -= cm.display.viewOffset; + } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY(doc(cm))); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX(doc(cm))); + rect.left += xOff; + rect.right += xOff; + } + rect.top += yOff; + rect.bottom += yOff; + return rect; + } + function fromCoordSystem(cm, coords, context) { + if (context == "div") { + return coords; + } + var left = coords.left, top = coords.top; + if (context == "page") { + left -= pageScrollX(doc(cm)); + top -= pageScrollY(doc(cm)); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return { left: left - lineSpaceBox.left, top: top - lineSpaceBox.top }; + } + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { + lineObj = getLine(cm.doc, pos.line); + } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context); + } + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { + preparedMeasure = prepareMeasureForLine(cm, lineObj); + } + function get(ch2, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch2, right ? "right" : "left", varHeight); + if (right) { + m.left = m.right; + } else { + m.right = m.left; + } + return intoCoordSystem(cm, lineObj, m, context); + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { + return get(sticky == "before" ? ch - 1 : ch, sticky == "before"); + } + function getBidi(ch2, partPos2, invert) { + var part = order[partPos2], right = part.level == 1; + return get(invert ? ch2 - 1 : ch2, right != invert); + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { + val.other = getBidi(ch, other, sticky != "before"); + } + return val; + } + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { + left = charWidth(cm.display) * pos.ch; + } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return { left, right: left, top, bottom: top + lineObj.height }; + } + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { + pos.outside = outside; + } + return pos; + } + function coordsChar(cm, x, y) { + var doc2 = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { + return PosWithInfo(doc2.first, 0, null, -1, -1); + } + var lineN = lineAtHeight(doc2, y), last = doc2.first + doc2.size - 1; + if (lineN > last) { + return PosWithInfo(doc2.first + doc2.size - 1, getLine(doc2, last).text.length, null, 1, 1); + } + if (x < 0) { + x = 0; + } + var lineObj = getLine(doc2, lineN); + for (; ; ) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { + return found; + } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { + return rangeEnd; + } + lineObj = getLine(doc2, lineN = rangeEnd.line); + } + } + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function(ch) { + return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; + }, end, 0); + end = findFirst(function(ch) { + return measureCharPrepared(cm, preparedMeasure, ch).top > y; + }, begin, end); + return { begin, end }; + } + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { + preparedMeasure = prepareMeasureForLine(cm, lineObj); + } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop); + } + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x; + } + function coordsCharInner(cm, lineObj, lineNo2, x, y) { + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + var widgetHeight2 = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)(cm, lineObj, lineNo2, preparedMeasure, order, x, y); + ltr = part.level != 1; + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + var chAround = null, boxAround = null; + var ch = findFirst(function(ch2) { + var box = measureCharPrepared(cm, preparedMeasure, ch2); + box.top += widgetHeight2; + box.bottom += widgetHeight2; + if (!boxIsAfter(box, x, y, false)) { + return false; + } + if (box.top <= y && box.left <= x) { + chAround = ch2; + boxAround = box; + } + return true; + }, begin, end); + var baseX, sticky, outside = false; + if (boxAround) { + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + if (!ltr && (ch == end || ch == begin)) { + ch++; + } + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight2 <= y == ltr ? "after" : "before"; + var coords = cursorCoords(cm, Pos(lineNo2, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo2, ch, sticky, outside, x - baseX); + } + function coordsBidiPart(cm, lineObj, lineNo2, preparedMeasure, order, x, y) { + var index = findFirst(function(i2) { + var part2 = order[i2], ltr2 = part2.level != 1; + return boxIsAfter(cursorCoords( + cm, + Pos(lineNo2, ltr2 ? part2.to : part2.from, ltr2 ? "before" : "after"), + "line", + lineObj, + preparedMeasure + ), x, y, true); + }, 0, order.length - 1); + var part = order[index]; + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords( + cm, + Pos(lineNo2, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", + lineObj, + preparedMeasure + ); + if (boxIsAfter(start, x, y, true) && start.top > y) { + part = order[index - 1]; + } + } + return part; + } + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { + end--; + } + var part = null, closestDist = null; + for (var i2 = 0; i2 < order.length; i2++) { + var p = order[i2]; + if (p.from >= end || p.to <= begin) { + continue; + } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { + part = order[order.length - 1]; + } + if (part.from < begin) { + part = { from: begin, to: part.to, level: part.level }; + } + if (part.to > end) { + part = { from: part.from, to: end, level: part.level }; + } + return part; + } + var measureText; + function textHeight(display) { + if (display.cachedTextHeight != null) { + return display.cachedTextHeight; + } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + for (var i2 = 0; i2 < 49; ++i2) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { + display.cachedTextHeight = height; + } + removeChildren(display.measure); + return height || 1; + } + function charWidth(display) { + if (display.cachedCharWidth != null) { + return display.cachedCharWidth; + } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { + display.cachedCharWidth = width; + } + return width || 10; + } + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i2 = 0; n; n = n.nextSibling, ++i2) { + var id = cm.display.gutterSpecs[i2].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return { + fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth + }; + } + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; + } + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function(line) { + if (lineIsHidden(cm.doc, line)) { + return 0; + } + var widgetsHeight = 0; + if (line.widgets) { + for (var i2 = 0; i2 < line.widgets.length; i2++) { + if (line.widgets[i2].height) { + widgetsHeight += line.widgets[i2].height; + } + } + } + if (wrapping) { + return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th; + } else { + return widgetsHeight + th; + } + }; + } + function estimateLineHeights(cm) { + var doc2 = cm.doc, est = estimateHeight(cm); + doc2.iter(function(line) { + var estHeight = est(line); + if (estHeight != line.height) { + updateLineHeight(line, estHeight); + } + }); + } + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { + return null; + } + var x, y, space = display.lineSpace.getBoundingClientRect(); + try { + x = e.clientX - space.left; + y = e.clientY - space.top; + } catch (e$1) { + return null; + } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords; + } + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { + return null; + } + n -= cm.display.viewFrom; + if (n < 0) { + return null; + } + var view = cm.display.view; + for (var i2 = 0; i2 < view.length; i2++) { + n -= view[i2].size; + if (n < 0) { + return i2; + } + } + } + function regChange(cm, from, to, lendiff) { + if (from == null) { + from = cm.doc.first; + } + if (to == null) { + to = cm.doc.first + cm.doc.size; + } + if (!lendiff) { + lendiff = 0; + } + var display = cm.display; + if (lendiff && to < display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers > from)) { + display.updateLineNumbers = from; + } + cm.curOp.viewChanged = true; + if (from >= display.viewTo) { + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) { + resetView(cm); + } + } else if (to <= display.viewFrom) { + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { + resetView(cm); + } else if (from <= display.viewFrom) { + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index).concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)).concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) { + ext.lineN += lendiff; + } else if (from < ext.lineN + ext.size) { + display.externalMeasured = null; + } + } + } + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) { + display.externalMeasured = null; + } + if (line < display.viewFrom || line >= display.viewTo) { + return; + } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { + return; + } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { + arr.push(type); + } + } + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) { + return { index, lineN: newN }; + } + var n = cm.display.viewFrom; + for (var i2 = 0; i2 < index; i2++) { + n += view[i2].size; + } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { + return null; + } + diff = n + view[index].size - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; + newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { + return null; + } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return { index, lineN: newN }; + } + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) { + display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); + } else if (display.viewFrom < from) { + display.view = display.view.slice(findViewIndex(cm, from)); + } + display.viewFrom = from; + if (display.viewTo < to) { + display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); + } else if (display.viewTo > to) { + display.view = display.view.slice(0, findViewIndex(cm, to)); + } + } + display.viewTo = to; + } + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i2 = 0; i2 < view.length; i2++) { + var lineView = view[i2]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { + ++dirty; + } + } + return dirty; + } + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + function prepareSelection(cm, primary) { + if (primary === void 0) primary = true; + var doc2 = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + var customCursor = cm.options.$customCursor; + if (customCursor) { + primary = true; + } + for (var i2 = 0; i2 < doc2.sel.ranges.length; i2++) { + if (!primary && i2 == doc2.sel.primIndex) { + continue; + } + var range2 = doc2.sel.ranges[i2]; + if (range2.from().line >= cm.display.viewTo || range2.to().line < cm.display.viewFrom) { + continue; + } + var collapsed = range2.empty(); + if (customCursor) { + var head = customCursor(cm, range2); + if (head) { + drawSelectionCursor(cm, head, curFragment); + } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range2.head, curFragment); + } + if (!collapsed) { + drawSelectionRange(cm, range2, selFragment); + } + } + return result; + } + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + var cursor = output.appendChild(elt("div", " ", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + if (pos.other) { + var otherCursor = output.appendChild(elt("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * 0.85 + "px"; + } + } + function cmpCoords(a, b) { + return a.top - b.top || a.left - b.left; + } + function drawSelectionRange(cm, range2, output) { + var display = cm.display, doc2 = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc2.direction == "ltr"; + function add(left, top, width, bottom) { + if (top < 0) { + top = 0; + } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px")); + } + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc2, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias); + } + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop2 = dir == "ltr" == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop2)[prop2]; + } + var order = getOrder(lineObj, doc2.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir, i2) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i2 == 0, last = !order || i2 == order.length - 1; + if (toPos.top - fromPos.top <= 3) { + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { + add(leftSide, fromPos.bottom, null, toPos.top); + } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + if (!start || cmpCoords(fromPos, start) < 0) { + start = fromPos; + } + if (cmpCoords(toPos, start) < 0) { + start = toPos; + } + if (!end || cmpCoords(fromPos, end) < 0) { + end = fromPos; + } + if (cmpCoords(toPos, end) < 0) { + end = toPos; + } + }); + return { start, end }; + } + var sFrom = range2.from(), sTo = range2.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc2, sFrom.line), toLine = getLine(doc2, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) { + add(leftSide, leftEnd.bottom, null, rightStart.top); + } + } + output.appendChild(fragment); + } + function restartBlink(cm) { + if (!cm.state.focused) { + return; + } + var display = cm.display; + clearInterval(display.blinker); + var on2 = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) { + display.blinker = setInterval(function() { + if (!cm.hasFocus()) { + onBlur(cm); + } + display.cursorDiv.style.visibility = (on2 = !on2) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); + } else if (cm.options.cursorBlinkRate < 0) { + display.cursorDiv.style.visibility = "hidden"; + } + } + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { + onFocus(cm); + } + } + } + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function() { + if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { + onBlur(cm); + } + } + }, 100); + } + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { + cm.state.delayingBlurEvent = false; + } + if (cm.options.readOnly == "nocursor") { + return; + } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { + setTimeout(function() { + return cm.display.input.reset(true); + }, 20); + } + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { + return; + } + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function() { + if (!cm.state.focused) { + cm.display.shift = false; + } + }, 150); + } + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i2 = 0; i2 < display.view.length; i2++) { + var cur = display.view[i2], wrapping = cm.options.lineWrapping; + var height = void 0, width = 0; + if (cur.hidden) { + continue; + } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + if (!wrapping && cur.text.firstChild) { + width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; + } + } + var diff = cur.line.height - height; + if (diff > 5e-3 || diff < -5e-3) { + if (oldHeight < viewTop) { + mustScroll -= diff; + } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { + for (var j = 0; j < cur.rest.length; j++) { + updateWidgetHeight(cur.rest[j]); + } + } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { + display.scroller.scrollTop += mustScroll; + } + } + function updateWidgetHeight(line) { + if (line.widgets) { + for (var i2 = 0; i2 < line.widgets.length; ++i2) { + var w = line.widgets[i2], parent = w.node.parentNode; + if (parent) { + w.height = parent.offsetHeight; + } + } + } + } + function visibleLines(display, doc2, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + var from = lineAtHeight(doc2, top), to = lineAtHeight(doc2, bottom); + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc2, heightAtLine(getLine(doc2, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc2.lastLine()) >= to) { + from = lineAtHeight(doc2, heightAtLine(getLine(doc2, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return { from, to: Math.max(to, from + 1) }; + } + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { + return; + } + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + var doc2 = display.wrapper.ownerDocument; + if (rect.top + box.top < 0) { + doScroll = true; + } else if (rect.bottom + box.top > (doc2.defaultView.innerHeight || doc2.documentElement.clientHeight)) { + doScroll = false; + } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "​", null, "position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + rect.left + "px; width: " + Math.max(2, rect.right - rect.left) + "px;"); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { + margin = 0; + } + var rect; + if (!cm.options.lineWrapping && pos == end) { + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = { + left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin + }; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { + changed = true; + } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { + changed = true; + } + } + if (!changed) { + break; + } + } + return rect; + } + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + } + } + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { + rect.top = 0; + } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen2 = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen2) { + rect.bottom = rect.top + screen2; + } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen2) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen2); + if (newTop != screentop) { + result.scrollTop = newTop; + } + } + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { + rect.right = rect.left + screenw; + } + if (rect.left < 10) { + result.scrollLeft = 0; + } else if (rect.left < screenleft) { + result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); + } else if (rect.right > screenw + screenleft - 3) { + result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; + } + return result; + } + function addToScrollTop(cm, top) { + if (top == null) { + return; + } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = { from: cur, to: cur, margin: cm.options.cursorScrollMargin }; + } + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { + resolveScrollToPos(cm); + } + if (x != null) { + cm.curOp.scrollLeft = x; + } + if (y != null) { + cm.curOp.scrollTop = y; + } + } + function scrollToRange(cm, range2) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range2; + } + function resolveScrollToPos(cm) { + var range2 = cm.curOp.scrollToPos; + if (range2) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range2.from), to = estimateCoords(cm, range2.to); + scrollToCoordsRange(cm, from, to, range2.margin); + } + } + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { + return; + } + if (!gecko) { + updateDisplaySimple(cm, { top: val }); + } + setScrollTop(cm, val, true); + if (gecko) { + updateDisplaySimple(cm); + } + startWorker(cm, 100); + } + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { + return; + } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { + cm.display.scroller.scrollTop = val; + } + } + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { + return; + } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { + cm.display.scroller.scrollLeft = val; + } + cm.display.scrollbars.setScrollLeft(val); + } + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, + clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + }; + } + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); + place(horiz); + on(vert, "scroll", function() { + if (vert.clientHeight) { + scroll(vert.scrollTop, "vertical"); + } + }); + on(horiz, "scroll", function() { + if (horiz.clientWidth) { + scroll(horiz.scrollLeft, "horizontal"); + } + }); + this.checkedZeroWidth = false; + if (ie && ie_version < 8) { + this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; + } + }; + NativeScrollbars.prototype.update = function(measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + this.vert.firstChild.style.height = Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { + this.zeroWidthHack(); + } + this.checkedZeroWidth = true; + } + return { right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0 }; + }; + NativeScrollbars.prototype.setScrollLeft = function(pos) { + if (this.horiz.scrollLeft != pos) { + this.horiz.scrollLeft = pos; + } + if (this.disableHoriz) { + this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); + } + }; + NativeScrollbars.prototype.setScrollTop = function(pos) { + if (this.vert.scrollTop != pos) { + this.vert.scrollTop = pos; + } + if (this.disableVert) { + this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); + } + }; + NativeScrollbars.prototype.zeroWidthHack = function() { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.visibility = this.vert.style.visibility = "hidden"; + this.disableHoriz = new Delayed(); + this.disableVert = new Delayed(); + }; + NativeScrollbars.prototype.enableZeroWidthBar = function(bar, delay, type) { + bar.style.visibility = ""; + function maybeDisable() { + var box = bar.getBoundingClientRect(); + var elt2 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt2 != bar) { + bar.style.visibility = "hidden"; + } else { + delay.set(1e3, maybeDisable); + } + } + delay.set(1e3, maybeDisable); + }; + NativeScrollbars.prototype.clear = function() { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + var NullScrollbars = function() { + }; + NullScrollbars.prototype.update = function() { + return { bottom: 0, right: 0 }; + }; + NullScrollbars.prototype.setScrollLeft = function() { + }; + NullScrollbars.prototype.setScrollTop = function() { + }; + NullScrollbars.prototype.clear = function() { + }; + function updateScrollbars(cm, measure) { + if (!measure) { + measure = measureForScrollbars(cm); + } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i2 = 0; i2 < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i2++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) { + updateHeightsInViewport(cm); + } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; + startHeight = cm.display.barHeight; + } + } + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { + d.scrollbarFiller.style.display = ""; + } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { + d.gutterFiller.style.display = ""; + } + } + var scrollbarModel = { "native": NativeScrollbars, "null": NullScrollbars }; + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) { + rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); + } + } + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function(node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + on(node, "mousedown", function() { + if (cm.state.focused) { + setTimeout(function() { + return cm.display.input.focus(); + }, 0); + } + }); + node.setAttribute("cm-not-content", "true"); + }, function(pos, axis) { + if (axis == "horizontal") { + setScrollLeft(cm, pos); + } else { + updateScrollTop(cm, pos); + } + }, cm); + if (cm.display.scrollbars.addClass) { + addClass(cm.display.wrapper, cm.display.scrollbars.addClass); + } + } + var nextOpId = 0; + function startOperation(cm) { + cm.curOp = { + cm, + viewChanged: false, + // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, + // Used to detect need to update scrollbar + forceUpdate: false, + // Used to force a redraw + updateInput: 0, + // Whether to reset the input textarea + typing: false, + // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, + // Accumulated changes, for firing change events + cursorActivityHandlers: null, + // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, + // Tracks which cursorActivity handlers have been called already + selectionChanged: false, + // Whether the selection needs to be redrawn + updateMaxLine: false, + // Set when the widest line needs to be determined anew + scrollLeft: null, + scrollTop: null, + // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, + // Used to scroll to a specific position + focus: false, + id: ++nextOpId, + // Unique ID + markArrays: null + // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + function endOperation(cm) { + var op = cm.curOp; + if (op) { + finishOperation(op, function(group) { + for (var i2 = 0; i2 < group.ops.length; i2++) { + group.ops[i2].cm.curOp = null; + } + endOperations(group); + }); + } + } + function endOperations(group) { + var ops = group.ops; + for (var i2 = 0; i2 < ops.length; i2++) { + endOperation_R1(ops[i2]); + } + for (var i$12 = 0; i$12 < ops.length; i$12++) { + endOperation_W1(ops[i$12]); + } + for (var i$22 = 0; i$22 < ops.length; i$22++) { + endOperation_R2(ops[i$22]); + } + for (var i$3 = 0; i$3 < ops.length; i$3++) { + endOperation_W2(ops[i$3]); + } + for (var i$4 = 0; i$4 < ops.length; i$4++) { + endOperation_finish(ops[i$4]); + } + } + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { + findMaxLine(cm); + } + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || op.scrollToPos.to.line >= display.viewTo) || display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && new DisplayUpdate(cm, op.mustUpdate && { top: op.scrollTop, ensure: op.scrollToPos }, op.forceUpdate); + } + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { + updateHeightsInViewport(cm); + } + op.barMeasure = measureForScrollbars(cm); + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + if (op.updatedDisplay || op.selectionChanged) { + op.preparedSelection = display.input.prepareSelection(); + } + } + function endOperation_W2(op) { + var cm = op.cm; + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) { + setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); + } + cm.display.maxLineChanged = false; + } + var takeFocus = op.focus && op.focus == activeElt(root(cm)); + if (op.preparedSelection) { + cm.display.input.showSelection(op.preparedSelection, takeFocus); + } + if (op.updatedDisplay || op.startHeight != cm.doc.height) { + updateScrollbars(cm, op.barMeasure); + } + if (op.updatedDisplay) { + setDocumentHeight(cm, op.barMeasure); + } + if (op.selectionChanged) { + restartBlink(cm); + } + if (cm.state.focused && op.updateInput) { + cm.display.input.reset(op.typing); + } + if (takeFocus) { + ensureFocus(op.cm); + } + } + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc2 = cm.doc; + if (op.updatedDisplay) { + postUpdateDisplay(cm, op.update); + } + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) { + display.wheelStartX = display.wheelStartY = null; + } + if (op.scrollTop != null) { + setScrollTop(cm, op.scrollTop, op.forceScroll); + } + if (op.scrollLeft != null) { + setScrollLeft(cm, op.scrollLeft, true, true); + } + if (op.scrollToPos) { + var rect = scrollPosIntoView( + cm, + clipPos(doc2, op.scrollToPos.from), + clipPos(doc2, op.scrollToPos.to), + op.scrollToPos.margin + ); + maybeScrollWindow(cm, rect); + } + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { + for (var i2 = 0; i2 < hidden.length; ++i2) { + if (!hidden[i2].lines.length) { + signal(hidden[i2], "hide"); + } + } + } + if (unhidden) { + for (var i$12 = 0; i$12 < unhidden.length; ++i$12) { + if (unhidden[i$12].lines.length) { + signal(unhidden[i$12], "unhide"); + } + } + } + if (display.wrapper.offsetHeight) { + doc2.scrollTop = cm.display.scroller.scrollTop; + } + if (op.changeObjs) { + signal(cm, "changes", cm, op.changeObjs); + } + if (op.update) { + op.update.finish(); + } + } + function runInOp(cm, f) { + if (cm.curOp) { + return f(); + } + startOperation(cm); + try { + return f(); + } finally { + endOperation(cm); + } + } + function operation(cm, f) { + return function() { + if (cm.curOp) { + return f.apply(cm, arguments); + } + startOperation(cm); + try { + return f.apply(cm, arguments); + } finally { + endOperation(cm); + } + }; + } + function methodOp(f) { + return function() { + if (this.curOp) { + return f.apply(this, arguments); + } + startOperation(this); + try { + return f.apply(this, arguments); + } finally { + endOperation(this); + } + }; + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { + return f.apply(this, arguments); + } + startOperation(cm); + try { + return f.apply(this, arguments); + } finally { + endOperation(cm); + } + }; + } + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) { + cm.state.highlight.set(time, bind(highlightWorker, cm)); + } + } + function highlightWorker(cm) { + var doc2 = cm.doc; + if (doc2.highlightFrontier >= cm.display.viewTo) { + return; + } + var end = +/* @__PURE__ */ new Date() + cm.options.workTime; + var context = getContextBefore(cm, doc2.highlightFrontier); + var changedLines = []; + doc2.iter(context.line, Math.min(doc2.first + doc2.size, cm.display.viewTo + 500), function(line) { + if (context.line >= cm.display.viewFrom) { + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc2.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { + context.state = resetState; + } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { + line.styleClasses = newCls; + } else if (oldCls) { + line.styleClasses = null; + } + var ischange = !oldStyles || oldStyles.length != line.styles.length || oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i2 = 0; !ischange && i2 < oldStyles.length; ++i2) { + ischange = oldStyles[i2] != line.styles[i2]; + } + if (ischange) { + changedLines.push(context.line); + } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) { + processLine(cm, line.text, context); + } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+/* @__PURE__ */ new Date() > end) { + startWorker(cm, cm.options.workDelay); + return true; + } + }); + doc2.highlightFrontier = context.line; + doc2.modeFrontier = Math.max(doc2.modeFrontier, context.line); + if (changedLines.length) { + runInOp(cm, function() { + for (var i2 = 0; i2 < changedLines.length; i2++) { + regLineChange(cm, changedLines[i2], "text"); + } + }); + } + } + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + this.viewport = viewport; + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + DisplayUpdate.prototype.signal = function(emitter, type) { + if (hasHandler(emitter, type)) { + this.events.push(arguments); + } + }; + DisplayUpdate.prototype.finish = function() { + for (var i2 = 0; i2 < this.events.length; i2++) { + signal.apply(null, this.events[i2]); + } + }; + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + function selectionSnapshot(cm) { + if (cm.hasFocus()) { + return null; + } + var active = activeElt(root(cm)); + if (!active || !contains(cm.display.lineDiv, active)) { + return null; + } + var result = { activeElt: active }; + if (window.getSelection) { + var sel = win(cm).getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result; + } + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt(rootNode(snapshot.activeElt))) { + return; + } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var doc2 = snapshot.activeElt.ownerDocument; + var sel = doc2.defaultView.getSelection(), range2 = doc2.createRange(); + range2.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range2.collapse(false); + sel.removeAllRanges(); + sel.addRange(range2); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc2 = cm.doc; + if (update.editorIsHidden) { + resetView(cm); + return false; + } + if (!update.force && update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && display.renderedView == display.view && countDirtyView(cm) == 0) { + return false; + } + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + var end = doc2.first + doc2.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc2.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { + from = Math.max(doc2.first, display.viewFrom); + } + if (display.viewTo > to && display.viewTo - to < 20) { + to = Math.min(end, display.viewTo); + } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + var different = from != display.viewFrom || to != display.viewTo || display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + cm.display.mover.style.top = display.viewOffset + "px"; + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) { + return false; + } + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { + display.lineDiv.style.display = "none"; + } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { + display.lineDiv.style.display = ""; + } + display.renderedView = display.view; + restoreSelection(selSnapshot); + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + display.updateLineNumbers = null; + return true; + } + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + for (var first = true; ; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + if (viewport && viewport.top != null) { + viewport = { top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top) }; + } + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) { + break; + } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { + break; + } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; + cm.display.reportedViewTo = cm.display.viewTo; + } + } + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + function rm(node2) { + var next = node2.nextSibling; + if (webkit && mac && cm.display.currentWheelTarget == node2) { + node2.style.display = "none"; + } else { + node2.parentNode.removeChild(node2); + } + return next; + } + var view = display.view, lineN = display.viewFrom; + for (var i2 = 0; i2 < view.length; i2++) { + var lineView = view[i2]; + if (lineView.hidden) ; + else if (!lineView.node || lineView.node.parentNode != container) { + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { + while (cur != lineView.node) { + cur = rm(cur); + } + var updateNumber = lineNumbers && updateNumbersFrom != null && updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { + updateNumber = false; + } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { + cur = rm(cur); + } + } + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + signalLater(display, "gutterChanged", display); + } + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = measure.docHeight + cm.display.barHeight + scrollGap(cm) + "px"; + } + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { + return; + } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i2 = 0; i2 < view.length; i2++) { + if (!view[i2].hidden) { + if (cm.options.fixedGutter) { + if (view[i2].gutter) { + view[i2].gutter.style.left = left; + } + if (view[i2].gutterBackground) { + view[i2].gutterBackground.style.left = left; + } + } + var align = view[i2].alignable; + if (align) { + for (var j = 0; j < align.length; j++) { + align[j].style.left = left; + } + } + } + } + if (cm.options.fixedGutter) { + display.gutters.style.left = comp + gutterW + "px"; + } + } + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { + return false; + } + var doc2 = cm.doc, last = lineNumberFor(cm.options, doc2.first + doc2.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt( + "div", + [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt" + )); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true; + } + return false; + } + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i2 = 0; i2 < gutters.length; i2++) { + var name = gutters[i2], style = null; + if (typeof name != "string") { + style = name.style; + name = name.className; + } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { + continue; + } else { + sawLineNumbers = true; + } + } + result.push({ className: name, style }); + } + if (lineNumbers && !sawLineNumbers) { + result.push({ className: "CodeMirror-linenumbers", style: null }); + } + return result; + } + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i2 = 0; i2 < specs.length; ++i2) { + var ref = specs[i2]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { + gElt.style.cssText = style; + } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + function Display(place, doc2, input, options) { + var d = this; + this.input = input; + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + d.lineDiv = eltP("div", null, "CodeMirror-code"); + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + d.measure = elt("div", null, "CodeMirror-measure"); + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + d.lineSpace = eltP( + "div", + [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, + "position: relative; outline: none" + ); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + d.mover = elt("div", [lines], null, "position: relative"); + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + if (chrome && chrome_version >= 105) { + d.wrapper.style.clipPath = "inset(0px)"; + } + d.wrapper.setAttribute("translate", "no"); + if (ie && ie_version < 8) { + d.gutters.style.zIndex = -1; + d.scroller.style.paddingRight = 0; + } + if (!webkit && !(gecko && mobile)) { + d.scroller.draggable = true; + } + if (place) { + if (place.appendChild) { + place.appendChild(d.wrapper); + } else { + place(d.wrapper); + } + } + d.viewFrom = d.viewTo = doc2.first; + d.reportedViewFrom = d.reportedViewTo = doc2.first; + d.view = []; + d.renderedView = null; + d.externalMeasured = null; + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + d.alignWidgets = false; + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + d.shift = false; + d.selForContextMenu = null; + d.activeTouch = null; + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + input.init(d); + } + var wheelSamples = 0, wheelPixelsPerUnit = null; + if (ie) { + wheelPixelsPerUnit = -0.53; + } else if (gecko) { + wheelPixelsPerUnit = 15; + } else if (chrome) { + wheelPixelsPerUnit = -0.7; + } else if (safari) { + wheelPixelsPerUnit = -1 / 3; + } + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { + dx = e.detail; + } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { + dy = e.detail; + } else if (dy == null) { + dy = e.wheelDelta; + } + return { x: dx, y: dy }; + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta; + } + function onScrollWheel(cm, e) { + if (chrome && chrome_version == 102) { + if (cm.display.chromeScrollHack == null) { + cm.display.sizer.style.pointerEvents = "none"; + } else { + clearTimeout(cm.display.chromeScrollHack); + } + cm.display.chromeScrollHack = setTimeout(function() { + cm.display.chromeScrollHack = null; + cm.display.sizer.style.pointerEvents = ""; + }, 100); + } + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + var display = cm.display, scroll = display.scroller; + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { + return; + } + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i2 = 0; i2 < view.length; i2++) { + if (view[i2].node == cur) { + cm.display.currentWheelTarget = cur; + break outer; + } + } + } + } + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) { + updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); + } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + if (!dy || dy && canScrollY) { + e_preventDefault(e); + } + display.wheelStartX = null; + return; + } + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { + top = Math.max(0, top + pixels - 50); + } else { + bot = Math.min(cm.doc.height, bot + pixels + 50); + } + updateDisplaySimple(cm, { top, bottom: bot }); + } + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; + display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; + display.wheelDY = dy; + setTimeout(function() { + if (display.wheelStartX == null) { + return; + } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = movedY && display.wheelDY && movedY / display.wheelDY || movedX && display.wheelDX && movedX / display.wheelDX; + display.wheelStartX = display.wheelStartY = null; + if (!sample) { + return; + } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; + display.wheelDY += dy; + } + } + } + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + Selection.prototype.primary = function() { + return this.ranges[this.primIndex]; + }; + Selection.prototype.equals = function(other) { + if (other == this) { + return true; + } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { + return false; + } + for (var i2 = 0; i2 < this.ranges.length; i2++) { + var here = this.ranges[i2], there = other.ranges[i2]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { + return false; + } + } + return true; + }; + Selection.prototype.deepCopy = function() { + var out = []; + for (var i2 = 0; i2 < this.ranges.length; i2++) { + out[i2] = new Range(copyPos(this.ranges[i2].anchor), copyPos(this.ranges[i2].head)); + } + return new Selection(out, this.primIndex); + }; + Selection.prototype.somethingSelected = function() { + for (var i2 = 0; i2 < this.ranges.length; i2++) { + if (!this.ranges[i2].empty()) { + return true; + } + } + return false; + }; + Selection.prototype.contains = function(pos, end) { + if (!end) { + end = pos; + } + for (var i2 = 0; i2 < this.ranges.length; i2++) { + var range2 = this.ranges[i2]; + if (cmp(end, range2.from()) >= 0 && cmp(pos, range2.to()) <= 0) { + return i2; + } + } + return -1; + }; + var Range = function(anchor, head) { + this.anchor = anchor; + this.head = head; + }; + Range.prototype.from = function() { + return minPos(this.anchor, this.head); + }; + Range.prototype.to = function() { + return maxPos(this.anchor, this.head); + }; + Range.prototype.empty = function() { + return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; + }; + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function(a, b) { + return cmp(a.from(), b.from()); + }); + primIndex = indexOf(ranges, prim); + for (var i2 = 1; i2 < ranges.length; i2++) { + var cur = ranges[i2], prev = ranges[i2 - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i2 <= primIndex) { + --primIndex; + } + ranges.splice(--i2, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex); + } + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0); + } + function changeEnd(change) { + if (!change.text) { + return change.to; + } + return Pos( + change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) + ); + } + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { + return pos; + } + if (cmp(pos, change.to) <= 0) { + return changeEnd(change); + } + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { + ch += changeEnd(change).ch - change.to.ch; + } + return Pos(line, ch); + } + function computeSelAfterChange(doc2, change) { + var out = []; + for (var i2 = 0; i2 < doc2.sel.ranges.length; i2++) { + var range2 = doc2.sel.ranges[i2]; + out.push(new Range( + adjustForChange(range2.anchor, change), + adjustForChange(range2.head, change) + )); + } + return normalizeSelection(doc2.cm, out, doc2.sel.primIndex); + } + function offsetPos(pos, old, nw) { + if (pos.line == old.line) { + return Pos(nw.line, pos.ch - old.ch + nw.ch); + } else { + return Pos(nw.line + (pos.line - old.line), pos.ch); + } + } + function computeReplacedSel(doc2, changes, hint) { + var out = []; + var oldPrev = Pos(doc2.first, 0), newPrev = oldPrev; + for (var i2 = 0; i2 < changes.length; i2++) { + var change = changes[i2]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range2 = doc2.sel.ranges[i2], inv = cmp(range2.head, range2.anchor) < 0; + out[i2] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i2] = new Range(from, from); + } + } + return new Selection(out, doc2.sel.primIndex); + } + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + function resetModeState(cm) { + cm.doc.iter(function(line) { + if (line.stateAfter) { + line.stateAfter = null; + } + if (line.styles) { + line.styles = null; + } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { + regChange(cm); + } + } + function isWholeLineUpdate(doc2, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && (!doc2.cm || doc2.cm.options.wholeLineUpdateBefore); + } + function updateDoc(doc2, change, markedSpans, estimateHeight2) { + function spansFor(n) { + return markedSpans ? markedSpans[n] : null; + } + function update(line, text2, spans) { + updateLine(line, text2, spans, estimateHeight2); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i2 = start; i2 < end; ++i2) { + result.push(new Line(text[i2], spansFor(i2), estimateHeight2)); + } + return result; + } + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc2, from.line), lastLine = getLine(doc2, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + if (change.full) { + doc2.insert(0, linesFor(0, text.length)); + doc2.remove(text.length, doc2.size - text.length); + } else if (isWholeLineUpdate(doc2, change)) { + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { + doc2.remove(from.line, nlines); + } + if (added.length) { + doc2.insert(from.line, added); + } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight2)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc2.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc2.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { + doc2.remove(from.line + 1, nlines - 1); + } + doc2.insert(from.line + 1, added$2); + } + signalLater(doc2, "change", doc2, change); + } + function linkedDocs(doc2, f, sharedHistOnly) { + function propagate(doc3, skip, sharedHist) { + if (doc3.linked) { + for (var i2 = 0; i2 < doc3.linked.length; ++i2) { + var rel = doc3.linked[i2]; + if (rel.doc == skip) { + continue; + } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { + continue; + } + f(rel.doc, shared); + propagate(rel.doc, doc3, shared); + } + } + } + propagate(doc2, null, true); + } + function attachDoc(cm, doc2) { + if (doc2.cm) { + throw new Error("This document is already in use."); + } + cm.doc = doc2; + doc2.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc2.direction; + if (!cm.options.lineWrapping) { + findMaxLine(cm); + } + cm.options.mode = doc2.modeOption; + regChange(cm); + } + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + function directionChanged(cm) { + runInOp(cm, function() { + setDirectionClass(cm); + regChange(cm); + }); + } + function History(prev) { + this.done = []; + this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + function historyChangeFromChange(doc2, change) { + var histChange = { from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc2, change.from, change.to) }; + attachLocalSpans(doc2, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc2, function(doc3) { + return attachLocalSpans(doc3, histChange, change.from.line, change.to.line + 1); + }, true); + return histChange; + } + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { + array.pop(); + } else { + break; + } + } + } + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done); + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done); + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done); + } + } + function addChangeToHistory(doc2, change, selAfter, opId) { + var hist = doc2.history; + hist.undone.length = 0; + var time = +/* @__PURE__ */ new Date(), cur; + var last; + if ((hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && (change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc2.cm ? doc2.cm.options.historyEventDelay : 500) || change.origin.charAt(0) == "*")) && (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + last.to = changeEnd(change); + } else { + cur.changes.push(historyChangeFromChange(doc2, change)); + } + } else { + var before = lst(hist.done); + if (!before || !before.ranges) { + pushSelectionToHistory(doc2.sel, hist.done); + } + cur = { + changes: [historyChangeFromChange(doc2, change)], + generation: hist.generation + }; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { + hist.done.shift(); + } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + if (!last) { + signal(doc2, "historyAdded"); + } + } + function selectionEventCanBeMerged(doc2, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || ch == "+" && prev.ranges.length == sel.ranges.length && prev.somethingSelected() == sel.somethingSelected() && /* @__PURE__ */ new Date() - doc2.history.lastSelTime <= (doc2.cm ? doc2.cm.options.historyEventDelay : 500); + } + function addSelectionToHistory(doc2, sel, opId, options) { + var hist = doc2.history, origin = options && options.origin; + if (opId == hist.lastSelOp || origin && hist.lastSelOrigin == origin && (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || selectionEventCanBeMerged(doc2, origin, lst(hist.done), sel))) { + hist.done[hist.done.length - 1] = sel; + } else { + pushSelectionToHistory(sel, hist.done); + } + hist.lastSelTime = +/* @__PURE__ */ new Date(); + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) { + clearSelectionEvents(hist.undone); + } + } + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) { + dest.push(sel); + } + } + function attachLocalSpans(doc2, change, from, to) { + var existing = change["spans_" + doc2.id], n = 0; + doc2.iter(Math.max(doc2.first, from), Math.min(doc2.first + doc2.size, to), function(line) { + if (line.markedSpans) { + (existing || (existing = change["spans_" + doc2.id] = {}))[n] = line.markedSpans; + } + ++n; + }); + } + function removeClearedSpans(spans) { + if (!spans) { + return null; + } + var out; + for (var i2 = 0; i2 < spans.length; ++i2) { + if (spans[i2].marker.explicitlyCleared) { + if (!out) { + out = spans.slice(0, i2); + } + } else if (out) { + out.push(spans[i2]); + } + } + return !out ? spans : out.length ? out : null; + } + function getOldSpans(doc2, change) { + var found = change["spans_" + doc2.id]; + if (!found) { + return null; + } + var nw = []; + for (var i2 = 0; i2 < change.text.length; ++i2) { + nw.push(removeClearedSpans(found[i2])); + } + return nw; + } + function mergeOldSpans(doc2, change) { + var old = getOldSpans(doc2, change); + var stretched = stretchSpansOverChange(doc2, change); + if (!old) { + return stretched; + } + if (!stretched) { + return old; + } + for (var i2 = 0; i2 < old.length; ++i2) { + var oldCur = old[i2], stretchCur = stretched[i2]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) { + if (oldCur[k].marker == span.marker) { + continue spans; + } + } + oldCur.push(span); + } + } else if (stretchCur) { + old[i2] = stretchCur; + } + } + return old; + } + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i2 = 0; i2 < events.length; ++i2) { + var event = events[i2]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue; + } + var changes = event.changes, newChanges = []; + copy.push({ changes: newChanges }); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = void 0; + newChanges.push({ from: change.from, to: change.to, text: change.text }); + if (newGroup) { + for (var prop2 in change) { + if (m = prop2.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop2] = change[prop2]; + delete change[prop2]; + } + } + } + } + } + } + return copy; + } + function extendRange(range2, head, other, extend) { + if (extend) { + var anchor = range2.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != cmp(other, anchor) < 0) { + anchor = head; + head = other; + } else if (posBefore != cmp(head, other) < 0) { + head = other; + } + } + return new Range(anchor, head); + } else { + return new Range(other || head, head); + } + } + function extendSelection(doc2, head, other, options, extend) { + if (extend == null) { + extend = doc2.cm && (doc2.cm.display.shift || doc2.extend); + } + setSelection(doc2, new Selection([extendRange(doc2.sel.primary(), head, other, extend)], 0), options); + } + function extendSelections(doc2, heads, options) { + var out = []; + var extend = doc2.cm && (doc2.cm.display.shift || doc2.extend); + for (var i2 = 0; i2 < doc2.sel.ranges.length; i2++) { + out[i2] = extendRange(doc2.sel.ranges[i2], heads[i2], null, extend); + } + var newSel = normalizeSelection(doc2.cm, out, doc2.sel.primIndex); + setSelection(doc2, newSel, options); + } + function replaceOneSelection(doc2, i2, range2, options) { + var ranges = doc2.sel.ranges.slice(0); + ranges[i2] = range2; + setSelection(doc2, normalizeSelection(doc2.cm, ranges, doc2.sel.primIndex), options); + } + function setSimpleSelection(doc2, anchor, head, options) { + setSelection(doc2, simpleSelection(anchor, head), options); + } + function filterSelectionChange(doc2, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + this.ranges = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + this.ranges[i2] = new Range( + clipPos(doc2, ranges[i2].anchor), + clipPos(doc2, ranges[i2].head) + ); + } + }, + origin: options && options.origin + }; + signal(doc2, "beforeSelectionChange", doc2, obj); + if (doc2.cm) { + signal(doc2.cm, "beforeSelectionChange", doc2.cm, obj); + } + if (obj.ranges != sel.ranges) { + return normalizeSelection(doc2.cm, obj.ranges, obj.ranges.length - 1); + } else { + return sel; + } + } + function setSelectionReplaceHistory(doc2, sel, options) { + var done = doc2.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc2, sel, options); + } else { + setSelection(doc2, sel, options); + } + } + function setSelection(doc2, sel, options) { + setSelectionNoUndo(doc2, sel, options); + addSelectionToHistory(doc2, doc2.sel, doc2.cm ? doc2.cm.curOp.id : NaN, options); + } + function setSelectionNoUndo(doc2, sel, options) { + if (hasHandler(doc2, "beforeSelectionChange") || doc2.cm && hasHandler(doc2.cm, "beforeSelectionChange")) { + sel = filterSelectionChange(doc2, sel, options); + } + var bias = options && options.bias || (cmp(sel.primary().head, doc2.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc2, skipAtomicInSelection(doc2, sel, bias, true)); + if (!(options && options.scroll === false) && doc2.cm && doc2.cm.getOption("readOnly") != "nocursor") { + ensureCursorVisible(doc2.cm); + } + } + function setSelectionInner(doc2, sel) { + if (sel.equals(doc2.sel)) { + return; + } + doc2.sel = sel; + if (doc2.cm) { + doc2.cm.curOp.updateInput = 1; + doc2.cm.curOp.selectionChanged = true; + signalCursorActivity(doc2.cm); + } + signalLater(doc2, "cursorActivity", doc2); + } + function reCheckSelection(doc2) { + setSelectionInner(doc2, skipAtomicInSelection(doc2, doc2.sel, null, false)); + } + function skipAtomicInSelection(doc2, sel, bias, mayClear) { + var out; + for (var i2 = 0; i2 < sel.ranges.length; i2++) { + var range2 = sel.ranges[i2]; + var old = sel.ranges.length == doc2.sel.ranges.length && doc2.sel.ranges[i2]; + var newAnchor = skipAtomic(doc2, range2.anchor, old && old.anchor, bias, mayClear); + var newHead = range2.head == range2.anchor ? newAnchor : skipAtomic(doc2, range2.head, old && old.head, bias, mayClear); + if (out || newAnchor != range2.anchor || newHead != range2.head) { + if (!out) { + out = sel.ranges.slice(0, i2); + } + out[i2] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc2.cm, out, sel.primIndex) : sel; + } + function skipAtomicInner(doc2, pos, oldPos, dir, mayClear) { + var line = getLine(doc2, pos.line); + if (line.markedSpans) { + for (var i2 = 0; i2 < line.markedSpans.length; ++i2) { + var sp = line.markedSpans[i2], m = sp.marker; + var preventCursorLeft = "selectLeft" in m ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = "selectRight" in m ? !m.selectRight : m.inclusiveRight; + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { + break; + } else { + --i2; + continue; + } + } + } + if (!m.atomic) { + continue; + } + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = void 0; + if (dir < 0 ? preventCursorRight : preventCursorLeft) { + near = movePos(doc2, near, -dir, near && near.line == pos.line ? line : null); + } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) { + return skipAtomicInner(doc2, near, pos, dir, mayClear); + } + } + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) { + far = movePos(doc2, far, dir, far.line == pos.line ? line : null); + } + return far ? skipAtomicInner(doc2, far, pos, dir, mayClear) : null; + } + } + } + return pos; + } + function skipAtomic(doc2, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc2, pos, oldPos, dir, mayClear) || !mayClear && skipAtomicInner(doc2, pos, oldPos, dir, true) || skipAtomicInner(doc2, pos, oldPos, -dir, mayClear) || !mayClear && skipAtomicInner(doc2, pos, oldPos, -dir, true); + if (!found) { + doc2.cantEdit = true; + return Pos(doc2.first, 0); + } + return found; + } + function movePos(doc2, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc2.first) { + return clipPos(doc2, Pos(pos.line - 1)); + } else { + return null; + } + } else if (dir > 0 && pos.ch == (line || getLine(doc2, pos.line)).text.length) { + if (pos.line < doc2.first + doc2.size - 1) { + return Pos(pos.line + 1, 0); + } else { + return null; + } + } else { + return new Pos(pos.line, pos.ch + dir); + } + } + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + function filterChange(doc2, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function() { + return obj.canceled = true; + } + }; + if (update) { + obj.update = function(from, to, text, origin) { + if (from) { + obj.from = clipPos(doc2, from); + } + if (to) { + obj.to = clipPos(doc2, to); + } + if (text) { + obj.text = text; + } + if (origin !== void 0) { + obj.origin = origin; + } + }; + } + signal(doc2, "beforeChange", doc2, obj); + if (doc2.cm) { + signal(doc2.cm, "beforeChange", doc2.cm, obj); + } + if (obj.canceled) { + if (doc2.cm) { + doc2.cm.curOp.updateInput = 2; + } + return null; + } + return { from: obj.from, to: obj.to, text: obj.text, origin: obj.origin }; + } + function makeChange(doc2, change, ignoreReadOnly) { + if (doc2.cm) { + if (!doc2.cm.curOp) { + return operation(doc2.cm, makeChange)(doc2, change, ignoreReadOnly); + } + if (doc2.cm.state.suppressEdits) { + return; + } + } + if (hasHandler(doc2, "beforeChange") || doc2.cm && hasHandler(doc2.cm, "beforeChange")) { + change = filterChange(doc2, change, true); + if (!change) { + return; + } + } + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc2, change.from, change.to); + if (split) { + for (var i2 = split.length - 1; i2 >= 0; --i2) { + makeChangeInner(doc2, { from: split[i2].from, to: split[i2].to, text: i2 ? [""] : change.text, origin: change.origin }); + } + } else { + makeChangeInner(doc2, change); + } + } + function makeChangeInner(doc2, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { + return; + } + var selAfter = computeSelAfterChange(doc2, change); + addChangeToHistory(doc2, change, selAfter, doc2.cm ? doc2.cm.curOp.id : NaN); + makeChangeSingleDoc(doc2, change, selAfter, stretchSpansOverChange(doc2, change)); + var rebased = []; + linkedDocs(doc2, function(doc3, sharedHist) { + if (!sharedHist && indexOf(rebased, doc3.history) == -1) { + rebaseHist(doc3.history, change); + rebased.push(doc3.history); + } + makeChangeSingleDoc(doc3, change, null, stretchSpansOverChange(doc3, change)); + }); + } + function makeChangeFromHistory(doc2, type, allowSelectionOnly) { + var suppress = doc2.cm && doc2.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { + return; + } + var hist = doc2.history, event, selAfter = doc2.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + var i2 = 0; + for (; i2 < source.length; i2++) { + event = source[i2]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc2.sel) : !event.ranges) { + break; + } + } + if (i2 == source.length) { + return; + } + hist.lastOrigin = hist.lastSelOrigin = null; + for (; ; ) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc2.sel)) { + setSelection(doc2, event, { clearRedo: false }); + return; + } + selAfter = event; + } else if (suppress) { + source.push(event); + return; + } else { + break; + } + } + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({ changes: antiChanges, generation: hist.generation }); + hist.generation = event.generation || ++hist.maxGeneration; + var filter = hasHandler(doc2, "beforeChange") || doc2.cm && hasHandler(doc2.cm, "beforeChange"); + var loop = function(i3) { + var change = event.changes[i3]; + change.origin = type; + if (filter && !filterChange(doc2, change, false)) { + source.length = 0; + return {}; + } + antiChanges.push(historyChangeFromChange(doc2, change)); + var after = i3 ? computeSelAfterChange(doc2, change) : lst(source); + makeChangeSingleDoc(doc2, change, after, mergeOldSpans(doc2, change)); + if (!i3 && doc2.cm) { + doc2.cm.scrollIntoView({ from: change.from, to: changeEnd(change) }); + } + var rebased = []; + linkedDocs(doc2, function(doc3, sharedHist) { + if (!sharedHist && indexOf(rebased, doc3.history) == -1) { + rebaseHist(doc3.history, change); + rebased.push(doc3.history); + } + makeChangeSingleDoc(doc3, change, null, mergeOldSpans(doc3, change)); + }); + }; + for (var i$12 = event.changes.length - 1; i$12 >= 0; --i$12) { + var returned = loop(i$12); + if (returned) return returned.v; + } + } + function shiftDoc(doc2, distance) { + if (distance == 0) { + return; + } + doc2.first += distance; + doc2.sel = new Selection(map(doc2.sel.ranges, function(range2) { + return new Range( + Pos(range2.anchor.line + distance, range2.anchor.ch), + Pos(range2.head.line + distance, range2.head.ch) + ); + }), doc2.sel.primIndex); + if (doc2.cm) { + regChange(doc2.cm, doc2.first, doc2.first - distance, distance); + for (var d = doc2.cm.display, l = d.viewFrom; l < d.viewTo; l++) { + regLineChange(doc2.cm, l, "gutter"); + } + } + } + function makeChangeSingleDoc(doc2, change, selAfter, spans) { + if (doc2.cm && !doc2.cm.curOp) { + return operation(doc2.cm, makeChangeSingleDoc)(doc2, change, selAfter, spans); + } + if (change.to.line < doc2.first) { + shiftDoc(doc2, change.text.length - 1 - (change.to.line - change.from.line)); + return; + } + if (change.from.line > doc2.lastLine()) { + return; + } + if (change.from.line < doc2.first) { + var shift = change.text.length - 1 - (doc2.first - change.from.line); + shiftDoc(doc2, shift); + change = { + from: Pos(doc2.first, 0), + to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], + origin: change.origin + }; + } + var last = doc2.lastLine(); + if (change.to.line > last) { + change = { + from: change.from, + to: Pos(last, getLine(doc2, last).text.length), + text: [change.text[0]], + origin: change.origin + }; + } + change.removed = getBetween(doc2, change.from, change.to); + if (!selAfter) { + selAfter = computeSelAfterChange(doc2, change); + } + if (doc2.cm) { + makeChangeSingleDocInEditor(doc2.cm, change, spans); + } else { + updateDoc(doc2, change, spans); + } + setSelectionNoUndo(doc2, selAfter, sel_dontScroll); + if (doc2.cantEdit && skipAtomic(doc2, Pos(doc2.firstLine(), 0))) { + doc2.cantEdit = false; + } + } + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc2 = cm.doc, display = cm.display, from = change.from, to = change.to; + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc2, from.line))); + doc2.iter(checkWidthStart, to.line + 1, function(line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true; + } + }); + } + if (doc2.sel.contains(change.from, change.to) > -1) { + signalCursorActivity(cm); + } + updateDoc(doc2, change, spans, estimateHeight(cm)); + if (!cm.options.lineWrapping) { + doc2.iter(checkWidthStart, from.line + change.text.length, function(line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { + cm.curOp.updateMaxLine = true; + } + } + retreatFrontier(doc2, from.line); + startWorker(cm, 400); + var lendiff = change.text.length - (to.line - from.line) - 1; + if (change.full) { + regChange(cm); + } else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) { + regLineChange(cm, from.line, "text"); + } else { + regChange(cm, from.line, to.line + 1, lendiff); + } + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from, + to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { + signalLater(cm, "change", cm, obj); + } + if (changesHandler) { + (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); + } + } + cm.display.selForContextMenu = null; + } + function replaceRange(doc2, code, from, to, origin) { + var assign; + if (!to) { + to = from; + } + if (cmp(to, from) < 0) { + assign = [to, from], from = assign[0], to = assign[1]; + } + if (typeof code == "string") { + code = doc2.splitLines(code); + } + makeChange(doc2, { from, to, text: code, origin }); + } + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + function rebaseHistArray(array, from, to, diff) { + for (var i2 = 0; i2 < array.length; ++i2) { + var sub = array[i2], ok = true; + if (sub.ranges) { + if (!sub.copied) { + sub = array[i2] = sub.deepCopy(); + sub.copied = true; + } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue; + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break; + } + } + if (!ok) { + array.splice(0, i2 + 1); + i2 = 0; + } + } + } + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + function changeLine(doc2, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { + line = getLine(doc2, clipLine(doc2, handle)); + } else { + no = lineNo(handle); + } + if (no == null) { + return null; + } + if (op(line, no) && doc2.cm) { + regLineChange(doc2.cm, no, changeType); + } + return line; + } + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i2 = 0; i2 < lines.length; ++i2) { + lines[i2].parent = this; + height += lines[i2].height; + } + this.height = height; + } + LeafChunk.prototype = { + chunkSize: function() { + return this.lines.length; + }, + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + for (var i2 = at, e = at + n; i2 < e; ++i2) { + var line = this.lines[i2]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i2 = 0; i2 < lines.length; ++i2) { + lines[i2].parent = this; + } + }, + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) { + if (op(this.lines[at])) { + return true; + } + } + } + }; + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i2 = 0; i2 < children.length; ++i2) { + var ch = children[i2]; + size += ch.chunkSize(); + height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + BranchChunk.prototype = { + chunkSize: function() { + return this.size; + }, + removeInner: function(at, n) { + this.size -= n; + for (var i2 = 0; i2 < this.children.length; ++i2) { + var child = this.children[i2], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { + this.children.splice(i2--, 1); + child.parent = null; + } + if ((n -= rm) == 0) { + break; + } + at = 0; + } else { + at -= sz; + } + } + if (this.size - n < 25 && (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + collapse: function(lines) { + for (var i2 = 0; i2 < this.children.length; ++i2) { + this.children[i2].collapse(lines); + } + }, + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i2 = 0; i2 < this.children.length; ++i2) { + var child = this.children[i2], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length; ) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i2, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break; + } + at -= sz; + } + }, + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { + return; + } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10); + me.parent.maybeSpill(); + }, + iterN: function(at, n, op) { + for (var i2 = 0; i2 < this.children.length; ++i2) { + var child = this.children[i2], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { + return true; + } + if ((n -= used) == 0) { + break; + } + at = 0; + } else { + at -= sz; + } + } + } + }; + var LineWidget = function(doc2, node, options) { + if (options) { + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this[opt] = options[opt]; + } + } + } + this.doc = doc2; + this.node = node; + }; + LineWidget.prototype.clear = function() { + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { + return; + } + for (var i2 = 0; i2 < ws.length; ++i2) { + if (ws[i2] == this) { + ws.splice(i2--, 1); + } + } + if (!ws.length) { + line.widgets = null; + } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function() { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + LineWidget.prototype.changed = function() { + var this$1$1 = this; + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { + return; + } + if (!lineIsHidden(this.doc, line)) { + updateLineHeight(line, line.height + diff); + } + if (cm) { + runInOp(cm, function() { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < (cm.curOp && cm.curOp.scrollTop || cm.doc.scrollTop)) { + addToScrollTop(cm, diff); + } + } + function addLineWidget(doc2, handle, node, options) { + var widget = new LineWidget(doc2, node, options); + var cm = doc2.cm; + if (cm && widget.noHScroll) { + cm.display.alignWidgets = true; + } + changeLine(doc2, handle, "widget", function(line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { + widgets.push(widget); + } else { + widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); + } + widget.line = line; + if (cm && !lineIsHidden(doc2, line)) { + var aboveVisible = heightAtLine(line) < doc2.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { + addToScrollTop(cm, widget.height); + } + cm.curOp.forceUpdate = true; + } + return true; + }); + if (cm) { + signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); + } + return widget; + } + var nextMarkerId = 0; + var TextMarker = function(doc2, type) { + this.lines = []; + this.type = type; + this.doc = doc2; + this.id = ++nextMarkerId; + }; + TextMarker.prototype.clear = function() { + if (this.explicitlyCleared) { + return; + } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { + startOperation(cm); + } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { + signalLater(this, "clear", found.from, found.to); + } + } + var min = null, max = null; + for (var i2 = 0; i2 < this.lines.length; ++i2) { + var line = this.lines[i2]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { + regLineChange(cm, lineNo(line), "text"); + } else if (cm) { + if (span.to != null) { + max = lineNo(line); + } + if (span.from != null) { + min = lineNo(line); + } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) { + updateLineHeight(line, textHeight(cm.display)); + } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { + for (var i$12 = 0; i$12 < this.lines.length; ++i$12) { + var visual = visualLine(this.lines[i$12]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } + } + if (min != null && cm && this.collapsed) { + regChange(cm, min, max + 1); + } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { + reCheckSelection(cm.doc); + } + } + if (cm) { + signalLater(cm, "markerCleared", cm, this, min, max); + } + if (withOp) { + endOperation(cm); + } + if (this.parent) { + this.parent.clear(); + } + }; + TextMarker.prototype.find = function(side, lineObj) { + if (side == null && this.type == "bookmark") { + side = 1; + } + var from, to; + for (var i2 = 0; i2 < this.lines.length; ++i2) { + var line = this.lines[i2]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { + return from; + } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { + return to; + } + } + } + return from && { from, to }; + }; + TextMarker.prototype.changed = function() { + var this$1$1 = this; + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { + return; + } + runInOp(cm, function() { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) { + updateLineHeight(line, line.height + dHeight); + } + } + signalLater(cm, "markerChanged", cm, this$1$1); + }); + }; + TextMarker.prototype.attachLine = function(line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) { + (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); + } + } + this.lines.push(line); + }; + TextMarker.prototype.detachLine = function(line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + function markText(doc2, from, to, options, type) { + if (options && options.shared) { + return markTextShared(doc2, from, to, options, type); + } + if (doc2.cm && !doc2.cm.curOp) { + return operation(doc2.cm, markText)(doc2, from, to, options, type); + } + var marker = new TextMarker(doc2, type), diff = cmp(from, to); + if (options) { + copyObj(options, marker, false); + } + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) { + return marker; + } + if (marker.replacedWith) { + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { + marker.widgetNode.setAttribute("cm-ignore-events", "true"); + } + if (options.insertLeft) { + marker.widgetNode.insertLeft = true; + } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc2, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc2, to.line, from, to, marker)) { + throw new Error("Inserting collapsed marker partially overlapping an existing one"); + } + seeCollapsedSpans(); + } + if (marker.addToHistory) { + addChangeToHistory(doc2, { from, to, origin: "markText" }, doc2.sel, NaN); + } + var curLine = from.line, cm = doc2.cm, updateMaxLine; + doc2.iter(curLine, to.line + 1, function(line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) { + updateMaxLine = true; + } + if (marker.collapsed && curLine != from.line) { + updateLineHeight(line, 0); + } + addMarkedSpan(line, new MarkedSpan( + marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null + ), doc2.cm && doc2.cm.curOp); + ++curLine; + }); + if (marker.collapsed) { + doc2.iter(from.line, to.line + 1, function(line) { + if (lineIsHidden(doc2, line)) { + updateLineHeight(line, 0); + } + }); + } + if (marker.clearOnEnter) { + on(marker, "beforeCursorEnter", function() { + return marker.clear(); + }); + } + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc2.history.done.length || doc2.history.undone.length) { + doc2.clearHistory(); + } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + if (updateMaxLine) { + cm.curOp.updateMaxLine = true; + } + if (marker.collapsed) { + regChange(cm, from.line, to.line + 1); + } else if (marker.className || marker.startStyle || marker.endStyle || marker.css || marker.attributes || marker.title) { + for (var i2 = from.line; i2 <= to.line; i2++) { + regLineChange(cm, i2, "text"); + } + } + if (marker.atomic) { + reCheckSelection(cm.doc); + } + signalLater(cm, "markerAdded", cm, marker); + } + return marker; + } + var SharedTextMarker = function(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i2 = 0; i2 < markers.length; ++i2) { + markers[i2].parent = this; + } + }; + SharedTextMarker.prototype.clear = function() { + if (this.explicitlyCleared) { + return; + } + this.explicitlyCleared = true; + for (var i2 = 0; i2 < this.markers.length; ++i2) { + this.markers[i2].clear(); + } + signalLater(this, "clear"); + }; + SharedTextMarker.prototype.find = function(side, lineObj) { + return this.primary.find(side, lineObj); + }; + eventMixin(SharedTextMarker); + function markTextShared(doc2, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc2, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc2, function(doc3) { + if (widget) { + options.widgetNode = widget.cloneNode(true); + } + markers.push(markText(doc3, clipPos(doc3, from), clipPos(doc3, to), options, type)); + for (var i2 = 0; i2 < doc3.linked.length; ++i2) { + if (doc3.linked[i2].isParent) { + return; + } + } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary); + } + function findSharedMarkers(doc2) { + return doc2.findMarks(Pos(doc2.first, 0), doc2.clipPos(Pos(doc2.lastLine())), function(m) { + return m.parent; + }); + } + function copySharedMarkers(doc2, markers) { + for (var i2 = 0; i2 < markers.length; i2++) { + var marker = markers[i2], pos = marker.find(); + var mFrom = doc2.clipPos(pos.from), mTo = doc2.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc2, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + function detachSharedMarkers(markers) { + var loop = function(i3) { + var marker = markers[i3], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function(d) { + return linked.push(d); + }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + for (var i2 = 0; i2 < markers.length; i2++) loop(i2); + } + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { + return new Doc(text, mode, firstLine, lineSep, direction); + } + if (firstLine == null) { + firstLine = 0; + } + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = direction == "rtl" ? "rtl" : "ltr"; + this.extend = false; + if (typeof text == "string") { + text = this.splitLines(text); + } + updateDoc(this, { from: start, to: start, text }); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { + this.iterN(from - this.first, to - from, op); + } else { + this.iterN(this.first, this.first + this.size, from); + } + }, + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i2 = 0; i2 < lines.length; ++i2) { + height += lines[i2].height; + } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { + this.removeInner(at - this.first, n); + }, + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { + return lines; + } + return lines.join(lineSep || this.lineSeparator()); + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, { + from: top, + to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), + origin: "setValue", + full: true + }, true); + if (this.cm) { + scrollToCoords(this.cm, 0, 0); + } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { + return lines; + } + if (lineSep === "") { + return lines.join(""); + } + return lines.join(lineSep || this.lineSeparator()); + }, + getLine: function(line) { + var l = this.getLineHandle(line); + return l && l.text; + }, + getLineHandle: function(line) { + if (isLine(this, line)) { + return getLine(this, line); + } + }, + getLineNumber: function(line) { + return lineNo(line); + }, + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { + line = getLine(this, line); + } + return visualLine(line); + }, + lineCount: function() { + return this.size; + }, + firstLine: function() { + return this.first; + }, + lastLine: function() { + return this.first + this.size - 1; + }, + clipPos: function(pos) { + return clipPos(this, pos); + }, + getCursor: function(start) { + var range2 = this.sel.primary(), pos; + if (start == null || start == "head") { + pos = range2.head; + } else if (start == "anchor") { + pos = range2.anchor; + } else if (start == "end" || start == "to" || start === false) { + pos = range2.to(); + } else { + pos = range2.from(); + } + return pos; + }, + listSelections: function() { + return this.sel.ranges; + }, + somethingSelected: function() { + return this.sel.somethingSelected(); + }, + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + if (!ranges.length) { + return; + } + var out = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + out[i2] = new Range( + clipPos(this, ranges[i2].anchor), + clipPos(this, ranges[i2].head || ranges[i2].anchor) + ); + } + if (primary == null) { + primary = Math.min(ranges.length - 1, this.sel.primIndex); + } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + getSelection: function(lineSep) { + var ranges = this.sel.ranges, lines; + for (var i2 = 0; i2 < ranges.length; i2++) { + var sel = getBetween(this, ranges[i2].from(), ranges[i2].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { + return lines; + } else { + return lines.join(lineSep || this.lineSeparator()); + } + }, + getSelections: function(lineSep) { + var parts = [], ranges = this.sel.ranges; + for (var i2 = 0; i2 < ranges.length; i2++) { + var sel = getBetween(this, ranges[i2].from(), ranges[i2].to()); + if (lineSep !== false) { + sel = sel.join(lineSep || this.lineSeparator()); + } + parts[i2] = sel; + } + return parts; + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i2 = 0; i2 < this.sel.ranges.length; i2++) { + dup[i2] = code; + } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var changes = [], sel = this.sel; + for (var i2 = 0; i2 < sel.ranges.length; i2++) { + var range2 = sel.ranges[i2]; + changes[i2] = { from: range2.from(), to: range2.to(), text: this.splitLines(code[i2]), origin }; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$12 = changes.length - 1; i$12 >= 0; i$12--) { + makeChange(this, changes[i$12]); + } + if (newSel) { + setSelectionReplaceHistory(this, newSel); + } else if (this.cm) { + ensureCursorVisible(this.cm); + } + }), + undo: docMethodOp(function() { + makeChangeFromHistory(this, "undo"); + }), + redo: docMethodOp(function() { + makeChangeFromHistory(this, "redo"); + }), + undoSelection: docMethodOp(function() { + makeChangeFromHistory(this, "undo", true); + }), + redoSelection: docMethodOp(function() { + makeChangeFromHistory(this, "redo", true); + }), + setExtending: function(val) { + this.extend = val; + }, + getExtending: function() { + return this.extend; + }, + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i2 = 0; i2 < hist.done.length; i2++) { + if (!hist.done[i2].ranges) { + ++done; + } + } + for (var i$12 = 0; i$12 < hist.undone.length; i$12++) { + if (!hist.undone[i$12].ranges) { + ++undone; + } + } + return { undo: done, redo: undone }; + }, + clearHistory: function() { + var this$1$1 = this; + this.history = new History(this.history); + linkedDocs(this, function(doc2) { + return doc2.history = this$1$1.history; + }, true); + }, + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) { + this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; + } + return this.history.generation; + }, + isClean: function(gen) { + return this.history.generation == (gen || this.cleanGeneration); + }, + getHistory: function() { + return { + done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone) + }; + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function(line2) { + var markers = line2.gutterMarkers || (line2.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { + line2.gutterMarkers = null; + } + return true; + }); + }), + clearGutter: docMethodOp(function(gutterID) { + var this$1$1 = this; + this.iter(function(line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1$1, line, "gutter", function() { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { + line.gutterMarkers = null; + } + return true; + }); + } + }); + }), + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { + return null; + } + n = line; + line = getLine(this, line); + if (!line) { + return null; + } + } else { + n = lineNo(line); + if (n == null) { + return null; + } + } + return { + line: n, + handle: line, + text: line.text, + gutterMarkers: line.gutterMarkers, + textClass: line.textClass, + bgClass: line.bgClass, + wrapClass: line.wrapClass, + widgets: line.widgets + }; + }, + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) { + var prop2 = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop2]) { + line[prop2] = cls; + } else if (classTest(cls).test(line[prop2])) { + return false; + } else { + line[prop2] += " " + cls; + } + return true; + }); + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) { + var prop2 = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop2]; + if (!cur) { + return false; + } else if (cls == null) { + line[prop2] = null; + } else { + var found = cur.match(classTest(cls)); + if (!found) { + return false; + } + var end = found.index + found[0].length; + line[prop2] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true; + }); + }), + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options); + }), + removeLineWidget: function(widget) { + widget.clear(); + }, + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range"); + }, + setBookmark: function(pos, options) { + var realOpts = { + replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, + shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents + }; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark"); + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { + for (var i2 = 0; i2 < spans.length; ++i2) { + var span = spans[i2]; + if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) { + markers.push(span.marker.parent || span.marker); + } + } + } + return markers; + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); + to = clipPos(this, to); + var found = [], lineNo2 = from.line; + this.iter(from.line, to.line + 1, function(line) { + var spans = line.markedSpans; + if (spans) { + for (var i2 = 0; i2 < spans.length; i2++) { + var span = spans[i2]; + if (!(span.to != null && lineNo2 == from.line && from.ch >= span.to || span.from == null && lineNo2 != from.line || span.from != null && lineNo2 == to.line && span.from >= to.ch) && (!filter || filter(span.marker))) { + found.push(span.marker.parent || span.marker); + } + } + } + ++lineNo2; + }); + return found; + }, + getAllMarks: function() { + var markers = []; + this.iter(function(line) { + var sps = line.markedSpans; + if (sps) { + for (var i2 = 0; i2 < sps.length; ++i2) { + if (sps[i2].from != null) { + markers.push(sps[i2].marker); + } + } + } + }); + return markers; + }, + posFromIndex: function(off2) { + var ch, lineNo2 = this.first, sepSize = this.lineSeparator().length; + this.iter(function(line) { + var sz = line.text.length + sepSize; + if (sz > off2) { + ch = off2; + return true; + } + off2 -= sz; + ++lineNo2; + }); + return clipPos(this, Pos(lineNo2, ch)); + }, + indexFromPos: function(coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { + return 0; + } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function(line) { + index += line.text.length + sepSize; + }); + return index; + }, + copy: function(copyHistory) { + var doc2 = new Doc( + getLines(this, this.first, this.first + this.size), + this.modeOption, + this.first, + this.lineSep, + this.direction + ); + doc2.scrollTop = this.scrollTop; + doc2.scrollLeft = this.scrollLeft; + doc2.sel = this.sel; + doc2.extend = false; + if (copyHistory) { + doc2.history.undoDepth = this.history.undoDepth; + doc2.setHistory(this.getHistory()); + } + return doc2; + }, + linkedDoc: function(options) { + if (!options) { + options = {}; + } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { + from = options.from; + } + if (options.to != null && options.to < to) { + to = options.to; + } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { + copy.history = this.history; + } + (this.linked || (this.linked = [])).push({ doc: copy, sharedHist: options.sharedHist }); + copy.linked = [{ doc: this, isParent: true, sharedHist: options.sharedHist }]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy; + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) { + other = other.doc; + } + if (this.linked) { + for (var i2 = 0; i2 < this.linked.length; ++i2) { + var link = this.linked[i2]; + if (link.doc != other) { + continue; + } + this.linked.splice(i2, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break; + } + } + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function(doc2) { + return splitIds.push(doc2.id); + }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) { + linkedDocs(this, f); + }, + getMode: function() { + return this.mode; + }, + getEditor: function() { + return this.cm; + }, + splitLines: function(str) { + if (this.lineSep) { + return str.split(this.lineSep); + } + return splitLinesAuto(str); + }, + lineSeparator: function() { + return this.lineSep || "\n"; + }, + setDirection: docMethodOp(function(dir) { + if (dir != "rtl") { + dir = "ltr"; + } + if (dir == this.direction) { + return; + } + this.direction = dir; + this.iter(function(line) { + return line.order = null; + }); + if (this.cm) { + directionChanged(this.cm); + } + }) + }); + Doc.prototype.eachLine = Doc.prototype.iter; + var lastDrop = 0; + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e_preventDefault(e); + if (ie) { + lastDrop = +/* @__PURE__ */ new Date(); + } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { + return; + } + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function() { + if (++read == n) { + operation(cm, function() { + pos = clipPos(cm.doc, pos); + var change = { + from: pos, + to: pos, + text: cm.doc.splitLines( + text.filter(function(t) { + return t != null; + }).join(cm.doc.lineSeparator()) + ), + origin: "paste" + }; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function(file, i3) { + if (cm.options.allowDropFileTypes && indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return; + } + var reader = new FileReader(); + reader.onerror = function() { + return markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.onload = function() { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return; + } + text[i3] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i2 = 0; i2 < files.length; i2++) { + readTextFromFile(files[i2], i2); + } + } else { + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + setTimeout(function() { + return cm.display.input.focus(); + }, 20); + return; + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) { + selected = cm.listSelections(); + } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { + for (var i$12 = 0; i$12 < selected.length; ++i$12) { + replaceRange(cm.doc, "", selected[i$12].anchor, selected[i$12].head, "drag"); + } + } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } catch (e$1) { + } + } + } + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +/* @__PURE__ */ new Date() - lastDrop < 100)) { + e_stop(e); + return; + } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { + img.parentNode.removeChild(img); + } + } + } + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { + return; + } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { + return; + } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i2 = 0; i2 < byClass.length; i2++) { + var cm = byClass[i2].CodeMirror; + if (cm) { + editors.push(cm); + } + } + if (editors.length) { + editors[0].operation(function() { + for (var i3 = 0; i3 < editors.length; i3++) { + f(editors[i3]); + } + }); + } + } + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { + return; + } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + var resizeTimer; + on(window, "resize", function() { + if (resizeTimer == null) { + resizeTimer = setTimeout(function() { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); + } + }); + on(window, "blur", function() { + return forEachCodeMirror(onBlur); + }); + } + function onResize(cm) { + var d = cm.display; + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + var keyNames = { + 3: "Pause", + 8: "Backspace", + 9: "Tab", + 13: "Enter", + 16: "Shift", + 17: "Ctrl", + 18: "Alt", + 19: "Pause", + 20: "CapsLock", + 27: "Esc", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "Left", + 38: "Up", + 39: "Right", + 40: "Down", + 44: "PrintScrn", + 45: "Insert", + 46: "Delete", + 59: ";", + 61: "=", + 91: "Mod", + 92: "Mod", + 93: "Mod", + 106: "*", + 107: "=", + 109: "-", + 110: ".", + 111: "/", + 145: "ScrollLock", + 173: "-", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'", + 224: "Mod", + 63232: "Up", + 63233: "Down", + 63234: "Left", + 63235: "Right", + 63272: "Delete", + 63273: "Home", + 63275: "End", + 63276: "PageUp", + 63277: "PageDown", + 63302: "Insert" + }; + for (var i = 0; i < 10; i++) { + keyNames[i + 48] = keyNames[i + 96] = String(i); + } + for (var i$1 = 65; i$1 <= 90; i$1++) { + keyNames[i$1] = String.fromCharCode(i$1); + } + for (var i$2 = 1; i$2 <= 12; i$2++) { + keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; + } + var keyMap = {}; + keyMap.basic = { + "Left": "goCharLeft", + "Right": "goCharRight", + "Up": "goLineUp", + "Down": "goLineDown", + "End": "goLineEnd", + "Home": "goLineStartSmart", + "PageUp": "goPageUp", + "PageDown": "goPageDown", + "Delete": "delCharAfter", + "Backspace": "delCharBefore", + "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", + "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", + "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + keyMap.pcDefault = { + "Ctrl-A": "selectAll", + "Ctrl-D": "deleteLine", + "Ctrl-Z": "undo", + "Shift-Ctrl-Z": "redo", + "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", + "Ctrl-End": "goDocEnd", + "Ctrl-Up": "goLineUp", + "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", + "Ctrl-Right": "goGroupRight", + "Alt-Left": "goLineStart", + "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", + "Ctrl-Delete": "delGroupAfter", + "Ctrl-S": "save", + "Ctrl-F": "find", + "Ctrl-G": "findNext", + "Shift-Ctrl-G": "findPrev", + "Shift-Ctrl-F": "replace", + "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", + "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", + "Shift-Ctrl-U": "redoSelection", + "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + keyMap.emacsy = { + "Ctrl-F": "goCharRight", + "Ctrl-B": "goCharLeft", + "Ctrl-P": "goLineUp", + "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", + "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", + "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", + "Ctrl-H": "delCharBefore", + "Alt-Backspace": "delWordBefore", + "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", + "Cmd-D": "deleteLine", + "Cmd-Z": "undo", + "Shift-Cmd-Z": "redo", + "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", + "Cmd-Up": "goDocStart", + "Cmd-End": "goDocEnd", + "Cmd-Down": "goDocEnd", + "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", + "Cmd-Left": "goLineLeft", + "Cmd-Right": "goLineRight", + "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", + "Alt-Delete": "delGroupAfter", + "Cmd-S": "save", + "Cmd-F": "find", + "Cmd-G": "findNext", + "Shift-Cmd-G": "findPrev", + "Cmd-Alt-F": "replace", + "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", + "Cmd-]": "indentMore", + "Cmd-Backspace": "delWrappedLineLeft", + "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", + "Shift-Cmd-U": "redoSelection", + "Ctrl-Up": "goDocStart", + "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i2 = 0; i2 < parts.length - 1; i2++) { + var mod = parts[i2]; + if (/^(cmd|meta|m)$/i.test(mod)) { + cmd = true; + } else if (/^a(lt)?$/i.test(mod)) { + alt = true; + } else if (/^(c|ctrl|control)$/i.test(mod)) { + ctrl = true; + } else if (/^s(hift)?$/i.test(mod)) { + shift = true; + } else { + throw new Error("Unrecognized modifier name: " + mod); + } + } + if (alt) { + name = "Alt-" + name; + } + if (ctrl) { + name = "Ctrl-" + name; + } + if (cmd) { + name = "Cmd-" + name; + } + if (shift) { + name = "Shift-" + name; + } + return name; + } + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { + if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { + continue; + } + if (value == "...") { + delete keymap[keyname]; + continue; + } + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i2 = 0; i2 < keys.length; i2++) { + var val = void 0, name = void 0; + if (i2 == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i2 + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { + copy[name] = val; + } else if (prev != val) { + throw new Error("Inconsistent bindings for " + name); + } + } + delete keymap[keyname]; + } + } + for (var prop2 in copy) { + keymap[prop2] = copy[prop2]; + } + return keymap; + } + function lookupKey(key, map2, handle, context) { + map2 = getKeyMap(map2); + var found = map2.call ? map2.call(key, context) : map2[key]; + if (found === false) { + return "nothing"; + } + if (found === "...") { + return "multi"; + } + if (found != null && handle(found)) { + return "handled"; + } + if (map2.fallthrough) { + if (Object.prototype.toString.call(map2.fallthrough) != "[object Array]") { + return lookupKey(key, map2.fallthrough, handle, context); + } + for (var i2 = 0; i2 < map2.fallthrough.length; i2++) { + var result = lookupKey(key, map2.fallthrough[i2], handle, context); + if (result) { + return result; + } + } + } + } + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; + } + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { + name = "Alt-" + name; + } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { + name = "Ctrl-" + name; + } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { + name = "Cmd-" + name; + } + if (!noShift && event.shiftKey && base != "Shift") { + name = "Shift-" + name; + } + return name; + } + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { + return false; + } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { + return false; + } + if (event.keyCode == 3 && event.code) { + name = event.code; + } + return addModifierNames(name, event, noShift); + } + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val; + } + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + var toKill = compute(ranges[i2]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break; + } + } + kill.push(toKill); + } + runInOp(cm, function() { + for (var i3 = kill.length - 1; i3 >= 0; i3--) { + replaceRange(cm.doc, "", kill[i3].from, kill[i3].to, "+delete"); + } + ensureCursorVisible(cm); + }); + } + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target; + } + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before"); + } + function endOfLine(visually, cm, lineObj, lineNo2, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { + dir = -dir; + } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = dir < 0 == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function(ch2) { + return measureCharPrepared(cm, prep, ch2).top == targetTop; + }, dir < 0 == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { + ch = moveCharLogically(lineObj, ch, 1); + } + } else { + ch = dir < 0 ? part.to : part.from; + } + return new Pos(lineNo2, ch, sticky); + } + } + return new Pos(lineNo2, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after"); + } + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { + return moveLogically(line, start, dir); + } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + return moveLogically(line, start, dir); + } + var mv = function(pos, dir2) { + return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir2); + }; + var prep; + var getWrappedLineExtent = function(ch2) { + if (!cm.options.lineWrapping) { + return { begin: 0, end: line.text.length }; + } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch2); + }; + var wrappedLineExtent2 = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = part.level == 1 == dir < 0; + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent2.begin : ch <= part.to && ch <= wrappedLineExtent2.end)) { + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky); + } + } + var searchInVisualLine = function(partPos2, dir2, wrappedLineExtent3) { + var getRes = function(ch3, moveInStorageOrder3) { + return moveInStorageOrder3 ? new Pos(start.line, mv(ch3, 1), "before") : new Pos(start.line, ch3, "after"); + }; + for (; partPos2 >= 0 && partPos2 < bidi.length; partPos2 += dir2) { + var part2 = bidi[partPos2]; + var moveInStorageOrder2 = dir2 > 0 == (part2.level != 1); + var ch2 = moveInStorageOrder2 ? wrappedLineExtent3.begin : mv(wrappedLineExtent3.end, -1); + if (part2.from <= ch2 && ch2 < part2.to) { + return getRes(ch2, moveInStorageOrder2); + } + ch2 = moveInStorageOrder2 ? part2.from : mv(part2.to, -1); + if (wrappedLineExtent3.begin <= ch2 && ch2 < wrappedLineExtent3.end) { + return getRes(ch2, moveInStorageOrder2); + } + } + }; + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent2); + if (res) { + return res; + } + var nextCh = dir > 0 ? wrappedLineExtent2.end : mv(wrappedLineExtent2.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { + return res; + } + } + return null; + } + var commands = { + selectAll, + singleSelection: function(cm) { + return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); + }, + killLine: function(cm) { + return deleteNearSelection(cm, function(range2) { + if (range2.empty()) { + var len = getLine(cm.doc, range2.head.line).text.length; + if (range2.head.ch == len && range2.head.line < cm.lastLine()) { + return { from: range2.head, to: Pos(range2.head.line + 1, 0) }; + } else { + return { from: range2.head, to: Pos(range2.head.line, len) }; + } + } else { + return { from: range2.from(), to: range2.to() }; + } + }); + }, + deleteLine: function(cm) { + return deleteNearSelection(cm, function(range2) { + return { + from: Pos(range2.from().line, 0), + to: clipPos(cm.doc, Pos(range2.to().line + 1, 0)) + }; + }); + }, + delLineLeft: function(cm) { + return deleteNearSelection(cm, function(range2) { + return { + from: Pos(range2.from().line, 0), + to: range2.from() + }; + }); + }, + delWrappedLineLeft: function(cm) { + return deleteNearSelection(cm, function(range2) { + var top = cm.charCoords(range2.head, "div").top + 5; + var leftPos = cm.coordsChar({ left: 0, top }, "div"); + return { from: leftPos, to: range2.from() }; + }); + }, + delWrappedLineRight: function(cm) { + return deleteNearSelection(cm, function(range2) { + var top = cm.charCoords(range2.head, "div").top + 5; + var rightPos = cm.coordsChar({ left: cm.display.lineDiv.offsetWidth + 100, top }, "div"); + return { from: range2.from(), to: rightPos }; + }); + }, + undo: function(cm) { + return cm.undo(); + }, + redo: function(cm) { + return cm.redo(); + }, + undoSelection: function(cm) { + return cm.undoSelection(); + }, + redoSelection: function(cm) { + return cm.redoSelection(); + }, + goDocStart: function(cm) { + return cm.extendSelection(Pos(cm.firstLine(), 0)); + }, + goDocEnd: function(cm) { + return cm.extendSelection(Pos(cm.lastLine())); + }, + goLineStart: function(cm) { + return cm.extendSelectionsBy( + function(range2) { + return lineStart(cm, range2.head.line); + }, + { origin: "+move", bias: 1 } + ); + }, + goLineStartSmart: function(cm) { + return cm.extendSelectionsBy( + function(range2) { + return lineStartSmart(cm, range2.head); + }, + { origin: "+move", bias: 1 } + ); + }, + goLineEnd: function(cm) { + return cm.extendSelectionsBy( + function(range2) { + return lineEnd(cm, range2.head.line); + }, + { origin: "+move", bias: -1 } + ); + }, + goLineRight: function(cm) { + return cm.extendSelectionsBy(function(range2) { + var top = cm.cursorCoords(range2.head, "div").top + 5; + return cm.coordsChar({ left: cm.display.lineDiv.offsetWidth + 100, top }, "div"); + }, sel_move); + }, + goLineLeft: function(cm) { + return cm.extendSelectionsBy(function(range2) { + var top = cm.cursorCoords(range2.head, "div").top + 5; + return cm.coordsChar({ left: 0, top }, "div"); + }, sel_move); + }, + goLineLeftSmart: function(cm) { + return cm.extendSelectionsBy(function(range2) { + var top = cm.cursorCoords(range2.head, "div").top + 5; + var pos = cm.coordsChar({ left: 0, top }, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { + return lineStartSmart(cm, range2.head); + } + return pos; + }, sel_move); + }, + goLineUp: function(cm) { + return cm.moveV(-1, "line"); + }, + goLineDown: function(cm) { + return cm.moveV(1, "line"); + }, + goPageUp: function(cm) { + return cm.moveV(-1, "page"); + }, + goPageDown: function(cm) { + return cm.moveV(1, "page"); + }, + goCharLeft: function(cm) { + return cm.moveH(-1, "char"); + }, + goCharRight: function(cm) { + return cm.moveH(1, "char"); + }, + goColumnLeft: function(cm) { + return cm.moveH(-1, "column"); + }, + goColumnRight: function(cm) { + return cm.moveH(1, "column"); + }, + goWordLeft: function(cm) { + return cm.moveH(-1, "word"); + }, + goGroupRight: function(cm) { + return cm.moveH(1, "group"); + }, + goGroupLeft: function(cm) { + return cm.moveH(-1, "group"); + }, + goWordRight: function(cm) { + return cm.moveH(1, "word"); + }, + delCharBefore: function(cm) { + return cm.deleteH(-1, "codepoint"); + }, + delCharAfter: function(cm) { + return cm.deleteH(1, "char"); + }, + delWordBefore: function(cm) { + return cm.deleteH(-1, "word"); + }, + delWordAfter: function(cm) { + return cm.deleteH(1, "word"); + }, + delGroupBefore: function(cm) { + return cm.deleteH(-1, "group"); + }, + delGroupAfter: function(cm) { + return cm.deleteH(1, "group"); + }, + indentAuto: function(cm) { + return cm.indentSelection("smart"); + }, + indentMore: function(cm) { + return cm.indentSelection("add"); + }, + indentLess: function(cm) { + return cm.indentSelection("subtract"); + }, + insertTab: function(cm) { + return cm.replaceSelection(" "); + }, + insertSoftTab: function(cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i2 = 0; i2 < ranges.length; i2++) { + var pos = ranges[i2].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function(cm) { + if (cm.somethingSelected()) { + cm.indentSelection("add"); + } else { + cm.execCommand("insertTab"); + } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function(cm) { + return runInOp(cm, function() { + var ranges = cm.listSelections(), newSel = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + if (!ranges[i2].empty()) { + continue; + } + var cur = ranges[i2].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { + cur = new Pos(cur.line, cur.ch - 1); + } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange( + line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), + cur, + "+transpose" + ); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange( + line.charAt(0) + cm.doc.lineSeparator() + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), + cur, + "+transpose" + ); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); + }, + newlineAndIndent: function(cm) { + return runInOp(cm, function() { + var sels = cm.listSelections(); + for (var i2 = sels.length - 1; i2 >= 0; i2--) { + cm.replaceRange(cm.doc.lineSeparator(), sels[i2].anchor, sels[i2].head, "+input"); + } + sels = cm.listSelections(); + for (var i$12 = 0; i$12 < sels.length; i$12++) { + cm.indentLine(sels[i$12].from().line, null, true); + } + ensureCursorVisible(cm); + }); + }, + openLine: function(cm) { + return cm.replaceSelection("\n", "start"); + }, + toggleOverwrite: function(cm) { + return cm.toggleOverwrite(); + } + }; + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { + lineN = lineNo(visual); + } + return endOfLine(true, cm, visual, lineN, 1); + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { + lineN = lineNo(visual); + } + return endOfLine(true, cm, line, lineN, -1); + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky); + } + return start; + } + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { + return false; + } + } + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { + cm.state.suppressEdits = true; + } + if (dropShift) { + cm.display.shift = false; + } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done; + } + function lookupKeyForEditor(cm, name, handle) { + for (var i2 = 0; i2 < cm.state.keyMaps.length; i2++) { + var result = lookupKey(name, cm.state.keyMaps[i2], handle, cm); + if (result) { + return result; + } + } + return cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm) || lookupKey(name, cm.options.keyMap, handle, cm); + } + var stopSeq = new Delayed(); + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { + return "handled"; + } + if (/\'$/.test(name)) { + cm.state.keySeq = null; + } else { + stopSeq.set(50, function() { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); + } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { + return true; + } + } + return dispatchKeyInner(cm, name, e, handle); + } + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + if (result == "multi") { + cm.state.keySeq = name; + } + if (result == "handled") { + signalLater(cm, "keyHandled", cm, name, e); + } + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + return !!result; + } + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { + return false; + } + if (e.shiftKey && !cm.state.keySeq) { + return dispatchKey(cm, "Shift-" + name, e, function(b) { + return doHandleBinding(cm, b, true); + }) || dispatchKey(cm, name, e, function(b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) { + return doHandleBinding(cm, b); + } + }); + } else { + return dispatchKey(cm, name, e, function(b) { + return doHandleBinding(cm, b); + }); + } + } + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function(b) { + return doHandleBinding(cm, b, true); + }); + } + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { + return; + } + cm.curOp.focus = activeElt(root(cm)); + if (signalDOMEvent(cm, e)) { + return; + } + if (ie && ie_version < 11 && e.keyCode == 27) { + e.returnValue = false; + } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) { + cm.replaceSelection("", null, "cut"); + } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) { + document.execCommand("cut"); + } + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) { + showCrossHair(cm); + } + } + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + function onKeyUp(e) { + if (e.keyCode == 16) { + this.doc.sel.shift = false; + } + signalDOMEvent(this, e); + } + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { + return; + } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { + return; + } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) { + lastStoppedKey = null; + e_preventDefault(e); + return; + } + if (presto && (!e.which || e.which < 10) && handleKeyBinding(cm, e)) { + return; + } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + if (ch == "\b") { + return; + } + if (handleCharBinding(cm, e, ch)) { + return; + } + cm.display.input.onKeyPress(e); + } + var DOUBLECLICK_DELAY = 400; + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + PastClick.prototype.compare = function(time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && cmp(pos, this.pos) == 0 && button == this.button; + }; + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +/* @__PURE__ */ new Date(); + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple"; + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double"; + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single"; + } + } + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { + return; + } + display.input.ensurePolled(); + display.shift = e.shiftKey; + if (eventInWidget(display, e)) { + if (!webkit) { + display.scroller.draggable = false; + setTimeout(function() { + return display.scroller.draggable = true; + }, 100); + } + return; + } + if (clickInGutter(cm, e)) { + return; + } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + win(cm).focus(); + if (button == 1 && cm.state.selectingText) { + cm.state.selectingText(e); + } + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { + return; + } + if (button == 1) { + if (pos) { + leftButtonDown(cm, pos, repeat, e); + } else if (e_target(e) == display.scroller) { + e_preventDefault(e); + } + } else if (button == 2) { + if (pos) { + extendSelection(cm.doc, pos); + } + setTimeout(function() { + return display.input.focus(); + }, 20); + } else if (button == 3) { + if (captureRightClick) { + cm.display.input.onContextMenu(e); + } else { + delayBlurEvent(cm); + } + } + } + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { + name = "Double" + name; + } else if (repeat == "triple") { + name = "Triple" + name; + } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + return dispatchKey(cm, addModifierNames(name, event), event, function(bound) { + if (typeof bound == "string") { + bound = commands[bound]; + } + if (!bound) { + return false; + } + var done = false; + try { + if (cm.isReadOnly()) { + cm.state.suppressEdits = true; + } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done; + }); + } + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { + value.extend = cm.doc.extend || event.shiftKey; + } + if (value.addNew == null) { + value.addNew = mac ? event.metaKey : event.ctrlKey; + } + if (value.moveOnDrag == null) { + value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); + } + return value; + } + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { + setTimeout(bind(ensureFocus, cm), 0); + } else { + cm.curOp.focus = activeElt(root(cm)); + } + var behavior = configureMouse(cm, repeat, event); + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && repeat == "single" && (contained = sel.contains(pos)) > -1 && (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) { + leftButtonStartDrag(cm, event, pos, behavior); + } else { + leftButtonSelect(cm, event, pos, behavior); + } + } + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function(e) { + if (webkit) { + display.scroller.draggable = false; + } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { + cm.state.delayingBlurEvent = false; + } else { + delayBlurEvent(cm); + } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) { + extendSelection(cm.doc, pos, null, null, behavior.extend); + } + if (webkit && !safari || ie && ie_version == 9) { + setTimeout(function() { + display.wrapper.ownerDocument.body.focus({ preventScroll: true }); + display.input.focus(); + }, 20); + } else { + display.input.focus(); + } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function() { + return moved = true; + }; + if (webkit) { + display.scroller.draggable = true; + } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + cm.state.delayingBlurEvent = true; + setTimeout(function() { + return display.input.focus(); + }, 20); + if (display.scroller.dragDrop) { + display.scroller.dragDrop(); + } + } + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { + return new Range(pos, pos); + } + if (unit == "word") { + return cm.findWordAt(pos); + } + if (unit == "line") { + return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); + } + var result = unit(cm, pos); + return new Range(result.from, result.to); + } + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { + delayBlurEvent(cm); + } + var display = cm.display, doc2 = cm.doc; + e_preventDefault(event); + var ourRange, ourIndex, startSel = doc2.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc2.sel.contains(start); + if (ourIndex > -1) { + ourRange = ranges[ourIndex]; + } else { + ourRange = new Range(start, start); + } + } else { + ourRange = doc2.sel.primary(); + ourIndex = doc2.sel.primIndex; + } + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { + ourRange = new Range(start, start); + } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range2 = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) { + ourRange = extendRange(ourRange, range2.anchor, range2.head, behavior.extend); + } else { + ourRange = range2; + } + } + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc2, new Selection([ourRange], 0), sel_mouse); + startSel = doc2.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection( + doc2, + normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + { scroll: false, origin: "*mouse" } + ); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection( + doc2, + normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + { scroll: false, origin: "*mouse" } + ); + startSel = doc2.sel; + } else { + replaceOneSelection(doc2, ourIndex, ourRange, sel_mouse); + } + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { + return; + } + lastPos = pos; + if (behavior.unit == "rectangle") { + var ranges2 = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc2, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc2, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); line <= end; line++) { + var text = getLine(doc2, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) { + ranges2.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); + } else if (text.length > leftPos) { + ranges2.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); + } + } + if (!ranges2.length) { + ranges2.push(new Range(start, start)); + } + setSelection( + doc2, + normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges2), ourIndex), + { origin: "*mouse", scroll: false } + ); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range3 = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range3.anchor, anchor) > 0) { + head = range3.head; + anchor = minPos(oldRange.from(), range3.anchor); + } else { + head = range3.anchor; + anchor = maxPos(oldRange.to(), range3.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc2, anchor), head)); + setSelection(doc2, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + var editorSize = display.wrapper.getBoundingClientRect(); + var counter = 0; + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { + return; + } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(root(cm)); + extendTo(cur); + var visible = visibleLines(display, doc2); + if (cur.line >= visible.to || cur.line < visible.from) { + setTimeout(operation(cm, function() { + if (counter == curCount) { + extend(e); + } + }), 150); + } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { + setTimeout(operation(cm, function() { + if (counter != curCount) { + return; + } + display.scroller.scrollTop += outside; + extend(e); + }), 50); + } + } + } + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc2.history.lastSelOrigin = null; + } + var move = operation(cm, function(e) { + if (e.buttons === 0 || !e_button(e)) { + done(e); + } else { + extend(e); + } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + function bidiSimplify(cm, range2) { + var anchor = range2.anchor; + var head = range2.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { + return range2; + } + var order = getOrder(anchorLine); + if (!order) { + return range2; + } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { + return range2; + } + var boundary = index + (part.from == anchor.ch == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { + return range2; + } + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) { + leftSide = dir < 0; + } else { + leftSide = dir > 0; + } + } + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range2 : new Range(new Pos(anchor.line, ch, sticky), head); + } + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { + mX = e.clientX; + mY = e.clientY; + } catch (e$1) { + return false; + } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { + return false; + } + if (prevent) { + e_preventDefault(e); + } + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + if (mY > lineBox.bottom || !hasHandler(cm, type)) { + return e_defaultPrevented(e); + } + mY -= lineBox.top - display.viewOffset; + for (var i2 = 0; i2 < cm.display.gutterSpecs.length; ++i2) { + var g = display.gutters.childNodes[i2]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i2]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e); + } + } + } + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true); + } + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { + return; + } + if (signalDOMEvent(cm, e, "contextmenu")) { + return; + } + if (!captureRightClick) { + cm.display.input.onContextMenu(e); + } + } + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { + return false; + } + return gutterEvent(cm, e, "gutterContextMenu", false); + } + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + var Init = { toString: function() { + return "CodeMirror.Init"; + } }; + var defaults = {}; + var optionHandlers = {}; + function defineOptions(CodeMirror2) { + var optionHandlers2 = CodeMirror2.optionHandlers; + function option(name, deflt, handle, notOnInit) { + CodeMirror2.defaults[name] = deflt; + if (handle) { + optionHandlers2[name] = notOnInit ? function(cm, val, old) { + if (old != Init) { + handle(cm, val, old); + } + } : handle; + } + } + CodeMirror2.defineOption = option; + CodeMirror2.Init = Init; + option("value", "", function(cm, val) { + return cm.setValue(val); + }, true); + option("mode", null, function(cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function(cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + option("lineSeparator", null, function(cm, val) { + cm.doc.lineSep = val; + if (!val) { + return; + } + var newBreaks = [], lineNo2 = cm.doc.first; + cm.doc.iter(function(line) { + for (var pos = 0; ; ) { + var found = line.text.indexOf(val, pos); + if (found == -1) { + break; + } + pos = found + val.length; + newBreaks.push(Pos(lineNo2, found)); + } + lineNo2++; + }); + for (var i2 = newBreaks.length - 1; i2 >= 0; i2--) { + replaceRange(cm.doc, val, newBreaks[i2], Pos(newBreaks[i2].line, newBreaks[i2].ch + val.length)); + } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g, function(cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test(" ") ? "" : "| "), "g"); + if (old != Init) { + cm.refresh(); + } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) { + return cm.refresh(); + }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function() { + throw new Error("inputStyle can not (yet) be changed in a running editor"); + }, true); + option("spellcheck", false, function(cm, val) { + return cm.getInputField().spellcheck = val; + }, true); + option("autocorrect", false, function(cm, val) { + return cm.getInputField().autocorrect = val; + }, true); + option("autocapitalize", false, function(cm, val) { + return cm.getInputField().autocapitalize = val; + }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + option("theme", "default", function(cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function(cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { + prev.detach(cm, next); + } + if (next.attach) { + next.attach(cm, prev || null); + } + }); + option("extraKeys", null); + option("configureMouse", null); + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function(cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function(cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function(cm) { + return updateScrollbars(cm); + }, true); + option("scrollbarStyle", "native", function(cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function(cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function(integer) { + return integer; + }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + option("readOnly", false, function(cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + option("screenReaderLabel", null, function(cm, val) { + val = val === "" ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + option("disableInput", false, function(cm, val) { + if (!val) { + cm.display.input.reset(); + } + }, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function(cm, val) { + return cm.doc.history.undoDepth = val; + }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function(cm) { + return cm.refresh(); + }, true); + option("maxHighlightLength", 1e4, resetModeState, true); + option("moveInputWithCursor", true, function(cm, val) { + if (!val) { + cm.display.input.resetPosition(); + } + }); + option("tabindex", null, function(cm, val) { + return cm.display.input.getField().tabIndex = val || ""; + }); + option("autofocus", null); + option("direction", "ltr", function(cm, val) { + return cm.doc.setDirection(val); + }, true); + option("phrases", null); + } + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function() { + return updateScrollbars(cm); + }, 100); + } + function CodeMirror(place, options) { + var this$1$1 = this; + if (!(this instanceof CodeMirror)) { + return new CodeMirror(place, options); + } + this.options = options = options ? copyObj(options) : {}; + copyObj(defaults, options, false); + var doc2 = options.value; + if (typeof doc2 == "string") { + doc2 = new Doc(doc2, options.mode, null, options.lineSeparator, options.direction); + } else if (options.mode) { + doc2.modeOption = options.mode; + } + this.doc = doc2; + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc2, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) { + this.display.wrapper.className += " CodeMirror-wrap"; + } + initScrollbars(this); + this.state = { + keyMaps: [], + // stores maps added by addKeyMap + overlays: [], + // highlighting overlays, as added by addOverlay + modeGen: 0, + // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, + // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, + cutIncoming: -1, + // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), + // stores highlight worker timeout + keySeq: null, + // Unfinished key sequence + specialChars: null + }; + if (options.autofocus && !mobile) { + display.input.focus(); + } + if (ie && ie_version < 11) { + setTimeout(function() { + return this$1$1.display.input.reset(true); + }, 20); + } + registerEventHandlers(this); + ensureGlobalHandlers(); + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc2); + if (options.autofocus && !mobile || this.hasFocus()) { + setTimeout(function() { + if (this$1$1.hasFocus() && !this$1$1.state.focused) { + onFocus(this$1$1); + } + }, 20); + } else { + onBlur(this); + } + for (var opt in optionHandlers) { + if (optionHandlers.hasOwnProperty(opt)) { + optionHandlers[opt](this, options[opt], Init); + } + } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { + options.finishInit(this); + } + for (var i2 = 0; i2 < initHooks.length; ++i2) { + initHooks[i2](this); + } + endOperation(this); + if (webkit && options.lineWrapping && getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") { + display.lineDiv.style.textRendering = "auto"; + } + } + CodeMirror.defaults = defaults; + CodeMirror.optionHandlers = optionHandlers; + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + if (ie && ie_version < 11) { + on(d.scroller, "dblclick", operation(cm, function(e) { + if (signalDOMEvent(cm, e)) { + return; + } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); + } else { + on(d.scroller, "dblclick", function(e) { + return signalDOMEvent(cm, e) || e_preventDefault(e); + }); + } + on(d.scroller, "contextmenu", function(e) { + return onContextMenu(cm, e); + }); + on(d.input.getField(), "contextmenu", function(e) { + if (!d.scroller.contains(e.target)) { + onContextMenu(cm, e); + } + }); + var touchFinished, prevTouch = { end: 0 }; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function() { + return d.activeTouch = null; + }, 1e3); + prevTouch = d.activeTouch; + prevTouch.end = +/* @__PURE__ */ new Date(); + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { + return false; + } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1; + } + function farAway(touch, other) { + if (other.left == null) { + return true; + } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20; + } + on(d.scroller, "touchstart", function(e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +/* @__PURE__ */ new Date(); + d.activeTouch = { + start: now, + moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null + }; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function() { + if (d.activeTouch) { + d.activeTouch.moved = true; + } + }); + on(d.scroller, "touchend", function(e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && !touch.moved && /* @__PURE__ */ new Date() - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range2; + if (!touch.prev || farAway(touch, touch.prev)) { + range2 = new Range(pos, pos); + } else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) { + range2 = cm.findWordAt(pos); + } else { + range2 = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); + } + cm.setSelection(range2.anchor, range2.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + on(d.scroller, "scroll", function() { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + on(d.scroller, "mousewheel", function(e) { + return onScrollWheel(cm, e); + }); + on(d.scroller, "DOMMouseScroll", function(e) { + return onScrollWheel(cm, e); + }); + on(d.wrapper, "scroll", function() { + return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; + }); + d.dragFunctions = { + enter: function(e) { + if (!signalDOMEvent(cm, e)) { + e_stop(e); + } + }, + over: function(e) { + if (!signalDOMEvent(cm, e)) { + onDragOver(cm, e); + e_stop(e); + } + }, + start: function(e) { + return onDragStart(cm, e); + }, + drop: operation(cm, onDrop), + leave: function(e) { + if (!signalDOMEvent(cm, e)) { + clearDragCursor(cm); + } + } + }; + var inp = d.input.getField(); + on(inp, "keyup", function(e) { + return onKeyUp.call(cm, e); + }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function(e) { + return onFocus(cm, e); + }); + on(inp, "blur", function(e) { + return onBlur(cm, e); + }); + } + var initHooks = []; + CodeMirror.defineInitHook = function(f) { + return initHooks.push(f); + }; + function indentLine(cm, n, how, aggressive) { + var doc2 = cm.doc, state; + if (how == null) { + how = "add"; + } + if (how == "smart") { + if (!doc2.mode.indent) { + how = "prev"; + } else { + state = getContextBefore(cm, n).state; + } + } + var tabSize = cm.options.tabSize; + var line = getLine(doc2, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { + line.stateAfter = null; + } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc2.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { + return; + } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc2.first) { + indentation = countColumn(getLine(doc2, n - 1).text, null, tabSize); + } else { + indentation = 0; + } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) { + for (var i2 = Math.floor(indentation / tabSize); i2; --i2) { + pos += tabSize; + indentString += " "; + } + } + if (pos < indentation) { + indentString += spaceStr(indentation - pos); + } + if (indentString != curSpaceString) { + replaceRange(doc2, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true; + } else { + for (var i$12 = 0; i$12 < doc2.sel.ranges.length; i$12++) { + var range2 = doc2.sel.ranges[i$12]; + if (range2.head.line == n && range2.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc2, i$12, new Range(pos$1, pos$1)); + break; + } + } + } + } + var lastCopied = null; + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc2 = cm.doc; + cm.display.shift = false; + if (!sel) { + sel = doc2.sel; + } + var recent = +/* @__PURE__ */ new Date() - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i2 = 0; i2 < lastCopied.text.length; i2++) { + multiPaste.push(doc2.splitLines(lastCopied.text[i2])); + } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function(l) { + return [l]; + }); + } + } + var updateInput = cm.curOp.updateInput; + for (var i$12 = sel.ranges.length - 1; i$12 >= 0; i$12--) { + var range2 = sel.ranges[i$12]; + var from = range2.from(), to = range2.to(); + if (range2.empty()) { + if (deleted && deleted > 0) { + from = Pos(from.line, from.ch - deleted); + } else if (cm.state.overwrite && !paste) { + to = Pos(to.line, Math.min(getLine(doc2, to.line).text.length, to.ch + lst(textLines).length)); + } else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) { + from = to = Pos(from.line, 0); + } + } + var changeEvent = { + from, + to, + text: multiPaste ? multiPaste[i$12 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input") + }; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) { + triggerElectric(cm, inserted); + } + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { + cm.curOp.updateInput = updateInput; + } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput && cm.hasFocus()) { + runInOp(cm, function() { + return applyTextInput(cm, pasted, 0, null, "paste"); + }); + } + return true; + } + } + function triggerElectric(cm, inserted) { + if (!cm.options.electricChars || !cm.options.smartIndent) { + return; + } + var sel = cm.doc.sel; + for (var i2 = sel.ranges.length - 1; i2 >= 0; i2--) { + var range2 = sel.ranges[i2]; + if (range2.head.ch > 100 || i2 && sel.ranges[i2 - 1].head.line == range2.head.line) { + continue; + } + var mode = cm.getModeAt(range2.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) { + if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range2.head.line, "smart"); + break; + } + } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range2.head.line).text.slice(0, range2.head.ch))) { + indented = indentLine(cm, range2.head.line, "smart"); + } + } + if (indented) { + signalLater(cm, "electricInput", cm, range2.head.line); + } + } + } + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i2 = 0; i2 < cm.doc.sel.ranges.length; i2++) { + var line = cm.doc.sel.ranges[i2].head.line; + var lineRange = { anchor: Pos(line, 0), head: Pos(line + 1, 0) }; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return { text, ranges }; + } + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "on" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "on" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + if (webkit) { + te.style.width = "1000px"; + } else { + te.setAttribute("wrap", "off"); + } + if (ios) { + te.style.border = "1px solid black"; + } + return div; + } + function addEditorMethods(CodeMirror2) { + var optionHandlers2 = CodeMirror2.optionHandlers; + var helpers = CodeMirror2.helpers = {}; + CodeMirror2.prototype = { + constructor: CodeMirror2, + focus: function() { + win(this).focus(); + this.display.input.focus(); + }, + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { + return; + } + options[option] = value; + if (optionHandlers2.hasOwnProperty(option)) { + operation(this, optionHandlers2[option])(this, value, old); + } + signal(this, "optionChange", this, option); + }, + getOption: function(option) { + return this.options[option]; + }, + getDoc: function() { + return this.doc; + }, + addKeyMap: function(map2, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map2)); + }, + removeKeyMap: function(map2) { + var maps = this.state.keyMaps; + for (var i2 = 0; i2 < maps.length; ++i2) { + if (maps[i2] == map2 || maps[i2].name == map2) { + maps.splice(i2, 1); + return true; + } + } + }, + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror2.getMode(this.options, spec); + if (mode.startState) { + throw new Error("Overlays may not be stateful."); + } + insertSorted( + this.state.overlays, + { + mode, + modeSpec: spec, + opaque: options && options.opaque, + priority: options && options.priority || 0 + }, + function(overlay) { + return overlay.priority; + } + ); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var overlays = this.state.overlays; + for (var i2 = 0; i2 < overlays.length; ++i2) { + var cur = overlays[i2].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i2, 1); + this.state.modeGen++; + regChange(this); + return; + } + } + }), + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { + dir = this.options.smartIndent ? "smart" : "prev"; + } else { + dir = dir ? "add" : "subtract"; + } + } + if (isLine(this.doc, n)) { + indentLine(this, n, dir, aggressive); + } + }), + indentSelection: methodOp(function(how) { + var ranges = this.doc.sel.ranges, end = -1; + for (var i2 = 0; i2 < ranges.length; i2++) { + var range2 = ranges[i2]; + if (!range2.empty()) { + var from = range2.from(), to = range2.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) { + indentLine(this, j, how); + } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i2].from().ch > 0) { + replaceOneSelection(this.doc, i2, new Range(from, newRanges[i2].to()), sel_dontScroll); + } + } else if (range2.head.line > end) { + indentLine(this, range2.head.line, how, true); + end = range2.head.line; + if (i2 == this.doc.sel.primIndex) { + ensureCursorVisible(this); + } + } + } + }), + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise); + }, + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true); + }, + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { + type = styles[2]; + } else { + for (; ; ) { + var mid = before + after >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { + after = mid; + } else if (styles[mid * 2 + 1] < ch) { + before = mid + 1; + } else { + type = styles[mid * 2 + 2]; + break; + } + } + } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1); + }, + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { + return mode; + } + return CodeMirror2.innerMode(mode, this.getTokenAt(pos).state).mode; + }, + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0]; + }, + getHelpers: function(pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { + return found; + } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { + found.push(help[mode[type]]); + } + } else if (mode[type]) { + for (var i2 = 0; i2 < mode[type].length; i2++) { + var val = help[mode[type][i2]]; + if (val) { + found.push(val); + } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$12 = 0; i$12 < help._global.length; i$12++) { + var cur = help._global[i$12]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) { + found.push(cur.val); + } + } + return found; + }, + getStateAfter: function(line, precise) { + var doc2 = this.doc; + line = clipLine(doc2, line == null ? doc2.first + doc2.size - 1 : line); + return getContextBefore(this, line + 1, precise).state; + }, + cursorCoords: function(start, mode) { + var pos, range2 = this.doc.sel.primary(); + if (start == null) { + pos = range2.head; + } else if (typeof start == "object") { + pos = clipPos(this.doc, start); + } else { + pos = start ? range2.from() : range2.to(); + } + return cursorCoords(this, pos, mode || "page"); + }, + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page"); + }, + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top); + }, + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, { top: height, left: 0 }, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset); + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { + line = this.doc.first; + } else if (line > last) { + line = last; + end = true; + } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, { top: 0, left: 0 }, mode || "page", includeWidgets || end).top + (end ? this.doc.height - heightAtLine(lineObj) : 0); + }, + defaultTextHeight: function() { + return textHeight(this.display); + }, + defaultCharWidth: function() { + return charWidth(this.display); + }, + getViewport: function() { + return { from: this.display.viewFrom, to: this.display.viewTo }; + }, + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + if ((vert == "above" || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) { + top = pos.top - node.offsetHeight; + } else if (pos.bottom + node.offsetHeight <= vspace) { + top = pos.bottom; + } + if (left + node.offsetWidth > hspace) { + left = hspace - node.offsetWidth; + } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { + left = 0; + } else if (horiz == "middle") { + left = (display.sizer.clientWidth - node.offsetWidth) / 2; + } + node.style.left = left + "px"; + } + if (scroll) { + scrollIntoView(this, { left, top, right: left + node.offsetWidth, bottom: top + node.offsetHeight }); + } + }, + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) { + return commands[cmd].call(null, this); + } + }, + triggerElectric: methodOp(function(text) { + triggerElectric(this, text); + }), + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { + dir = -1; + amount = -amount; + } + var cur = clipPos(this.doc, from); + for (var i2 = 0; i2 < amount; ++i2) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { + break; + } + } + return cur; + }, + moveH: methodOp(function(dir, unit) { + var this$1$1 = this; + this.extendSelectionsBy(function(range2) { + if (this$1$1.display.shift || this$1$1.doc.extend || range2.empty()) { + return findPosH(this$1$1.doc, range2.head, dir, unit, this$1$1.options.rtlMoveVisually); + } else { + return dir < 0 ? range2.from() : range2.to(); + } + }, sel_move); + }), + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc2 = this.doc; + if (sel.somethingSelected()) { + doc2.replaceSelection("", null, "+delete"); + } else { + deleteNearSelection(this, function(range2) { + var other = findPosH(doc2, range2.head, dir, unit, false); + return dir < 0 ? { from: other, to: range2.head } : { from: range2.head, to: other }; + }); + } + }), + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { + dir = -1; + amount = -amount; + } + var cur = clipPos(this.doc, from); + for (var i2 = 0; i2 < amount; ++i2) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { + x = coords.left; + } else { + coords.left = x; + } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { + break; + } + } + return cur; + }, + moveV: methodOp(function(dir, unit) { + var this$1$1 = this; + var doc2 = this.doc, goals = []; + var collapse = !this.display.shift && !doc2.extend && doc2.sel.somethingSelected(); + doc2.extendSelectionsBy(function(range2) { + if (collapse) { + return dir < 0 ? range2.from() : range2.to(); + } + var headPos = cursorCoords(this$1$1, range2.head, "div"); + if (range2.goalColumn != null) { + headPos.left = range2.goalColumn; + } + goals.push(headPos.left); + var pos = findPosV(this$1$1, headPos, dir, unit); + if (unit == "page" && range2 == doc2.sel.primary()) { + addToScrollTop(this$1$1, charCoords(this$1$1, pos, "div").top - headPos.top); + } + return pos; + }, sel_move); + if (goals.length) { + for (var i2 = 0; i2 < doc2.sel.ranges.length; i2++) { + doc2.sel.ranges[i2].goalColumn = goals[i2]; + } + } + }), + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc2 = this.doc, line = getLine(doc2, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { + --start; + } else { + ++end; + } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) ? function(ch) { + return isWordChar(ch, helper); + } : /\s/.test(startChar) ? function(ch) { + return /\s/.test(ch); + } : function(ch) { + return !/\s/.test(ch) && !isWordChar(ch); + }; + while (start > 0 && check(line.charAt(start - 1))) { + --start; + } + while (end < line.length && check(line.charAt(end))) { + ++end; + } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)); + }, + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { + return; + } + if (this.state.overwrite = !this.state.overwrite) { + addClass(this.display.cursorDiv, "CodeMirror-overwrite"); + } else { + rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); + } + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { + return this.display.input.getField() == activeElt(root(this)); + }, + isReadOnly: function() { + return !!(this.options.readOnly || this.doc.cantEdit); + }, + scrollTo: methodOp(function(x, y) { + scrollToCoords(this, x, y); + }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return { + left: scroller.scrollLeft, + top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), + clientWidth: displayWidth(this) + }; + }, + scrollIntoView: methodOp(function(range2, margin) { + if (range2 == null) { + range2 = { from: this.doc.sel.primary().head, to: null }; + if (margin == null) { + margin = this.options.cursorScrollMargin; + } + } else if (typeof range2 == "number") { + range2 = { from: Pos(range2, 0), to: null }; + } else if (range2.from == null) { + range2 = { from: range2, to: null }; + } + if (!range2.to) { + range2.to = range2.from; + } + range2.margin = margin || 0; + if (range2.from.line != null) { + scrollToRange(this, range2); + } else { + scrollToCoordsRange(this, range2.from, range2.to, range2.margin); + } + }), + setSize: methodOp(function(width, height) { + var this$1$1 = this; + var interpret = function(val) { + return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; + }; + if (width != null) { + this.display.wrapper.style.width = interpret(width); + } + if (height != null) { + this.display.wrapper.style.height = interpret(height); + } + if (this.options.lineWrapping) { + clearLineMeasurementCache(this); + } + var lineNo2 = this.display.viewFrom; + this.doc.iter(lineNo2, this.display.viewTo, function(line) { + if (line.widgets) { + for (var i2 = 0; i2 < line.widgets.length; i2++) { + if (line.widgets[i2].noHScroll) { + regLineChange(this$1$1, lineNo2, "widget"); + break; + } + } + } + ++lineNo2; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + operation: function(f) { + return runInOp(this, f); + }, + startOperation: function() { + return startOperation(this); + }, + endOperation: function() { + return endOperation(this); + }, + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > 0.5 || this.options.lineWrapping) { + estimateLineHeights(this); + } + signal(this, "refresh", this); + }), + swapDoc: methodOp(function(doc2) { + var old = this.doc; + old.cm = null; + if (this.state.selectingText) { + this.state.selectingText(); + } + attachDoc(this, doc2); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc2.scrollLeft, doc2.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old; + }), + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText; + }, + getInputField: function() { + return this.display.input.getField(); + }, + getWrapperElement: function() { + return this.display.wrapper; + }, + getScrollerElement: function() { + return this.display.scroller; + }, + getGutterElement: function() { + return this.display.gutters; + } + }; + eventMixin(CodeMirror2); + CodeMirror2.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { + helpers[type] = CodeMirror2[type] = { _global: [] }; + } + helpers[type][name] = value; + }; + CodeMirror2.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror2.registerHelper(type, name, value); + helpers[type]._global.push({ pred: predicate, val: value }); + }; + } + function findPosH(doc2, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc2, pos.line); + var lineDir = visually && doc2.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc2.first || l >= doc2.first + doc2.size) { + return false; + } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc2, l); + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 55296 && ch < 56320 : ch >= 56320 && ch < 57343; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc2.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) { + pos = endOfLine(visually, doc2.cm, lineObj, pos.line, lineDir); + } else { + return false; + } + } else { + pos = next; + } + return true; + } + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc2.cm && doc2.cm.getHelper(pos, "wordChars"); + for (var first = true; ; first = false) { + if (dir < 0 && !moveOnce(!first)) { + break; + } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; + if (group && !first && !type) { + type = "s"; + } + if (sawType && sawType != type) { + if (dir < 0) { + dir = 1; + moveOnce(); + pos.sticky = "after"; + } + break; + } + if (type) { + sawType = type; + } + if (dir > 0 && !moveOnce(!first)) { + break; + } + } + } + var result = skipAtomic(doc2, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { + result.hitSide = true; + } + return result; + } + function findPosV(cm, pos, dir, unit) { + var doc2 = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, win(cm).innerHeight || doc2(cm).documentElement.clientHeight); + var moveAmount = Math.max(pageSize - 0.5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (; ; ) { + target = coordsChar(cm, x, y); + if (!target.outside) { + break; + } + if (dir < 0 ? y <= 0 : y >= doc2.height) { + target.hitSide = true; + break; + } + y += dir * 5; + } + return target; + } + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + ContentEditableInput.prototype.init = function(display) { + var this$1$1 = this; + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { + return true; + } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { + break; + } + } + return false; + } + on(div, "paste", function(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { + return; + } + if (ie_version <= 11) { + setTimeout(operation(cm, function() { + return this$1$1.updateFromDOM(); + }), 20); + } + }); + on(div, "compositionstart", function(e) { + this$1$1.composing = { data: e.data, done: false }; + }); + on(div, "compositionupdate", function(e) { + if (!this$1$1.composing) { + this$1$1.composing = { data: e.data, done: false }; + } + }); + on(div, "compositionend", function(e) { + if (this$1$1.composing) { + if (e.data != this$1$1.composing.data) { + this$1$1.readFromDOMSoon(); + } + this$1$1.composing.done = true; + } + }); + on(div, "touchstart", function() { + return input.forceCompositionEnd(); + }); + on(div, "input", function() { + if (!this$1$1.composing) { + this$1$1.readFromDOMSoon(); + } + }); + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { + return; + } + if (cm.somethingSelected()) { + setLastCopied({ lineWise: false, text: cm.getSelections() }); + if (e.type == "cut") { + cm.replaceSelection("", null, "cut"); + } + } else if (!cm.options.lineWiseCopyCut) { + return; + } else { + var ranges = copyableRanges(cm); + setLastCopied({ lineWise: true, text: ranges.text }); + if (e.type == "cut") { + cm.operation(function() { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return; + } + } + var kludge = hiddenTextarea(), te = kludge.firstChild; + disableBrowserMagic(te); + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(rootNode(div)); + selectInput(te); + setTimeout(function() { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { + input.showPrimarySelection(); + } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + ContentEditableInput.prototype.screenReaderLabelChanged = function(label) { + if (label) { + this.div.setAttribute("aria-label", label); + } else { + this.div.removeAttribute("aria-label"); + } + }; + ContentEditableInput.prototype.prepareSelection = function() { + var result = prepareSelection(this.cm, false); + result.focus = activeElt(rootNode(this.div)) == this.div; + return result; + }; + ContentEditableInput.prototype.showSelection = function(info, takeFocus) { + if (!info || !this.cm.display.view.length) { + return; + } + if (info.focus || takeFocus) { + this.showPrimarySelection(); + } + this.showMultipleSelections(info); + }; + ContentEditableInput.prototype.getSelection = function() { + return this.cm.display.wrapper.ownerDocument.getSelection(); + }; + ContentEditableInput.prototype.showPrimarySelection = function() { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return; + } + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && cmp(minPos(curAnchor, curFocus), from) == 0 && cmp(maxPos(curAnchor, curFocus), to) == 0) { + return; + } + var view = cm.display.view; + var start = from.line >= cm.display.viewFrom && posToDOM(cm, from) || { node: view[0].measure.map[2], offset: 0 }; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map2 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = { node: map2[map2.length - 1], offset: map2[map2.length - 2] - map2[map2.length - 3] }; + } + if (!start || !end) { + sel.removeAllRanges(); + return; + } + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { + rng = range(start.node, start.offset, end.offset, end.node); + } catch (e) { + } + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { + sel.addRange(old); + } else if (gecko) { + this.startGracePeriod(); + } + } + this.rememberSelection(); + }; + ContentEditableInput.prototype.startGracePeriod = function() { + var this$1$1 = this; + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function() { + this$1$1.gracePeriod = false; + if (this$1$1.selectionChanged()) { + this$1$1.cm.operation(function() { + return this$1$1.cm.curOp.selectionChanged = true; + }); + } + }, 20); + }; + ContentEditableInput.prototype.showMultipleSelections = function(info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + ContentEditableInput.prototype.rememberSelection = function() { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; + this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; + this.lastFocusOffset = sel.focusOffset; + }; + ContentEditableInput.prototype.selectionInEditor = function() { + var sel = this.getSelection(); + if (!sel.rangeCount) { + return false; + } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node); + }; + ContentEditableInput.prototype.focus = function() { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt(rootNode(this.div)) != this.div) { + this.showSelection(this.prepareSelection(), true); + } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function() { + this.div.blur(); + }; + ContentEditableInput.prototype.getField = function() { + return this.div; + }; + ContentEditableInput.prototype.supportsTouch = function() { + return true; + }; + ContentEditableInput.prototype.receivedFocus = function() { + var this$1$1 = this; + var input = this; + if (this.selectionInEditor()) { + setTimeout(function() { + return this$1$1.pollSelection(); + }, 20); + } else { + runInOp(this.cm, function() { + return input.cm.curOp.selectionChanged = true; + }); + } + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + ContentEditableInput.prototype.selectionChanged = function() { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset; + }; + ContentEditableInput.prototype.pollSelection = function() { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { + return; + } + var sel = this.getSelection(), cm = this.cm; + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({ type: "keydown", keyCode: 8, preventDefault: Math.abs }); + this.blur(); + this.focus(); + return; + } + if (this.composing) { + return; + } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { + runInOp(cm, function() { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { + cm.curOp.selectionChanged = true; + } + }); + } + }; + ContentEditableInput.prototype.pollContent = function() { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) { + from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); + } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) { + to = Pos(to.line + 1, 0); + } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { + return false; + } + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + if (!fromNode) { + return false; + } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { + newText.pop(); + oldText.pop(); + toLine--; + } else if (newText[0] == oldText[0]) { + newText.shift(); + oldText.shift(); + fromLine++; + } else { + break; + } + } + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) { + ++cutFront; + } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min( + newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0) + ); + while (cutEnd < maxCutEnd && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + ++cutEnd; + } + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true; + } + }; + ContentEditableInput.prototype.ensurePolled = function() { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function() { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function() { + if (!this.composing) { + return; + } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function() { + var this$1$1 = this; + if (this.readDOMTimeout != null) { + return; + } + this.readDOMTimeout = setTimeout(function() { + this$1$1.readDOMTimeout = null; + if (this$1$1.composing) { + if (this$1$1.composing.done) { + this$1$1.composing = null; + } else { + return; + } + } + this$1$1.updateFromDOM(); + }, 80); + }; + ContentEditableInput.prototype.updateFromDOM = function() { + var this$1$1 = this; + if (this.cm.isReadOnly() || !this.pollContent()) { + runInOp(this.cm, function() { + return regChange(this$1$1.cm); + }); + } + }; + ContentEditableInput.prototype.setUneditable = function(node) { + node.contentEditable = "false"; + }; + ContentEditableInput.prototype.onKeyPress = function(e) { + if (e.charCode == 0 || this.composing) { + return; + } + e.preventDefault(); + if (!this.cm.isReadOnly()) { + operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); + } + }; + ContentEditableInput.prototype.readOnlyChanged = function(val) { + this.div.contentEditable = String(val != "nocursor"); + }; + ContentEditableInput.prototype.onContextMenu = function() { + }; + ContentEditableInput.prototype.resetPosition = function() { + }; + ContentEditableInput.prototype.needsContentAttribute = true; + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { + return null; + } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result; + } + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) { + if (/CodeMirror-gutter-wrapper/.test(scan.className)) { + return true; + } + } + return false; + } + function badPos(pos, bad) { + if (bad) { + pos.bad = true; + } + return pos; + } + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { + return function(marker) { + return marker.id == id; + }; + } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { + text += lineSep; + } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return; + } + var markerID = node.getAttribute("cm-marker"), range2; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range2 = found[0].find(0))) { + addText(getBetween(cm.doc, range2.from, range2.to).join(lineSep)); + } + return; + } + if (node.getAttribute("contenteditable") == "false") { + return; + } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { + return; + } + if (isBlock) { + close(); + } + for (var i2 = 0; i2 < node.childNodes.length; i2++) { + walk(node.childNodes[i2]); + } + if (/^(pre|p)$/i.test(node.nodeName)) { + extraLinebreak = true; + } + if (isBlock) { + closing = true; + } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (; ; ) { + walk(from); + if (from == to) { + break; + } + from = from.nextSibling; + extraLinebreak = false; + } + return text; + } + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { + return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true); + } + node = null; + offset = 0; + } else { + for (lineNode = node; ; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { + return null; + } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { + break; + } + } + } + for (var i2 = 0; i2 < cm.display.view.length; i2++) { + var lineView = cm.display.view[i2]; + if (lineView.node == lineNode) { + return locateNodeInLineView(lineView, node, offset); + } + } + } + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { + return badPos(Pos(lineNo(lineView.line), 0), true); + } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad); + } + } + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { + offset = textNode.nodeValue.length; + } + } + while (topNode.parentNode != wrapper) { + topNode = topNode.parentNode; + } + var measure = lineView.measure, maps = measure.maps; + function find(textNode2, topNode2, offset2) { + for (var i2 = -1; i2 < (maps ? maps.length : 0); i2++) { + var map2 = i2 < 0 ? measure.map : maps[i2]; + for (var j = 0; j < map2.length; j += 3) { + var curNode = map2[j + 2]; + if (curNode == textNode2 || curNode == topNode2) { + var line2 = lineNo(i2 < 0 ? lineView.line : lineView.rest[i2]); + var ch = map2[j] + offset2; + if (offset2 < 0 || curNode != textNode2) { + ch = map2[j + (offset2 ? 1 : 0)]; + } + return Pos(line2, ch); + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { + return badPos(found, bad); + } + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) { + return badPos(Pos(found.line, found.ch - dist), bad); + } else { + dist += after.textContent.length; + } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) { + return badPos(Pos(found.line, found.ch + dist$1), bad); + } else { + dist$1 += before.textContent.length; + } + } + } + var TextareaInput = function(cm) { + this.cm = cm; + this.prevInput = ""; + this.pollingFast = false; + this.polling = new Delayed(); + this.hasSelection = false; + this.composing = null; + this.resetting = false; + }; + TextareaInput.prototype.init = function(display) { + var this$1$1 = this; + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + if (ios) { + te.style.width = "0px"; + } + on(te, "input", function() { + if (ie && ie_version >= 9 && this$1$1.hasSelection) { + this$1$1.hasSelection = null; + } + input.poll(); + }); + on(te, "paste", function(e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { + return; + } + cm.state.pasteIncoming = +/* @__PURE__ */ new Date(); + input.fastPoll(); + }); + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { + return; + } + if (cm.somethingSelected()) { + setLastCopied({ lineWise: false, text: cm.getSelections() }); + } else if (!cm.options.lineWiseCopyCut) { + return; + } else { + var ranges = copyableRanges(cm); + setLastCopied({ lineWise: true, text: ranges.text }); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { + cm.state.cutIncoming = +/* @__PURE__ */ new Date(); + } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + on(display.scroller, "paste", function(e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { + return; + } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +/* @__PURE__ */ new Date(); + input.focus(); + return; + } + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + on(display.lineSpace, "selectstart", function(e) { + if (!eventInWidget(display, e)) { + e_preventDefault(e); + } + }); + on(te, "compositionstart", function() { + var start = cm.getCursor("from"); + if (input.composing) { + input.composing.range.clear(); + } + input.composing = { + start, + range: cm.markText(start, cm.getCursor("to"), { className: "CodeMirror-composing" }) + }; + }); + on(te, "compositionend", function() { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + TextareaInput.prototype.createField = function(_display) { + this.wrapper = hiddenTextarea(); + this.textarea = this.wrapper.firstChild; + var opts = this.cm.options; + disableBrowserMagic(this.textarea, opts.spellcheck, opts.autocorrect, opts.autocapitalize); + }; + TextareaInput.prototype.screenReaderLabelChanged = function(label) { + if (label) { + this.textarea.setAttribute("aria-label", label); + } else { + this.textarea.removeAttribute("aria-label"); + } + }; + TextareaInput.prototype.prepareSelection = function() { + var cm = this.cm, display = cm.display, doc2 = cm.doc; + var result = prepareSelection(cm); + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc2.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min( + display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top + )); + result.teLeft = Math.max(0, Math.min( + display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left + )); + } + return result; + }; + TextareaInput.prototype.showSelection = function(drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + TextareaInput.prototype.reset = function(typing) { + if (this.contextMenuPending || this.composing && typing) { + return; + } + var cm = this.cm; + this.resetting = true; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { + selectInput(this.textarea); + } + if (ie && ie_version >= 9) { + this.hasSelection = content; + } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { + this.hasSelection = null; + } + } + this.resetting = false; + }; + TextareaInput.prototype.getField = function() { + return this.textarea; + }; + TextareaInput.prototype.supportsTouch = function() { + return false; + }; + TextareaInput.prototype.focus = function() { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt(rootNode(this.textarea)) != this.textarea)) { + try { + this.textarea.focus(); + } catch (e) { + } + } + }; + TextareaInput.prototype.blur = function() { + this.textarea.blur(); + }; + TextareaInput.prototype.resetPosition = function() { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + TextareaInput.prototype.receivedFocus = function() { + this.slowPoll(); + }; + TextareaInput.prototype.slowPoll = function() { + var this$1$1 = this; + if (this.pollingFast) { + return; + } + this.polling.set(this.cm.options.pollInterval, function() { + this$1$1.poll(); + if (this$1$1.cm.state.focused) { + this$1$1.slowPoll(); + } + }); + }; + TextareaInput.prototype.fastPoll = function() { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) { + missed = true; + input.polling.set(60, p); + } else { + input.pollingFast = false; + input.slowPoll(); + } + } + input.polling.set(20, p); + }; + TextareaInput.prototype.poll = function() { + var this$1$1 = this; + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + if (this.contextMenuPending || this.resetting || !cm.state.focused || hasSelection(input) && !prevInput && !this.composing || cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) { + return false; + } + var text = input.value; + if (text == prevInput && !cm.somethingSelected()) { + return false; + } + if (ie && ie_version >= 9 && this.hasSelection === text || mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false; + } + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 8203 && !prevInput) { + prevInput = "​"; + } + if (first == 8666) { + this.reset(); + return this.cm.execCommand("undo"); + } + } + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { + ++same; + } + runInOp(cm, function() { + applyTextInput( + cm, + text.slice(same), + prevInput.length - same, + null, + this$1$1.composing ? "*compose" : null + ); + if (text.length > 1e3 || text.indexOf("\n") > -1) { + input.value = this$1$1.prevInput = ""; + } else { + this$1$1.prevInput = text; + } + if (this$1$1.composing) { + this$1$1.composing.range.clear(); + this$1$1.composing.range = cm.markText( + this$1$1.composing.start, + cm.getCursor("to"), + { className: "CodeMirror-composing" } + ); + } + }); + return true; + }; + TextareaInput.prototype.ensurePolled = function() { + if (this.pollingFast && this.poll()) { + this.pollingFast = false; + } + }; + TextareaInput.prototype.onKeyPress = function() { + if (ie && ie_version >= 9) { + this.hasSelection = null; + } + this.fastPoll(); + }; + TextareaInput.prototype.onContextMenu = function(e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { + input.contextMenuPending(); + } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { + return; + } + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) { + operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); + } + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { + oldScrollY = te.ownerDocument.defaultView.scrollY; + } + display.input.focus(); + if (webkit) { + te.ownerDocument.defaultView.scrollTo(null, oldScrollY); + } + display.input.reset(); + if (!cm.somethingSelected()) { + te.value = input.prevInput = " "; + } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "​" + (selected ? te.value : ""); + te.value = "⇚"; + te.value = extval; + input.prevInput = selected ? "" : "​"; + te.selectionStart = 1; + te.selectionEnd = extval.length; + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { + return; + } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { + display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); + } + if (te.selectionStart != null) { + if (!ie || ie && ie_version < 9) { + prepareSelectAllHack(); + } + var i2 = 0, poll = function() { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && te.selectionEnd > 0 && input.prevInput == "​") { + operation(cm, selectAll)(cm); + } else if (i2++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + if (ie && ie_version >= 9) { + prepareSelectAllHack(); + } + if (captureRightClick) { + e_stop(e); + var mouseup = function() { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + TextareaInput.prototype.readOnlyChanged = function(val) { + if (!val) { + this.reset(); + } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + TextareaInput.prototype.setUneditable = function() { + }; + TextareaInput.prototype.needsContentAttribute = false; + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) { + options.tabindex = textarea.tabIndex; + } + if (!options.placeholder && textarea.placeholder) { + options.placeholder = textarea.placeholder; + } + if (options.autofocus == null) { + var hasFocus = activeElt(rootNode(textarea)); + options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + function save() { + textarea.value = cm.getValue(); + } + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function() { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch (e) { + } + } + } + options.finishInit = function(cm2) { + cm2.save = save; + cm2.getTextArea = function() { + return textarea; + }; + cm2.toTextArea = function() { + cm2.toTextArea = isNaN; + save(); + textarea.parentNode.removeChild(cm2.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") { + textarea.form.submit = realSubmit; + } + } + }; + }; + textarea.style.display = "none"; + var cm = CodeMirror( + function(node) { + return textarea.parentNode.insertBefore(node, textarea.nextSibling); + }, + options + ); + return cm; + } + function addLegacyProps(CodeMirror2) { + CodeMirror2.off = off; + CodeMirror2.on = on; + CodeMirror2.wheelEventPixels = wheelEventPixels; + CodeMirror2.Doc = Doc; + CodeMirror2.splitLines = splitLinesAuto; + CodeMirror2.countColumn = countColumn; + CodeMirror2.findColumn = findColumn; + CodeMirror2.isWordChar = isWordCharBasic; + CodeMirror2.Pass = Pass; + CodeMirror2.signal = signal; + CodeMirror2.Line = Line; + CodeMirror2.changeEnd = changeEnd; + CodeMirror2.scrollbarModel = scrollbarModel; + CodeMirror2.Pos = Pos; + CodeMirror2.cmpPos = cmp; + CodeMirror2.modes = modes; + CodeMirror2.mimeModes = mimeModes; + CodeMirror2.resolveMode = resolveMode; + CodeMirror2.getMode = getMode; + CodeMirror2.modeExtensions = modeExtensions; + CodeMirror2.extendMode = extendMode; + CodeMirror2.copyState = copyState; + CodeMirror2.startState = startState; + CodeMirror2.innerMode = innerMode; + CodeMirror2.commands = commands; + CodeMirror2.keyMap = keyMap; + CodeMirror2.keyName = keyName; + CodeMirror2.isModifierKey = isModifierKey; + CodeMirror2.lookupKey = lookupKey; + CodeMirror2.normalizeKeyMap = normalizeKeyMap; + CodeMirror2.StringStream = StringStream; + CodeMirror2.SharedTextMarker = SharedTextMarker; + CodeMirror2.TextMarker = TextMarker; + CodeMirror2.LineWidget = LineWidget; + CodeMirror2.e_preventDefault = e_preventDefault; + CodeMirror2.e_stopPropagation = e_stopPropagation; + CodeMirror2.e_stop = e_stop; + CodeMirror2.addClass = addClass; + CodeMirror2.contains = contains; + CodeMirror2.rmClass = rmClass; + CodeMirror2.keyNames = keyNames; + } + defineOptions(CodeMirror); + addEditorMethods(CodeMirror); + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { + if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) { + CodeMirror.prototype[prop] = /* @__PURE__ */ function(method) { + return function() { + return method.apply(this.doc, arguments); + }; + }(Doc.prototype[prop]); + } + } + eventMixin(Doc); + CodeMirror.inputStyles = { "textarea": TextareaInput, "contenteditable": ContentEditableInput }; + CodeMirror.defineMode = function(name) { + if (!CodeMirror.defaults.mode && name != "null") { + CodeMirror.defaults.mode = name; + } + defineMode.apply(this, arguments); + }; + CodeMirror.defineMIME = defineMIME; + CodeMirror.defineMode("null", function() { + return { token: function(stream) { + return stream.skipToEnd(); + } }; + }); + CodeMirror.defineMIME("text/plain", "null"); + CodeMirror.defineExtension = function(name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function(name, func) { + Doc.prototype[name] = func; + }; + CodeMirror.fromTextArea = fromTextArea; + addLegacyProps(CodeMirror); + CodeMirror.version = "5.65.18"; + return CodeMirror; + }); + })(codemirror$2); + return codemirror$2.exports; +} +var codemirrorExports = requireCodemirror(); +const codemirror = /* @__PURE__ */ getDefaultExportFromCjs(codemirrorExports); +var css = { exports: {} }; +var hasRequiredCss; +function requireCss() { + if (hasRequiredCss) return css.exports; + hasRequiredCss = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + CodeMirror.defineMode("css", function(config, parserConfig) { + var inline = parserConfig.inline; + if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); + var indentUnit = config.indentUnit, tokenHooks = parserConfig.tokenHooks, documentTypes2 = parserConfig.documentTypes || {}, mediaTypes2 = parserConfig.mediaTypes || {}, mediaFeatures2 = parserConfig.mediaFeatures || {}, mediaValueKeywords2 = parserConfig.mediaValueKeywords || {}, propertyKeywords2 = parserConfig.propertyKeywords || {}, nonStandardPropertyKeywords2 = parserConfig.nonStandardPropertyKeywords || {}, fontProperties2 = parserConfig.fontProperties || {}, counterDescriptors2 = parserConfig.counterDescriptors || {}, colorKeywords2 = parserConfig.colorKeywords || {}, valueKeywords2 = parserConfig.valueKeywords || {}, allowNested = parserConfig.allowNested, lineComment = parserConfig.lineComment, supportsAtComponent = parserConfig.supportsAtComponent === true, highlightNonStandardPropertyKeywords = config.highlightNonStandardPropertyKeywords !== false; + var type, override; + function ret(style, tp) { + type = tp; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (tokenHooks[ch]) { + var result = tokenHooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == "@") { + stream.eatWhile(/[\w\\\-]/); + return ret("def", stream.current()); + } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { + return ret(null, "compare"); + } else if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "#") { + stream.eatWhile(/[\w\\\-]/); + return ret("atom", "hash"); + } else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (ch === "-") { + if (/[\d.]/.test(stream.peek())) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (stream.match(/^-[\w\\\-]*/)) { + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ret("variable-2", "variable-definition"); + return ret("variable-2", "variable"); + } else if (stream.match(/^\w+-/)) { + return ret("meta", "meta"); + } + } else if (/[,+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { + return ret("qualifier", "qualifier"); + } else if (/[:;{}\[\]\(\)]/.test(ch)) { + return ret(null, ch); + } else if (stream.match(/^[\w-.]+(?=\()/)) { + if (/^(url(-prefix)?|domain|regexp)$/i.test(stream.current())) { + state.tokenize = tokenParenthesized; + } + return ret("variable callee", "variable"); + } else if (/[\w\\\-]/.test(ch)) { + stream.eatWhile(/[\w\\\-]/); + return ret("property", "word"); + } else { + return ret(null, null); + } + } + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + if (quote == ")") stream.backUp(1); + break; + } + escaped = !escaped && ch == "\\"; + } + if (ch == quote || !escaped && quote != ")") state.tokenize = null; + return ret("string", "string"); + }; + } + function tokenParenthesized(stream, state) { + stream.next(); + if (!stream.match(/^\s*[\"\')]/, false)) + state.tokenize = tokenString(")"); + else + state.tokenize = null; + return ret(null, "("); + } + function Context(type2, indent, prev) { + this.type = type2; + this.indent = indent; + this.prev = prev; + } + function pushContext(state, stream, type2, indent) { + state.context = new Context(type2, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); + return type2; + } + function popContext(state) { + if (state.context.prev) + state.context = state.context.prev; + return state.context.type; + } + function pass(type2, stream, state) { + return states[state.context.type](type2, stream, state); + } + function popAndPass(type2, stream, state, n) { + for (var i = n || 1; i > 0; i--) + state.context = state.context.prev; + return pass(type2, stream, state); + } + function wordAsValue(stream) { + var word = stream.current().toLowerCase(); + if (valueKeywords2.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords2.hasOwnProperty(word)) + override = "keyword"; + else + override = "variable"; + } + var states = {}; + states.top = function(type2, stream, state) { + if (type2 == "{") { + return pushContext(state, stream, "block"); + } else if (type2 == "}" && state.context.prev) { + return popContext(state); + } else if (supportsAtComponent && /@component/i.test(type2)) { + return pushContext(state, stream, "atComponentBlock"); + } else if (/^@(-moz-)?document$/i.test(type2)) { + return pushContext(state, stream, "documentTypes"); + } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type2)) { + return pushContext(state, stream, "atBlock"); + } else if (/^@(font-face|counter-style)/i.test(type2)) { + state.stateArg = type2; + return "restricted_atBlock_before"; + } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type2)) { + return "keyframes"; + } else if (type2 && type2.charAt(0) == "@") { + return pushContext(state, stream, "at"); + } else if (type2 == "hash") { + override = "builtin"; + } else if (type2 == "word") { + override = "tag"; + } else if (type2 == "variable-definition") { + return "maybeprop"; + } else if (type2 == "interpolation") { + return pushContext(state, stream, "interpolation"); + } else if (type2 == ":") { + return "pseudo"; + } else if (allowNested && type2 == "(") { + return pushContext(state, stream, "parens"); + } + return state.context.type; + }; + states.block = function(type2, stream, state) { + if (type2 == "word") { + var word = stream.current().toLowerCase(); + if (propertyKeywords2.hasOwnProperty(word)) { + override = "property"; + return "maybeprop"; + } else if (nonStandardPropertyKeywords2.hasOwnProperty(word)) { + override = highlightNonStandardPropertyKeywords ? "string-2" : "property"; + return "maybeprop"; + } else if (allowNested) { + override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; + return "block"; + } else { + override += " error"; + return "maybeprop"; + } + } else if (type2 == "meta") { + return "block"; + } else if (!allowNested && (type2 == "hash" || type2 == "qualifier")) { + override = "error"; + return "block"; + } else { + return states.top(type2, stream, state); + } + }; + states.maybeprop = function(type2, stream, state) { + if (type2 == ":") return pushContext(state, stream, "prop"); + return pass(type2, stream, state); + }; + states.prop = function(type2, stream, state) { + if (type2 == ";") return popContext(state); + if (type2 == "{" && allowNested) return pushContext(state, stream, "propBlock"); + if (type2 == "}" || type2 == "{") return popAndPass(type2, stream, state); + if (type2 == "(") return pushContext(state, stream, "parens"); + if (type2 == "hash" && !/^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(stream.current())) { + override += " error"; + } else if (type2 == "word") { + wordAsValue(stream); + } else if (type2 == "interpolation") { + return pushContext(state, stream, "interpolation"); + } + return "prop"; + }; + states.propBlock = function(type2, _stream, state) { + if (type2 == "}") return popContext(state); + if (type2 == "word") { + override = "property"; + return "maybeprop"; + } + return state.context.type; + }; + states.parens = function(type2, stream, state) { + if (type2 == "{" || type2 == "}") return popAndPass(type2, stream, state); + if (type2 == ")") return popContext(state); + if (type2 == "(") return pushContext(state, stream, "parens"); + if (type2 == "interpolation") return pushContext(state, stream, "interpolation"); + if (type2 == "word") wordAsValue(stream); + return "parens"; + }; + states.pseudo = function(type2, stream, state) { + if (type2 == "meta") return "pseudo"; + if (type2 == "word") { + override = "variable-3"; + return state.context.type; + } + return pass(type2, stream, state); + }; + states.documentTypes = function(type2, stream, state) { + if (type2 == "word" && documentTypes2.hasOwnProperty(stream.current())) { + override = "tag"; + return state.context.type; + } else { + return states.atBlock(type2, stream, state); + } + }; + states.atBlock = function(type2, stream, state) { + if (type2 == "(") return pushContext(state, stream, "atBlock_parens"); + if (type2 == "}" || type2 == ";") return popAndPass(type2, stream, state); + if (type2 == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); + if (type2 == "interpolation") return pushContext(state, stream, "interpolation"); + if (type2 == "word") { + var word = stream.current().toLowerCase(); + if (word == "only" || word == "not" || word == "and" || word == "or") + override = "keyword"; + else if (mediaTypes2.hasOwnProperty(word)) + override = "attribute"; + else if (mediaFeatures2.hasOwnProperty(word)) + override = "property"; + else if (mediaValueKeywords2.hasOwnProperty(word)) + override = "keyword"; + else if (propertyKeywords2.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords2.hasOwnProperty(word)) + override = highlightNonStandardPropertyKeywords ? "string-2" : "property"; + else if (valueKeywords2.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords2.hasOwnProperty(word)) + override = "keyword"; + else + override = "error"; + } + return state.context.type; + }; + states.atComponentBlock = function(type2, stream, state) { + if (type2 == "}") + return popAndPass(type2, stream, state); + if (type2 == "{") + return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); + if (type2 == "word") + override = "error"; + return state.context.type; + }; + states.atBlock_parens = function(type2, stream, state) { + if (type2 == ")") return popContext(state); + if (type2 == "{" || type2 == "}") return popAndPass(type2, stream, state, 2); + return states.atBlock(type2, stream, state); + }; + states.restricted_atBlock_before = function(type2, stream, state) { + if (type2 == "{") + return pushContext(state, stream, "restricted_atBlock"); + if (type2 == "word" && state.stateArg == "@counter-style") { + override = "variable"; + return "restricted_atBlock_before"; + } + return pass(type2, stream, state); + }; + states.restricted_atBlock = function(type2, stream, state) { + if (type2 == "}") { + state.stateArg = null; + return popContext(state); + } + if (type2 == "word") { + if (state.stateArg == "@font-face" && !fontProperties2.hasOwnProperty(stream.current().toLowerCase()) || state.stateArg == "@counter-style" && !counterDescriptors2.hasOwnProperty(stream.current().toLowerCase())) + override = "error"; + else + override = "property"; + return "maybeprop"; + } + return "restricted_atBlock"; + }; + states.keyframes = function(type2, stream, state) { + if (type2 == "word") { + override = "variable"; + return "keyframes"; + } + if (type2 == "{") return pushContext(state, stream, "top"); + return pass(type2, stream, state); + }; + states.at = function(type2, stream, state) { + if (type2 == ";") return popContext(state); + if (type2 == "{" || type2 == "}") return popAndPass(type2, stream, state); + if (type2 == "word") override = "tag"; + else if (type2 == "hash") override = "builtin"; + return "at"; + }; + states.interpolation = function(type2, stream, state) { + if (type2 == "}") return popContext(state); + if (type2 == "{" || type2 == ";") return popAndPass(type2, stream, state); + if (type2 == "word") override = "variable"; + else if (type2 != "variable" && type2 != "(" && type2 != ")") override = "error"; + return "interpolation"; + }; + return { + startState: function(base) { + return { + tokenize: null, + state: inline ? "block" : "top", + stateArg: null, + context: new Context(inline ? "block" : "top", base || 0, null) + }; + }, + token: function(stream, state) { + if (!state.tokenize && stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style && typeof style == "object") { + type = style[1]; + style = style[0]; + } + override = style; + if (type != "comment") + state.state = states[state.state](type, stream, state); + return override; + }, + indent: function(state, textAfter) { + var cx = state.context, ch = textAfter && textAfter.charAt(0); + var indent = cx.indent; + if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; + if (cx.prev) { + if (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "restricted_atBlock")) { + cx = cx.prev; + indent = cx.indent; + } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { + indent = Math.max(0, cx.indent - indentUnit); + } + } + return indent; + }, + electricChars: "}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment, + fold: "brace" + }; + }); + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i].toLowerCase()] = true; + } + return keys; + } + var documentTypes_ = [ + "domain", + "regexp", + "url", + "url-prefix" + ], documentTypes = keySet(documentTypes_); + var mediaTypes_ = [ + "all", + "aural", + "braille", + "handheld", + "print", + "projection", + "screen", + "tty", + "tv", + "embossed" + ], mediaTypes = keySet(mediaTypes_); + var mediaFeatures_ = [ + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "device-width", + "min-device-width", + "max-device-width", + "device-height", + "min-device-height", + "max-device-height", + "aspect-ratio", + "min-aspect-ratio", + "max-aspect-ratio", + "device-aspect-ratio", + "min-device-aspect-ratio", + "max-device-aspect-ratio", + "color", + "min-color", + "max-color", + "color-index", + "min-color-index", + "max-color-index", + "monochrome", + "min-monochrome", + "max-monochrome", + "resolution", + "min-resolution", + "max-resolution", + "scan", + "grid", + "orientation", + "device-pixel-ratio", + "min-device-pixel-ratio", + "max-device-pixel-ratio", + "pointer", + "any-pointer", + "hover", + "any-hover", + "prefers-color-scheme", + "dynamic-range", + "video-dynamic-range" + ], mediaFeatures = keySet(mediaFeatures_); + var mediaValueKeywords_ = [ + "landscape", + "portrait", + "none", + "coarse", + "fine", + "on-demand", + "hover", + "interlace", + "progressive", + "dark", + "light", + "standard", + "high" + ], mediaValueKeywords = keySet(mediaValueKeywords_); + var propertyKeywords_ = [ + "align-content", + "align-items", + "align-self", + "alignment-adjust", + "alignment-baseline", + "all", + "anchor-point", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "appearance", + "azimuth", + "backdrop-filter", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-position-x", + "background-position-y", + "background-repeat", + "background-size", + "baseline-shift", + "binding", + "bleed", + "block-size", + "bookmark-label", + "bookmark-level", + "bookmark-state", + "bookmark-target", + "border", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-decoration-break", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "caption-side", + "caret-color", + "clear", + "clip", + "color", + "color-profile", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "contain", + "content", + "counter-increment", + "counter-reset", + "crop", + "cue", + "cue-after", + "cue-before", + "cursor", + "direction", + "display", + "dominant-baseline", + "drop-initial-after-adjust", + "drop-initial-after-align", + "drop-initial-before-adjust", + "drop-initial-before-align", + "drop-initial-size", + "drop-initial-value", + "elevation", + "empty-cells", + "fit", + "fit-content", + "fit-position", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "float-offset", + "flow-from", + "flow-into", + "font", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-optical-sizing", + "font-size", + "font-size-adjust", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-alternates", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "gap", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-gap", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-gap", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "hanging-punctuation", + "height", + "hyphens", + "icon", + "image-orientation", + "image-rendering", + "image-resolution", + "inline-box-align", + "inset", + "inset-block", + "inset-block-end", + "inset-block-start", + "inset-inline", + "inset-inline-end", + "inset-inline-start", + "isolation", + "justify-content", + "justify-items", + "justify-self", + "left", + "letter-spacing", + "line-break", + "line-height", + "line-height-step", + "line-stacking", + "line-stacking-ruby", + "line-stacking-shift", + "line-stacking-strategy", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-bottom", + "margin-left", + "margin-right", + "margin-top", + "marks", + "marquee-direction", + "marquee-loop", + "marquee-play-count", + "marquee-speed", + "marquee-style", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-repeat", + "mask-size", + "mask-type", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "move-to", + "nav-down", + "nav-index", + "nav-left", + "nav-right", + "nav-up", + "object-fit", + "object-position", + "offset", + "offset-anchor", + "offset-distance", + "offset-path", + "offset-position", + "offset-rotate", + "opacity", + "order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-style", + "overflow-wrap", + "overflow-x", + "overflow-y", + "padding", + "padding-bottom", + "padding-left", + "padding-right", + "padding-top", + "page", + "page-break-after", + "page-break-before", + "page-break-inside", + "page-policy", + "pause", + "pause-after", + "pause-before", + "perspective", + "perspective-origin", + "pitch", + "pitch-range", + "place-content", + "place-items", + "place-self", + "play-during", + "position", + "presentation-level", + "punctuation-trim", + "quotes", + "region-break-after", + "region-break-before", + "region-break-inside", + "region-fragment", + "rendering-intent", + "resize", + "rest", + "rest-after", + "rest-before", + "richness", + "right", + "rotate", + "rotation", + "rotation-point", + "row-gap", + "ruby-align", + "ruby-overhang", + "ruby-position", + "ruby-span", + "scale", + "scroll-behavior", + "scroll-margin", + "scroll-margin-block", + "scroll-margin-block-end", + "scroll-margin-block-start", + "scroll-margin-bottom", + "scroll-margin-inline", + "scroll-margin-inline-end", + "scroll-margin-inline-start", + "scroll-margin-left", + "scroll-margin-right", + "scroll-margin-top", + "scroll-padding", + "scroll-padding-block", + "scroll-padding-block-end", + "scroll-padding-block-start", + "scroll-padding-bottom", + "scroll-padding-inline", + "scroll-padding-inline-end", + "scroll-padding-inline-start", + "scroll-padding-left", + "scroll-padding-right", + "scroll-padding-top", + "scroll-snap-align", + "scroll-snap-type", + "shape-image-threshold", + "shape-inside", + "shape-margin", + "shape-outside", + "size", + "speak", + "speak-as", + "speak-header", + "speak-numeral", + "speak-punctuation", + "speech-rate", + "stress", + "string-set", + "tab-size", + "table-layout", + "target", + "target-name", + "target-new", + "target-position", + "text-align", + "text-align-last", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-skip", + "text-decoration-skip-ink", + "text-decoration-style", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-height", + "text-indent", + "text-justify", + "text-orientation", + "text-outline", + "text-overflow", + "text-rendering", + "text-shadow", + "text-size-adjust", + "text-space-collapse", + "text-transform", + "text-underline-position", + "text-wrap", + "top", + "touch-action", + "transform", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "translate", + "unicode-bidi", + "user-select", + "vertical-align", + "visibility", + "voice-balance", + "voice-duration", + "voice-family", + "voice-pitch", + "voice-range", + "voice-rate", + "voice-stress", + "voice-volume", + "volume", + "white-space", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "z-index", + // SVG-specific + "clip-path", + "clip-rule", + "mask", + "enable-background", + "filter", + "flood-color", + "flood-opacity", + "lighting-color", + "stop-color", + "stop-opacity", + "pointer-events", + "color-interpolation", + "color-interpolation-filters", + "color-rendering", + "fill", + "fill-opacity", + "fill-rule", + "image-rendering", + "marker", + "marker-end", + "marker-mid", + "marker-start", + "paint-order", + "shape-rendering", + "stroke", + "stroke-dasharray", + "stroke-dashoffset", + "stroke-linecap", + "stroke-linejoin", + "stroke-miterlimit", + "stroke-opacity", + "stroke-width", + "text-rendering", + "baseline-shift", + "dominant-baseline", + "glyph-orientation-horizontal", + "glyph-orientation-vertical", + "text-anchor", + "writing-mode" + ], propertyKeywords = keySet(propertyKeywords_); + var nonStandardPropertyKeywords_ = [ + "accent-color", + "aspect-ratio", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-block-style", + "border-block-width", + "border-inline", + "border-inline-color", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "content-visibility", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "overflow-anchor", + "overscroll-behavior", + "padding-block", + "padding-block-end", + "padding-block-start", + "padding-inline", + "padding-inline-end", + "padding-inline-start", + "scroll-snap-stop", + "scrollbar-3d-light-color", + "scrollbar-arrow-color", + "scrollbar-base-color", + "scrollbar-dark-shadow-color", + "scrollbar-face-color", + "scrollbar-highlight-color", + "scrollbar-shadow-color", + "scrollbar-track-color", + "searchfield-cancel-button", + "searchfield-decoration", + "searchfield-results-button", + "searchfield-results-decoration", + "shape-inside", + "zoom" + ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); + var fontProperties_ = [ + "font-display", + "font-family", + "src", + "unicode-range", + "font-variant", + "font-feature-settings", + "font-stretch", + "font-weight", + "font-style" + ], fontProperties = keySet(fontProperties_); + var counterDescriptors_ = [ + "additive-symbols", + "fallback", + "negative", + "pad", + "prefix", + "range", + "speak-as", + "suffix", + "symbols", + "system" + ], counterDescriptors = keySet(counterDescriptors_); + var colorKeywords_ = [ + "aliceblue", + "antiquewhite", + "aqua", + "aquamarine", + "azure", + "beige", + "bisque", + "black", + "blanchedalmond", + "blue", + "blueviolet", + "brown", + "burlywood", + "cadetblue", + "chartreuse", + "chocolate", + "coral", + "cornflowerblue", + "cornsilk", + "crimson", + "cyan", + "darkblue", + "darkcyan", + "darkgoldenrod", + "darkgray", + "darkgreen", + "darkgrey", + "darkkhaki", + "darkmagenta", + "darkolivegreen", + "darkorange", + "darkorchid", + "darkred", + "darksalmon", + "darkseagreen", + "darkslateblue", + "darkslategray", + "darkslategrey", + "darkturquoise", + "darkviolet", + "deeppink", + "deepskyblue", + "dimgray", + "dimgrey", + "dodgerblue", + "firebrick", + "floralwhite", + "forestgreen", + "fuchsia", + "gainsboro", + "ghostwhite", + "gold", + "goldenrod", + "gray", + "grey", + "green", + "greenyellow", + "honeydew", + "hotpink", + "indianred", + "indigo", + "ivory", + "khaki", + "lavender", + "lavenderblush", + "lawngreen", + "lemonchiffon", + "lightblue", + "lightcoral", + "lightcyan", + "lightgoldenrodyellow", + "lightgray", + "lightgreen", + "lightgrey", + "lightpink", + "lightsalmon", + "lightseagreen", + "lightskyblue", + "lightslategray", + "lightslategrey", + "lightsteelblue", + "lightyellow", + "lime", + "limegreen", + "linen", + "magenta", + "maroon", + "mediumaquamarine", + "mediumblue", + "mediumorchid", + "mediumpurple", + "mediumseagreen", + "mediumslateblue", + "mediumspringgreen", + "mediumturquoise", + "mediumvioletred", + "midnightblue", + "mintcream", + "mistyrose", + "moccasin", + "navajowhite", + "navy", + "oldlace", + "olive", + "olivedrab", + "orange", + "orangered", + "orchid", + "palegoldenrod", + "palegreen", + "paleturquoise", + "palevioletred", + "papayawhip", + "peachpuff", + "peru", + "pink", + "plum", + "powderblue", + "purple", + "rebeccapurple", + "red", + "rosybrown", + "royalblue", + "saddlebrown", + "salmon", + "sandybrown", + "seagreen", + "seashell", + "sienna", + "silver", + "skyblue", + "slateblue", + "slategray", + "slategrey", + "snow", + "springgreen", + "steelblue", + "tan", + "teal", + "thistle", + "tomato", + "turquoise", + "violet", + "wheat", + "white", + "whitesmoke", + "yellow", + "yellowgreen" + ], colorKeywords = keySet(colorKeywords_); + var valueKeywords_ = [ + "above", + "absolute", + "activeborder", + "additive", + "activecaption", + "afar", + "after-white-space", + "ahead", + "alias", + "all", + "all-scroll", + "alphabetic", + "alternate", + "always", + "amharic", + "amharic-abegede", + "antialiased", + "appworkspace", + "arabic-indic", + "armenian", + "asterisks", + "attr", + "auto", + "auto-flow", + "avoid", + "avoid-column", + "avoid-page", + "avoid-region", + "axis-pan", + "background", + "backwards", + "baseline", + "below", + "bidi-override", + "binary", + "bengali", + "blink", + "block", + "block-axis", + "blur", + "bold", + "bolder", + "border", + "border-box", + "both", + "bottom", + "break", + "break-all", + "break-word", + "brightness", + "bullets", + "button", + "buttonface", + "buttonhighlight", + "buttonshadow", + "buttontext", + "calc", + "cambodian", + "capitalize", + "caps-lock-indicator", + "caption", + "captiontext", + "caret", + "cell", + "center", + "checkbox", + "circle", + "cjk-decimal", + "cjk-earthly-branch", + "cjk-heavenly-stem", + "cjk-ideographic", + "clear", + "clip", + "close-quote", + "col-resize", + "collapse", + "color", + "color-burn", + "color-dodge", + "column", + "column-reverse", + "compact", + "condensed", + "conic-gradient", + "contain", + "content", + "contents", + "content-box", + "context-menu", + "continuous", + "contrast", + "copy", + "counter", + "counters", + "cover", + "crop", + "cross", + "crosshair", + "cubic-bezier", + "currentcolor", + "cursive", + "cyclic", + "darken", + "dashed", + "decimal", + "decimal-leading-zero", + "default", + "default-button", + "dense", + "destination-atop", + "destination-in", + "destination-out", + "destination-over", + "devanagari", + "difference", + "disc", + "discard", + "disclosure-closed", + "disclosure-open", + "document", + "dot-dash", + "dot-dot-dash", + "dotted", + "double", + "down", + "drop-shadow", + "e-resize", + "ease", + "ease-in", + "ease-in-out", + "ease-out", + "element", + "ellipse", + "ellipsis", + "embed", + "end", + "ethiopic", + "ethiopic-abegede", + "ethiopic-abegede-am-et", + "ethiopic-abegede-gez", + "ethiopic-abegede-ti-er", + "ethiopic-abegede-ti-et", + "ethiopic-halehame-aa-er", + "ethiopic-halehame-aa-et", + "ethiopic-halehame-am-et", + "ethiopic-halehame-gez", + "ethiopic-halehame-om-et", + "ethiopic-halehame-sid-et", + "ethiopic-halehame-so-et", + "ethiopic-halehame-ti-er", + "ethiopic-halehame-ti-et", + "ethiopic-halehame-tig", + "ethiopic-numeric", + "ew-resize", + "exclusion", + "expanded", + "extends", + "extra-condensed", + "extra-expanded", + "fantasy", + "fast", + "fill", + "fill-box", + "fixed", + "flat", + "flex", + "flex-end", + "flex-start", + "footnotes", + "forwards", + "from", + "geometricPrecision", + "georgian", + "grayscale", + "graytext", + "grid", + "groove", + "gujarati", + "gurmukhi", + "hand", + "hangul", + "hangul-consonant", + "hard-light", + "hebrew", + "help", + "hidden", + "hide", + "higher", + "highlight", + "highlighttext", + "hiragana", + "hiragana-iroha", + "horizontal", + "hsl", + "hsla", + "hue", + "hue-rotate", + "icon", + "ignore", + "inactiveborder", + "inactivecaption", + "inactivecaptiontext", + "infinite", + "infobackground", + "infotext", + "inherit", + "initial", + "inline", + "inline-axis", + "inline-block", + "inline-flex", + "inline-grid", + "inline-table", + "inset", + "inside", + "intrinsic", + "invert", + "italic", + "japanese-formal", + "japanese-informal", + "justify", + "kannada", + "katakana", + "katakana-iroha", + "keep-all", + "khmer", + "korean-hangul-formal", + "korean-hanja-formal", + "korean-hanja-informal", + "landscape", + "lao", + "large", + "larger", + "left", + "level", + "lighter", + "lighten", + "line-through", + "linear", + "linear-gradient", + "lines", + "list-item", + "listbox", + "listitem", + "local", + "logical", + "loud", + "lower", + "lower-alpha", + "lower-armenian", + "lower-greek", + "lower-hexadecimal", + "lower-latin", + "lower-norwegian", + "lower-roman", + "lowercase", + "ltr", + "luminosity", + "malayalam", + "manipulation", + "match", + "matrix", + "matrix3d", + "media-play-button", + "media-slider", + "media-sliderthumb", + "media-volume-slider", + "media-volume-sliderthumb", + "medium", + "menu", + "menulist", + "menulist-button", + "menutext", + "message-box", + "middle", + "min-intrinsic", + "mix", + "mongolian", + "monospace", + "move", + "multiple", + "multiple_mask_images", + "multiply", + "myanmar", + "n-resize", + "narrower", + "ne-resize", + "nesw-resize", + "no-close-quote", + "no-drop", + "no-open-quote", + "no-repeat", + "none", + "normal", + "not-allowed", + "nowrap", + "ns-resize", + "numbers", + "numeric", + "nw-resize", + "nwse-resize", + "oblique", + "octal", + "opacity", + "open-quote", + "optimizeLegibility", + "optimizeSpeed", + "oriya", + "oromo", + "outset", + "outside", + "outside-shape", + "overlay", + "overline", + "padding", + "padding-box", + "painted", + "page", + "paused", + "persian", + "perspective", + "pinch-zoom", + "plus-darker", + "plus-lighter", + "pointer", + "polygon", + "portrait", + "pre", + "pre-line", + "pre-wrap", + "preserve-3d", + "progress", + "push-button", + "radial-gradient", + "radio", + "read-only", + "read-write", + "read-write-plaintext-only", + "rectangle", + "region", + "relative", + "repeat", + "repeating-linear-gradient", + "repeating-radial-gradient", + "repeating-conic-gradient", + "repeat-x", + "repeat-y", + "reset", + "reverse", + "rgb", + "rgba", + "ridge", + "right", + "rotate", + "rotate3d", + "rotateX", + "rotateY", + "rotateZ", + "round", + "row", + "row-resize", + "row-reverse", + "rtl", + "run-in", + "running", + "s-resize", + "sans-serif", + "saturate", + "saturation", + "scale", + "scale3d", + "scaleX", + "scaleY", + "scaleZ", + "screen", + "scroll", + "scrollbar", + "scroll-position", + "se-resize", + "searchfield", + "searchfield-cancel-button", + "searchfield-decoration", + "searchfield-results-button", + "searchfield-results-decoration", + "self-start", + "self-end", + "semi-condensed", + "semi-expanded", + "separate", + "sepia", + "serif", + "show", + "sidama", + "simp-chinese-formal", + "simp-chinese-informal", + "single", + "skew", + "skewX", + "skewY", + "skip-white-space", + "slide", + "slider-horizontal", + "slider-vertical", + "sliderthumb-horizontal", + "sliderthumb-vertical", + "slow", + "small", + "small-caps", + "small-caption", + "smaller", + "soft-light", + "solid", + "somali", + "source-atop", + "source-in", + "source-out", + "source-over", + "space", + "space-around", + "space-between", + "space-evenly", + "spell-out", + "square", + "square-button", + "start", + "static", + "status-bar", + "stretch", + "stroke", + "stroke-box", + "sub", + "subpixel-antialiased", + "svg_masks", + "super", + "sw-resize", + "symbolic", + "symbols", + "system-ui", + "table", + "table-caption", + "table-cell", + "table-column", + "table-column-group", + "table-footer-group", + "table-header-group", + "table-row", + "table-row-group", + "tamil", + "telugu", + "text", + "text-bottom", + "text-top", + "textarea", + "textfield", + "thai", + "thick", + "thin", + "threeddarkshadow", + "threedface", + "threedhighlight", + "threedlightshadow", + "threedshadow", + "tibetan", + "tigre", + "tigrinya-er", + "tigrinya-er-abegede", + "tigrinya-et", + "tigrinya-et-abegede", + "to", + "top", + "trad-chinese-formal", + "trad-chinese-informal", + "transform", + "translate", + "translate3d", + "translateX", + "translateY", + "translateZ", + "transparent", + "ultra-condensed", + "ultra-expanded", + "underline", + "unidirectional-pan", + "unset", + "up", + "upper-alpha", + "upper-armenian", + "upper-greek", + "upper-hexadecimal", + "upper-latin", + "upper-norwegian", + "upper-roman", + "uppercase", + "urdu", + "url", + "var", + "vertical", + "vertical-text", + "view-box", + "visible", + "visibleFill", + "visiblePainted", + "visibleStroke", + "visual", + "w-resize", + "wait", + "wave", + "wider", + "window", + "windowframe", + "windowtext", + "words", + "wrap", + "wrap-reverse", + "x-large", + "x-small", + "xor", + "xx-large", + "xx-small" + ], valueKeywords = keySet(valueKeywords_); + var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_).concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_); + CodeMirror.registerHelper("hintWords", "css", allWords); + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = ch == "*"; + } + return ["comment", "comment"]; + } + CodeMirror.defineMIME("text/css", { + documentTypes, + mediaTypes, + mediaFeatures, + mediaValueKeywords, + propertyKeywords, + nonStandardPropertyKeywords, + fontProperties, + counterDescriptors, + colorKeywords, + valueKeywords, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css" + }); + CodeMirror.defineMIME("text/x-scss", { + mediaTypes, + mediaFeatures, + mediaValueKeywords, + propertyKeywords, + nonStandardPropertyKeywords, + colorKeywords, + valueKeywords, + fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + ":": function(stream) { + if (stream.match(/^\s*\{/, false)) + return [null, null]; + return false; + }, + "$": function(stream) { + stream.match(/^[\w-]+/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "#": function(stream) { + if (!stream.eat("{")) return false; + return [null, "interpolation"]; + } + }, + name: "css", + helperType: "scss" + }); + CodeMirror.defineMIME("text/x-less", { + mediaTypes, + mediaFeatures, + mediaValueKeywords, + propertyKeywords, + nonStandardPropertyKeywords, + colorKeywords, + valueKeywords, + fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + "@": function(stream) { + if (stream.eat("{")) return [null, "interpolation"]; + if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false; + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "&": function() { + return ["atom", "atom"]; + } + }, + name: "css", + helperType: "less" + }); + CodeMirror.defineMIME("text/x-gss", { + documentTypes, + mediaTypes, + mediaFeatures, + propertyKeywords, + nonStandardPropertyKeywords, + fontProperties, + counterDescriptors, + colorKeywords, + valueKeywords, + supportsAtComponent: true, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css", + helperType: "gss" + }); + }); + })(); + return css.exports; +} +requireCss(); +var htmlmixed = { exports: {} }; +var xml = { exports: {} }; +var hasRequiredXml; +function requireXml() { + if (hasRequiredXml) return xml.exports; + hasRequiredXml = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + var htmlConfig = { + autoSelfClosers: { + "area": true, + "base": true, + "br": true, + "col": true, + "command": true, + "embed": true, + "frame": true, + "hr": true, + "img": true, + "input": true, + "keygen": true, + "link": true, + "meta": true, + "param": true, + "source": true, + "track": true, + "wbr": true, + "menuitem": true + }, + implicitlyClosed: { + "dd": true, + "li": true, + "optgroup": true, + "option": true, + "p": true, + "rp": true, + "rt": true, + "tbody": true, + "td": true, + "tfoot": true, + "th": true, + "tr": true + }, + contextGrabbers: { + "dd": { "dd": true, "dt": true }, + "dt": { "dd": true, "dt": true }, + "li": { "li": true }, + "option": { "option": true, "optgroup": true }, + "optgroup": { "optgroup": true }, + "p": { + "address": true, + "article": true, + "aside": true, + "blockquote": true, + "dir": true, + "div": true, + "dl": true, + "fieldset": true, + "footer": true, + "form": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "header": true, + "hgroup": true, + "hr": true, + "menu": true, + "nav": true, + "ol": true, + "p": true, + "pre": true, + "section": true, + "table": true, + "ul": true + }, + "rp": { "rp": true, "rt": true }, + "rt": { "rp": true, "rt": true }, + "tbody": { "tbody": true, "tfoot": true }, + "td": { "td": true, "th": true }, + "tfoot": { "tbody": true }, + "th": { "td": true, "th": true }, + "thead": { "tbody": true, "tfoot": true }, + "tr": { "tr": true } + }, + doNotIndent: { "pre": true }, + allowUnquoted: true, + allowMissing: true, + caseFold: true + }; + var xmlConfig = { + autoSelfClosers: {}, + implicitlyClosed: {}, + contextGrabbers: {}, + doNotIndent: {}, + allowUnquoted: false, + allowMissing: false, + allowMissingTagName: false, + caseFold: false + }; + CodeMirror.defineMode("xml", function(editorConf, config_) { + var indentUnit = editorConf.indentUnit; + var config = {}; + var defaults = config_.htmlMode ? htmlConfig : xmlConfig; + for (var prop in defaults) config[prop] = defaults[prop]; + for (var prop in config_) config[prop] = config_[prop]; + var type, setStyle; + function inText(stream, state) { + function chain(parser) { + state.tokenize = parser; + return parser(stream, state); + } + var ch = stream.next(); + if (ch == "<") { + if (stream.eat("!")) { + if (stream.eat("[")) { + if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); + else return null; + } else if (stream.match("--")) { + return chain(inBlock("comment", "-->")); + } else if (stream.match("DOCTYPE", true, true)) { + stream.eatWhile(/[\w\._\-]/); + return chain(doctype(1)); + } else { + return null; + } + } else if (stream.eat("?")) { + stream.eatWhile(/[\w\._\-]/); + state.tokenize = inBlock("meta", "?>"); + return "meta"; + } else { + type = stream.eat("/") ? "closeTag" : "openTag"; + state.tokenize = inTag; + return "tag bracket"; + } + } else if (ch == "&") { + var ok; + if (stream.eat("#")) { + if (stream.eat("x")) { + ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); + } else { + ok = stream.eatWhile(/[\d]/) && stream.eat(";"); + } + } else { + ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); + } + return ok ? "atom" : "error"; + } else { + stream.eatWhile(/[^&<]/); + return null; + } + } + inText.isInText = true; + function inTag(stream, state) { + var ch = stream.next(); + if (ch == ">" || ch == "/" && stream.eat(">")) { + state.tokenize = inText; + type = ch == ">" ? "endTag" : "selfcloseTag"; + return "tag bracket"; + } else if (ch == "=") { + type = "equals"; + return null; + } else if (ch == "<") { + state.tokenize = inText; + state.state = baseState; + state.tagName = state.tagStart = null; + var next = state.tokenize(stream, state); + return next ? next + " tag error" : "tag error"; + } else if (/[\'\"]/.test(ch)) { + state.tokenize = inAttribute(ch); + state.stringStartCol = stream.column(); + return state.tokenize(stream, state); + } else { + stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); + return "word"; + } + } + function inAttribute(quote) { + var closure = function(stream, state) { + while (!stream.eol()) { + if (stream.next() == quote) { + state.tokenize = inTag; + break; + } + } + return "string"; + }; + closure.isInAttribute = true; + return closure; + } + function inBlock(style, terminator) { + return function(stream, state) { + while (!stream.eol()) { + if (stream.match(terminator)) { + state.tokenize = inText; + break; + } + stream.next(); + } + return style; + }; + } + function doctype(depth) { + return function(stream, state) { + var ch; + while ((ch = stream.next()) != null) { + if (ch == "<") { + state.tokenize = doctype(depth + 1); + return state.tokenize(stream, state); + } else if (ch == ">") { + if (depth == 1) { + state.tokenize = inText; + break; + } else { + state.tokenize = doctype(depth - 1); + return state.tokenize(stream, state); + } + } + } + return "meta"; + }; + } + function lower(tagName) { + return tagName && tagName.toLowerCase(); + } + function Context(state, tagName, startOfLine) { + this.prev = state.context; + this.tagName = tagName || ""; + this.indent = state.indented; + this.startOfLine = startOfLine; + if (config.doNotIndent.hasOwnProperty(tagName) || state.context && state.context.noIndent) + this.noIndent = true; + } + function popContext(state) { + if (state.context) state.context = state.context.prev; + } + function maybePopContext(state, nextTagName) { + var parentTagName; + while (true) { + if (!state.context) { + return; + } + parentTagName = state.context.tagName; + if (!config.contextGrabbers.hasOwnProperty(lower(parentTagName)) || !config.contextGrabbers[lower(parentTagName)].hasOwnProperty(lower(nextTagName))) { + return; + } + popContext(state); + } + } + function baseState(type2, stream, state) { + if (type2 == "openTag") { + state.tagStart = stream.column(); + return tagNameState; + } else if (type2 == "closeTag") { + return closeTagNameState; + } else { + return baseState; + } + } + function tagNameState(type2, stream, state) { + if (type2 == "word") { + state.tagName = stream.current(); + setStyle = "tag"; + return attrState; + } else if (config.allowMissingTagName && type2 == "endTag") { + setStyle = "tag bracket"; + return attrState(type2, stream, state); + } else { + setStyle = "error"; + return tagNameState; + } + } + function closeTagNameState(type2, stream, state) { + if (type2 == "word") { + var tagName = stream.current(); + if (state.context && state.context.tagName != tagName && config.implicitlyClosed.hasOwnProperty(lower(state.context.tagName))) + popContext(state); + if (state.context && state.context.tagName == tagName || config.matchClosing === false) { + setStyle = "tag"; + return closeState; + } else { + setStyle = "tag error"; + return closeStateErr; + } + } else if (config.allowMissingTagName && type2 == "endTag") { + setStyle = "tag bracket"; + return closeState(type2, stream, state); + } else { + setStyle = "error"; + return closeStateErr; + } + } + function closeState(type2, _stream, state) { + if (type2 != "endTag") { + setStyle = "error"; + return closeState; + } + popContext(state); + return baseState; + } + function closeStateErr(type2, stream, state) { + setStyle = "error"; + return closeState(type2, stream, state); + } + function attrState(type2, _stream, state) { + if (type2 == "word") { + setStyle = "attribute"; + return attrEqState; + } else if (type2 == "endTag" || type2 == "selfcloseTag") { + var tagName = state.tagName, tagStart = state.tagStart; + state.tagName = state.tagStart = null; + if (type2 == "selfcloseTag" || config.autoSelfClosers.hasOwnProperty(lower(tagName))) { + maybePopContext(state, tagName); + } else { + maybePopContext(state, tagName); + state.context = new Context(state, tagName, tagStart == state.indented); + } + return baseState; + } + setStyle = "error"; + return attrState; + } + function attrEqState(type2, stream, state) { + if (type2 == "equals") return attrValueState; + if (!config.allowMissing) setStyle = "error"; + return attrState(type2, stream, state); + } + function attrValueState(type2, stream, state) { + if (type2 == "string") return attrContinuedState; + if (type2 == "word" && config.allowUnquoted) { + setStyle = "string"; + return attrState; + } + setStyle = "error"; + return attrState(type2, stream, state); + } + function attrContinuedState(type2, stream, state) { + if (type2 == "string") return attrContinuedState; + return attrState(type2, stream, state); + } + return { + startState: function(baseIndent) { + var state = { + tokenize: inText, + state: baseState, + indented: baseIndent || 0, + tagName: null, + tagStart: null, + context: null + }; + if (baseIndent != null) state.baseIndent = baseIndent; + return state; + }, + token: function(stream, state) { + if (!state.tagName && stream.sol()) + state.indented = stream.indentation(); + if (stream.eatSpace()) return null; + type = null; + var style = state.tokenize(stream, state); + if ((style || type) && style != "comment") { + setStyle = null; + state.state = state.state(type || style, stream, state); + if (setStyle) + style = setStyle == "error" ? style + " error" : setStyle; + } + return style; + }, + indent: function(state, textAfter, fullLine) { + var context = state.context; + if (state.tokenize.isInAttribute) { + if (state.tagStart == state.indented) + return state.stringStartCol + 1; + else + return state.indented + indentUnit; + } + if (context && context.noIndent) return CodeMirror.Pass; + if (state.tokenize != inTag && state.tokenize != inText) + return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; + if (state.tagName) { + if (config.multilineTagIndentPastTag !== false) + return state.tagStart + state.tagName.length + 2; + else + return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1); + } + if (config.alignCDATA && /$/, + blockCommentStart: "", + configuration: config.htmlMode ? "html" : "xml", + helperType: config.htmlMode ? "html" : "xml", + skipAttribute: function(state) { + if (state.state == attrValueState) + state.state = attrState; + }, + xmlCurrentTag: function(state) { + return state.tagName ? { name: state.tagName, close: state.type == "closeTag" } : null; + }, + xmlCurrentContext: function(state) { + var context = []; + for (var cx = state.context; cx; cx = cx.prev) + context.push(cx.tagName); + return context.reverse(); + } + }; + }); + CodeMirror.defineMIME("text/xml", "xml"); + CodeMirror.defineMIME("application/xml", "xml"); + if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) + CodeMirror.defineMIME("text/html", { name: "xml", htmlMode: true }); + }); + })(); + return xml.exports; +} +var javascript = { exports: {} }; +var hasRequiredJavascript; +function requireJavascript() { + if (hasRequiredJavascript) return javascript.exports; + hasRequiredJavascript = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var trackScope = parserConfig.trackScope !== false; + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + var keywords = function() { + function kw(type2) { + return { type: type2, style: "keyword" }; + } + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); + var operator = kw("operator"), atom = { type: "atom", style: "atom" }; + return { + "if": kw("if"), + "while": A, + "with": A, + "else": B, + "do": B, + "try": B, + "finally": B, + "return": D, + "break": D, + "continue": D, + "new": kw("new"), + "delete": C, + "void": C, + "throw": C, + "debugger": kw("debugger"), + "var": kw("var"), + "const": kw("var"), + "let": kw("var"), + "function": kw("function"), + "catch": kw("catch"), + "for": kw("for"), + "switch": kw("switch"), + "case": kw("case"), + "default": kw("default"), + "in": operator, + "typeof": operator, + "instanceof": operator, + "true": atom, + "false": atom, + "null": atom, + "undefined": atom, + "NaN": atom, + "Infinity": atom, + "this": kw("this"), + "class": kw("class"), + "super": kw("atom"), + "yield": C, + "export": kw("export"), + "import": kw("import"), + "extends": C, + "await": C + }; + }(); + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + var type, content; + function ret(tp, style, cont2) { + type = tp; + content = cont2; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eat("="); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#" && stream.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property"); + } else if (ch == "<" && stream.match("!--") || ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start))) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") { + if (stream.eat("=")) { + if (ch == "!" || ch == "=") stream.eat("="); + } else if (/[<>*+\-|&?]/.test(ch)) { + stream.eat(ch); + if (ch == ">") stream.eat(ch); + } + } + if (ch == "?" && stream.eat(".")) return ret("."); + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current(); + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word]; + return ret(kw.type, kw.style, word); + } + if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) + return ret("async", "keyword", word); + } + return ret("variable", "variable", word); + } + } + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)) { + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = ch == "*"; + } + return ret("comment", "comment"); + } + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + var brackets = "([{}])"; + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + if (isTS) { + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)); + if (m) arrow = m.index; + } + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { + ++pos; + break; + } + if (--depth == 0) { + if (ch == "(") sawSomething = true; + break; + } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/`]/.test(ch)) { + for (; ; --pos) { + if (pos == 0) return; + var next = stream.string.charAt(pos - 1); + if (next == ch && stream.string.charAt(pos - 2) != "\\") { + pos--; + break; + } + } + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + var atomicTypes = { + "atom": true, + "number": true, + "variable": true, + "string": true, + "regexp": true, + "this": true, + "import": true, + "jsonld-keyword": true + }; + function JSLexical(indented, column, type2, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type2; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + function inScope(state, varname) { + if (!trackScope) return false; + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx2 = state.context; cx2; cx2 = cx2.prev) { + for (var v = cx2.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + function parseJS(state, style, type2, content2, stream) { + var cc = state.cc; + cx.state = state; + cx.stream = stream; + cx.marked = null, cx.cc = cc; + cx.style = style; + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + while (true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type2, content2)) { + while (cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type2 == "variable" && inScope(state, content2)) return "variable-2"; + return style; + } + } + } + var cx = { state: null, marked: null, cc: null }; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) if (v.name == name) return true; + return false; + } + function register(varname) { + var state = cx.state; + cx.marked = "def"; + if (!trackScope) return; + if (state.context) { + if (state.lexical.info == "var" && state.context && state.context.block) { + var newContext = registerVarScoped(varname, state.context); + if (newContext != null) { + state.context = newContext; + return; + } + } else if (!inList(varname, state.localVars)) { + state.localVars = new Var(varname, state.localVars); + return; + } + } + if (parserConfig.globalVars && !inList(varname, state.globalVars)) + state.globalVars = new Var(varname, state.globalVars); + } + function registerVarScoped(varname, context) { + if (!context) { + return null; + } else if (context.block) { + var inner = registerVarScoped(varname, context.prev); + if (!inner) return null; + if (inner == context.prev) return context; + return new Context(inner, context.vars, true); + } else if (inList(varname, context.vars)) { + return context; + } else { + return new Context(context.prev, new Var(varname, context.vars), false); + } + } + function isModifier(name) { + return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly"; + } + function Context(prev, vars, block2) { + this.prev = prev; + this.vars = vars; + this.block = block2; + } + function Var(name, next) { + this.name = name; + this.next = next; + } + var defaultVars = new Var("this", new Var("arguments", null)); + function pushcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, false); + cx.state.localVars = defaultVars; + } + function pushblockcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, true); + cx.state.localVars = null; + } + pushcontext.lex = pushblockcontext.lex = true; + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + popcontext.lex = true; + function pushlex(type2, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type2, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + function expect(wanted) { + function exp(type2) { + if (type2 == wanted) return cont(); + else if (wanted == ";" || type2 == "}" || type2 == ")" || type2 == "]") return pass(); + else return cont(exp); + } + return exp; + } + function statement(type2, value) { + if (type2 == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); + if (type2 == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type2 == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type2 == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); + if (type2 == "debugger") return cont(expect(";")); + if (type2 == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); + if (type2 == ";") return cont(); + if (type2 == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type2 == "function") return cont(functiondef); + if (type2 == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type2 == "class" || isTS && value == "interface") { + cx.marked = "keyword"; + return cont(pushlex("form", type2 == "class" ? type2 : value), className, poplex); + } + if (type2 == "variable") { + if (isTS && value == "declare") { + cx.marked = "keyword"; + return cont(statement); + } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { + cx.marked = "keyword"; + if (value == "enum") return cont(enumdef); + else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";")); + else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex); + } else if (isTS && value == "namespace") { + cx.marked = "keyword"; + return cont(pushlex("form"), expression, statement, poplex); + } else if (isTS && value == "abstract") { + cx.marked = "keyword"; + return cont(statement); + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type2 == "switch") return cont( + pushlex("form"), + parenExpr, + expect("{"), + pushlex("}", "switch"), + pushblockcontext, + block, + poplex, + poplex, + popcontext + ); + if (type2 == "case") return cont(expression, expect(":")); + if (type2 == "default") return cont(expect(":")); + if (type2 == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); + if (type2 == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type2 == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type2 == "async") return cont(statement); + if (value == "@") return cont(expression, statement); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function maybeCatchBinding(type2) { + if (type2 == "(") return cont(funarg, expect(")")); + } + function expression(type2, value) { + return expressionInner(type2, value, false); + } + function expressionNoComma(type2, value) { + return expressionInner(type2, value, true); + } + function parenExpr(type2) { + if (type2 != "(") return pass(); + return cont(pushlex(")"), maybeexpression, expect(")"), poplex); + } + function expressionInner(type2, value, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); + else if (type2 == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type2)) return cont(maybeop); + if (type2 == "function") return cont(functiondef, maybeop); + if (type2 == "class" || isTS && value == "interface") { + cx.marked = "keyword"; + return cont(pushlex("form"), classExpression, poplex); + } + if (type2 == "keyword c" || type2 == "async") return cont(noComma ? expressionNoComma : expression); + if (type2 == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type2 == "operator" || type2 == "spread") return cont(noComma ? expressionNoComma : expression); + if (type2 == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type2 == "{") return contCommasep(objprop, "}", null, maybeop); + if (type2 == "quasi") return pass(quasi, maybeop); + if (type2 == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type2) { + if (type2.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + function maybeoperatorComma(type2, value) { + if (type2 == ",") return cont(maybeexpression); + return maybeoperatorNoComma(type2, value, false); + } + function maybeoperatorNoComma(type2, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type2 == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type2 == "operator") { + if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) + return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type2 == "quasi") { + return pass(quasi, me); + } + if (type2 == ";") return; + if (type2 == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type2 == ".") return cont(property, me); + if (type2 == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { + cx.marked = "keyword"; + return cont(typeexpr, me); + } + if (type2 == "regexp") { + cx.state.lastType = cx.marked = "operator"; + cx.stream.backUp(cx.stream.pos - cx.stream.start - 1); + return cont(expr); + } + } + function quasi(type2, value) { + if (type2 != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(maybeexpression, continueQuasi); + } + function continueQuasi(type2) { + if (type2 == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type2) { + findFatArrow(cx.stream, cx.state); + return pass(type2 == "{" ? statement : expression); + } + function arrowBodyNoComma(type2) { + findFatArrow(cx.stream, cx.state); + return pass(type2 == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function(type2) { + if (type2 == ".") return cont(noComma ? targetNoComma : target); + else if (type2 == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma); + else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { + cx.marked = "keyword"; + return cont(maybeoperatorComma); + } + } + function targetNoComma(_, value) { + if (value == "target") { + cx.marked = "keyword"; + return cont(maybeoperatorNoComma); + } + } + function maybelabel(type2) { + if (type2 == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type2) { + if (type2 == "variable") { + cx.marked = "property"; + return cont(); + } + } + function objprop(type2, value) { + if (type2 == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type2 == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + var m; + if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) + cx.state.fatArrowAt = cx.stream.pos + m[0].length; + return cont(afterprop); + } else if (type2 == "number" || type2 == "string") { + cx.marked = jsonldMode ? "property" : cx.style + " property"; + return cont(afterprop); + } else if (type2 == "jsonld-keyword") { + return cont(afterprop); + } else if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(objprop); + } else if (type2 == "[") { + return cont(expression, maybetype, expect("]"), afterprop); + } else if (type2 == "spread") { + return cont(expressionNoComma, afterprop); + } else if (value == "*") { + cx.marked = "keyword"; + return cont(objprop); + } else if (type2 == ":") { + return pass(afterprop); + } + } + function getterSetter(type2) { + if (type2 != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type2) { + if (type2 == ":") return cont(expressionNoComma); + if (type2 == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type2, value) { + if (sep ? sep.indexOf(type2) > -1 : type2 == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function(type3, value2) { + if (type3 == end || value2 == end) return pass(); + return pass(what); + }, proceed); + } + if (type2 == end || value == end) return cont(); + if (sep && sep.indexOf(";") > -1) return pass(what); + return cont(expect(end)); + } + return function(type2, value) { + if (type2 == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type2) { + if (type2 == "}") return cont(); + return pass(statement, block); + } + function maybetype(type2, value) { + if (isTS) { + if (type2 == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function maybetypeOrIn(type2, value) { + if (isTS && (type2 == ":" || value == "in")) return cont(typeexpr); + } + function mayberettype(type2) { + if (isTS && type2 == ":") { + if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr); + else return cont(typeexpr); + } + } + function isKW(_, value) { + if (value == "is") { + cx.marked = "keyword"; + return cont(); + } + } + function typeexpr(type2, value) { + if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { + cx.marked = "keyword"; + return cont(value == "typeof" ? expressionNoComma : typeexpr); + } + if (type2 == "variable" || value == "void") { + cx.marked = "type"; + return cont(afterType); + } + if (value == "|" || value == "&") return cont(typeexpr); + if (type2 == "string" || type2 == "number" || type2 == "atom") return cont(afterType); + if (type2 == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType); + if (type2 == "{") return cont(pushlex("}"), typeprops, poplex, afterType); + if (type2 == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType); + if (type2 == "<") return cont(commasep(typeexpr, ">"), typeexpr); + if (type2 == "quasi") { + return pass(quasiType, afterType); + } + } + function maybeReturnType(type2) { + if (type2 == "=>") return cont(typeexpr); + } + function typeprops(type2) { + if (type2.match(/[\}\)\]]/)) return cont(); + if (type2 == "," || type2 == ";") return cont(typeprops); + return pass(typeprop, typeprops); + } + function typeprop(type2, value) { + if (type2 == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(typeprop); + } else if (value == "?" || type2 == "number" || type2 == "string") { + return cont(typeprop); + } else if (type2 == ":") { + return cont(typeexpr); + } else if (type2 == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop); + } else if (type2 == "(") { + return pass(functiondecl, typeprop); + } else if (!type2.match(/[;\}\)\],]/)) { + return cont(); + } + } + function quasiType(type2, value) { + if (type2 != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type2) { + if (type2 == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type2, value) { + if (type2 == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg); + if (type2 == ":") return cont(typeexpr); + if (type2 == "spread") return cont(typearg); + return pass(typeexpr); + } + function afterType(type2, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); + if (value == "|" || type2 == "." || value == "&") return cont(typeexpr); + if (type2 == "[") return cont(typeexpr, expect("]"), afterType); + if (value == "extends" || value == "implements") { + cx.marked = "keyword"; + return cont(typeexpr); + } + if (value == "?") return cont(typeexpr, expect(":"), typeexpr); + } + function maybeTypeArgs(_, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); + } + function typeparam() { + return pass(typeexpr, maybeTypeDefault); + } + function maybeTypeDefault(_, value) { + if (value == "=") return cont(typeexpr); + } + function vardef(_, value) { + if (value == "enum") { + cx.marked = "keyword"; + return cont(enumdef); + } + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type2, value) { + if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(pattern); + } + if (type2 == "variable") { + register(value); + return cont(); + } + if (type2 == "spread") return cont(pattern); + if (type2 == "[") return contCommasep(eltpattern, "]"); + if (type2 == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type2, value) { + if (type2 == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type2 == "variable") cx.marked = "property"; + if (type2 == "spread") return cont(pattern); + if (type2 == "}") return pass(); + if (type2 == "[") return cont(expression, expect("]"), expect(":"), proppattern); + return cont(expect(":"), pattern, maybeAssign); + } + function eltpattern() { + return pass(pattern, maybeAssign); + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type2) { + if (type2 == ",") return cont(vardef); + } + function maybeelse(type2, value) { + if (type2 == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type2, value) { + if (value == "await") return cont(forspec); + if (type2 == "(") return cont(pushlex(")"), forspec1, poplex); + } + function forspec1(type2) { + if (type2 == "var") return cont(vardef, forspec2); + if (type2 == "variable") return cont(forspec2); + return pass(forspec2); + } + function forspec2(type2, value) { + if (type2 == ")") return cont(); + if (type2 == ";") return cont(forspec2); + if (value == "in" || value == "of") { + cx.marked = "keyword"; + return cont(expression, forspec2); + } + return pass(expression, forspec2); + } + function functiondef(type2, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(functiondef); + } + if (type2 == "variable") { + register(value); + return cont(functiondef); + } + if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef); + } + function functiondecl(type2, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(functiondecl); + } + if (type2 == "variable") { + register(value); + return cont(functiondecl); + } + if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl); + } + function typename(type2, value) { + if (type2 == "keyword" || type2 == "variable") { + cx.marked = "type"; + return cont(typename); + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex); + } + } + function funarg(type2, value) { + if (value == "@") cont(expression, funarg); + if (type2 == "spread") return cont(funarg); + if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(funarg); + } + if (isTS && type2 == "this") return cont(maybetype, maybeAssign); + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type2, value) { + if (type2 == "variable") return className(type2, value); + return classNameAfter(type2, value); + } + function className(type2, value) { + if (type2 == "variable") { + register(value); + return cont(classNameAfter); + } + } + function classNameAfter(type2, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter); + if (value == "extends" || value == "implements" || isTS && type2 == ",") { + if (value == "implements") cx.marked = "keyword"; + return cont(isTS ? typeexpr : expression, classNameAfter); + } + if (type2 == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type2, value) { + if (type2 == "async" || type2 == "variable" && (value == "static" || value == "get" || value == "set" || isTS && isModifier(value)) && cx.stream.match(/^\s+#?[\w$\xa1-\uffff]/, false)) { + cx.marked = "keyword"; + return cont(classBody); + } + if (type2 == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(classfield, classBody); + } + if (type2 == "number" || type2 == "string") return cont(classfield, classBody); + if (type2 == "[") + return cont(expression, maybetype, expect("]"), classfield, classBody); + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type2 == "(") return pass(functiondecl, classBody); + if (type2 == ";" || type2 == ",") return cont(classBody); + if (type2 == "}") return cont(); + if (value == "@") return cont(expression, classBody); + } + function classfield(type2, value) { + if (value == "!") return cont(classfield); + if (value == "?") return cont(classfield); + if (type2 == ":") return cont(typeexpr, maybeAssign); + if (value == "=") return cont(expressionNoComma); + var context = cx.state.lexical.prev, isInterface = context && context.info == "interface"; + return pass(isInterface ? functiondecl : functiondef); + } + function afterExport(type2, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(maybeFrom, expect(";")); + } + if (value == "default") { + cx.marked = "keyword"; + return cont(expression, expect(";")); + } + if (type2 == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type2, value) { + if (value == "as") { + cx.marked = "keyword"; + return cont(expect("variable")); + } + if (type2 == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type2) { + if (type2 == "string") return cont(); + if (type2 == "(") return pass(expression); + if (type2 == ".") return pass(maybeoperatorComma); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type2, value) { + if (type2 == "{") return contCommasep(importSpec, "}"); + if (type2 == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type2) { + if (type2 == ",") return cont(importSpec, maybeMoreImports); + } + function maybeAs(_type, value) { + if (value == "as") { + cx.marked = "keyword"; + return cont(importSpec); + } + } + function maybeFrom(_type, value) { + if (value == "from") { + cx.marked = "keyword"; + return cont(expression); + } + } + function arrayLiteral(type2) { + if (type2 == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + function enumdef() { + return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex); + } + function enummember() { + return pass(pattern, maybeAssign); + } + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || isOperatorChar.test(textAfter.charAt(0)) || /[,.]/.test(textAfter.charAt(0)); + } + function expressionAllowed(stream, state, backUp) { + return state.tokenize == tokenBase && /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))); + } + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && new Context(null, null, false), + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + indent: function(state, textAfter) { + if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top; + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse && c != popcontext) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && (firstChar == "}" || (top = state.cc[state.cc.length - 1]) && (top == maybeoperatorComma || top == maybeoperatorNoComma) && !/^[,\.=+\-*:?[\(]/.test(textAfter))) + lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type2 = lexical.type, closing = firstChar == type2; + if (type2 == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0); + else if (type2 == "form" && firstChar == "{") return lexical.indented; + else if (type2 == "form") return lexical.indented + indentUnit; + else if (type2 == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + blockCommentContinue: jsonMode ? null : " * ", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + helperType: jsonMode ? "json" : "javascript", + jsonldMode, + jsonMode, + expressionAllowed, + skipExpression: function(state) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)); + } + }; + }); + CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + CodeMirror.defineMIME("text/javascript", "javascript"); + CodeMirror.defineMIME("text/ecmascript", "javascript"); + CodeMirror.defineMIME("application/javascript", "javascript"); + CodeMirror.defineMIME("application/x-javascript", "javascript"); + CodeMirror.defineMIME("application/ecmascript", "javascript"); + CodeMirror.defineMIME("application/json", { name: "javascript", json: true }); + CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true }); + CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true }); + CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true }); + CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); + CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + }); + })(); + return javascript.exports; +} +var hasRequiredHtmlmixed; +function requireHtmlmixed() { + if (hasRequiredHtmlmixed) return htmlmixed.exports; + hasRequiredHtmlmixed = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror(), requireXml(), requireJavascript(), requireCss()); + })(function(CodeMirror) { + var defaultTags = { + script: [ + ["lang", /(javascript|babel)/i, "javascript"], + ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i, "javascript"], + ["type", /./, "text/plain"], + [null, null, "javascript"] + ], + style: [ + ["lang", /^css$/i, "css"], + ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], + ["type", /./, "text/plain"], + [null, null, "css"] + ] + }; + function maybeBackup(stream, pat, style) { + var cur = stream.current(), close = cur.search(pat); + if (close > -1) { + stream.backUp(cur.length - close); + } else if (cur.match(/<\/?$/)) { + stream.backUp(cur.length); + if (!stream.match(pat, false)) stream.match(cur); + } + return style; + } + var attrRegexpCache = {}; + function getAttrRegexp(attr) { + var regexp = attrRegexpCache[attr]; + if (regexp) return regexp; + return attrRegexpCache[attr] = new RegExp("\\s+" + attr + `\\s*=\\s*('|")?([^'"]+)('|")?\\s*`); + } + function getAttrValue(text, attr) { + var match = text.match(getAttrRegexp(attr)); + return match ? /^\s*(.*?)\s*$/.exec(match[2])[1] : ""; + } + function getTagRegexp(tagName, anchored) { + return new RegExp((anchored ? "^" : "") + "", "i"); + } + function addTags(from, to) { + for (var tag in from) { + var dest = to[tag] || (to[tag] = []); + var source = from[tag]; + for (var i = source.length - 1; i >= 0; i--) + dest.unshift(source[i]); + } + } + function findMatchingMode(tagInfo, tagText) { + for (var i = 0; i < tagInfo.length; i++) { + var spec = tagInfo[i]; + if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2]; + } + } + CodeMirror.defineMode("htmlmixed", function(config, parserConfig) { + var htmlMode = CodeMirror.getMode(config, { + name: "xml", + htmlMode: true, + multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, + multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag, + allowMissingTagName: parserConfig.allowMissingTagName + }); + var tags = {}; + var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes; + addTags(defaultTags, tags); + if (configTags) addTags(configTags, tags); + if (configScript) for (var i = configScript.length - 1; i >= 0; i--) + tags.script.unshift(["type", configScript[i].matches, configScript[i].mode]); + function html(stream, state) { + var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName; + if (tag && !/[<>\s\/]/.test(stream.current()) && (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) && tags.hasOwnProperty(tagName)) { + state.inTag = tagName + " "; + } else if (state.inTag && tag && />$/.test(stream.current())) { + var inTag = /^([\S]+) (.*)/.exec(state.inTag); + state.inTag = null; + var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2]); + var mode = CodeMirror.getMode(config, modeSpec); + var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false); + state.token = function(stream2, state2) { + if (stream2.match(endTagA, false)) { + state2.token = html; + state2.localState = state2.localMode = null; + return null; + } + return maybeBackup(stream2, endTag, state2.localMode.token(stream2, state2.localState)); + }; + state.localMode = mode; + state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, "", "")); + } else if (state.inTag) { + state.inTag += stream.current(); + if (stream.eol()) state.inTag += " "; + } + return style; + } + return { + startState: function() { + var state = CodeMirror.startState(htmlMode); + return { token: html, inTag: null, localMode: null, localState: null, htmlState: state }; + }, + copyState: function(state) { + var local; + if (state.localState) { + local = CodeMirror.copyState(state.localMode, state.localState); + } + return { + token: state.token, + inTag: state.inTag, + localMode: state.localMode, + localState: local, + htmlState: CodeMirror.copyState(htmlMode, state.htmlState) + }; + }, + token: function(stream, state) { + return state.token(stream, state); + }, + indent: function(state, textAfter, line) { + if (!state.localMode || /^\s*<\//.test(textAfter)) + return htmlMode.indent(state.htmlState, textAfter, line); + else if (state.localMode.indent) + return state.localMode.indent(state.localState, textAfter, line); + else + return CodeMirror.Pass; + }, + innerMode: function(state) { + return { state: state.localState || state.htmlState, mode: state.localMode || htmlMode }; + } + }; + }, "xml", "javascript", "css"); + CodeMirror.defineMIME("text/html", "htmlmixed"); + }); + })(); + return htmlmixed.exports; +} +requireHtmlmixed(); +requireJavascript(); +var python = { exports: {} }; +var hasRequiredPython; +function requirePython() { + if (hasRequiredPython) return python.exports; + hasRequiredPython = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + function wordRegexp(words2) { + return new RegExp("^((" + words2.join(")|(") + "))\\b"); + } + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = [ + "as", + "assert", + "break", + "class", + "continue", + "def", + "del", + "elif", + "else", + "except", + "finally", + "for", + "from", + "global", + "if", + "import", + "lambda", + "pass", + "raise", + "return", + "try", + "while", + "with", + "yield", + "in", + "False", + "True" + ]; + var commonBuiltins = [ + "abs", + "all", + "any", + "bin", + "bool", + "bytearray", + "callable", + "chr", + "classmethod", + "compile", + "complex", + "delattr", + "dict", + "dir", + "divmod", + "enumerate", + "eval", + "filter", + "float", + "format", + "frozenset", + "getattr", + "globals", + "hasattr", + "hash", + "help", + "hex", + "id", + "input", + "int", + "isinstance", + "issubclass", + "iter", + "len", + "list", + "locals", + "map", + "max", + "memoryview", + "min", + "next", + "object", + "oct", + "open", + "ord", + "pow", + "property", + "range", + "repr", + "reversed", + "round", + "set", + "setattr", + "slice", + "sorted", + "staticmethod", + "str", + "sum", + "super", + "tuple", + "type", + "vars", + "zip", + "__import__", + "NotImplemented", + "Ellipsis", + "__debug__" + ]; + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins).concat(["exec", "print"])); + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.\\]/; + var operators = [ + parserConf.singleOperators, + parserConf.doubleOperators, + parserConf.doubleDelimiters, + parserConf.tripleDelimiters, + parserConf.operators || /^([-+*/%\/&|^]=?|[<>=]+|\/\/=?|\*\*=?|!=|[~!@]|\.\.\.)/ + ]; + for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1); + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if (parserConf.extra_keywords != void 0) + myKeywords = myKeywords.concat(parserConf.extra_keywords); + if (parserConf.extra_builtins != void 0) + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + var py3 = !(parserConf.version && Number(parserConf.version) < 3); + if (py3) { + var identifiers = parserConf.identifiers || /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; + myKeywords = myKeywords.concat(["nonlocal", "None", "aiter", "anext", "async", "await", "breakpoint", "match", "case"]); + myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); + var stringPrefixes = new RegExp(`^(([rbuf]|(br)|(rb)|(fr)|(rf))?('{3}|"{3}|['"]))`, "i"); + } else { + var identifiers = parserConf.identifiers || /^[_A-Za-z][_A-Za-z0-9]*/; + myKeywords = myKeywords.concat(["exec", "print"]); + myBuiltins = myBuiltins.concat([ + "apply", + "basestring", + "buffer", + "cmp", + "coerce", + "execfile", + "file", + "intern", + "long", + "raw_input", + "reduce", + "reload", + "unichr", + "unicode", + "xrange", + "None" + ]); + var stringPrefixes = new RegExp(`^(([rubf]|(ur)|(br))?('{3}|"{3}|['"]))`, "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + function tokenBase(stream, state) { + var sol = stream.sol() && state.lastToken != "\\"; + if (sol) state.indent = stream.indentation(); + if (sol && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushPyScope(state); + else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != "#") + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + function tokenBaseInner(stream, state, inFormat) { + if (stream.eatSpace()) return null; + if (!inFormat && stream.match(/^#.*/)) return "comment"; + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + if (stream.match(/^[\d_]*\.\d+(e[\+\-]?\d+)?/i)) { + floatLiteral = true; + } + if (stream.match(/^[\d_]+\.\d*/)) { + floatLiteral = true; + } + if (stream.match(/^\.\d+/)) { + floatLiteral = true; + } + if (floatLiteral) { + stream.eat(/J/i); + return "number"; + } + var intLiteral = false; + if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true; + if (stream.match(/^0b[01_]+/i)) intLiteral = true; + if (stream.match(/^0o[0-7_]+/i)) intLiteral = true; + if (stream.match(/^[1-9][\d_]*(e[\+\-]?[\d_]+)?/)) { + stream.eat(/J/i); + intLiteral = true; + } + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + stream.eat(/L/i); + return "number"; + } + } + if (stream.match(stringPrefixes)) { + var isFmtString = stream.current().toLowerCase().indexOf("f") !== -1; + if (!isFmtString) { + state.tokenize = tokenStringFactory(stream.current(), state.tokenize); + return state.tokenize(stream, state); + } else { + state.tokenize = formatStringFactory(stream.current(), state.tokenize); + return state.tokenize(stream, state); + } + } + for (var i2 = 0; i2 < operators.length; i2++) + if (stream.match(operators[i2])) return "operator"; + if (stream.match(delimiters)) return "punctuation"; + if (state.lastToken == "." && stream.match(identifiers)) + return "property"; + if (stream.match(keywords) || stream.match(wordOperators)) + return "keyword"; + if (stream.match(builtins)) + return "builtin"; + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + stream.next(); + return inFormat ? null : ERRORCLASS; + } + function formatStringFactory(delimiter, tokenOuter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + function tokenNestedExpr(depth) { + return function(stream, state) { + var inner = tokenBaseInner(stream, state, true); + if (inner == "punctuation") { + if (stream.current() == "{") { + state.tokenize = tokenNestedExpr(depth + 1); + } else if (stream.current() == "}") { + if (depth > 1) state.tokenize = tokenNestedExpr(depth - 1); + else state.tokenize = tokenString; + } + } + return inner; + }; + } + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\{\}\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenOuter; + return OUTCLASS; + } else if (stream.match("{{")) { + return OUTCLASS; + } else if (stream.match("{", false)) { + state.tokenize = tokenNestedExpr(0); + if (stream.current()) return OUTCLASS; + else return state.tokenize(stream, state); + } else if (stream.match("}}")) { + return OUTCLASS; + } else if (stream.match("}")) { + return ERRORCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenOuter; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + function tokenStringFactory(delimiter, tokenOuter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenOuter; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenOuter; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + function pushPyScope(state) { + while (top(state).type != "py") state.scopes.pop(); + state.scopes.push({ + offset: top(state).offset + conf.indentUnit, + type: "py", + align: null + }); + } + function pushBracketScope(stream, state, type) { + var align = stream.match(/^[\s\[\{\(]*(?:#|$)/, false) ? null : stream.column() + 1; + state.scopes.push({ + offset: state.indent + hangingIndent, + type, + align + }); + } + function dedent(stream, state) { + var indented = stream.indentation(); + while (state.scopes.length > 1 && top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + function tokenLexer(stream, state) { + if (stream.sol()) { + state.beginningOfLine = true; + state.dedent = false; + } + var style = state.tokenize(stream, state); + var current = stream.current(); + if (state.beginningOfLine && current == "@") + return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; + if (/\S/.test(current)) state.beginningOfLine = false; + if ((style == "variable" || style == "builtin") && state.lastToken == "meta") + style = "meta"; + if (current == "pass" || current == "return") + state.dedent = true; + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py" && stream.match(/^\s*(?:#|$)/, false)) + pushPyScope(state); + if (current.length == 1 && !/string|comment/.test(style)) { + var delimiter_index = "[({".indexOf(current); + if (delimiter_index != -1) + pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index + 1)); + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent; + else return ERRORCLASS; + } + } + if (state.dedent && stream.eol() && top(state).type == "py" && state.scopes.length > 1) + state.scopes.pop(); + return style; + } + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{ offset: basecolumn || 0, type: "py", align: null }], + indent: basecolumn || 0, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + if (style && style != "comment") + state.lastToken = style == "keyword" || style == "punctuation" ? stream.current() : style; + if (style == "punctuation") style = null; + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + var scope = top(state); + var closing = scope.type == textAfter.charAt(0) || scope.type == "py" && !state.dedent && /^(else:|elif |except |finally:)/.test(textAfter); + if (scope.align != null) + return scope.align - (closing ? 1 : 0); + else + return scope.offset - (closing ? hangingIndent : 0); + }, + electricInput: /^\s*([\}\]\)]|else:|elif |except |finally:)$/, + closeBrackets: { triples: `'"` }, + lineComment: "#", + fold: "indent" + }; + return external; + }); + CodeMirror.defineMIME("text/x-python", "python"); + var words = function(str) { + return str.split(" "); + }; + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except extern gil include nogil property public readonly struct union DEF IF ELIF ELSE") + }); + }); + })(); + return python.exports; +} +requirePython(); +var clike = { exports: {} }; +var hasRequiredClike; +function requireClike() { + if (hasRequiredClike) return clike.exports; + hasRequiredClike = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + function Context(indented, column, type, info, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.info = info; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type, info) { + var indent = state.indented; + if (state.context && state.context.type == "statement" && type != "statement") + indent = state.context.indented; + return state.context = new Context(indent, col, type, info, null, state.context); + } + function popContext(state) { + var t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return state.context = state.context.prev; + } + function typeBefore(stream, state, pos) { + if (state.prevToken == "variable" || state.prevToken == "type") return true; + if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; + if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; + } + function isTopScope(context) { + for (; ; ) { + if (!context || context.type == "top") return true; + if (context.type == "}" && context.prev.info != "namespace") return false; + context = context.prev; + } + } + CodeMirror.defineMode("clike", function(config, parserConfig) { + var indentUnit = config.indentUnit, statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, dontAlignCalls = parserConfig.dontAlignCalls, keywords = parserConfig.keywords || {}, types = parserConfig.types || {}, builtin = parserConfig.builtin || {}, blockKeywords = parserConfig.blockKeywords || {}, defKeywords = parserConfig.defKeywords || {}, atoms = parserConfig.atoms || {}, hooks = parserConfig.hooks || {}, multiLineStrings = parserConfig.multiLineStrings, indentStatements = parserConfig.indentStatements !== false, indentSwitch = parserConfig.indentSwitch !== false, namespaceSeparator = parserConfig.namespaceSeparator, isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, numberStart = parserConfig.numberStart || /[\d\.]/, number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, isIdentifierChar = parserConfig.isIdentifierChar || /[\w\$_\xa1-\uffff]/, isReservedIdentifier = parserConfig.isReservedIdentifier || false; + var curPunc, isDefKeyword; + function tokenBase(stream, state) { + var ch = stream.next(); + if (hooks[ch]) { + var result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (numberStart.test(ch)) { + stream.backUp(1); + if (stream.match(number)) return "number"; + stream.next(); + } + if (isPunctuationChar.test(ch)) { + curPunc = ch; + return null; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (isOperatorChar.test(ch)) { + while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) { + } + return "operator"; + } + stream.eatWhile(isIdentifierChar); + if (namespaceSeparator) while (stream.match(namespaceSeparator)) + stream.eatWhile(isIdentifierChar); + var cur = stream.current(); + if (contains(keywords, cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + if (contains(defKeywords, cur)) isDefKeyword = true; + return "keyword"; + } + if (contains(types, cur)) return "type"; + if (contains(builtin, cur) || isReservedIdentifier && isReservedIdentifier(cur)) { + if (contains(blockKeywords, cur)) curPunc = "newstatement"; + return "builtin"; + } + if (contains(atoms, cur)) return "atom"; + return "variable"; + } + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next, end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) + state.tokenize = null; + return "string"; + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = null; + break; + } + maybeEnd = ch == "*"; + } + return "comment"; + } + function maybeEOL(stream, state) { + if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) + state.typeAtEndOfLine = typeBefore(stream, state, stream.pos); + } + return { + startState: function(basecolumn) { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), + indented: 0, + startOfLine: true, + prevToken: null + }; + }, + token: function(stream, state) { + var ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) { + maybeEOL(stream, state); + return null; + } + curPunc = isDefKeyword = null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + if (curPunc == ";" || curPunc == ":" || curPunc == "," && stream.match(/^\s*(?:\/\/.*)?$/, false)) + while (state.context.type == "statement") popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } else if (curPunc == ctx.type) popContext(state); + else if (indentStatements && ((ctx.type == "}" || ctx.type == "top") && curPunc != ";" || ctx.type == "statement" && curPunc == "newstatement")) { + pushContext(state, stream.column(), "statement", stream.current()); + } + if (style == "variable" && (state.prevToken == "def" || parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && isTopScope(state.context) && stream.match(/^\s*\(/, false))) + style = "def"; + if (hooks.token) { + var result = hooks.token(stream, state, style); + if (result !== void 0) style = result; + } + if (style == "def" && parserConfig.styleDefs === false) style = "variable"; + state.startOfLine = false; + state.prevToken = isDefKeyword ? "def" : style || curPunc; + maybeEOL(stream, state); + return style; + }, + indent: function(state, textAfter) { + if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine && isTopScope(state.context)) + return CodeMirror.Pass; + var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); + var closing = firstChar == ctx.type; + if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; + if (parserConfig.dontIndentStatements) + while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) + ctx = ctx.prev; + if (hooks.indent) { + var hook = hooks.indent(state, ctx, textAfter, indentUnit); + if (typeof hook == "number") return hook; + } + var switchBlock = ctx.prev && ctx.prev.info == "switch"; + if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { + while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev; + return ctx.indented; + } + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); + if (ctx.align && (!dontAlignCalls || ctx.type != ")")) + return ctx.column + (closing ? 0 : 1); + if (ctx.type == ")" && !closing) + return ctx.indented + statementIndentUnit; + return ctx.indented + (closing ? 0 : indentUnit) + (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); + }, + electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: "//", + fold: "brace" + }; + }); + function words(str) { + var obj = {}, words2 = str.split(" "); + for (var i = 0; i < words2.length; ++i) obj[words2[i]] = true; + return obj; + } + function contains(words2, word) { + if (typeof words2 === "function") { + return words2(word); + } else { + return words2.propertyIsEnumerable(word); + } + } + var cKeywords = "auto if break case register continue return default do sizeof static else struct switch extern typedef union for goto while enum const volatile inline restrict asm fortran"; + var cppKeywords = "alignas alignof and and_eq audit axiom bitand bitor catch class compl concept constexpr const_cast decltype delete dynamic_cast explicit export final friend import module mutable namespace new noexcept not not_eq operator or or_eq override private protected public reinterpret_cast requires static_assert static_cast template this thread_local throw try typeid typename using virtual xor xor_eq"; + var objCKeywords = "bycopy byref in inout oneway out self super atomic nonatomic retain copy readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd @interface @implementation @end @protocol @encode @property @synthesize @dynamic @class @public @package @private @protected @required @optional @try @catch @finally @import @selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available"; + var objCBuiltins = "FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT"; + var basicCTypes = words("int long char short double float unsigned signed void bool"); + var basicObjCTypes = words("SEL instancetype id Class Protocol BOOL"); + function cTypes(identifier) { + return contains(basicCTypes, identifier) || /.+_t$/.test(identifier); + } + function objCTypes(identifier) { + return cTypes(identifier) || contains(basicObjCTypes, identifier); + } + var cBlockKeywords = "case do else for if switch while struct enum union"; + var cDefKeywords = "struct enum union"; + function cppHook(stream, state) { + if (!state.startOfLine) return false; + for (var ch, next = null; ch = stream.peek(); ) { + if (ch == "\\" && stream.match(/^.$/)) { + next = cppHook; + break; + } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { + break; + } + stream.next(); + } + state.tokenize = next; + return "meta"; + } + function pointerHook(_stream, state) { + if (state.prevToken == "type") return "type"; + return false; + } + function cIsReservedIdentifier(token) { + if (!token || token.length < 2) return false; + if (token[0] != "_") return false; + return token[1] == "_" || token[1] !== token[1].toLowerCase(); + } + function cpp14Literal(stream) { + stream.eatWhile(/[\w\.']/); + return "number"; + } + function cpp11StringHook(stream, state) { + stream.backUp(1); + if (stream.match(/^(?:R|u8R|uR|UR|LR)/)) { + var match = stream.match(/^"([^\s\\()]{0,16})\(/); + if (!match) { + return false; + } + state.cpp11RawStringDelim = match[1]; + state.tokenize = tokenRawString; + return tokenRawString(stream, state); + } + if (stream.match(/^(?:u8|u|U|L)/)) { + if (stream.match( + /^["']/, + /* eat */ + false + )) { + return "string"; + } + return false; + } + stream.next(); + return false; + } + function cppLooksLikeConstructor(word) { + var lastTwo = /(\w+)::~?(\w+)$/.exec(word); + return lastTwo && lastTwo[1] == lastTwo[2]; + } + function tokenAtString(stream, state) { + var next; + while ((next = stream.next()) != null) { + if (next == '"' && !stream.eat('"')) { + state.tokenize = null; + break; + } + } + return "string"; + } + function tokenRawString(stream, state) { + var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, "\\$&"); + var match = stream.match(new RegExp(".*?\\)" + delim + '"')); + if (match) + state.tokenize = null; + else + stream.skipToEnd(); + return "string"; + } + function def(mimes, mode) { + if (typeof mimes == "string") mimes = [mimes]; + var words2 = []; + function add(obj) { + if (obj) { + for (var prop in obj) if (obj.hasOwnProperty(prop)) + words2.push(prop); + } + } + add(mode.keywords); + add(mode.types); + add(mode.builtin); + add(mode.atoms); + if (words2.length) { + mode.helperType = mimes[0]; + CodeMirror.registerHelper("hintWords", mimes[0], words2); + } + for (var i = 0; i < mimes.length; ++i) + CodeMirror.defineMIME(mimes[i], mode); + } + def(["text/x-csrc", "text/x-c", "text/x-chdr"], { + name: "clike", + keywords: words(cKeywords), + types: cTypes, + blockKeywords: words(cBlockKeywords), + defKeywords: words(cDefKeywords), + typeFirstDefinitions: true, + atoms: words("NULL true false"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook + }, + modeProps: { fold: ["brace", "include"] } + }); + def(["text/x-c++src", "text/x-c++hdr"], { + name: "clike", + keywords: words(cKeywords + " " + cppKeywords), + types: cTypes, + blockKeywords: words(cBlockKeywords + " class try catch"), + defKeywords: words(cDefKeywords + " class namespace"), + typeFirstDefinitions: true, + atoms: words("true false NULL nullptr"), + dontIndentStatements: /^template$/, + isIdentifierChar: /[\w\$_~\xa1-\uffff]/, + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && (state.prevToken == ";" || state.prevToken == null || state.prevToken == "}") && cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: { fold: ["brace", "include"] } + }); + def("text/x-java", { + name: "clike", + keywords: words("abstract assert break case catch class const continue default do else enum extends final finally for goto if implements import instanceof interface native new package private protected public return static strictfp super switch synchronized this throw throws transient try volatile while @interface"), + types: words("var byte short int long float double boolean char void Boolean Byte Character Double Float Integer Long Number Object Short String StringBuffer StringBuilder Void"), + blockKeywords: words("catch class do else finally for if switch try while"), + defKeywords: words("class interface enum @interface"), + typeFirstDefinitions: true, + atoms: words("true false null"), + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + hooks: { + "@": function(stream) { + if (stream.match("interface", false)) return false; + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match(/""$/)) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + } + }, + modeProps: { fold: ["brace", "import"] } + }); + def("text/x-csharp", { + name: "clike", + keywords: words("abstract as async await base break case catch checked class const continue default delegate do else enum event explicit extern finally fixed for foreach goto if implicit in init interface internal is lock namespace new operator out override params private protected public readonly record ref required return sealed sizeof stackalloc static struct switch this throw try typeof unchecked unsafe using virtual void volatile while add alias ascending descending dynamic from get global group into join let orderby partial remove select set value var yield"), + types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32 UInt64 bool byte char decimal double short int long object sbyte float string ushort uint ulong"), + blockKeywords: words("catch class do else finally for foreach if struct switch try while"), + defKeywords: words("class interface namespace record struct var"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: { + "@": function(stream, state) { + if (stream.eat('"')) { + state.tokenize = tokenAtString; + return tokenAtString(stream, state); + } + stream.eatWhile(/[\w\$_]/); + return "meta"; + } + } + }); + function tokenTripleString(stream, state) { + var escaped = false; + while (!stream.eol()) { + if (!escaped && stream.match('"""')) { + state.tokenize = null; + break; + } + escaped = stream.next() == "\\" && !escaped; + } + return "string"; + } + function tokenNestedComment(depth) { + return function(stream, state) { + var ch; + while (ch = stream.next()) { + if (ch == "*" && stream.eat("/")) { + if (depth == 1) { + state.tokenize = null; + break; + } else { + state.tokenize = tokenNestedComment(depth - 1); + return state.tokenize(stream, state); + } + } else if (ch == "/" && stream.eat("*")) { + state.tokenize = tokenNestedComment(depth + 1); + return state.tokenize(stream, state); + } + } + return "comment"; + }; + } + def("text/x-scala", { + name: "clike", + keywords: words( + /* scala */ + "abstract case catch class def do else extends final finally for forSome if implicit import lazy match new null object override package private protected return sealed super this throw trait try type val var while with yield _ assert assume require print println printf readLine readBoolean readByte readShort readChar readInt readLong readFloat readDouble" + ), + types: words( + "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" + ), + multiLineStrings: true, + blockKeywords: words("catch class enum do else finally for forSome if match switch try while"), + defKeywords: words("class enum def object package trait type val var"), + atoms: words("true false null"), + indentStatements: false, + indentSwitch: false, + isOperatorChar: /[+\-*&%=<>!?|\/#:@]/, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + if (!stream.match('""')) return false; + state.tokenize = tokenTripleString; + return state.tokenize(stream, state); + }, + "'": function(stream) { + if (stream.match(/^(\\[^'\s]+|[^\\'])'/)) return "string-2"; + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + "=": function(stream, state) { + var cx = state.context; + if (cx.type == "}" && cx.align && stream.eat(">")) { + state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev); + return "operator"; + } else { + return false; + } + }, + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenNestedComment(1); + return state.tokenize(stream, state); + } + }, + modeProps: { closeBrackets: { pairs: '()[]{}""', triples: '"' } } + }); + function tokenKotlinString(tripleString) { + return function(stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!tripleString && !escaped && stream.match('"')) { + end = true; + break; + } + if (tripleString && stream.match('"""')) { + end = true; + break; + } + next = stream.next(); + if (!escaped && next == "$" && stream.match("{")) + stream.skipTo("}"); + escaped = !escaped && next == "\\" && !tripleString; + } + if (end || !tripleString) + state.tokenize = null; + return "string"; + }; + } + def("text/x-kotlin", { + name: "clike", + keywords: words( + /*keywords*/ + "package as typealias class interface this super val operator var fun for is in This throw return annotation break continue object if else while do try when !in !is as? file import where by get set abstract enum open inner override private public internal protected catch finally out final vararg reified dynamic companion constructor init sealed field property receiver param sparam lateinit data inline noinline tailrec external annotation crossinline const operator infix suspend actual expect setparam value" + ), + types: words( + /* package java.lang */ + "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy LazyThreadSafetyMode LongArray Nothing ShortArray Unit" + ), + intendSwitch: false, + indentStatements: false, + multiLineStrings: true, + number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+(\.\d+)?|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, + blockKeywords: words("catch class do else finally for if where try while enum"), + defKeywords: words("class val var object interface fun"), + atoms: words("true false null this"), + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + "*": function(_stream, state) { + return state.prevToken == "." ? "variable" : "operator"; + }, + '"': function(stream, state) { + state.tokenize = tokenKotlinString(stream.match('""')); + return state.tokenize(stream, state); + }, + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenNestedComment(1); + return state.tokenize(stream, state); + }, + indent: function(state, ctx, textAfter, indentUnit) { + var firstChar = textAfter && textAfter.charAt(0); + if ((state.prevToken == "}" || state.prevToken == ")") && textAfter == "") + return state.indented; + if (state.prevToken == "operator" && textAfter != "}" && state.context.type != "}" || state.prevToken == "variable" && firstChar == "." || (state.prevToken == "}" || state.prevToken == ")") && firstChar == ".") + return indentUnit * 2 + ctx.indented; + if (ctx.align && ctx.type == "}") + return ctx.indented + (state.context.type == (textAfter || "").charAt(0) ? 0 : indentUnit); + } + }, + modeProps: { closeBrackets: { triples: '"' } } + }); + def(["x-shader/x-vertex", "x-shader/x-fragment"], { + name: "clike", + keywords: words("sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout"), + types: words("float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4"), + blockKeywords: words("for while do if else struct"), + builtin: words("radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4"), + atoms: words("true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers"), + indentSwitch: false, + hooks: { "#": cppHook }, + modeProps: { fold: ["brace", "include"] } + }); + def("text/x-nesc", { + name: "clike", + keywords: words(cKeywords + " as atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends"), + types: cTypes, + blockKeywords: words(cBlockKeywords), + atoms: words("null true false"), + hooks: { "#": cppHook }, + modeProps: { fold: ["brace", "include"] } + }); + def("text/x-objectivec", { + name: "clike", + keywords: words(cKeywords + " " + objCKeywords), + types: objCTypes, + builtin: words(objCBuiltins), + blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized"), + defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class"), + dontIndentStatements: /^@.*$/, + typeFirstDefinitions: true, + atoms: words("YES NO NULL Nil nil true false nullptr"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook + }, + modeProps: { fold: ["brace", "include"] } + }); + def("text/x-objectivec++", { + name: "clike", + keywords: words(cKeywords + " " + objCKeywords + " " + cppKeywords), + types: objCTypes, + builtin: words(objCBuiltins), + blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"), + defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class class namespace"), + dontIndentStatements: /^@.*$|^template$/, + typeFirstDefinitions: true, + atoms: words("YES NO NULL Nil nil true false nullptr"), + isReservedIdentifier: cIsReservedIdentifier, + hooks: { + "#": cppHook, + "*": pointerHook, + "u": cpp11StringHook, + "U": cpp11StringHook, + "L": cpp11StringHook, + "R": cpp11StringHook, + "0": cpp14Literal, + "1": cpp14Literal, + "2": cpp14Literal, + "3": cpp14Literal, + "4": cpp14Literal, + "5": cpp14Literal, + "6": cpp14Literal, + "7": cpp14Literal, + "8": cpp14Literal, + "9": cpp14Literal, + token: function(stream, state, style) { + if (style == "variable" && stream.peek() == "(" && (state.prevToken == ";" || state.prevToken == null || state.prevToken == "}") && cppLooksLikeConstructor(stream.current())) + return "def"; + } + }, + namespaceSeparator: "::", + modeProps: { fold: ["brace", "include"] } + }); + def("text/x-squirrel", { + name: "clike", + keywords: words("base break clone continue const default delete enum extends function in class foreach local resume return this throw typeof yield constructor instanceof static"), + types: cTypes, + blockKeywords: words("case catch class else for foreach if switch try while"), + defKeywords: words("function local class"), + typeFirstDefinitions: true, + atoms: words("true false null"), + hooks: { "#": cppHook }, + modeProps: { fold: ["brace", "include"] } + }); + var stringTokenizer = null; + function tokenCeylonString(type) { + return function(stream, state) { + var escaped = false, next, end = false; + while (!stream.eol()) { + if (!escaped && stream.match('"') && (type == "single" || stream.match('""'))) { + end = true; + break; + } + if (!escaped && stream.match("``")) { + stringTokenizer = tokenCeylonString(type); + end = true; + break; + } + next = stream.next(); + escaped = type == "single" && !escaped && next == "\\"; + } + if (end) + state.tokenize = null; + return "string"; + }; + } + def("text/x-ceylon", { + name: "clike", + keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else exists extends finally for function given if import in interface is let module new nonempty object of out outer package return satisfies super switch then this throw try value void while"), + types: function(word) { + var first = word.charAt(0); + return first === first.toUpperCase() && first !== first.toLowerCase(); + }, + blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), + defKeywords: words("class dynamic function interface module object package value"), + builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license native optional sealed see serializable shared suppressWarnings tagged throws variable"), + isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, + isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, + numberStart: /[\d#$]/, + number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, + multiLineStrings: true, + typeFirstDefinitions: true, + atoms: words("true false null larger smaller equal empty finished"), + indentSwitch: false, + styleDefs: false, + hooks: { + "@": function(stream) { + stream.eatWhile(/[\w\$_]/); + return "meta"; + }, + '"': function(stream, state) { + state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); + return state.tokenize(stream, state); + }, + "`": function(stream, state) { + if (!stringTokenizer || !stream.match("`")) return false; + state.tokenize = stringTokenizer; + stringTokenizer = null; + return state.tokenize(stream, state); + }, + "'": function(stream) { + stream.eatWhile(/[\w\$_\xa1-\uffff]/); + return "atom"; + }, + token: function(_stream, state, style) { + if ((style == "variable" || style == "type") && state.prevToken == ".") { + return "variable-2"; + } + } + }, + modeProps: { + fold: ["brace", "import"], + closeBrackets: { triples: '"' } + } + }); + }); + })(); + return clike.exports; +} +requireClike(); +var markdown = { exports: {} }; +var meta = { exports: {} }; +var hasRequiredMeta; +function requireMeta() { + if (hasRequiredMeta) return meta.exports; + hasRequiredMeta = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + CodeMirror.modeInfo = [ + { name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"] }, + { name: "PGP", mimes: ["application/pgp", "application/pgp-encrypted", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["asc", "pgp", "sig"] }, + { name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"] }, + { name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i }, + { name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"] }, + { name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h", "ino"] }, + { name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"] }, + { name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy", "cbl"] }, + { name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp", "cs"] }, + { name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"] }, + { name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"] }, + { name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"] }, + { name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists\.txt$/ }, + { name: "CoffeeScript", mimes: ["application/vnd.coffeescript", "text/coffeescript", "text/x-coffeescript"], mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"] }, + { name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"] }, + { name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"] }, + { name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"] }, + { name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"] }, + { name: "CSS", mime: "text/css", mode: "css", ext: ["css"] }, + { name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"] }, + { name: "D", mime: "text/x-d", mode: "d", ext: ["d"] }, + { name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"] }, + { name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"] }, + { name: "Django", mime: "text/x-django", mode: "django" }, + { name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/ }, + { name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"] }, + { name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"] }, + { name: "EBNF", mime: "text/x-ebnf", mode: "ebnf" }, + { name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"] }, + { name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"] }, + { name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"] }, + { name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"] }, + { name: "Embedded JavaScript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"] }, + { name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"] }, + { name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"] }, + { name: "Esper", mime: "text/x-esper", mode: "sql" }, + { name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"] }, + { name: "FCL", mime: "text/x-fcl", mode: "fcl" }, + { name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"] }, + { name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90", "f95"] }, + { name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"] }, + { name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"] }, + { name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"] }, + { name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history)\.md$/i }, + { name: "Go", mime: "text/x-go", mode: "go", ext: ["go"] }, + { name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"], file: /^Jenkinsfile$/ }, + { name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"] }, + { name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"] }, + { name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"] }, + { name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"] }, + { name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"] }, + { name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"] }, + { name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm", "handlebars", "hbs"], alias: ["xhtml"] }, + { name: "HTTP", mime: "message/http", mode: "http" }, + { name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"] }, + { name: "Pug", mime: "text/x-pug", mode: "pug", ext: ["jade", "pug"], alias: ["jade"] }, + { name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"] }, + { name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"] }, + { + name: "JavaScript", + mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], + mode: "javascript", + ext: ["js"], + alias: ["ecmascript", "js", "node"] + }, + { name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"] }, + { name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"] }, + { name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"] }, + { name: "Jinja2", mime: "text/jinja2", mode: "jinja2", ext: ["j2", "jinja", "jinja2"] }, + { name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"], alias: ["jl"] }, + { name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"] }, + { name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"] }, + { name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"] }, + { name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"] }, + { name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"] }, + { name: "mIRC", mime: "text/mirc", mode: "mirc" }, + { name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql" }, + { name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb", "wl", "wls"] }, + { name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"] }, + { name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"] }, + { name: "MS SQL", mime: "text/x-mssql", mode: "sql" }, + { name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"] }, + { name: "MySQL", mime: "text/x-mysql", mode: "sql" }, + { name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i }, + { name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"] }, + { + name: "NTriples", + mimes: ["application/n-triples", "application/n-quads", "text/n-triples"], + mode: "ntriples", + ext: ["nt", "nq"] + }, + { name: "Objective-C", mime: "text/x-objectivec", mode: "clike", ext: ["m"], alias: ["objective-c", "objc"] }, + { name: "Objective-C++", mime: "text/x-objectivec++", mode: "clike", ext: ["mm"], alias: ["objective-c++", "objc++"] }, + { name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"] }, + { name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"] }, + { name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"] }, + { name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"] }, + { name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"] }, + { name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"] }, + { name: "PHP", mimes: ["text/x-php", "application/x-httpd-php", "application/x-httpd-php-open"], mode: "php", ext: ["php", "php3", "php4", "php5", "php7", "phtml"] }, + { name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"] }, + { name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"] }, + { name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"] }, + { name: "PostgreSQL", mime: "text/x-pgsql", mode: "sql" }, + { name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"] }, + { name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"] }, + { name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"] }, + { name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/ }, + { name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"] }, + { name: "Q", mime: "text/x-q", mode: "q", ext: ["q"] }, + { name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r", "R"], alias: ["rscript"] }, + { name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"] }, + { name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm" }, + { name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"] }, + { name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"] }, + { name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"] }, + { name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"] }, + { name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"] }, + { name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"] }, + { name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"] }, + { name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"] }, + { name: "Shell", mimes: ["text/x-sh", "application/x-sh"], mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/ }, + { name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"] }, + { name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"] }, + { name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"] }, + { name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"] }, + { name: "Solr", mime: "text/x-solr", mode: "solr" }, + { name: "SML", mime: "text/x-sml", mode: "mllike", ext: ["sml", "sig", "fun", "smackspec"] }, + { name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"] }, + { name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"] }, + { name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"] }, + { name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"] }, + { name: "SQLite", mime: "text/x-sqlite", mode: "sql" }, + { name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"] }, + { name: "Stylus", mime: "text/x-styl", mode: "stylus", ext: ["styl"] }, + { name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"] }, + { name: "sTeX", mime: "text/x-stex", mode: "stex" }, + { name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx", "tex"], alias: ["tex"] }, + { name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v", "sv", "svh"] }, + { name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"] }, + { name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"] }, + { name: "TiddlyWiki", mime: "text/x-tiddlywiki", mode: "tiddlywiki" }, + { name: "Tiki wiki", mime: "text/tiki", mode: "tiki" }, + { name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"] }, + { name: "Tornado", mime: "text/x-tornado", mode: "tornado" }, + { name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"] }, + { name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"] }, + { name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"] }, + { name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"] }, + { name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"] }, + { name: "TypeScript-JSX", mime: "text/typescript-jsx", mode: "jsx", ext: ["tsx"], alias: ["tsx"] }, + { name: "Twig", mime: "text/x-twig", mode: "twig" }, + { name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"] }, + { name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"] }, + { name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"] }, + { name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"] }, + { name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"] }, + { name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"] }, + { name: "Vue.js Component", mimes: ["script/x-vue", "text/x-vue"], mode: "vue", ext: ["vue"] }, + { name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd", "svg"], alias: ["rss", "wsdl", "xsd"] }, + { name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"] }, + { name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"] }, + { name: "YAML", mimes: ["text/x-yaml", "text/yaml"], mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"] }, + { name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"] }, + { name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"] }, + { name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"] }, + { name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"] }, + { name: "WebAssembly", mime: "text/webassembly", mode: "wast", ext: ["wat", "wast"] } + ]; + for (var i = 0; i < CodeMirror.modeInfo.length; i++) { + var info = CodeMirror.modeInfo[i]; + if (info.mimes) info.mime = info.mimes[0]; + } + CodeMirror.findModeByMIME = function(mime) { + mime = mime.toLowerCase(); + for (var i2 = 0; i2 < CodeMirror.modeInfo.length; i2++) { + var info2 = CodeMirror.modeInfo[i2]; + if (info2.mime == mime) return info2; + if (info2.mimes) { + for (var j = 0; j < info2.mimes.length; j++) + if (info2.mimes[j] == mime) return info2; + } + } + if (/\+xml$/.test(mime)) return CodeMirror.findModeByMIME("application/xml"); + if (/\+json$/.test(mime)) return CodeMirror.findModeByMIME("application/json"); + }; + CodeMirror.findModeByExtension = function(ext) { + ext = ext.toLowerCase(); + for (var i2 = 0; i2 < CodeMirror.modeInfo.length; i2++) { + var info2 = CodeMirror.modeInfo[i2]; + if (info2.ext) { + for (var j = 0; j < info2.ext.length; j++) + if (info2.ext[j] == ext) return info2; + } + } + }; + CodeMirror.findModeByFileName = function(filename) { + for (var i2 = 0; i2 < CodeMirror.modeInfo.length; i2++) { + var info2 = CodeMirror.modeInfo[i2]; + if (info2.file && info2.file.test(filename)) return info2; + } + var dot = filename.lastIndexOf("."); + var ext = dot > -1 && filename.substring(dot + 1, filename.length); + if (ext) return CodeMirror.findModeByExtension(ext); + }; + CodeMirror.findModeByName = function(name) { + name = name.toLowerCase(); + for (var i2 = 0; i2 < CodeMirror.modeInfo.length; i2++) { + var info2 = CodeMirror.modeInfo[i2]; + if (info2.name.toLowerCase() == name) return info2; + if (info2.alias) { + for (var j = 0; j < info2.alias.length; j++) + if (info2.alias[j].toLowerCase() == name) return info2; + } + } + }; + }); + })(); + return meta.exports; +} +var hasRequiredMarkdown; +function requireMarkdown() { + if (hasRequiredMarkdown) return markdown.exports; + hasRequiredMarkdown = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror(), requireXml(), requireMeta()); + })(function(CodeMirror) { + CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { + var htmlMode = CodeMirror.getMode(cmCfg, "text/html"); + var htmlModeMissing = htmlMode.name == "null"; + function getMode(name) { + if (CodeMirror.findModeByName) { + var found = CodeMirror.findModeByName(name); + if (found) name = found.mime || found.mimes[0]; + } + var mode2 = CodeMirror.getMode(cmCfg, name); + return mode2.name == "null" ? null : mode2; + } + if (modeCfg.highlightFormatting === void 0) + modeCfg.highlightFormatting = false; + if (modeCfg.maxBlockquoteDepth === void 0) + modeCfg.maxBlockquoteDepth = 0; + if (modeCfg.taskLists === void 0) modeCfg.taskLists = false; + if (modeCfg.strikethrough === void 0) + modeCfg.strikethrough = false; + if (modeCfg.emoji === void 0) + modeCfg.emoji = false; + if (modeCfg.fencedCodeBlockHighlighting === void 0) + modeCfg.fencedCodeBlockHighlighting = true; + if (modeCfg.fencedCodeBlockDefaultMode === void 0) + modeCfg.fencedCodeBlockDefaultMode = "text/plain"; + if (modeCfg.xml === void 0) + modeCfg.xml = true; + if (modeCfg.tokenTypeOverrides === void 0) + modeCfg.tokenTypeOverrides = {}; + var tokenTypes = { + header: "header", + code: "comment", + quote: "quote", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + hr: "hr", + image: "image", + imageAltText: "image-alt-text", + imageMarker: "image-marker", + formatting: "formatting", + linkInline: "link", + linkEmail: "link", + linkText: "link", + linkHref: "string", + em: "em", + strong: "strong", + strikethrough: "strikethrough", + emoji: "builtin" + }; + for (var tokenType in tokenTypes) { + if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) { + tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType]; + } + } + var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/, listRE = /^(?:[*\-+]|^[0-9]+([.)]))\s+/, taskListRE = /^\[(x| )\](?=\s)/i, atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/, setextHeaderRE = /^ {0,3}(?:\={1,}|-{2,})\s*$/, textRE = /^[^#!\[\]*_\\<>` "'(~:]+/, fencedCodeRE = /^(~~~+|```+)[ \t]*([\w\/+#-]*)[^\n`]*$/, linkDefRE = /^\s*\[[^\]]+?\]:.*$/, punctuation = /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/, expandedTab = " "; + function switchInline(stream, state, f) { + state.f = state.inline = f; + return f(stream, state); + } + function switchBlock(stream, state, f) { + state.f = state.block = f; + return f(stream, state); + } + function lineIsEmpty(line) { + return !line || !/\S/.test(line.string); + } + function blankLine(state) { + state.linkTitle = false; + state.linkHref = false; + state.linkText = false; + state.em = false; + state.strong = false; + state.strikethrough = false; + state.quote = 0; + state.indentedCode = false; + if (state.f == htmlBlock) { + var exit = htmlModeMissing; + if (!exit) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState); + exit = inner.mode.name == "xml" && inner.state.tagStart === null && (!inner.state.context && inner.state.tokenize.isInText); + } + if (exit) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + } + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + state.prevLine = state.thisLine; + state.thisLine = { stream: null }; + return null; + } + function blockNormal(stream, state) { + var firstTokenOnLine = stream.column() === state.indentation; + var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream); + var prevLineIsIndentedCode = state.indentedCode; + var prevLineIsHr = state.prevLine.hr; + var prevLineIsList = state.list !== false; + var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3; + state.indentedCode = false; + var lineIndentation = state.indentation; + if (state.indentationDiff === null) { + state.indentationDiff = state.indentation; + if (prevLineIsList) { + state.list = null; + while (lineIndentation < state.listStack[state.listStack.length - 1]) { + state.listStack.pop(); + if (state.listStack.length) { + state.indentation = state.listStack[state.listStack.length - 1]; + } else { + state.list = false; + } + } + if (state.list !== false) { + state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]; + } + } + } + var allowsInlineContinuation = !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header && (!prevLineIsList || !prevLineIsIndentedCode) && !state.prevLine.fencedCodeEnd; + var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) && state.indentation <= maxNonCodeIndentation && stream.match(hrRE); + var match = null; + if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd || state.prevLine.header || prevLineLineIsEmpty)) { + stream.skipToEnd(); + state.indentedCode = true; + return tokenTypes.code; + } else if (stream.eatSpace()) { + return null; + } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) { + state.quote = 0; + state.header = match[1].length; + state.thisLine.header = true; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (state.indentation <= maxNonCodeIndentation && stream.eat(">")) { + state.quote = firstTokenOnLine ? 1 : state.quote + 1; + if (modeCfg.highlightFormatting) state.formatting = "quote"; + stream.eatSpace(); + return getType(state); + } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) { + var listType = match[1] ? "ol" : "ul"; + state.indentation = lineIndentation + stream.current().length; + state.list = true; + state.quote = 0; + state.listStack.push(state.indentation); + state.em = false; + state.strong = false; + state.code = false; + state.strikethrough = false; + if (modeCfg.taskLists && stream.match(taskListRE, false)) { + state.taskList = true; + } + state.f = state.inline; + if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; + return getType(state); + } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) { + state.quote = 0; + state.fencedEndRE = new RegExp(match[1] + "+ *$"); + state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode); + if (state.localMode) state.localState = CodeMirror.startState(state.localMode); + state.f = state.block = local; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = -1; + return getType(state); + } else if ( + // if setext set, indicates line after ---/=== + state.setext || // line before ---/=== + (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false && !state.code && !isHr && !linkDefRE.test(stream.string) && (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE)) + ) { + if (!state.setext) { + state.header = match[0].charAt(0) == "=" ? 1 : 2; + state.setext = state.header; + } else { + state.header = state.setext; + state.setext = 0; + stream.skipToEnd(); + if (modeCfg.highlightFormatting) state.formatting = "header"; + } + state.thisLine.header = true; + state.f = state.inline; + return getType(state); + } else if (isHr) { + stream.skipToEnd(); + state.hr = true; + state.thisLine.hr = true; + return tokenTypes.hr; + } else if (stream.peek() === "[") { + return switchInline(stream, state, footnoteLink); + } + return switchInline(stream, state, state.inline); + } + function htmlBlock(stream, state) { + var style = htmlMode.token(stream, state.htmlState); + if (!htmlModeMissing) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState); + if (inner.mode.name == "xml" && inner.state.tagStart === null && (!inner.state.context && inner.state.tokenize.isInText) || state.md_inside && stream.current().indexOf(">") > -1) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + } + return style; + } + function local(stream, state) { + var currListInd = state.listStack[state.listStack.length - 1] || 0; + var hasExitedList = state.indentation < currListInd; + var maxFencedEndInd = currListInd + 3; + if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) { + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + var returnType; + if (!hasExitedList) returnType = getType(state); + state.localMode = state.localState = null; + state.block = blockNormal; + state.f = inlineNormal; + state.fencedEndRE = null; + state.code = 0; + state.thisLine.fencedCodeEnd = true; + if (hasExitedList) return switchBlock(stream, state, state.block); + return returnType; + } else if (state.localMode) { + return state.localMode.token(stream, state.localState); + } else { + stream.skipToEnd(); + return tokenTypes.code; + } + } + function getType(state) { + var styles = []; + if (state.formatting) { + styles.push(tokenTypes.formatting); + if (typeof state.formatting === "string") state.formatting = [state.formatting]; + for (var i = 0; i < state.formatting.length; i++) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i]); + if (state.formatting[i] === "header") { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header); + } + if (state.formatting[i] === "quote") { + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote); + } else { + styles.push("error"); + } + } + } + } + if (state.taskOpen) { + styles.push("meta"); + return styles.length ? styles.join(" ") : null; + } + if (state.taskClosed) { + styles.push("property"); + return styles.length ? styles.join(" ") : null; + } + if (state.linkHref) { + styles.push(tokenTypes.linkHref, "url"); + } else { + if (state.strong) { + styles.push(tokenTypes.strong); + } + if (state.em) { + styles.push(tokenTypes.em); + } + if (state.strikethrough) { + styles.push(tokenTypes.strikethrough); + } + if (state.emoji) { + styles.push(tokenTypes.emoji); + } + if (state.linkText) { + styles.push(tokenTypes.linkText); + } + if (state.code) { + styles.push(tokenTypes.code); + } + if (state.image) { + styles.push(tokenTypes.image); + } + if (state.imageAltText) { + styles.push(tokenTypes.imageAltText, "link"); + } + if (state.imageMarker) { + styles.push(tokenTypes.imageMarker); + } + } + if (state.header) { + styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); + } + if (state.quote) { + styles.push(tokenTypes.quote); + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.quote + "-" + state.quote); + } else { + styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth); + } + } + if (state.list !== false) { + var listMod = (state.listStack.length - 1) % 3; + if (!listMod) { + styles.push(tokenTypes.list1); + } else if (listMod === 1) { + styles.push(tokenTypes.list2); + } else { + styles.push(tokenTypes.list3); + } + } + if (state.trailingSpaceNewLine) { + styles.push("trailing-space-new-line"); + } else if (state.trailingSpace) { + styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); + } + return styles.length ? styles.join(" ") : null; + } + function handleText(stream, state) { + if (stream.match(textRE, true)) { + return getType(state); + } + return void 0; + } + function inlineNormal(stream, state) { + var style = state.text(stream, state); + if (typeof style !== "undefined") + return style; + if (state.list) { + state.list = null; + return getType(state); + } + if (state.taskList) { + var taskOpen = stream.match(taskListRE, true)[1] === " "; + if (taskOpen) state.taskOpen = true; + else state.taskClosed = true; + if (modeCfg.highlightFormatting) state.formatting = "task"; + state.taskList = false; + return getType(state); + } + state.taskOpen = false; + state.taskClosed = false; + if (state.header && stream.match(/^#+$/, true)) { + if (modeCfg.highlightFormatting) state.formatting = "header"; + return getType(state); + } + var ch = stream.next(); + if (state.linkTitle) { + state.linkTitle = false; + var matchCh = ch; + if (ch === "(") { + matchCh = ")"; + } + matchCh = (matchCh + "").replace(/([.?*+^\[\]\\(){}|-])/g, "\\$1"); + var regex = "^\\s*(?:[^" + matchCh + "\\\\]+|\\\\\\\\|\\\\.)" + matchCh; + if (stream.match(new RegExp(regex), true)) { + return tokenTypes.linkHref; + } + } + if (ch === "`") { + var previousFormatting = state.formatting; + if (modeCfg.highlightFormatting) state.formatting = "code"; + stream.eatWhile("`"); + var count = stream.current().length; + if (state.code == 0 && (!state.quote || count == 1)) { + state.code = count; + return getType(state); + } else if (count == state.code) { + var t = getType(state); + state.code = 0; + return t; + } else { + state.formatting = previousFormatting; + return getType(state); + } + } else if (state.code) { + return getType(state); + } + if (ch === "\\") { + stream.next(); + if (modeCfg.highlightFormatting) { + var type = getType(state); + var formattingEscape = tokenTypes.formatting + "-escape"; + return type ? type + " " + formattingEscape : formattingEscape; + } + } + if (ch === "!" && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { + state.imageMarker = true; + state.image = true; + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + if (ch === "[" && state.imageMarker && stream.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/, false)) { + state.imageMarker = false; + state.imageAltText = true; + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + if (ch === "]" && state.imageAltText) { + if (modeCfg.highlightFormatting) state.formatting = "image"; + var type = getType(state); + state.imageAltText = false; + state.image = false; + state.inline = state.f = linkHref; + return type; + } + if (ch === "[" && !state.image) { + if (state.linkText && stream.match(/^.*?\]/)) return getType(state); + state.linkText = true; + if (modeCfg.highlightFormatting) state.formatting = "link"; + return getType(state); + } + if (ch === "]" && state.linkText) { + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + state.linkText = false; + state.inline = state.f = stream.match(/\(.*?\)| ?\[.*?\]/, false) ? linkHref : inlineNormal; + return type; + } + if (ch === "<" && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type) { + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + if (ch === "<" && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type) { + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkEmail; + } + if (modeCfg.xml && ch === "<" && stream.match(/^(!--|\?|!\[CDATA\[|[a-z][a-z0-9-]*(?:\s+[a-z_:.\-]+(?:\s*=\s*[^>]+)?)*\s*(?:>|$))/i, false)) { + var end = stream.string.indexOf(">", stream.pos); + if (end != -1) { + var atts = stream.string.substring(stream.start, end); + if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; + } + stream.backUp(1); + state.htmlState = CodeMirror.startState(htmlMode); + return switchBlock(stream, state, htmlBlock); + } + if (modeCfg.xml && ch === "<" && stream.match(/^\/\w*?>/)) { + state.md_inside = false; + return "tag"; + } else if (ch === "*" || ch === "_") { + var len = 1, before = stream.pos == 1 ? " " : stream.string.charAt(stream.pos - 2); + while (len < 3 && stream.eat(ch)) len++; + var after = stream.peek() || " "; + var leftFlanking = !/\s/.test(after) && (!punctuation.test(after) || /\s/.test(before) || punctuation.test(before)); + var rightFlanking = !/\s/.test(before) && (!punctuation.test(before) || /\s/.test(after) || punctuation.test(after)); + var setEm = null, setStrong = null; + if (len % 2) { + if (!state.em && leftFlanking && (ch === "*" || !rightFlanking || punctuation.test(before))) + setEm = true; + else if (state.em == ch && rightFlanking && (ch === "*" || !leftFlanking || punctuation.test(after))) + setEm = false; + } + if (len > 1) { + if (!state.strong && leftFlanking && (ch === "*" || !rightFlanking || punctuation.test(before))) + setStrong = true; + else if (state.strong == ch && rightFlanking && (ch === "*" || !leftFlanking || punctuation.test(after))) + setStrong = false; + } + if (setStrong != null || setEm != null) { + if (modeCfg.highlightFormatting) state.formatting = setEm == null ? "strong" : setStrong == null ? "em" : "strong em"; + if (setEm === true) state.em = ch; + if (setStrong === true) state.strong = ch; + var t = getType(state); + if (setEm === false) state.em = false; + if (setStrong === false) state.strong = false; + return t; + } + } else if (ch === " ") { + if (stream.eat("*") || stream.eat("_")) { + if (stream.peek() === " ") { + return getType(state); + } else { + stream.backUp(1); + } + } + } + if (modeCfg.strikethrough) { + if (ch === "~" && stream.eatWhile(ch)) { + if (state.strikethrough) { + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + var t = getType(state); + state.strikethrough = false; + return t; + } else if (stream.match(/^[^\s]/, false)) { + state.strikethrough = true; + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + return getType(state); + } + } else if (ch === " ") { + if (stream.match("~~", true)) { + if (stream.peek() === " ") { + return getType(state); + } else { + stream.backUp(2); + } + } + } + } + if (modeCfg.emoji && ch === ":" && stream.match(/^(?:[a-z_\d+][a-z_\d+-]*|\-[a-z_\d+][a-z_\d+-]*):/)) { + state.emoji = true; + if (modeCfg.highlightFormatting) state.formatting = "emoji"; + var retType = getType(state); + state.emoji = false; + return retType; + } + if (ch === " ") { + if (stream.match(/^ +$/, false)) { + state.trailingSpace++; + } else if (state.trailingSpace) { + state.trailingSpaceNewLine = true; + } + } + return getType(state); + } + function linkInline(stream, state) { + var ch = stream.next(); + if (ch === ">") { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type) { + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + stream.match(/^[^>]+/, true); + return tokenTypes.linkInline; + } + function linkHref(stream, state) { + if (stream.eatSpace()) { + return null; + } + var ch = stream.next(); + if (ch === "(" || ch === "[") { + state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]"); + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + state.linkHref = true; + return getType(state); + } + return "error"; + } + var linkRE = { + ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/, + "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\]]|\\.)*\])*?(?=\])/ + }; + function getLinkHrefInside(endChar) { + return function(stream, state) { + var ch = stream.next(); + if (ch === endChar) { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + var returnState = getType(state); + state.linkHref = false; + return returnState; + } + stream.match(linkRE[endChar]); + state.linkHref = true; + return getType(state); + }; + } + function footnoteLink(stream, state) { + if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) { + state.f = footnoteLinkInside; + stream.next(); + if (modeCfg.highlightFormatting) state.formatting = "link"; + state.linkText = true; + return getType(state); + } + return switchInline(stream, state, inlineNormal); + } + function footnoteLinkInside(stream, state) { + if (stream.match("]:", true)) { + state.f = state.inline = footnoteUrl; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var returnType = getType(state); + state.linkText = false; + return returnType; + } + stream.match(/^([^\]\\]|\\.)+/, true); + return tokenTypes.linkText; + } + function footnoteUrl(stream, state) { + if (stream.eatSpace()) { + return null; + } + stream.match(/^[^\s]+/, true); + if (stream.peek() === void 0) { + state.linkTitle = true; + } else { + stream.match(/^(?:\s+(?:"(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+'|\((?:[^)\\]|\\.)+\)))?/, true); + } + state.f = state.inline = inlineNormal; + return tokenTypes.linkHref + " url"; + } + var mode = { + startState: function() { + return { + f: blockNormal, + prevLine: { stream: null }, + thisLine: { stream: null }, + block: blockNormal, + htmlState: null, + indentation: 0, + inline: inlineNormal, + text: handleText, + formatting: false, + linkText: false, + linkHref: false, + linkTitle: false, + code: 0, + em: false, + strong: false, + header: 0, + setext: 0, + hr: false, + taskList: false, + list: false, + listStack: [], + quote: 0, + trailingSpace: 0, + trailingSpaceNewLine: false, + strikethrough: false, + emoji: false, + fencedEndRE: null + }; + }, + copyState: function(s) { + return { + f: s.f, + prevLine: s.prevLine, + thisLine: s.thisLine, + block: s.block, + htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), + indentation: s.indentation, + localMode: s.localMode, + localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, + inline: s.inline, + text: s.text, + formatting: false, + linkText: s.linkText, + linkTitle: s.linkTitle, + linkHref: s.linkHref, + code: s.code, + em: s.em, + strong: s.strong, + strikethrough: s.strikethrough, + emoji: s.emoji, + header: s.header, + setext: s.setext, + hr: s.hr, + taskList: s.taskList, + list: s.list, + listStack: s.listStack.slice(0), + quote: s.quote, + indentedCode: s.indentedCode, + trailingSpace: s.trailingSpace, + trailingSpaceNewLine: s.trailingSpaceNewLine, + md_inside: s.md_inside, + fencedEndRE: s.fencedEndRE + }; + }, + token: function(stream, state) { + state.formatting = false; + if (stream != state.thisLine.stream) { + state.header = 0; + state.hr = false; + if (stream.match(/^\s*$/, true)) { + blankLine(state); + return null; + } + state.prevLine = state.thisLine; + state.thisLine = { stream }; + state.taskList = false; + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + if (!state.localState) { + state.f = state.block; + if (state.f != htmlBlock) { + var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, expandedTab).length; + state.indentation = indentation; + state.indentationDiff = null; + if (indentation > 0) return null; + } + } + } + return state.f(stream, state); + }, + innerMode: function(state) { + if (state.block == htmlBlock) return { state: state.htmlState, mode: htmlMode }; + if (state.localState) return { state: state.localState, mode: state.localMode }; + return { state, mode }; + }, + indent: function(state, textAfter, line) { + if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line); + if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line); + return CodeMirror.Pass; + }, + blankLine, + getType, + blockCommentStart: "", + closeBrackets: "()[]{}''\"\"``", + fold: "markdown" + }; + return mode; + }, "xml"); + CodeMirror.defineMIME("text/markdown", "markdown"); + CodeMirror.defineMIME("text/x-markdown", "markdown"); + }); + })(); + return markdown.exports; +} +requireMarkdown(); +var placeholder = { exports: {} }; +var hasRequiredPlaceholder; +function requirePlaceholder() { + if (hasRequiredPlaceholder) return placeholder.exports; + hasRequiredPlaceholder = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + CodeMirror.defineOption("placeholder", "", function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.on("blur", onBlur); + cm.on("change", onChange); + cm.on("swapDoc", onChange); + CodeMirror.on(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose = function() { + onComposition(cm); + }); + onChange(cm); + } else if (!val && prev) { + cm.off("blur", onBlur); + cm.off("change", onChange); + cm.off("swapDoc", onChange); + CodeMirror.off(cm.getInputField(), "compositionupdate", cm.state.placeholderCompose); + clearPlaceholder(cm); + var wrapper = cm.getWrapperElement(); + wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); + } + if (val && !cm.hasFocus()) onBlur(cm); + }); + function clearPlaceholder(cm) { + if (cm.state.placeholder) { + cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); + cm.state.placeholder = null; + } + } + function setPlaceholder(cm) { + clearPlaceholder(cm); + var elt = cm.state.placeholder = document.createElement("pre"); + elt.style.cssText = "height: 0; overflow: visible"; + elt.style.direction = cm.getOption("direction"); + elt.className = "CodeMirror-placeholder CodeMirror-line-like"; + var placeHolder = cm.getOption("placeholder"); + if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder); + elt.appendChild(placeHolder); + cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); + } + function onComposition(cm) { + setTimeout(function() { + var empty = false; + if (cm.lineCount() == 1) { + var input = cm.getInputField(); + empty = input.nodeName == "TEXTAREA" ? !cm.getLine(0).length : !/[^\u200b]/.test(input.querySelector(".CodeMirror-line").textContent); + } + if (empty) setPlaceholder(cm); + else clearPlaceholder(cm); + }, 20); + } + function onBlur(cm) { + if (isEmpty(cm)) setPlaceholder(cm); + } + function onChange(cm) { + var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); + wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); + if (empty) setPlaceholder(cm); + else clearPlaceholder(cm); + } + function isEmpty(cm) { + return cm.lineCount() === 1 && cm.getLine(0) === ""; + } + }); + })(); + return placeholder.exports; +} +requirePlaceholder(); +var simple = { exports: {} }; +var hasRequiredSimple; +function requireSimple() { + if (hasRequiredSimple) return simple.exports; + hasRequiredSimple = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + CodeMirror.defineSimpleMode = function(name, states) { + CodeMirror.defineMode(name, function(config) { + return CodeMirror.simpleMode(config, states); + }); + }; + CodeMirror.simpleMode = function(config, states) { + ensureState(states, "start"); + var states_ = {}, meta2 = states.meta || {}, hasIndentation = false; + for (var state in states) if (state != meta2 && states.hasOwnProperty(state)) { + var list = states_[state] = [], orig = states[state]; + for (var i = 0; i < orig.length; i++) { + var data = orig[i]; + list.push(new Rule(data, states)); + if (data.indent || data.dedent) hasIndentation = true; + } + } + var mode = { + startState: function() { + return { + state: "start", + pending: null, + local: null, + localState: null, + indent: hasIndentation ? [] : null + }; + }, + copyState: function(state2) { + var s = { + state: state2.state, + pending: state2.pending, + local: state2.local, + localState: null, + indent: state2.indent && state2.indent.slice(0) + }; + if (state2.localState) + s.localState = CodeMirror.copyState(state2.local.mode, state2.localState); + if (state2.stack) + s.stack = state2.stack.slice(0); + for (var pers = state2.persistentStates; pers; pers = pers.next) + s.persistentStates = { + mode: pers.mode, + spec: pers.spec, + state: pers.state == state2.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), + next: s.persistentStates + }; + return s; + }, + token: tokenFunction(states_, config), + innerMode: function(state2) { + return state2.local && { mode: state2.local.mode, state: state2.localState }; + }, + indent: indentFunction(states_, meta2) + }; + if (meta2) { + for (var prop in meta2) if (meta2.hasOwnProperty(prop)) + mode[prop] = meta2[prop]; + } + return mode; + }; + function ensureState(states, name) { + if (!states.hasOwnProperty(name)) + throw new Error("Undefined state " + name + " in simple mode"); + } + function toRegex(val, caret) { + if (!val) return /(?:)/; + var flags = ""; + if (val instanceof RegExp) { + if (val.ignoreCase) flags = "i"; + if (val.unicode) flags += "u"; + val = val.source; + } else { + val = String(val); + } + return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); + } + function asToken(val) { + if (!val) return null; + if (val.apply) return val; + if (typeof val == "string") return val.replace(/\./g, " "); + var result = []; + for (var i = 0; i < val.length; i++) + result.push(val[i] && val[i].replace(/\./g, " ")); + return result; + } + function Rule(data, states) { + if (data.next || data.push) ensureState(states, data.next || data.push); + this.regex = toRegex(data.regex); + this.token = asToken(data.token); + this.data = data; + } + function tokenFunction(states, config) { + return function(stream, state) { + if (state.pending) { + var pend = state.pending.shift(); + if (state.pending.length == 0) state.pending = null; + stream.pos += pend.text.length; + return pend.token; + } + if (state.local) { + if (state.local.end && stream.match(state.local.end)) { + var tok = state.local.endToken || null; + state.local = state.localState = null; + return tok; + } else { + var tok = state.local.mode.token(stream, state.localState), m; + if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) + stream.pos = stream.start + m.index; + return tok; + } + } + var curState = states[state.state]; + for (var i = 0; i < curState.length; i++) { + var rule = curState[i]; + var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); + if (matches) { + if (rule.data.next) { + state.state = rule.data.next; + } else if (rule.data.push) { + (state.stack || (state.stack = [])).push(state.state); + state.state = rule.data.push; + } else if (rule.data.pop && state.stack && state.stack.length) { + state.state = state.stack.pop(); + } + if (rule.data.mode) + enterLocalMode(config, state, rule.data.mode, rule.token); + if (rule.data.indent) + state.indent.push(stream.indentation() + config.indentUnit); + if (rule.data.dedent) + state.indent.pop(); + var token = rule.token; + if (token && token.apply) token = token(matches); + if (matches.length > 2 && rule.token && typeof rule.token != "string") { + for (var j = 2; j < matches.length; j++) + if (matches[j]) + (state.pending || (state.pending = [])).push({ text: matches[j], token: rule.token[j - 1] }); + stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); + return token[0]; + } else if (token && token.join) { + return token[0]; + } else { + return token; + } + } + } + stream.next(); + return null; + }; + } + function cmp(a, b) { + if (a === b) return true; + if (!a || typeof a != "object" || !b || typeof b != "object") return false; + var props = 0; + for (var prop in a) if (a.hasOwnProperty(prop)) { + if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; + props++; + } + for (var prop in b) if (b.hasOwnProperty(prop)) props--; + return props == 0; + } + function enterLocalMode(config, state, spec, token) { + var pers; + if (spec.persistent) { + for (var p = state.persistentStates; p && !pers; p = p.next) + if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; + } + var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); + var lState = pers ? pers.state : CodeMirror.startState(mode); + if (spec.persistent && !pers) + state.persistentStates = { mode, spec: spec.spec, state: lState, next: state.persistentStates }; + state.localState = lState; + state.local = { + mode, + end: spec.end && toRegex(spec.end), + endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), + endToken: token && token.join ? token[token.length - 1] : token + }; + } + function indexOf(val, arr) { + for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; + } + function indentFunction(states, meta2) { + return function(state, textAfter, line) { + if (state.local && state.local.mode.indent) + return state.local.mode.indent(state.localState, textAfter, line); + if (state.indent == null || state.local || meta2.dontIndentStates && indexOf(state.state, meta2.dontIndentStates) > -1) + return CodeMirror.Pass; + var pos = state.indent.length - 1, rules = states[state.state]; + scan: for (; ; ) { + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { + var m = rule.regex.exec(textAfter); + if (m && m[0]) { + pos--; + if (rule.next || rule.push) rules = states[rule.next || rule.push]; + textAfter = textAfter.slice(m[0].length); + continue scan; + } + } + } + break; + } + return pos < 0 ? 0 : state.indent[pos]; + }; + } + }); + })(); + return simple.exports; +} +requireSimple(); +var yaml = { exports: {} }; +var hasRequiredYaml; +function requireYaml() { + if (hasRequiredYaml) return yaml.exports; + hasRequiredYaml = 1; + (function(module, exports) { + (function(mod) { + mod(requireCodemirror()); + })(function(CodeMirror) { + CodeMirror.defineMode("yaml", function() { + var cons = ["true", "false", "on", "off", "yes", "no"]; + var keywordRegex = new RegExp("\\b((" + cons.join(")|(") + "))$", "i"); + return { + token: function(stream, state) { + var ch = stream.peek(); + var esc = state.escaped; + state.escaped = false; + if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { + stream.skipToEnd(); + return "comment"; + } + if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) + return "string"; + if (state.literal && stream.indentation() > state.keyCol) { + stream.skipToEnd(); + return "string"; + } else if (state.literal) { + state.literal = false; + } + if (stream.sol()) { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + if (stream.match("---")) { + return "def"; + } + if (stream.match("...")) { + return "def"; + } + if (stream.match(/\s*-\s+/)) { + return "meta"; + } + } + if (stream.match(/^(\{|\}|\[|\])/)) { + if (ch == "{") + state.inlinePairs++; + else if (ch == "}") + state.inlinePairs--; + else if (ch == "[") + state.inlineList++; + else + state.inlineList--; + return "meta"; + } + if (state.inlineList > 0 && !esc && ch == ",") { + stream.next(); + return "meta"; + } + if (state.inlinePairs > 0 && !esc && ch == ",") { + state.keyCol = 0; + state.pair = false; + state.pairStart = false; + stream.next(); + return "meta"; + } + if (state.pairStart) { + if (stream.match(/^\s*(\||\>)\s*/)) { + state.literal = true; + return "meta"; + } + if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { + return "variable-2"; + } + if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { + return "number"; + } + if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { + return "number"; + } + if (stream.match(keywordRegex)) { + return "keyword"; + } + } + if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^\s,\[\]{}#&*!|>'"%@`])[^#:]*(?=:($|\s))/)) { + state.pair = true; + state.keyCol = stream.indentation(); + return "atom"; + } + if (state.pair && stream.match(/^:\s*/)) { + state.pairStart = true; + return "meta"; + } + state.pairStart = false; + state.escaped = ch == "\\"; + stream.next(); + return null; + }, + startState: function() { + return { + pair: false, + pairStart: false, + keyCol: 0, + inlinePairs: 0, + inlineList: 0, + literal: false, + escaped: false + }; + }, + lineComment: "#", + fold: "indent" + }; + }); + CodeMirror.defineMIME("text/x-yaml", "yaml"); + CodeMirror.defineMIME("text/yaml", "yaml"); + }); + })(); + return yaml.exports; +} +requireYaml(); +export { + codemirror as default +}; diff --git a/extension/edge-share-crx/codicon.ttf b/extension/edge-share-crx/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..27ee4c68caef1cd22342f481420d6dbda1648012 GIT binary patch literal 80340 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%0DOF`LEiy*`&i@0 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 + + + + Connect Edge + + + +

    +

    Connect this Edge

    +
    +
    + Platform + - +
    +
    + Workspace + - +
    +
    + Relay + - +
    +
    +
    + + +
    +
    Loading request
    +
    + + + diff --git a/extension/edge-share-crx/connect.js b/extension/edge-share-crx/connect.js new file mode 100644 index 0000000..05a5e64 --- /dev/null +++ b/extension/edge-share-crx/connect.js @@ -0,0 +1,95 @@ +"use strict"; + +const params = new URLSearchParams(window.location.search); +const requestId = params.get("requestId") || ""; + +const originEl = document.getElementById("origin"); +const workspaceEl = document.getElementById("workspace"); +const relayEl = document.getElementById("relay"); +const statusEl = document.getElementById("status"); +const approveButton = document.getElementById("approveButton"); +const rejectButton = document.getElementById("rejectButton"); + +let request = null; + +document.addEventListener("DOMContentLoaded", () => { + approveButton.addEventListener("click", approve); + rejectButton.addEventListener("click", reject); + loadRequest().catch(showError); +}); + +async function loadRequest() { + if (!requestId) { + throw new Error("Missing request id"); + } + + request = await sendMessage({ + type: "get_platform_connect_request", + requestId + }); + + originEl.textContent = request.origin || "-"; + workspaceEl.textContent = request.workspaceId || request.poolId || "current-runtime"; + relayEl.textContent = request.relayUrl || "-"; + statusEl.textContent = "Allow this page to control this Edge session through the relay."; +} + +async function approve() { + setBusy(true); + statusEl.classList.remove("error"); + statusEl.textContent = "Connecting"; + + try { + const result = await sendMessage({ + type: "approve_platform_connect", + requestId + }); + statusEl.textContent = result.connected + ? "Connected" + : "Share session created. Waiting for relay connection."; + setTimeout(() => window.close(), 900); + } catch (error) { + showError(error); + setBusy(false); + } +} + +async function reject() { + setBusy(true); + + try { + await sendMessage({ + type: "reject_platform_connect", + requestId + }); + } finally { + window.close(); + } +} + +function setBusy(busy) { + approveButton.disabled = busy; + rejectButton.disabled = busy; +} + +function sendMessage(message) { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage(message, (response) => { + const runtimeError = chrome.runtime.lastError; + if (runtimeError) { + reject(new Error(runtimeError.message)); + return; + } + if (!response || response.ok !== true) { + reject(new Error((response && response.error) || "Extension message failed")); + return; + } + resolve(response.result); + }); + }); +} + +function showError(error) { + statusEl.textContent = error.message || String(error); + statusEl.classList.add("error"); +} diff --git a/extension/edge-share-crx/edge_share_content.js b/extension/edge-share-crx/edge_share_content.js new file mode 100644 index 0000000..5f14ad2 --- /dev/null +++ b/extension/edge-share-crx/edge_share_content.js @@ -0,0 +1,66 @@ +"use strict"; + +const SOURCE_PAGE = "browser-connection:page"; +const SOURCE_CONTENT = "browser-connection:content"; + +injectProvider(); + +window.addEventListener("message", (event) => { + if (event.source !== window || event.origin !== window.location.origin) { + return; + } + const message = event.data; + if (!message || message.source !== SOURCE_PAGE || !message.id) { + return; + } + + chrome.runtime.sendMessage( + { + type: "platform_request", + id: message.id, + method: message.method, + params: message.params || {}, + origin: window.location.origin, + href: window.location.href, + title: document.title || "" + }, + (response) => { + const runtimeError = chrome.runtime.lastError; + if (runtimeError) { + postResponse(message.id, false, null, runtimeError.message); + return; + } + if (!response || response.ok !== true) { + postResponse( + message.id, + false, + null, + (response && response.error) || "Extension request failed" + ); + return; + } + postResponse(message.id, true, response.result, ""); + } + ); +}); + +function injectProvider() { + const script = document.createElement("script"); + script.src = chrome.runtime.getURL("provider.js"); + script.async = false; + script.onload = () => script.remove(); + (document.documentElement || document.head || document.body).appendChild(script); +} + +function postResponse(id, ok, result, error) { + window.postMessage( + { + source: SOURCE_CONTENT, + id, + ok, + result, + error + }, + window.location.origin + ); +} diff --git a/extension/edge-share-crx/edge_share_relay.js b/extension/edge-share-crx/edge_share_relay.js new file mode 100644 index 0000000..db0c9c2 --- /dev/null +++ b/extension/edge-share-crx/edge_share_relay.js @@ -0,0 +1,1655 @@ +"use strict"; + +const PROTOCOL_VERSION = 1; +const DEFAULT_RELAY_URL = "http://127.0.0.1:8765"; +const STORAGE_KEY = "edgeShareState"; +const RECONNECT_MIN_MS = 1000; +const RECONNECT_MAX_MS = 30000; +const RELAY_KEEPALIVE_MS = 20 * 1000; +const PLATFORM_CONNECT_TTL_MS = 2 * 60 * 1000; +const PLATFORM_RELAY_CONNECT_TIMEOUT_MS = 8000; +const MAX_RECORDED_ACTIONS = 500; + +let state = { + sharing: false, + connected: false, + relayUrl: DEFAULT_RELAY_URL, + sessionId: "", + browserToken: "", + agentToken: "", + shareUrl: "", + status: "idle", + lastError: "", + activeTabId: null, + platformOrigin: "", + platformHref: "", + workspaceId: "", + poolId: "", + browserName: "", + recording: false, + recordingTabId: null, + recorderMode: "record", + recordingStartedAt: "", + recordingStoppedAt: "", + recordedActions: [], + lastInspect: null, + playbackRunning: false, + playbackError: "", + playbackStepId: "", + updatedAt: "" +}; + +let socket = null; +let reconnectTimer = null; +let keepAliveTimer = null; +let reconnectDelayMs = RECONNECT_MIN_MS; +let intentionallyClosed = false; +const attachedTabs = new Set(); +const pendingPlatformRequests = new Map(); +let crxRecorderState = { + mode: "none", + sources: [] +}; + +chrome.runtime.onInstalled.addListener(() => { + restoreState().then(connectIfNeeded).catch(reportError); +}); + +chrome.runtime.onStartup.addListener(() => { + restoreState().then(connectIfNeeded).catch(reportError); +}); + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + handleExtensionMessage(message, sender) + .then((result) => sendResponse({ ok: true, result })) + .catch((error) => sendResponse({ ok: false, error: errorMessage(error) })); + return true; +}); + +chrome.debugger.onDetach.addListener((source) => { + if (Number.isInteger(source.tabId)) { + attachedTabs.delete(source.tabId); + } +}); + +restoreState().then(connectIfNeeded).catch(reportError); + +async function handleExtensionMessage(message, sender) { + if (!message || typeof message.type !== "string") { + throw new Error("Invalid message"); + } + + if (message.type === "edge_share_crx_recorder_update") { + crxRecorderState = { + ...crxRecorderState, + mode: typeof message.mode === "string" ? message.mode : crxRecorderState.mode, + sources: Array.isArray(message.sources) ? message.sources : crxRecorderState.sources + }; + notifyRecordingChanged(); + return recordingState(); + } + + if (message.type === "get_state") { + await restoreState(); + return publicState(); + } + + if (message.type === "get_recording") { + await restoreState(); + return recordingState(); + } + + if (message.type === "start_share") { + return startShare(message.relayUrl || DEFAULT_RELAY_URL); + } + + if (message.type === "start_recording") { + await restoreState(); + return startRecording(message.params || {}); + } + + if (message.type === "set_recording_mode") { + await restoreState(); + return setRecordingMode(message.mode); + } + + if (message.type === "stop_recording") { + await restoreState(); + return stopRecording(); + } + + if (message.type === "clear_recording") { + await restoreState(); + return clearRecording(); + } + + if (message.type === "recorder_action") { + await restoreState(); + return recordContentAction(message.action || {}, sender); + } + + if (message.type === "inspect_target") { + await restoreState(); + return recordInspectTarget(message.target || {}, sender); + } + + if (message.type === "play_recording") { + await restoreState(); + return playRecording(); + } + + if (message.type === "platform_request") { + return handlePlatformRequest(message, sender); + } + + if (message.type === "get_platform_connect_request") { + return getPlatformConnectRequest(message.requestId); + } + + if (message.type === "approve_platform_connect") { + return approvePlatformConnect(message.requestId); + } + + if (message.type === "reject_platform_connect") { + return rejectPlatformConnect(message.requestId); + } + + if (message.type === "stop_share") { + return stopShare(); + } + + throw new Error(`Unknown popup message: ${message.type}`); +} + +async function startShare(relayUrlInput, options = {}) { + const relayUrl = normalizeRelayUrl(relayUrlInput); + const sessionId = randomHex(12); + const browserToken = randomHex(24); + const agentToken = randomHex(24); + const shareUrl = buildShareUrl(relayUrl, sessionId, agentToken); + + intentionallyClosed = false; + reconnectDelayMs = RECONNECT_MIN_MS; + + await persistState({ + sharing: true, + connected: false, + relayUrl, + sessionId, + browserToken, + agentToken, + shareUrl, + status: "connecting", + lastError: "", + activeTabId: null, + platformOrigin: options.platformOrigin || "", + platformHref: options.platformHref || "", + workspaceId: options.workspaceId || "", + poolId: options.poolId || "", + browserName: options.browserName || "" + }); + + connectRelay(); + return publicState(); +} + +async function stopShare() { + intentionallyClosed = true; + clearReconnectTimer(); + clearKeepAliveTimer(); + + if (socket) { + try { + socket.close(1000, "sharing stopped"); + } catch (_error) { + // Ignore close errors while stopping. + } + socket = null; + } + + await detachAllDebuggers(); + + await persistState({ + sharing: false, + connected: false, + sessionId: "", + browserToken: "", + agentToken: "", + shareUrl: "", + status: "stopped", + lastError: "", + recording: false, + recordingTabId: null, + recorderMode: "record", + recordingStoppedAt: new Date().toISOString(), + playbackRunning: false, + playbackError: "", + playbackStepId: "", + platformOrigin: "", + platformHref: "", + workspaceId: "", + poolId: "", + browserName: "" + }); + + return publicState(); +} + +async function restoreState() { + const stored = await chromeCall(chrome.storage.local.get, chrome.storage.local, STORAGE_KEY); + if (stored && stored[STORAGE_KEY]) { + state = { ...state, ...stored[STORAGE_KEY] }; + } +} + +async function persistState(patch) { + state = { + ...state, + ...patch, + updatedAt: new Date().toISOString() + }; + + await chromeCall(chrome.storage.local.set, chrome.storage.local, { + [STORAGE_KEY]: state + }); + + notifyPopup(); +} + +function publicState() { + return { + sharing: state.sharing, + connected: state.connected, + relayUrl: state.relayUrl || DEFAULT_RELAY_URL, + sessionId: state.sessionId, + shareUrl: state.shareUrl, + status: state.status, + lastError: state.lastError, + activeTabId: state.activeTabId, + recording: state.recording, + recordingTabId: state.recordingTabId, + recorderMode: state.recorderMode || "record", + recordingCount: Array.isArray(state.recordedActions) ? state.recordedActions.length : 0, + recordingStartedAt: state.recordingStartedAt, + recordingStoppedAt: state.recordingStoppedAt, + platformOrigin: state.platformOrigin, + workspaceId: state.workspaceId, + poolId: state.poolId, + browserName: state.browserName, + updatedAt: state.updatedAt + }; +} + +function notifyPopup() { + try { + chrome.runtime.sendMessage({ type: "state_changed", state: publicState() }, () => { + // Popup may be closed; reading lastError prevents noisy extension logs. + void chrome.runtime.lastError; + }); + } catch (_error) { + // Popup may be closed. + } +} + +function notifyRecordingChanged() { + const message = { + type: "recording_state_changed", + recording: recordingState() + }; + + try { + chrome.tabs.query({}, (tabs) => { + const error = chrome.runtime.lastError; + if (error || !Array.isArray(tabs)) { + return; + } + for (const tab of tabs) { + if (!Number.isInteger(tab.id) || !isRecordableUrl(tab.url || "")) { + continue; + } + chrome.tabs.sendMessage(tab.id, message, () => { + // Some pages will not have this content script yet. + void chrome.runtime.lastError; + }); + } + }); + } catch (_error) { + // Tabs may be unavailable in restricted extension contexts. + } +} + +function connectIfNeeded() { + if (state.sharing) { + connectRelay(); + } +} + +function connectRelay() { + if (!state.sharing || !state.relayUrl || !state.sessionId || !state.browserToken) { + return; + } + + clearReconnectTimer(); + clearKeepAliveTimer(); + + if (socket) { + try { + socket.close(1000, "reconnecting"); + } catch (_error) { + // Continue with a new socket. + } + } + + const wsUrl = buildBrowserWsUrl( + state.relayUrl, + state.sessionId, + state.browserToken, + state.agentToken + ); + socket = new WebSocket(wsUrl); + + persistState({ connected: false, status: "connecting", lastError: "" }).catch(reportError); + + socket.addEventListener("open", () => { + reconnectDelayMs = RECONNECT_MIN_MS; + persistState({ connected: true, status: "connected", lastError: "" }).catch(reportError); + sendSocket({ + type: "hello", + role: "browser", + protocolVersion: PROTOCOL_VERSION, + sessionId: state.sessionId, + userAgent: navigator.userAgent + }); + startKeepAliveTimer(); + }); + + socket.addEventListener("message", (event) => { + handleRelayMessage(event.data).catch((error) => { + sendSocket({ + type: "event", + event: "handler_error", + error: errorMessage(error) + }); + }); + }); + + socket.addEventListener("close", (event) => { + clearKeepAliveTimer(); + socket = null; + persistState({ + connected: false, + status: state.sharing ? "disconnected" : "stopped", + lastError: event.reason || "" + }).catch(reportError); + + if (state.sharing && !intentionallyClosed) { + scheduleReconnect(); + } + }); + + socket.addEventListener("error", () => { + clearKeepAliveTimer(); + persistState({ lastError: "WebSocket error" }).catch(reportError); + }); +} + +function scheduleReconnect() { + clearReconnectTimer(); + reconnectTimer = setTimeout(() => { + reconnectTimer = null; + reconnectDelayMs = Math.min(reconnectDelayMs * 2, RECONNECT_MAX_MS); + connectRelay(); + }, reconnectDelayMs); +} + +function clearReconnectTimer() { + if (reconnectTimer) { + clearTimeout(reconnectTimer); + reconnectTimer = null; + } +} + +function startKeepAliveTimer() { + clearKeepAliveTimer(); + keepAliveTimer = setInterval(() => { + sendSocket({ + type: "keepalive", + at: new Date().toISOString() + }); + }, RELAY_KEEPALIVE_MS); +} + +function clearKeepAliveTimer() { + if (keepAliveTimer) { + clearInterval(keepAliveTimer); + keepAliveTimer = null; + } +} + +async function handlePlatformRequest(message, sender) { + if (message.method !== "connect") { + throw new Error(`Unsupported platform request method: ${message.method}`); + } + if (!sender || !sender.tab || !Number.isInteger(sender.tab.id) || !sender.url) { + throw new Error("Platform requests must come from a browser tab"); + } + + const pageUrl = new URL(sender.url); + if (pageUrl.protocol !== "http:" && pageUrl.protocol !== "https:") { + throw new Error("Platform requests must come from an http or https page"); + } + if (message.origin !== pageUrl.origin) { + throw new Error("Platform request origin did not match the sender tab"); + } + + const params = message.params && typeof message.params === "object" ? message.params : {}; + const requestId = randomHex(12); + const request = { + requestId, + origin: pageUrl.origin, + href: sender.url, + title: message.title || sender.tab.title || "", + tabId: sender.tab.id, + workspaceId: stringParam(params.workspaceId), + poolId: stringParam(params.poolId), + browserName: stringParam(params.displayName || params.browserName) || "Edge", + relayUrl: normalizeRelayUrl(stringParam(params.relayUrl) || pageUrl.origin), + createdAt: Date.now() + }; + + if (new URL(request.relayUrl).origin !== request.origin) { + throw new Error("Platform relayUrl must use the requesting page origin"); + } + + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + pendingPlatformRequests.delete(requestId); + reject(new Error("Platform connect request expired")); + }, PLATFORM_CONNECT_TTL_MS); + + pendingPlatformRequests.set(requestId, { + request, + resolve, + reject, + timeout + }); + + chrome.windows.create( + { + url: chrome.runtime.getURL(`connect.html?requestId=${encodeURIComponent(requestId)}`), + type: "popup", + width: 420, + height: 560 + }, + () => { + const error = chrome.runtime.lastError; + if (error) { + clearTimeout(timeout); + pendingPlatformRequests.delete(requestId); + reject(new Error(error.message)); + } + } + ); + }); +} + +async function getPlatformConnectRequest(requestId) { + const entry = pendingPlatformRequests.get(String(requestId || "")); + if (!entry) { + throw new Error("Platform connect request was not found or expired"); + } + return sanitizePlatformRequest(entry.request); +} + +async function approvePlatformConnect(requestId) { + const id = String(requestId || ""); + const entry = pendingPlatformRequests.get(id); + if (!entry) { + throw new Error("Platform connect request was not found or expired"); + } + + pendingPlatformRequests.delete(id); + clearTimeout(entry.timeout); + + let started = false; + try { + await startShare(entry.request.relayUrl, { + platformOrigin: entry.request.origin, + platformHref: entry.request.href, + workspaceId: entry.request.workspaceId, + poolId: entry.request.poolId, + browserName: entry.request.browserName + }); + started = true; + if (!(await waitForRelayConnection(PLATFORM_RELAY_CONNECT_TIMEOUT_MS))) { + throw new Error(state.lastError || "Timed out connecting to browser relay"); + } + const result = publicState(); + const response = { + shareUrl: result.shareUrl, + sessionId: result.sessionId, + connected: result.connected, + relayUrl: result.relayUrl, + platformOrigin: entry.request.origin, + workspaceId: entry.request.workspaceId, + poolId: entry.request.poolId, + browserName: entry.request.browserName + }; + entry.resolve(response); + return response; + } catch (error) { + if (started) { + await stopShare().catch(reportError); + } + entry.reject(error); + throw error; + } +} + +async function rejectPlatformConnect(requestId) { + const id = String(requestId || ""); + const entry = pendingPlatformRequests.get(id); + if (!entry) { + return { rejected: true }; + } + + pendingPlatformRequests.delete(id); + clearTimeout(entry.timeout); + const error = new Error("User rejected browser connection"); + entry.reject(error); + return { rejected: true }; +} + +function sanitizePlatformRequest(request) { + return { + requestId: request.requestId, + origin: request.origin, + href: request.href, + title: request.title, + workspaceId: request.workspaceId, + poolId: request.poolId, + browserName: request.browserName, + relayUrl: request.relayUrl, + createdAt: request.createdAt + }; +} + +async function waitForRelayConnection(timeoutMs) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + if (state.connected) { + return true; + } + if (!state.sharing) { + return false; + } + await sleep(100); + } + return state.connected; +} + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function handleRelayMessage(rawData) { + let message; + try { + message = JSON.parse(rawData); + } catch (_error) { + sendSocket({ type: "event", event: "invalid_json" }); + return; + } + + if (message.type === "ping") { + sendSocket({ type: "pong", at: new Date().toISOString() }); + return; + } + + const requestId = message.id || message.requestId; + const command = message.command || message.method; + const params = message.params || {}; + + if (!requestId || !command) { + sendSocket({ + type: "event", + event: "ignored_message", + reason: "missing id or command" + }); + return; + } + + try { + const result = await handleCommand(command, params); + sendSocket({ + type: "response", + id: requestId, + ok: true, + result + }); + } catch (error) { + sendSocket({ + type: "response", + id: requestId, + ok: false, + error: errorMessage(error) + }); + } +} + +async function handleCommand(command, params) { + if (command === "navigate") { + return commandNavigate(params); + } + if (command === "evaluate") { + return commandEvaluate(params); + } + if (command === "snapshot") { + return commandSnapshot(params); + } + if (command === "click") { + return commandClick(params); + } + if (command === "type") { + return commandType(params); + } + if (command === "press_key") { + return commandPressKey(params); + } + if (command === "screenshot") { + return commandScreenshot(params); + } + if (command === "list_tabs") { + return commandListTabs(); + } + if (command === "activate_tab") { + return commandActivateTab(params); + } + if (command === "start_recording") { + return startRecording(params); + } + if (command === "set_recording_mode") { + return setRecordingMode(params.mode); + } + if (command === "stop_recording") { + return stopRecording(); + } + if (command === "clear_recording") { + return clearRecording(); + } + if (command === "play_recording") { + return playRecording(); + } + if (command === "recording_state") { + return recordingState(); + } + + throw new Error(`Unsupported command: ${command}`); +} + +async function commandNavigate(params) { + if (!params.url || typeof params.url !== "string") { + throw new Error("navigate requires params.url"); + } + + const tabId = await getTargetTabId(params); + const tab = await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { + url: params.url, + active: params.activate !== false + }); + + state.activeTabId = tab.id; + return { tab: tabSummary(tab) }; +} + +async function commandEvaluate(params) { + if (!params.expression || typeof params.expression !== "string") { + throw new Error("evaluate requires params.expression"); + } + + const tabId = await getTargetTabId(params); + const value = await evaluateInPage(tabId, params.expression); + return { + tab: await currentTabSummary(tabId), + value + }; +} + +async function commandSnapshot(params) { + const tabId = await getTargetTabId(params); + const snapshot = await runFunctionInPage(tabId, createSnapshot, [ + params.maxTextLength || 200000, + params.maxItems || 200 + ]); + + return { + tab: await currentTabSummary(tabId), + snapshot + }; +} + +async function commandClick(params) { + if (!params.selector || typeof params.selector !== "string") { + throw new Error("click requires params.selector"); + } + + const tabId = await getTargetTabId(params); + const result = await runFunctionInPage(tabId, clickSelector, [params.selector]); + return { + tab: await currentTabSummary(tabId), + action: result + }; +} + +async function commandType(params) { + if (typeof params.text !== "string") { + throw new Error("type requires params.text"); + } + + const tabId = await getTargetTabId(params); + const result = await runFunctionInPage(tabId, typeText, [ + params.selector || "", + params.text, + params.replace === true || params.clear === true + ]); + + return { + tab: await currentTabSummary(tabId), + action: result + }; +} + +async function commandPressKey(params) { + if (!params.key || typeof params.key !== "string") { + throw new Error("press_key requires params.key"); + } + + const tabId = await getTargetTabId(params); + const key = normalizeKey(params.key); + await sendKeyEvent(tabId, key, "rawKeyDown"); + + if (key.text) { + await sendKeyEvent(tabId, key, "char"); + } + + await sendKeyEvent(tabId, key, "keyUp"); + + return { + tab: await currentTabSummary(tabId), + action: { key: key.key, code: key.code } + }; +} + +async function commandScreenshot(params) { + const tabId = await getTargetTabId(params); + const format = params.format === "jpeg" ? "jpeg" : "png"; + const quality = format === "jpeg" ? clampNumber(params.quality || 80, 1, 100) : undefined; + + try { + await sendCdp(tabId, "Page.enable", {}); + const result = await sendCdp(tabId, "Page.captureScreenshot", { + format, + quality, + fromSurface: true, + captureBeyondViewport: params.fullPage === true + }); + + return { + tab: await currentTabSummary(tabId), + mimeType: `image/${format}`, + data: result.data + }; + } catch (error) { + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { active: true }); + const dataUrl = await chromeCall(chrome.tabs.captureVisibleTab, chrome.tabs, tab.windowId, { + format, + quality + }); + + return { + tab: tabSummary(tab), + mimeType: `image/${format}`, + dataUrl, + fallback: "tabs.captureVisibleTab", + warning: errorMessage(error) + }; + } +} + +async function commandListTabs() { + const windows = await chromeCall(chrome.windows.getAll, chrome.windows, { + populate: true + }); + const summaries = windows.map(windowSummary); + return { + windows: summaries, + tabs: summaries.flatMap((window) => window.tabs) + }; +} + +async function commandActivateTab(params) { + const tabId = await getTargetTabId(params); + const tab = await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { active: true }); + state.activeTabId = tab.id; + await persistState({ activeTabId: tab.id }); + return { tab: tabSummary(tab) }; +} + +async function startRecording(params = {}) { + const tabId = Number.isInteger(params.tabId) ? params.tabId : await getTargetTabId({}); + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + await attachCrxRecorder(tab, normalizeCrxMode(params.mode)); + const startedAt = new Date().toISOString(); + const actions = []; + if (tab.url && isRecordableUrl(tab.url)) { + actions.push(recordedAction("navigate", { + url: tab.url, + title: tab.title || "", + tabId, + windowId: tab.windowId + })); + } + + await persistState({ + recording: true, + recordingTabId: null, + recorderMode: normalizeRecorderMode(params.mode), + recordingStartedAt: startedAt, + recordingStoppedAt: "", + recordedActions: actions, + lastInspect: null, + playbackError: "", + playbackStepId: "", + activeTabId: tabId + }); + + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function setRecordingMode(mode) { + if (!state.recording) { + return startRecording({ mode }); + } + const tabId = await getTargetTabId({}); + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + await attachCrxRecorder(tab, normalizeCrxMode(mode)); + await persistState({ + recorderMode: normalizeRecorderMode(mode), + lastInspect: null + }); + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function attachCrxRecorder(tab, mode) { + if (typeof globalThis.attach !== "function") { + return; + } + try { + await globalThis.attach(tab, mode); + } catch (error) { + await persistState({ lastError: errorMessage(error) }).catch(reportError); + throw error; + } +} + +async function setCrxRecorderStandby() { + if (typeof globalThis.getCrxApp !== "function") { + return; + } + try { + const app = await globalThis.getCrxApp(false); + if (app && app.recorder && typeof app.recorder.setMode === "function") { + await app.recorder.setMode("standby"); + } + } catch (_error) { + // The recorder may not be initialized yet; relay state can still stop. + } +} + +async function stopRecording() { + await setCrxRecorderStandby(); + await persistState({ + recording: false, + recorderMode: "record", + recordingStoppedAt: new Date().toISOString(), + lastInspect: null, + playbackRunning: false + }); + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function clearRecording() { + await setCrxRecorderStandby(); + await persistState({ + recording: false, + recordingTabId: null, + recorderMode: "record", + recordingStartedAt: "", + recordingStoppedAt: "", + recordedActions: [], + lastInspect: null, + playbackRunning: false, + playbackError: "", + playbackStepId: "" + }); + const recording = recordingState(); + notifyRecordingChanged(); + return recording; +} + +async function recordContentAction(action, sender) { + if (!state.recording || !sender?.tab || !Number.isInteger(sender.tab.id)) { + return { recorded: false }; + } + if ((state.recorderMode || "record") !== "record") { + return { recorded: false }; + } + if (!isRecordableUrl(sender.tab.url || action.url || "")) { + return { recorded: false }; + } + + const normalized = recordedAction(action.kind, { + ...action, + tabId: sender.tab.id, + windowId: sender.tab.windowId, + title: action.title || sender.tab.title || "", + url: action.url || sender.tab.url || "" + }); + if (!normalized) { + return { recorded: false }; + } + + const actions = Array.isArray(state.recordedActions) ? [...state.recordedActions] : []; + upsertRecordedAction(actions, normalized); + while (actions.length > MAX_RECORDED_ACTIONS) { + actions.shift(); + } + + await persistState({ recordedActions: actions, activeTabId: sender.tab.id }); + notifyRecordingChanged(); + return { recorded: true, action: normalized, count: actions.length }; +} + +async function recordInspectTarget(target, sender) { + if (!state.recording || (state.recorderMode || "record") !== "inspect") { + return { inspected: false }; + } + if (!sender?.tab || !Number.isInteger(sender.tab.id)) { + return { inspected: false }; + } + if (!isRecordableUrl(sender.tab.url || target.url || "")) { + return { inspected: false }; + } + + const inspected = { + at: new Date().toISOString(), + selector: String(target.selector || "").slice(0, 1024), + label: String(target.label || "").slice(0, 512), + tag: String(target.tag || "").slice(0, 64), + url: String(target.url || sender.tab.url || "").slice(0, 4096), + title: String(target.title || sender.tab.title || "").slice(0, 512), + tabId: sender.tab.id, + windowId: sender.tab.windowId + }; + + await persistState({ lastInspect: inspected, activeTabId: sender.tab.id }); + notifyRecordingChanged(); + return { inspected: true, target: inspected }; +} + +async function playRecording() { + const actions = Array.isArray(state.recordedActions) ? [...state.recordedActions] : []; + if (actions.length === 0) { + throw new Error("No recorded actions to play"); + } + + await persistState({ + playbackRunning: true, + playbackError: "", + playbackStepId: "" + }); + notifyRecordingChanged(); + + let caught = null; + try { + for (const action of actions) { + await persistState({ playbackStepId: action.id || "" }); + notifyRecordingChanged(); + await playRecordedAction(action); + } + } catch (error) { + caught = error; + await persistState({ playbackError: errorMessage(error) }); + } finally { + await persistState({ playbackRunning: false }); + notifyRecordingChanged(); + } + + if (caught) { + throw caught; + } + return recordingState(); +} + +async function playRecordedAction(action) { + const tabId = await playbackTabId(action); + if (action.kind === "navigate" && action.url) { + await chromeCall(chrome.tabs.update, chrome.tabs, tabId, { + url: action.url, + active: true + }); + state.activeTabId = tabId; + await waitForTabReady(tabId, 10000); + return; + } + if (action.kind === "click" && action.selector) { + await runFunctionInPage(tabId, clickSelector, [action.selector]); + return; + } + if (action.kind === "fill" && action.selector) { + await runFunctionInPage(tabId, typeText, [action.selector, action.text || "", true]); + return; + } + if (action.kind === "press" && action.key) { + if (action.selector) { + await runFunctionInPage(tabId, focusSelector, [action.selector]); + } + const key = normalizeKey(action.key); + await sendKeyEvent(tabId, key, "rawKeyDown"); + if (key.text) { + await sendKeyEvent(tabId, key, "char"); + } + await sendKeyEvent(tabId, key, "keyUp"); + } +} + +async function playbackTabId(action) { + if (Number.isInteger(action.tabId)) { + try { + await chromeCall(chrome.tabs.get, chrome.tabs, action.tabId); + state.activeTabId = action.tabId; + return action.tabId; + } catch (_error) { + // The original tab was closed; fall back to the active tab. + } + } + return getTargetTabId({}); +} + +async function waitForTabReady(tabId, timeoutMs) { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + if (tab.status === "complete") { + return; + } + } catch (_error) { + return; + } + await sleep(100); + } +} + +function recordingState() { + const actions = Array.isArray(state.recordedActions) ? state.recordedActions : []; + const crxSources = Array.isArray(crxRecorderState.sources) ? crxRecorderState.sources : []; + const preferredSource = + crxSources.find((source) => source && source.id === "playwright-test") || + crxSources.find((source) => source && typeof source.text === "string") || + null; + return { + recording: state.recording, + mode: state.recorderMode || "record", + crxMode: crxRecorderState.mode || "none", + tabId: state.recordingTabId, + startedAt: state.recordingStartedAt, + stoppedAt: state.recordingStoppedAt, + count: actions.length, + actions, + sources: crxSources, + lastInspect: state.lastInspect || null, + playing: !!state.playbackRunning, + playbackError: state.playbackError || "", + playbackStepId: state.playbackStepId || "", + script: preferredSource?.text || renderRecordedPlaywright(actions) + }; +} + +function normalizeRecorderMode(mode) { + return mode === "inspect" ? "inspect" : "record"; +} + +function normalizeCrxMode(mode) { + return mode === "inspect" || mode === "inspecting" ? "inspecting" : "recording"; +} + +function recordedAction(kind, fields) { + const actionKind = String(kind || ""); + if (!["navigate", "click", "fill", "press"].includes(actionKind)) { + return null; + } + const action = { + id: randomHex(6), + kind: actionKind, + at: new Date().toISOString(), + url: String(fields.url || "").slice(0, 4096), + title: String(fields.title || "").slice(0, 512), + tabId: Number.isInteger(fields.tabId) ? fields.tabId : null, + windowId: Number.isInteger(fields.windowId) ? fields.windowId : null + }; + if (fields.selector) action.selector = String(fields.selector).slice(0, 1024); + if (fields.text !== undefined) action.text = String(fields.text).slice(0, 4096); + if (fields.key) action.key = String(fields.key).slice(0, 128); + if (fields.label) action.label = String(fields.label).slice(0, 512); + if (fields.tag) action.tag = String(fields.tag).slice(0, 64); + return action; +} + +function upsertRecordedAction(actions, action) { + const previous = actions[actions.length - 1]; + if ( + previous && + action.kind === "fill" && + previous.kind === "fill" && + previous.selector === action.selector + ) { + actions[actions.length - 1] = { ...previous, ...action, id: previous.id }; + return; + } + if ( + previous && + action.kind === "navigate" && + previous.kind === "navigate" && + previous.url === action.url + ) { + return; + } + actions.push(action); +} + +function renderRecordedPlaywright(actions) { + const lines = [ + "module.exports = async ({ page }) => {" + ]; + let previousTabId = null; + for (const action of actions) { + if (action.tabId && action.tabId !== previousTabId) { + lines.push(` // Tab ${action.tabId}${action.title ? `: ${action.title}` : ""}`); + previousTabId = action.tabId; + } + if (action.kind === "navigate" && action.url) { + lines.push(` await page.goto(${JSON.stringify(action.url)});`); + } else if (action.kind === "click" && action.selector) { + lines.push(` await page.click(${JSON.stringify(action.selector)});`); + } else if (action.kind === "fill" && action.selector) { + lines.push(` await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.text || "")});`); + } else if (action.kind === "press" && action.key) { + if (action.selector) { + lines.push(` await page.press(${JSON.stringify(action.selector)}, ${JSON.stringify(action.key)});`); + } else { + lines.push(` await page.keyboard.press(${JSON.stringify(action.key)});`); + } + } + } + lines.push("};"); + return lines.join("\n"); +} + +function isRecordableUrl(url) { + return /^https?:\/\//i.test(String(url || "")); +} + +async function getTargetTabId(params) { + if (Number.isInteger(params.tabId)) { + state.activeTabId = params.tabId; + return params.tabId; + } + + if (Number.isInteger(state.activeTabId)) { + try { + await chromeCall(chrome.tabs.get, chrome.tabs, state.activeTabId); + return state.activeTabId; + } catch (_error) { + state.activeTabId = null; + } + } + + const activeTabs = await chromeCall(chrome.tabs.query, chrome.tabs, { + active: true, + lastFocusedWindow: true + }); + + if (activeTabs.length > 0 && Number.isInteger(activeTabs[0].id)) { + state.activeTabId = activeTabs[0].id; + return activeTabs[0].id; + } + + const tabs = await chromeCall(chrome.tabs.query, chrome.tabs, { active: true }); + if (tabs.length > 0 && Number.isInteger(tabs[0].id)) { + state.activeTabId = tabs[0].id; + return tabs[0].id; + } + + throw new Error("No active tab found"); +} + +async function currentTabSummary(tabId) { + const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + return tabSummary(tab); +} + +function windowSummary(window) { + return { + id: window.id, + focused: window.focused, + incognito: window.incognito, + profile: window.incognito ? "incognito" : "regular", + type: window.type || "", + state: window.state || "", + top: window.top, + left: window.left, + width: window.width, + height: window.height, + tabs: (window.tabs || []).map((tab) => tabSummary(tab, window)) + }; +} + +function tabSummary(tab, window) { + return { + id: tab.id, + windowId: tab.windowId, + active: tab.active, + index: tab.index, + incognito: tab.incognito || window?.incognito || false, + profile: tab.incognito || window?.incognito ? "incognito" : "regular", + pinned: tab.pinned || false, + audible: tab.audible || false, + discarded: tab.discarded || false, + title: tab.title || "", + url: tab.url || "", + status: tab.status || "" + }; +} + +async function evaluateInPage(tabId, expression) { + await sendCdp(tabId, "Runtime.enable", {}); + const result = await sendCdp(tabId, "Runtime.evaluate", { + expression, + awaitPromise: true, + returnByValue: true, + userGesture: true + }); + + if (result.exceptionDetails) { + throw new Error(formatException(result.exceptionDetails)); + } + + return unwrapRemoteObject(result.result); +} + +async function runFunctionInPage(tabId, fn, args) { + const expression = `(${fn.toString()})(${args.map((arg) => JSON.stringify(arg)).join(",")})`; + return evaluateInPage(tabId, expression); +} + +async function ensureDebugger(tabId) { + if (attachedTabs.has(tabId)) { + return; + } + + try { + await chromeCall(chrome.debugger.attach, chrome.debugger, { tabId }, "1.3"); + attachedTabs.add(tabId); + } catch (error) { + if (String(errorMessage(error)).includes("Another debugger is already attached")) { + attachedTabs.add(tabId); + return; + } + throw error; + } +} + +async function detachAllDebuggers() { + const tabIds = Array.from(attachedTabs); + attachedTabs.clear(); + + await Promise.all( + tabIds.map(async (tabId) => { + try { + await chromeCall(chrome.debugger.detach, chrome.debugger, { tabId }); + } catch (_error) { + // The tab may have closed or detached already. + } + }) + ); +} + +async function sendCdp(tabId, method, params) { + await ensureDebugger(tabId); + return chromeCall(chrome.debugger.sendCommand, chrome.debugger, { tabId }, method, params || {}); +} + +async function sendKeyEvent(tabId, key, type) { + await sendCdp(tabId, "Input.dispatchKeyEvent", { + type, + key: key.key, + code: key.code, + windowsVirtualKeyCode: key.keyCode, + nativeVirtualKeyCode: key.keyCode, + text: type === "char" ? key.text : "", + unmodifiedText: type === "char" ? key.text : "", + modifiers: 0 + }); +} + +function createSnapshot(maxTextLength, maxItems) { + function trim(value, length) { + return String(value || "").replace(/\s+/g, " ").trim().slice(0, length); + } + + function cssPath(element) { + if (!element || element.nodeType !== Node.ELEMENT_NODE) { + return ""; + } + + if (element.id) { + return `#${CSS.escape(element.id)}`; + } + + const parts = []; + let current = element; + + while (current && current.nodeType === Node.ELEMENT_NODE && parts.length < 5) { + let part = current.tagName.toLowerCase(); + if (current.classList.length > 0) { + part += `.${CSS.escape(current.classList[0])}`; + } + + const parent = current.parentElement; + if (parent) { + const siblings = Array.from(parent.children).filter((child) => child.tagName === current.tagName); + if (siblings.length > 1) { + part += `:nth-of-type(${siblings.indexOf(current) + 1})`; + } + } + + parts.unshift(part); + current = parent; + } + + return parts.join(" > "); + } + + function describe(element) { + return { + selector: cssPath(element), + tag: element.tagName.toLowerCase(), + role: element.getAttribute("role") || "", + label: trim( + element.getAttribute("aria-label") || + element.getAttribute("alt") || + element.getAttribute("title") || + element.value || + element.innerText, + 300 + ), + href: element.href || "", + type: element.getAttribute("type") || "" + }; + } + + const clickableSelector = "a,button,input,textarea,select,[role='button'],[contenteditable='true']"; + const elements = Array.from(document.querySelectorAll(clickableSelector)) + .slice(0, maxItems) + .map(describe); + + return { + url: location.href, + title: document.title, + text: trim(document.body ? document.body.innerText : "", maxTextLength), + activeElement: cssPath(document.activeElement), + elements + }; +} + +function clickSelector(selector) { + const element = document.querySelector(selector); + if (!element) { + throw new Error(`No element matches selector: ${selector}`); + } + + element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); + const rect = element.getBoundingClientRect(); + const x = rect.left + rect.width / 2; + const y = rect.top + rect.height / 2; + + element.dispatchEvent(new MouseEvent("mouseover", { bubbles: true, clientX: x, clientY: y })); + element.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, clientX: x, clientY: y })); + element.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, clientX: x, clientY: y })); + element.click(); + + return { + selector, + text: String(element.innerText || element.value || "").trim().slice(0, 300), + rect: { + x: Math.round(rect.x), + y: Math.round(rect.y), + width: Math.round(rect.width), + height: Math.round(rect.height) + } + }; +} + +function typeText(selector, text, replace) { + const element = selector ? document.querySelector(selector) : document.activeElement; + if (!element) { + throw new Error(selector ? `No element matches selector: ${selector}` : "No active element"); + } + + element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); + element.focus(); + + if (element.isContentEditable) { + if (replace) { + element.innerText = ""; + } + document.execCommand("insertText", false, text); + } else if ("value" in element) { + if (replace) { + element.value = text; + } else { + const start = Number.isInteger(element.selectionStart) ? element.selectionStart : element.value.length; + const end = Number.isInteger(element.selectionEnd) ? element.selectionEnd : element.value.length; + element.value = `${element.value.slice(0, start)}${text}${element.value.slice(end)}`; + const cursor = start + text.length; + if (element.setSelectionRange) { + element.setSelectionRange(cursor, cursor); + } + } + element.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertText", data: text })); + element.dispatchEvent(new Event("change", { bubbles: true })); + } else { + throw new Error("Target element is not editable"); + } + + return { + selector: selector || "", + tag: element.tagName.toLowerCase(), + textLength: text.length + }; +} + +function focusSelector(selector) { + const element = document.querySelector(selector); + if (!element) { + throw new Error(`No element matches selector: ${selector}`); + } + + element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); + element.focus(); + return { + selector, + tag: element.tagName.toLowerCase() + }; +} + +function normalizeKey(input) { + const aliases = { + escape: ["Escape", "Escape", 27], + esc: ["Escape", "Escape", 27], + enter: ["Enter", "Enter", 13], + tab: ["Tab", "Tab", 9], + backspace: ["Backspace", "Backspace", 8], + delete: ["Delete", "Delete", 46], + arrowup: ["ArrowUp", "ArrowUp", 38], + arrowdown: ["ArrowDown", "ArrowDown", 40], + arrowleft: ["ArrowLeft", "ArrowLeft", 37], + arrowright: ["ArrowRight", "ArrowRight", 39], + home: ["Home", "Home", 36], + end: ["End", "End", 35], + pageup: ["PageUp", "PageUp", 33], + pagedown: ["PageDown", "PageDown", 34], + space: [" ", "Space", 32] + }; + + const lower = input.toLowerCase(); + if (aliases[lower]) { + const [key, code, keyCode] = aliases[lower]; + return { key, code, keyCode, text: key.length === 1 ? key : "" }; + } + + if (input.length === 1) { + const keyCode = input.toUpperCase().charCodeAt(0); + return { key: input, code: `Key${input.toUpperCase()}`, keyCode, text: input }; + } + + return { key: input, code: input, keyCode: 0, text: "" }; +} + +function unwrapRemoteObject(remoteObject) { + if (!remoteObject) { + return null; + } + if (Object.prototype.hasOwnProperty.call(remoteObject, "value")) { + return remoteObject.value; + } + if (remoteObject.unserializableValue) { + return remoteObject.unserializableValue; + } + return remoteObject.description || null; +} + +function formatException(exceptionDetails) { + if (exceptionDetails.exception) { + return unwrapRemoteObject(exceptionDetails.exception) || exceptionDetails.exception.description || "Evaluation failed"; + } + return exceptionDetails.text || "Evaluation failed"; +} + +function sendSocket(message) { + if (!socket || socket.readyState !== WebSocket.OPEN) { + return false; + } + socket.send(JSON.stringify(message)); + return true; +} + +function buildShareUrl(relayUrl, sessionId, agentToken) { + const url = new URL(relayUrl); + const prefix = url.pathname.replace(/\/+$/, ""); + url.pathname = `${prefix}/share/${encodeURIComponent(sessionId)}`; + url.search = ""; + url.hash = `agent=${encodeURIComponent(agentToken)}`; + return url.href; +} + +function buildBrowserWsUrl(relayUrl, sessionId, browserToken, agentToken) { + const url = new URL(relayUrl); + url.protocol = url.protocol === "https:" ? "wss:" : "ws:"; + const prefix = url.pathname.replace(/\/+$/, ""); + url.pathname = `${prefix}/ws/browser/${encodeURIComponent(sessionId)}`; + url.search = `token=${encodeURIComponent(browserToken)}&agent_token=${encodeURIComponent(agentToken)}`; + url.hash = ""; + return url.href; +} + +function normalizeRelayUrl(input) { + const raw = String(input || "").trim(); + if (!raw) { + throw new Error("Relay URL is required"); + } + + const withScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(raw) ? raw : `https://${raw}`; + const url = new URL(withScheme); + + if (url.protocol !== "http:" && url.protocol !== "https:") { + throw new Error("Relay URL must use http or https"); + } + + url.search = ""; + url.hash = ""; + url.pathname = url.pathname.replace(/\/+$/, ""); + return url.href.replace(/\/$/, ""); +} + +function stringParam(value) { + if (typeof value !== "string") { + return ""; + } + return value.trim().slice(0, 512); +} + +function randomHex(lengthBytes) { + const bytes = new Uint8Array(lengthBytes); + crypto.getRandomValues(bytes); + return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join(""); +} + +function clampNumber(value, min, max) { + const number = Number(value); + if (!Number.isFinite(number)) { + return min; + } + return Math.min(Math.max(number, min), max); +} + +function chromeCall(fn, context, ...args) { + return new Promise((resolve, reject) => { + try { + fn.call(context, ...args, (result) => { + const error = chrome.runtime.lastError; + if (error) { + reject(new Error(error.message)); + } else { + resolve(result); + } + }); + } catch (error) { + reject(error); + } + }); +} + +function reportError(error) { + persistState({ lastError: errorMessage(error), status: "error" }).catch(() => { + // Avoid recursive error reporting. + }); +} + +function errorMessage(error) { + if (!error) { + return "Unknown error"; + } + if (error.message) { + return error.message; + } + return String(error); +} diff --git a/extension/edge-share-crx/empty.html b/extension/edge-share-crx/empty.html new file mode 100644 index 0000000..d3a3d8a --- /dev/null +++ b/extension/edge-share-crx/empty.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/extension/edge-share-crx/form.css b/extension/edge-share-crx/form.css new file mode 100644 index 0000000..6d78133 --- /dev/null +++ b/extension/edge-share-crx/form.css @@ -0,0 +1,53 @@ +form { + display: flex; + flex-direction: column; + gap: 10px; +} + +form h1 { + text-align: center; + margin-bottom: 15px; +} + +form label { + font-weight: bold; +} + +form input[type="text"], select { + padding: 5px; + border: 1px solid #ccc; + border-radius: 4px; +} + +form input[type="checkbox"] { + padding-left: 16px; +} + +form button[type="submit"] { + background-color: #4CAF50; + border: none; + color: white; + padding: 10px 20px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 16px; + margin: 4px 2px; + cursor: pointer; + border-radius: 4px; + transition: background-color 0.2s ease-in-out; +} + +form button:hover { + background-color: #45A049; +} + +form button[type="submit"]:disabled { + background-color: #ccc; + color: #666; + cursor: not-allowed; +} + +form .note.error { + color: darkred; +} diff --git a/extension/edge-share-crx/form.js b/extension/edge-share-crx/form.js new file mode 100644 index 0000000..1213a7e --- /dev/null +++ b/extension/edge-share-crx/form.js @@ -0,0 +1,7168 @@ +import { d as defaultSettings, l as loadSettings, s as storeSettings } from "./settings.js"; +(function polyfill() { + const relList = document.createElement("link").relList; + if (relList && relList.supports && relList.supports("modulepreload")) { + return; + } + for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { + processPreload(link); + } + new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.tagName === "LINK" && node.rel === "modulepreload") + processPreload(node); + } + } + }).observe(document, { childList: true, subtree: true }); + function getFetchOpts(link) { + const fetchOpts = {}; + if (link.integrity) fetchOpts.integrity = link.integrity; + if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; + if (link.crossOrigin === "use-credentials") + fetchOpts.credentials = "include"; + else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; + else fetchOpts.credentials = "same-origin"; + return fetchOpts; + } + function processPreload(link) { + if (link.ep) + return; + link.ep = true; + const fetchOpts = getFetchOpts(link); + fetch(link.href, fetchOpts); + } +})(); +function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +var jsxRuntime = { exports: {} }; +var reactJsxRuntime_production_min = {}; +var react = { exports: {} }; +var react_production_min = {}; +/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var hasRequiredReact_production_min; +function requireReact_production_min() { + if (hasRequiredReact_production_min) return react_production_min; + hasRequiredReact_production_min = 1; + var l = Symbol.for("react.element"), n = Symbol.for("react.portal"), p = Symbol.for("react.fragment"), q = Symbol.for("react.strict_mode"), r = Symbol.for("react.profiler"), t = Symbol.for("react.provider"), u = Symbol.for("react.context"), v = Symbol.for("react.forward_ref"), w = Symbol.for("react.suspense"), x = Symbol.for("react.memo"), y = Symbol.for("react.lazy"), z = Symbol.iterator; + function A(a) { + if (null === a || "object" !== typeof a) return null; + a = z && a[z] || a["@@iterator"]; + return "function" === typeof a ? a : null; + } + var B = { isMounted: function() { + return false; + }, enqueueForceUpdate: function() { + }, enqueueReplaceState: function() { + }, enqueueSetState: function() { + } }, C = Object.assign, D = {}; + function E(a, b, e) { + this.props = a; + this.context = b; + this.refs = D; + this.updater = e || B; + } + E.prototype.isReactComponent = {}; + E.prototype.setState = function(a, b) { + if ("object" !== typeof a && "function" !== typeof a && null != a) throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); + this.updater.enqueueSetState(this, a, b, "setState"); + }; + E.prototype.forceUpdate = function(a) { + this.updater.enqueueForceUpdate(this, a, "forceUpdate"); + }; + function F() { + } + F.prototype = E.prototype; + function G(a, b, e) { + this.props = a; + this.context = b; + this.refs = D; + this.updater = e || B; + } + var H = G.prototype = new F(); + H.constructor = G; + C(H, E.prototype); + H.isPureReactComponent = true; + var I = Array.isArray, J = Object.prototype.hasOwnProperty, K = { current: null }, L = { key: true, ref: true, __self: true, __source: true }; + function M(a, b, e) { + var d, c = {}, k = null, h = null; + if (null != b) for (d in void 0 !== b.ref && (h = b.ref), void 0 !== b.key && (k = "" + b.key), b) J.call(b, d) && !L.hasOwnProperty(d) && (c[d] = b[d]); + var g = arguments.length - 2; + if (1 === g) c.children = e; + else if (1 < g) { + for (var f = Array(g), m = 0; m < g; m++) f[m] = arguments[m + 2]; + c.children = f; + } + if (a && a.defaultProps) for (d in g = a.defaultProps, g) void 0 === c[d] && (c[d] = g[d]); + return { $$typeof: l, type: a, key: k, ref: h, props: c, _owner: K.current }; + } + function N(a, b) { + return { $$typeof: l, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner }; + } + function O(a) { + return "object" === typeof a && null !== a && a.$$typeof === l; + } + function escape(a) { + var b = { "=": "=0", ":": "=2" }; + return "$" + a.replace(/[=:]/g, function(a2) { + return b[a2]; + }); + } + var P = /\/+/g; + function Q(a, b) { + return "object" === typeof a && null !== a && null != a.key ? escape("" + a.key) : b.toString(36); + } + function R(a, b, e, d, c) { + var k = typeof a; + if ("undefined" === k || "boolean" === k) a = null; + var h = false; + if (null === a) h = true; + else switch (k) { + case "string": + case "number": + h = true; + break; + case "object": + switch (a.$$typeof) { + case l: + case n: + h = true; + } + } + if (h) return h = a, c = c(h), a = "" === d ? "." + Q(h, 0) : d, I(c) ? (e = "", null != a && (e = a.replace(P, "$&/") + "/"), R(c, b, e, "", function(a2) { + return a2; + })) : null != c && (O(c) && (c = N(c, e + (!c.key || h && h.key === c.key ? "" : ("" + c.key).replace(P, "$&/") + "/") + a)), b.push(c)), 1; + h = 0; + d = "" === d ? "." : d + ":"; + if (I(a)) for (var g = 0; g < a.length; g++) { + k = a[g]; + var f = d + Q(k, g); + h += R(k, b, e, f, c); + } + else if (f = A(a), "function" === typeof f) for (a = f.call(a), g = 0; !(k = a.next()).done; ) k = k.value, f = d + Q(k, g++), h += R(k, b, e, f, c); + else if ("object" === k) throw b = String(a), Error("Objects are not valid as a React child (found: " + ("[object Object]" === b ? "object with keys {" + Object.keys(a).join(", ") + "}" : b) + "). If you meant to render a collection of children, use an array instead."); + return h; + } + function S(a, b, e) { + if (null == a) return a; + var d = [], c = 0; + R(a, d, "", "", function(a2) { + return b.call(e, a2, c++); + }); + return d; + } + function T(a) { + if (-1 === a._status) { + var b = a._result; + b = b(); + b.then(function(b2) { + if (0 === a._status || -1 === a._status) a._status = 1, a._result = b2; + }, function(b2) { + if (0 === a._status || -1 === a._status) a._status = 2, a._result = b2; + }); + -1 === a._status && (a._status = 0, a._result = b); + } + if (1 === a._status) return a._result.default; + throw a._result; + } + var U = { current: null }, V = { transition: null }, W = { ReactCurrentDispatcher: U, ReactCurrentBatchConfig: V, ReactCurrentOwner: K }; + function X() { + throw Error("act(...) is not supported in production builds of React."); + } + react_production_min.Children = { map: S, forEach: function(a, b, e) { + S(a, function() { + b.apply(this, arguments); + }, e); + }, count: function(a) { + var b = 0; + S(a, function() { + b++; + }); + return b; + }, toArray: function(a) { + return S(a, function(a2) { + return a2; + }) || []; + }, only: function(a) { + if (!O(a)) throw Error("React.Children.only expected to receive a single React element child."); + return a; + } }; + react_production_min.Component = E; + react_production_min.Fragment = p; + react_production_min.Profiler = r; + react_production_min.PureComponent = G; + react_production_min.StrictMode = q; + react_production_min.Suspense = w; + react_production_min.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = W; + react_production_min.act = X; + react_production_min.cloneElement = function(a, b, e) { + if (null === a || void 0 === a) throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + a + "."); + var d = C({}, a.props), c = a.key, k = a.ref, h = a._owner; + if (null != b) { + void 0 !== b.ref && (k = b.ref, h = K.current); + void 0 !== b.key && (c = "" + b.key); + if (a.type && a.type.defaultProps) var g = a.type.defaultProps; + for (f in b) J.call(b, f) && !L.hasOwnProperty(f) && (d[f] = void 0 === b[f] && void 0 !== g ? g[f] : b[f]); + } + var f = arguments.length - 2; + if (1 === f) d.children = e; + else if (1 < f) { + g = Array(f); + for (var m = 0; m < f; m++) g[m] = arguments[m + 2]; + d.children = g; + } + return { $$typeof: l, type: a.type, key: c, ref: k, props: d, _owner: h }; + }; + react_production_min.createContext = function(a) { + a = { $$typeof: u, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null, _defaultValue: null, _globalName: null }; + a.Provider = { $$typeof: t, _context: a }; + return a.Consumer = a; + }; + react_production_min.createElement = M; + react_production_min.createFactory = function(a) { + var b = M.bind(null, a); + b.type = a; + return b; + }; + react_production_min.createRef = function() { + return { current: null }; + }; + react_production_min.forwardRef = function(a) { + return { $$typeof: v, render: a }; + }; + react_production_min.isValidElement = O; + react_production_min.lazy = function(a) { + return { $$typeof: y, _payload: { _status: -1, _result: a }, _init: T }; + }; + react_production_min.memo = function(a, b) { + return { $$typeof: x, type: a, compare: void 0 === b ? null : b }; + }; + react_production_min.startTransition = function(a) { + var b = V.transition; + V.transition = {}; + try { + a(); + } finally { + V.transition = b; + } + }; + react_production_min.unstable_act = X; + react_production_min.useCallback = function(a, b) { + return U.current.useCallback(a, b); + }; + react_production_min.useContext = function(a) { + return U.current.useContext(a); + }; + react_production_min.useDebugValue = function() { + }; + react_production_min.useDeferredValue = function(a) { + return U.current.useDeferredValue(a); + }; + react_production_min.useEffect = function(a, b) { + return U.current.useEffect(a, b); + }; + react_production_min.useId = function() { + return U.current.useId(); + }; + react_production_min.useImperativeHandle = function(a, b, e) { + return U.current.useImperativeHandle(a, b, e); + }; + react_production_min.useInsertionEffect = function(a, b) { + return U.current.useInsertionEffect(a, b); + }; + react_production_min.useLayoutEffect = function(a, b) { + return U.current.useLayoutEffect(a, b); + }; + react_production_min.useMemo = function(a, b) { + return U.current.useMemo(a, b); + }; + react_production_min.useReducer = function(a, b, e) { + return U.current.useReducer(a, b, e); + }; + react_production_min.useRef = function(a) { + return U.current.useRef(a); + }; + react_production_min.useState = function(a) { + return U.current.useState(a); + }; + react_production_min.useSyncExternalStore = function(a, b, e) { + return U.current.useSyncExternalStore(a, b, e); + }; + react_production_min.useTransition = function() { + return U.current.useTransition(); + }; + react_production_min.version = "18.3.1"; + return react_production_min; +} +var hasRequiredReact; +function requireReact() { + if (hasRequiredReact) return react.exports; + hasRequiredReact = 1; + { + react.exports = requireReact_production_min(); + } + return react.exports; +} +/** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var hasRequiredReactJsxRuntime_production_min; +function requireReactJsxRuntime_production_min() { + if (hasRequiredReactJsxRuntime_production_min) return reactJsxRuntime_production_min; + hasRequiredReactJsxRuntime_production_min = 1; + var f = requireReact(), k = Symbol.for("react.element"), l = Symbol.for("react.fragment"), m = Object.prototype.hasOwnProperty, n = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p = { key: true, ref: true, __self: true, __source: true }; + function q(c, a, g) { + var b, d = {}, e = null, h = null; + void 0 !== g && (e = "" + g); + void 0 !== a.key && (e = "" + a.key); + void 0 !== a.ref && (h = a.ref); + for (b in a) m.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]); + if (c && c.defaultProps) for (b in a = c.defaultProps, a) void 0 === d[b] && (d[b] = a[b]); + return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current }; + } + reactJsxRuntime_production_min.Fragment = l; + reactJsxRuntime_production_min.jsx = q; + reactJsxRuntime_production_min.jsxs = q; + return reactJsxRuntime_production_min; +} +var hasRequiredJsxRuntime; +function requireJsxRuntime() { + if (hasRequiredJsxRuntime) return jsxRuntime.exports; + hasRequiredJsxRuntime = 1; + { + jsxRuntime.exports = requireReactJsxRuntime_production_min(); + } + return jsxRuntime.exports; +} +var jsxRuntimeExports = requireJsxRuntime(); +var reactExports = requireReact(); +const React = /* @__PURE__ */ getDefaultExportFromCjs(reactExports); +var client = {}; +var reactDom = { exports: {} }; +var reactDom_production_min = {}; +var scheduler = { exports: {} }; +var scheduler_production_min = {}; +/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var hasRequiredScheduler_production_min; +function requireScheduler_production_min() { + if (hasRequiredScheduler_production_min) return scheduler_production_min; + hasRequiredScheduler_production_min = 1; + (function(exports) { + function f(a, b) { + var c = a.length; + a.push(b); + a: for (; 0 < c; ) { + var d = c - 1 >>> 1, e = a[d]; + if (0 < g(e, b)) a[d] = b, a[c] = e, c = d; + else break a; + } + } + function h(a) { + return 0 === a.length ? null : a[0]; + } + function k(a) { + if (0 === a.length) return null; + var b = a[0], c = a.pop(); + if (c !== b) { + a[0] = c; + a: for (var d = 0, e = a.length, w = e >>> 1; d < w; ) { + var m = 2 * (d + 1) - 1, C = a[m], n = m + 1, x = a[n]; + if (0 > g(C, c)) n < e && 0 > g(x, C) ? (a[d] = x, a[n] = c, d = n) : (a[d] = C, a[m] = c, d = m); + else if (n < e && 0 > g(x, c)) a[d] = x, a[n] = c, d = n; + else break a; + } + } + return b; + } + function g(a, b) { + var c = a.sortIndex - b.sortIndex; + return 0 !== c ? c : a.id - b.id; + } + if ("object" === typeof performance && "function" === typeof performance.now) { + var l = performance; + exports.unstable_now = function() { + return l.now(); + }; + } else { + var p = Date, q = p.now(); + exports.unstable_now = function() { + return p.now() - q; + }; + } + var r = [], t = [], u = 1, v = null, y = 3, z = false, A = false, B = false, D = "function" === typeof setTimeout ? setTimeout : null, E = "function" === typeof clearTimeout ? clearTimeout : null, F = "undefined" !== typeof setImmediate ? setImmediate : null; + "undefined" !== typeof navigator && void 0 !== navigator.scheduling && void 0 !== navigator.scheduling.isInputPending && navigator.scheduling.isInputPending.bind(navigator.scheduling); + function G(a) { + for (var b = h(t); null !== b; ) { + if (null === b.callback) k(t); + else if (b.startTime <= a) k(t), b.sortIndex = b.expirationTime, f(r, b); + else break; + b = h(t); + } + } + function H(a) { + B = false; + G(a); + if (!A) if (null !== h(r)) A = true, I(J); + else { + var b = h(t); + null !== b && K(H, b.startTime - a); + } + } + function J(a, b) { + A = false; + B && (B = false, E(L), L = -1); + z = true; + var c = y; + try { + G(b); + for (v = h(r); null !== v && (!(v.expirationTime > b) || a && !M()); ) { + var d = v.callback; + if ("function" === typeof d) { + v.callback = null; + y = v.priorityLevel; + var e = d(v.expirationTime <= b); + b = exports.unstable_now(); + "function" === typeof e ? v.callback = e : v === h(r) && k(r); + G(b); + } else k(r); + v = h(r); + } + if (null !== v) var w = true; + else { + var m = h(t); + null !== m && K(H, m.startTime - b); + w = false; + } + return w; + } finally { + v = null, y = c, z = false; + } + } + var N = false, O = null, L = -1, P = 5, Q = -1; + function M() { + return exports.unstable_now() - Q < P ? false : true; + } + function R() { + if (null !== O) { + var a = exports.unstable_now(); + Q = a; + var b = true; + try { + b = O(true, a); + } finally { + b ? S() : (N = false, O = null); + } + } else N = false; + } + var S; + if ("function" === typeof F) S = function() { + F(R); + }; + else if ("undefined" !== typeof MessageChannel) { + var T = new MessageChannel(), U = T.port2; + T.port1.onmessage = R; + S = function() { + U.postMessage(null); + }; + } else S = function() { + D(R, 0); + }; + function I(a) { + O = a; + N || (N = true, S()); + } + function K(a, b) { + L = D(function() { + a(exports.unstable_now()); + }, b); + } + exports.unstable_IdlePriority = 5; + exports.unstable_ImmediatePriority = 1; + exports.unstable_LowPriority = 4; + exports.unstable_NormalPriority = 3; + exports.unstable_Profiling = null; + exports.unstable_UserBlockingPriority = 2; + exports.unstable_cancelCallback = function(a) { + a.callback = null; + }; + exports.unstable_continueExecution = function() { + A || z || (A = true, I(J)); + }; + exports.unstable_forceFrameRate = function(a) { + 0 > a || 125 < a ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : P = 0 < a ? Math.floor(1e3 / a) : 5; + }; + exports.unstable_getCurrentPriorityLevel = function() { + return y; + }; + exports.unstable_getFirstCallbackNode = function() { + return h(r); + }; + exports.unstable_next = function(a) { + switch (y) { + case 1: + case 2: + case 3: + var b = 3; + break; + default: + b = y; + } + var c = y; + y = b; + try { + return a(); + } finally { + y = c; + } + }; + exports.unstable_pauseExecution = function() { + }; + exports.unstable_requestPaint = function() { + }; + exports.unstable_runWithPriority = function(a, b) { + switch (a) { + case 1: + case 2: + case 3: + case 4: + case 5: + break; + default: + a = 3; + } + var c = y; + y = a; + try { + return b(); + } finally { + y = c; + } + }; + exports.unstable_scheduleCallback = function(a, b, c) { + var d = exports.unstable_now(); + "object" === typeof c && null !== c ? (c = c.delay, c = "number" === typeof c && 0 < c ? d + c : d) : c = d; + switch (a) { + case 1: + var e = -1; + break; + case 2: + e = 250; + break; + case 5: + e = 1073741823; + break; + case 4: + e = 1e4; + break; + default: + e = 5e3; + } + e = c + e; + a = { id: u++, callback: b, priorityLevel: a, startTime: c, expirationTime: e, sortIndex: -1 }; + c > d ? (a.sortIndex = c, f(t, a), null === h(r) && a === h(t) && (B ? (E(L), L = -1) : B = true, K(H, c - d))) : (a.sortIndex = e, f(r, a), A || z || (A = true, I(J))); + return a; + }; + exports.unstable_shouldYield = M; + exports.unstable_wrapCallback = function(a) { + var b = y; + return function() { + var c = y; + y = b; + try { + return a.apply(this, arguments); + } finally { + y = c; + } + }; + }; + })(scheduler_production_min); + return scheduler_production_min; +} +var hasRequiredScheduler; +function requireScheduler() { + if (hasRequiredScheduler) return scheduler.exports; + hasRequiredScheduler = 1; + { + scheduler.exports = requireScheduler_production_min(); + } + return scheduler.exports; +} +/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var hasRequiredReactDom_production_min; +function requireReactDom_production_min() { + if (hasRequiredReactDom_production_min) return reactDom_production_min; + hasRequiredReactDom_production_min = 1; + var aa = requireReact(), ca = requireScheduler(); + function p(a) { + for (var b = "https://reactjs.org/docs/error-decoder.html?invariant=" + a, c = 1; c < arguments.length; c++) b += "&args[]=" + encodeURIComponent(arguments[c]); + return "Minified React error #" + a + "; visit " + b + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."; + } + var da = /* @__PURE__ */ new Set(), ea = {}; + function fa(a, b) { + ha(a, b); + ha(a + "Capture", b); + } + function ha(a, b) { + ea[a] = b; + for (a = 0; a < b.length; a++) da.add(b[a]); + } + var ia = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement), ja = Object.prototype.hasOwnProperty, ka = /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, la = {}, ma = {}; + function oa(a) { + if (ja.call(ma, a)) return true; + if (ja.call(la, a)) return false; + if (ka.test(a)) return ma[a] = true; + la[a] = true; + return false; + } + function pa(a, b, c, d) { + if (null !== c && 0 === c.type) return false; + switch (typeof b) { + case "function": + case "symbol": + return true; + case "boolean": + if (d) return false; + if (null !== c) return !c.acceptsBooleans; + a = a.toLowerCase().slice(0, 5); + return "data-" !== a && "aria-" !== a; + default: + return false; + } + } + function qa(a, b, c, d) { + if (null === b || "undefined" === typeof b || pa(a, b, c, d)) return true; + if (d) return false; + if (null !== c) switch (c.type) { + case 3: + return !b; + case 4: + return false === b; + case 5: + return isNaN(b); + case 6: + return isNaN(b) || 1 > b; + } + return false; + } + function v(a, b, c, d, e, f, g) { + this.acceptsBooleans = 2 === b || 3 === b || 4 === b; + this.attributeName = d; + this.attributeNamespace = e; + this.mustUseProperty = c; + this.propertyName = a; + this.type = b; + this.sanitizeURL = f; + this.removeEmptyString = g; + } + var z = {}; + "children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a) { + z[a] = new v(a, 0, false, a, null, false, false); + }); + [["acceptCharset", "accept-charset"], ["className", "class"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"]].forEach(function(a) { + var b = a[0]; + z[b] = new v(b, 1, false, a[1], null, false, false); + }); + ["contentEditable", "draggable", "spellCheck", "value"].forEach(function(a) { + z[a] = new v(a, 2, false, a.toLowerCase(), null, false, false); + }); + ["autoReverse", "externalResourcesRequired", "focusable", "preserveAlpha"].forEach(function(a) { + z[a] = new v(a, 2, false, a, null, false, false); + }); + "allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a) { + z[a] = new v(a, 3, false, a.toLowerCase(), null, false, false); + }); + ["checked", "multiple", "muted", "selected"].forEach(function(a) { + z[a] = new v(a, 3, true, a, null, false, false); + }); + ["capture", "download"].forEach(function(a) { + z[a] = new v(a, 4, false, a, null, false, false); + }); + ["cols", "rows", "size", "span"].forEach(function(a) { + z[a] = new v(a, 6, false, a, null, false, false); + }); + ["rowSpan", "start"].forEach(function(a) { + z[a] = new v(a, 5, false, a.toLowerCase(), null, false, false); + }); + var ra = /[\-:]([a-z])/g; + function sa(a) { + return a[1].toUpperCase(); + } + "accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a) { + var b = a.replace( + ra, + sa + ); + z[b] = new v(b, 1, false, a, null, false, false); + }); + "xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a) { + var b = a.replace(ra, sa); + z[b] = new v(b, 1, false, a, "http://www.w3.org/1999/xlink", false, false); + }); + ["xml:base", "xml:lang", "xml:space"].forEach(function(a) { + var b = a.replace(ra, sa); + z[b] = new v(b, 1, false, a, "http://www.w3.org/XML/1998/namespace", false, false); + }); + ["tabIndex", "crossOrigin"].forEach(function(a) { + z[a] = new v(a, 1, false, a.toLowerCase(), null, false, false); + }); + z.xlinkHref = new v("xlinkHref", 1, false, "xlink:href", "http://www.w3.org/1999/xlink", true, false); + ["src", "href", "action", "formAction"].forEach(function(a) { + z[a] = new v(a, 1, false, a.toLowerCase(), null, true, true); + }); + function ta(a, b, c, d) { + var e = z.hasOwnProperty(b) ? z[b] : null; + if (null !== e ? 0 !== e.type : d || !(2 < b.length) || "o" !== b[0] && "O" !== b[0] || "n" !== b[1] && "N" !== b[1]) qa(b, c, e, d) && (c = null), d || null === e ? oa(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 === e.type ? false : "" : c : (b = e.attributeName, d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && true === c ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))); + } + var ua = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, va = Symbol.for("react.element"), wa = Symbol.for("react.portal"), ya = Symbol.for("react.fragment"), za = Symbol.for("react.strict_mode"), Aa = Symbol.for("react.profiler"), Ba = Symbol.for("react.provider"), Ca = Symbol.for("react.context"), Da = Symbol.for("react.forward_ref"), Ea = Symbol.for("react.suspense"), Fa = Symbol.for("react.suspense_list"), Ga = Symbol.for("react.memo"), Ha = Symbol.for("react.lazy"); + var Ia = Symbol.for("react.offscreen"); + var Ja = Symbol.iterator; + function Ka(a) { + if (null === a || "object" !== typeof a) return null; + a = Ja && a[Ja] || a["@@iterator"]; + return "function" === typeof a ? a : null; + } + var A = Object.assign, La; + function Ma(a) { + if (void 0 === La) try { + throw Error(); + } catch (c) { + var b = c.stack.trim().match(/\n( *(at )?)/); + La = b && b[1] || ""; + } + return "\n" + La + a; + } + var Na = false; + function Oa(a, b) { + if (!a || Na) return ""; + Na = true; + var c = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + try { + if (b) if (b = function() { + throw Error(); + }, Object.defineProperty(b.prototype, "props", { set: function() { + throw Error(); + } }), "object" === typeof Reflect && Reflect.construct) { + try { + Reflect.construct(b, []); + } catch (l) { + var d = l; + } + Reflect.construct(a, [], b); + } else { + try { + b.call(); + } catch (l) { + d = l; + } + a.call(b.prototype); + } + else { + try { + throw Error(); + } catch (l) { + d = l; + } + a(); + } + } catch (l) { + if (l && d && "string" === typeof l.stack) { + for (var e = l.stack.split("\n"), f = d.stack.split("\n"), g = e.length - 1, h = f.length - 1; 1 <= g && 0 <= h && e[g] !== f[h]; ) h--; + for (; 1 <= g && 0 <= h; g--, h--) if (e[g] !== f[h]) { + if (1 !== g || 1 !== h) { + do + if (g--, h--, 0 > h || e[g] !== f[h]) { + var k = "\n" + e[g].replace(" at new ", " at "); + a.displayName && k.includes("") && (k = k.replace("", a.displayName)); + return k; + } + while (1 <= g && 0 <= h); + } + break; + } + } + } finally { + Na = false, Error.prepareStackTrace = c; + } + return (a = a ? a.displayName || a.name : "") ? Ma(a) : ""; + } + function Pa(a) { + switch (a.tag) { + case 5: + return Ma(a.type); + case 16: + return Ma("Lazy"); + case 13: + return Ma("Suspense"); + case 19: + return Ma("SuspenseList"); + case 0: + case 2: + case 15: + return a = Oa(a.type, false), a; + case 11: + return a = Oa(a.type.render, false), a; + case 1: + return a = Oa(a.type, true), a; + default: + return ""; + } + } + function Qa(a) { + if (null == a) return null; + if ("function" === typeof a) return a.displayName || a.name || null; + if ("string" === typeof a) return a; + switch (a) { + case ya: + return "Fragment"; + case wa: + return "Portal"; + case Aa: + return "Profiler"; + case za: + return "StrictMode"; + case Ea: + return "Suspense"; + case Fa: + return "SuspenseList"; + } + if ("object" === typeof a) switch (a.$$typeof) { + case Ca: + return (a.displayName || "Context") + ".Consumer"; + case Ba: + return (a._context.displayName || "Context") + ".Provider"; + case Da: + var b = a.render; + a = a.displayName; + a || (a = b.displayName || b.name || "", a = "" !== a ? "ForwardRef(" + a + ")" : "ForwardRef"); + return a; + case Ga: + return b = a.displayName || null, null !== b ? b : Qa(a.type) || "Memo"; + case Ha: + b = a._payload; + a = a._init; + try { + return Qa(a(b)); + } catch (c) { + } + } + return null; + } + function Ra(a) { + var b = a.type; + switch (a.tag) { + case 24: + return "Cache"; + case 9: + return (b.displayName || "Context") + ".Consumer"; + case 10: + return (b._context.displayName || "Context") + ".Provider"; + case 18: + return "DehydratedFragment"; + case 11: + return a = b.render, a = a.displayName || a.name || "", b.displayName || ("" !== a ? "ForwardRef(" + a + ")" : "ForwardRef"); + case 7: + return "Fragment"; + case 5: + return b; + case 4: + return "Portal"; + case 3: + return "Root"; + case 6: + return "Text"; + case 16: + return Qa(b); + case 8: + return b === za ? "StrictMode" : "Mode"; + case 22: + return "Offscreen"; + case 12: + return "Profiler"; + case 21: + return "Scope"; + case 13: + return "Suspense"; + case 19: + return "SuspenseList"; + case 25: + return "TracingMarker"; + case 1: + case 0: + case 17: + case 2: + case 14: + case 15: + if ("function" === typeof b) return b.displayName || b.name || null; + if ("string" === typeof b) return b; + } + return null; + } + function Sa(a) { + switch (typeof a) { + case "boolean": + case "number": + case "string": + case "undefined": + return a; + case "object": + return a; + default: + return ""; + } + } + function Ta(a) { + var b = a.type; + return (a = a.nodeName) && "input" === a.toLowerCase() && ("checkbox" === b || "radio" === b); + } + function Ua(a) { + var b = Ta(a) ? "checked" : "value", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = "" + a[b]; + if (!a.hasOwnProperty(b) && "undefined" !== typeof c && "function" === typeof c.get && "function" === typeof c.set) { + var e = c.get, f = c.set; + Object.defineProperty(a, b, { configurable: true, get: function() { + return e.call(this); + }, set: function(a2) { + d = "" + a2; + f.call(this, a2); + } }); + Object.defineProperty(a, b, { enumerable: c.enumerable }); + return { getValue: function() { + return d; + }, setValue: function(a2) { + d = "" + a2; + }, stopTracking: function() { + a._valueTracker = null; + delete a[b]; + } }; + } + } + function Va(a) { + a._valueTracker || (a._valueTracker = Ua(a)); + } + function Wa(a) { + if (!a) return false; + var b = a._valueTracker; + if (!b) return true; + var c = b.getValue(); + var d = ""; + a && (d = Ta(a) ? a.checked ? "true" : "false" : a.value); + a = d; + return a !== c ? (b.setValue(a), true) : false; + } + function Xa(a) { + a = a || ("undefined" !== typeof document ? document : void 0); + if ("undefined" === typeof a) return null; + try { + return a.activeElement || a.body; + } catch (b) { + return a.body; + } + } + function Ya(a, b) { + var c = b.checked; + return A({}, b, { defaultChecked: void 0, defaultValue: void 0, value: void 0, checked: null != c ? c : a._wrapperState.initialChecked }); + } + function Za(a, b) { + var c = null == b.defaultValue ? "" : b.defaultValue, d = null != b.checked ? b.checked : b.defaultChecked; + c = Sa(null != b.value ? b.value : c); + a._wrapperState = { initialChecked: d, initialValue: c, controlled: "checkbox" === b.type || "radio" === b.type ? null != b.checked : null != b.value }; + } + function ab(a, b) { + b = b.checked; + null != b && ta(a, "checked", b, false); + } + function bb(a, b) { + ab(a, b); + var c = Sa(b.value), d = b.type; + if (null != c) if ("number" === d) { + if (0 === c && "" === a.value || a.value != c) a.value = "" + c; + } else a.value !== "" + c && (a.value = "" + c); + else if ("submit" === d || "reset" === d) { + a.removeAttribute("value"); + return; + } + b.hasOwnProperty("value") ? cb(a, b.type, c) : b.hasOwnProperty("defaultValue") && cb(a, b.type, Sa(b.defaultValue)); + null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked); + } + function db(a, b, c) { + if (b.hasOwnProperty("value") || b.hasOwnProperty("defaultValue")) { + var d = b.type; + if (!("submit" !== d && "reset" !== d || void 0 !== b.value && null !== b.value)) return; + b = "" + a._wrapperState.initialValue; + c || b === a.value || (a.value = b); + a.defaultValue = b; + } + c = a.name; + "" !== c && (a.name = ""); + a.defaultChecked = !!a._wrapperState.initialChecked; + "" !== c && (a.name = c); + } + function cb(a, b, c) { + if ("number" !== b || Xa(a.ownerDocument) !== a) null == c ? a.defaultValue = "" + a._wrapperState.initialValue : a.defaultValue !== "" + c && (a.defaultValue = "" + c); + } + var eb = Array.isArray; + function fb(a, b, c, d) { + a = a.options; + if (b) { + b = {}; + for (var e = 0; e < c.length; e++) b["$" + c[e]] = true; + for (c = 0; c < a.length; c++) e = b.hasOwnProperty("$" + a[c].value), a[c].selected !== e && (a[c].selected = e), e && d && (a[c].defaultSelected = true); + } else { + c = "" + Sa(c); + b = null; + for (e = 0; e < a.length; e++) { + if (a[e].value === c) { + a[e].selected = true; + d && (a[e].defaultSelected = true); + return; + } + null !== b || a[e].disabled || (b = a[e]); + } + null !== b && (b.selected = true); + } + } + function gb(a, b) { + if (null != b.dangerouslySetInnerHTML) throw Error(p(91)); + return A({}, b, { value: void 0, defaultValue: void 0, children: "" + a._wrapperState.initialValue }); + } + function hb(a, b) { + var c = b.value; + if (null == c) { + c = b.children; + b = b.defaultValue; + if (null != c) { + if (null != b) throw Error(p(92)); + if (eb(c)) { + if (1 < c.length) throw Error(p(93)); + c = c[0]; + } + b = c; + } + null == b && (b = ""); + c = b; + } + a._wrapperState = { initialValue: Sa(c) }; + } + function ib(a, b) { + var c = Sa(b.value), d = Sa(b.defaultValue); + null != c && (c = "" + c, c !== a.value && (a.value = c), null == b.defaultValue && a.defaultValue !== c && (a.defaultValue = c)); + null != d && (a.defaultValue = "" + d); + } + function jb(a) { + var b = a.textContent; + b === a._wrapperState.initialValue && "" !== b && null !== b && (a.value = b); + } + function kb(a) { + switch (a) { + case "svg": + return "http://www.w3.org/2000/svg"; + case "math": + return "http://www.w3.org/1998/Math/MathML"; + default: + return "http://www.w3.org/1999/xhtml"; + } + } + function lb(a, b) { + return null == a || "http://www.w3.org/1999/xhtml" === a ? kb(b) : "http://www.w3.org/2000/svg" === a && "foreignObject" === b ? "http://www.w3.org/1999/xhtml" : a; + } + var mb, nb = function(a) { + return "undefined" !== typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) { + MSApp.execUnsafeLocalFunction(function() { + return a(b, c, d, e); + }); + } : a; + }(function(a, b) { + if ("http://www.w3.org/2000/svg" !== a.namespaceURI || "innerHTML" in a) a.innerHTML = b; + else { + mb = mb || document.createElement("div"); + mb.innerHTML = "" + b.valueOf().toString() + ""; + for (b = mb.firstChild; a.firstChild; ) a.removeChild(a.firstChild); + for (; b.firstChild; ) a.appendChild(b.firstChild); + } + }); + function ob(a, b) { + if (b) { + var c = a.firstChild; + if (c && c === a.lastChild && 3 === c.nodeType) { + c.nodeValue = b; + return; + } + } + a.textContent = b; + } + var pb = { + animationIterationCount: true, + aspectRatio: true, + borderImageOutset: true, + borderImageSlice: true, + borderImageWidth: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + columns: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + gridArea: true, + gridRow: true, + gridRowEnd: true, + gridRowSpan: true, + gridRowStart: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnSpan: true, + gridColumnStart: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeDasharray: true, + strokeDashoffset: true, + strokeMiterlimit: true, + strokeOpacity: true, + strokeWidth: true + }, qb = ["Webkit", "ms", "Moz", "O"]; + Object.keys(pb).forEach(function(a) { + qb.forEach(function(b) { + b = b + a.charAt(0).toUpperCase() + a.substring(1); + pb[b] = pb[a]; + }); + }); + function rb(a, b, c) { + return null == b || "boolean" === typeof b || "" === b ? "" : c || "number" !== typeof b || 0 === b || pb.hasOwnProperty(a) && pb[a] ? ("" + b).trim() : b + "px"; + } + function sb(a, b) { + a = a.style; + for (var c in b) if (b.hasOwnProperty(c)) { + var d = 0 === c.indexOf("--"), e = rb(c, b[c], d); + "float" === c && (c = "cssFloat"); + d ? a.setProperty(c, e) : a[c] = e; + } + } + var tb = A({ menuitem: true }, { area: true, base: true, br: true, col: true, embed: true, hr: true, img: true, input: true, keygen: true, link: true, meta: true, param: true, source: true, track: true, wbr: true }); + function ub(a, b) { + if (b) { + if (tb[a] && (null != b.children || null != b.dangerouslySetInnerHTML)) throw Error(p(137, a)); + if (null != b.dangerouslySetInnerHTML) { + if (null != b.children) throw Error(p(60)); + if ("object" !== typeof b.dangerouslySetInnerHTML || !("__html" in b.dangerouslySetInnerHTML)) throw Error(p(61)); + } + if (null != b.style && "object" !== typeof b.style) throw Error(p(62)); + } + } + function vb(a, b) { + if (-1 === a.indexOf("-")) return "string" === typeof b.is; + switch (a) { + case "annotation-xml": + case "color-profile": + case "font-face": + case "font-face-src": + case "font-face-uri": + case "font-face-format": + case "font-face-name": + case "missing-glyph": + return false; + default: + return true; + } + } + var wb = null; + function xb(a) { + a = a.target || a.srcElement || window; + a.correspondingUseElement && (a = a.correspondingUseElement); + return 3 === a.nodeType ? a.parentNode : a; + } + var yb = null, zb = null, Ab = null; + function Bb(a) { + if (a = Cb(a)) { + if ("function" !== typeof yb) throw Error(p(280)); + var b = a.stateNode; + b && (b = Db(b), yb(a.stateNode, a.type, b)); + } + } + function Eb(a) { + zb ? Ab ? Ab.push(a) : Ab = [a] : zb = a; + } + function Fb() { + if (zb) { + var a = zb, b = Ab; + Ab = zb = null; + Bb(a); + if (b) for (a = 0; a < b.length; a++) Bb(b[a]); + } + } + function Gb(a, b) { + return a(b); + } + function Hb() { + } + var Ib = false; + function Jb(a, b, c) { + if (Ib) return a(b, c); + Ib = true; + try { + return Gb(a, b, c); + } finally { + if (Ib = false, null !== zb || null !== Ab) Hb(), Fb(); + } + } + function Kb(a, b) { + var c = a.stateNode; + if (null === c) return null; + var d = Db(c); + if (null === d) return null; + c = d[b]; + a: switch (b) { + case "onClick": + case "onClickCapture": + case "onDoubleClick": + case "onDoubleClickCapture": + case "onMouseDown": + case "onMouseDownCapture": + case "onMouseMove": + case "onMouseMoveCapture": + case "onMouseUp": + case "onMouseUpCapture": + case "onMouseEnter": + (d = !d.disabled) || (a = a.type, d = !("button" === a || "input" === a || "select" === a || "textarea" === a)); + a = !d; + break a; + default: + a = false; + } + if (a) return null; + if (c && "function" !== typeof c) throw Error(p(231, b, typeof c)); + return c; + } + var Lb = false; + if (ia) try { + var Mb = {}; + Object.defineProperty(Mb, "passive", { get: function() { + Lb = true; + } }); + window.addEventListener("test", Mb, Mb); + window.removeEventListener("test", Mb, Mb); + } catch (a) { + Lb = false; + } + function Nb(a, b, c, d, e, f, g, h, k) { + var l = Array.prototype.slice.call(arguments, 3); + try { + b.apply(c, l); + } catch (m) { + this.onError(m); + } + } + var Ob = false, Pb = null, Qb = false, Rb = null, Sb = { onError: function(a) { + Ob = true; + Pb = a; + } }; + function Tb(a, b, c, d, e, f, g, h, k) { + Ob = false; + Pb = null; + Nb.apply(Sb, arguments); + } + function Ub(a, b, c, d, e, f, g, h, k) { + Tb.apply(this, arguments); + if (Ob) { + if (Ob) { + var l = Pb; + Ob = false; + Pb = null; + } else throw Error(p(198)); + Qb || (Qb = true, Rb = l); + } + } + function Vb(a) { + var b = a, c = a; + if (a.alternate) for (; b.return; ) b = b.return; + else { + a = b; + do + b = a, 0 !== (b.flags & 4098) && (c = b.return), a = b.return; + while (a); + } + return 3 === b.tag ? c : null; + } + function Wb(a) { + if (13 === a.tag) { + var b = a.memoizedState; + null === b && (a = a.alternate, null !== a && (b = a.memoizedState)); + if (null !== b) return b.dehydrated; + } + return null; + } + function Xb(a) { + if (Vb(a) !== a) throw Error(p(188)); + } + function Yb(a) { + var b = a.alternate; + if (!b) { + b = Vb(a); + if (null === b) throw Error(p(188)); + return b !== a ? null : a; + } + for (var c = a, d = b; ; ) { + var e = c.return; + if (null === e) break; + var f = e.alternate; + if (null === f) { + d = e.return; + if (null !== d) { + c = d; + continue; + } + break; + } + if (e.child === f.child) { + for (f = e.child; f; ) { + if (f === c) return Xb(e), a; + if (f === d) return Xb(e), b; + f = f.sibling; + } + throw Error(p(188)); + } + if (c.return !== d.return) c = e, d = f; + else { + for (var g = false, h = e.child; h; ) { + if (h === c) { + g = true; + c = e; + d = f; + break; + } + if (h === d) { + g = true; + d = e; + c = f; + break; + } + h = h.sibling; + } + if (!g) { + for (h = f.child; h; ) { + if (h === c) { + g = true; + c = f; + d = e; + break; + } + if (h === d) { + g = true; + d = f; + c = e; + break; + } + h = h.sibling; + } + if (!g) throw Error(p(189)); + } + } + if (c.alternate !== d) throw Error(p(190)); + } + if (3 !== c.tag) throw Error(p(188)); + return c.stateNode.current === c ? a : b; + } + function Zb(a) { + a = Yb(a); + return null !== a ? $b(a) : null; + } + function $b(a) { + if (5 === a.tag || 6 === a.tag) return a; + for (a = a.child; null !== a; ) { + var b = $b(a); + if (null !== b) return b; + a = a.sibling; + } + return null; + } + var ac = ca.unstable_scheduleCallback, bc = ca.unstable_cancelCallback, cc = ca.unstable_shouldYield, dc = ca.unstable_requestPaint, B = ca.unstable_now, ec = ca.unstable_getCurrentPriorityLevel, fc = ca.unstable_ImmediatePriority, gc = ca.unstable_UserBlockingPriority, hc = ca.unstable_NormalPriority, ic = ca.unstable_LowPriority, jc = ca.unstable_IdlePriority, kc = null, lc = null; + function mc(a) { + if (lc && "function" === typeof lc.onCommitFiberRoot) try { + lc.onCommitFiberRoot(kc, a, void 0, 128 === (a.current.flags & 128)); + } catch (b) { + } + } + var oc = Math.clz32 ? Math.clz32 : nc, pc = Math.log, qc = Math.LN2; + function nc(a) { + a >>>= 0; + return 0 === a ? 32 : 31 - (pc(a) / qc | 0) | 0; + } + var rc = 64, sc = 4194304; + function tc(a) { + switch (a & -a) { + case 1: + return 1; + case 2: + return 2; + case 4: + return 4; + case 8: + return 8; + case 16: + return 16; + case 32: + return 32; + case 64: + case 128: + case 256: + case 512: + case 1024: + case 2048: + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + case 131072: + case 262144: + case 524288: + case 1048576: + case 2097152: + return a & 4194240; + case 4194304: + case 8388608: + case 16777216: + case 33554432: + case 67108864: + return a & 130023424; + case 134217728: + return 134217728; + case 268435456: + return 268435456; + case 536870912: + return 536870912; + case 1073741824: + return 1073741824; + default: + return a; + } + } + function uc(a, b) { + var c = a.pendingLanes; + if (0 === c) return 0; + var d = 0, e = a.suspendedLanes, f = a.pingedLanes, g = c & 268435455; + if (0 !== g) { + var h = g & ~e; + 0 !== h ? d = tc(h) : (f &= g, 0 !== f && (d = tc(f))); + } else g = c & ~e, 0 !== g ? d = tc(g) : 0 !== f && (d = tc(f)); + if (0 === d) return 0; + if (0 !== b && b !== d && 0 === (b & e) && (e = d & -d, f = b & -b, e >= f || 16 === e && 0 !== (f & 4194240))) return b; + 0 !== (d & 4) && (d |= c & 16); + b = a.entangledLanes; + if (0 !== b) for (a = a.entanglements, b &= d; 0 < b; ) c = 31 - oc(b), e = 1 << c, d |= a[c], b &= ~e; + return d; + } + function vc(a, b) { + switch (a) { + case 1: + case 2: + case 4: + return b + 250; + case 8: + case 16: + case 32: + case 64: + case 128: + case 256: + case 512: + case 1024: + case 2048: + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + case 131072: + case 262144: + case 524288: + case 1048576: + case 2097152: + return b + 5e3; + case 4194304: + case 8388608: + case 16777216: + case 33554432: + case 67108864: + return -1; + case 134217728: + case 268435456: + case 536870912: + case 1073741824: + return -1; + default: + return -1; + } + } + function wc(a, b) { + for (var c = a.suspendedLanes, d = a.pingedLanes, e = a.expirationTimes, f = a.pendingLanes; 0 < f; ) { + var g = 31 - oc(f), h = 1 << g, k = e[g]; + if (-1 === k) { + if (0 === (h & c) || 0 !== (h & d)) e[g] = vc(h, b); + } else k <= b && (a.expiredLanes |= h); + f &= ~h; + } + } + function xc(a) { + a = a.pendingLanes & -1073741825; + return 0 !== a ? a : a & 1073741824 ? 1073741824 : 0; + } + function yc() { + var a = rc; + rc <<= 1; + 0 === (rc & 4194240) && (rc = 64); + return a; + } + function zc(a) { + for (var b = [], c = 0; 31 > c; c++) b.push(a); + return b; + } + function Ac(a, b, c) { + a.pendingLanes |= b; + 536870912 !== b && (a.suspendedLanes = 0, a.pingedLanes = 0); + a = a.eventTimes; + b = 31 - oc(b); + a[b] = c; + } + function Bc(a, b) { + var c = a.pendingLanes & ~b; + a.pendingLanes = b; + a.suspendedLanes = 0; + a.pingedLanes = 0; + a.expiredLanes &= b; + a.mutableReadLanes &= b; + a.entangledLanes &= b; + b = a.entanglements; + var d = a.eventTimes; + for (a = a.expirationTimes; 0 < c; ) { + var e = 31 - oc(c), f = 1 << e; + b[e] = 0; + d[e] = -1; + a[e] = -1; + c &= ~f; + } + } + function Cc(a, b) { + var c = a.entangledLanes |= b; + for (a = a.entanglements; c; ) { + var d = 31 - oc(c), e = 1 << d; + e & b | a[d] & b && (a[d] |= b); + c &= ~e; + } + } + var C = 0; + function Dc(a) { + a &= -a; + return 1 < a ? 4 < a ? 0 !== (a & 268435455) ? 16 : 536870912 : 4 : 1; + } + var Ec, Fc, Gc, Hc, Ic, Jc = false, Kc = [], Lc = null, Mc = null, Nc = null, Oc = /* @__PURE__ */ new Map(), Pc = /* @__PURE__ */ new Map(), Qc = [], Rc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" "); + function Sc(a, b) { + switch (a) { + case "focusin": + case "focusout": + Lc = null; + break; + case "dragenter": + case "dragleave": + Mc = null; + break; + case "mouseover": + case "mouseout": + Nc = null; + break; + case "pointerover": + case "pointerout": + Oc.delete(b.pointerId); + break; + case "gotpointercapture": + case "lostpointercapture": + Pc.delete(b.pointerId); + } + } + function Tc(a, b, c, d, e, f) { + if (null === a || a.nativeEvent !== f) return a = { blockedOn: b, domEventName: c, eventSystemFlags: d, nativeEvent: f, targetContainers: [e] }, null !== b && (b = Cb(b), null !== b && Fc(b)), a; + a.eventSystemFlags |= d; + b = a.targetContainers; + null !== e && -1 === b.indexOf(e) && b.push(e); + return a; + } + function Uc(a, b, c, d, e) { + switch (b) { + case "focusin": + return Lc = Tc(Lc, a, b, c, d, e), true; + case "dragenter": + return Mc = Tc(Mc, a, b, c, d, e), true; + case "mouseover": + return Nc = Tc(Nc, a, b, c, d, e), true; + case "pointerover": + var f = e.pointerId; + Oc.set(f, Tc(Oc.get(f) || null, a, b, c, d, e)); + return true; + case "gotpointercapture": + return f = e.pointerId, Pc.set(f, Tc(Pc.get(f) || null, a, b, c, d, e)), true; + } + return false; + } + function Vc(a) { + var b = Wc(a.target); + if (null !== b) { + var c = Vb(b); + if (null !== c) { + if (b = c.tag, 13 === b) { + if (b = Wb(c), null !== b) { + a.blockedOn = b; + Ic(a.priority, function() { + Gc(c); + }); + return; + } + } else if (3 === b && c.stateNode.current.memoizedState.isDehydrated) { + a.blockedOn = 3 === c.tag ? c.stateNode.containerInfo : null; + return; + } + } + } + a.blockedOn = null; + } + function Xc(a) { + if (null !== a.blockedOn) return false; + for (var b = a.targetContainers; 0 < b.length; ) { + var c = Yc(a.domEventName, a.eventSystemFlags, b[0], a.nativeEvent); + if (null === c) { + c = a.nativeEvent; + var d = new c.constructor(c.type, c); + wb = d; + c.target.dispatchEvent(d); + wb = null; + } else return b = Cb(c), null !== b && Fc(b), a.blockedOn = c, false; + b.shift(); + } + return true; + } + function Zc(a, b, c) { + Xc(a) && c.delete(b); + } + function $c() { + Jc = false; + null !== Lc && Xc(Lc) && (Lc = null); + null !== Mc && Xc(Mc) && (Mc = null); + null !== Nc && Xc(Nc) && (Nc = null); + Oc.forEach(Zc); + Pc.forEach(Zc); + } + function ad(a, b) { + a.blockedOn === b && (a.blockedOn = null, Jc || (Jc = true, ca.unstable_scheduleCallback(ca.unstable_NormalPriority, $c))); + } + function bd(a) { + function b(b2) { + return ad(b2, a); + } + if (0 < Kc.length) { + ad(Kc[0], a); + for (var c = 1; c < Kc.length; c++) { + var d = Kc[c]; + d.blockedOn === a && (d.blockedOn = null); + } + } + null !== Lc && ad(Lc, a); + null !== Mc && ad(Mc, a); + null !== Nc && ad(Nc, a); + Oc.forEach(b); + Pc.forEach(b); + for (c = 0; c < Qc.length; c++) d = Qc[c], d.blockedOn === a && (d.blockedOn = null); + for (; 0 < Qc.length && (c = Qc[0], null === c.blockedOn); ) Vc(c), null === c.blockedOn && Qc.shift(); + } + var cd = ua.ReactCurrentBatchConfig, dd = true; + function ed(a, b, c, d) { + var e = C, f = cd.transition; + cd.transition = null; + try { + C = 1, fd(a, b, c, d); + } finally { + C = e, cd.transition = f; + } + } + function gd(a, b, c, d) { + var e = C, f = cd.transition; + cd.transition = null; + try { + C = 4, fd(a, b, c, d); + } finally { + C = e, cd.transition = f; + } + } + function fd(a, b, c, d) { + if (dd) { + var e = Yc(a, b, c, d); + if (null === e) hd(a, b, d, id, c), Sc(a, d); + else if (Uc(e, a, b, c, d)) d.stopPropagation(); + else if (Sc(a, d), b & 4 && -1 < Rc.indexOf(a)) { + for (; null !== e; ) { + var f = Cb(e); + null !== f && Ec(f); + f = Yc(a, b, c, d); + null === f && hd(a, b, d, id, c); + if (f === e) break; + e = f; + } + null !== e && d.stopPropagation(); + } else hd(a, b, d, null, c); + } + } + var id = null; + function Yc(a, b, c, d) { + id = null; + a = xb(d); + a = Wc(a); + if (null !== a) if (b = Vb(a), null === b) a = null; + else if (c = b.tag, 13 === c) { + a = Wb(b); + if (null !== a) return a; + a = null; + } else if (3 === c) { + if (b.stateNode.current.memoizedState.isDehydrated) return 3 === b.tag ? b.stateNode.containerInfo : null; + a = null; + } else b !== a && (a = null); + id = a; + return null; + } + function jd(a) { + switch (a) { + case "cancel": + case "click": + case "close": + case "contextmenu": + case "copy": + case "cut": + case "auxclick": + case "dblclick": + case "dragend": + case "dragstart": + case "drop": + case "focusin": + case "focusout": + case "input": + case "invalid": + case "keydown": + case "keypress": + case "keyup": + case "mousedown": + case "mouseup": + case "paste": + case "pause": + case "play": + case "pointercancel": + case "pointerdown": + case "pointerup": + case "ratechange": + case "reset": + case "resize": + case "seeked": + case "submit": + case "touchcancel": + case "touchend": + case "touchstart": + case "volumechange": + case "change": + case "selectionchange": + case "textInput": + case "compositionstart": + case "compositionend": + case "compositionupdate": + case "beforeblur": + case "afterblur": + case "beforeinput": + case "blur": + case "fullscreenchange": + case "focus": + case "hashchange": + case "popstate": + case "select": + case "selectstart": + return 1; + case "drag": + case "dragenter": + case "dragexit": + case "dragleave": + case "dragover": + case "mousemove": + case "mouseout": + case "mouseover": + case "pointermove": + case "pointerout": + case "pointerover": + case "scroll": + case "toggle": + case "touchmove": + case "wheel": + case "mouseenter": + case "mouseleave": + case "pointerenter": + case "pointerleave": + return 4; + case "message": + switch (ec()) { + case fc: + return 1; + case gc: + return 4; + case hc: + case ic: + return 16; + case jc: + return 536870912; + default: + return 16; + } + default: + return 16; + } + } + var kd = null, ld = null, md = null; + function nd() { + if (md) return md; + var a, b = ld, c = b.length, d, e = "value" in kd ? kd.value : kd.textContent, f = e.length; + for (a = 0; a < c && b[a] === e[a]; a++) ; + var g = c - a; + for (d = 1; d <= g && b[c - d] === e[f - d]; d++) ; + return md = e.slice(a, 1 < d ? 1 - d : void 0); + } + function od(a) { + var b = a.keyCode; + "charCode" in a ? (a = a.charCode, 0 === a && 13 === b && (a = 13)) : a = b; + 10 === a && (a = 13); + return 32 <= a || 13 === a ? a : 0; + } + function pd() { + return true; + } + function qd() { + return false; + } + function rd(a) { + function b(b2, d, e, f, g) { + this._reactName = b2; + this._targetInst = e; + this.type = d; + this.nativeEvent = f; + this.target = g; + this.currentTarget = null; + for (var c in a) a.hasOwnProperty(c) && (b2 = a[c], this[c] = b2 ? b2(f) : f[c]); + this.isDefaultPrevented = (null != f.defaultPrevented ? f.defaultPrevented : false === f.returnValue) ? pd : qd; + this.isPropagationStopped = qd; + return this; + } + A(b.prototype, { preventDefault: function() { + this.defaultPrevented = true; + var a2 = this.nativeEvent; + a2 && (a2.preventDefault ? a2.preventDefault() : "unknown" !== typeof a2.returnValue && (a2.returnValue = false), this.isDefaultPrevented = pd); + }, stopPropagation: function() { + var a2 = this.nativeEvent; + a2 && (a2.stopPropagation ? a2.stopPropagation() : "unknown" !== typeof a2.cancelBubble && (a2.cancelBubble = true), this.isPropagationStopped = pd); + }, persist: function() { + }, isPersistent: pd }); + return b; + } + var sd = { eventPhase: 0, bubbles: 0, cancelable: 0, timeStamp: function(a) { + return a.timeStamp || Date.now(); + }, defaultPrevented: 0, isTrusted: 0 }, td = rd(sd), ud = A({}, sd, { view: 0, detail: 0 }), vd = rd(ud), wd, xd, yd, Ad = A({}, ud, { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, getModifierState: zd, button: 0, buttons: 0, relatedTarget: function(a) { + return void 0 === a.relatedTarget ? a.fromElement === a.srcElement ? a.toElement : a.fromElement : a.relatedTarget; + }, movementX: function(a) { + if ("movementX" in a) return a.movementX; + a !== yd && (yd && "mousemove" === a.type ? (wd = a.screenX - yd.screenX, xd = a.screenY - yd.screenY) : xd = wd = 0, yd = a); + return wd; + }, movementY: function(a) { + return "movementY" in a ? a.movementY : xd; + } }), Bd = rd(Ad), Cd = A({}, Ad, { dataTransfer: 0 }), Dd = rd(Cd), Ed = A({}, ud, { relatedTarget: 0 }), Fd = rd(Ed), Gd = A({}, sd, { animationName: 0, elapsedTime: 0, pseudoElement: 0 }), Hd = rd(Gd), Id = A({}, sd, { clipboardData: function(a) { + return "clipboardData" in a ? a.clipboardData : window.clipboardData; + } }), Jd = rd(Id), Kd = A({}, sd, { data: 0 }), Ld = rd(Kd), Md = { + Esc: "Escape", + Spacebar: " ", + Left: "ArrowLeft", + Up: "ArrowUp", + Right: "ArrowRight", + Down: "ArrowDown", + Del: "Delete", + Win: "OS", + Menu: "ContextMenu", + Apps: "ContextMenu", + Scroll: "ScrollLock", + MozPrintableKey: "Unidentified" + }, Nd = { + 8: "Backspace", + 9: "Tab", + 12: "Clear", + 13: "Enter", + 16: "Shift", + 17: "Control", + 18: "Alt", + 19: "Pause", + 20: "CapsLock", + 27: "Escape", + 32: " ", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "ArrowLeft", + 38: "ArrowUp", + 39: "ArrowRight", + 40: "ArrowDown", + 45: "Insert", + 46: "Delete", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12", + 144: "NumLock", + 145: "ScrollLock", + 224: "Meta" + }, Od = { Alt: "altKey", Control: "ctrlKey", Meta: "metaKey", Shift: "shiftKey" }; + function Pd(a) { + var b = this.nativeEvent; + return b.getModifierState ? b.getModifierState(a) : (a = Od[a]) ? !!b[a] : false; + } + function zd() { + return Pd; + } + var Qd = A({}, ud, { key: function(a) { + if (a.key) { + var b = Md[a.key] || a.key; + if ("Unidentified" !== b) return b; + } + return "keypress" === a.type ? (a = od(a), 13 === a ? "Enter" : String.fromCharCode(a)) : "keydown" === a.type || "keyup" === a.type ? Nd[a.keyCode] || "Unidentified" : ""; + }, code: 0, location: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, repeat: 0, locale: 0, getModifierState: zd, charCode: function(a) { + return "keypress" === a.type ? od(a) : 0; + }, keyCode: function(a) { + return "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0; + }, which: function(a) { + return "keypress" === a.type ? od(a) : "keydown" === a.type || "keyup" === a.type ? a.keyCode : 0; + } }), Rd = rd(Qd), Sd = A({}, Ad, { pointerId: 0, width: 0, height: 0, pressure: 0, tangentialPressure: 0, tiltX: 0, tiltY: 0, twist: 0, pointerType: 0, isPrimary: 0 }), Td = rd(Sd), Ud = A({}, ud, { touches: 0, targetTouches: 0, changedTouches: 0, altKey: 0, metaKey: 0, ctrlKey: 0, shiftKey: 0, getModifierState: zd }), Vd = rd(Ud), Wd = A({}, sd, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 }), Xd = rd(Wd), Yd = A({}, Ad, { + deltaX: function(a) { + return "deltaX" in a ? a.deltaX : "wheelDeltaX" in a ? -a.wheelDeltaX : 0; + }, + deltaY: function(a) { + return "deltaY" in a ? a.deltaY : "wheelDeltaY" in a ? -a.wheelDeltaY : "wheelDelta" in a ? -a.wheelDelta : 0; + }, + deltaZ: 0, + deltaMode: 0 + }), Zd = rd(Yd), $d = [9, 13, 27, 32], ae = ia && "CompositionEvent" in window, be = null; + ia && "documentMode" in document && (be = document.documentMode); + var ce = ia && "TextEvent" in window && !be, de = ia && (!ae || be && 8 < be && 11 >= be), ee = String.fromCharCode(32), fe = false; + function ge(a, b) { + switch (a) { + case "keyup": + return -1 !== $d.indexOf(b.keyCode); + case "keydown": + return 229 !== b.keyCode; + case "keypress": + case "mousedown": + case "focusout": + return true; + default: + return false; + } + } + function he(a) { + a = a.detail; + return "object" === typeof a && "data" in a ? a.data : null; + } + var ie = false; + function je(a, b) { + switch (a) { + case "compositionend": + return he(b); + case "keypress": + if (32 !== b.which) return null; + fe = true; + return ee; + case "textInput": + return a = b.data, a === ee && fe ? null : a; + default: + return null; + } + } + function ke(a, b) { + if (ie) return "compositionend" === a || !ae && ge(a, b) ? (a = nd(), md = ld = kd = null, ie = false, a) : null; + switch (a) { + case "paste": + return null; + case "keypress": + if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) { + if (b.char && 1 < b.char.length) return b.char; + if (b.which) return String.fromCharCode(b.which); + } + return null; + case "compositionend": + return de && "ko" !== b.locale ? null : b.data; + default: + return null; + } + } + var le = { color: true, date: true, datetime: true, "datetime-local": true, email: true, month: true, number: true, password: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true }; + function me(a) { + var b = a && a.nodeName && a.nodeName.toLowerCase(); + return "input" === b ? !!le[a.type] : "textarea" === b ? true : false; + } + function ne(a, b, c, d) { + Eb(d); + b = oe(b, "onChange"); + 0 < b.length && (c = new td("onChange", "change", null, c, d), a.push({ event: c, listeners: b })); + } + var pe = null, qe = null; + function re(a) { + se(a, 0); + } + function te(a) { + var b = ue(a); + if (Wa(b)) return a; + } + function ve(a, b) { + if ("change" === a) return b; + } + var we = false; + if (ia) { + var xe; + if (ia) { + var ye = "oninput" in document; + if (!ye) { + var ze = document.createElement("div"); + ze.setAttribute("oninput", "return;"); + ye = "function" === typeof ze.oninput; + } + xe = ye; + } else xe = false; + we = xe && (!document.documentMode || 9 < document.documentMode); + } + function Ae() { + pe && (pe.detachEvent("onpropertychange", Be), qe = pe = null); + } + function Be(a) { + if ("value" === a.propertyName && te(qe)) { + var b = []; + ne(b, qe, a, xb(a)); + Jb(re, b); + } + } + function Ce(a, b, c) { + "focusin" === a ? (Ae(), pe = b, qe = c, pe.attachEvent("onpropertychange", Be)) : "focusout" === a && Ae(); + } + function De(a) { + if ("selectionchange" === a || "keyup" === a || "keydown" === a) return te(qe); + } + function Ee(a, b) { + if ("click" === a) return te(b); + } + function Fe(a, b) { + if ("input" === a || "change" === a) return te(b); + } + function Ge(a, b) { + return a === b && (0 !== a || 1 / a === 1 / b) || a !== a && b !== b; + } + var He = "function" === typeof Object.is ? Object.is : Ge; + function Ie(a, b) { + if (He(a, b)) return true; + if ("object" !== typeof a || null === a || "object" !== typeof b || null === b) return false; + var c = Object.keys(a), d = Object.keys(b); + if (c.length !== d.length) return false; + for (d = 0; d < c.length; d++) { + var e = c[d]; + if (!ja.call(b, e) || !He(a[e], b[e])) return false; + } + return true; + } + function Je(a) { + for (; a && a.firstChild; ) a = a.firstChild; + return a; + } + function Ke(a, b) { + var c = Je(a); + a = 0; + for (var d; c; ) { + if (3 === c.nodeType) { + d = a + c.textContent.length; + if (a <= b && d >= b) return { node: c, offset: b - a }; + a = d; + } + a: { + for (; c; ) { + if (c.nextSibling) { + c = c.nextSibling; + break a; + } + c = c.parentNode; + } + c = void 0; + } + c = Je(c); + } + } + function Le(a, b) { + return a && b ? a === b ? true : a && 3 === a.nodeType ? false : b && 3 === b.nodeType ? Le(a, b.parentNode) : "contains" in a ? a.contains(b) : a.compareDocumentPosition ? !!(a.compareDocumentPosition(b) & 16) : false : false; + } + function Me() { + for (var a = window, b = Xa(); b instanceof a.HTMLIFrameElement; ) { + try { + var c = "string" === typeof b.contentWindow.location.href; + } catch (d) { + c = false; + } + if (c) a = b.contentWindow; + else break; + b = Xa(a.document); + } + return b; + } + function Ne(a) { + var b = a && a.nodeName && a.nodeName.toLowerCase(); + return b && ("input" === b && ("text" === a.type || "search" === a.type || "tel" === a.type || "url" === a.type || "password" === a.type) || "textarea" === b || "true" === a.contentEditable); + } + function Oe(a) { + var b = Me(), c = a.focusedElem, d = a.selectionRange; + if (b !== c && c && c.ownerDocument && Le(c.ownerDocument.documentElement, c)) { + if (null !== d && Ne(c)) { + if (b = d.start, a = d.end, void 0 === a && (a = b), "selectionStart" in c) c.selectionStart = b, c.selectionEnd = Math.min(a, c.value.length); + else if (a = (b = c.ownerDocument || document) && b.defaultView || window, a.getSelection) { + a = a.getSelection(); + var e = c.textContent.length, f = Math.min(d.start, e); + d = void 0 === d.end ? f : Math.min(d.end, e); + !a.extend && f > d && (e = d, d = f, f = e); + e = Ke(c, f); + var g = Ke( + c, + d + ); + e && g && (1 !== a.rangeCount || a.anchorNode !== e.node || a.anchorOffset !== e.offset || a.focusNode !== g.node || a.focusOffset !== g.offset) && (b = b.createRange(), b.setStart(e.node, e.offset), a.removeAllRanges(), f > d ? (a.addRange(b), a.extend(g.node, g.offset)) : (b.setEnd(g.node, g.offset), a.addRange(b))); + } + } + b = []; + for (a = c; a = a.parentNode; ) 1 === a.nodeType && b.push({ element: a, left: a.scrollLeft, top: a.scrollTop }); + "function" === typeof c.focus && c.focus(); + for (c = 0; c < b.length; c++) a = b[c], a.element.scrollLeft = a.left, a.element.scrollTop = a.top; + } + } + var Pe = ia && "documentMode" in document && 11 >= document.documentMode, Qe = null, Re = null, Se = null, Te = false; + function Ue(a, b, c) { + var d = c.window === c ? c.document : 9 === c.nodeType ? c : c.ownerDocument; + Te || null == Qe || Qe !== Xa(d) || (d = Qe, "selectionStart" in d && Ne(d) ? d = { start: d.selectionStart, end: d.selectionEnd } : (d = (d.ownerDocument && d.ownerDocument.defaultView || window).getSelection(), d = { anchorNode: d.anchorNode, anchorOffset: d.anchorOffset, focusNode: d.focusNode, focusOffset: d.focusOffset }), Se && Ie(Se, d) || (Se = d, d = oe(Re, "onSelect"), 0 < d.length && (b = new td("onSelect", "select", null, b, c), a.push({ event: b, listeners: d }), b.target = Qe))); + } + function Ve(a, b) { + var c = {}; + c[a.toLowerCase()] = b.toLowerCase(); + c["Webkit" + a] = "webkit" + b; + c["Moz" + a] = "moz" + b; + return c; + } + var We = { animationend: Ve("Animation", "AnimationEnd"), animationiteration: Ve("Animation", "AnimationIteration"), animationstart: Ve("Animation", "AnimationStart"), transitionend: Ve("Transition", "TransitionEnd") }, Xe = {}, Ye = {}; + ia && (Ye = document.createElement("div").style, "AnimationEvent" in window || (delete We.animationend.animation, delete We.animationiteration.animation, delete We.animationstart.animation), "TransitionEvent" in window || delete We.transitionend.transition); + function Ze(a) { + if (Xe[a]) return Xe[a]; + if (!We[a]) return a; + var b = We[a], c; + for (c in b) if (b.hasOwnProperty(c) && c in Ye) return Xe[a] = b[c]; + return a; + } + var $e = Ze("animationend"), af = Ze("animationiteration"), bf = Ze("animationstart"), cf = Ze("transitionend"), df = /* @__PURE__ */ new Map(), ef = "abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" "); + function ff(a, b) { + df.set(a, b); + fa(b, [a]); + } + for (var gf = 0; gf < ef.length; gf++) { + var hf = ef[gf], jf = hf.toLowerCase(), kf = hf[0].toUpperCase() + hf.slice(1); + ff(jf, "on" + kf); + } + ff($e, "onAnimationEnd"); + ff(af, "onAnimationIteration"); + ff(bf, "onAnimationStart"); + ff("dblclick", "onDoubleClick"); + ff("focusin", "onFocus"); + ff("focusout", "onBlur"); + ff(cf, "onTransitionEnd"); + ha("onMouseEnter", ["mouseout", "mouseover"]); + ha("onMouseLeave", ["mouseout", "mouseover"]); + ha("onPointerEnter", ["pointerout", "pointerover"]); + ha("onPointerLeave", ["pointerout", "pointerover"]); + fa("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" ")); + fa("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")); + fa("onBeforeInput", ["compositionend", "keypress", "textInput", "paste"]); + fa("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" ")); + fa("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" ")); + fa("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" ")); + var lf = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), mf = new Set("cancel close invalid load scroll toggle".split(" ").concat(lf)); + function nf(a, b, c) { + var d = a.type || "unknown-event"; + a.currentTarget = c; + Ub(d, b, void 0, a); + a.currentTarget = null; + } + function se(a, b) { + b = 0 !== (b & 4); + for (var c = 0; c < a.length; c++) { + var d = a[c], e = d.event; + d = d.listeners; + a: { + var f = void 0; + if (b) for (var g = d.length - 1; 0 <= g; g--) { + var h = d[g], k = h.instance, l = h.currentTarget; + h = h.listener; + if (k !== f && e.isPropagationStopped()) break a; + nf(e, h, l); + f = k; + } + else for (g = 0; g < d.length; g++) { + h = d[g]; + k = h.instance; + l = h.currentTarget; + h = h.listener; + if (k !== f && e.isPropagationStopped()) break a; + nf(e, h, l); + f = k; + } + } + } + if (Qb) throw a = Rb, Qb = false, Rb = null, a; + } + function D(a, b) { + var c = b[of]; + void 0 === c && (c = b[of] = /* @__PURE__ */ new Set()); + var d = a + "__bubble"; + c.has(d) || (pf(b, a, 2, false), c.add(d)); + } + function qf(a, b, c) { + var d = 0; + b && (d |= 4); + pf(c, a, d, b); + } + var rf = "_reactListening" + Math.random().toString(36).slice(2); + function sf(a) { + if (!a[rf]) { + a[rf] = true; + da.forEach(function(b2) { + "selectionchange" !== b2 && (mf.has(b2) || qf(b2, false, a), qf(b2, true, a)); + }); + var b = 9 === a.nodeType ? a : a.ownerDocument; + null === b || b[rf] || (b[rf] = true, qf("selectionchange", false, b)); + } + } + function pf(a, b, c, d) { + switch (jd(b)) { + case 1: + var e = ed; + break; + case 4: + e = gd; + break; + default: + e = fd; + } + c = e.bind(null, b, c, a); + e = void 0; + !Lb || "touchstart" !== b && "touchmove" !== b && "wheel" !== b || (e = true); + d ? void 0 !== e ? a.addEventListener(b, c, { capture: true, passive: e }) : a.addEventListener(b, c, true) : void 0 !== e ? a.addEventListener(b, c, { passive: e }) : a.addEventListener(b, c, false); + } + function hd(a, b, c, d, e) { + var f = d; + if (0 === (b & 1) && 0 === (b & 2) && null !== d) a: for (; ; ) { + if (null === d) return; + var g = d.tag; + if (3 === g || 4 === g) { + var h = d.stateNode.containerInfo; + if (h === e || 8 === h.nodeType && h.parentNode === e) break; + if (4 === g) for (g = d.return; null !== g; ) { + var k = g.tag; + if (3 === k || 4 === k) { + if (k = g.stateNode.containerInfo, k === e || 8 === k.nodeType && k.parentNode === e) return; + } + g = g.return; + } + for (; null !== h; ) { + g = Wc(h); + if (null === g) return; + k = g.tag; + if (5 === k || 6 === k) { + d = f = g; + continue a; + } + h = h.parentNode; + } + } + d = d.return; + } + Jb(function() { + var d2 = f, e2 = xb(c), g2 = []; + a: { + var h2 = df.get(a); + if (void 0 !== h2) { + var k2 = td, n = a; + switch (a) { + case "keypress": + if (0 === od(c)) break a; + case "keydown": + case "keyup": + k2 = Rd; + break; + case "focusin": + n = "focus"; + k2 = Fd; + break; + case "focusout": + n = "blur"; + k2 = Fd; + break; + case "beforeblur": + case "afterblur": + k2 = Fd; + break; + case "click": + if (2 === c.button) break a; + case "auxclick": + case "dblclick": + case "mousedown": + case "mousemove": + case "mouseup": + case "mouseout": + case "mouseover": + case "contextmenu": + k2 = Bd; + break; + case "drag": + case "dragend": + case "dragenter": + case "dragexit": + case "dragleave": + case "dragover": + case "dragstart": + case "drop": + k2 = Dd; + break; + case "touchcancel": + case "touchend": + case "touchmove": + case "touchstart": + k2 = Vd; + break; + case $e: + case af: + case bf: + k2 = Hd; + break; + case cf: + k2 = Xd; + break; + case "scroll": + k2 = vd; + break; + case "wheel": + k2 = Zd; + break; + case "copy": + case "cut": + case "paste": + k2 = Jd; + break; + case "gotpointercapture": + case "lostpointercapture": + case "pointercancel": + case "pointerdown": + case "pointermove": + case "pointerout": + case "pointerover": + case "pointerup": + k2 = Td; + } + var t = 0 !== (b & 4), J = !t && "scroll" === a, x = t ? null !== h2 ? h2 + "Capture" : null : h2; + t = []; + for (var w = d2, u; null !== w; ) { + u = w; + var F = u.stateNode; + 5 === u.tag && null !== F && (u = F, null !== x && (F = Kb(w, x), null != F && t.push(tf(w, F, u)))); + if (J) break; + w = w.return; + } + 0 < t.length && (h2 = new k2(h2, n, null, c, e2), g2.push({ event: h2, listeners: t })); + } + } + if (0 === (b & 7)) { + a: { + h2 = "mouseover" === a || "pointerover" === a; + k2 = "mouseout" === a || "pointerout" === a; + if (h2 && c !== wb && (n = c.relatedTarget || c.fromElement) && (Wc(n) || n[uf])) break a; + if (k2 || h2) { + h2 = e2.window === e2 ? e2 : (h2 = e2.ownerDocument) ? h2.defaultView || h2.parentWindow : window; + if (k2) { + if (n = c.relatedTarget || c.toElement, k2 = d2, n = n ? Wc(n) : null, null !== n && (J = Vb(n), n !== J || 5 !== n.tag && 6 !== n.tag)) n = null; + } else k2 = null, n = d2; + if (k2 !== n) { + t = Bd; + F = "onMouseLeave"; + x = "onMouseEnter"; + w = "mouse"; + if ("pointerout" === a || "pointerover" === a) t = Td, F = "onPointerLeave", x = "onPointerEnter", w = "pointer"; + J = null == k2 ? h2 : ue(k2); + u = null == n ? h2 : ue(n); + h2 = new t(F, w + "leave", k2, c, e2); + h2.target = J; + h2.relatedTarget = u; + F = null; + Wc(e2) === d2 && (t = new t(x, w + "enter", n, c, e2), t.target = u, t.relatedTarget = J, F = t); + J = F; + if (k2 && n) b: { + t = k2; + x = n; + w = 0; + for (u = t; u; u = vf(u)) w++; + u = 0; + for (F = x; F; F = vf(F)) u++; + for (; 0 < w - u; ) t = vf(t), w--; + for (; 0 < u - w; ) x = vf(x), u--; + for (; w--; ) { + if (t === x || null !== x && t === x.alternate) break b; + t = vf(t); + x = vf(x); + } + t = null; + } + else t = null; + null !== k2 && wf(g2, h2, k2, t, false); + null !== n && null !== J && wf(g2, J, n, t, true); + } + } + } + a: { + h2 = d2 ? ue(d2) : window; + k2 = h2.nodeName && h2.nodeName.toLowerCase(); + if ("select" === k2 || "input" === k2 && "file" === h2.type) var na = ve; + else if (me(h2)) if (we) na = Fe; + else { + na = De; + var xa = Ce; + } + else (k2 = h2.nodeName) && "input" === k2.toLowerCase() && ("checkbox" === h2.type || "radio" === h2.type) && (na = Ee); + if (na && (na = na(a, d2))) { + ne(g2, na, c, e2); + break a; + } + xa && xa(a, h2, d2); + "focusout" === a && (xa = h2._wrapperState) && xa.controlled && "number" === h2.type && cb(h2, "number", h2.value); + } + xa = d2 ? ue(d2) : window; + switch (a) { + case "focusin": + if (me(xa) || "true" === xa.contentEditable) Qe = xa, Re = d2, Se = null; + break; + case "focusout": + Se = Re = Qe = null; + break; + case "mousedown": + Te = true; + break; + case "contextmenu": + case "mouseup": + case "dragend": + Te = false; + Ue(g2, c, e2); + break; + case "selectionchange": + if (Pe) break; + case "keydown": + case "keyup": + Ue(g2, c, e2); + } + var $a; + if (ae) b: { + switch (a) { + case "compositionstart": + var ba = "onCompositionStart"; + break b; + case "compositionend": + ba = "onCompositionEnd"; + break b; + case "compositionupdate": + ba = "onCompositionUpdate"; + break b; + } + ba = void 0; + } + else ie ? ge(a, c) && (ba = "onCompositionEnd") : "keydown" === a && 229 === c.keyCode && (ba = "onCompositionStart"); + ba && (de && "ko" !== c.locale && (ie || "onCompositionStart" !== ba ? "onCompositionEnd" === ba && ie && ($a = nd()) : (kd = e2, ld = "value" in kd ? kd.value : kd.textContent, ie = true)), xa = oe(d2, ba), 0 < xa.length && (ba = new Ld(ba, a, null, c, e2), g2.push({ event: ba, listeners: xa }), $a ? ba.data = $a : ($a = he(c), null !== $a && (ba.data = $a)))); + if ($a = ce ? je(a, c) : ke(a, c)) d2 = oe(d2, "onBeforeInput"), 0 < d2.length && (e2 = new Ld("onBeforeInput", "beforeinput", null, c, e2), g2.push({ event: e2, listeners: d2 }), e2.data = $a); + } + se(g2, b); + }); + } + function tf(a, b, c) { + return { instance: a, listener: b, currentTarget: c }; + } + function oe(a, b) { + for (var c = b + "Capture", d = []; null !== a; ) { + var e = a, f = e.stateNode; + 5 === e.tag && null !== f && (e = f, f = Kb(a, c), null != f && d.unshift(tf(a, f, e)), f = Kb(a, b), null != f && d.push(tf(a, f, e))); + a = a.return; + } + return d; + } + function vf(a) { + if (null === a) return null; + do + a = a.return; + while (a && 5 !== a.tag); + return a ? a : null; + } + function wf(a, b, c, d, e) { + for (var f = b._reactName, g = []; null !== c && c !== d; ) { + var h = c, k = h.alternate, l = h.stateNode; + if (null !== k && k === d) break; + 5 === h.tag && null !== l && (h = l, e ? (k = Kb(c, f), null != k && g.unshift(tf(c, k, h))) : e || (k = Kb(c, f), null != k && g.push(tf(c, k, h)))); + c = c.return; + } + 0 !== g.length && a.push({ event: b, listeners: g }); + } + var xf = /\r\n?/g, yf = /\u0000|\uFFFD/g; + function zf(a) { + return ("string" === typeof a ? a : "" + a).replace(xf, "\n").replace(yf, ""); + } + function Af(a, b, c) { + b = zf(b); + if (zf(a) !== b && c) throw Error(p(425)); + } + function Bf() { + } + var Cf = null, Df = null; + function Ef(a, b) { + return "textarea" === a || "noscript" === a || "string" === typeof b.children || "number" === typeof b.children || "object" === typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && null != b.dangerouslySetInnerHTML.__html; + } + var Ff = "function" === typeof setTimeout ? setTimeout : void 0, Gf = "function" === typeof clearTimeout ? clearTimeout : void 0, Hf = "function" === typeof Promise ? Promise : void 0, Jf = "function" === typeof queueMicrotask ? queueMicrotask : "undefined" !== typeof Hf ? function(a) { + return Hf.resolve(null).then(a).catch(If); + } : Ff; + function If(a) { + setTimeout(function() { + throw a; + }); + } + function Kf(a, b) { + var c = b, d = 0; + do { + var e = c.nextSibling; + a.removeChild(c); + if (e && 8 === e.nodeType) if (c = e.data, "/$" === c) { + if (0 === d) { + a.removeChild(e); + bd(b); + return; + } + d--; + } else "$" !== c && "$?" !== c && "$!" !== c || d++; + c = e; + } while (c); + bd(b); + } + function Lf(a) { + for (; null != a; a = a.nextSibling) { + var b = a.nodeType; + if (1 === b || 3 === b) break; + if (8 === b) { + b = a.data; + if ("$" === b || "$!" === b || "$?" === b) break; + if ("/$" === b) return null; + } + } + return a; + } + function Mf(a) { + a = a.previousSibling; + for (var b = 0; a; ) { + if (8 === a.nodeType) { + var c = a.data; + if ("$" === c || "$!" === c || "$?" === c) { + if (0 === b) return a; + b--; + } else "/$" === c && b++; + } + a = a.previousSibling; + } + return null; + } + var Nf = Math.random().toString(36).slice(2), Of = "__reactFiber$" + Nf, Pf = "__reactProps$" + Nf, uf = "__reactContainer$" + Nf, of = "__reactEvents$" + Nf, Qf = "__reactListeners$" + Nf, Rf = "__reactHandles$" + Nf; + function Wc(a) { + var b = a[Of]; + if (b) return b; + for (var c = a.parentNode; c; ) { + if (b = c[uf] || c[Of]) { + c = b.alternate; + if (null !== b.child || null !== c && null !== c.child) for (a = Mf(a); null !== a; ) { + if (c = a[Of]) return c; + a = Mf(a); + } + return b; + } + a = c; + c = a.parentNode; + } + return null; + } + function Cb(a) { + a = a[Of] || a[uf]; + return !a || 5 !== a.tag && 6 !== a.tag && 13 !== a.tag && 3 !== a.tag ? null : a; + } + function ue(a) { + if (5 === a.tag || 6 === a.tag) return a.stateNode; + throw Error(p(33)); + } + function Db(a) { + return a[Pf] || null; + } + var Sf = [], Tf = -1; + function Uf(a) { + return { current: a }; + } + function E(a) { + 0 > Tf || (a.current = Sf[Tf], Sf[Tf] = null, Tf--); + } + function G(a, b) { + Tf++; + Sf[Tf] = a.current; + a.current = b; + } + var Vf = {}, H = Uf(Vf), Wf = Uf(false), Xf = Vf; + function Yf(a, b) { + var c = a.type.contextTypes; + if (!c) return Vf; + var d = a.stateNode; + if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext; + var e = {}, f; + for (f in c) e[f] = b[f]; + d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, a.__reactInternalMemoizedMaskedChildContext = e); + return e; + } + function Zf(a) { + a = a.childContextTypes; + return null !== a && void 0 !== a; + } + function $f() { + E(Wf); + E(H); + } + function ag(a, b, c) { + if (H.current !== Vf) throw Error(p(168)); + G(H, b); + G(Wf, c); + } + function bg(a, b, c) { + var d = a.stateNode; + b = b.childContextTypes; + if ("function" !== typeof d.getChildContext) return c; + d = d.getChildContext(); + for (var e in d) if (!(e in b)) throw Error(p(108, Ra(a) || "Unknown", e)); + return A({}, c, d); + } + function cg(a) { + a = (a = a.stateNode) && a.__reactInternalMemoizedMergedChildContext || Vf; + Xf = H.current; + G(H, a); + G(Wf, Wf.current); + return true; + } + function dg(a, b, c) { + var d = a.stateNode; + if (!d) throw Error(p(169)); + c ? (a = bg(a, b, Xf), d.__reactInternalMemoizedMergedChildContext = a, E(Wf), E(H), G(H, a)) : E(Wf); + G(Wf, c); + } + var eg = null, fg = false, gg = false; + function hg(a) { + null === eg ? eg = [a] : eg.push(a); + } + function ig(a) { + fg = true; + hg(a); + } + function jg() { + if (!gg && null !== eg) { + gg = true; + var a = 0, b = C; + try { + var c = eg; + for (C = 1; a < c.length; a++) { + var d = c[a]; + do + d = d(true); + while (null !== d); + } + eg = null; + fg = false; + } catch (e) { + throw null !== eg && (eg = eg.slice(a + 1)), ac(fc, jg), e; + } finally { + C = b, gg = false; + } + } + return null; + } + var kg = [], lg = 0, mg = null, ng = 0, og = [], pg = 0, qg = null, rg = 1, sg = ""; + function tg(a, b) { + kg[lg++] = ng; + kg[lg++] = mg; + mg = a; + ng = b; + } + function ug(a, b, c) { + og[pg++] = rg; + og[pg++] = sg; + og[pg++] = qg; + qg = a; + var d = rg; + a = sg; + var e = 32 - oc(d) - 1; + d &= ~(1 << e); + c += 1; + var f = 32 - oc(b) + e; + if (30 < f) { + var g = e - e % 5; + f = (d & (1 << g) - 1).toString(32); + d >>= g; + e -= g; + rg = 1 << 32 - oc(b) + e | c << e | d; + sg = f + a; + } else rg = 1 << f | c << e | d, sg = a; + } + function vg(a) { + null !== a.return && (tg(a, 1), ug(a, 1, 0)); + } + function wg(a) { + for (; a === mg; ) mg = kg[--lg], kg[lg] = null, ng = kg[--lg], kg[lg] = null; + for (; a === qg; ) qg = og[--pg], og[pg] = null, sg = og[--pg], og[pg] = null, rg = og[--pg], og[pg] = null; + } + var xg = null, yg = null, I = false, zg = null; + function Ag(a, b) { + var c = Bg(5, null, null, 0); + c.elementType = "DELETED"; + c.stateNode = b; + c.return = a; + b = a.deletions; + null === b ? (a.deletions = [c], a.flags |= 16) : b.push(c); + } + function Cg(a, b) { + switch (a.tag) { + case 5: + var c = a.type; + b = 1 !== b.nodeType || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b; + return null !== b ? (a.stateNode = b, xg = a, yg = Lf(b.firstChild), true) : false; + case 6: + return b = "" === a.pendingProps || 3 !== b.nodeType ? null : b, null !== b ? (a.stateNode = b, xg = a, yg = null, true) : false; + case 13: + return b = 8 !== b.nodeType ? null : b, null !== b ? (c = null !== qg ? { id: rg, overflow: sg } : null, a.memoizedState = { dehydrated: b, treeContext: c, retryLane: 1073741824 }, c = Bg(18, null, null, 0), c.stateNode = b, c.return = a, a.child = c, xg = a, yg = null, true) : false; + default: + return false; + } + } + function Dg(a) { + return 0 !== (a.mode & 1) && 0 === (a.flags & 128); + } + function Eg(a) { + if (I) { + var b = yg; + if (b) { + var c = b; + if (!Cg(a, b)) { + if (Dg(a)) throw Error(p(418)); + b = Lf(c.nextSibling); + var d = xg; + b && Cg(a, b) ? Ag(d, c) : (a.flags = a.flags & -4097 | 2, I = false, xg = a); + } + } else { + if (Dg(a)) throw Error(p(418)); + a.flags = a.flags & -4097 | 2; + I = false; + xg = a; + } + } + } + function Fg(a) { + for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag && 13 !== a.tag; ) a = a.return; + xg = a; + } + function Gg(a) { + if (a !== xg) return false; + if (!I) return Fg(a), I = true, false; + var b; + (b = 3 !== a.tag) && !(b = 5 !== a.tag) && (b = a.type, b = "head" !== b && "body" !== b && !Ef(a.type, a.memoizedProps)); + if (b && (b = yg)) { + if (Dg(a)) throw Hg(), Error(p(418)); + for (; b; ) Ag(a, b), b = Lf(b.nextSibling); + } + Fg(a); + if (13 === a.tag) { + a = a.memoizedState; + a = null !== a ? a.dehydrated : null; + if (!a) throw Error(p(317)); + a: { + a = a.nextSibling; + for (b = 0; a; ) { + if (8 === a.nodeType) { + var c = a.data; + if ("/$" === c) { + if (0 === b) { + yg = Lf(a.nextSibling); + break a; + } + b--; + } else "$" !== c && "$!" !== c && "$?" !== c || b++; + } + a = a.nextSibling; + } + yg = null; + } + } else yg = xg ? Lf(a.stateNode.nextSibling) : null; + return true; + } + function Hg() { + for (var a = yg; a; ) a = Lf(a.nextSibling); + } + function Ig() { + yg = xg = null; + I = false; + } + function Jg(a) { + null === zg ? zg = [a] : zg.push(a); + } + var Kg = ua.ReactCurrentBatchConfig; + function Lg(a, b, c) { + a = c.ref; + if (null !== a && "function" !== typeof a && "object" !== typeof a) { + if (c._owner) { + c = c._owner; + if (c) { + if (1 !== c.tag) throw Error(p(309)); + var d = c.stateNode; + } + if (!d) throw Error(p(147, a)); + var e = d, f = "" + a; + if (null !== b && null !== b.ref && "function" === typeof b.ref && b.ref._stringRef === f) return b.ref; + b = function(a2) { + var b2 = e.refs; + null === a2 ? delete b2[f] : b2[f] = a2; + }; + b._stringRef = f; + return b; + } + if ("string" !== typeof a) throw Error(p(284)); + if (!c._owner) throw Error(p(290, a)); + } + return a; + } + function Mg(a, b) { + a = Object.prototype.toString.call(b); + throw Error(p(31, "[object Object]" === a ? "object with keys {" + Object.keys(b).join(", ") + "}" : a)); + } + function Ng(a) { + var b = a._init; + return b(a._payload); + } + function Og(a) { + function b(b2, c2) { + if (a) { + var d2 = b2.deletions; + null === d2 ? (b2.deletions = [c2], b2.flags |= 16) : d2.push(c2); + } + } + function c(c2, d2) { + if (!a) return null; + for (; null !== d2; ) b(c2, d2), d2 = d2.sibling; + return null; + } + function d(a2, b2) { + for (a2 = /* @__PURE__ */ new Map(); null !== b2; ) null !== b2.key ? a2.set(b2.key, b2) : a2.set(b2.index, b2), b2 = b2.sibling; + return a2; + } + function e(a2, b2) { + a2 = Pg(a2, b2); + a2.index = 0; + a2.sibling = null; + return a2; + } + function f(b2, c2, d2) { + b2.index = d2; + if (!a) return b2.flags |= 1048576, c2; + d2 = b2.alternate; + if (null !== d2) return d2 = d2.index, d2 < c2 ? (b2.flags |= 2, c2) : d2; + b2.flags |= 2; + return c2; + } + function g(b2) { + a && null === b2.alternate && (b2.flags |= 2); + return b2; + } + function h(a2, b2, c2, d2) { + if (null === b2 || 6 !== b2.tag) return b2 = Qg(c2, a2.mode, d2), b2.return = a2, b2; + b2 = e(b2, c2); + b2.return = a2; + return b2; + } + function k(a2, b2, c2, d2) { + var f2 = c2.type; + if (f2 === ya) return m(a2, b2, c2.props.children, d2, c2.key); + if (null !== b2 && (b2.elementType === f2 || "object" === typeof f2 && null !== f2 && f2.$$typeof === Ha && Ng(f2) === b2.type)) return d2 = e(b2, c2.props), d2.ref = Lg(a2, b2, c2), d2.return = a2, d2; + d2 = Rg(c2.type, c2.key, c2.props, null, a2.mode, d2); + d2.ref = Lg(a2, b2, c2); + d2.return = a2; + return d2; + } + function l(a2, b2, c2, d2) { + if (null === b2 || 4 !== b2.tag || b2.stateNode.containerInfo !== c2.containerInfo || b2.stateNode.implementation !== c2.implementation) return b2 = Sg(c2, a2.mode, d2), b2.return = a2, b2; + b2 = e(b2, c2.children || []); + b2.return = a2; + return b2; + } + function m(a2, b2, c2, d2, f2) { + if (null === b2 || 7 !== b2.tag) return b2 = Tg(c2, a2.mode, d2, f2), b2.return = a2, b2; + b2 = e(b2, c2); + b2.return = a2; + return b2; + } + function q(a2, b2, c2) { + if ("string" === typeof b2 && "" !== b2 || "number" === typeof b2) return b2 = Qg("" + b2, a2.mode, c2), b2.return = a2, b2; + if ("object" === typeof b2 && null !== b2) { + switch (b2.$$typeof) { + case va: + return c2 = Rg(b2.type, b2.key, b2.props, null, a2.mode, c2), c2.ref = Lg(a2, null, b2), c2.return = a2, c2; + case wa: + return b2 = Sg(b2, a2.mode, c2), b2.return = a2, b2; + case Ha: + var d2 = b2._init; + return q(a2, d2(b2._payload), c2); + } + if (eb(b2) || Ka(b2)) return b2 = Tg(b2, a2.mode, c2, null), b2.return = a2, b2; + Mg(a2, b2); + } + return null; + } + function r(a2, b2, c2, d2) { + var e2 = null !== b2 ? b2.key : null; + if ("string" === typeof c2 && "" !== c2 || "number" === typeof c2) return null !== e2 ? null : h(a2, b2, "" + c2, d2); + if ("object" === typeof c2 && null !== c2) { + switch (c2.$$typeof) { + case va: + return c2.key === e2 ? k(a2, b2, c2, d2) : null; + case wa: + return c2.key === e2 ? l(a2, b2, c2, d2) : null; + case Ha: + return e2 = c2._init, r( + a2, + b2, + e2(c2._payload), + d2 + ); + } + if (eb(c2) || Ka(c2)) return null !== e2 ? null : m(a2, b2, c2, d2, null); + Mg(a2, c2); + } + return null; + } + function y(a2, b2, c2, d2, e2) { + if ("string" === typeof d2 && "" !== d2 || "number" === typeof d2) return a2 = a2.get(c2) || null, h(b2, a2, "" + d2, e2); + if ("object" === typeof d2 && null !== d2) { + switch (d2.$$typeof) { + case va: + return a2 = a2.get(null === d2.key ? c2 : d2.key) || null, k(b2, a2, d2, e2); + case wa: + return a2 = a2.get(null === d2.key ? c2 : d2.key) || null, l(b2, a2, d2, e2); + case Ha: + var f2 = d2._init; + return y(a2, b2, c2, f2(d2._payload), e2); + } + if (eb(d2) || Ka(d2)) return a2 = a2.get(c2) || null, m(b2, a2, d2, e2, null); + Mg(b2, d2); + } + return null; + } + function n(e2, g2, h2, k2) { + for (var l2 = null, m2 = null, u = g2, w = g2 = 0, x = null; null !== u && w < h2.length; w++) { + u.index > w ? (x = u, u = null) : x = u.sibling; + var n2 = r(e2, u, h2[w], k2); + if (null === n2) { + null === u && (u = x); + break; + } + a && u && null === n2.alternate && b(e2, u); + g2 = f(n2, g2, w); + null === m2 ? l2 = n2 : m2.sibling = n2; + m2 = n2; + u = x; + } + if (w === h2.length) return c(e2, u), I && tg(e2, w), l2; + if (null === u) { + for (; w < h2.length; w++) u = q(e2, h2[w], k2), null !== u && (g2 = f(u, g2, w), null === m2 ? l2 = u : m2.sibling = u, m2 = u); + I && tg(e2, w); + return l2; + } + for (u = d(e2, u); w < h2.length; w++) x = y(u, e2, w, h2[w], k2), null !== x && (a && null !== x.alternate && u.delete(null === x.key ? w : x.key), g2 = f(x, g2, w), null === m2 ? l2 = x : m2.sibling = x, m2 = x); + a && u.forEach(function(a2) { + return b(e2, a2); + }); + I && tg(e2, w); + return l2; + } + function t(e2, g2, h2, k2) { + var l2 = Ka(h2); + if ("function" !== typeof l2) throw Error(p(150)); + h2 = l2.call(h2); + if (null == h2) throw Error(p(151)); + for (var u = l2 = null, m2 = g2, w = g2 = 0, x = null, n2 = h2.next(); null !== m2 && !n2.done; w++, n2 = h2.next()) { + m2.index > w ? (x = m2, m2 = null) : x = m2.sibling; + var t2 = r(e2, m2, n2.value, k2); + if (null === t2) { + null === m2 && (m2 = x); + break; + } + a && m2 && null === t2.alternate && b(e2, m2); + g2 = f(t2, g2, w); + null === u ? l2 = t2 : u.sibling = t2; + u = t2; + m2 = x; + } + if (n2.done) return c( + e2, + m2 + ), I && tg(e2, w), l2; + if (null === m2) { + for (; !n2.done; w++, n2 = h2.next()) n2 = q(e2, n2.value, k2), null !== n2 && (g2 = f(n2, g2, w), null === u ? l2 = n2 : u.sibling = n2, u = n2); + I && tg(e2, w); + return l2; + } + for (m2 = d(e2, m2); !n2.done; w++, n2 = h2.next()) n2 = y(m2, e2, w, n2.value, k2), null !== n2 && (a && null !== n2.alternate && m2.delete(null === n2.key ? w : n2.key), g2 = f(n2, g2, w), null === u ? l2 = n2 : u.sibling = n2, u = n2); + a && m2.forEach(function(a2) { + return b(e2, a2); + }); + I && tg(e2, w); + return l2; + } + function J(a2, d2, f2, h2) { + "object" === typeof f2 && null !== f2 && f2.type === ya && null === f2.key && (f2 = f2.props.children); + if ("object" === typeof f2 && null !== f2) { + switch (f2.$$typeof) { + case va: + a: { + for (var k2 = f2.key, l2 = d2; null !== l2; ) { + if (l2.key === k2) { + k2 = f2.type; + if (k2 === ya) { + if (7 === l2.tag) { + c(a2, l2.sibling); + d2 = e(l2, f2.props.children); + d2.return = a2; + a2 = d2; + break a; + } + } else if (l2.elementType === k2 || "object" === typeof k2 && null !== k2 && k2.$$typeof === Ha && Ng(k2) === l2.type) { + c(a2, l2.sibling); + d2 = e(l2, f2.props); + d2.ref = Lg(a2, l2, f2); + d2.return = a2; + a2 = d2; + break a; + } + c(a2, l2); + break; + } else b(a2, l2); + l2 = l2.sibling; + } + f2.type === ya ? (d2 = Tg(f2.props.children, a2.mode, h2, f2.key), d2.return = a2, a2 = d2) : (h2 = Rg(f2.type, f2.key, f2.props, null, a2.mode, h2), h2.ref = Lg(a2, d2, f2), h2.return = a2, a2 = h2); + } + return g(a2); + case wa: + a: { + for (l2 = f2.key; null !== d2; ) { + if (d2.key === l2) if (4 === d2.tag && d2.stateNode.containerInfo === f2.containerInfo && d2.stateNode.implementation === f2.implementation) { + c(a2, d2.sibling); + d2 = e(d2, f2.children || []); + d2.return = a2; + a2 = d2; + break a; + } else { + c(a2, d2); + break; + } + else b(a2, d2); + d2 = d2.sibling; + } + d2 = Sg(f2, a2.mode, h2); + d2.return = a2; + a2 = d2; + } + return g(a2); + case Ha: + return l2 = f2._init, J(a2, d2, l2(f2._payload), h2); + } + if (eb(f2)) return n(a2, d2, f2, h2); + if (Ka(f2)) return t(a2, d2, f2, h2); + Mg(a2, f2); + } + return "string" === typeof f2 && "" !== f2 || "number" === typeof f2 ? (f2 = "" + f2, null !== d2 && 6 === d2.tag ? (c(a2, d2.sibling), d2 = e(d2, f2), d2.return = a2, a2 = d2) : (c(a2, d2), d2 = Qg(f2, a2.mode, h2), d2.return = a2, a2 = d2), g(a2)) : c(a2, d2); + } + return J; + } + var Ug = Og(true), Vg = Og(false), Wg = Uf(null), Xg = null, Yg = null, Zg = null; + function $g() { + Zg = Yg = Xg = null; + } + function ah(a) { + var b = Wg.current; + E(Wg); + a._currentValue = b; + } + function bh(a, b, c) { + for (; null !== a; ) { + var d = a.alternate; + (a.childLanes & b) !== b ? (a.childLanes |= b, null !== d && (d.childLanes |= b)) : null !== d && (d.childLanes & b) !== b && (d.childLanes |= b); + if (a === c) break; + a = a.return; + } + } + function ch(a, b) { + Xg = a; + Zg = Yg = null; + a = a.dependencies; + null !== a && null !== a.firstContext && (0 !== (a.lanes & b) && (dh = true), a.firstContext = null); + } + function eh(a) { + var b = a._currentValue; + if (Zg !== a) if (a = { context: a, memoizedValue: b, next: null }, null === Yg) { + if (null === Xg) throw Error(p(308)); + Yg = a; + Xg.dependencies = { lanes: 0, firstContext: a }; + } else Yg = Yg.next = a; + return b; + } + var fh = null; + function gh(a) { + null === fh ? fh = [a] : fh.push(a); + } + function hh(a, b, c, d) { + var e = b.interleaved; + null === e ? (c.next = c, gh(b)) : (c.next = e.next, e.next = c); + b.interleaved = c; + return ih(a, d); + } + function ih(a, b) { + a.lanes |= b; + var c = a.alternate; + null !== c && (c.lanes |= b); + c = a; + for (a = a.return; null !== a; ) a.childLanes |= b, c = a.alternate, null !== c && (c.childLanes |= b), c = a, a = a.return; + return 3 === c.tag ? c.stateNode : null; + } + var jh = false; + function kh(a) { + a.updateQueue = { baseState: a.memoizedState, firstBaseUpdate: null, lastBaseUpdate: null, shared: { pending: null, interleaved: null, lanes: 0 }, effects: null }; + } + function lh(a, b) { + a = a.updateQueue; + b.updateQueue === a && (b.updateQueue = { baseState: a.baseState, firstBaseUpdate: a.firstBaseUpdate, lastBaseUpdate: a.lastBaseUpdate, shared: a.shared, effects: a.effects }); + } + function mh(a, b) { + return { eventTime: a, lane: b, tag: 0, payload: null, callback: null, next: null }; + } + function nh(a, b, c) { + var d = a.updateQueue; + if (null === d) return null; + d = d.shared; + if (0 !== (K & 2)) { + var e = d.pending; + null === e ? b.next = b : (b.next = e.next, e.next = b); + d.pending = b; + return ih(a, c); + } + e = d.interleaved; + null === e ? (b.next = b, gh(d)) : (b.next = e.next, e.next = b); + d.interleaved = b; + return ih(a, c); + } + function oh(a, b, c) { + b = b.updateQueue; + if (null !== b && (b = b.shared, 0 !== (c & 4194240))) { + var d = b.lanes; + d &= a.pendingLanes; + c |= d; + b.lanes = c; + Cc(a, c); + } + } + function ph(a, b) { + var c = a.updateQueue, d = a.alternate; + if (null !== d && (d = d.updateQueue, c === d)) { + var e = null, f = null; + c = c.firstBaseUpdate; + if (null !== c) { + do { + var g = { eventTime: c.eventTime, lane: c.lane, tag: c.tag, payload: c.payload, callback: c.callback, next: null }; + null === f ? e = f = g : f = f.next = g; + c = c.next; + } while (null !== c); + null === f ? e = f = b : f = f.next = b; + } else e = f = b; + c = { baseState: d.baseState, firstBaseUpdate: e, lastBaseUpdate: f, shared: d.shared, effects: d.effects }; + a.updateQueue = c; + return; + } + a = c.lastBaseUpdate; + null === a ? c.firstBaseUpdate = b : a.next = b; + c.lastBaseUpdate = b; + } + function qh(a, b, c, d) { + var e = a.updateQueue; + jh = false; + var f = e.firstBaseUpdate, g = e.lastBaseUpdate, h = e.shared.pending; + if (null !== h) { + e.shared.pending = null; + var k = h, l = k.next; + k.next = null; + null === g ? f = l : g.next = l; + g = k; + var m = a.alternate; + null !== m && (m = m.updateQueue, h = m.lastBaseUpdate, h !== g && (null === h ? m.firstBaseUpdate = l : h.next = l, m.lastBaseUpdate = k)); + } + if (null !== f) { + var q = e.baseState; + g = 0; + m = l = k = null; + h = f; + do { + var r = h.lane, y = h.eventTime; + if ((d & r) === r) { + null !== m && (m = m.next = { + eventTime: y, + lane: 0, + tag: h.tag, + payload: h.payload, + callback: h.callback, + next: null + }); + a: { + var n = a, t = h; + r = b; + y = c; + switch (t.tag) { + case 1: + n = t.payload; + if ("function" === typeof n) { + q = n.call(y, q, r); + break a; + } + q = n; + break a; + case 3: + n.flags = n.flags & -65537 | 128; + case 0: + n = t.payload; + r = "function" === typeof n ? n.call(y, q, r) : n; + if (null === r || void 0 === r) break a; + q = A({}, q, r); + break a; + case 2: + jh = true; + } + } + null !== h.callback && 0 !== h.lane && (a.flags |= 64, r = e.effects, null === r ? e.effects = [h] : r.push(h)); + } else y = { eventTime: y, lane: r, tag: h.tag, payload: h.payload, callback: h.callback, next: null }, null === m ? (l = m = y, k = q) : m = m.next = y, g |= r; + h = h.next; + if (null === h) if (h = e.shared.pending, null === h) break; + else r = h, h = r.next, r.next = null, e.lastBaseUpdate = r, e.shared.pending = null; + } while (1); + null === m && (k = q); + e.baseState = k; + e.firstBaseUpdate = l; + e.lastBaseUpdate = m; + b = e.shared.interleaved; + if (null !== b) { + e = b; + do + g |= e.lane, e = e.next; + while (e !== b); + } else null === f && (e.shared.lanes = 0); + rh |= g; + a.lanes = g; + a.memoizedState = q; + } + } + function sh(a, b, c) { + a = b.effects; + b.effects = null; + if (null !== a) for (b = 0; b < a.length; b++) { + var d = a[b], e = d.callback; + if (null !== e) { + d.callback = null; + d = c; + if ("function" !== typeof e) throw Error(p(191, e)); + e.call(d); + } + } + } + var th = {}, uh = Uf(th), vh = Uf(th), wh = Uf(th); + function xh(a) { + if (a === th) throw Error(p(174)); + return a; + } + function yh(a, b) { + G(wh, b); + G(vh, a); + G(uh, th); + a = b.nodeType; + switch (a) { + case 9: + case 11: + b = (b = b.documentElement) ? b.namespaceURI : lb(null, ""); + break; + default: + a = 8 === a ? b.parentNode : b, b = a.namespaceURI || null, a = a.tagName, b = lb(b, a); + } + E(uh); + G(uh, b); + } + function zh() { + E(uh); + E(vh); + E(wh); + } + function Ah(a) { + xh(wh.current); + var b = xh(uh.current); + var c = lb(b, a.type); + b !== c && (G(vh, a), G(uh, c)); + } + function Bh(a) { + vh.current === a && (E(uh), E(vh)); + } + var L = Uf(0); + function Ch(a) { + for (var b = a; null !== b; ) { + if (13 === b.tag) { + var c = b.memoizedState; + if (null !== c && (c = c.dehydrated, null === c || "$?" === c.data || "$!" === c.data)) return b; + } else if (19 === b.tag && void 0 !== b.memoizedProps.revealOrder) { + if (0 !== (b.flags & 128)) return b; + } else if (null !== b.child) { + b.child.return = b; + b = b.child; + continue; + } + if (b === a) break; + for (; null === b.sibling; ) { + if (null === b.return || b.return === a) return null; + b = b.return; + } + b.sibling.return = b.return; + b = b.sibling; + } + return null; + } + var Dh = []; + function Eh() { + for (var a = 0; a < Dh.length; a++) Dh[a]._workInProgressVersionPrimary = null; + Dh.length = 0; + } + var Fh = ua.ReactCurrentDispatcher, Gh = ua.ReactCurrentBatchConfig, Hh = 0, M = null, N = null, O = null, Ih = false, Jh = false, Kh = 0, Lh = 0; + function P() { + throw Error(p(321)); + } + function Mh(a, b) { + if (null === b) return false; + for (var c = 0; c < b.length && c < a.length; c++) if (!He(a[c], b[c])) return false; + return true; + } + function Nh(a, b, c, d, e, f) { + Hh = f; + M = b; + b.memoizedState = null; + b.updateQueue = null; + b.lanes = 0; + Fh.current = null === a || null === a.memoizedState ? Oh : Ph; + a = c(d, e); + if (Jh) { + f = 0; + do { + Jh = false; + Kh = 0; + if (25 <= f) throw Error(p(301)); + f += 1; + O = N = null; + b.updateQueue = null; + Fh.current = Qh; + a = c(d, e); + } while (Jh); + } + Fh.current = Rh; + b = null !== N && null !== N.next; + Hh = 0; + O = N = M = null; + Ih = false; + if (b) throw Error(p(300)); + return a; + } + function Sh() { + var a = 0 !== Kh; + Kh = 0; + return a; + } + function Th() { + var a = { memoizedState: null, baseState: null, baseQueue: null, queue: null, next: null }; + null === O ? M.memoizedState = O = a : O = O.next = a; + return O; + } + function Uh() { + if (null === N) { + var a = M.alternate; + a = null !== a ? a.memoizedState : null; + } else a = N.next; + var b = null === O ? M.memoizedState : O.next; + if (null !== b) O = b, N = a; + else { + if (null === a) throw Error(p(310)); + N = a; + a = { memoizedState: N.memoizedState, baseState: N.baseState, baseQueue: N.baseQueue, queue: N.queue, next: null }; + null === O ? M.memoizedState = O = a : O = O.next = a; + } + return O; + } + function Vh(a, b) { + return "function" === typeof b ? b(a) : b; + } + function Wh(a) { + var b = Uh(), c = b.queue; + if (null === c) throw Error(p(311)); + c.lastRenderedReducer = a; + var d = N, e = d.baseQueue, f = c.pending; + if (null !== f) { + if (null !== e) { + var g = e.next; + e.next = f.next; + f.next = g; + } + d.baseQueue = e = f; + c.pending = null; + } + if (null !== e) { + f = e.next; + d = d.baseState; + var h = g = null, k = null, l = f; + do { + var m = l.lane; + if ((Hh & m) === m) null !== k && (k = k.next = { lane: 0, action: l.action, hasEagerState: l.hasEagerState, eagerState: l.eagerState, next: null }), d = l.hasEagerState ? l.eagerState : a(d, l.action); + else { + var q = { + lane: m, + action: l.action, + hasEagerState: l.hasEagerState, + eagerState: l.eagerState, + next: null + }; + null === k ? (h = k = q, g = d) : k = k.next = q; + M.lanes |= m; + rh |= m; + } + l = l.next; + } while (null !== l && l !== f); + null === k ? g = d : k.next = h; + He(d, b.memoizedState) || (dh = true); + b.memoizedState = d; + b.baseState = g; + b.baseQueue = k; + c.lastRenderedState = d; + } + a = c.interleaved; + if (null !== a) { + e = a; + do + f = e.lane, M.lanes |= f, rh |= f, e = e.next; + while (e !== a); + } else null === e && (c.lanes = 0); + return [b.memoizedState, c.dispatch]; + } + function Xh(a) { + var b = Uh(), c = b.queue; + if (null === c) throw Error(p(311)); + c.lastRenderedReducer = a; + var d = c.dispatch, e = c.pending, f = b.memoizedState; + if (null !== e) { + c.pending = null; + var g = e = e.next; + do + f = a(f, g.action), g = g.next; + while (g !== e); + He(f, b.memoizedState) || (dh = true); + b.memoizedState = f; + null === b.baseQueue && (b.baseState = f); + c.lastRenderedState = f; + } + return [f, d]; + } + function Yh() { + } + function Zh(a, b) { + var c = M, d = Uh(), e = b(), f = !He(d.memoizedState, e); + f && (d.memoizedState = e, dh = true); + d = d.queue; + $h(ai.bind(null, c, d, a), [a]); + if (d.getSnapshot !== b || f || null !== O && O.memoizedState.tag & 1) { + c.flags |= 2048; + bi(9, ci.bind(null, c, d, e, b), void 0, null); + if (null === Q) throw Error(p(349)); + 0 !== (Hh & 30) || di(c, b, e); + } + return e; + } + function di(a, b, c) { + a.flags |= 16384; + a = { getSnapshot: b, value: c }; + b = M.updateQueue; + null === b ? (b = { lastEffect: null, stores: null }, M.updateQueue = b, b.stores = [a]) : (c = b.stores, null === c ? b.stores = [a] : c.push(a)); + } + function ci(a, b, c, d) { + b.value = c; + b.getSnapshot = d; + ei(b) && fi(a); + } + function ai(a, b, c) { + return c(function() { + ei(b) && fi(a); + }); + } + function ei(a) { + var b = a.getSnapshot; + a = a.value; + try { + var c = b(); + return !He(a, c); + } catch (d) { + return true; + } + } + function fi(a) { + var b = ih(a, 1); + null !== b && gi(b, a, 1, -1); + } + function hi(a) { + var b = Th(); + "function" === typeof a && (a = a()); + b.memoizedState = b.baseState = a; + a = { pending: null, interleaved: null, lanes: 0, dispatch: null, lastRenderedReducer: Vh, lastRenderedState: a }; + b.queue = a; + a = a.dispatch = ii.bind(null, M, a); + return [b.memoizedState, a]; + } + function bi(a, b, c, d) { + a = { tag: a, create: b, destroy: c, deps: d, next: null }; + b = M.updateQueue; + null === b ? (b = { lastEffect: null, stores: null }, M.updateQueue = b, b.lastEffect = a.next = a) : (c = b.lastEffect, null === c ? b.lastEffect = a.next = a : (d = c.next, c.next = a, a.next = d, b.lastEffect = a)); + return a; + } + function ji() { + return Uh().memoizedState; + } + function ki(a, b, c, d) { + var e = Th(); + M.flags |= a; + e.memoizedState = bi(1 | b, c, void 0, void 0 === d ? null : d); + } + function li(a, b, c, d) { + var e = Uh(); + d = void 0 === d ? null : d; + var f = void 0; + if (null !== N) { + var g = N.memoizedState; + f = g.destroy; + if (null !== d && Mh(d, g.deps)) { + e.memoizedState = bi(b, c, f, d); + return; + } + } + M.flags |= a; + e.memoizedState = bi(1 | b, c, f, d); + } + function mi(a, b) { + return ki(8390656, 8, a, b); + } + function $h(a, b) { + return li(2048, 8, a, b); + } + function ni(a, b) { + return li(4, 2, a, b); + } + function oi(a, b) { + return li(4, 4, a, b); + } + function pi(a, b) { + if ("function" === typeof b) return a = a(), b(a), function() { + b(null); + }; + if (null !== b && void 0 !== b) return a = a(), b.current = a, function() { + b.current = null; + }; + } + function qi(a, b, c) { + c = null !== c && void 0 !== c ? c.concat([a]) : null; + return li(4, 4, pi.bind(null, b, a), c); + } + function ri() { + } + function si(a, b) { + var c = Uh(); + b = void 0 === b ? null : b; + var d = c.memoizedState; + if (null !== d && null !== b && Mh(b, d[1])) return d[0]; + c.memoizedState = [a, b]; + return a; + } + function ti(a, b) { + var c = Uh(); + b = void 0 === b ? null : b; + var d = c.memoizedState; + if (null !== d && null !== b && Mh(b, d[1])) return d[0]; + a = a(); + c.memoizedState = [a, b]; + return a; + } + function ui(a, b, c) { + if (0 === (Hh & 21)) return a.baseState && (a.baseState = false, dh = true), a.memoizedState = c; + He(c, b) || (c = yc(), M.lanes |= c, rh |= c, a.baseState = true); + return b; + } + function vi(a, b) { + var c = C; + C = 0 !== c && 4 > c ? c : 4; + a(true); + var d = Gh.transition; + Gh.transition = {}; + try { + a(false), b(); + } finally { + C = c, Gh.transition = d; + } + } + function wi() { + return Uh().memoizedState; + } + function xi(a, b, c) { + var d = yi(a); + c = { lane: d, action: c, hasEagerState: false, eagerState: null, next: null }; + if (zi(a)) Ai(b, c); + else if (c = hh(a, b, c, d), null !== c) { + var e = R(); + gi(c, a, d, e); + Bi(c, b, d); + } + } + function ii(a, b, c) { + var d = yi(a), e = { lane: d, action: c, hasEagerState: false, eagerState: null, next: null }; + if (zi(a)) Ai(b, e); + else { + var f = a.alternate; + if (0 === a.lanes && (null === f || 0 === f.lanes) && (f = b.lastRenderedReducer, null !== f)) try { + var g = b.lastRenderedState, h = f(g, c); + e.hasEagerState = true; + e.eagerState = h; + if (He(h, g)) { + var k = b.interleaved; + null === k ? (e.next = e, gh(b)) : (e.next = k.next, k.next = e); + b.interleaved = e; + return; + } + } catch (l) { + } finally { + } + c = hh(a, b, e, d); + null !== c && (e = R(), gi(c, a, d, e), Bi(c, b, d)); + } + } + function zi(a) { + var b = a.alternate; + return a === M || null !== b && b === M; + } + function Ai(a, b) { + Jh = Ih = true; + var c = a.pending; + null === c ? b.next = b : (b.next = c.next, c.next = b); + a.pending = b; + } + function Bi(a, b, c) { + if (0 !== (c & 4194240)) { + var d = b.lanes; + d &= a.pendingLanes; + c |= d; + b.lanes = c; + Cc(a, c); + } + } + var Rh = { readContext: eh, useCallback: P, useContext: P, useEffect: P, useImperativeHandle: P, useInsertionEffect: P, useLayoutEffect: P, useMemo: P, useReducer: P, useRef: P, useState: P, useDebugValue: P, useDeferredValue: P, useTransition: P, useMutableSource: P, useSyncExternalStore: P, useId: P, unstable_isNewReconciler: false }, Oh = { readContext: eh, useCallback: function(a, b) { + Th().memoizedState = [a, void 0 === b ? null : b]; + return a; + }, useContext: eh, useEffect: mi, useImperativeHandle: function(a, b, c) { + c = null !== c && void 0 !== c ? c.concat([a]) : null; + return ki( + 4194308, + 4, + pi.bind(null, b, a), + c + ); + }, useLayoutEffect: function(a, b) { + return ki(4194308, 4, a, b); + }, useInsertionEffect: function(a, b) { + return ki(4, 2, a, b); + }, useMemo: function(a, b) { + var c = Th(); + b = void 0 === b ? null : b; + a = a(); + c.memoizedState = [a, b]; + return a; + }, useReducer: function(a, b, c) { + var d = Th(); + b = void 0 !== c ? c(b) : b; + d.memoizedState = d.baseState = b; + a = { pending: null, interleaved: null, lanes: 0, dispatch: null, lastRenderedReducer: a, lastRenderedState: b }; + d.queue = a; + a = a.dispatch = xi.bind(null, M, a); + return [d.memoizedState, a]; + }, useRef: function(a) { + var b = Th(); + a = { current: a }; + return b.memoizedState = a; + }, useState: hi, useDebugValue: ri, useDeferredValue: function(a) { + return Th().memoizedState = a; + }, useTransition: function() { + var a = hi(false), b = a[0]; + a = vi.bind(null, a[1]); + Th().memoizedState = a; + return [b, a]; + }, useMutableSource: function() { + }, useSyncExternalStore: function(a, b, c) { + var d = M, e = Th(); + if (I) { + if (void 0 === c) throw Error(p(407)); + c = c(); + } else { + c = b(); + if (null === Q) throw Error(p(349)); + 0 !== (Hh & 30) || di(d, b, c); + } + e.memoizedState = c; + var f = { value: c, getSnapshot: b }; + e.queue = f; + mi(ai.bind( + null, + d, + f, + a + ), [a]); + d.flags |= 2048; + bi(9, ci.bind(null, d, f, c, b), void 0, null); + return c; + }, useId: function() { + var a = Th(), b = Q.identifierPrefix; + if (I) { + var c = sg; + var d = rg; + c = (d & ~(1 << 32 - oc(d) - 1)).toString(32) + c; + b = ":" + b + "R" + c; + c = Kh++; + 0 < c && (b += "H" + c.toString(32)); + b += ":"; + } else c = Lh++, b = ":" + b + "r" + c.toString(32) + ":"; + return a.memoizedState = b; + }, unstable_isNewReconciler: false }, Ph = { + readContext: eh, + useCallback: si, + useContext: eh, + useEffect: $h, + useImperativeHandle: qi, + useInsertionEffect: ni, + useLayoutEffect: oi, + useMemo: ti, + useReducer: Wh, + useRef: ji, + useState: function() { + return Wh(Vh); + }, + useDebugValue: ri, + useDeferredValue: function(a) { + var b = Uh(); + return ui(b, N.memoizedState, a); + }, + useTransition: function() { + var a = Wh(Vh)[0], b = Uh().memoizedState; + return [a, b]; + }, + useMutableSource: Yh, + useSyncExternalStore: Zh, + useId: wi, + unstable_isNewReconciler: false + }, Qh = { readContext: eh, useCallback: si, useContext: eh, useEffect: $h, useImperativeHandle: qi, useInsertionEffect: ni, useLayoutEffect: oi, useMemo: ti, useReducer: Xh, useRef: ji, useState: function() { + return Xh(Vh); + }, useDebugValue: ri, useDeferredValue: function(a) { + var b = Uh(); + return null === N ? b.memoizedState = a : ui(b, N.memoizedState, a); + }, useTransition: function() { + var a = Xh(Vh)[0], b = Uh().memoizedState; + return [a, b]; + }, useMutableSource: Yh, useSyncExternalStore: Zh, useId: wi, unstable_isNewReconciler: false }; + function Ci(a, b) { + if (a && a.defaultProps) { + b = A({}, b); + a = a.defaultProps; + for (var c in a) void 0 === b[c] && (b[c] = a[c]); + return b; + } + return b; + } + function Di(a, b, c, d) { + b = a.memoizedState; + c = c(d, b); + c = null === c || void 0 === c ? b : A({}, b, c); + a.memoizedState = c; + 0 === a.lanes && (a.updateQueue.baseState = c); + } + var Ei = { isMounted: function(a) { + return (a = a._reactInternals) ? Vb(a) === a : false; + }, enqueueSetState: function(a, b, c) { + a = a._reactInternals; + var d = R(), e = yi(a), f = mh(d, e); + f.payload = b; + void 0 !== c && null !== c && (f.callback = c); + b = nh(a, f, e); + null !== b && (gi(b, a, e, d), oh(b, a, e)); + }, enqueueReplaceState: function(a, b, c) { + a = a._reactInternals; + var d = R(), e = yi(a), f = mh(d, e); + f.tag = 1; + f.payload = b; + void 0 !== c && null !== c && (f.callback = c); + b = nh(a, f, e); + null !== b && (gi(b, a, e, d), oh(b, a, e)); + }, enqueueForceUpdate: function(a, b) { + a = a._reactInternals; + var c = R(), d = yi(a), e = mh(c, d); + e.tag = 2; + void 0 !== b && null !== b && (e.callback = b); + b = nh(a, e, d); + null !== b && (gi(b, a, d, c), oh(b, a, d)); + } }; + function Fi(a, b, c, d, e, f, g) { + a = a.stateNode; + return "function" === typeof a.shouldComponentUpdate ? a.shouldComponentUpdate(d, f, g) : b.prototype && b.prototype.isPureReactComponent ? !Ie(c, d) || !Ie(e, f) : true; + } + function Gi(a, b, c) { + var d = false, e = Vf; + var f = b.contextType; + "object" === typeof f && null !== f ? f = eh(f) : (e = Zf(b) ? Xf : H.current, d = b.contextTypes, f = (d = null !== d && void 0 !== d) ? Yf(a, e) : Vf); + b = new b(c, f); + a.memoizedState = null !== b.state && void 0 !== b.state ? b.state : null; + b.updater = Ei; + a.stateNode = b; + b._reactInternals = a; + d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = e, a.__reactInternalMemoizedMaskedChildContext = f); + return b; + } + function Hi(a, b, c, d) { + a = b.state; + "function" === typeof b.componentWillReceiveProps && b.componentWillReceiveProps(c, d); + "function" === typeof b.UNSAFE_componentWillReceiveProps && b.UNSAFE_componentWillReceiveProps(c, d); + b.state !== a && Ei.enqueueReplaceState(b, b.state, null); + } + function Ii(a, b, c, d) { + var e = a.stateNode; + e.props = c; + e.state = a.memoizedState; + e.refs = {}; + kh(a); + var f = b.contextType; + "object" === typeof f && null !== f ? e.context = eh(f) : (f = Zf(b) ? Xf : H.current, e.context = Yf(a, f)); + e.state = a.memoizedState; + f = b.getDerivedStateFromProps; + "function" === typeof f && (Di(a, b, f, c), e.state = a.memoizedState); + "function" === typeof b.getDerivedStateFromProps || "function" === typeof e.getSnapshotBeforeUpdate || "function" !== typeof e.UNSAFE_componentWillMount && "function" !== typeof e.componentWillMount || (b = e.state, "function" === typeof e.componentWillMount && e.componentWillMount(), "function" === typeof e.UNSAFE_componentWillMount && e.UNSAFE_componentWillMount(), b !== e.state && Ei.enqueueReplaceState(e, e.state, null), qh(a, c, e, d), e.state = a.memoizedState); + "function" === typeof e.componentDidMount && (a.flags |= 4194308); + } + function Ji(a, b) { + try { + var c = "", d = b; + do + c += Pa(d), d = d.return; + while (d); + var e = c; + } catch (f) { + e = "\nError generating stack: " + f.message + "\n" + f.stack; + } + return { value: a, source: b, stack: e, digest: null }; + } + function Ki(a, b, c) { + return { value: a, source: null, stack: null != c ? c : null, digest: null != b ? b : null }; + } + function Li(a, b) { + try { + console.error(b.value); + } catch (c) { + setTimeout(function() { + throw c; + }); + } + } + var Mi = "function" === typeof WeakMap ? WeakMap : Map; + function Ni(a, b, c) { + c = mh(-1, c); + c.tag = 3; + c.payload = { element: null }; + var d = b.value; + c.callback = function() { + Oi || (Oi = true, Pi = d); + Li(a, b); + }; + return c; + } + function Qi(a, b, c) { + c = mh(-1, c); + c.tag = 3; + var d = a.type.getDerivedStateFromError; + if ("function" === typeof d) { + var e = b.value; + c.payload = function() { + return d(e); + }; + c.callback = function() { + Li(a, b); + }; + } + var f = a.stateNode; + null !== f && "function" === typeof f.componentDidCatch && (c.callback = function() { + Li(a, b); + "function" !== typeof d && (null === Ri ? Ri = /* @__PURE__ */ new Set([this]) : Ri.add(this)); + var c2 = b.stack; + this.componentDidCatch(b.value, { componentStack: null !== c2 ? c2 : "" }); + }); + return c; + } + function Si(a, b, c) { + var d = a.pingCache; + if (null === d) { + d = a.pingCache = new Mi(); + var e = /* @__PURE__ */ new Set(); + d.set(b, e); + } else e = d.get(b), void 0 === e && (e = /* @__PURE__ */ new Set(), d.set(b, e)); + e.has(c) || (e.add(c), a = Ti.bind(null, a, b, c), b.then(a, a)); + } + function Ui(a) { + do { + var b; + if (b = 13 === a.tag) b = a.memoizedState, b = null !== b ? null !== b.dehydrated ? true : false : true; + if (b) return a; + a = a.return; + } while (null !== a); + return null; + } + function Vi(a, b, c, d, e) { + if (0 === (a.mode & 1)) return a === b ? a.flags |= 65536 : (a.flags |= 128, c.flags |= 131072, c.flags &= -52805, 1 === c.tag && (null === c.alternate ? c.tag = 17 : (b = mh(-1, 1), b.tag = 2, nh(c, b, 1))), c.lanes |= 1), a; + a.flags |= 65536; + a.lanes = e; + return a; + } + var Wi = ua.ReactCurrentOwner, dh = false; + function Xi(a, b, c, d) { + b.child = null === a ? Vg(b, null, c, d) : Ug(b, a.child, c, d); + } + function Yi(a, b, c, d, e) { + c = c.render; + var f = b.ref; + ch(b, e); + d = Nh(a, b, c, d, f, e); + c = Sh(); + if (null !== a && !dh) return b.updateQueue = a.updateQueue, b.flags &= -2053, a.lanes &= ~e, Zi(a, b, e); + I && c && vg(b); + b.flags |= 1; + Xi(a, b, d, e); + return b.child; + } + function $i(a, b, c, d, e) { + if (null === a) { + var f = c.type; + if ("function" === typeof f && !aj(f) && void 0 === f.defaultProps && null === c.compare && void 0 === c.defaultProps) return b.tag = 15, b.type = f, bj(a, b, f, d, e); + a = Rg(c.type, null, d, b, b.mode, e); + a.ref = b.ref; + a.return = b; + return b.child = a; + } + f = a.child; + if (0 === (a.lanes & e)) { + var g = f.memoizedProps; + c = c.compare; + c = null !== c ? c : Ie; + if (c(g, d) && a.ref === b.ref) return Zi(a, b, e); + } + b.flags |= 1; + a = Pg(f, d); + a.ref = b.ref; + a.return = b; + return b.child = a; + } + function bj(a, b, c, d, e) { + if (null !== a) { + var f = a.memoizedProps; + if (Ie(f, d) && a.ref === b.ref) if (dh = false, b.pendingProps = d = f, 0 !== (a.lanes & e)) 0 !== (a.flags & 131072) && (dh = true); + else return b.lanes = a.lanes, Zi(a, b, e); + } + return cj(a, b, c, d, e); + } + function dj(a, b, c) { + var d = b.pendingProps, e = d.children, f = null !== a ? a.memoizedState : null; + if ("hidden" === d.mode) if (0 === (b.mode & 1)) b.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }, G(ej, fj), fj |= c; + else { + if (0 === (c & 1073741824)) return a = null !== f ? f.baseLanes | c : c, b.lanes = b.childLanes = 1073741824, b.memoizedState = { baseLanes: a, cachePool: null, transitions: null }, b.updateQueue = null, G(ej, fj), fj |= a, null; + b.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }; + d = null !== f ? f.baseLanes : c; + G(ej, fj); + fj |= d; + } + else null !== f ? (d = f.baseLanes | c, b.memoizedState = null) : d = c, G(ej, fj), fj |= d; + Xi(a, b, e, c); + return b.child; + } + function gj(a, b) { + var c = b.ref; + if (null === a && null !== c || null !== a && a.ref !== c) b.flags |= 512, b.flags |= 2097152; + } + function cj(a, b, c, d, e) { + var f = Zf(c) ? Xf : H.current; + f = Yf(b, f); + ch(b, e); + c = Nh(a, b, c, d, f, e); + d = Sh(); + if (null !== a && !dh) return b.updateQueue = a.updateQueue, b.flags &= -2053, a.lanes &= ~e, Zi(a, b, e); + I && d && vg(b); + b.flags |= 1; + Xi(a, b, c, e); + return b.child; + } + function hj(a, b, c, d, e) { + if (Zf(c)) { + var f = true; + cg(b); + } else f = false; + ch(b, e); + if (null === b.stateNode) ij(a, b), Gi(b, c, d), Ii(b, c, d, e), d = true; + else if (null === a) { + var g = b.stateNode, h = b.memoizedProps; + g.props = h; + var k = g.context, l = c.contextType; + "object" === typeof l && null !== l ? l = eh(l) : (l = Zf(c) ? Xf : H.current, l = Yf(b, l)); + var m = c.getDerivedStateFromProps, q = "function" === typeof m || "function" === typeof g.getSnapshotBeforeUpdate; + q || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== d || k !== l) && Hi(b, g, d, l); + jh = false; + var r = b.memoizedState; + g.state = r; + qh(b, d, g, e); + k = b.memoizedState; + h !== d || r !== k || Wf.current || jh ? ("function" === typeof m && (Di(b, c, m, d), k = b.memoizedState), (h = jh || Fi(b, c, h, d, r, k, l)) ? (q || "function" !== typeof g.UNSAFE_componentWillMount && "function" !== typeof g.componentWillMount || ("function" === typeof g.componentWillMount && g.componentWillMount(), "function" === typeof g.UNSAFE_componentWillMount && g.UNSAFE_componentWillMount()), "function" === typeof g.componentDidMount && (b.flags |= 4194308)) : ("function" === typeof g.componentDidMount && (b.flags |= 4194308), b.memoizedProps = d, b.memoizedState = k), g.props = d, g.state = k, g.context = l, d = h) : ("function" === typeof g.componentDidMount && (b.flags |= 4194308), d = false); + } else { + g = b.stateNode; + lh(a, b); + h = b.memoizedProps; + l = b.type === b.elementType ? h : Ci(b.type, h); + g.props = l; + q = b.pendingProps; + r = g.context; + k = c.contextType; + "object" === typeof k && null !== k ? k = eh(k) : (k = Zf(c) ? Xf : H.current, k = Yf(b, k)); + var y = c.getDerivedStateFromProps; + (m = "function" === typeof y || "function" === typeof g.getSnapshotBeforeUpdate) || "function" !== typeof g.UNSAFE_componentWillReceiveProps && "function" !== typeof g.componentWillReceiveProps || (h !== q || r !== k) && Hi(b, g, d, k); + jh = false; + r = b.memoizedState; + g.state = r; + qh(b, d, g, e); + var n = b.memoizedState; + h !== q || r !== n || Wf.current || jh ? ("function" === typeof y && (Di(b, c, y, d), n = b.memoizedState), (l = jh || Fi(b, c, l, d, r, n, k) || false) ? (m || "function" !== typeof g.UNSAFE_componentWillUpdate && "function" !== typeof g.componentWillUpdate || ("function" === typeof g.componentWillUpdate && g.componentWillUpdate(d, n, k), "function" === typeof g.UNSAFE_componentWillUpdate && g.UNSAFE_componentWillUpdate(d, n, k)), "function" === typeof g.componentDidUpdate && (b.flags |= 4), "function" === typeof g.getSnapshotBeforeUpdate && (b.flags |= 1024)) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && r === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && r === a.memoizedState || (b.flags |= 1024), b.memoizedProps = d, b.memoizedState = n), g.props = d, g.state = n, g.context = k, d = l) : ("function" !== typeof g.componentDidUpdate || h === a.memoizedProps && r === a.memoizedState || (b.flags |= 4), "function" !== typeof g.getSnapshotBeforeUpdate || h === a.memoizedProps && r === a.memoizedState || (b.flags |= 1024), d = false); + } + return jj(a, b, c, d, f, e); + } + function jj(a, b, c, d, e, f) { + gj(a, b); + var g = 0 !== (b.flags & 128); + if (!d && !g) return e && dg(b, c, false), Zi(a, b, f); + d = b.stateNode; + Wi.current = b; + var h = g && "function" !== typeof c.getDerivedStateFromError ? null : d.render(); + b.flags |= 1; + null !== a && g ? (b.child = Ug(b, a.child, null, f), b.child = Ug(b, null, h, f)) : Xi(a, b, h, f); + b.memoizedState = d.state; + e && dg(b, c, true); + return b.child; + } + function kj(a) { + var b = a.stateNode; + b.pendingContext ? ag(a, b.pendingContext, b.pendingContext !== b.context) : b.context && ag(a, b.context, false); + yh(a, b.containerInfo); + } + function lj(a, b, c, d, e) { + Ig(); + Jg(e); + b.flags |= 256; + Xi(a, b, c, d); + return b.child; + } + var mj = { dehydrated: null, treeContext: null, retryLane: 0 }; + function nj(a) { + return { baseLanes: a, cachePool: null, transitions: null }; + } + function oj(a, b, c) { + var d = b.pendingProps, e = L.current, f = false, g = 0 !== (b.flags & 128), h; + (h = g) || (h = null !== a && null === a.memoizedState ? false : 0 !== (e & 2)); + if (h) f = true, b.flags &= -129; + else if (null === a || null !== a.memoizedState) e |= 1; + G(L, e & 1); + if (null === a) { + Eg(b); + a = b.memoizedState; + if (null !== a && (a = a.dehydrated, null !== a)) return 0 === (b.mode & 1) ? b.lanes = 1 : "$!" === a.data ? b.lanes = 8 : b.lanes = 1073741824, null; + g = d.children; + a = d.fallback; + return f ? (d = b.mode, f = b.child, g = { mode: "hidden", children: g }, 0 === (d & 1) && null !== f ? (f.childLanes = 0, f.pendingProps = g) : f = pj(g, d, 0, null), a = Tg(a, d, c, null), f.return = b, a.return = b, f.sibling = a, b.child = f, b.child.memoizedState = nj(c), b.memoizedState = mj, a) : qj(b, g); + } + e = a.memoizedState; + if (null !== e && (h = e.dehydrated, null !== h)) return rj(a, b, g, d, h, e, c); + if (f) { + f = d.fallback; + g = b.mode; + e = a.child; + h = e.sibling; + var k = { mode: "hidden", children: d.children }; + 0 === (g & 1) && b.child !== e ? (d = b.child, d.childLanes = 0, d.pendingProps = k, b.deletions = null) : (d = Pg(e, k), d.subtreeFlags = e.subtreeFlags & 14680064); + null !== h ? f = Pg(h, f) : (f = Tg(f, g, c, null), f.flags |= 2); + f.return = b; + d.return = b; + d.sibling = f; + b.child = d; + d = f; + f = b.child; + g = a.child.memoizedState; + g = null === g ? nj(c) : { baseLanes: g.baseLanes | c, cachePool: null, transitions: g.transitions }; + f.memoizedState = g; + f.childLanes = a.childLanes & ~c; + b.memoizedState = mj; + return d; + } + f = a.child; + a = f.sibling; + d = Pg(f, { mode: "visible", children: d.children }); + 0 === (b.mode & 1) && (d.lanes = c); + d.return = b; + d.sibling = null; + null !== a && (c = b.deletions, null === c ? (b.deletions = [a], b.flags |= 16) : c.push(a)); + b.child = d; + b.memoizedState = null; + return d; + } + function qj(a, b) { + b = pj({ mode: "visible", children: b }, a.mode, 0, null); + b.return = a; + return a.child = b; + } + function sj(a, b, c, d) { + null !== d && Jg(d); + Ug(b, a.child, null, c); + a = qj(b, b.pendingProps.children); + a.flags |= 2; + b.memoizedState = null; + return a; + } + function rj(a, b, c, d, e, f, g) { + if (c) { + if (b.flags & 256) return b.flags &= -257, d = Ki(Error(p(422))), sj(a, b, g, d); + if (null !== b.memoizedState) return b.child = a.child, b.flags |= 128, null; + f = d.fallback; + e = b.mode; + d = pj({ mode: "visible", children: d.children }, e, 0, null); + f = Tg(f, e, g, null); + f.flags |= 2; + d.return = b; + f.return = b; + d.sibling = f; + b.child = d; + 0 !== (b.mode & 1) && Ug(b, a.child, null, g); + b.child.memoizedState = nj(g); + b.memoizedState = mj; + return f; + } + if (0 === (b.mode & 1)) return sj(a, b, g, null); + if ("$!" === e.data) { + d = e.nextSibling && e.nextSibling.dataset; + if (d) var h = d.dgst; + d = h; + f = Error(p(419)); + d = Ki(f, d, void 0); + return sj(a, b, g, d); + } + h = 0 !== (g & a.childLanes); + if (dh || h) { + d = Q; + if (null !== d) { + switch (g & -g) { + case 4: + e = 2; + break; + case 16: + e = 8; + break; + case 64: + case 128: + case 256: + case 512: + case 1024: + case 2048: + case 4096: + case 8192: + case 16384: + case 32768: + case 65536: + case 131072: + case 262144: + case 524288: + case 1048576: + case 2097152: + case 4194304: + case 8388608: + case 16777216: + case 33554432: + case 67108864: + e = 32; + break; + case 536870912: + e = 268435456; + break; + default: + e = 0; + } + e = 0 !== (e & (d.suspendedLanes | g)) ? 0 : e; + 0 !== e && e !== f.retryLane && (f.retryLane = e, ih(a, e), gi(d, a, e, -1)); + } + tj(); + d = Ki(Error(p(421))); + return sj(a, b, g, d); + } + if ("$?" === e.data) return b.flags |= 128, b.child = a.child, b = uj.bind(null, a), e._reactRetry = b, null; + a = f.treeContext; + yg = Lf(e.nextSibling); + xg = b; + I = true; + zg = null; + null !== a && (og[pg++] = rg, og[pg++] = sg, og[pg++] = qg, rg = a.id, sg = a.overflow, qg = b); + b = qj(b, d.children); + b.flags |= 4096; + return b; + } + function vj(a, b, c) { + a.lanes |= b; + var d = a.alternate; + null !== d && (d.lanes |= b); + bh(a.return, b, c); + } + function wj(a, b, c, d, e) { + var f = a.memoizedState; + null === f ? a.memoizedState = { isBackwards: b, rendering: null, renderingStartTime: 0, last: d, tail: c, tailMode: e } : (f.isBackwards = b, f.rendering = null, f.renderingStartTime = 0, f.last = d, f.tail = c, f.tailMode = e); + } + function xj(a, b, c) { + var d = b.pendingProps, e = d.revealOrder, f = d.tail; + Xi(a, b, d.children, c); + d = L.current; + if (0 !== (d & 2)) d = d & 1 | 2, b.flags |= 128; + else { + if (null !== a && 0 !== (a.flags & 128)) a: for (a = b.child; null !== a; ) { + if (13 === a.tag) null !== a.memoizedState && vj(a, c, b); + else if (19 === a.tag) vj(a, c, b); + else if (null !== a.child) { + a.child.return = a; + a = a.child; + continue; + } + if (a === b) break a; + for (; null === a.sibling; ) { + if (null === a.return || a.return === b) break a; + a = a.return; + } + a.sibling.return = a.return; + a = a.sibling; + } + d &= 1; + } + G(L, d); + if (0 === (b.mode & 1)) b.memoizedState = null; + else switch (e) { + case "forwards": + c = b.child; + for (e = null; null !== c; ) a = c.alternate, null !== a && null === Ch(a) && (e = c), c = c.sibling; + c = e; + null === c ? (e = b.child, b.child = null) : (e = c.sibling, c.sibling = null); + wj(b, false, e, c, f); + break; + case "backwards": + c = null; + e = b.child; + for (b.child = null; null !== e; ) { + a = e.alternate; + if (null !== a && null === Ch(a)) { + b.child = e; + break; + } + a = e.sibling; + e.sibling = c; + c = e; + e = a; + } + wj(b, true, c, null, f); + break; + case "together": + wj(b, false, null, null, void 0); + break; + default: + b.memoizedState = null; + } + return b.child; + } + function ij(a, b) { + 0 === (b.mode & 1) && null !== a && (a.alternate = null, b.alternate = null, b.flags |= 2); + } + function Zi(a, b, c) { + null !== a && (b.dependencies = a.dependencies); + rh |= b.lanes; + if (0 === (c & b.childLanes)) return null; + if (null !== a && b.child !== a.child) throw Error(p(153)); + if (null !== b.child) { + a = b.child; + c = Pg(a, a.pendingProps); + b.child = c; + for (c.return = b; null !== a.sibling; ) a = a.sibling, c = c.sibling = Pg(a, a.pendingProps), c.return = b; + c.sibling = null; + } + return b.child; + } + function yj(a, b, c) { + switch (b.tag) { + case 3: + kj(b); + Ig(); + break; + case 5: + Ah(b); + break; + case 1: + Zf(b.type) && cg(b); + break; + case 4: + yh(b, b.stateNode.containerInfo); + break; + case 10: + var d = b.type._context, e = b.memoizedProps.value; + G(Wg, d._currentValue); + d._currentValue = e; + break; + case 13: + d = b.memoizedState; + if (null !== d) { + if (null !== d.dehydrated) return G(L, L.current & 1), b.flags |= 128, null; + if (0 !== (c & b.child.childLanes)) return oj(a, b, c); + G(L, L.current & 1); + a = Zi(a, b, c); + return null !== a ? a.sibling : null; + } + G(L, L.current & 1); + break; + case 19: + d = 0 !== (c & b.childLanes); + if (0 !== (a.flags & 128)) { + if (d) return xj(a, b, c); + b.flags |= 128; + } + e = b.memoizedState; + null !== e && (e.rendering = null, e.tail = null, e.lastEffect = null); + G(L, L.current); + if (d) break; + else return null; + case 22: + case 23: + return b.lanes = 0, dj(a, b, c); + } + return Zi(a, b, c); + } + var zj, Aj, Bj, Cj; + zj = function(a, b) { + for (var c = b.child; null !== c; ) { + if (5 === c.tag || 6 === c.tag) a.appendChild(c.stateNode); + else if (4 !== c.tag && null !== c.child) { + c.child.return = c; + c = c.child; + continue; + } + if (c === b) break; + for (; null === c.sibling; ) { + if (null === c.return || c.return === b) return; + c = c.return; + } + c.sibling.return = c.return; + c = c.sibling; + } + }; + Aj = function() { + }; + Bj = function(a, b, c, d) { + var e = a.memoizedProps; + if (e !== d) { + a = b.stateNode; + xh(uh.current); + var f = null; + switch (c) { + case "input": + e = Ya(a, e); + d = Ya(a, d); + f = []; + break; + case "select": + e = A({}, e, { value: void 0 }); + d = A({}, d, { value: void 0 }); + f = []; + break; + case "textarea": + e = gb(a, e); + d = gb(a, d); + f = []; + break; + default: + "function" !== typeof e.onClick && "function" === typeof d.onClick && (a.onclick = Bf); + } + ub(c, d); + var g; + c = null; + for (l in e) if (!d.hasOwnProperty(l) && e.hasOwnProperty(l) && null != e[l]) if ("style" === l) { + var h = e[l]; + for (g in h) h.hasOwnProperty(g) && (c || (c = {}), c[g] = ""); + } else "dangerouslySetInnerHTML" !== l && "children" !== l && "suppressContentEditableWarning" !== l && "suppressHydrationWarning" !== l && "autoFocus" !== l && (ea.hasOwnProperty(l) ? f || (f = []) : (f = f || []).push(l, null)); + for (l in d) { + var k = d[l]; + h = null != e ? e[l] : void 0; + if (d.hasOwnProperty(l) && k !== h && (null != k || null != h)) if ("style" === l) if (h) { + for (g in h) !h.hasOwnProperty(g) || k && k.hasOwnProperty(g) || (c || (c = {}), c[g] = ""); + for (g in k) k.hasOwnProperty(g) && h[g] !== k[g] && (c || (c = {}), c[g] = k[g]); + } else c || (f || (f = []), f.push( + l, + c + )), c = k; + else "dangerouslySetInnerHTML" === l ? (k = k ? k.__html : void 0, h = h ? h.__html : void 0, null != k && h !== k && (f = f || []).push(l, k)) : "children" === l ? "string" !== typeof k && "number" !== typeof k || (f = f || []).push(l, "" + k) : "suppressContentEditableWarning" !== l && "suppressHydrationWarning" !== l && (ea.hasOwnProperty(l) ? (null != k && "onScroll" === l && D("scroll", a), f || h === k || (f = [])) : (f = f || []).push(l, k)); + } + c && (f = f || []).push("style", c); + var l = f; + if (b.updateQueue = l) b.flags |= 4; + } + }; + Cj = function(a, b, c, d) { + c !== d && (b.flags |= 4); + }; + function Dj(a, b) { + if (!I) switch (a.tailMode) { + case "hidden": + b = a.tail; + for (var c = null; null !== b; ) null !== b.alternate && (c = b), b = b.sibling; + null === c ? a.tail = null : c.sibling = null; + break; + case "collapsed": + c = a.tail; + for (var d = null; null !== c; ) null !== c.alternate && (d = c), c = c.sibling; + null === d ? b || null === a.tail ? a.tail = null : a.tail.sibling = null : d.sibling = null; + } + } + function S(a) { + var b = null !== a.alternate && a.alternate.child === a.child, c = 0, d = 0; + if (b) for (var e = a.child; null !== e; ) c |= e.lanes | e.childLanes, d |= e.subtreeFlags & 14680064, d |= e.flags & 14680064, e.return = a, e = e.sibling; + else for (e = a.child; null !== e; ) c |= e.lanes | e.childLanes, d |= e.subtreeFlags, d |= e.flags, e.return = a, e = e.sibling; + a.subtreeFlags |= d; + a.childLanes = c; + return b; + } + function Ej(a, b, c) { + var d = b.pendingProps; + wg(b); + switch (b.tag) { + case 2: + case 16: + case 15: + case 0: + case 11: + case 7: + case 8: + case 12: + case 9: + case 14: + return S(b), null; + case 1: + return Zf(b.type) && $f(), S(b), null; + case 3: + d = b.stateNode; + zh(); + E(Wf); + E(H); + Eh(); + d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null); + if (null === a || null === a.child) Gg(b) ? b.flags |= 4 : null === a || a.memoizedState.isDehydrated && 0 === (b.flags & 256) || (b.flags |= 1024, null !== zg && (Fj(zg), zg = null)); + Aj(a, b); + S(b); + return null; + case 5: + Bh(b); + var e = xh(wh.current); + c = b.type; + if (null !== a && null != b.stateNode) Bj(a, b, c, d, e), a.ref !== b.ref && (b.flags |= 512, b.flags |= 2097152); + else { + if (!d) { + if (null === b.stateNode) throw Error(p(166)); + S(b); + return null; + } + a = xh(uh.current); + if (Gg(b)) { + d = b.stateNode; + c = b.type; + var f = b.memoizedProps; + d[Of] = b; + d[Pf] = f; + a = 0 !== (b.mode & 1); + switch (c) { + case "dialog": + D("cancel", d); + D("close", d); + break; + case "iframe": + case "object": + case "embed": + D("load", d); + break; + case "video": + case "audio": + for (e = 0; e < lf.length; e++) D(lf[e], d); + break; + case "source": + D("error", d); + break; + case "img": + case "image": + case "link": + D( + "error", + d + ); + D("load", d); + break; + case "details": + D("toggle", d); + break; + case "input": + Za(d, f); + D("invalid", d); + break; + case "select": + d._wrapperState = { wasMultiple: !!f.multiple }; + D("invalid", d); + break; + case "textarea": + hb(d, f), D("invalid", d); + } + ub(c, f); + e = null; + for (var g in f) if (f.hasOwnProperty(g)) { + var h = f[g]; + "children" === g ? "string" === typeof h ? d.textContent !== h && (true !== f.suppressHydrationWarning && Af(d.textContent, h, a), e = ["children", h]) : "number" === typeof h && d.textContent !== "" + h && (true !== f.suppressHydrationWarning && Af( + d.textContent, + h, + a + ), e = ["children", "" + h]) : ea.hasOwnProperty(g) && null != h && "onScroll" === g && D("scroll", d); + } + switch (c) { + case "input": + Va(d); + db(d, f, true); + break; + case "textarea": + Va(d); + jb(d); + break; + case "select": + case "option": + break; + default: + "function" === typeof f.onClick && (d.onclick = Bf); + } + d = e; + b.updateQueue = d; + null !== d && (b.flags |= 4); + } else { + g = 9 === e.nodeType ? e : e.ownerDocument; + "http://www.w3.org/1999/xhtml" === a && (a = kb(c)); + "http://www.w3.org/1999/xhtml" === a ? "script" === c ? (a = g.createElement("div"), a.innerHTML = " + + + + + + +
    + + diff --git a/extension/edge-share-crx/index.js b/extension/edge-share-crx/index.js new file mode 100644 index 0000000..b4e9929 --- /dev/null +++ b/extension/edge-share-crx/index.js @@ -0,0 +1,10229 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["codeMirrorModule.js","form.js","settings.js","form.css","codeMirrorModule.css"])))=>i.map(i=>d[i]); +import { R as React, j as jsxRuntimeExports, r as reactExports, P as PreferencesForm, c as clientExports } from "./form.js"; +import { d as defaultSettings, l as loadSettings, a as addSettingsChangedListener, r as removeSettingsChangedListener } from "./settings.js"; +function useMeasure() { + const ref = React.useRef(null); + const [measure, setMeasure] = React.useState(new DOMRect(0, 0, 10, 10)); + React.useLayoutEffect(() => { + const target = ref.current; + if (!target) + return; + const bounds = target.getBoundingClientRect(); + setMeasure(new DOMRect(0, 0, bounds.width, bounds.height)); + const resizeObserver = new ResizeObserver((entries) => { + const entry = entries[entries.length - 1]; + if (entry && entry.contentRect) + setMeasure(entry.contentRect); + }); + resizeObserver.observe(target); + return () => resizeObserver.disconnect(); + }, [ref]); + return [measure, ref]; +} +function msToString(ms) { + if (ms < 0 || !isFinite(ms)) + return "-"; + if (ms === 0) + return "0"; + if (ms < 1e3) + return ms.toFixed(0) + "ms"; + const seconds = ms / 1e3; + if (seconds < 60) + return seconds.toFixed(1) + "s"; + const minutes = seconds / 60; + if (minutes < 60) + return minutes.toFixed(1) + "m"; + const hours = minutes / 60; + if (hours < 24) + return hours.toFixed(1) + "h"; + const days = hours / 24; + return days.toFixed(1) + "d"; +} +function copy(text) { + const textArea = document.createElement("textarea"); + textArea.style.position = "absolute"; + textArea.style.zIndex = "-1000"; + textArea.value = text; + document.body.appendChild(textArea); + textArea.select(); + document.execCommand("copy"); + textArea.remove(); +} +function useSetting(name, defaultValue) { + if (name) + defaultValue = settings.getObject(name, defaultValue); + const [value, setValue] = React.useState(defaultValue); + const setValueWrapper = React.useCallback((value2) => { + if (name) + settings.setObject(name, value2); + else + setValue(value2); + }, [name, setValue]); + React.useEffect(() => { + if (name) { + const onStoreChange = () => setValue(settings.getObject(name, defaultValue)); + settings.onChangeEmitter.addEventListener(name, onStoreChange); + return () => settings.onChangeEmitter.removeEventListener(name, onStoreChange); + } + }, [defaultValue, name]); + return [value, setValueWrapper]; +} +class Settings { + constructor() { + this.onChangeEmitter = new EventTarget(); + } + getString(name, defaultValue) { + return localStorage[name] || defaultValue; + } + setString(name, value) { + var _a; + localStorage[name] = value; + this.onChangeEmitter.dispatchEvent(new Event(name)); + (_a = window.saveSettings) == null ? void 0 : _a.call(window); + } + getObject(name, defaultValue) { + if (!localStorage[name]) + return defaultValue; + try { + return JSON.parse(localStorage[name]); + } catch { + return defaultValue; + } + } + setObject(name, value) { + var _a; + localStorage[name] = JSON.stringify(value); + this.onChangeEmitter.dispatchEvent(new Event(name)); + (_a = window.saveSettings) == null ? void 0 : _a.call(window); + } +} +const settings = new Settings(); +function clsx(...classes) { + return classes.filter(Boolean).join(" "); +} +const kControlCodesRe = "\\u0000-\\u0020\\u007f-\\u009f"; +const kWebLinkRe = new RegExp("(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\\/\\/|www\\.)[^\\s" + kControlCodesRe + '"]{2,}[^\\s' + kControlCodesRe + `"')}\\],:;.!?]`, "ug"); +function applyTheme() { + if (document.playwrightThemeInitialized) + return; + document.playwrightThemeInitialized = true; + document.defaultView.addEventListener("focus", (event) => { + if (event.target.document.nodeType === Node.DOCUMENT_NODE) + document.body.classList.remove("inactive"); + }, false); + document.defaultView.addEventListener("blur", (event) => { + document.body.classList.add("inactive"); + }, false); + const prefersDarkScheme = window.matchMedia("(prefers-color-scheme: dark)"); + const defaultTheme = prefersDarkScheme.matches ? "dark-mode" : "light-mode"; + const currentTheme2 = settings.getString("theme", defaultTheme); + if (currentTheme2 === "dark-mode") + document.body.classList.add("dark-mode"); +} +const listeners = /* @__PURE__ */ new Set(); +function toggleTheme() { + const oldTheme = currentTheme(); + const newTheme = oldTheme === "dark-mode" ? "light-mode" : "dark-mode"; + if (oldTheme) + document.body.classList.remove(oldTheme); + document.body.classList.add(newTheme); + settings.setString("theme", newTheme); + for (const listener of listeners) + listener(newTheme); +} +function currentTheme() { + return document.body.classList.contains("dark-mode") ? "dark-mode" : "light-mode"; +} +const Toolbar = ({ + noShadow, + children, + noMinHeight, + className, + sidebarBackground, + onClick +}) => { + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("toolbar", noShadow && "no-shadow", noMinHeight && "no-min-height", className, sidebarBackground && "toolbar-sidebar-background"), onClick, children }); +}; +const ToolbarButton = reactExports.forwardRef(function ToolbarButton2({ + children, + title = "", + icon, + disabled = false, + toggled = false, + onClick = () => { + }, + style, + testId, + className, + ariaLabel +}, ref) { + return /* @__PURE__ */ jsxRuntimeExports.jsxs( + "button", + { + ref, + className: clsx(className, "toolbar-button", icon, toggled && "toggled"), + onMouseDown: preventDefault, + onClick, + onDoubleClick: preventDefault, + title, + disabled: !!disabled, + style, + "data-testid": testId, + "aria-label": ariaLabel || title, + children: [ + icon && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `codicon codicon-${icon}`, style: children ? { marginRight: 5 } : {} }), + children + ] + } + ); +}); +const ToolbarSeparator = ({ + style +}) => { + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "toolbar-separator", style }); +}; +const preventDefault = (e) => { + e.stopPropagation(); + e.preventDefault(); +}; +const Dialog = ({ isOpen, onClose, title, children }) => { + if (!isOpen) + return null; + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "dialog-overlay", role: "dialog", "aria-label": title, onClick: onClose, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "dialog-box", onClick: (e) => e.stopPropagation(), children: [ + /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "dialog-header", children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: title }), + /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "dialog-close", onClick: onClose, children: "×" }) + ] }), + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "dialog-content", children }) + ] }) }); +}; +const scriptRel = "modulepreload"; +const assetsURL = function(dep) { + return "/" + dep; +}; +const seen = {}; +const __vitePreload = function preload(baseModule, deps, importerUrl) { + let promise = Promise.resolve(); + if (deps && deps.length > 0) { + let allSettled2 = function(promises) { + return Promise.all( + promises.map( + (p) => Promise.resolve(p).then( + (value) => ({ status: "fulfilled", value }), + (reason) => ({ status: "rejected", reason }) + ) + ) + ); + }; + document.getElementsByTagName("link"); + const cspNonceMeta = document.querySelector( + "meta[property=csp-nonce]" + ); + const cspNonce = (cspNonceMeta == null ? void 0 : cspNonceMeta.nonce) || (cspNonceMeta == null ? void 0 : cspNonceMeta.getAttribute("nonce")); + promise = allSettled2( + deps.map((dep) => { + dep = assetsURL(dep); + if (dep in seen) return; + seen[dep] = true; + const isCss = dep.endsWith(".css"); + const cssSelector = isCss ? '[rel="stylesheet"]' : ""; + if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) { + return; + } + const link = document.createElement("link"); + link.rel = isCss ? "stylesheet" : scriptRel; + if (!isCss) { + link.as = "script"; + } + link.crossOrigin = ""; + link.href = dep; + if (cspNonce) { + link.setAttribute("nonce", cspNonce); + } + document.head.appendChild(link); + if (isCss) { + return new Promise((res, rej) => { + link.addEventListener("load", res); + link.addEventListener( + "error", + () => rej(new Error(`Unable to preload CSS for ${dep}`)) + ); + }); + } + }) + ); + } + function handlePreloadError(err) { + const e = new Event("vite:preloadError", { + cancelable: true + }); + e.payload = err; + window.dispatchEvent(e); + if (!e.defaultPrevented) { + throw err; + } + } + return promise.then((res) => { + for (const item of res || []) { + if (item.status !== "rejected") continue; + handlePreloadError(item.reason); + } + return baseModule().catch(handlePreloadError); + }); +}; +function ansi2html(text, defaultColors) { + const regex = /(\x1b\[(\d+(;\d+)*)m)|([^\x1b]+)/g; + const tokens = []; + let match; + let style = {}; + let reverse = false; + let fg = defaultColors == null ? void 0 : defaultColors.fg; + let bg = defaultColors == null ? void 0 : defaultColors.bg; + while ((match = regex.exec(text)) !== null) { + const [, , codeStr, , text2] = match; + if (codeStr) { + const code = +codeStr; + switch (code) { + case 0: + style = {}; + break; + case 1: + style["font-weight"] = "bold"; + break; + case 2: + style["opacity"] = "0.8"; + break; + case 3: + style["font-style"] = "italic"; + break; + case 4: + style["text-decoration"] = "underline"; + break; + case 7: + reverse = true; + break; + case 8: + style.display = "none"; + break; + case 9: + style["text-decoration"] = "line-through"; + break; + case 22: + delete style["font-weight"]; + delete style["font-style"]; + delete style["opacity"]; + delete style["text-decoration"]; + break; + case 23: + delete style["font-weight"]; + delete style["font-style"]; + delete style["opacity"]; + break; + case 24: + delete style["text-decoration"]; + break; + case 27: + reverse = false; + break; + case 30: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + fg = ansiColors[code - 30]; + break; + case 39: + fg = defaultColors == null ? void 0 : defaultColors.fg; + break; + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + bg = ansiColors[code - 40]; + break; + case 49: + bg = defaultColors == null ? void 0 : defaultColors.bg; + break; + case 53: + style["text-decoration"] = "overline"; + break; + case 90: + case 91: + case 92: + case 93: + case 94: + case 95: + case 96: + case 97: + fg = brightAnsiColors[code - 90]; + break; + case 100: + case 101: + case 102: + case 103: + case 104: + case 105: + case 106: + case 107: + bg = brightAnsiColors[code - 100]; + break; + } + } else if (text2) { + const styleCopy = { ...style }; + const color = reverse ? bg : fg; + if (color !== void 0) + styleCopy["color"] = color; + const backgroundColor = reverse ? fg : bg; + if (backgroundColor !== void 0) + styleCopy["background-color"] = backgroundColor; + tokens.push(`${escapeHTML(text2)}`); + } + } + return tokens.join(""); +} +const ansiColors = { + 0: "var(--vscode-terminal-ansiBlack)", + 1: "var(--vscode-terminal-ansiRed)", + 2: "var(--vscode-terminal-ansiGreen)", + 3: "var(--vscode-terminal-ansiYellow)", + 4: "var(--vscode-terminal-ansiBlue)", + 5: "var(--vscode-terminal-ansiMagenta)", + 6: "var(--vscode-terminal-ansiCyan)", + 7: "var(--vscode-terminal-ansiWhite)" +}; +const brightAnsiColors = { + 0: "var(--vscode-terminal-ansiBrightBlack)", + 1: "var(--vscode-terminal-ansiBrightRed)", + 2: "var(--vscode-terminal-ansiBrightGreen)", + 3: "var(--vscode-terminal-ansiBrightYellow)", + 4: "var(--vscode-terminal-ansiBrightBlue)", + 5: "var(--vscode-terminal-ansiBrightMagenta)", + 6: "var(--vscode-terminal-ansiBrightCyan)", + 7: "var(--vscode-terminal-ansiBrightWhite)" +}; +function escapeHTML(text) { + return text.replace(/[&"<>]/g, (c) => ({ "&": "&", '"': """, "<": "<", ">": ">" })[c]); +} +function styleBody(style) { + return Object.entries(style).map(([name, value]) => `${name}: ${value}`).join("; "); +} +const CodeMirrorWrapper = ({ + text, + language, + mimeType, + linkify, + readOnly, + highlight, + revealLine, + lineNumbers, + isFocused, + focusOnChange, + wrapLines, + onChange, + onCursorActivity, + dataTestId, + placeholder +}) => { + const [measure, codemirrorElement] = useMeasure(); + const [modulePromise] = reactExports.useState(__vitePreload(() => import("./codeMirrorModule.js"), true ? __vite__mapDeps([0,1,2,3,4]) : void 0).then((m) => m.default)); + const codemirrorRef = reactExports.useRef(null); + const [codemirror, setCodemirror] = reactExports.useState(); + reactExports.useEffect(() => { + (async () => { + var _a, _b; + const CodeMirror = await modulePromise; + defineCustomMode(CodeMirror); + const element = codemirrorElement.current; + if (!element) + return; + const mode = languageToMode(language) || mimeTypeToMode(mimeType) || (linkify ? "text/linkified" : ""); + if (codemirrorRef.current && mode === codemirrorRef.current.cm.getOption("mode") && !!readOnly === codemirrorRef.current.cm.getOption("readOnly") && lineNumbers === codemirrorRef.current.cm.getOption("lineNumbers") && wrapLines === codemirrorRef.current.cm.getOption("lineWrapping") && placeholder === codemirrorRef.current.cm.getOption("placeholder")) { + return; + } + (_b = (_a = codemirrorRef.current) == null ? void 0 : _a.cm) == null ? void 0 : _b.getWrapperElement().remove(); + const cm = CodeMirror(element, { + value: "", + mode, + readOnly: !!readOnly, + lineNumbers, + lineWrapping: wrapLines, + placeholder + }); + codemirrorRef.current = { cm }; + if (isFocused) + cm.focus(); + setCodemirror(cm); + return cm; + })(); + }, [modulePromise, codemirror, codemirrorElement, language, mimeType, linkify, lineNumbers, wrapLines, readOnly, isFocused, placeholder]); + reactExports.useEffect(() => { + if (codemirrorRef.current) + codemirrorRef.current.cm.setSize(measure.width, measure.height); + }, [measure]); + reactExports.useLayoutEffect(() => { + var _a; + if (!codemirror) + return; + let valueChanged = false; + if (codemirror.getValue() !== text) { + codemirror.setValue(text); + valueChanged = true; + if (focusOnChange) { + codemirror.execCommand("selectAll"); + codemirror.focus(); + } + } + if (valueChanged || JSON.stringify(highlight) !== JSON.stringify(codemirrorRef.current.highlight)) { + for (const h of codemirrorRef.current.highlight || []) + codemirror.removeLineClass(h.line - 1, "wrap"); + for (const h of highlight || []) + codemirror.addLineClass(h.line - 1, "wrap", `source-line-${h.type}`); + for (const w of codemirrorRef.current.widgets || []) + codemirror.removeLineWidget(w); + for (const m of codemirrorRef.current.markers || []) + m.clear(); + const widgets = []; + const markers = []; + for (const h of highlight || []) { + if (h.type !== "subtle-error" && h.type !== "error") + continue; + const line = (_a = codemirrorRef.current) == null ? void 0 : _a.cm.getLine(h.line - 1); + if (line) { + const attributes = {}; + attributes["title"] = h.message || ""; + markers.push(codemirror.markText( + { line: h.line - 1, ch: 0 }, + { line: h.line - 1, ch: h.column || line.length }, + { className: "source-line-error-underline", attributes } + )); + } + if (h.type === "error") { + const errorWidgetElement = document.createElement("div"); + errorWidgetElement.innerHTML = ansi2html(h.message || ""); + errorWidgetElement.className = "source-line-error-widget"; + widgets.push(codemirror.addLineWidget(h.line, errorWidgetElement, { above: true, coverGutter: false })); + } + } + codemirrorRef.current.highlight = highlight; + codemirrorRef.current.widgets = widgets; + codemirrorRef.current.markers = markers; + } + if (typeof revealLine === "number" && codemirrorRef.current.cm.lineCount() >= revealLine) + codemirror.scrollIntoView({ line: Math.max(0, revealLine - 1), ch: 0 }, 50); + let changeListener; + if (onChange) { + changeListener = () => onChange(codemirror.getValue()); + codemirror.on("change", changeListener); + } + let cursorActivityListener; + if (onCursorActivity) { + cursorActivityListener = () => { + if (codemirrorRef.current.cm.hasFocus()) + onCursorActivity(codemirrorRef.current.cm.getCursor()); + }; + codemirror.on("cursorActivity", cursorActivityListener); + } + return () => { + if (changeListener) + codemirror.off("change", changeListener); + if (cursorActivityListener) + codemirror.off("cursorActivity", cursorActivityListener); + }; + }, [codemirror, text, highlight, revealLine, focusOnChange, onChange, onCursorActivity]); + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "data-testid": dataTestId, className: "cm-wrapper", ref: codemirrorElement, onClick: onCodeMirrorClick }); +}; +function onCodeMirrorClick(event) { + var _a; + if (!(event.target instanceof HTMLElement)) + return; + let url; + if (event.target.classList.contains("cm-linkified")) { + url = event.target.textContent; + } else if (event.target.classList.contains("cm-link") && ((_a = event.target.nextElementSibling) == null ? void 0 : _a.classList.contains("cm-url"))) { + url = event.target.nextElementSibling.textContent.slice(1, -1); + } + if (url) { + event.preventDefault(); + event.stopPropagation(); + window.open(url, "_blank"); + } +} +let customModeDefined = false; +function defineCustomMode(cm) { + if (customModeDefined) + return; + customModeDefined = true; + cm.defineSimpleMode("text/linkified", { + start: [ + { regex: kWebLinkRe, token: "linkified" } + ] + }); +} +function mimeTypeToMode(mimeType) { + if (!mimeType) + return; + if (mimeType.includes("javascript") || mimeType.includes("json")) + return "javascript"; + if (mimeType.includes("python")) + return "python"; + if (mimeType.includes("csharp")) + return "text/x-csharp"; + if (mimeType.includes("java")) + return "text/x-java"; + if (mimeType.includes("markdown")) + return "markdown"; + if (mimeType.includes("html") || mimeType.includes("svg")) + return "htmlmixed"; + if (mimeType.includes("css")) + return "css"; +} +function languageToMode(language) { + if (!language) + return; + return { + javascript: "javascript", + jsonl: "javascript", + python: "python", + csharp: "text/x-csharp", + java: "text/x-java", + markdown: "markdown", + html: "htmlmixed", + css: "css", + yaml: "yaml" + }[language]; +} +const kMinSize = 50; +const SplitView = ({ + sidebarSize, + sidebarHidden = false, + sidebarIsFirst = false, + orientation = "vertical", + minSidebarSize = kMinSize, + settingName, + sidebar, + main +}) => { + const defaultSize = Math.max(minSidebarSize, sidebarSize) * window.devicePixelRatio; + const [hSize, setHSize] = useSetting(settingName ? settingName + "." + orientation + ":size" : void 0, defaultSize); + const [vSize, setVSize] = useSetting(settingName ? settingName + "." + orientation + ":size" : void 0, defaultSize); + const [resizing, setResizing] = reactExports.useState(null); + const [measure, ref] = useMeasure(); + let size; + if (orientation === "vertical") { + size = vSize / window.devicePixelRatio; + if (measure && measure.height < size) + size = measure.height - 10; + } else { + size = hSize / window.devicePixelRatio; + if (measure && measure.width < size) + size = measure.width - 10; + } + document.body.style.userSelect = resizing ? "none" : "inherit"; + let resizerStyle = {}; + if (orientation === "vertical") { + if (sidebarIsFirst) + resizerStyle = { top: resizing ? 0 : size - 4, bottom: resizing ? 0 : void 0, height: resizing ? "initial" : 8 }; + else + resizerStyle = { bottom: resizing ? 0 : size - 4, top: resizing ? 0 : void 0, height: resizing ? "initial" : 8 }; + } else { + if (sidebarIsFirst) + resizerStyle = { left: resizing ? 0 : size - 4, right: resizing ? 0 : void 0, width: resizing ? "initial" : 8 }; + else + resizerStyle = { right: resizing ? 0 : size - 4, left: resizing ? 0 : void 0, width: resizing ? "initial" : 8 }; + } + return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("split-view", orientation, sidebarIsFirst && "sidebar-first"), ref, children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "split-view-main", children: main }), + !sidebarHidden && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { flexBasis: size }, className: "split-view-sidebar", children: sidebar }), + !sidebarHidden && /* @__PURE__ */ jsxRuntimeExports.jsx( + "div", + { + style: resizerStyle, + className: "split-view-resizer", + onMouseDown: (event) => setResizing({ offset: orientation === "vertical" ? event.clientY : event.clientX, size }), + onMouseUp: () => setResizing(null), + onMouseMove: (event) => { + if (!event.buttons) { + setResizing(null); + } else if (resizing) { + const offset = orientation === "vertical" ? event.clientY : event.clientX; + const delta = offset - resizing.offset; + const newSize = sidebarIsFirst ? resizing.size + delta : resizing.size - delta; + const splitView = event.target.parentElement; + const rect = splitView.getBoundingClientRect(); + const size2 = Math.min(Math.max(minSidebarSize, newSize), (orientation === "vertical" ? rect.height : rect.width) - minSidebarSize); + if (orientation === "vertical") + setVSize(size2 * window.devicePixelRatio); + else + setHSize(size2 * window.devicePixelRatio); + } + } + } + ) + ] }); +}; +const TabbedPane = ({ tabs, selectedTab, setSelectedTab, leftToolbar, rightToolbar, dataTestId, mode }) => { + const id = reactExports.useId(); + if (!selectedTab) + selectedTab = tabs[0].id; + if (!mode) + mode = "default"; + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "tabbed-pane", "data-testid": dataTestId, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox", children: [ + /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { children: [ + leftToolbar && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { flex: "none", display: "flex", margin: "0 4px", alignItems: "center" }, children: [ + ...leftToolbar + ] }), + mode === "default" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { flex: "auto", display: "flex", height: "100%", overflow: "hidden" }, role: "tablist", children: [ + ...tabs.map((tab) => /* @__PURE__ */ jsxRuntimeExports.jsx( + TabbedPaneTab, + { + id: tab.id, + ariaControls: `${id}-${tab.id}`, + title: tab.title, + count: tab.count, + errorCount: tab.errorCount, + selected: selectedTab === tab.id, + onSelect: setSelectedTab + }, + tab.id + )) + ] }), + mode === "select" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { flex: "auto", display: "flex", height: "100%", overflow: "hidden" }, role: "tablist", children: /* @__PURE__ */ jsxRuntimeExports.jsx("select", { style: { width: "100%", background: "none", cursor: "pointer" }, value: selectedTab, onChange: (e) => { + setSelectedTab == null ? void 0 : setSelectedTab(tabs[e.currentTarget.selectedIndex].id); + }, children: tabs.map((tab) => { + let suffix = ""; + if (tab.count) + suffix = ` (${tab.count})`; + if (tab.errorCount) + suffix = ` (${tab.errorCount})`; + return /* @__PURE__ */ jsxRuntimeExports.jsxs("option", { value: tab.id, role: "tab", "aria-controls": `${id}-${tab.id}`, children: [ + tab.title, + suffix + ] }, tab.id); + }) }) }), + rightToolbar && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { flex: "none", display: "flex", alignItems: "center" }, children: [ + ...rightToolbar + ] }) + ] }), + tabs.map((tab) => { + const className = "tab-content tab-" + tab.id; + if (tab.component) + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { id: `${id}-${tab.id}`, role: "tabpanel", "aria-label": tab.title, className, style: { display: selectedTab === tab.id ? "inherit" : "none" }, children: tab.component }, tab.id); + if (selectedTab === tab.id) + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { id: `${id}-${tab.id}`, role: "tabpanel", "aria-label": tab.title, className, children: tab.render() }, tab.id); + }) + ] }) }); +}; +const TabbedPaneTab = ({ id, title, count, errorCount, selected, onSelect, ariaControls }) => { + return /* @__PURE__ */ jsxRuntimeExports.jsxs( + "div", + { + className: clsx("tabbed-pane-tab", selected && "selected"), + onClick: () => onSelect == null ? void 0 : onSelect(id), + role: "tab", + title, + "aria-controls": ariaControls, + children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "tabbed-pane-tab-label", children: title }), + !!count && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "tabbed-pane-tab-counter", children: count }), + !!errorCount && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "tabbed-pane-tab-counter error", children: errorCount }) + ] + } + ); +}; +const SourceChooser = ({ sources, fileId, setFileId }) => { + return /* @__PURE__ */ jsxRuntimeExports.jsx("select", { className: "source-chooser", hidden: !sources.length, title: "Source chooser", value: fileId, onChange: (event) => { + setFileId(event.target.selectedOptions[0].value); + }, children: renderSourceOptions(sources) }); +}; +function renderSourceOptions(sources) { + const transformTitle = (title) => title.replace(/.*[/\\]([^/\\]+)/, "$1"); + const renderOption = (source) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: source.id, children: transformTitle(source.label) }, source.id); + const sourcesByGroups = /* @__PURE__ */ new Map(); + for (const source of sources) { + let list = sourcesByGroups.get(source.group || "Debugger"); + if (!list) { + list = []; + sourcesByGroups.set(source.group || "Debugger", list); + } + list.push(source); + } + return [...sourcesByGroups.entries()].map(([group, sources2]) => /* @__PURE__ */ jsxRuntimeExports.jsx("optgroup", { label: group, children: sources2.filter((s) => (s.group || "Debugger") === group).map((source) => renderOption(source)) }, group)); +} +function emptySource() { + return { + id: "default", + isRecorded: false, + text: "", + language: "javascript", + label: "", + highlight: [] + }; +} +const between = function(num, first, last) { + return num >= first && num <= last; +}; +function digit(code) { + return between(code, 48, 57); +} +function hexdigit(code) { + return digit(code) || between(code, 65, 70) || between(code, 97, 102); +} +function uppercaseletter(code) { + return between(code, 65, 90); +} +function lowercaseletter(code) { + return between(code, 97, 122); +} +function letter(code) { + return uppercaseletter(code) || lowercaseletter(code); +} +function nonascii(code) { + return code >= 128; +} +function namestartchar(code) { + return letter(code) || nonascii(code) || code === 95; +} +function namechar(code) { + return namestartchar(code) || digit(code) || code === 45; +} +function nonprintable(code) { + return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127; +} +function newline(code) { + return code === 10; +} +function whitespace(code) { + return newline(code) || code === 9 || code === 32; +} +const maximumallowedcodepoint = 1114111; +class InvalidCharacterError extends Error { + constructor(message) { + super(message); + this.name = "InvalidCharacterError"; + } +} +function preprocess(str) { + const codepoints = []; + for (let i = 0; i < str.length; i++) { + let code = str.charCodeAt(i); + if (code === 13 && str.charCodeAt(i + 1) === 10) { + code = 10; + i++; + } + if (code === 13 || code === 12) + code = 10; + if (code === 0) + code = 65533; + if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) { + const lead = code - 55296; + const trail = str.charCodeAt(i + 1) - 56320; + code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail; + i++; + } + codepoints.push(code); + } + return codepoints; +} +function stringFromCode(code) { + if (code <= 65535) + return String.fromCharCode(code); + code -= Math.pow(2, 16); + const lead = Math.floor(code / Math.pow(2, 10)) + 55296; + const trail = code % Math.pow(2, 10) + 56320; + return String.fromCharCode(lead) + String.fromCharCode(trail); +} +function tokenize(str1) { + const str = preprocess(str1); + let i = -1; + const tokens = []; + let code; + const codepoint = function(i2) { + if (i2 >= str.length) + return -1; + return str[i2]; + }; + const next = function(num) { + if (num === void 0) + num = 1; + if (num > 3) + throw "Spec Error: no more than three codepoints of lookahead."; + return codepoint(i + num); + }; + const consume = function(num) { + if (num === void 0) + num = 1; + i += num; + code = codepoint(i); + return true; + }; + const reconsume = function() { + i -= 1; + return true; + }; + const eof = function(codepoint2) { + if (codepoint2 === void 0) + codepoint2 = code; + return codepoint2 === -1; + }; + const consumeAToken = function() { + consumeComments(); + consume(); + if (whitespace(code)) { + while (whitespace(next())) + consume(); + return new WhitespaceToken(); + } else if (code === 34) { + return consumeAStringToken(); + } else if (code === 35) { + if (namechar(next()) || areAValidEscape(next(1), next(2))) { + const token = new HashToken(""); + if (wouldStartAnIdentifier(next(1), next(2), next(3))) + token.type = "id"; + token.value = consumeAName(); + return token; + } else { + return new DelimToken(code); + } + } else if (code === 36) { + if (next() === 61) { + consume(); + return new SuffixMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 39) { + return consumeAStringToken(); + } else if (code === 40) { + return new OpenParenToken(); + } else if (code === 41) { + return new CloseParenToken(); + } else if (code === 42) { + if (next() === 61) { + consume(); + return new SubstringMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 43) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else { + return new DelimToken(code); + } + } else if (code === 44) { + return new CommaToken(); + } else if (code === 45) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else if (next(1) === 45 && next(2) === 62) { + consume(2); + return new CDCToken(); + } else if (startsWithAnIdentifier()) { + reconsume(); + return consumeAnIdentlikeToken(); + } else { + return new DelimToken(code); + } + } else if (code === 46) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else { + return new DelimToken(code); + } + } else if (code === 58) { + return new ColonToken(); + } else if (code === 59) { + return new SemicolonToken(); + } else if (code === 60) { + if (next(1) === 33 && next(2) === 45 && next(3) === 45) { + consume(3); + return new CDOToken(); + } else { + return new DelimToken(code); + } + } else if (code === 64) { + if (wouldStartAnIdentifier(next(1), next(2), next(3))) + return new AtKeywordToken(consumeAName()); + else + return new DelimToken(code); + } else if (code === 91) { + return new OpenSquareToken(); + } else if (code === 92) { + if (startsWithAValidEscape()) { + reconsume(); + return consumeAnIdentlikeToken(); + } else { + return new DelimToken(code); + } + } else if (code === 93) { + return new CloseSquareToken(); + } else if (code === 94) { + if (next() === 61) { + consume(); + return new PrefixMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 123) { + return new OpenCurlyToken(); + } else if (code === 124) { + if (next() === 61) { + consume(); + return new DashMatchToken(); + } else if (next() === 124) { + consume(); + return new ColumnToken(); + } else { + return new DelimToken(code); + } + } else if (code === 125) { + return new CloseCurlyToken(); + } else if (code === 126) { + if (next() === 61) { + consume(); + return new IncludeMatchToken(); + } else { + return new DelimToken(code); + } + } else if (digit(code)) { + reconsume(); + return consumeANumericToken(); + } else if (namestartchar(code)) { + reconsume(); + return consumeAnIdentlikeToken(); + } else if (eof()) { + return new EOFToken(); + } else { + return new DelimToken(code); + } + }; + const consumeComments = function() { + while (next(1) === 47 && next(2) === 42) { + consume(2); + while (true) { + consume(); + if (code === 42 && next() === 47) { + consume(); + break; + } else if (eof()) { + return; + } + } + } + }; + const consumeANumericToken = function() { + const num = consumeANumber(); + if (wouldStartAnIdentifier(next(1), next(2), next(3))) { + const token = new DimensionToken(); + token.value = num.value; + token.repr = num.repr; + token.type = num.type; + token.unit = consumeAName(); + return token; + } else if (next() === 37) { + consume(); + const token = new PercentageToken(); + token.value = num.value; + token.repr = num.repr; + return token; + } else { + const token = new NumberToken(); + token.value = num.value; + token.repr = num.repr; + token.type = num.type; + return token; + } + }; + const consumeAnIdentlikeToken = function() { + const str2 = consumeAName(); + if (str2.toLowerCase() === "url" && next() === 40) { + consume(); + while (whitespace(next(1)) && whitespace(next(2))) + consume(); + if (next() === 34 || next() === 39) + return new FunctionToken(str2); + else if (whitespace(next()) && (next(2) === 34 || next(2) === 39)) + return new FunctionToken(str2); + else + return consumeAURLToken(); + } else if (next() === 40) { + consume(); + return new FunctionToken(str2); + } else { + return new IdentToken(str2); + } + }; + const consumeAStringToken = function(endingCodePoint) { + if (endingCodePoint === void 0) + endingCodePoint = code; + let string2 = ""; + while (consume()) { + if (code === endingCodePoint || eof()) { + return new StringToken(string2); + } else if (newline(code)) { + reconsume(); + return new BadStringToken(); + } else if (code === 92) { + if (eof(next())) + ; + else if (newline(next())) + consume(); + else + string2 += stringFromCode(consumeEscape()); + } else { + string2 += stringFromCode(code); + } + } + throw new Error("Internal error"); + }; + const consumeAURLToken = function() { + const token = new URLToken(""); + while (whitespace(next())) + consume(); + if (eof(next())) + return token; + while (consume()) { + if (code === 41 || eof()) { + return token; + } else if (whitespace(code)) { + while (whitespace(next())) + consume(); + if (next() === 41 || eof(next())) { + consume(); + return token; + } else { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } + } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } else if (code === 92) { + if (startsWithAValidEscape()) { + token.value += stringFromCode(consumeEscape()); + } else { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } + } else { + token.value += stringFromCode(code); + } + } + throw new Error("Internal error"); + }; + const consumeEscape = function() { + consume(); + if (hexdigit(code)) { + const digits = [code]; + for (let total = 0; total < 5; total++) { + if (hexdigit(next())) { + consume(); + digits.push(code); + } else { + break; + } + } + if (whitespace(next())) + consume(); + let value = parseInt(digits.map(function(x) { + return String.fromCharCode(x); + }).join(""), 16); + if (value > maximumallowedcodepoint) + value = 65533; + return value; + } else if (eof()) { + return 65533; + } else { + return code; + } + }; + const areAValidEscape = function(c1, c2) { + if (c1 !== 92) + return false; + if (newline(c2)) + return false; + return true; + }; + const startsWithAValidEscape = function() { + return areAValidEscape(code, next()); + }; + const wouldStartAnIdentifier = function(c1, c2, c3) { + if (c1 === 45) + return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3); + else if (namestartchar(c1)) + return true; + else if (c1 === 92) + return areAValidEscape(c1, c2); + else + return false; + }; + const startsWithAnIdentifier = function() { + return wouldStartAnIdentifier(code, next(1), next(2)); + }; + const wouldStartANumber = function(c1, c2, c3) { + if (c1 === 43 || c1 === 45) { + if (digit(c2)) + return true; + if (c2 === 46 && digit(c3)) + return true; + return false; + } else if (c1 === 46) { + if (digit(c2)) + return true; + return false; + } else if (digit(c1)) { + return true; + } else { + return false; + } + }; + const startsWithANumber = function() { + return wouldStartANumber(code, next(1), next(2)); + }; + const consumeAName = function() { + let result = ""; + while (consume()) { + if (namechar(code)) { + result += stringFromCode(code); + } else if (startsWithAValidEscape()) { + result += stringFromCode(consumeEscape()); + } else { + reconsume(); + return result; + } + } + throw new Error("Internal parse error"); + }; + const consumeANumber = function() { + let repr = ""; + let type = "integer"; + if (next() === 43 || next() === 45) { + consume(); + repr += stringFromCode(code); + } + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + if (next(1) === 46 && digit(next(2))) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } + const c1 = next(1), c2 = next(2), c3 = next(3); + if ((c1 === 69 || c1 === 101) && digit(c2)) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } + const value = convertAStringToANumber(repr); + return { type, value, repr }; + }; + const convertAStringToANumber = function(string2) { + return +string2; + }; + const consumeTheRemnantsOfABadURL = function() { + while (consume()) { + if (code === 41 || eof()) { + return; + } else if (startsWithAValidEscape()) { + consumeEscape(); + } else ; + } + }; + let iterationCount = 0; + while (!eof(next())) { + tokens.push(consumeAToken()); + iterationCount++; + if (iterationCount > str.length * 2) + throw new Error("I'm infinite-looping!"); + } + return tokens; +} +class CSSParserToken { + constructor() { + this.tokenType = ""; + } + toJSON() { + return { token: this.tokenType }; + } + toString() { + return this.tokenType; + } + toSource() { + return "" + this; + } +} +class BadStringToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "BADSTRING"; + } +} +class BadURLToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "BADURL"; + } +} +class WhitespaceToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "WHITESPACE"; + } + toString() { + return "WS"; + } + toSource() { + return " "; + } +} +class CDOToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "CDO"; + } + toSource() { + return ""; + } +} +class ColonToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ":"; + } +} +class SemicolonToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ";"; + } +} +class CommaToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ","; + } +} +class GroupingToken extends CSSParserToken { + constructor() { + super(...arguments); + this.value = ""; + this.mirror = ""; + } +} +class OpenCurlyToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "{"; + this.value = "{"; + this.mirror = "}"; + } +} +class CloseCurlyToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "}"; + this.value = "}"; + this.mirror = "{"; + } +} +class OpenSquareToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "["; + this.value = "["; + this.mirror = "]"; + } +} +class CloseSquareToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "]"; + this.value = "]"; + this.mirror = "["; + } +} +class OpenParenToken extends GroupingToken { + constructor() { + super(); + this.tokenType = "("; + this.value = "("; + this.mirror = ")"; + } +} +class CloseParenToken extends GroupingToken { + constructor() { + super(); + this.tokenType = ")"; + this.value = ")"; + this.mirror = "("; + } +} +class IncludeMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "~="; + } +} +class DashMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "|="; + } +} +class PrefixMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "^="; + } +} +class SuffixMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "$="; + } +} +class SubstringMatchToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "*="; + } +} +class ColumnToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "||"; + } +} +class EOFToken extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "EOF"; + } + toSource() { + return ""; + } +} +class DelimToken extends CSSParserToken { + constructor(code) { + super(); + this.tokenType = "DELIM"; + this.value = ""; + this.value = stringFromCode(code); + } + toString() { + return "DELIM(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + return json; + } + toSource() { + if (this.value === "\\") + return "\\\n"; + else + return this.value; + } +} +class StringValuedToken extends CSSParserToken { + constructor() { + super(...arguments); + this.value = ""; + } + ASCIIMatch(str) { + return this.value.toLowerCase() === str.toLowerCase(); + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + return json; + } +} +class IdentToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "IDENT"; + this.value = val; + } + toString() { + return "IDENT(" + this.value + ")"; + } + toSource() { + return escapeIdent(this.value); + } +} +class FunctionToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "FUNCTION"; + this.value = val; + this.mirror = ")"; + } + toString() { + return "FUNCTION(" + this.value + ")"; + } + toSource() { + return escapeIdent(this.value) + "("; + } +} +class AtKeywordToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "AT-KEYWORD"; + this.value = val; + } + toString() { + return "AT(" + this.value + ")"; + } + toSource() { + return "@" + escapeIdent(this.value); + } +} +class HashToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "HASH"; + this.value = val; + this.type = "unrestricted"; + } + toString() { + return "HASH(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.type = this.type; + return json; + } + toSource() { + if (this.type === "id") + return "#" + escapeIdent(this.value); + else + return "#" + escapeHash(this.value); + } +} +class StringToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "STRING"; + this.value = val; + } + toString() { + return '"' + escapeString(this.value) + '"'; + } +} +class URLToken extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "URL"; + this.value = val; + } + toString() { + return "URL(" + this.value + ")"; + } + toSource() { + return 'url("' + escapeString(this.value) + '")'; + } +} +class NumberToken extends CSSParserToken { + constructor() { + super(); + this.tokenType = "NUMBER"; + this.type = "integer"; + this.repr = ""; + } + toString() { + if (this.type === "integer") + return "INT(" + this.value + ")"; + return "NUMBER(" + this.value + ")"; + } + toJSON() { + const json = super.toJSON(); + json.value = this.value; + json.type = this.type; + json.repr = this.repr; + return json; + } + toSource() { + return this.repr; + } +} +class PercentageToken extends CSSParserToken { + constructor() { + super(); + this.tokenType = "PERCENTAGE"; + this.repr = ""; + } + toString() { + return "PERCENTAGE(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.repr = this.repr; + return json; + } + toSource() { + return this.repr + "%"; + } +} +class DimensionToken extends CSSParserToken { + constructor() { + super(); + this.tokenType = "DIMENSION"; + this.type = "integer"; + this.repr = ""; + this.unit = ""; + } + toString() { + return "DIM(" + this.value + "," + this.unit + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.type = this.type; + json.repr = this.repr; + json.unit = this.unit; + return json; + } + toSource() { + const source = this.repr; + let unit = escapeIdent(this.unit); + if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) { + unit = "\\65 " + unit.slice(1, unit.length); + } + return source + unit; + } +} +function escapeIdent(string2) { + string2 = "" + string2; + let result = ""; + const firstcode = string2.charCodeAt(0); + for (let i = 0; i < string2.length; i++) { + const code = string2.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45) + result += "\\" + code.toString(16) + " "; + else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122)) + result += string2[i]; + else + result += "\\" + string2[i]; + } + return result; +} +function escapeHash(string2) { + string2 = "" + string2; + let result = ""; + for (let i = 0; i < string2.length; i++) { + const code = string2.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122)) + result += string2[i]; + else + result += "\\" + code.toString(16) + " "; + } + return result; +} +function escapeString(string2) { + string2 = "" + string2; + let result = ""; + for (let i = 0; i < string2.length; i++) { + const code = string2.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (between(code, 1, 31) || code === 127) + result += "\\" + code.toString(16) + " "; + else if (code === 34 || code === 92) + result += "\\" + string2[i]; + else + result += string2[i]; + } + return result; +} +class InvalidSelectorError extends Error { +} +function parseCSS(selector, customNames) { + let tokens; + try { + tokens = tokenize(selector); + if (!(tokens[tokens.length - 1] instanceof EOFToken)) + tokens.push(new EOFToken()); + } catch (e) { + const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`; + const index = (e.stack || "").indexOf(e.message); + if (index !== -1) + e.stack = e.stack.substring(0, index) + newMessage + e.stack.substring(index + e.message.length); + e.message = newMessage; + throw e; + } + const unsupportedToken = tokens.find((token) => { + return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings. + // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz } + // Or this way :xpath( {complex-xpath-goes-here("hello")} ) + token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings? + token instanceof URLToken || token instanceof PercentageToken; + }); + if (unsupportedToken) + throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + let pos = 0; + const names = /* @__PURE__ */ new Set(); + function unexpected() { + return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + } + function skipWhitespace() { + while (tokens[pos] instanceof WhitespaceToken) + pos++; + } + function isIdent(p = pos) { + return tokens[p] instanceof IdentToken; + } + function isString(p = pos) { + return tokens[p] instanceof StringToken; + } + function isNumber(p = pos) { + return tokens[p] instanceof NumberToken; + } + function isComma(p = pos) { + return tokens[p] instanceof CommaToken; + } + function isOpenParen(p = pos) { + return tokens[p] instanceof OpenParenToken; + } + function isCloseParen(p = pos) { + return tokens[p] instanceof CloseParenToken; + } + function isFunction(p = pos) { + return tokens[p] instanceof FunctionToken; + } + function isStar(p = pos) { + return tokens[p] instanceof DelimToken && tokens[p].value === "*"; + } + function isEOF(p = pos) { + return tokens[p] instanceof EOFToken; + } + function isClauseCombinator(p = pos) { + return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value); + } + function isSelectorClauseEnd(p = pos) { + return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken; + } + function consumeFunctionArguments() { + const result2 = [consumeArgument()]; + while (true) { + skipWhitespace(); + if (!isComma()) + break; + pos++; + result2.push(consumeArgument()); + } + return result2; + } + function consumeArgument() { + skipWhitespace(); + if (isNumber()) + return tokens[pos++].value; + if (isString()) + return tokens[pos++].value; + return consumeComplexSelector(); + } + function consumeComplexSelector() { + const result2 = { simples: [] }; + skipWhitespace(); + if (isClauseCombinator()) { + result2.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" }); + } else { + result2.simples.push({ selector: consumeSimpleSelector(), combinator: "" }); + } + while (true) { + skipWhitespace(); + if (isClauseCombinator()) { + result2.simples[result2.simples.length - 1].combinator = tokens[pos++].value; + skipWhitespace(); + } else if (isSelectorClauseEnd()) { + break; + } + result2.simples.push({ combinator: "", selector: consumeSimpleSelector() }); + } + return result2; + } + function consumeSimpleSelector() { + let rawCSSString = ""; + const functions = []; + while (!isSelectorClauseEnd()) { + if (isIdent() || isStar()) { + rawCSSString += tokens[pos++].toSource(); + } else if (tokens[pos] instanceof HashToken) { + rawCSSString += tokens[pos++].toSource(); + } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") { + pos++; + if (isIdent()) + rawCSSString += "." + tokens[pos++].toSource(); + else + throw unexpected(); + } else if (tokens[pos] instanceof ColonToken) { + pos++; + if (isIdent()) { + if (!customNames.has(tokens[pos].value.toLowerCase())) { + rawCSSString += ":" + tokens[pos++].toSource(); + } else { + const name = tokens[pos++].value.toLowerCase(); + functions.push({ name, args: [] }); + names.add(name); + } + } else if (isFunction()) { + const name = tokens[pos++].value.toLowerCase(); + if (!customNames.has(name)) { + rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`; + } else { + functions.push({ name, args: consumeFunctionArguments() }); + names.add(name); + } + skipWhitespace(); + if (!isCloseParen()) + throw unexpected(); + pos++; + } else { + throw unexpected(); + } + } else if (tokens[pos] instanceof OpenSquareToken) { + rawCSSString += "["; + pos++; + while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF()) + rawCSSString += tokens[pos++].toSource(); + if (!(tokens[pos] instanceof CloseSquareToken)) + throw unexpected(); + rawCSSString += "]"; + pos++; + } else { + throw unexpected(); + } + } + if (!rawCSSString && !functions.length) + throw unexpected(); + return { css: rawCSSString || void 0, functions }; + } + function consumeBuiltinFunctionArguments() { + let s = ""; + let balance = 1; + while (!isEOF()) { + if (isOpenParen() || isFunction()) + balance++; + if (isCloseParen()) + balance--; + if (!balance) + break; + s += tokens[pos++].toSource(); + } + return s; + } + const result = consumeFunctionArguments(); + if (!isEOF()) + throw unexpected(); + if (result.some((arg) => typeof arg !== "object" || !("simples" in arg))) + throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + return { selector: result, names: Array.from(names) }; +} +const kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]); +const kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]); +const customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]); +function parseSelector(selector) { + const parsedStrings = parseSelectorString(selector); + const parts = []; + for (const part of parsedStrings.parts) { + if (part.name === "css" || part.name === "css:light") { + if (part.name === "css:light") + part.body = ":light(" + part.body + ")"; + const parsedCSS = parseCSS(part.body, customCSSNames); + parts.push({ + name: "css", + body: parsedCSS.selector, + source: part.body + }); + continue; + } + if (kNestedSelectorNames.has(part.name)) { + let innerSelector; + let distance; + try { + const unescaped = JSON.parse("[" + part.body + "]"); + if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string") + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + innerSelector = unescaped[0]; + if (unescaped.length === 2) { + if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name)) + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + distance = unescaped[1]; + } + } catch (e) { + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + } + const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } }; + const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame"); + const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1; + if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1))) + nested.body.parsed.parts.splice(0, lastFrameIndex + 1); + parts.push(nested); + continue; + } + parts.push({ ...part, source: part.body }); + } + if (kNestedSelectorNames.has(parts[0].name)) + throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`); + return { + capture: parsedStrings.capture, + parts + }; +} +function selectorPartsEqual(list1, list2) { + return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 }); +} +function stringifySelector(selector, forceEngineName) { + if (typeof selector === "string") + return selector; + return selector.parts.map((p, i) => { + let includeEngine = true; + if (!forceEngineName && i !== selector.capture) { + if (p.name === "css") + includeEngine = false; + else if (p.name === "xpath" && p.source.startsWith("//") || p.source.startsWith("..")) + includeEngine = false; + } + const prefix = includeEngine ? p.name + "=" : ""; + return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`; + }).join(" >> "); +} +function parseSelectorString(selector) { + let index = 0; + let quote; + let start = 0; + const result = { parts: [] }; + const append = () => { + const part = selector.substring(start, index).trim(); + const eqIndex = part.indexOf("="); + let name; + let body; + if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) { + name = part.substring(0, eqIndex).trim(); + body = part.substring(eqIndex + 1); + } else if (part.length > 1 && part[0] === '"' && part[part.length - 1] === '"') { + name = "text"; + body = part; + } else if (part.length > 1 && part[0] === "'" && part[part.length - 1] === "'") { + name = "text"; + body = part; + } else if (/^\(*\/\//.test(part) || part.startsWith("..")) { + name = "xpath"; + body = part; + } else { + name = "css"; + body = part; + } + let capture = false; + if (name[0] === "*") { + capture = true; + name = name.substring(1); + } + result.parts.push({ name, body }); + if (capture) { + if (result.capture !== void 0) + throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`); + result.capture = result.parts.length - 1; + } + }; + if (!selector.includes(">>")) { + index = selector.length; + append(); + return result; + } + const shouldIgnoreTextSelectorQuote = () => { + const prefix = selector.substring(start, index); + const match = prefix.match(/^\s*text\s*=(.*)$/); + return !!match && !!match[1]; + }; + while (index < selector.length) { + const c = selector[index]; + if (c === "\\" && index + 1 < selector.length) { + index += 2; + } else if (c === quote) { + quote = void 0; + index++; + } else if (!quote && (c === '"' || c === "'" || c === "`") && !shouldIgnoreTextSelectorQuote()) { + quote = c; + index++; + } else if (!quote && c === ">" && selector[index + 1] === ">") { + append(); + index += 2; + start = index; + } else { + index++; + } + } + append(); + return result; +} +function parseAttributeSelector(selector, allowUnquotedStrings) { + let wp = 0; + let EOL = selector.length === 0; + const next = () => selector[wp] || ""; + const eat1 = () => { + const result2 = next(); + ++wp; + EOL = wp >= selector.length; + return result2; + }; + const syntaxError = (stage) => { + if (EOL) + throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \`${selector}\``); + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : "")); + }; + function skipSpaces() { + while (!EOL && /\s/.test(next())) + eat1(); + } + function isCSSNameChar(char) { + return char >= "€" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-"; + } + function readIdentifier() { + let result2 = ""; + skipSpaces(); + while (!EOL && isCSSNameChar(next())) + result2 += eat1(); + return result2; + } + function readQuotedString(quote) { + let result2 = eat1(); + if (result2 !== quote) + syntaxError("parsing quoted string"); + while (!EOL && next() !== quote) { + if (next() === "\\") + eat1(); + result2 += eat1(); + } + if (next() !== quote) + syntaxError("parsing quoted string"); + result2 += eat1(); + return result2; + } + function readRegularExpression() { + if (eat1() !== "/") + syntaxError("parsing regular expression"); + let source = ""; + let inClass = false; + while (!EOL) { + if (next() === "\\") { + source += eat1(); + if (EOL) + syntaxError("parsing regular expression"); + } else if (inClass && next() === "]") { + inClass = false; + } else if (!inClass && next() === "[") { + inClass = true; + } else if (!inClass && next() === "/") { + break; + } + source += eat1(); + } + if (eat1() !== "/") + syntaxError("parsing regular expression"); + let flags = ""; + while (!EOL && next().match(/[dgimsuy]/)) + flags += eat1(); + try { + return new RegExp(source, flags); + } catch (e) { + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\`: ${e.message}`); + } + } + function readAttributeToken() { + let token = ""; + skipSpaces(); + if (next() === `'` || next() === `"`) + token = readQuotedString(next()).slice(1, -1); + else + token = readIdentifier(); + if (!token) + syntaxError("parsing property path"); + return token; + } + function readOperator() { + skipSpaces(); + let op = ""; + if (!EOL) + op += eat1(); + if (!EOL && op !== "=") + op += eat1(); + if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op)) + syntaxError("parsing operator"); + return op; + } + function readAttribute() { + eat1(); + const jsonPath = []; + jsonPath.push(readAttributeToken()); + skipSpaces(); + while (next() === ".") { + eat1(); + jsonPath.push(readAttributeToken()); + skipSpaces(); + } + if (next() === "]") { + eat1(); + return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false }; + } + const operator = readOperator(); + let value = void 0; + let caseSensitive = true; + skipSpaces(); + if (next() === "/") { + if (operator !== "=") + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with regular expression`); + value = readRegularExpression(); + } else if (next() === `'` || next() === `"`) { + value = readQuotedString(next()).slice(1, -1); + skipSpaces(); + if (next() === "i" || next() === "I") { + caseSensitive = false; + eat1(); + } else if (next() === "s" || next() === "S") { + caseSensitive = true; + eat1(); + } + } else { + value = ""; + while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === ".")) + value += eat1(); + if (value === "true") { + value = true; + } else if (value === "false") { + value = false; + } else ; + } + skipSpaces(); + if (next() !== "]") + syntaxError("parsing attribute value"); + eat1(); + if (operator !== "=" && typeof value !== "string") + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with non-string matching value - ${value}`); + return { name: jsonPath.join("."), jsonPath, op: operator, value, caseSensitive }; + } + const result = { + name: "", + attributes: [] + }; + result.name = readIdentifier(); + skipSpaces(); + while (next() === "[") { + result.attributes.push(readAttribute()); + skipSpaces(); + } + if (!EOL) + syntaxError(void 0); + if (!result.name && !result.attributes.length) + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - selector cannot be empty`); + return result; +} +function escapeWithQuotes(text, char = "'") { + const stringified = JSON.stringify(text); + const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\"/g, '"'); + if (char === "'") + return char + escapedText.replace(/[']/g, "\\'") + char; + if (char === '"') + return char + escapedText.replace(/["]/g, '\\"') + char; + if (char === "`") + return char + escapedText.replace(/[`]/g, "`") + char; + throw new Error("Invalid escape char"); +} +function toTitleCase(name) { + return name.charAt(0).toUpperCase() + name.substring(1); +} +function toSnakeCase(name) { + return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase(); +} +function normalizeEscapedRegexQuotes(source) { + return source.replace(/(^|[^\\])(\\\\)*\\(['"`])/g, "$1$2$3"); +} +function asLocator(lang, selector, isFrameLocator = false) { + return asLocators(lang, selector, isFrameLocator, 1)[0]; +} +function asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) { + try { + return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize); + } catch (e) { + return [selector]; + } +} +function innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) { + const parts = [...parsed.parts]; + const tokens = []; + let nextBase = isFrameLocator ? "frame-locator" : "page"; + for (let index = 0; index < parts.length; index++) { + const part = parts[index]; + const base = nextBase; + nextBase = "locator"; + if (part.name === "internal:describe") + continue; + if (part.name === "nth") { + if (part.body === "0") + tokens.push([factory.generateLocator(base, "first", ""), factory.generateLocator(base, "nth", "0")]); + else if (part.body === "-1") + tokens.push([factory.generateLocator(base, "last", ""), factory.generateLocator(base, "nth", "-1")]); + else + tokens.push([factory.generateLocator(base, "nth", part.body)]); + continue; + } + if (part.name === "visible") { + tokens.push([factory.generateLocator(base, "visible", part.body), factory.generateLocator(base, "default", `visible=${part.body}`)]); + continue; + } + if (part.name === "internal:text") { + const { exact, text } = detectExact(part.body); + tokens.push([factory.generateLocator(base, "text", text, { exact })]); + continue; + } + if (part.name === "internal:has-text") { + const { exact, text } = detectExact(part.body); + if (!exact) { + tokens.push([factory.generateLocator(base, "has-text", text, { exact })]); + continue; + } + } + if (part.name === "internal:has-not-text") { + const { exact, text } = detectExact(part.body); + if (!exact) { + tokens.push([factory.generateLocator(base, "has-not-text", text, { exact })]); + continue; + } + } + if (part.name === "internal:has") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "has", inner))); + continue; + } + if (part.name === "internal:has-not") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "hasNot", inner))); + continue; + } + if (part.name === "internal:and") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "and", inner))); + continue; + } + if (part.name === "internal:or") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "or", inner))); + continue; + } + if (part.name === "internal:chain") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "chain", inner))); + continue; + } + if (part.name === "internal:label") { + const { exact, text } = detectExact(part.body); + tokens.push([factory.generateLocator(base, "label", text, { exact })]); + continue; + } + if (part.name === "internal:role") { + const attrSelector = parseAttributeSelector(part.body); + const options = { attrs: [] }; + for (const attr of attrSelector.attributes) { + if (attr.name === "name") { + options.exact = attr.caseSensitive; + options.name = attr.value; + } else { + if (attr.name === "level" && typeof attr.value === "string") + attr.value = +attr.value; + options.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value }); + } + } + tokens.push([factory.generateLocator(base, "role", attrSelector.name, options)]); + continue; + } + if (part.name === "internal:testid") { + const attrSelector = parseAttributeSelector(part.body); + const { value } = attrSelector.attributes[0]; + tokens.push([factory.generateLocator(base, "test-id", value)]); + continue; + } + if (part.name === "internal:attr") { + const attrSelector = parseAttributeSelector(part.body); + const { name, value, caseSensitive } = attrSelector.attributes[0]; + const text = value; + const exact = !!caseSensitive; + if (name === "placeholder") { + tokens.push([factory.generateLocator(base, "placeholder", text, { exact })]); + continue; + } + if (name === "alt") { + tokens.push([factory.generateLocator(base, "alt", text, { exact })]); + continue; + } + if (name === "title") { + tokens.push([factory.generateLocator(base, "title", text, { exact })]); + continue; + } + } + if (part.name === "internal:control" && part.body === "enter-frame") { + const lastTokens = tokens[tokens.length - 1]; + const lastPart = parts[index - 1]; + const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base, "frame", "")])); + if (["xpath", "css"].includes(lastPart.name)) { + transformed.push( + factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] })), + factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] }, true)) + ); + } + lastTokens.splice(0, lastTokens.length, ...transformed); + nextBase = "frame-locator"; + continue; + } + const nextPart = parts[index + 1]; + const selectorPart = stringifySelector({ parts: [part] }); + const locatorPart = factory.generateLocator(base, "default", selectorPart); + if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) { + const { exact, text } = detectExact(nextPart.body); + if (!exact) { + const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text, { exact }); + const options = {}; + if (nextPart.name === "internal:has-text") + options.hasText = text; + else + options.hasNotText = text; + const combinedPart = factory.generateLocator(base, "default", selectorPart, options); + tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]); + index++; + continue; + } + } + let locatorPartWithEngine; + if (["xpath", "css"].includes(part.name)) { + const selectorPart2 = stringifySelector( + { parts: [part] }, + /* forceEngineName */ + true + ); + locatorPartWithEngine = factory.generateLocator(base, "default", selectorPart2); + } + tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean)); + } + return combineTokens(factory, tokens, maxOutputSize); +} +function combineTokens(factory, tokens, maxOutputSize) { + const currentTokens = tokens.map(() => ""); + const result = []; + const visit2 = (index) => { + if (index === tokens.length) { + result.push(factory.chainLocators(currentTokens)); + return result.length < maxOutputSize; + } + for (const taken of tokens[index]) { + currentTokens[index] = taken; + if (!visit2(index + 1)) + return false; + } + return true; + }; + visit2(0); + return result; +} +function detectExact(text) { + let exact = false; + const match = text.match(/^\/(.*)\/([igm]*)$/); + if (match) + return { text: new RegExp(match[1], match[2]) }; + if (text.endsWith('"')) { + text = JSON.parse(text); + exact = true; + } else if (text.endsWith('"s')) { + text = JSON.parse(text.substring(0, text.length - 1)); + exact = true; + } else if (text.endsWith('"i')) { + text = JSON.parse(text.substring(0, text.length - 1)); + exact = false; + } + return { exact, text }; +} +class JavaScriptLocatorFactory { + constructor(preferredQuote) { + this.preferredQuote = preferredQuote; + } + generateLocator(base, kind, body, options = {}) { + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options.hasText)} })`; + if (options.hasNotText !== void 0) + return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options.hasNotText)} })`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frameLocator(${this.quote(body)})`; + case "frame": + return `contentFrame()`; + case "nth": + return `nth(${body})`; + case "first": + return `first()`; + case "last": + return `last()`; + case "visible": + return `filter({ visible: ${body === "true" ? "true" : "false"} })`; + case "role": + const attrs = []; + if (isRegExp(options.name)) { + attrs.push(`name: ${this.regexToSourceString(options.name)}`); + } else if (typeof options.name === "string") { + attrs.push(`name: ${this.quote(options.name)}`); + if (options.exact) + attrs.push(`exact: true`); + } + for (const { name, value } of options.attrs) + attrs.push(`${name}: ${typeof value === "string" ? this.quote(value) : value}`); + const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : ""; + return `getByRole(${this.quote(body)}${attrString})`; + case "has-text": + return `filter({ hasText: ${this.toHasText(body)} })`; + case "has-not-text": + return `filter({ hasNotText: ${this.toHasText(body)} })`; + case "has": + return `filter({ has: ${body} })`; + case "hasNot": + return `filter({ hasNot: ${body} })`; + case "and": + return `and(${body})`; + case "or": + return `or(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `getByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("getByText", body, !!options.exact); + case "alt": + return this.toCallWithExact("getByAltText", body, !!options.exact); + case "placeholder": + return this.toCallWithExact("getByPlaceholder", body, !!options.exact); + case "label": + return this.toCallWithExact("getByLabel", body, !!options.exact); + case "title": + return this.toCallWithExact("getByTitle", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToSourceString(re) { + return normalizeEscapedRegexQuotes(String(re)); + } + toCallWithExact(method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToSourceString(body)})`; + return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return this.regexToSourceString(body); + return this.quote(body); + } + toTestIdValue(value) { + if (isRegExp(value)) + return this.regexToSourceString(value); + return this.quote(value); + } + quote(text) { + return escapeWithQuotes(text, this.preferredQuote ?? "'"); + } +} +class PythonLocatorFactory { + generateLocator(base, kind, body, options = {}) { + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `locator(${this.quote(body)}, has_text=${this.toHasText(options.hasText)})`; + if (options.hasNotText !== void 0) + return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options.hasNotText)})`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frame_locator(${this.quote(body)})`; + case "frame": + return `content_frame`; + case "nth": + return `nth(${body})`; + case "first": + return `first`; + case "last": + return `last`; + case "visible": + return `filter(visible=${body === "true" ? "True" : "False"})`; + case "role": + const attrs = []; + if (isRegExp(options.name)) { + attrs.push(`name=${this.regexToString(options.name)}`); + } else if (typeof options.name === "string") { + attrs.push(`name=${this.quote(options.name)}`); + if (options.exact) + attrs.push(`exact=True`); + } + for (const { name, value } of options.attrs) { + let valueString = typeof value === "string" ? this.quote(value) : value; + if (typeof value === "boolean") + valueString = value ? "True" : "False"; + attrs.push(`${toSnakeCase(name)}=${valueString}`); + } + const attrString = attrs.length ? `, ${attrs.join(", ")}` : ""; + return `get_by_role(${this.quote(body)}${attrString})`; + case "has-text": + return `filter(has_text=${this.toHasText(body)})`; + case "has-not-text": + return `filter(has_not_text=${this.toHasText(body)})`; + case "has": + return `filter(has=${body})`; + case "hasNot": + return `filter(has_not=${body})`; + case "and": + return `and_(${body})`; + case "or": + return `or_(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `get_by_test_id(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("get_by_text", body, !!options.exact); + case "alt": + return this.toCallWithExact("get_by_alt_text", body, !!options.exact); + case "placeholder": + return this.toCallWithExact("get_by_placeholder", body, !!options.exact); + case "label": + return this.toCallWithExact("get_by_label", body, !!options.exact); + case "title": + return this.toCallWithExact("get_by_title", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : ""; + return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\//, "/").replace(/"/g, '\\"')}"${suffix})`; + } + toCallWithExact(method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, exact=True)`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return this.regexToString(body); + return `${this.quote(body)}`; + } + toTestIdValue(value) { + if (isRegExp(value)) + return this.regexToString(value); + return this.quote(value); + } + quote(text) { + return escapeWithQuotes(text, '"'); + } +} +class JavaLocatorFactory { + generateLocator(base, kind, body, options = {}) { + let clazz; + switch (base) { + case "page": + clazz = "Page"; + break; + case "frame-locator": + clazz = "FrameLocator"; + break; + case "locator": + clazz = "Locator"; + break; + } + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options.hasText)}))`; + if (options.hasNotText !== void 0) + return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options.hasNotText)}))`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frameLocator(${this.quote(body)})`; + case "frame": + return `contentFrame()`; + case "nth": + return `nth(${body})`; + case "first": + return `first()`; + case "last": + return `last()`; + case "visible": + return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`; + case "role": + const attrs = []; + if (isRegExp(options.name)) { + attrs.push(`.setName(${this.regexToString(options.name)})`); + } else if (typeof options.name === "string") { + attrs.push(`.setName(${this.quote(options.name)})`); + if (options.exact) + attrs.push(`.setExact(true)`); + } + for (const { name, value } of options.attrs) + attrs.push(`.set${toTitleCase(name)}(${typeof value === "string" ? this.quote(value) : value})`); + const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : ""; + return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`; + case "has-text": + return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`; + case "has-not-text": + return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`; + case "has": + return `filter(new ${clazz}.FilterOptions().setHas(${body}))`; + case "hasNot": + return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`; + case "and": + return `and(${body})`; + case "or": + return `or(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `getByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact(clazz, "getByText", body, !!options.exact); + case "alt": + return this.toCallWithExact(clazz, "getByAltText", body, !!options.exact); + case "placeholder": + return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options.exact); + case "label": + return this.toCallWithExact(clazz, "getByLabel", body, !!options.exact); + case "title": + return this.toCallWithExact(clazz, "getByTitle", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : ""; + return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`; + } + toCallWithExact(clazz, method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return this.regexToString(body); + return this.quote(body); + } + toTestIdValue(value) { + if (isRegExp(value)) + return this.regexToString(value); + return this.quote(value); + } + quote(text) { + return escapeWithQuotes(text, '"'); + } +} +class CSharpLocatorFactory { + generateLocator(base, kind, body, options = {}) { + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `Locator(${this.quote(body)}, new() { ${this.toHasText(options.hasText)} })`; + if (options.hasNotText !== void 0) + return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options.hasNotText)} })`; + return `Locator(${this.quote(body)})`; + case "frame-locator": + return `FrameLocator(${this.quote(body)})`; + case "frame": + return `ContentFrame`; + case "nth": + return `Nth(${body})`; + case "first": + return `First`; + case "last": + return `Last`; + case "visible": + return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`; + case "role": + const attrs = []; + if (isRegExp(options.name)) { + attrs.push(`NameRegex = ${this.regexToString(options.name)}`); + } else if (typeof options.name === "string") { + attrs.push(`Name = ${this.quote(options.name)}`); + if (options.exact) + attrs.push(`Exact = true`); + } + for (const { name, value } of options.attrs) + attrs.push(`${toTitleCase(name)} = ${typeof value === "string" ? this.quote(value) : value}`); + const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : ""; + return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`; + case "has-text": + return `Filter(new() { ${this.toHasText(body)} })`; + case "has-not-text": + return `Filter(new() { ${this.toHasNotText(body)} })`; + case "has": + return `Filter(new() { Has = ${body} })`; + case "hasNot": + return `Filter(new() { HasNot = ${body} })`; + case "and": + return `And(${body})`; + case "or": + return `Or(${body})`; + case "chain": + return `Locator(${body})`; + case "test-id": + return `GetByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("GetByText", body, !!options.exact); + case "alt": + return this.toCallWithExact("GetByAltText", body, !!options.exact); + case "placeholder": + return this.toCallWithExact("GetByPlaceholder", body, !!options.exact); + case "label": + return this.toCallWithExact("GetByLabel", body, !!options.exact); + case "title": + return this.toCallWithExact("GetByTitle", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : ""; + return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`; + } + toCallWithExact(method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, new() { Exact = true })`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return `HasTextRegex = ${this.regexToString(body)}`; + return `HasText = ${this.quote(body)}`; + } + toTestIdValue(value) { + if (isRegExp(value)) + return this.regexToString(value); + return this.quote(value); + } + toHasNotText(body) { + if (isRegExp(body)) + return `HasNotTextRegex = ${this.regexToString(body)}`; + return `HasNotText = ${this.quote(body)}`; + } + quote(text) { + return escapeWithQuotes(text, '"'); + } +} +class JsonlLocatorFactory { + generateLocator(base, kind, body, options = {}) { + return JSON.stringify({ + kind, + body, + options + }); + } + chainLocators(locators) { + const objects = locators.map((l) => JSON.parse(l)); + for (let i = 0; i < objects.length - 1; ++i) + objects[i].next = objects[i + 1]; + return JSON.stringify(objects[0]); + } +} +const generators = { + javascript: JavaScriptLocatorFactory, + python: PythonLocatorFactory, + java: JavaLocatorFactory, + csharp: CSharpLocatorFactory, + jsonl: JsonlLocatorFactory +}; +function isRegExp(obj) { + return obj instanceof RegExp; +} +const CallLogView = ({ + language, + log +}) => { + const messagesEndRef = reactExports.useRef(null); + const [expandOverrides, setExpandOverrides] = reactExports.useState(/* @__PURE__ */ new Map()); + reactExports.useLayoutEffect(() => { + var _a; + if (log.find((callLog) => callLog.reveal)) + (_a = messagesEndRef.current) == null ? void 0 : _a.scrollIntoView({ block: "center", inline: "nearest" }); + }, [messagesEndRef, log]); + return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "call-log", style: { flex: "auto" }, children: [ + log.map((callLog) => { + const expandOverride = expandOverrides.get(callLog.id); + const isExpanded = typeof expandOverride === "boolean" ? expandOverride : callLog.status !== "done"; + const locator = callLog.params.selector ? asLocator(language, callLog.params.selector) : null; + let titlePrefix = callLog.title; + let titleSuffix = ""; + if (callLog.title.startsWith("expect.to") || callLog.title.startsWith("expect.not.to")) { + titlePrefix = "expect("; + titleSuffix = `).${callLog.title.substring("expect.".length)}()`; + } else if (callLog.title.startsWith("locator.")) { + titlePrefix = ""; + titleSuffix = `.${callLog.title.substring("locator.".length)}()`; + } else if (locator || callLog.params.url) { + titlePrefix = callLog.title + "("; + titleSuffix = ")"; + } + return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("call-log-call", callLog.status), children: [ + /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "call-log-call-header", children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: clsx("codicon", `codicon-chevron-${isExpanded ? "down" : "right"}`), style: { cursor: "pointer" }, onClick: () => { + const newOverrides = new Map(expandOverrides); + newOverrides.set(callLog.id, !isExpanded); + setExpandOverrides(newOverrides); + } }), + titlePrefix, + callLog.params.url ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "call-log-details", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "call-log-url", title: callLog.params.url, children: callLog.params.url }) }) : void 0, + locator ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "call-log-details", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "call-log-selector", title: `page.${locator}`, children: `page.${locator}` }) }) : void 0, + titleSuffix, + /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: clsx("codicon", iconClass(callLog)) }), + typeof callLog.duration === "number" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "call-log-time", children: [ + "— ", + msToString(callLog.duration) + ] }) : void 0 + ] }), + (isExpanded ? callLog.messages : []).map((message, i) => { + return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "call-log-message", children: message.trim() }, i); + }), + !!callLog.error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "call-log-message error", hidden: !isExpanded, children: callLog.error }) + ] }, callLog.id); + }), + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: messagesEndRef }) + ] }); +}; +function iconClass(callLog) { + switch (callLog.status) { + case "done": + return "codicon-check"; + case "in-progress": + return "codicon-clock"; + case "paused": + return "codicon-debug-pause"; + case "error": + return "codicon-error"; + } +} +const ALIAS = Symbol.for("yaml.alias"); +const DOC = Symbol.for("yaml.document"); +const MAP = Symbol.for("yaml.map"); +const PAIR = Symbol.for("yaml.pair"); +const SCALAR$1 = Symbol.for("yaml.scalar"); +const SEQ = Symbol.for("yaml.seq"); +const NODE_TYPE = Symbol.for("yaml.node.type"); +const isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS; +const isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC; +const isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP; +const isPair = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === PAIR; +const isScalar$1 = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SCALAR$1; +const isSeq = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SEQ; +function isCollection$1(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; +} +function isNode(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR$1: + case SEQ: + return true; + } + return false; +} +const hasAnchor = (node) => (isScalar$1(node) || isCollection$1(node)) && !!node.anchor; +const BREAK$1 = Symbol("break visit"); +const SKIP$1 = Symbol("skip children"); +const REMOVE$1 = Symbol("remove node"); +function visit$1(node, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node)) { + const cd = visit_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE$1) + node.contents = null; + } else + visit_(null, node, visitor_, Object.freeze([])); +} +visit$1.BREAK = BREAK$1; +visit$1.SKIP = SKIP$1; +visit$1.REMOVE = REMOVE$1; +function visit_(key, node, visitor, path) { + const ctrl = callVisitor(key, node, visitor, path); + if (isNode(ctrl) || isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visit_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (isCollection$1(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = visit_(i, node.items[i], visitor, path); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK$1) + return BREAK$1; + else if (ci === REMOVE$1) { + node.items.splice(i, 1); + i -= 1; + } + } + } else if (isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = visit_("key", node.key, visitor, path); + if (ck === BREAK$1) + return BREAK$1; + else if (ck === REMOVE$1) + node.key = null; + const cv = visit_("value", node.value, visitor, path); + if (cv === BREAK$1) + return BREAK$1; + else if (cv === REMOVE$1) + node.value = null; + } + } + return ctrl; +} +async function visitAsync(node, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node)) { + const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE$1) + node.contents = null; + } else + await visitAsync_(null, node, visitor_, Object.freeze([])); +} +visitAsync.BREAK = BREAK$1; +visitAsync.SKIP = SKIP$1; +visitAsync.REMOVE = REMOVE$1; +async function visitAsync_(key, node, visitor, path) { + const ctrl = await callVisitor(key, node, visitor, path); + if (isNode(ctrl) || isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visitAsync_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (isCollection$1(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = await visitAsync_(i, node.items[i], visitor, path); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK$1) + return BREAK$1; + else if (ci === REMOVE$1) { + node.items.splice(i, 1); + i -= 1; + } + } + } else if (isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = await visitAsync_("key", node.key, visitor, path); + if (ck === BREAK$1) + return BREAK$1; + else if (ck === REMOVE$1) + node.key = null; + const cv = await visitAsync_("value", node.value, visitor, path); + if (cv === BREAK$1) + return BREAK$1; + else if (cv === REMOVE$1) + node.value = null; + } + } + return ctrl; +} +function initVisitor(visitor) { + if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { + return Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + return visitor; +} +function callVisitor(key, node, visitor, path) { + var _a, _b, _c, _d, _e; + if (typeof visitor === "function") + return visitor(key, node, path); + if (isMap(node)) + return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node, path); + if (isSeq(node)) + return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node, path); + if (isPair(node)) + return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node, path); + if (isScalar$1(node)) + return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node, path); + if (isAlias(node)) + return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node, path); + return void 0; +} +function replaceNode(key, path, node) { + const parent = path[path.length - 1]; + if (isCollection$1(parent)) { + parent.items[key] = node; + } else if (isPair(parent)) { + if (key === "key") + parent.key = node; + else + parent.value = node; + } else if (isDocument(parent)) { + parent.contents = node; + } else { + const pt = isAlias(parent) ? "alias" : "scalar"; + throw new Error(`Cannot replace node with ${pt} parent`); + } +} +const escapeChars = { + "!": "%21", + ",": "%2C", + "[": "%5B", + "]": "%5D", + "{": "%7B", + "}": "%7D" +}; +const escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); +class Directives { + constructor(yaml, tags) { + this.docStart = null; + this.docEnd = false; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy2 = new Directives(this.yaml, this.tags); + copy2.docStart = this.docStart; + return copy2; + } + /** + * During parsing, get a Directives instance for the current document and + * update the stream state according to the current version's spec. + */ + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case "1.1": + this.atNextDocument = true; + break; + case "1.2": + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: "1.2" + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + /** + * @param onError - May be called even if the action was successful + * @returns `true` on success + */ + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name = parts.shift(); + switch (name) { + case "%TAG": { + if (parts.length !== 2) { + onError(0, "%TAG directive should contain exactly two parts"); + if (parts.length < 2) + return false; + } + const [handle, prefix] = parts; + this.tags[handle] = prefix; + return true; + } + case "%YAML": { + this.yaml.explicit = true; + if (parts.length !== 1) { + onError(0, "%YAML directive should contain exactly one part"); + return false; + } + const [version] = parts; + if (version === "1.1" || version === "1.2") { + this.yaml.version = version; + return true; + } else { + const isValid = /^\d+\.\d+$/.test(version); + onError(6, `Unsupported YAML version ${version}`, isValid); + return false; + } + } + default: + onError(0, `Unknown directive ${name}`, true); + return false; + } + } + /** + * Resolves a tag, matching handles to those defined in %TAG directives. + * + * @returns Resolved tag, which may also be the non-specific tag `'!'` or a + * `'!local'` tag, or `null` if unresolvable. + */ + tagName(source, onError) { + if (source === "!") + return "!"; + if (source[0] !== "!") { + onError(`Not a valid tag: ${source}`); + return null; + } + if (source[1] === "<") { + const verbatim = source.slice(2, -1); + if (verbatim === "!" || verbatim === "!!") { + onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); + return null; + } + if (source[source.length - 1] !== ">") + onError("Verbatim tags must end with a >"); + return verbatim; + } + const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s); + if (!suffix) + onError(`The ${source} tag has no suffix`); + const prefix = this.tags[handle]; + if (prefix) { + try { + return prefix + decodeURIComponent(suffix); + } catch (error) { + onError(String(error)); + return null; + } + } + if (handle === "!") + return source; + onError(`Could not resolve tag: ${source}`); + return null; + } + /** + * Given a fully resolved tag, returns its printable string form, + * taking into account current tag prefixes and defaults. + */ + tagString(tag) { + for (const [handle, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === "!" ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && isNode(doc.contents)) { + const tags = {}; + visit$1(doc.contents, (_key, node) => { + if (isNode(node) && node.tag) + tags[node.tag] = true; + }); + tagNames = Object.keys(tags); + } else + tagNames = []; + for (const [handle, prefix] of tagEntries) { + if (handle === "!!" && prefix === "tag:yaml.org,2002:") + continue; + if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) + lines.push(`%TAG ${handle} ${prefix}`); + } + return lines.join("\n"); + } +} +Directives.defaultYaml = { explicit: false, version: "1.2" }; +Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; +function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; +} +function anchorNames(root) { + const anchors = /* @__PURE__ */ new Set(); + visit$1(root, { + Value(_key, node) { + if (node.anchor) + anchors.add(node.anchor); + } + }); + return anchors; +} +function findNewAnchor(prefix, exclude) { + for (let i = 1; true; ++i) { + const name = `${prefix}${i}`; + if (!exclude.has(name)) + return name; + } +} +function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = /* @__PURE__ */ new Map(); + let prevAnchors = null; + return { + onAnchor: (source) => { + aliasObjects.push(source); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + /** + * With circular references, the source node is only resolved after all + * of its child nodes are. This is why anchors are set only after all of + * the nodes have been created. + */ + setAnchors: () => { + for (const source of aliasObjects) { + const ref = sourceObjects.get(source); + if (typeof ref === "object" && ref.anchor && (isScalar$1(ref.node) || isCollection$1(ref.node))) { + ref.node.anchor = ref.anchor; + } else { + const error = new Error("Failed to resolve repeated object (this should not happen)"); + error.source = source; + throw error; + } + } + }, + sourceObjects + }; +} +function applyReviver(reviver, obj, key, val) { + if (val && typeof val === "object") { + if (Array.isArray(val)) { + for (let i = 0, len = val.length; i < len; ++i) { + const v0 = val[i]; + const v1 = applyReviver(reviver, val, String(i), v0); + if (v1 === void 0) + delete val[i]; + else if (v1 !== v0) + val[i] = v1; + } + } else if (val instanceof Map) { + for (const k of Array.from(val.keys())) { + const v0 = val.get(k); + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + val.delete(k); + else if (v1 !== v0) + val.set(k, v1); + } + } else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === void 0) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } else { + for (const [k, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + delete val[k]; + else if (v1 !== v0) + val[k] = v1; + } + } + } + return reviver.call(obj, key, val); +} +function toJS(value, arg, ctx) { + if (Array.isArray(value)) + return value.map((v, i) => toJS(v, String(i), ctx)); + if (value && typeof value.toJSON === "function") { + if (!ctx || !hasAnchor(value)) + return value.toJSON(arg, ctx); + const data = { aliasCount: 0, count: 1, res: void 0 }; + ctx.anchors.set(value, data); + ctx.onCreate = (res2) => { + data.res = res2; + delete ctx.onCreate; + }; + const res = value.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep)) + return Number(value); + return value; +} +class NodeBase { + constructor(type) { + Object.defineProperty(this, NODE_TYPE, { value: type }); + } + /** Create a copy of this node. */ + clone() { + const copy2 = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy2.range = this.range.slice(); + return copy2; + } + /** A plain JavaScript representation of this node. */ + toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + if (!isDocument(doc)) + throw new TypeError("A document argument is required"); + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc, + keep: true, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS(this, "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; + } +} +class Alias extends NodeBase { + constructor(source) { + super(ALIAS); + this.source = source; + Object.defineProperty(this, "tag", { + set() { + throw new Error("Alias nodes cannot have tags"); + } + }); + } + /** + * Resolve the value of this alias within `doc`, finding the last + * instance of the `source` anchor before this node. + */ + resolve(doc) { + let found = void 0; + visit$1(doc, { + Node: (_key, node) => { + if (node === this) + return visit$1.BREAK; + if (node.anchor === this.source) + found = node; + } + }); + return found; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors, doc, maxAliasCount } = ctx; + const source = this.resolve(doc); + if (!source) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + let data = anchors.get(source); + if (!data) { + toJS(source, null, ctx); + data = anchors.get(source); + } + if (!data || data.res === void 0) { + const msg = "This should not happen: Alias anchor was not resolved?"; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data.count += 1; + if (data.aliasCount === 0) + data.aliasCount = getAliasCount(doc, source, anchors); + if (data.count * data.aliasCount > maxAliasCount) { + const msg = "Excessive alias count indicates a resource exhaustion attack"; + throw new ReferenceError(msg); + } + } + return data.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src = `*${this.source}`; + if (ctx) { + anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src} `; + } + return src; + } +} +function getAliasCount(doc, node, anchors) { + if (isAlias(node)) { + const source = node.resolve(doc); + const anchor = anchors && source && anchors.get(source); + return anchor ? anchor.count * anchor.aliasCount : 0; + } else if (isCollection$1(node)) { + let count = 0; + for (const item of node.items) { + const c = getAliasCount(doc, item, anchors); + if (c > count) + count = c; + } + return count; + } else if (isPair(node)) { + const kc = getAliasCount(doc, node.key, anchors); + const vc = getAliasCount(doc, node.value, anchors); + return Math.max(kc, vc); + } + return 1; +} +const isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object"; +class Scalar extends NodeBase { + constructor(value) { + super(SCALAR$1); + this.value = value; + } + toJSON(arg, ctx) { + return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } +} +Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; +Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; +Scalar.PLAIN = "PLAIN"; +Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; +Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; +const defaultTagPrefix = "tag:yaml.org,2002:"; +function findTagObject(value, tagName, tags) { + if (tagName) { + const match = tags.filter((t) => t.tag === tagName); + const tagObj = match.find((t) => !t.format) ?? match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find((t) => { + var _a; + return ((_a = t.identify) == null ? void 0 : _a.call(t, value)) && !t.format; + }); +} +function createNode(value, tagName, ctx) { + var _a, _b, _c; + if (isDocument(value)) + value = value.contents; + if (isNode(value)) + return value; + if (isPair(value)) { + const map2 = (_b = (_a = ctx.schema[MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx); + map2.items.push(value); + return map2; + } + if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt !== "undefined" && value instanceof BigInt) { + value = value.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema: schema2, sourceObjects } = ctx; + let ref = void 0; + if (aliasDuplicateObjects && value && typeof value === "object") { + ref = sourceObjects.get(value); + if (ref) { + if (!ref.anchor) + ref.anchor = onAnchor(value); + return new Alias(ref.anchor); + } else { + ref = { anchor: null, node: null }; + sourceObjects.set(value, ref); + } + } + if (tagName == null ? void 0 : tagName.startsWith("!!")) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value, tagName, schema2.tags); + if (!tagObj) { + if (value && typeof value.toJSON === "function") { + value = value.toJSON(); + } + if (!value || typeof value !== "object") { + const node2 = new Scalar(value); + if (ref) + ref.node = node2; + return node2; + } + tagObj = value instanceof Map ? schema2[MAP] : Symbol.iterator in Object(value) ? schema2[SEQ] : schema2[MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : typeof ((_c = tagObj == null ? void 0 : tagObj.nodeClass) == null ? void 0 : _c.from) === "function" ? tagObj.nodeClass.from(ctx.schema, value, ctx) : new Scalar(value); + if (tagName) + node.tag = tagName; + else if (!tagObj.default) + node.tag = tagObj.tag; + if (ref) + ref.node = node; + return node; +} +function collectionFromPath(schema2, path, value) { + let v = value; + for (let i = path.length - 1; i >= 0; --i) { + const k = path[i]; + if (typeof k === "number" && Number.isInteger(k) && k >= 0) { + const a = []; + a[k] = v; + v = a; + } else { + v = /* @__PURE__ */ new Map([[k, v]]); + } + } + return createNode(v, void 0, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error("This should not happen, please report a bug."); + }, + schema: schema2, + sourceObjects: /* @__PURE__ */ new Map() + }); +} +const isEmptyPath = (path) => path == null || typeof path === "object" && !!path[Symbol.iterator]().next().done; +class Collection extends NodeBase { + constructor(type, schema2) { + super(type); + Object.defineProperty(this, "schema", { + value: schema2, + configurable: true, + enumerable: false, + writable: true + }); + } + /** + * Create a copy of this collection. + * + * @param schema - If defined, overwrites the original's schema + */ + clone(schema2) { + const copy2 = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema2) + copy2.schema = schema2; + copy2.items = copy2.items.map((it) => isNode(it) || isPair(it) ? it.clone(schema2) : it); + if (this.range) + copy2.range = this.range.slice(); + return copy2; + } + /** + * Adds a value to the collection. For `!!map` and `!!omap` the value must + * be a Pair instance or a `{ key, value }` object, which may not have a key + * that already exists in the map. + */ + addIn(path, value) { + if (isEmptyPath(path)) + this.add(value); + else { + const [key, ...rest] = path; + const node = this.get(key, true); + if (isCollection$1(node)) + node.addIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + /** + * Removes a value from the collection. + * @returns `true` if the item was found and removed. + */ + deleteIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.delete(key); + const node = this.get(key, true); + if (isCollection$1(node)) + return node.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path, keepScalar) { + const [key, ...rest] = path; + const node = this.get(key, true); + if (rest.length === 0) + return !keepScalar && isScalar$1(node) ? node.value : node; + else + return isCollection$1(node) ? node.getIn(rest, keepScalar) : void 0; + } + hasAllNullValues(allowScalar) { + return this.items.every((node) => { + if (!isPair(node)) + return false; + const n = node.value; + return n == null || allowScalar && isScalar$1(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag; + }); + } + /** + * Checks if the collection includes a value with the key `key`. + */ + hasIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.has(key); + const node = this.get(key, true); + return isCollection$1(node) ? node.hasIn(rest) : false; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path, value) { + const [key, ...rest] = path; + if (rest.length === 0) { + this.set(key, value); + } else { + const node = this.get(key, true); + if (isCollection$1(node)) + node.setIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } +} +const stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); +function indentComment(comment, indent) { + if (/^\n+$/.test(comment)) + return comment.substring(1); + return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; +} +const lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment; +const FOLD_FLOW = "flow"; +const FOLD_BLOCK = "block"; +const FOLD_QUOTED = "quoted"; +function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + if (lineWidth < minContentWidth) + minContentWidth = 0; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === "number") { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = void 0; + let prev = void 0; + let overflow = false; + let i = -1; + let escStart = -1; + let escEnd = -1; + if (mode === FOLD_BLOCK) { + i = consumeMoreIndentedLines(text, i, indent.length); + if (i !== -1) + end = i + endStep; + } + for (let ch; ch = text[i += 1]; ) { + if (mode === FOLD_QUOTED && ch === "\\") { + escStart = i; + switch (text[i + 1]) { + case "x": + i += 3; + break; + case "u": + i += 5; + break; + case "U": + i += 9; + break; + default: + i += 1; + } + escEnd = i; + } + if (ch === "\n") { + if (mode === FOLD_BLOCK) + i = consumeMoreIndentedLines(text, i, indent.length); + end = i + indent.length + endStep; + split = void 0; + } else { + if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { + const next = text[i + 1]; + if (next && next !== " " && next !== "\n" && next !== " ") + split = i; + } + if (i >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = void 0; + } else if (mode === FOLD_QUOTED) { + while (prev === " " || prev === " ") { + prev = ch; + ch = text[i += 1]; + overflow = true; + } + const j = i > escEnd + 1 ? i - 2 : escStart - 1; + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = void 0; + } else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i2 = 0; i2 < folds.length; ++i2) { + const fold = folds[i2]; + const end2 = folds[i2 + 1] || text.length; + if (fold === 0) + res = ` +${indent}${text.slice(0, end2)}`; + else { + if (mode === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += ` +${indent}${text.slice(fold + 1, end2)}`; + } + } + return res; +} +function consumeMoreIndentedLines(text, i, indent) { + let end = i; + let start = i + 1; + let ch = text[start]; + while (ch === " " || ch === " ") { + if (i < start + indent) { + ch = text[++i]; + } else { + do { + ch = text[++i]; + } while (ch && ch !== "\n"); + end = i; + start = i + 1; + ch = text[start]; + } + } + return end; +} +const getFoldOptions = (ctx, isBlock2) => ({ + indentAtStart: isBlock2 ? ctx.indent.length : ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth +}); +const containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); +function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i = 0, start = 0; i < strLen; ++i) { + if (str[i] === "\n") { + if (i - start > limit) + return true; + start = i + 1; + if (strLen - start <= limit) + return false; + } + } + return true; +} +function doubleQuotedString(value, ctx) { + const json = JSON.stringify(value); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + let str = ""; + let start = 0; + for (let i = 0, ch = json[i]; ch; ch = json[++i]) { + if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") { + str += json.slice(start, i) + "\\ "; + i += 1; + start = i; + ch = "\\"; + } + if (ch === "\\") + switch (json[i + 1]) { + case "u": + { + str += json.slice(start, i); + const code = json.substr(i + 2, 4); + switch (code) { + case "0000": + str += "\\0"; + break; + case "0007": + str += "\\a"; + break; + case "000b": + str += "\\v"; + break; + case "001b": + str += "\\e"; + break; + case "0085": + str += "\\N"; + break; + case "00a0": + str += "\\_"; + break; + case "2028": + str += "\\L"; + break; + case "2029": + str += "\\P"; + break; + default: + if (code.substr(0, 2) === "00") + str += "\\x" + code.substr(2); + else + str += json.substr(i, 6); + } + i += 5; + start = i + 1; + } + break; + case "n": + if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) { + i += 1; + } else { + str += json.slice(start, i) + "\n\n"; + while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') { + str += "\n"; + i += 2; + } + str += indent; + if (json[i + 2] === " ") + str += "\\"; + i += 1; + start = i + 1; + } + break; + default: + i += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx, false)); +} +function singleQuotedString(value, ctx) { + if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value)) + return doubleQuotedString(value, ctx); + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$& +${indent}`) + "'"; + return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx, false)); +} +function quotedString(value, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value.includes('"'); + const hasSingle = value.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value, ctx); +} +let blockEndNewlines; +try { + blockEndNewlines = new RegExp("(^|(?\n"; + let chomp; + let endStart; + for (endStart = value.length; endStart > 0; --endStart) { + const ch = value[endStart - 1]; + if (ch !== "\n" && ch !== " " && ch !== " ") + break; + } + let end = value.substring(endStart); + const endNlPos = end.indexOf("\n"); + if (endNlPos === -1) { + chomp = "-"; + } else if (value === end || endNlPos !== end.length - 1) { + chomp = "+"; + if (onChompKeep) + onChompKeep(); + } else { + chomp = ""; + } + if (end) { + value = value.slice(0, -end.length); + if (end[end.length - 1] === "\n") + end = end.slice(0, -1); + end = end.replace(blockEndNewlines, `$&${indent}`); + } + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value.length; ++startEnd) { + const ch = value[startEnd]; + if (ch === " ") + startWithSpace = true; + else if (ch === "\n") + startNlPos = startEnd; + else + break; + } + let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value = value.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? "2" : "1"; + let header = (literal ? "|" : ">") + (startWithSpace ? indentSize : "") + chomp; + if (comment) { + header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " ")); + if (onComment) + onComment(); + } + if (literal) { + value = value.replace(/\n+/g, `$&${indent}`); + return `${header} +${indent}${start}${value}${end}`; + } + value = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); + const body = foldFlowLines(`${start}${value}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx, true)); + return `${header} +${indent}${body}`; +} +function plainString(item, ctx, onComment, onChompKeep) { + const { type, value } = item; + const { actualString, implicitKey, indent, indentStep, inFlow } = ctx; + if (implicitKey && value.includes("\n") || inFlow && /[[\]{},]/.test(value)) { + return quotedString(value, ctx); + } + if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { + return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && !inFlow && type !== Scalar.PLAIN && value.includes("\n")) { + return blockString(item, ctx, onComment, onChompKeep); + } + if (containsDocumentMarker(value)) { + if (indent === "") { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } else if (implicitKey && indent === indentStep) { + return quotedString(value, ctx); + } + } + const str = value.replace(/\n+/g, `$& +${indent}`); + if (actualString) { + const test = (tag) => { + var _a; + return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str)); + }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) + return quotedString(value, ctx); + } + return implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx, false)); +} +function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); + let { type } = item; + if (type !== Scalar.QUOTE_DOUBLE) { + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type = Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.BLOCK_FOLDED: + case Scalar.BLOCK_LITERAL: + return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t = implicitKey && defaultKeyType || defaultStringType; + res = _stringify(t); + if (res === null) + throw new Error(`Unsupported default string type ${t}`); + } + return res; +} +function createStringifyContext(doc, options) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment, + defaultKeyType: null, + defaultStringType: "PLAIN", + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: "false", + flowCollectionPadding: true, + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: "null", + simpleKeys: false, + singleQuote: null, + trueStr: "true", + verifyAliasOrder: true + }, doc.schema.toStringOptions, options); + let inFlow; + switch (opt.collectionStyle) { + case "block": + inFlow = false; + break; + case "flow": + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: /* @__PURE__ */ new Set(), + doc, + flowCollectionPadding: opt.flowCollectionPadding ? " " : "", + indent: "", + indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", + inFlow, + options: opt + }; +} +function getTagObject(tags, item) { + var _a; + if (item.tag) { + const match = tags.filter((t) => t.tag === item.tag); + if (match.length > 0) + return match.find((t) => t.format === item.format) ?? match[0]; + } + let tagObj = void 0; + let obj; + if (isScalar$1(item)) { + obj = item.value; + let match = tags.filter((t) => { + var _a2; + return (_a2 = t.identify) == null ? void 0 : _a2.call(t, obj); + }); + if (match.length > 1) { + const testMatch = match.filter((t) => t.test); + if (testMatch.length > 0) + match = testMatch; + } + tagObj = match.find((t) => t.format === item.format) ?? match.find((t) => !t.format); + } else { + obj = item; + tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass); + } + if (!tagObj) { + const name = ((_a = obj == null ? void 0 : obj.constructor) == null ? void 0 : _a.name) ?? typeof obj; + throw new Error(`Tag not resolved for ${name} value`); + } + return tagObj; +} +function stringifyProps(node, tagObj, { anchors, doc }) { + if (!doc.directives) + return ""; + const props = []; + const anchor = (isScalar$1(node) || isCollection$1(node)) && node.anchor; + if (anchor && anchorIsValid(anchor)) { + anchors.add(anchor); + props.push(`&${anchor}`); + } + const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag; + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(" "); +} +function stringify$2(item, ctx, onComment, onChompKeep) { + var _a; + if (isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = /* @__PURE__ */ new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = void 0; + const node = isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node); + const props = stringifyProps(node, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1; + const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node, ctx, onComment, onChompKeep) : isScalar$1(node) ? stringifyString(node, ctx, onComment, onChompKeep) : node.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return isScalar$1(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} +${ctx.indent}${str}`; +} +function stringifyPair({ key, value }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = isNode(key) && key.comment || null; + if (simpleKeys) { + if (keyComment) { + throw new Error("With simple keys, key nodes cannot have comments"); + } + if (isCollection$1(key) || !isNode(key) && typeof key === "object") { + const msg = "With simple keys, collection cannot be used as a key value"; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && (!key || keyComment && value == null && !ctx.inFlow || isCollection$1(key) || (isScalar$1(key) ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL : typeof key === "object")); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify$2(key, ctx, () => keyCommentDone = true, () => chompKeep = true); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value == null) { + if (keyCommentDone && onComment) + onComment(); + return str === "" ? "?" : explicitKey ? `? ${str}` : str; + } + } else if (allNullValues && !simpleKeys || value == null && explicitKey) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += lineComment(str, ctx.indent, commentString(keyComment)); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str} +${indent}:`; + } else { + str = `${str}:`; + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + } + let vsb, vcb, valueComment; + if (isNode(value)) { + vsb = !!value.spaceBefore; + vcb = value.commentBefore; + valueComment = value.comment; + } else { + vsb = false; + vcb = null; + valueComment = null; + if (value && typeof value === "object") + value = doc.createNode(value); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && isScalar$1(value)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && isSeq(value) && !value.flow && !value.tag && !value.anchor) { + ctx.indent = ctx.indent.substring(2); + } + let valueCommentDone = false; + const valueStr = stringify$2(value, ctx, () => valueCommentDone = true, () => chompKeep = true); + let ws = " "; + if (keyComment || vsb || vcb) { + ws = vsb ? "\n" : ""; + if (vcb) { + const cs = commentString(vcb); + ws += ` +${indentComment(cs, ctx.indent)}`; + } + if (valueStr === "" && !ctx.inFlow) { + if (ws === "\n") + ws = "\n\n"; + } else { + ws += ` +${ctx.indent}`; + } + } else if (!explicitKey && isCollection$1(value)) { + const vs0 = valueStr[0]; + const nl0 = valueStr.indexOf("\n"); + const hasNewline = nl0 !== -1; + const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0; + if (hasNewline || !flow) { + let hasPropsLine = false; + if (hasNewline && (vs0 === "&" || vs0 === "!")) { + let sp0 = valueStr.indexOf(" "); + if (vs0 === "&" && sp0 !== -1 && sp0 < nl0 && valueStr[sp0 + 1] === "!") { + sp0 = valueStr.indexOf(" ", sp0 + 1); + } + if (sp0 === -1 || nl0 < sp0) + hasPropsLine = true; + } + if (!hasPropsLine) + ws = ` +${ctx.indent}`; + } + } else if (valueStr === "" || valueStr[0] === "\n") { + ws = ""; + } + str += ws + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } else if (valueComment && !valueCommentDone) { + str += lineComment(str, ctx.indent, commentString(valueComment)); + } else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; +} +function warn(logLevel, warning) { + if (logLevel === "debug" || logLevel === "warn") { + if (typeof process !== "undefined" && process.emitWarning) + process.emitWarning(warning); + else + console.warn(warning); + } +} +const MERGE_KEY = "<<"; +const merge = { + identify: (value) => value === MERGE_KEY || typeof value === "symbol" && value.description === MERGE_KEY, + default: "key", + tag: "tag:yaml.org,2002:merge", + test: /^<<$/, + resolve: () => Object.assign(new Scalar(Symbol(MERGE_KEY)), { + addToJSMap: addMergeToJSMap + }), + stringify: () => MERGE_KEY +}; +const isMergeKey = (ctx, key) => (merge.identify(key) || isScalar$1(key) && (!key.type || key.type === Scalar.PLAIN) && merge.identify(key.value)) && (ctx == null ? void 0 : ctx.doc.schema.tags.some((tag) => tag.tag === merge.tag && tag.default)); +function addMergeToJSMap(ctx, map2, value) { + value = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; + if (isSeq(value)) + for (const it of value.items) + mergeValue(ctx, map2, it); + else if (Array.isArray(value)) + for (const it of value) + mergeValue(ctx, map2, it); + else + mergeValue(ctx, map2, value); +} +function mergeValue(ctx, map2, value) { + const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value; + if (!isMap(source)) + throw new Error("Merge sources must be maps or map aliases"); + const srcMap = source.toJSON(null, ctx, Map); + for (const [key, value2] of srcMap) { + if (map2 instanceof Map) { + if (!map2.has(key)) + map2.set(key, value2); + } else if (map2 instanceof Set) { + map2.add(key); + } else if (!Object.prototype.hasOwnProperty.call(map2, key)) { + Object.defineProperty(map2, key, { + value: value2, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map2; +} +function addPairToJSMap(ctx, map2, { key, value }) { + if (isNode(key) && key.addToJSMap) + key.addToJSMap(ctx, map2, value); + else if (isMergeKey(ctx, key)) + addMergeToJSMap(ctx, map2, value); + else { + const jsKey = toJS(key, "", ctx); + if (map2 instanceof Map) { + map2.set(jsKey, toJS(value, jsKey, ctx)); + } else if (map2 instanceof Set) { + map2.add(jsKey); + } else { + const stringKey = stringifyKey(key, jsKey, ctx); + const jsValue = toJS(value, stringKey, ctx); + if (stringKey in map2) + Object.defineProperty(map2, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map2[stringKey] = jsValue; + } + } + return map2; +} +function stringifyKey(key, jsKey, ctx) { + if (jsKey === null) + return ""; + if (typeof jsKey !== "object") + return String(jsKey); + if (isNode(key) && (ctx == null ? void 0 : ctx.doc)) { + const strCtx = createStringifyContext(ctx.doc, {}); + strCtx.anchors = /* @__PURE__ */ new Set(); + for (const node of ctx.anchors.keys()) + strCtx.anchors.add(node.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); +} +function createPair(key, value, ctx) { + const k = createNode(key, void 0, ctx); + const v = createNode(value, void 0, ctx); + return new Pair(k, v); +} +class Pair { + constructor(key, value = null) { + Object.defineProperty(this, NODE_TYPE, { value: PAIR }); + this.key = key; + this.value = value; + } + clone(schema2) { + let { key, value } = this; + if (isNode(key)) + key = key.clone(schema2); + if (isNode(value)) + value = value.clone(schema2); + return new Pair(key, value); + } + toJSON(_, ctx) { + const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + return addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return (ctx == null ? void 0 : ctx.doc) ? stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); + } +} +function stringifyCollection(collection, ctx, options) { + const flow = ctx.inFlow ?? collection.flow; + const stringify2 = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify2(collection, ctx, options); +} +function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment2 = null; + if (isNode(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment2 = item.comment; + } else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str2 = stringify$2(item, itemCtx, () => comment2 = null, () => chompKeep = true); + if (comment2) + str2 += lineComment(str2, itemIndent, commentString(comment2)); + if (chompKeep && comment2) + chompKeep = false; + lines.push(blockItemPrefix + str2); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } else { + str = lines[0]; + for (let i = 1; i < lines.length; ++i) { + const line = lines[i]; + str += line ? ` +${indent}${line}` : "\n"; + } + } + if (comment) { + str += "\n" + indentComment(commentString(comment), indent); + if (onComment) + onComment(); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; +} +function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) { + const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment = null; + if (isNode(item)) { + if (item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment = item.comment; + } else if (isPair(item)) { + const ik = isNode(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = isNode(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } else if (item.value == null && (ik == null ? void 0 : ik.comment)) { + comment = ik.comment; + } + } + if (comment) + reqNewline = true; + let str = stringify$2(item, itemCtx, () => comment = null); + if (i < items.length - 1) + str += ","; + if (comment) + str += lineComment(str, itemIndent, commentString(comment)); + if (!reqNewline && (lines.length > linesAtValue || str.includes("\n"))) + reqNewline = true; + lines.push(str); + linesAtValue = lines.length; + } + const { start, end } = flowChars; + if (lines.length === 0) { + return start + end; + } else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth; + } + if (reqNewline) { + let str = start; + for (const line of lines) + str += line ? ` +${indentStep}${indent}${line}` : "\n"; + return `${str} +${indent}${end}`; + } else { + return `${start}${fcPadding}${lines.join(" ")}${fcPadding}${end}`; + } + } +} +function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { + if (comment && chompKeep) + comment = comment.replace(/^\n+/, ""); + if (comment) { + const ic = indentComment(commentString(comment), indent); + lines.push(ic.trimStart()); + } +} +function findPair(items, key) { + const k = isScalar$1(key) ? key.value : key; + for (const it of items) { + if (isPair(it)) { + if (it.key === key || it.key === k) + return it; + if (isScalar$1(it.key) && it.key.value === k) + return it; + } + } + return void 0; +} +class YAMLMap extends Collection { + static get tagName() { + return "tag:yaml.org,2002:map"; + } + constructor(schema2) { + super(MAP, schema2); + this.items = []; + } + /** + * A generic collection parsing method that can be extended + * to other node classes that inherit from YAMLMap + */ + static from(schema2, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map2 = new this(schema2); + const add = (key, value) => { + if (typeof replacer === "function") + value = replacer.call(obj, key, value); + else if (Array.isArray(replacer) && !replacer.includes(key)) + return; + if (value !== void 0 || keepUndefined) + map2.items.push(createPair(key, value, ctx)); + }; + if (obj instanceof Map) { + for (const [key, value] of obj) + add(key, value); + } else if (obj && typeof obj === "object") { + for (const key of Object.keys(obj)) + add(key, obj[key]); + } + if (typeof schema2.sortMapEntries === "function") { + map2.items.sort(schema2.sortMapEntries); + } + return map2; + } + /** + * Adds a value to the collection. + * + * @param overwrite - If not set `true`, using a key that is already in the + * collection will throw. Otherwise, overwrites the previous value. + */ + add(pair, overwrite) { + var _a; + let _pair; + if (isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== "object" || !("key" in pair)) { + _pair = new Pair(pair, pair == null ? void 0 : pair.value); + } else + _pair = new Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + if (isScalar$1(prev.value) && isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } else if (sortEntries) { + const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0); + if (i === -1) + this.items.push(_pair); + else + this.items.splice(i, 0, _pair); + } else { + this.items.push(_pair); + } + } + delete(key) { + const it = findPair(this.items, key); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key, keepScalar) { + const it = findPair(this.items, key); + const node = it == null ? void 0 : it.value; + return (!keepScalar && isScalar$1(node) ? node.value : node) ?? void 0; + } + has(key) { + return !!findPair(this.items, key); + } + set(key, value) { + this.add(new Pair(key, value), true); + } + /** + * @param ctx - Conversion context, originally set in Document#toJS() + * @param {Class} Type - If set, forces the returned collection type + * @returns Instance of Type, Map, or Object + */ + toJSON(_, ctx, Type) { + const map2 = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const item of this.items) + addPairToJSMap(ctx, map2, item); + return map2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection(this, ctx, { + blockItemPrefix: "", + flowChars: { start: "{", end: "}" }, + itemIndent: ctx.indent || "", + onChompKeep, + onComment + }); + } +} +const map = { + collection: "map", + default: true, + nodeClass: YAMLMap, + tag: "tag:yaml.org,2002:map", + resolve(map2, onError) { + if (!isMap(map2)) + onError("Expected a mapping for this tag"); + return map2; + }, + createNode: (schema2, obj, ctx) => YAMLMap.from(schema2, obj, ctx) +}; +class YAMLSeq extends Collection { + static get tagName() { + return "tag:yaml.org,2002:seq"; + } + constructor(schema2) { + super(SEQ, schema2); + this.items = []; + } + add(value) { + this.items.push(value); + } + /** + * Removes a value from the collection. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + * + * @returns `true` if the item was found and removed. + */ + delete(key) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + get(key, keepScalar) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return void 0; + const it = this.items[idx]; + return !keepScalar && isScalar$1(it) ? it.value : it; + } + /** + * Checks if the collection includes a value with the key `key`. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + */ + has(key) { + const idx = asItemIndex(key); + return typeof idx === "number" && idx < this.items.length; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + * + * If `key` does not contain a representation of an integer, this will throw. + * It may be wrapped in a `Scalar`. + */ + set(key, value) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + throw new Error(`Expected a valid index, not ${key}.`); + const prev = this.items[idx]; + if (isScalar$1(prev) && isScalarValue(value)) + prev.value = value; + else + this.items[idx] = value; + } + toJSON(_, ctx) { + const seq2 = []; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(seq2); + let i = 0; + for (const item of this.items) + seq2.push(toJS(item, String(i++), ctx)); + return seq2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection(this, ctx, { + blockItemPrefix: "- ", + flowChars: { start: "[", end: "]" }, + itemIndent: (ctx.indent || "") + " ", + onChompKeep, + onComment + }); + } + static from(schema2, obj, ctx) { + const { replacer } = ctx; + const seq2 = new this(schema2); + if (obj && Symbol.iterator in Object(obj)) { + let i = 0; + for (let it of obj) { + if (typeof replacer === "function") { + const key = obj instanceof Set ? it : String(i++); + it = replacer.call(obj, key, it); + } + seq2.items.push(createNode(it, void 0, ctx)); + } + } + return seq2; + } +} +function asItemIndex(key) { + let idx = isScalar$1(key) ? key.value : key; + if (idx && typeof idx === "string") + idx = Number(idx); + return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; +} +const seq = { + collection: "seq", + default: true, + nodeClass: YAMLSeq, + tag: "tag:yaml.org,2002:seq", + resolve(seq2, onError) { + if (!isSeq(seq2)) + onError("Expected a sequence for this tag"); + return seq2; + }, + createNode: (schema2, obj, ctx) => YAMLSeq.from(schema2, obj, ctx) +}; +const string = { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString(item, ctx, onComment, onChompKeep); + } +}; +const nullTag = { + identify: (value) => value == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar(null), + stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr +}; +const boolTag = { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: (str) => new Scalar(str[0] === "t" || str[0] === "T"), + stringify({ source, value }, ctx) { + if (source && boolTag.test.test(source)) { + const sv = source[0] === "t" || source[0] === "T"; + if (value === sv) + return source; + } + return value ? ctx.options.trueStr : ctx.options.falseStr; + } +}; +function stringifyNumber({ format, minFractionDigits, tag, value }) { + if (typeof value === "bigint") + return String(value); + const num = typeof value === "number" ? value : Number(value); + if (!isFinite(num)) + return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; + let n = JSON.stringify(value); + if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) { + let i = n.indexOf("."); + if (i < 0) { + i = n.length; + n += "."; + } + let d = minFractionDigits - (n.length - i - 1); + while (d-- > 0) + n += "0"; + } + return n; +} +const floatNaN$1 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +const floatExp$1 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node); + } +}; +const float$1 = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node = new Scalar(parseFloat(str)); + const dot = str.indexOf("."); + if (dot !== -1 && str[str.length - 1] === "0") + node.minFractionDigits = str.length - dot - 1; + return node; + }, + stringify: stringifyNumber +}; +const intIdentify$2 = (value) => typeof value === "bigint" || Number.isInteger(value); +const intResolve$1 = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix); +function intStringify$1(node, radix, prefix) { + const { value } = node; + if (intIdentify$2(value) && value >= 0) + return prefix + value.toString(radix); + return stringifyNumber(node); +} +const intOct$1 = { + identify: (value) => intIdentify$2(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 8, opt), + stringify: (node) => intStringify$1(node, 8, "0o") +}; +const int$1 = { + identify: intIdentify$2, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 0, 10, opt), + stringify: stringifyNumber +}; +const intHex$1 = { + identify: (value) => intIdentify$2(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 16, opt), + stringify: (node) => intStringify$1(node, 16, "0x") +}; +const schema$2 = [ + map, + seq, + string, + nullTag, + boolTag, + intOct$1, + int$1, + intHex$1, + floatNaN$1, + floatExp$1, + float$1 +]; +function intIdentify$1(value) { + return typeof value === "bigint" || Number.isInteger(value); +} +const stringifyJSON = ({ value }) => JSON.stringify(value); +const jsonScalars = [ + { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify: stringifyJSON + }, + { + identify: (value) => value == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^true|false$/, + resolve: (str) => str === "true", + stringify: stringifyJSON + }, + { + identify: intIdentify$1, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value }) => intIdentify$1(value) ? value.toString() : JSON.stringify(value) + }, + { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: (str) => parseFloat(str), + stringify: stringifyJSON + } +]; +const jsonError = { + default: true, + tag: "", + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } +}; +const schema$1 = [map, seq].concat(jsonScalars, jsonError); +const binary = { + identify: (value) => value instanceof Uint8Array, + // Buffer inherits from Uint8Array + default: false, + tag: "tag:yaml.org,2002:binary", + /** + * Returns a Buffer in node and an Uint8Array in browsers + * + * To use the resulting buffer as an image, you'll want to do something like: + * + * const blob = new Blob([buffer], { type: 'image/jpeg' }) + * document.querySelector('#photo').src = URL.createObjectURL(blob) + */ + resolve(src, onError) { + if (typeof Buffer === "function") { + return Buffer.from(src, "base64"); + } else if (typeof atob === "function") { + const str = atob(src.replace(/[\n\r]/g, "")); + const buffer = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) + buffer[i] = str.charCodeAt(i); + return buffer; + } else { + onError("This environment does not support reading binary tags; either Buffer or atob is required"); + return src; + } + }, + stringify({ comment, type, value }, ctx, onComment, onChompKeep) { + const buf = value; + let str; + if (typeof Buffer === "function") { + str = buf instanceof Buffer ? buf.toString("base64") : Buffer.from(buf.buffer).toString("base64"); + } else if (typeof btoa === "function") { + let s = ""; + for (let i = 0; i < buf.length; ++i) + s += String.fromCharCode(buf[i]); + str = btoa(s); + } else { + throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); + } + if (!type) + type = Scalar.BLOCK_LITERAL; + if (type !== Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n = Math.ceil(str.length / lineWidth); + const lines = new Array(n); + for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { + lines[i] = str.substr(o, lineWidth); + } + str = lines.join(type === Scalar.BLOCK_LITERAL ? "\n" : " "); + } + return stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); + } +}; +function resolvePairs(seq2, onError) { + if (isSeq(seq2)) { + for (let i = 0; i < seq2.items.length; ++i) { + let item = seq2.items[i]; + if (isPair(item)) + continue; + else if (isMap(item)) { + if (item.items.length > 1) + onError("Each pair must have its own sequence indicator"); + const pair = item.items[0] || new Pair(new Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} +${pair.key.commentBefore}` : item.commentBefore; + if (item.comment) { + const cn = pair.value ?? pair.key; + cn.comment = cn.comment ? `${item.comment} +${cn.comment}` : item.comment; + } + item = pair; + } + seq2.items[i] = isPair(item) ? item : new Pair(item); + } + } else + onError("Expected a sequence for this tag"); + return seq2; +} +function createPairs(schema2, iterable, ctx) { + const { replacer } = ctx; + const pairs2 = new YAMLSeq(schema2); + pairs2.tag = "tag:yaml.org,2002:pairs"; + let i = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === "function") + it = replacer.call(iterable, String(i++), it); + let key, value; + if (Array.isArray(it)) { + if (it.length === 2) { + key = it[0]; + value = it[1]; + } else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key = keys[0]; + value = it[key]; + } else { + throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`); + } + } else { + key = it; + } + pairs2.items.push(createPair(key, value, ctx)); + } + return pairs2; +} +const pairs = { + collection: "seq", + default: false, + tag: "tag:yaml.org,2002:pairs", + resolve: resolvePairs, + createNode: createPairs +}; +class YAMLOMap extends YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + /** + * If `ctx` is given, the return type is actually `Map`, + * but TypeScript won't allow widening the signature of a child method. + */ + toJSON(_, ctx) { + if (!ctx) + return super.toJSON(_); + const map2 = /* @__PURE__ */ new Map(); + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const pair of this.items) { + let key, value; + if (isPair(pair)) { + key = toJS(pair.key, "", ctx); + value = toJS(pair.value, key, ctx); + } else { + key = toJS(pair, "", ctx); + } + if (map2.has(key)) + throw new Error("Ordered maps must not include duplicate keys"); + map2.set(key, value); + } + return map2; + } + static from(schema2, iterable, ctx) { + const pairs2 = createPairs(schema2, iterable, ctx); + const omap2 = new this(); + omap2.items = pairs2.items; + return omap2; + } +} +YAMLOMap.tag = "tag:yaml.org,2002:omap"; +const omap = { + collection: "seq", + identify: (value) => value instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: "tag:yaml.org,2002:omap", + resolve(seq2, onError) { + const pairs2 = resolvePairs(seq2, onError); + const seenKeys = []; + for (const { key } of pairs2.items) { + if (isScalar$1(key)) { + if (seenKeys.includes(key.value)) { + onError(`Ordered maps must not include duplicate keys: ${key.value}`); + } else { + seenKeys.push(key.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs2); + }, + createNode: (schema2, iterable, ctx) => YAMLOMap.from(schema2, iterable, ctx) +}; +function boolStringify({ value, source }, ctx) { + const boolObj = value ? trueTag : falseTag; + if (source && boolObj.test.test(source)) + return source; + return value ? ctx.options.trueStr : ctx.options.falseStr; +} +const trueTag = { + identify: (value) => value === true, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar(true), + stringify: boolStringify +}; +const falseTag = { + identify: (value) => value === false, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/, + resolve: () => new Scalar(false), + stringify: boolStringify +}; +const floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber +}; +const floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, "")), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node); + } +}; +const float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node = new Scalar(parseFloat(str.replace(/_/g, ""))); + const dot = str.indexOf("."); + if (dot !== -1) { + const f = str.substring(dot + 1).replace(/_/g, ""); + if (f[f.length - 1] === "0") + node.minFractionDigits = f.length; + } + return node; + }, + stringify: stringifyNumber +}; +const intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); +function intResolve(str, offset, radix, { intAsBigInt }) { + const sign = str[0]; + if (sign === "-" || sign === "+") + offset += 1; + str = str.substring(offset).replace(/_/g, ""); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n2 = BigInt(str); + return sign === "-" ? BigInt(-1) * n2 : n2; + } + const n = parseInt(str, radix); + return sign === "-" ? -1 * n : n; +} +function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value)) { + const str = value.toString(radix); + return value < 0 ? "-" + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber(node); +} +const intBin = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "BIN", + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt), + stringify: (node) => intStringify(node, 2, "0b") +}; +const intOct = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt), + stringify: (node) => intStringify(node, 8, "0") +}; +const int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber +}; +const intHex = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node) => intStringify(node, 16, "0x") +}; +class YAMLSet extends YAMLMap { + constructor(schema2) { + super(schema2); + this.tag = YAMLSet.tag; + } + add(key) { + let pair; + if (isPair(key)) + pair = key; + else if (key && typeof key === "object" && "key" in key && "value" in key && key.value === null) + pair = new Pair(key.key, null); + else + pair = new Pair(key, null); + const prev = findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + /** + * If `keepPair` is `true`, returns the Pair matching `key`. + * Otherwise, returns the value of that Pair's key. + */ + get(key, keepPair) { + const pair = findPair(this.items, key); + return !keepPair && isPair(pair) ? isScalar$1(pair.key) ? pair.key.value : pair.key : pair; + } + set(key, value) { + if (typeof value !== "boolean") + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); + const prev = findPair(this.items, key); + if (prev && !value) { + this.items.splice(this.items.indexOf(prev), 1); + } else if (!prev && value) { + this.items.push(new Pair(key)); + } + } + toJSON(_, ctx) { + return super.toJSON(_, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error("Set items must all have null values"); + } + static from(schema2, iterable, ctx) { + const { replacer } = ctx; + const set2 = new this(schema2); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value of iterable) { + if (typeof replacer === "function") + value = replacer.call(iterable, value, value); + set2.items.push(createPair(value, null, ctx)); + } + return set2; + } +} +YAMLSet.tag = "tag:yaml.org,2002:set"; +const set = { + collection: "map", + identify: (value) => value instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: "tag:yaml.org,2002:set", + createNode: (schema2, iterable, ctx) => YAMLSet.from(schema2, iterable, ctx), + resolve(map2, onError) { + if (isMap(map2)) { + if (map2.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map2); + else + onError("Set items must all have null values"); + } else + onError("Expected a mapping for this tag"); + return map2; + } +}; +function parseSexagesimal(str, asBigInt) { + const sign = str[0]; + const parts = sign === "-" || sign === "+" ? str.substring(1) : str; + const num = (n) => asBigInt ? BigInt(n) : Number(n); + const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0)); + return sign === "-" ? num(-1) * res : res; +} +function stringifySexagesimal(node) { + let { value } = node; + let num = (n) => n; + if (typeof value === "bigint") + num = (n) => BigInt(n); + else if (isNaN(value) || !isFinite(value)) + return stringifyNumber(node); + let sign = ""; + if (value < 0) { + sign = "-"; + value *= num(-1); + } + const _60 = num(60); + const parts = [value % _60]; + if (value < 60) { + parts.unshift(0); + } else { + value = (value - parts[0]) / _60; + parts.unshift(value % _60); + if (value >= 60) { + value = (value - parts[0]) / _60; + parts.unshift(value); + } + } + return sign + parts.map((n) => String(n).padStart(2, "0")).join(":").replace(/000000\d*$/, ""); +} +const intTime = { + identify: (value) => typeof value === "bigint" || Number.isInteger(value), + default: true, + tag: "tag:yaml.org,2002:int", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal +}; +const floatTime = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: (str) => parseSexagesimal(str, false), + stringify: stringifySexagesimal +}; +const timestamp = { + identify: (value) => value instanceof Date, + default: true, + tag: "tag:yaml.org,2002:timestamp", + // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part + // may be omitted altogether, resulting in a date format. In such a case, the time part is + // assumed to be 00:00:00Z (start of day, UTC). + test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== "Z") { + let d = parseSexagesimal(tz, false); + if (Math.abs(d) < 30) + d *= 60; + date -= 6e4 * d; + } + return new Date(date); + }, + stringify: ({ value }) => value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, "") +}; +const schema = [ + map, + seq, + string, + nullTag, + trueTag, + falseTag, + intBin, + intOct, + int, + intHex, + floatNaN, + floatExp, + float, + binary, + merge, + omap, + pairs, + set, + intTime, + floatTime, + timestamp +]; +const schemas = /* @__PURE__ */ new Map([ + ["core", schema$2], + ["failsafe", [map, seq, string]], + ["json", schema$1], + ["yaml11", schema], + ["yaml-1.1", schema] +]); +const tagsByName = { + binary, + bool: boolTag, + float: float$1, + floatExp: floatExp$1, + floatNaN: floatNaN$1, + floatTime, + int: int$1, + intHex: intHex$1, + intOct: intOct$1, + intTime, + map, + merge, + null: nullTag, + omap, + pairs, + seq, + set, + timestamp +}; +const coreKnownTags = { + "tag:yaml.org,2002:binary": binary, + "tag:yaml.org,2002:merge": merge, + "tag:yaml.org,2002:omap": omap, + "tag:yaml.org,2002:pairs": pairs, + "tag:yaml.org,2002:set": set, + "tag:yaml.org,2002:timestamp": timestamp +}; +function getTags(customTags, schemaName, addMergeTag) { + const schemaTags = schemas.get(schemaName); + if (schemaTags && !customTags) { + return addMergeTag && !schemaTags.includes(merge) ? schemaTags.concat(merge) : schemaTags.slice(); + } + let tags = schemaTags; + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } else if (typeof customTags === "function") { + tags = customTags(tags.slice()); + } + if (addMergeTag) + tags = tags.concat(merge); + return tags.reduce((tags2, tag) => { + const tagObj = typeof tag === "string" ? tagsByName[tag] : tag; + if (!tagObj) { + const tagName = JSON.stringify(tag); + const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`); + } + if (!tags2.includes(tagObj)) + tags2.push(tagObj); + return tags2; + }, []); +} +const sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; +class Schema { + constructor({ compat, customTags, merge: merge2, resolveKnownTags, schema: schema2, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) ? getTags(compat, "compat") : compat ? getTags(null, compat) : null; + this.name = typeof schema2 === "string" && schema2 || "core"; + this.knownTags = resolveKnownTags ? coreKnownTags : {}; + this.tags = getTags(customTags, this.name, merge2); + this.toStringOptions = toStringDefaults ?? null; + Object.defineProperty(this, MAP, { value: map }); + Object.defineProperty(this, SCALAR$1, { value: string }); + Object.defineProperty(this, SEQ, { value: seq }); + this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; + } + clone() { + const copy2 = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy2.tags = this.tags.slice(); + return copy2; + } +} +function stringifyDocument(doc, options) { + var _a; + const lines = []; + let hasDirectives = options.directives === true; + if (options.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } else if (doc.directives.docStart) + hasDirectives = true; + } + if (hasDirectives) + lines.push("---"); + const ctx = createStringifyContext(doc, options); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(""); + const cs = commentString(doc.commentBefore); + lines.unshift(indentComment(cs, "")); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (isNode(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(""); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(indentComment(cs, "")); + } + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? void 0 : () => chompKeep = true; + let body = stringify$2(doc.contents, ctx, () => contentComment = null, onChompKeep); + if (contentComment) + body += lineComment(body, "", commentString(contentComment)); + if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { + lines[lines.length - 1] = `--- ${body}`; + } else + lines.push(body); + } else { + lines.push(stringify$2(doc.contents, ctx)); + } + if ((_a = doc.directives) == null ? void 0 : _a.docEnd) { + if (doc.comment) { + const cs = commentString(doc.comment); + if (cs.includes("\n")) { + lines.push("..."); + lines.push(indentComment(cs, "")); + } else { + lines.push(`... ${cs}`); + } + } else { + lines.push("..."); + } + } else { + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ""); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") + lines.push(""); + lines.push(indentComment(commentString(dc), "")); + } + } + return lines.join("\n") + "\n"; +} +class Document { + constructor(value, replacer, options) { + this.commentBefore = null; + this.comment = null; + this.errors = []; + this.warnings = []; + Object.defineProperty(this, NODE_TYPE, { value: DOC }); + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const opt = Object.assign({ + intAsBigInt: false, + keepSourceTokens: false, + logLevel: "warn", + prettyErrors: true, + strict: true, + stringKeys: false, + uniqueKeys: true, + version: "1.2" + }, options); + this.options = opt; + let { version } = opt; + if (options == null ? void 0 : options._directives) { + this.directives = options._directives.atDocument(); + if (this.directives.yaml.explicit) + version = this.directives.yaml.version; + } else + this.directives = new Directives({ version }); + this.setSchema(version, options); + this.contents = value === void 0 ? null : this.createNode(value, _replacer, options); + } + /** + * Create a deep copy of this Document and its contents. + * + * Custom Node values that inherit from `Object` still refer to their original instances. + */ + clone() { + const copy2 = Object.create(Document.prototype, { + [NODE_TYPE]: { value: DOC } + }); + copy2.commentBefore = this.commentBefore; + copy2.comment = this.comment; + copy2.errors = this.errors.slice(); + copy2.warnings = this.warnings.slice(); + copy2.options = Object.assign({}, this.options); + if (this.directives) + copy2.directives = this.directives.clone(); + copy2.schema = this.schema.clone(); + copy2.contents = isNode(this.contents) ? this.contents.clone(copy2.schema) : this.contents; + if (this.range) + copy2.range = this.range.slice(); + return copy2; + } + /** Adds a value to the document. */ + add(value) { + if (assertCollection(this.contents)) + this.contents.add(value); + } + /** Adds a value to the document. */ + addIn(path, value) { + if (assertCollection(this.contents)) + this.contents.addIn(path, value); + } + /** + * Create a new `Alias` node, ensuring that the target `node` has the required anchor. + * + * If `node` already has an anchor, `name` is ignored. + * Otherwise, the `node.anchor` value will be set to `name`, + * or if an anchor with that name is already present in the document, + * `name` will be used as a prefix for a new unique anchor. + * If `name` is undefined, the generated anchor will use 'a' as a prefix. + */ + createAlias(node, name) { + if (!node.anchor) { + const prev = anchorNames(this); + node.anchor = // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + !name || prev.has(name) ? findNewAnchor(name || "a", prev) : name; + } + return new Alias(node.anchor); + } + createNode(value, replacer, options) { + let _replacer = void 0; + if (typeof replacer === "function") { + value = replacer.call({ "": value }, "", value); + _replacer = replacer; + } else if (Array.isArray(replacer)) { + const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {}; + const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors( + this, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + anchorPrefix || "a" + ); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects ?? true, + keepUndefined: keepUndefined ?? false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node = createNode(value, tag, ctx); + if (flow && isCollection$1(node)) + node.flow = true; + setAnchors(); + return node; + } + /** + * Convert a key and a value into a `Pair` using the current schema, + * recursively wrapping all values as `Scalar` or `Collection` nodes. + */ + createPair(key, value, options = {}) { + const k = this.createNode(key, null, options); + const v = this.createNode(value, null, options); + return new Pair(k, v); + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + delete(key) { + return assertCollection(this.contents) ? this.contents.delete(key) : false; + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + deleteIn(path) { + if (isEmptyPath(path)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) ? this.contents.deleteIn(path) : false; + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + get(key, keepScalar) { + return isCollection$1(this.contents) ? this.contents.get(key, keepScalar) : void 0; + } + /** + * Returns item at `path`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path, keepScalar) { + if (isEmptyPath(path)) + return !keepScalar && isScalar$1(this.contents) ? this.contents.value : this.contents; + return isCollection$1(this.contents) ? this.contents.getIn(path, keepScalar) : void 0; + } + /** + * Checks if the document includes a value with the key `key`. + */ + has(key) { + return isCollection$1(this.contents) ? this.contents.has(key) : false; + } + /** + * Checks if the document includes a value at `path`. + */ + hasIn(path) { + if (isEmptyPath(path)) + return this.contents !== void 0; + return isCollection$1(this.contents) ? this.contents.hasIn(path) : false; + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + set(key, value) { + if (this.contents == null) { + this.contents = collectionFromPath(this.schema, [key], value); + } else if (assertCollection(this.contents)) { + this.contents.set(key, value); + } + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path, value) { + if (isEmptyPath(path)) { + this.contents = value; + } else if (this.contents == null) { + this.contents = collectionFromPath(this.schema, Array.from(path), value); + } else if (assertCollection(this.contents)) { + this.contents.setIn(path, value); + } + } + /** + * Change the YAML version and schema used by the document. + * A `null` version disables support for directives, explicit tags, anchors, and aliases. + * It also requires the `schema` option to be given as a `Schema` instance value. + * + * Overrides all previously set schema options. + */ + setSchema(version, options = {}) { + if (typeof version === "number") + version = String(version); + let opt; + switch (version) { + case "1.1": + if (this.directives) + this.directives.yaml.version = "1.1"; + else + this.directives = new Directives({ version: "1.1" }); + opt = { resolveKnownTags: false, schema: "yaml-1.1" }; + break; + case "1.2": + case "next": + if (this.directives) + this.directives.yaml.version = version; + else + this.directives = new Directives({ version }); + opt = { resolveKnownTags: true, schema: "core" }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + if (options.schema instanceof Object) + this.schema = options.schema; + else if (opt) + this.schema = new Schema(Object.assign(opt, options)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + // json & jsonArg are only used from toJSON() + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS(this.contents, jsonArg ?? "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; + } + /** + * A JSON representation of the document `contents`. + * + * @param jsonArg Used by `JSON.stringify` to indicate the array index or + * property name. + */ + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + /** A YAML representation of the document. */ + toString(options = {}) { + if (this.errors.length > 0) + throw new Error("Document with errors cannot be stringified"); + if ("indent" in options && (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) { + const s = JSON.stringify(options.indent); + throw new Error(`"indent" option must be a positive integer, not ${s}`); + } + return stringifyDocument(this, options); + } +} +function assertCollection(contents) { + if (isCollection$1(contents)) + return true; + throw new Error("Expected a YAML collection as document contents"); +} +class YAMLError extends Error { + constructor(name, pos, code, message) { + super(); + this.name = name; + this.code = code; + this.message = message; + this.pos = pos; + } +} +class YAMLParseError extends YAMLError { + constructor(pos, code, message) { + super("YAMLParseError", pos, code, message); + } +} +class YAMLWarning extends YAMLError { + constructor(pos, code, message) { + super("YAMLWarning", pos, code, message); + } +} +const prettifyError = (src, lc) => (error) => { + if (error.pos[0] === -1) + return; + error.linePos = error.pos.map((pos) => lc.linePos(pos)); + const { line, col } = error.linePos[0]; + error.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src.substring(lc.lineStarts[line - 1], lc.lineStarts[line]).replace(/[\n\r]+$/, ""); + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = "…" + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + "…"; + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + "…\n"; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.max(1, Math.min(end.col - col, 80 - ci)); + } + const pointer = " ".repeat(ci) + "^".repeat(count); + error.message += `: + +${lineStr} +${pointer} +`; + } +}; +function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment = ""; + let commentSep = ""; + let hasNewline = false; + let reqSpace = false; + let tab = null; + let anchor = null; + let tag = null; + let newlineAfterProp = null; + let comma = null; + let found = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== "space" && token.type !== "newline" && token.type !== "comma") + onError(token.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + reqSpace = false; + } + if (tab) { + if (atNewline && token.type !== "comment" && token.type !== "newline") { + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + } + tab = null; + } + switch (token.type) { + case "space": + if (!flow && (indicator !== "doc-start" || (next == null ? void 0 : next.type) !== "flow-collection") && token.source.includes(" ")) { + tab = token; + } + hasSpace = true; + break; + case "comment": { + if (!hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = token.source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += commentSep + cb; + commentSep = ""; + atNewline = false; + break; + } + case "newline": + if (atNewline) { + if (comment) + comment += token.source; + else + spaceBefore = true; + } else + commentSep += token.source; + atNewline = true; + hasNewline = true; + if (anchor || tag) + newlineAfterProp = token; + hasSpace = true; + break; + case "anchor": + if (anchor) + onError(token, "MULTIPLE_ANCHORS", "A node can have at most one anchor"); + if (token.source.endsWith(":")) + onError(token.offset + token.source.length - 1, "BAD_ALIAS", "Anchor ending in : is ambiguous", true); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case "tag": { + if (tag) + onError(token, "MULTIPLE_TAGS", "A node can have at most one tag"); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + if (anchor || tag) + onError(token, "BAD_PROP_ORDER", `Anchors and tags must be after the ${token.source} indicator`); + if (found) + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.source} in ${flow ?? "collection"}`); + found = token; + atNewline = indicator === "seq-item-ind" || indicator === "explicit-key-ind"; + hasSpace = false; + break; + case "comma": + if (flow) { + if (comma) + onError(token, "UNEXPECTED_TOKEN", `Unexpected , in ${flow}`); + comma = token; + atNewline = false; + hasSpace = false; + break; + } + // else fallthrough + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset; + if (reqSpace && next && next.type !== "space" && next.type !== "newline" && next.type !== "comma" && (next.type !== "scalar" || next.source !== "")) { + onError(next.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + } + if (tab && (atNewline && tab.indent <= parentIndent || (next == null ? void 0 : next.type) === "block-map" || (next == null ? void 0 : next.type) === "block-seq")) + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + return { + comma, + found, + spaceBefore, + comment, + hasNewline, + anchor, + tag, + newlineAfterProp, + end, + start: start ?? end + }; +} +function containsNewline(key) { + if (!key) + return null; + switch (key.type) { + case "alias": + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + if (key.source.includes("\n")) + return true; + if (key.end) { + for (const st of key.end) + if (st.type === "newline") + return true; + } + return false; + case "flow-collection": + for (const it of key.items) { + for (const st of it.start) + if (st.type === "newline") + return true; + if (it.sep) { + for (const st of it.sep) + if (st.type === "newline") + return true; + } + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } +} +function flowIndentCheck(indent, fc, onError) { + if ((fc == null ? void 0 : fc.type) === "flow-collection") { + const end = fc.end[0]; + if (end.indent === indent && (end.source === "]" || end.source === "}") && containsNewline(fc)) { + const msg = "Flow end indicator should be more indented than parent"; + onError(end, "BAD_INDENT", msg, true); + } + } +} +function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a, b) => a === b || isScalar$1(a) && isScalar$1(b) && a.value === b.value; + return items.some((pair) => isEqual(pair.key, search)); +} +const startColMsg = "All mapping items must start at the same column"; +function resolveBlockMap({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bm, onError, tag) { + var _a; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLMap; + const map2 = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bm.offset; + let commentEnd = null; + for (const collItem of bm.items) { + const { start, key, sep, value } = collItem; + const keyProps = resolveProps(start, { + indicator: "explicit-key-ind", + next: key ?? (sep == null ? void 0 : sep[0]), + offset, + onError, + parentIndent: bm.indent, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key) { + if (key.type === "block-seq") + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "A block sequence may not be used as an implicit map key"); + else if ("indent" in key && key.indent !== bm.indent) + onError(offset, "BAD_INDENT", startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep) { + commentEnd = keyProps.end; + if (keyProps.comment) { + if (map2.comment) + map2.comment += "\n" + keyProps.comment; + else + map2.comment = keyProps.comment; + } + continue; + } + if (keyProps.newlineAfterProp || containsNewline(key)) { + onError(key ?? start[start.length - 1], "MULTILINE_IMPLICIT_KEY", "Implicit keys need to be on a single line"); + } + } else if (((_a = keyProps.found) == null ? void 0 : _a.indent) !== bm.indent) { + onError(offset, "BAD_INDENT", startColMsg); + } + ctx.atKey = true; + const keyStart = keyProps.end; + const keyNode = key ? composeNode2(ctx, key, keyProps, onError) : composeEmptyNode2(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, key, onError); + ctx.atKey = false; + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + const valueProps = resolveProps(sep ?? [], { + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: bm.indent, + startOnNewline: !key || key.type === "block-scalar" + }); + offset = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value == null ? void 0 : value.type) === "block-map" && !valueProps.hasNewline) + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "Nested mappings are not allowed in compact mappings"); + if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024) + onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key"); + } + const valueNode = value ? composeNode2(ctx, value, valueProps, onError) : composeEmptyNode2(ctx, offset, sep, null, valueProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, value, onError); + offset = valueNode.range[2]; + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } else { + if (implicitKey) + onError(keyNode.range, "MISSING_CHAR", "Implicit map keys need to be followed by map values"); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } + } + if (commentEnd && commentEnd < offset) + onError(commentEnd, "IMPOSSIBLE", "Map comment with trailing content"); + map2.range = [bm.offset, offset, commentEnd ?? offset]; + return map2; +} +function resolveBlockSeq({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bs, onError, tag) { + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLSeq; + const seq2 = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset = bs.offset; + let commentEnd = null; + for (const { start, value } of bs.items) { + const props = resolveProps(start, { + indicator: "seq-item-ind", + next: value, + offset, + onError, + parentIndent: bs.indent, + startOnNewline: true + }); + if (!props.found) { + if (props.anchor || props.tag || value) { + if (value && value.type === "block-seq") + onError(props.end, "BAD_INDENT", "All sequence items must start at the same column"); + else + onError(offset, "MISSING_CHAR", "Sequence item without - indicator"); + } else { + commentEnd = props.end; + if (props.comment) + seq2.comment = props.comment; + continue; + } + } + const node = value ? composeNode2(ctx, value, props, onError) : composeEmptyNode2(ctx, props.end, start, null, props, onError); + if (ctx.schema.compat) + flowIndentCheck(bs.indent, value, onError); + offset = node.range[2]; + seq2.items.push(node); + } + seq2.range = [bs.offset, offset, commentEnd ?? offset]; + return seq2; +} +function resolveEnd(end, offset, reqSpace, onError) { + let comment = ""; + if (end) { + let hasSpace = false; + let sep = ""; + for (const token of end) { + const { source, type } = token; + switch (type) { + case "space": + hasSpace = true; + break; + case "comment": { + if (reqSpace && !hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += sep + cb; + sep = ""; + break; + } + case "newline": + if (comment) + sep += source; + hasSpace = true; + break; + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${type} at node end`); + } + offset += source.length; + } + } + return { comment, offset }; +} +const blockMsg = "Block collections are not allowed within flow collections"; +const isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq"); +function resolveFlowCollection({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, fc, onError, tag) { + const isMap2 = fc.start.source === "{"; + const fcName = isMap2 ? "flow map" : "flow sequence"; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? (isMap2 ? YAMLMap : YAMLSeq); + const coll = new NodeClass(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset = fc.offset + fc.start.source.length; + for (let i = 0; i < fc.items.length; ++i) { + const collItem = fc.items[i]; + const { start, key, sep, value } = collItem; + const props = resolveProps(start, { + flow: fcName, + indicator: "explicit-key-ind", + next: key ?? (sep == null ? void 0 : sep[0]), + offset, + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep && !value) { + if (i === 0 && props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + else if (i < fc.items.length - 1) + onError(props.start, "UNEXPECTED_TOKEN", `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += "\n" + props.comment; + else + coll.comment = props.comment; + } + offset = props.end; + continue; + } + if (!isMap2 && ctx.options.strict && containsNewline(key)) + onError( + key, + // checked by containsNewline() + "MULTILINE_IMPLICIT_KEY", + "Implicit keys of flow sequence pairs need to be on a single line" + ); + } + if (i === 0) { + if (props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + } else { + if (!props.comma) + onError(props.start, "MISSING_CHAR", `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ""; + loop: for (const st of start) { + switch (st.type) { + case "comma": + case "space": + break; + case "comment": + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (isPair(prev)) + prev = prev.value ?? prev.key; + if (prev.comment) + prev.comment += "\n" + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap2 && !sep && !props.found) { + const valueNode = value ? composeNode2(ctx, value, props, onError) : composeEmptyNode2(ctx, props.end, sep, null, props, onError); + coll.items.push(valueNode); + offset = valueNode.range[2]; + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else { + ctx.atKey = true; + const keyStart = props.end; + const keyNode = key ? composeNode2(ctx, key, props, onError) : composeEmptyNode2(ctx, keyStart, start, null, props, onError); + if (isBlock(key)) + onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); + ctx.atKey = false; + const valueProps = resolveProps(sep ?? [], { + flow: fcName, + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap2 && !props.found && ctx.options.strict) { + if (sep) + for (const st of sep) { + if (st === valueProps.found) + break; + if (st.type === "newline") { + onError(st, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit flow sequence key"); + } + } else if (value) { + if ("source" in value && value.source && value.source[0] === ":") + onError(value, "MISSING_CHAR", `Missing space after : in ${fcName}`); + else + onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`); + } + const valueNode = value ? composeNode2(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode2(ctx, valueProps.end, sep, null, valueProps, onError) : null; + if (valueNode) { + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap2) { + const map2 = coll; + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + map2.items.push(pair); + } else { + const map2 = new YAMLMap(ctx.schema); + map2.flow = true; + map2.items.push(pair); + const endRange = (valueNode ?? keyNode).range; + map2.range = [keyNode.range[0], endRange[1], endRange[2]]; + coll.items.push(map2); + } + offset = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap2 ? "}" : "]"; + const [ce, ...ee] = fc.end; + let cePos = offset; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot ? `${name} must end with a ${expectedEnd}` : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset, atRoot ? "MISSING_CHAR" : "BAD_INDENT", msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += "\n" + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; +} +function resolveCollection(CN2, ctx, token, onError, tagName, tag) { + const coll = token.type === "block-map" ? resolveBlockMap(CN2, ctx, token, onError, tag) : token.type === "block-seq" ? resolveBlockSeq(CN2, ctx, token, onError, tag) : resolveFlowCollection(CN2, ctx, token, onError, tag); + const Coll = coll.constructor; + if (tagName === "!" || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + if (tagName) + coll.tag = tagName; + return coll; +} +function composeCollection(CN2, ctx, token, props, onError) { + var _a; + const tagToken = props.tag; + const tagName = !tagToken ? null : ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)); + if (token.type === "block-seq") { + const { anchor, newlineAfterProp: nl } = props; + const lastProp = anchor && tagToken ? anchor.offset > tagToken.offset ? anchor : tagToken : anchor ?? tagToken; + if (lastProp && (!nl || nl.offset < lastProp.offset)) { + const message = "Missing newline after block sequence props"; + onError(lastProp, "MISSING_CHAR", message); + } + } + const expType = token.type === "block-map" ? "map" : token.type === "block-seq" ? "seq" : token.start.source === "{" ? "map" : "seq"; + if (!tagToken || !tagName || tagName === "!" || tagName === YAMLMap.tagName && expType === "map" || tagName === YAMLSeq.tagName && expType === "seq") { + return resolveCollection(CN2, ctx, token, onError, tagName); + } + let tag = ctx.schema.tags.find((t) => t.tag === tagName && t.collection === expType); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } else { + if (kt == null ? void 0 : kt.collection) { + onError(tagToken, "BAD_COLLECTION_TYPE", `${kt.tag} used for ${expType} collection, but expects ${kt.collection}`, true); + } else { + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, true); + } + return resolveCollection(CN2, ctx, token, onError, tagName); + } + } + const coll = resolveCollection(CN2, ctx, token, onError, tagName, tag); + const res = ((_a = tag.resolve) == null ? void 0 : _a.call(tag, coll, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg), ctx.options)) ?? coll; + const node = isNode(res) ? res : new Scalar(res); + node.range = coll.range; + node.tag = tagName; + if (tag == null ? void 0 : tag.format) + node.format = tag.format; + return node; +} +function resolveBlockScalar(ctx, scalar, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError); + if (!header) + return { value: "", type: null, comment: "", range: [start, start, start] }; + const type = header.mode === ">" ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + let chompStart = lines.length; + for (let i = lines.length - 1; i >= 0; --i) { + const content = lines[i][1]; + if (content === "" || content === "\r") + chompStart = i; + else + break; + } + if (chompStart === 0) { + const value2 = header.chomp === "+" && lines.length > 0 ? "\n".repeat(Math.max(1, lines.length - 1)) : ""; + let end2 = start + header.length; + if (scalar.source) + end2 += scalar.source.length; + return { value: value2, type, comment: header.comment, range: [start, end2, end2] }; + } + let trimIndent = scalar.indent + header.indent; + let offset = scalar.offset + header.length; + let contentStart = 0; + for (let i = 0; i < chompStart; ++i) { + const [indent, content] = lines[i]; + if (content === "" || content === "\r") { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } else { + if (indent.length < trimIndent) { + const message = "Block scalars with more-indented leading empty lines must use an explicit indentation indicator"; + onError(offset + indent.length, "MISSING_CHAR", message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i; + if (trimIndent === 0 && !ctx.atRoot) { + const message = "Block scalar values in collections must be indented"; + onError(offset, "BAD_INDENT", message); + } + break; + } + offset += indent.length + content.length + 1; + } + for (let i = lines.length - 1; i >= chompStart; --i) { + if (lines[i][0].length > trimIndent) + chompStart = i + 1; + } + let value = ""; + let sep = ""; + let prevMoreIndented = false; + for (let i = 0; i < contentStart; ++i) + value += lines[i][0].slice(trimIndent) + "\n"; + for (let i = contentStart; i < chompStart; ++i) { + let [indent, content] = lines[i]; + offset += indent.length + content.length + 1; + const crlf = content[content.length - 1] === "\r"; + if (crlf) + content = content.slice(0, -1); + if (content && indent.length < trimIndent) { + const src = header.indent ? "explicit indentation indicator" : "first line"; + const message = `Block scalar lines must not be less indented than their ${src}`; + onError(offset - content.length - (crlf ? 2 : 1), "BAD_INDENT", message); + indent = ""; + } + if (type === Scalar.BLOCK_LITERAL) { + value += sep + indent.slice(trimIndent) + content; + sep = "\n"; + } else if (indent.length > trimIndent || content[0] === " ") { + if (sep === " ") + sep = "\n"; + else if (!prevMoreIndented && sep === "\n") + sep = "\n\n"; + value += sep + indent.slice(trimIndent) + content; + sep = "\n"; + prevMoreIndented = true; + } else if (content === "") { + if (sep === "\n") + value += "\n"; + else + sep = "\n"; + } else { + value += sep + content; + sep = " "; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case "-": + break; + case "+": + for (let i = chompStart; i < lines.length; ++i) + value += "\n" + lines[i][0].slice(trimIndent); + if (value[value.length - 1] !== "\n") + value += "\n"; + break; + default: + value += "\n"; + } + const end = start + header.length + scalar.source.length; + return { value, type, comment: header.comment, range: [start, end, end] }; +} +function parseBlockScalarHeader({ offset, props }, strict, onError) { + if (props[0].type !== "block-scalar-header") { + onError(props[0], "IMPOSSIBLE", "Block scalar header not found"); + return null; + } + const { source } = props[0]; + const mode = source[0]; + let indent = 0; + let chomp = ""; + let error = -1; + for (let i = 1; i < source.length; ++i) { + const ch = source[i]; + if (!chomp && (ch === "-" || ch === "+")) + chomp = ch; + else { + const n = Number(ch); + if (!indent && n) + indent = n; + else if (error === -1) + error = offset + i; + } + } + if (error !== -1) + onError(error, "UNEXPECTED_TOKEN", `Block scalar header includes extra characters: ${source}`); + let hasSpace = false; + let comment = ""; + let length = source.length; + for (let i = 1; i < props.length; ++i) { + const token = props[i]; + switch (token.type) { + case "space": + hasSpace = true; + // fallthrough + case "newline": + length += token.source.length; + break; + case "comment": + if (strict && !hasSpace) { + const message = "Comments must be separated from other tokens by white space characters"; + onError(token, "MISSING_CHAR", message); + } + length += token.source.length; + comment = token.source.substring(1); + break; + case "error": + onError(token, "UNEXPECTED_TOKEN", token.message); + length += token.source.length; + break; + /* istanbul ignore next should not happen */ + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, "UNEXPECTED_TOKEN", message); + const ts = token.source; + if (ts && typeof ts === "string") + length += ts.length; + } + } + } + return { mode, indent, chomp, comment, length }; +} +function splitLines(source) { + const split = source.split(/\n( *)/); + const first = split[0]; + const m = first.match(/^( *)/); + const line0 = (m == null ? void 0 : m[1]) ? [m[1], first.slice(m[1].length)] : ["", first]; + const lines = [line0]; + for (let i = 1; i < split.length; i += 2) + lines.push([split[i], split[i + 1]]); + return lines; +} +function resolveFlowScalar(scalar, strict, onError) { + const { offset, type, source, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset + rel, code, msg); + switch (type) { + case "scalar": + _type = Scalar.PLAIN; + value = plainValue(source, _onError); + break; + case "single-quoted-scalar": + _type = Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source, _onError); + break; + case "double-quoted-scalar": + _type = Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source, _onError); + break; + /* istanbul ignore next should not happen */ + default: + onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type}`); + return { + value: "", + type: null, + comment: "", + range: [offset, offset + source.length, offset + source.length] + }; + } + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re.comment, + range: [offset, valueEnd, re.offset] + }; +} +function plainValue(source, onError) { + let badChar = ""; + switch (source[0]) { + /* istanbul ignore next should not happen */ + case " ": + badChar = "a tab character"; + break; + case ",": + badChar = "flow indicator character ,"; + break; + case "%": + badChar = "directive indicator character %"; + break; + case "|": + case ">": { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case "@": + case "`": { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`); + return foldLines(source); +} +function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, "MISSING_CHAR", "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); +} +function foldLines(source) { + let first, line; + try { + first = new RegExp("(.*?)(? wsStart ? source.slice(wsStart, i + 1) : ch; + } else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, "MISSING_CHAR", 'Missing closing "quote'); + return res; +} +function foldNewline(source, offset) { + let fold = ""; + let ch = source[offset + 1]; + while (ch === " " || ch === " " || ch === "\n" || ch === "\r") { + if (ch === "\r" && source[offset + 2] !== "\n") + break; + if (ch === "\n") + fold += "\n"; + offset += 1; + ch = source[offset + 1]; + } + if (!fold) + fold = " "; + return { fold, offset }; +} +const escapeCodes = { + "0": "\0", + // null character + a: "\x07", + // bell character + b: "\b", + // backspace + e: "\x1B", + // escape character + f: "\f", + // form feed + n: "\n", + // line feed + r: "\r", + // carriage return + t: " ", + // horizontal tab + v: "\v", + // vertical tab + N: "…", + // Unicode next line + _: " ", + // Unicode non-breaking space + L: "\u2028", + // Unicode line separator + P: "\u2029", + // Unicode paragraph separator + " ": " ", + '"': '"', + "/": "/", + "\\": "\\", + " ": " " +}; +function parseCharCode(source, offset, length, onError) { + const cc = source.substr(offset, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset - 2, length + 2); + onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); +} +function composeScalar(ctx, token, tagToken, onError) { + const { value, type, comment, range } = token.type === "block-scalar" ? resolveBlockScalar(ctx, token, onError) : resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null; + let tag; + if (ctx.options.stringKeys && ctx.atKey) { + tag = ctx.schema[SCALAR$1]; + } else if (tagName) + tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError); + else if (token.type === "scalar") + tag = findScalarTagByTest(ctx, value, token, onError); + else + tag = ctx.schema[SCALAR$1]; + let scalar; + try { + const res = tag.resolve(value, (msg) => onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg), ctx.options); + scalar = isScalar$1(res) ? res : new Scalar(res); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg); + scalar = new Scalar(value); + } + scalar.range = range; + scalar.source = value; + if (type) + scalar.type = type; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment) + scalar.comment = comment; + return scalar; +} +function findScalarTagByName(schema2, value, tagName, tagToken, onError) { + var _a; + if (tagName === "!") + return schema2[SCALAR$1]; + const matchWithTest = []; + for (const tag of schema2.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a = tag.test) == null ? void 0 : _a.test(value)) + return tag; + const kt = schema2.knownTags[tagName]; + if (kt && !kt.collection) { + schema2.tags.push(Object.assign({}, kt, { default: false, test: void 0 })); + return kt; + } + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, tagName !== "tag:yaml.org,2002:str"); + return schema2[SCALAR$1]; +} +function findScalarTagByTest({ atKey, directives, schema: schema2 }, value, token, onError) { + const tag = schema2.tags.find((tag2) => { + var _a; + return (tag2.default === true || atKey && tag2.default === "key") && ((_a = tag2.test) == null ? void 0 : _a.test(value)); + }) || schema2[SCALAR$1]; + if (schema2.compat) { + const compat = schema2.compat.find((tag2) => { + var _a; + return tag2.default && ((_a = tag2.test) == null ? void 0 : _a.test(value)); + }) ?? schema2[SCALAR$1]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, "TAG_RESOLVE_FAILED", msg, true); + } + } + return tag; +} +function emptyScalarPosition(offset, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i = pos - 1; i >= 0; --i) { + let st = before[i]; + switch (st.type) { + case "space": + case "comment": + case "newline": + offset -= st.source.length; + continue; + } + st = before[++i]; + while ((st == null ? void 0 : st.type) === "space") { + offset += st.source.length; + st = before[++i]; + } + break; + } + } + return offset; +} +const CN = { composeNode, composeEmptyNode }; +function composeNode(ctx, token, props, onError) { + const atKey = ctx.atKey; + const { spaceBefore, comment, anchor, tag } = props; + let node; + let isSrcToken = true; + switch (token.type) { + case "alias": + node = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, "ALIAS_PROPS", "An alias node must not specify any properties"); + break; + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "block-scalar": + node = composeScalar(ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + case "block-map": + case "block-seq": + case "flow-collection": + node = composeCollection(CN, ctx, token, props, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + default: { + const message = token.type === "error" ? token.message : `Unsupported token (type: ${token.type})`; + onError(token, "UNEXPECTED_TOKEN", message); + node = composeEmptyNode(ctx, token.offset, void 0, null, props, onError); + isSrcToken = false; + } + } + if (anchor && node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + if (atKey && ctx.options.stringKeys && (!isScalar$1(node) || typeof node.value !== "string" || node.tag && node.tag !== "tag:yaml.org,2002:str")) { + const msg = "With stringKeys, all keys must be strings"; + onError(tag ?? token, "NON_STRING_KEY", msg); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + if (token.type === "scalar" && token.source === "") + node.comment = comment; + else + node.commentBefore = comment; + } + if (ctx.options.keepSourceTokens && isSrcToken) + node.srcToken = token; + return node; +} +function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) { + const token = { + type: "scalar", + offset: emptyScalarPosition(offset, before, pos), + indent: -1, + source: "" + }; + const node = composeScalar(ctx, token, tag, onError); + if (anchor) { + node.anchor = anchor.source.substring(1); + if (node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + node.comment = comment; + node.range[2] = end; + } + return node; +} +function composeAlias({ options }, { offset, source, end }, onError) { + const alias = new Alias(source.substring(1)); + if (alias.source === "") + onError(offset, "BAD_ALIAS", "Alias cannot be an empty string"); + if (alias.source.endsWith(":")) + onError(offset + source.length - 1, "BAD_ALIAS", "Alias ending in : is ambiguous", true); + const valueEnd = offset + source.length; + const re = resolveEnd(end, valueEnd, options.strict, onError); + alias.range = [offset, valueEnd, re.offset]; + if (re.comment) + alias.comment = re.comment; + return alias; +} +function composeDoc(options, directives, { offset, start, value, end }, onError) { + const opts = Object.assign({ _directives: directives }, options); + const doc = new Document(void 0, opts); + const ctx = { + atKey: false, + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps(start, { + indicator: "doc-start", + next: value ?? (end == null ? void 0 : end[0]), + offset, + onError, + parentIndent: 0, + startOnNewline: true + }); + if (props.found) { + doc.directives.docStart = true; + if (value && (value.type === "block-map" || value.type === "block-seq") && !props.hasNewline) + onError(props.end, "MISSING_CHAR", "Block collection cannot start on same line with directives-end marker"); + } + doc.contents = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re = resolveEnd(end, contentEnd, false, onError); + if (re.comment) + doc.comment = re.comment; + doc.range = [offset, contentEnd, re.offset]; + return doc; +} +function getErrorPos(src) { + if (typeof src === "number") + return [src, src + 1]; + if (Array.isArray(src)) + return src.length === 2 ? src : [src[0], src[1]]; + const { offset, source } = src; + return [offset, offset + (typeof source === "string" ? source.length : 1)]; +} +function parsePrelude(prelude) { + var _a; + let comment = ""; + let atComment = false; + let afterEmptyLine = false; + for (let i = 0; i < prelude.length; ++i) { + const source = prelude[i]; + switch (source[0]) { + case "#": + comment += (comment === "" ? "" : afterEmptyLine ? "\n\n" : "\n") + (source.substring(1) || " "); + atComment = true; + afterEmptyLine = false; + break; + case "%": + if (((_a = prelude[i + 1]) == null ? void 0 : _a[0]) !== "#") + i += 1; + atComment = false; + break; + default: + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment, afterEmptyLine }; +} +class Composer { + constructor(options = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source, code, message, warning) => { + const pos = getErrorPos(source); + if (warning) + this.warnings.push(new YAMLWarning(pos, code, message)); + else + this.errors.push(new YAMLParseError(pos, code, message)); + }; + this.directives = new Directives({ version: options.version || "1.2" }); + this.options = options; + } + decorate(doc, afterDoc) { + const { comment, afterEmptyLine } = parsePrelude(this.prelude); + if (comment) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment} +${comment}` : comment; + } else if (afterEmptyLine || doc.directives.docStart || !dc) { + doc.commentBefore = comment; + } else if (isCollection$1(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment} +${cb}` : comment; + } else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment} +${cb}` : comment; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + /** + * Current stream status information. + * + * Mostly useful at the end of input for an empty stream. + */ + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + /** + * Compose tokens into documents. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + /** Advance the composer by one CST token. */ + *next(token) { + switch (token.type) { + case "directive": + this.directives.add(token.source, (offset, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset; + this.onError(pos, "BAD_DIRECTIVE", message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case "document": { + const doc = composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.docStart) + this.onError(token, "MISSING_CHAR", "Missing directives-end/doc-start indicator line"); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case "byte-order-mark": + case "space": + break; + case "comment": + case "newline": + this.prelude.push(token.source); + break; + case "error": { + const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message; + const error = new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg); + if (this.atDirectives || !this.doc) + this.errors.push(error); + else + this.doc.errors.push(error); + break; + } + case "doc-end": { + if (!this.doc) { + const msg = "Unexpected doc-end without preceding document"; + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg)); + break; + } + this.doc.directives.docEnd = true; + const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc} +${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`)); + } + } + /** + * Call at end of input to yield any remaining document. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } else if (forceDoc) { + const opts = Object.assign({ _directives: this.directives }, this.options); + const doc = new Document(void 0, opts); + if (this.atDirectives) + this.onError(endOffset, "MISSING_CHAR", "Missing directives-end indicator line"); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } +} +function resolveAsScalar(token, strict = true, onError) { + if (token) { + const _onError = (pos, code, message) => { + const offset = typeof pos === "number" ? pos : Array.isArray(pos) ? pos[0] : pos.offset; + if (onError) + onError(offset, code, message); + else + throw new YAMLParseError([offset, offset + 1], code, message); + }; + switch (token.type) { + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return resolveFlowScalar(token, strict, _onError); + case "block-scalar": + return resolveBlockScalar({ options: { strict } }, token, _onError); + } + } + return null; +} +function createScalarToken(value, context) { + const { implicitKey = false, indent, inFlow = false, offset = -1, type = "PLAIN" } = context; + const source = stringifyString({ type, value }, { + implicitKey, + indent: indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + const end = context.end ?? [ + { type: "newline", offset: -1, indent, source: "\n" } + ]; + switch (source[0]) { + case "|": + case ">": { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + const props = [ + { type: "block-scalar-header", offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, end)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + return { type: "block-scalar", offset, indent, props, source: body }; + } + case '"': + return { type: "double-quoted-scalar", offset, indent, source, end }; + case "'": + return { type: "single-quoted-scalar", offset, indent, source, end }; + default: + return { type: "scalar", offset, indent, source, end }; + } +} +function setScalarValue(token, value, context = {}) { + let { afterKey = false, implicitKey = false, inFlow = false, type } = context; + let indent = "indent" in token ? token.indent : null; + if (afterKey && typeof indent === "number") + indent += 2; + if (!type) + switch (token.type) { + case "single-quoted-scalar": + type = "QUOTE_SINGLE"; + break; + case "double-quoted-scalar": + type = "QUOTE_DOUBLE"; + break; + case "block-scalar": { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + type = header.source[0] === ">" ? "BLOCK_FOLDED" : "BLOCK_LITERAL"; + break; + } + default: + type = "PLAIN"; + } + const source = stringifyString({ type, value }, { + implicitKey: implicitKey || indent === null, + indent: indent !== null && indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + switch (source[0]) { + case "|": + case ">": + setBlockScalarValue(token, source); + break; + case '"': + setFlowScalarValue(token, source, "double-quoted-scalar"); + break; + case "'": + setFlowScalarValue(token, source, "single-quoted-scalar"); + break; + default: + setFlowScalarValue(token, source, "scalar"); + } +} +function setBlockScalarValue(token, source) { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + if (token.type === "block-scalar") { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + header.source = head; + token.source = body; + } else { + const { offset } = token; + const indent = "indent" in token ? token.indent : -1; + const props = [ + { type: "block-scalar-header", offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, "end" in token ? token.end : void 0)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type: "block-scalar", indent, props, source: body }); + } +} +function addEndtoBlockProps(props, end) { + if (end) + for (const st of end) + switch (st.type) { + case "space": + case "comment": + props.push(st); + break; + case "newline": + props.push(st); + return true; + } + return false; +} +function setFlowScalarValue(token, source, type) { + switch (token.type) { + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + token.type = type; + token.source = source; + break; + case "block-scalar": { + const end = token.props.slice(1); + let oa = source.length; + if (token.props[0].type === "block-scalar-header") + oa -= token.props[0].source.length; + for (const tok of end) + tok.offset += oa; + delete token.props; + Object.assign(token, { type, source, end }); + break; + } + case "block-map": + case "block-seq": { + const offset = token.offset + source.length; + const nl = { type: "newline", offset, indent: token.indent, source: "\n" }; + delete token.items; + Object.assign(token, { type, source, end: [nl] }); + break; + } + default: { + const indent = "indent" in token ? token.indent : -1; + const end = "end" in token && Array.isArray(token.end) ? token.end.filter((st) => st.type === "space" || st.type === "comment" || st.type === "newline") : []; + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type, indent, source, end }); + } + } +} +const stringify$1 = (cst2) => "type" in cst2 ? stringifyToken(cst2) : stringifyItem(cst2); +function stringifyToken(token) { + switch (token.type) { + case "block-scalar": { + let res = ""; + for (const tok of token.props) + res += stringifyToken(tok); + return res + token.source; + } + case "block-map": + case "block-seq": { + let res = ""; + for (const item of token.items) + res += stringifyItem(item); + return res; + } + case "flow-collection": { + let res = token.start.source; + for (const item of token.items) + res += stringifyItem(item); + for (const st of token.end) + res += st.source; + return res; + } + case "document": { + let res = stringifyItem(token); + if (token.end) + for (const st of token.end) + res += st.source; + return res; + } + default: { + let res = token.source; + if ("end" in token && token.end) + for (const st of token.end) + res += st.source; + return res; + } + } +} +function stringifyItem({ start, key, sep, value }) { + let res = ""; + for (const st of start) + res += st.source; + if (key) + res += stringifyToken(key); + if (sep) + for (const st of sep) + res += st.source; + if (value) + res += stringifyToken(value); + return res; +} +const BREAK = Symbol("break visit"); +const SKIP = Symbol("skip children"); +const REMOVE = Symbol("remove item"); +function visit(cst2, visitor) { + if ("type" in cst2 && cst2.type === "document") + cst2 = { start: cst2.start, value: cst2.value }; + _visit(Object.freeze([]), cst2, visitor); +} +visit.BREAK = BREAK; +visit.SKIP = SKIP; +visit.REMOVE = REMOVE; +visit.itemAtPath = (cst2, path) => { + let item = cst2; + for (const [field, index] of path) { + const tok = item == null ? void 0 : item[field]; + if (tok && "items" in tok) { + item = tok.items[index]; + } else + return void 0; + } + return item; +}; +visit.parentCollection = (cst2, path) => { + const parent = visit.itemAtPath(cst2, path.slice(0, -1)); + const field = path[path.length - 1][0]; + const coll = parent == null ? void 0 : parent[field]; + if (coll && "items" in coll) + return coll; + throw new Error("Parent collection not found"); +}; +function _visit(path, item, visitor) { + let ctrl = visitor(item, path); + if (typeof ctrl === "symbol") + return ctrl; + for (const field of ["key", "value"]) { + const token = item[field]; + if (token && "items" in token) { + for (let i = 0; i < token.items.length; ++i) { + const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + token.items.splice(i, 1); + i -= 1; + } + } + if (typeof ctrl === "function" && field === "key") + ctrl = ctrl(item, path); + } + } + return typeof ctrl === "function" ? ctrl(item, path) : ctrl; +} +const BOM = "\uFEFF"; +const DOCUMENT = ""; +const FLOW_END = ""; +const SCALAR = ""; +const isCollection = (token) => !!token && "items" in token; +const isScalar = (token) => !!token && (token.type === "scalar" || token.type === "single-quoted-scalar" || token.type === "double-quoted-scalar" || token.type === "block-scalar"); +function prettyToken(token) { + switch (token) { + case BOM: + return ""; + case DOCUMENT: + return ""; + case FLOW_END: + return ""; + case SCALAR: + return ""; + default: + return JSON.stringify(token); + } +} +function tokenType(source) { + switch (source) { + case BOM: + return "byte-order-mark"; + case DOCUMENT: + return "doc-mode"; + case FLOW_END: + return "flow-error-end"; + case SCALAR: + return "scalar"; + case "---": + return "doc-start"; + case "...": + return "doc-end"; + case "": + case "\n": + case "\r\n": + return "newline"; + case "-": + return "seq-item-ind"; + case "?": + return "explicit-key-ind"; + case ":": + return "map-value-ind"; + case "{": + return "flow-map-start"; + case "}": + return "flow-map-end"; + case "[": + return "flow-seq-start"; + case "]": + return "flow-seq-end"; + case ",": + return "comma"; + } + switch (source[0]) { + case " ": + case " ": + return "space"; + case "#": + return "comment"; + case "%": + return "directive-line"; + case "*": + return "alias"; + case "&": + return "anchor"; + case "!": + return "tag"; + case "'": + return "single-quoted-scalar"; + case '"': + return "double-quoted-scalar"; + case "|": + case ">": + return "block-scalar-header"; + } + return null; +} +const cst = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + BOM, + DOCUMENT, + FLOW_END, + SCALAR, + createScalarToken, + isCollection, + isScalar, + prettyToken, + resolveAsScalar, + setScalarValue, + stringify: stringify$1, + tokenType, + visit +}, Symbol.toStringTag, { value: "Module" })); +function isEmpty(ch) { + switch (ch) { + case void 0: + case " ": + case "\n": + case "\r": + case " ": + return true; + default: + return false; + } +} +const hexDigits = new Set("0123456789ABCDEFabcdef"); +const tagChars = new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"); +const flowIndicatorChars = new Set(",[]{}"); +const invalidAnchorChars = new Set(" ,[]{}\n\r "); +const isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch); +class Lexer { + constructor() { + this.atEnd = false; + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + this.buffer = ""; + this.flowKey = false; + this.flowLevel = 0; + this.indentNext = 0; + this.indentValue = 0; + this.lineEndPos = null; + this.next = null; + this.pos = 0; + } + /** + * Generate YAML tokens from the `source` string. If `incomplete`, + * a part of the last line may be left as a buffer for the next call. + * + * @returns A generator of lexical tokens + */ + *lex(source, incomplete = false) { + if (source) { + if (typeof source !== "string") + throw TypeError("source is not a string"); + this.buffer = this.buffer ? this.buffer + source : source; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = this.next ?? "stream"; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i = this.pos; + let ch = this.buffer[i]; + while (ch === " " || ch === " ") + ch = this.buffer[++i]; + if (!ch || ch === "#" || ch === "\n") + return true; + if (ch === "\r") + return this.buffer[i + 1] === "\n"; + return false; + } + charAt(n) { + return this.buffer[this.pos + n]; + } + continueScalar(offset) { + let ch = this.buffer[offset]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === " ") + ch = this.buffer[++indent + offset]; + if (ch === "\r") { + const next = this.buffer[indent + offset + 1]; + if (next === "\n" || !next && !this.atEnd) + return offset + indent + 1; + } + return ch === "\n" || indent >= this.indentNext || !ch && !this.atEnd ? offset + indent : -1; + } + if (ch === "-" || ch === ".") { + const dt = this.buffer.substr(offset, 3); + if ((dt === "---" || dt === "...") && isEmpty(this.buffer[offset + 3])) + return -1; + } + return offset; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== "number" || end !== -1 && end < this.pos) { + end = this.buffer.indexOf("\n", this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === "\r") + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n) { + return this.pos + n <= this.buffer.length; + } + setNext(state) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state; + return null; + } + peek(n) { + return this.buffer.substr(this.pos, n); + } + *parseNext(next) { + switch (next) { + case "stream": + return yield* this.parseStream(); + case "line-start": + return yield* this.parseLineStart(); + case "block-start": + return yield* this.parseBlockStart(); + case "doc": + return yield* this.parseDocument(); + case "flow": + return yield* this.parseFlowCollection(); + case "quoted-scalar": + return yield* this.parseQuotedScalar(); + case "block-scalar": + return yield* this.parseBlockScalar(); + case "plain-scalar": + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext("stream"); + if (line[0] === BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === "%") { + let dirEnd = line.length; + let cs = line.indexOf("#"); + while (cs !== -1) { + const ch = line[cs - 1]; + if (ch === " " || ch === " ") { + dirEnd = cs - 1; + break; + } else { + cs = line.indexOf("#", cs + 1); + } + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === " " || ch === " ") + dirEnd -= 1; + else + break; + } + const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n); + this.pushNewline(); + return "stream"; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return "stream"; + } + yield DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext("line-start"); + if (ch === "-" || ch === ".") { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext("line-start"); + const s = this.peek(3); + if ((s === "---" || s === "...") && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return s === "---" ? "doc" : "stream"; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext("block-start"); + if ((ch0 === "-" || ch0 === "?" || ch0 === ":") && isEmpty(ch1)) { + const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n; + return yield* this.parseBlockStart(); + } + return "doc"; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext("doc"); + let n = yield* this.pushIndicators(); + switch (line[n]) { + case "#": + yield* this.pushCount(line.length - n); + // fallthrough + case void 0: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + return "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "doc"; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case "|": + case ">": + n += yield* this.parseBlockScalarHeader(); + n += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + if (nl > 0) { + sp = yield* this.pushSpaces(false); + this.indentValue = indent = sp; + } else { + sp = 0; + } + sp += yield* this.pushSpaces(true); + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext("flow"); + if (indent !== -1 && indent < this.indentNext && line[0] !== "#" || indent === 0 && (line.startsWith("---") || line.startsWith("...")) && isEmpty(line[3])) { + const atFlowEndMarker = indent === this.indentNext - 1 && this.flowLevel === 1 && (line[0] === "]" || line[0] === "}"); + if (!atFlowEndMarker) { + this.flowLevel = 0; + yield FLOW_END; + return yield* this.parseLineStart(); + } + } + let n = 0; + while (line[n] === ",") { + n += yield* this.pushCount(1); + n += yield* this.pushSpaces(true); + this.flowKey = false; + } + n += yield* this.pushIndicators(); + switch (line[n]) { + case void 0: + return "flow"; + case "#": + yield* this.pushCount(line.length - n); + return "flow"; + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? "flow" : "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "flow"; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ":": { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ",") { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return "flow"; + } + } + // fallthrough + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote = this.charAt(0); + let end = this.buffer.indexOf(quote, this.pos + 1); + if (quote === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } else { + while (end !== -1) { + let n = 0; + while (this.buffer[end - 1 - n] === "\\") + n += 1; + if (n % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf("\n", this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf("\n", cs); + } + if (nl !== -1) { + end = nl - (qb[nl - 1] === "\r" ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext("quoted-scalar"); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? "flow" : "doc"; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i = this.pos; + while (true) { + const ch = this.buffer[++i]; + if (ch === "+") + this.blockScalarKeep = true; + else if (ch > "0" && ch <= "9") + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== "-") + break; + } + return yield* this.pushUntil((ch) => isEmpty(ch) || ch === "#"); + } + *parseBlockScalar() { + let nl = this.pos - 1; + let indent = 0; + let ch; + loop: for (let i2 = this.pos; ch = this.buffer[i2]; ++i2) { + switch (ch) { + case " ": + indent += 1; + break; + case "\n": + nl = i2; + indent = 0; + break; + case "\r": { + const next = this.buffer[i2 + 1]; + if (!next && !this.atEnd) + return this.setNext("block-scalar"); + if (next === "\n") + break; + } + // fallthrough + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext("block-scalar"); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else { + this.indentNext = this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext); + } + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf("\n", cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext("block-scalar"); + nl = this.buffer.length; + } + } + let i = nl + 1; + ch = this.buffer[i]; + while (ch === " ") + ch = this.buffer[++i]; + if (ch === " ") { + while (ch === " " || ch === " " || ch === "\r" || ch === "\n") + ch = this.buffer[++i]; + nl = i - 1; + } else if (!this.blockScalarKeep) { + do { + let i2 = nl - 1; + let ch2 = this.buffer[i2]; + if (ch2 === "\r") + ch2 = this.buffer[--i2]; + const lastChar = i2; + while (ch2 === " ") + ch2 = this.buffer[--i2]; + if (ch2 === "\n" && i2 >= this.pos && i2 + 1 + indent > lastChar) + nl = i2; + else + break; + } while (true); + } + yield SCALAR; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i = this.pos - 1; + let ch; + while (ch = this.buffer[++i]) { + if (ch === ":") { + const next = this.buffer[i + 1]; + if (isEmpty(next) || inFlow && flowIndicatorChars.has(next)) + break; + end = i; + } else if (isEmpty(ch)) { + let next = this.buffer[i + 1]; + if (ch === "\r") { + if (next === "\n") { + i += 1; + ch = "\n"; + next = this.buffer[i + 1]; + } else + end = i; + } + if (next === "#" || inFlow && flowIndicatorChars.has(next)) + break; + if (ch === "\n") { + const cs = this.continueScalar(i + 1); + if (cs === -1) + break; + i = Math.max(i, cs - 2); + } + } else { + if (inFlow && flowIndicatorChars.has(ch)) + break; + end = i; + } + } + if (!ch && !this.atEnd) + return this.setNext("plain-scalar"); + yield SCALAR; + yield* this.pushToIndex(end + 1, true); + return inFlow ? "flow" : "doc"; + } + *pushCount(n) { + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos += n; + return n; + } + return 0; + } + *pushToIndex(i, allowEmpty) { + const s = this.buffer.slice(this.pos, i); + if (s) { + yield s; + this.pos += s.length; + return s.length; + } else if (allowEmpty) + yield ""; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case "!": + return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "&": + return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "-": + // this is an error + case "?": + // this is an error outside flow collections + case ":": { + const inFlow = this.flowLevel > 0; + const ch1 = this.charAt(1); + if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) { + if (!inFlow) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + } + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === "<") { + let i = this.pos + 2; + let ch = this.buffer[i]; + while (!isEmpty(ch) && ch !== ">") + ch = this.buffer[++i]; + return yield* this.pushToIndex(ch === ">" ? i + 1 : i, false); + } else { + let i = this.pos + 1; + let ch = this.buffer[i]; + while (ch) { + if (tagChars.has(ch)) + ch = this.buffer[++i]; + else if (ch === "%" && hexDigits.has(this.buffer[i + 1]) && hexDigits.has(this.buffer[i + 2])) { + ch = this.buffer[i += 3]; + } else + break; + } + return yield* this.pushToIndex(i, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === "\n") + return yield* this.pushCount(1); + else if (ch === "\r" && this.charAt(1) === "\n") + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i = this.pos - 1; + let ch; + do { + ch = this.buffer[++i]; + } while (ch === " " || allowTabs && ch === " "); + const n = i - this.pos; + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos = i; + } + return n; + } + *pushUntil(test) { + let i = this.pos; + let ch = this.buffer[i]; + while (!test(ch)) + ch = this.buffer[++i]; + return yield* this.pushToIndex(i, false); + } +} +class LineCounter { + constructor() { + this.lineStarts = []; + this.addNewLine = (offset) => this.lineStarts.push(offset); + this.linePos = (offset) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = low + high >> 1; + if (this.lineStarts[mid] < offset) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset - start + 1 }; + }; + } +} +function includesToken(list, type) { + for (let i = 0; i < list.length; ++i) + if (list[i].type === type) + return true; + return false; +} +function findNonEmptyIndex(list) { + for (let i = 0; i < list.length; ++i) { + switch (list[i].type) { + case "space": + case "comment": + case "newline": + break; + default: + return i; + } + } + return -1; +} +function isFlowToken(token) { + switch (token == null ? void 0 : token.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "flow-collection": + return true; + default: + return false; + } +} +function getPrevProps(parent) { + switch (parent.type) { + case "document": + return parent.start; + case "block-map": { + const it = parent.items[parent.items.length - 1]; + return it.sep ?? it.start; + } + case "block-seq": + return parent.items[parent.items.length - 1].start; + /* istanbul ignore next should not happen */ + default: + return []; + } +} +function getFirstKeyStartProps(prev) { + var _a; + if (prev.length === 0) + return []; + let i = prev.length; + loop: while (--i >= 0) { + switch (prev[i].type) { + case "doc-start": + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + case "newline": + break loop; + } + } + while (((_a = prev[++i]) == null ? void 0 : _a.type) === "space") { + } + return prev.splice(i, prev.length); +} +function fixFlowSeqItems(fc) { + if (fc.start.type === "flow-seq-start") { + for (const it of fc.items) { + if (it.sep && !it.value && !includesToken(it.start, "explicit-key-ind") && !includesToken(it.sep, "map-value-ind")) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } +} +class Parser { + /** + * @param onNewLine - If defined, called separately with the start position of + * each new line (in `parse()`, including the start of input). + */ + constructor(onNewLine) { + this.atNewLine = true; + this.atScalar = false; + this.indent = 0; + this.offset = 0; + this.onKeyLine = false; + this.stack = []; + this.source = ""; + this.type = ""; + this.lexer = new Lexer(); + this.onNewLine = onNewLine; + } + /** + * Parse `source` as a YAML stream. + * If `incomplete`, a part of the last line may be left as a buffer for the next call. + * + * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens. + * + * @returns A generator of tokens representing each directive, document, and other structure. + */ + *parse(source, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + /** + * Advance the parser by the `source` of one lexical token. + */ + *next(source) { + this.source = source; + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source.length; + return; + } + const type = tokenType(source); + if (!type) { + const message = `Not a YAML token: ${source}`; + yield* this.pop({ type: "error", offset: this.offset, message, source }); + this.offset += source.length; + } else if (type === "scalar") { + this.atNewLine = false; + this.atScalar = true; + this.type = "scalar"; + } else { + this.type = type; + yield* this.step(); + switch (type) { + case "newline": + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source.length); + break; + case "space": + if (this.atNewLine && source[0] === " ") + this.indent += source.length; + break; + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + if (this.atNewLine) + this.indent += source.length; + break; + case "doc-mode": + case "flow-error-end": + return; + default: + this.atNewLine = false; + } + this.offset += source.length; + } + } + /** Call at end of input to push out any remaining constructions */ + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === "doc-end" && (!top || top.type !== "doc-end")) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: "doc-end", + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case "document": + return yield* this.document(top); + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return yield* this.scalar(top); + case "block-scalar": + return yield* this.blockScalar(top); + case "block-map": + return yield* this.blockMap(top); + case "block-seq": + return yield* this.blockSequence(top); + case "flow-collection": + return yield* this.flowCollection(top); + case "doc-end": + return yield* this.documentEnd(top); + } + yield* this.pop(); + } + peek(n) { + return this.stack[this.stack.length - n]; + } + *pop(error) { + const token = error ?? this.stack.pop(); + if (!token) { + const message = "Tried to pop an empty stack"; + yield { type: "error", offset: this.offset, source: "", message }; + } else if (this.stack.length === 0) { + yield token; + } else { + const top = this.peek(1); + if (token.type === "block-scalar") { + token.indent = "indent" in top ? top.indent : 0; + } else if (token.type === "flow-collection" && top.type === "document") { + token.indent = 0; + } + if (token.type === "flow-collection") + fixFlowSeqItems(token); + switch (top.type) { + case "document": + top.value = token; + break; + case "block-scalar": + top.props.push(token); + break; + case "block-map": { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } else if (it.sep) { + it.value = token; + } else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !it.explicitKey; + return; + } + break; + } + case "block-seq": { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case "flow-collection": { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + /* istanbul ignore next should not happen */ + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === "document" || top.type === "block-map" || top.type === "block-seq") && (token.type === "block-map" || token.type === "block-seq")) { + const last = token.items[token.items.length - 1]; + if (last && !last.sep && !last.value && last.start.length > 0 && findNonEmptyIndex(last.start) === -1 && (token.indent === 0 || last.start.every((st) => st.type !== "comment" || st.indent < token.indent))) { + if (top.type === "document") + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case "directive-line": + yield { type: "directive", offset: this.offset, source: this.source }; + return; + case "byte-order-mark": + case "space": + case "comment": + case "newline": + yield this.sourceToken; + return; + case "doc-mode": + case "doc-start": { + const doc = { + type: "document", + offset: this.offset, + start: [] + }; + if (this.type === "doc-start") + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case "doc-start": { + if (findNonEmptyIndex(doc.start) !== -1) { + yield* this.pop(); + yield* this.step(); + } else + doc.start.push(this.sourceToken); + return; + } + case "anchor": + case "tag": + case "space": + case "comment": + case "newline": + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } + } + *scalar(scalar) { + if (this.type === "map-value-ind") { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep; + if (scalar.end) { + sep = scalar.end; + sep.push(this.sourceToken); + delete scalar.end; + } else + sep = [this.sourceToken]; + const map2 = { + type: "block-map", + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case "space": + case "comment": + case "newline": + scalar.props.push(this.sourceToken); + return; + case "scalar": + scalar.source = this.source; + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + yield* this.pop(); + break; + /* istanbul ignore next should not happen */ + default: + yield* this.pop(); + yield* this.step(); + } + } + *blockMap(map2) { + var _a; + const it = map2.items[map2.items.length - 1]; + switch (this.type) { + case "newline": + this.onKeyLine = false; + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "space": + case "comment": + if (it.value) { + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + if (this.atIndentedComment(it.start, map2.indent)) { + const prev = map2.items[map2.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + } + if (this.indent >= map2.indent) { + const atMapIndent = !this.onKeyLine && this.indent === map2.indent; + const atNextItem = atMapIndent && (it.sep || it.explicitKey) && this.type !== "seq-item-ind"; + let start = []; + if (atNextItem && it.sep && !it.value) { + const nl = []; + for (let i = 0; i < it.sep.length; ++i) { + const st = it.sep[i]; + switch (st.type) { + case "newline": + nl.push(i); + break; + case "space": + break; + case "comment": + if (st.indent > map2.indent) + nl.length = 0; + break; + default: + nl.length = 0; + } + } + if (nl.length >= 2) + start = it.sep.splice(nl[1]); + } + switch (this.type) { + case "anchor": + case "tag": + if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start }); + this.onKeyLine = true; + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "explicit-key-ind": + if (!it.sep && !it.explicitKey) { + it.start.push(this.sourceToken); + it.explicitKey = true; + } else if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start, explicitKey: true }); + } else { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken], explicitKey: true }] + }); + } + this.onKeyLine = true; + return; + case "map-value-ind": + if (it.explicitKey) { + if (!it.sep) { + if (includesToken(it.start, "newline")) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else { + const start2 = getFirstKeyStartProps(it.start); + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: null, sep: [this.sourceToken] }] + }); + } + } else if (it.value) { + map2.items.push({ start: [], key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }); + } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) { + const start2 = getFirstKeyStartProps(it.start); + const key = it.key; + const sep = it.sep; + sep.push(this.sourceToken); + delete it.key; + delete it.sep; + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key, sep }] + }); + } else if (start.length > 0) { + it.sep = it.sep.concat(start, this.sourceToken); + } else { + it.sep.push(this.sourceToken); + } + } else { + if (!it.sep) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else if (it.value || atNextItem) { + map2.items.push({ start, key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + } else { + it.sep.push(this.sourceToken); + } + } + this.onKeyLine = true; + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (atNextItem || it.value) { + map2.items.push({ start, key: fs, sep: [] }); + this.onKeyLine = true; + } else if (it.sep) { + this.stack.push(fs); + } else { + Object.assign(it, { key: fs, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map2); + if (bv) { + if (atMapIndent && bv.type !== "block-seq") { + map2.items.push({ start }); + } + this.stack.push(bv); + return; + } + } + } + } + yield* this.pop(); + yield* this.step(); + } + *blockSequence(seq2) { + var _a; + const it = seq2.items[seq2.items.length - 1]; + switch (this.type) { + case "newline": + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + seq2.items.push({ start: [this.sourceToken] }); + } else + it.start.push(this.sourceToken); + return; + case "space": + case "comment": + if (it.value) + seq2.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq2.indent)) { + const prev = seq2.items[seq2.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case "anchor": + case "tag": + if (it.value || this.indent <= seq2.indent) + break; + it.start.push(this.sourceToken); + return; + case "seq-item-ind": + if (this.indent !== seq2.indent) + break; + if (it.value || includesToken(it.start, "seq-item-ind")) + seq2.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq2.indent) { + const bv = this.startBlockValue(seq2); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); + } + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === "flow-error-end") { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === "flow-collection"); + } else if (fc.end.length === 0) { + switch (this.type) { + case "comma": + case "explicit-key-ind": + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case "map-value-ind": + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case "space": + case "comment": + case "newline": + case "anchor": + case "tag": + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs, sep: [] }); + else if (it.sep) + this.stack.push(fs); + else + Object.assign(it, { key: fs, sep: [] }); + return; + } + case "flow-map-end": + case "flow-seq-end": + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } else { + const parent = this.peek(2); + if (parent.type === "block-map" && (this.type === "map-value-ind" && parent.indent === fc.indent || this.type === "newline" && !parent.items[parent.items.length - 1].sep)) { + yield* this.pop(); + yield* this.step(); + } else if (this.type === "map-value-ind" && parent.type !== "flow-collection") { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep = fc.end.splice(1, fc.end.length); + sep.push(this.sourceToken); + const map2 = { + type: "block-map", + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else { + yield* this.lineEnd(fc); + } + } + } + flowScalar(type) { + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + return { + type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + } + startBlockValue(parent) { + switch (this.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return this.flowScalar(this.type); + case "block-scalar-header": + return { + type: "block-scalar", + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: "" + }; + case "flow-map-start": + case "flow-seq-start": + return { + type: "flow-collection", + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case "seq-item-ind": + return { + type: "block-seq", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case "explicit-key-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, explicitKey: true }] + }; + } + case "map-value-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; + } + atIndentedComment(start, indent) { + if (this.type !== "comment") + return false; + if (this.indent <= indent) + return false; + return start.every((st) => st.type === "newline" || st.type === "space"); + } + *documentEnd(docEnd) { + if (this.type !== "doc-mode") { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case "comma": + case "doc-start": + case "doc-end": + case "flow-seq-end": + case "flow-map-end": + case "map-value-ind": + yield* this.pop(); + yield* this.step(); + break; + case "newline": + this.onKeyLine = false; + // fallthrough + case "space": + case "comment": + default: + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } +} +function parseOptions(options) { + const prettyErrors = options.prettyErrors !== false; + const lineCounter = options.lineCounter || prettyErrors && new LineCounter() || null; + return { lineCounter, prettyErrors }; +} +function parseAllDocuments(source, options = {}) { + const { lineCounter, prettyErrors } = parseOptions(options); + const parser = new Parser(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options); + const docs = Array.from(composer.compose(parser.parse(source))); + if (prettyErrors && lineCounter) + for (const doc of docs) { + doc.errors.forEach(prettifyError(source, lineCounter)); + doc.warnings.forEach(prettifyError(source, lineCounter)); + } + if (docs.length > 0) + return docs; + return Object.assign([], { empty: true }, composer.streamInfo()); +} +function parseDocument(source, options = {}) { + const { lineCounter, prettyErrors } = parseOptions(options); + const parser = new Parser(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options); + let doc = null; + for (const _doc of composer.compose(parser.parse(source), true, source.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== "silent") { + doc.errors.push(new YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()")); + break; + } + } + if (prettyErrors && lineCounter) { + doc.errors.forEach(prettifyError(source, lineCounter)); + doc.warnings.forEach(prettifyError(source, lineCounter)); + } + return doc; +} +function parse(src, reviver, options) { + let _reviver = void 0; + if (typeof reviver === "function") { + _reviver = reviver; + } else if (options === void 0 && reviver && typeof reviver === "object") { + options = reviver; + } + const doc = parseDocument(src, options); + if (!doc) + return null; + doc.warnings.forEach((warning) => warn(doc.options.logLevel, warning)); + if (doc.errors.length > 0) { + if (doc.options.logLevel !== "silent") + throw doc.errors[0]; + else + doc.errors = []; + } + return doc.toJS(Object.assign({ reviver: _reviver }, options)); +} +function stringify(value, replacer, options) { + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + } + if (typeof options === "string") + options = options.length; + if (typeof options === "number") { + const indent = Math.round(options); + options = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent }; + } + if (value === void 0) { + const { keepUndefined } = options ?? replacer ?? {}; + if (!keepUndefined) + return void 0; + } + if (isDocument(value) && !_replacer) + return value.toString(options); + return new Document(value, _replacer, options).toString(options); +} +const YAML = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + Alias, + CST: cst, + Composer, + Document, + Lexer, + LineCounter, + Pair, + Parser, + Scalar, + Schema, + YAMLError, + YAMLMap, + YAMLParseError, + YAMLSeq, + YAMLWarning, + isAlias, + isCollection: isCollection$1, + isDocument, + isMap, + isNode, + isPair, + isScalar: isScalar$1, + isSeq, + parse, + parseAllDocuments, + parseDocument, + stringify, + visit: visit$1, + visitAsync +}, Symbol.toStringTag, { value: "Module" })); +function parseAriaSnapshot(yaml, text, options = {}) { + var _a; + const lineCounter = new yaml.LineCounter(); + const parseOptions2 = { + keepSourceTokens: true, + lineCounter, + ...options + }; + const yamlDoc = yaml.parseDocument(text, parseOptions2); + const errors = []; + const convertRange = (range) => { + return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])]; + }; + const addError = (error) => { + errors.push({ + message: error.message, + range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])] + }); + }; + const convertSeq = (container, seq2) => { + for (const item of seq2.items) { + const itemIsString = item instanceof yaml.Scalar && typeof item.value === "string"; + if (itemIsString) { + const childNode = KeyParser.parse(item, parseOptions2, errors); + if (childNode) { + container.children = container.children || []; + container.children.push(childNode); + } + continue; + } + const itemIsMap = item instanceof yaml.YAMLMap; + if (itemIsMap) { + convertMap(container, item); + continue; + } + errors.push({ + message: "Sequence items should be strings or maps", + range: convertRange(item.range || seq2.range) + }); + } + }; + const convertMap = (container, map2) => { + for (const entry of map2.items) { + container.children = container.children || []; + const keyIsString = entry.key instanceof yaml.Scalar && typeof entry.key.value === "string"; + if (!keyIsString) { + errors.push({ + message: "Only string keys are supported", + range: convertRange(entry.key.range || map2.range) + }); + continue; + } + const key = entry.key; + const value = entry.value; + if (key.value === "text") { + const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string"; + if (!valueIsString) { + errors.push({ + message: "Text value should be a string", + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.children.push({ + kind: "text", + text: valueOrRegex(value.value) + }); + continue; + } + if (key.value === "/children") { + const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string"; + if (!valueIsString || value.value !== "contain" && value.value !== "equal" && value.value !== "deep-equal") { + errors.push({ + message: 'Strict value should be "contain", "equal" or "deep-equal"', + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.containerMode = value.value; + continue; + } + if (key.value.startsWith("/")) { + const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string"; + if (!valueIsString) { + errors.push({ + message: "Property value should be a string", + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.props = container.props ?? {}; + container.props[key.value.slice(1)] = valueOrRegex(value.value); + continue; + } + const childNode = KeyParser.parse(key, parseOptions2, errors); + if (!childNode) + continue; + const valueIsScalar = value instanceof yaml.Scalar; + if (valueIsScalar) { + const type = typeof value.value; + if (type !== "string" && type !== "number" && type !== "boolean") { + errors.push({ + message: "Node value should be a string or a sequence", + range: convertRange(entry.value.range || map2.range) + }); + continue; + } + container.children.push({ + ...childNode, + children: [{ + kind: "text", + text: valueOrRegex(String(value.value)) + }] + }); + continue; + } + const valueIsSequence = value instanceof yaml.YAMLSeq; + if (valueIsSequence) { + container.children.push(childNode); + convertSeq(childNode, value); + continue; + } + errors.push({ + message: "Map values should be strings or sequences", + range: convertRange(entry.value.range || map2.range) + }); + } + }; + const fragment = { kind: "role", role: "fragment" }; + yamlDoc.errors.forEach(addError); + if (errors.length) + return { errors, fragment }; + if (!(yamlDoc.contents instanceof yaml.YAMLSeq)) { + errors.push({ + message: 'Aria snapshot must be a YAML sequence, elements starting with " -"', + range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }] + }); + } + if (errors.length) + return { errors, fragment }; + convertSeq(fragment, yamlDoc.contents); + if (errors.length) + return { errors, fragment: emptyFragment }; + if (((_a = fragment.children) == null ? void 0 : _a.length) === 1) + return { fragment: fragment.children[0], errors }; + return { fragment, errors }; +} +const emptyFragment = { kind: "role", role: "fragment" }; +function normalizeWhitespace(text) { + return text.replace(/[\u200b\u00ad]/g, "").replace(/[\r\n\s\t]+/g, " ").trim(); +} +function valueOrRegex(value) { + return value.startsWith("/") && value.endsWith("/") && value.length > 1 ? { pattern: value.slice(1, -1) } : normalizeWhitespace(value); +} +class KeyParser { + static parse(text, options, errors) { + try { + return new KeyParser(text.value)._parse(); + } catch (e) { + if (e instanceof ParserError) { + const message = options.prettyErrors === false ? e.message : e.message + ":\n\n" + text.value + "\n" + " ".repeat(e.pos) + "^\n"; + errors.push({ + message, + range: [options.lineCounter.linePos(text.range[0]), options.lineCounter.linePos(text.range[0] + e.pos)] + }); + return null; + } + throw e; + } + } + constructor(input) { + this._input = input; + this._pos = 0; + this._length = input.length; + } + _peek() { + return this._input[this._pos] || ""; + } + _next() { + if (this._pos < this._length) + return this._input[this._pos++]; + return null; + } + _eof() { + return this._pos >= this._length; + } + _isWhitespace() { + return !this._eof() && /\s/.test(this._peek()); + } + _skipWhitespace() { + while (this._isWhitespace()) + this._pos++; + } + _readIdentifier(type) { + if (this._eof()) + this._throwError(`Unexpected end of input when expecting ${type}`); + const start = this._pos; + while (!this._eof() && /[a-zA-Z]/.test(this._peek())) + this._pos++; + return this._input.slice(start, this._pos); + } + _readString() { + let result = ""; + let escaped = false; + while (!this._eof()) { + const ch = this._next(); + if (escaped) { + result += ch; + escaped = false; + } else if (ch === "\\") { + escaped = true; + } else if (ch === '"') { + return result; + } else { + result += ch; + } + } + this._throwError("Unterminated string"); + } + _throwError(message, offset = 0) { + throw new ParserError(message, offset || this._pos); + } + _readRegex() { + let result = ""; + let escaped = false; + let insideClass = false; + while (!this._eof()) { + const ch = this._next(); + if (escaped) { + result += ch; + escaped = false; + } else if (ch === "\\") { + escaped = true; + result += ch; + } else if (ch === "/" && !insideClass) { + return { pattern: result }; + } else if (ch === "[") { + insideClass = true; + result += ch; + } else if (ch === "]" && insideClass) { + result += ch; + insideClass = false; + } else { + result += ch; + } + } + this._throwError("Unterminated regex"); + } + _readStringOrRegex() { + const ch = this._peek(); + if (ch === '"') { + this._next(); + return normalizeWhitespace(this._readString()); + } + if (ch === "/") { + this._next(); + return this._readRegex(); + } + return null; + } + _readAttributes(result) { + let errorPos = this._pos; + while (true) { + this._skipWhitespace(); + if (this._peek() === "[") { + this._next(); + this._skipWhitespace(); + errorPos = this._pos; + const flagName = this._readIdentifier("attribute"); + this._skipWhitespace(); + let flagValue = ""; + if (this._peek() === "=") { + this._next(); + this._skipWhitespace(); + errorPos = this._pos; + while (this._peek() !== "]" && !this._isWhitespace() && !this._eof()) + flagValue += this._next(); + } + this._skipWhitespace(); + if (this._peek() !== "]") + this._throwError("Expected ]"); + this._next(); + this._applyAttribute(result, flagName, flagValue || "true", errorPos); + } else { + break; + } + } + } + _parse() { + this._skipWhitespace(); + const role = this._readIdentifier("role"); + this._skipWhitespace(); + const name = this._readStringOrRegex() || ""; + const result = { kind: "role", role, name }; + this._readAttributes(result); + this._skipWhitespace(); + if (!this._eof()) + this._throwError("Unexpected input"); + return result; + } + _applyAttribute(node, key, value, errorPos) { + if (key === "checked") { + this._assert(value === "true" || value === "false" || value === "mixed", 'Value of "checked" attribute must be a boolean or "mixed"', errorPos); + node.checked = value === "true" ? true : value === "false" ? false : "mixed"; + return; + } + if (key === "disabled") { + this._assert(value === "true" || value === "false", 'Value of "disabled" attribute must be a boolean', errorPos); + node.disabled = value === "true"; + return; + } + if (key === "expanded") { + this._assert(value === "true" || value === "false", 'Value of "expanded" attribute must be a boolean', errorPos); + node.expanded = value === "true"; + return; + } + if (key === "level") { + this._assert(!isNaN(Number(value)), 'Value of "level" attribute must be a number', errorPos); + node.level = Number(value); + return; + } + if (key === "pressed") { + this._assert(value === "true" || value === "false" || value === "mixed", 'Value of "pressed" attribute must be a boolean or "mixed"', errorPos); + node.pressed = value === "true" ? true : value === "false" ? false : "mixed"; + return; + } + if (key === "selected") { + this._assert(value === "true" || value === "false", 'Value of "selected" attribute must be a boolean', errorPos); + node.selected = value === "true"; + return; + } + this._assert(false, `Unsupported attribute [${key}]`, errorPos); + } + _assert(value, message, valuePos) { + if (!value) + this._throwError(message || "Assertion error", valuePos); + } +} +class ParserError extends Error { + constructor(message, pos) { + super(message); + this.pos = pos; + } +} +const Recorder = ({ + sources, + paused, + log, + mode, + onEditedCode, + onCursorActivity +}) => { + var _a; + const [selectedFileId, setSelectedFileId] = reactExports.useState(); + const [runningFileId, setRunningFileId2] = reactExports.useState(); + const [selectedTab, setSelectedTab] = useSetting("recorderPropertiesTab", "log"); + const [ariaSnapshot, setAriaSnapshot] = reactExports.useState(); + const [ariaSnapshotErrors, setAriaSnapshotErrors] = reactExports.useState(); + const [selectorFocusOnChange, setSelectorFocusOnChange] = reactExports.useState(true); + const fileId = selectedFileId || runningFileId || ((_a = sources[0]) == null ? void 0 : _a.id); + const source = reactExports.useMemo(() => { + if (fileId) { + const source2 = sources.find((s) => s.id === fileId); + if (source2) + return source2; + } + return emptySource(); + }, [sources, fileId]); + const [locator, setLocator] = reactExports.useState(""); + window.playwrightElementPicked = (elementInfo, userGesture) => { + const language = source.language; + setLocator(asLocator(language, elementInfo.selector)); + setAriaSnapshot(elementInfo.ariaSnapshot); + setAriaSnapshotErrors([]); + setSelectorFocusOnChange(userGesture); + if (userGesture && selectedTab !== "locator" && selectedTab !== "aria") + setSelectedTab("locator"); + if (mode === "inspecting" && selectedTab === "aria") ; + else { + const isRecording = ["recording", "assertingText", "assertingVisibility", "assertingValue", "assertingSnapshot"].includes(mode); + window.dispatch({ event: "setMode", params: { mode: isRecording ? "recording" : "standby" } }).catch(() => { + }); + } + }; + window.playwrightSetRunningFile = setRunningFileId2; + const messagesEndRef = reactExports.useRef(null); + reactExports.useLayoutEffect(() => { + var _a2; + (_a2 = messagesEndRef.current) == null ? void 0 : _a2.scrollIntoView({ block: "center", inline: "nearest" }); + }, [messagesEndRef]); + reactExports.useEffect(() => { + const handleKeyDown = (event) => { + switch (event.key) { + case "F8": + event.preventDefault(); + if (paused) + window.dispatch({ event: "resume" }); + else + window.dispatch({ event: "pause" }); + break; + case "F10": + event.preventDefault(); + if (paused) + window.dispatch({ event: "step" }); + break; + } + }; + document.addEventListener("keydown", handleKeyDown); + return () => document.removeEventListener("keydown", handleKeyDown); + }, [paused]); + const onEditorChange = reactExports.useCallback((selector) => { + if (mode === "none" || mode === "inspecting") + window.dispatch({ event: "setMode", params: { mode: "standby" } }); + setLocator(selector); + window.dispatch({ event: "highlightRequested", params: { selector } }); + }, [mode]); + const onAriaEditorChange = reactExports.useCallback((ariaSnapshot2) => { + if (mode === "none" || mode === "inspecting") + window.dispatch({ event: "setMode", params: { mode: "standby" } }); + const { fragment, errors } = parseAriaSnapshot(YAML, ariaSnapshot2, { prettyErrors: false }); + const highlights = errors.map((error) => { + const highlight = { + message: error.message, + line: error.range[1].line, + column: error.range[1].col, + type: "subtle-error" + }; + return highlight; + }); + setAriaSnapshotErrors(highlights); + setAriaSnapshot(ariaSnapshot2); + if (!errors.length) + window.dispatch({ event: "highlightRequested", params: { ariaTemplate: fragment } }); + }, [mode]); + return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "recorder", children: [ + /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "circle-large-filled", title: "Record", toggled: mode === "recording" || mode === "recording-inspecting" || mode === "assertingText" || mode === "assertingVisibility", onClick: () => { + window.dispatch({ event: "setMode", params: { mode: mode === "none" || mode === "standby" || mode === "inspecting" ? "recording" : "standby" } }); + }, children: "Record" }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarSeparator, {}), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "inspect", title: "Pick locator", toggled: mode === "inspecting" || mode === "recording-inspecting", onClick: () => { + const newMode = { + "inspecting": "standby", + "none": "inspecting", + "standby": "inspecting", + "recording": "recording-inspecting", + "recording-inspecting": "recording", + "assertingText": "recording-inspecting", + "assertingVisibility": "recording-inspecting", + "assertingValue": "recording-inspecting", + "assertingSnapshot": "recording-inspecting" + }[mode]; + window.dispatch({ event: "setMode", params: { mode: newMode } }).catch(() => { + }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "eye", title: "Assert visibility", toggled: mode === "assertingVisibility", disabled: mode === "none" || mode === "standby" || mode === "inspecting", onClick: () => { + window.dispatch({ event: "setMode", params: { mode: mode === "assertingVisibility" ? "recording" : "assertingVisibility" } }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "whole-word", title: "Assert text", toggled: mode === "assertingText", disabled: mode === "none" || mode === "standby" || mode === "inspecting", onClick: () => { + window.dispatch({ event: "setMode", params: { mode: mode === "assertingText" ? "recording" : "assertingText" } }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "symbol-constant", title: "Assert value", toggled: mode === "assertingValue", disabled: mode === "none" || mode === "standby" || mode === "inspecting", onClick: () => { + window.dispatch({ event: "setMode", params: { mode: mode === "assertingValue" ? "recording" : "assertingValue" } }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "gist", title: "Assert snapshot", toggled: mode === "assertingSnapshot", disabled: mode === "none" || mode === "standby" || mode === "inspecting", onClick: () => { + window.dispatch({ event: "setMode", params: { mode: mode === "assertingSnapshot" ? "recording" : "assertingSnapshot" } }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarSeparator, {}), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "files", title: "Copy", disabled: !source || !source.text, onClick: () => { + copy(source.text); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "debug-continue", title: "Resume (F8)", ariaLabel: "Resume", disabled: !paused, onClick: () => { + window.dispatch({ event: "resume" }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "debug-pause", title: "Pause (F8)", ariaLabel: "Pause", disabled: paused, onClick: () => { + window.dispatch({ event: "pause" }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "debug-step-over", title: "Step over (F10)", ariaLabel: "Step over", disabled: !paused, onClick: () => { + window.dispatch({ event: "step" }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { flex: "auto" } }), + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: "Target:" }), + /* @__PURE__ */ jsxRuntimeExports.jsx(SourceChooser, { fileId, sources, setFileId: (fileId2) => { + setSelectedFileId(fileId2); + window.dispatch({ event: "fileChanged", params: { file: fileId2 } }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "clear-all", title: "Clear", disabled: !source || !source.text, onClick: () => { + window.dispatch({ event: "clear" }); + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "color-mode", title: "Toggle color mode", toggled: false, onClick: () => toggleTheme() }) + ] }), + /* @__PURE__ */ jsxRuntimeExports.jsx( + SplitView, + { + sidebarSize: 200, + main: /* @__PURE__ */ jsxRuntimeExports.jsx(CodeMirrorWrapper, { text: source.text, language: source.language, highlight: source.highlight, revealLine: source.revealLine, readOnly: source.id !== "playwright-test", onChange: onEditedCode, onCursorActivity, lineNumbers: true }), + sidebar: /* @__PURE__ */ jsxRuntimeExports.jsx( + TabbedPane, + { + rightToolbar: selectedTab === "locator" || selectedTab === "aria" ? [/* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "files", title: "Copy", onClick: () => copy((selectedTab === "locator" ? locator : ariaSnapshot) || "") }, 1)] : [], + tabs: [ + { + id: "locator", + title: "Locator", + render: () => /* @__PURE__ */ jsxRuntimeExports.jsx(CodeMirrorWrapper, { text: locator, placeholder: "Type locator to inspect", language: source.language, focusOnChange: selectorFocusOnChange, onChange: onEditorChange, wrapLines: true }) + }, + { + id: "log", + title: "Log", + render: () => /* @__PURE__ */ jsxRuntimeExports.jsx(CallLogView, { language: source.language, log: Array.from(log.values()) }) + }, + { + id: "aria", + title: "Aria", + render: () => /* @__PURE__ */ jsxRuntimeExports.jsx(CodeMirrorWrapper, { text: ariaSnapshot || "", placeholder: "Type aria template to match", language: "yaml", onChange: onAriaEditorChange, highlight: ariaSnapshotErrors, wrapLines: true }) + } + ], + selectedTab, + setSelectedTab + } + ) + } + ) + ] }); +}; +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var __assign = function() { + __assign = Object.assign || function __assign2(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} +function __spreadArray(to, from) { + for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) + to[j] = from[i]; + return to; +} +var hexGen = function(len) { + if (len === void 0) { + len = 12; + } + var maxlen = 8; + var min = Math.pow(16, Math.min(len, maxlen) - 1); + var max = Math.pow(16, Math.min(len, maxlen)) - 1; + var n = Math.floor(Math.random() * (max - min + 1)) + min; + var r = n.toString(16); + while (r.length < len) { + r = r + hexGen(len - maxlen); + } + return r; +}; +var DEFAULT_SCOPE = "stack"; +var SCOPE_KEY = "factoryStack"; +if (typeof window !== "undefined") { + if (!window[SCOPE_KEY]) { + window[SCOPE_KEY] = {}; + } +} +var registerContainer = function(scope, ref) { + window[SCOPE_KEY][scope] = ref; + return ref; +}; +var unregisterContainer = function(scope) { + delete window[SCOPE_KEY][scope]; +}; +var getContainer = function(scope) { + return window[SCOPE_KEY][scope || DEFAULT_SCOPE]; +}; +var InstanceContainer = function(props, ref) { + var _a = (props || {}).scope, scope = _a === void 0 ? DEFAULT_SCOPE : _a; + var propsRef = reactExports.useRef(props); + var _b = reactExports.useState({}), instances = _b[0], setInstances = _b[1]; + var _c = reactExports.useState([]), hashStack = _c[0], setHashStack = _c[1]; + var resolve = reactExports.useCallback(function(hash, v) { + var _a2; + return (_a2 = instances === null || instances === void 0 ? void 0 : instances[hash]) === null || _a2 === void 0 ? void 0 : _a2.resolve(v); + }, [instances]); + var resolveAll = reactExports.useCallback(function(v) { + return Object.values(instances).forEach(function(i) { + return i.resolve(v); + }); + }, [instances]); + var reject = reactExports.useCallback(function(hash, r) { + var _a2; + return (_a2 = instances === null || instances === void 0 ? void 0 : instances[hash]) === null || _a2 === void 0 ? void 0 : _a2.reject(r); + }, [instances]); + var rejectAll = reactExports.useCallback(function(r) { + return Object.values(instances).forEach(function(i) { + return i.reject(r); + }); + }, [instances]); + var hasInstance = reactExports.useCallback(function(hash) { + return !!hashStack.find(function(id) { + return id === hash; + }); + }, [hashStack]); + var getInstance = reactExports.useCallback(function(hash) { + return instances === null || instances === void 0 ? void 0 : instances[hash]; + }, [ + instances + ]); + var remove = function(hash, options) { + var _a2; + setHashStack(function(stack) { + return stack.filter(function(s) { + return s !== hash; + }); + }); + setTimeout(function() { + setInstances(function(instances2) { + var _a3 = instances2, _b2 = hash; + _a3[_b2]; + var omitHash = __rest(_a3, [typeof _b2 === "symbol" ? _b2 : _b2 + ""]); + return omitHash; + }); + }, options === null || options === void 0 ? void 0 : options.exitTimeout); + (_a2 = props.onRemove) === null || _a2 === void 0 ? void 0 : _a2.call(props, hash); + }; + var create2 = function(Component, options, instanceProps) { + if (options === void 0) { + options = {}; + } + return new Promise(function(res, rej) { + var hash = (instanceProps === null || instanceProps === void 0 ? void 0 : instanceProps.instanceId) || hexGen(); + var _a2 = propsRef.current, enterTimeout = _a2.enterTimeout, exitTimeout = _a2.exitTimeout, isAppendIntances = _a2.isAppendIntances, onResolve = _a2.onResolve, onReject = _a2.onReject; + var instanceOptions = __assign({ + enterTimeout, + exitTimeout, + instanceId: hash + }, options); + var instance = __assign({ Component, props: __assign(__assign({}, options), instanceProps), resolve: function(v) { + removeRef.current(hash, instanceOptions); + res(v); + onResolve === null || onResolve === void 0 ? void 0 : onResolve(v, hash); + }, reject: function(r) { + removeRef.current(hash, instanceOptions); + rej(r); + onReject === null || onReject === void 0 ? void 0 : onReject(r, hash); + } }, instanceOptions); + setInstances(function(instances2) { + var _a3, _b2; + return isAppendIntances ? __assign(__assign({}, instances2), (_a3 = {}, _a3[hash] = instance, _a3)) : __assign((_b2 = {}, _b2[hash] = instance, _b2), instances2); + }); + setTimeout(function() { + var _a3, _b2; + setHashStack(function(stack) { + return __spreadArray(__spreadArray([], stack), [hash]); + }); + (_b2 = (_a3 = propsRef.current).onOpen) === null || _b2 === void 0 ? void 0 : _b2.call(_a3, hash, instance); + }, instanceOptions.enterTimeout); + }); + }; + var removeRef = reactExports.useRef(remove); + var createRef = reactExports.useRef(create2); + reactExports.useEffect(function() { + propsRef.current = props; + removeRef.current = remove; + createRef.current = create2; + }); + reactExports.useImperativeHandle(ref, function() { + return { + create: createRef.current, + resolve, + reject, + resolveAll, + rejectAll, + hasInstance, + getInstance + }; + }); + reactExports.useEffect(function() { + registerContainer(scope, { + create: createRef.current, + resolve, + reject, + resolveAll, + rejectAll, + hasInstance, + getInstance + }); + return function() { + return unregisterContainer(scope); + }; + }, [scope]); + var mapKeys = reactExports.useMemo(function() { + var keys = Object.keys(instances); + return keys.map(function(key) { + var _a2 = instances[key], Component = _a2.Component, props2 = _a2.props, resolve2 = _a2.resolve, reject2 = _a2.reject; + var isOpen = !!hashStack.find(function(h) { + return h === key; + }); + return React.createElement(Component, __assign({}, props2, { + key, + isOpen, + onReject: reject2, + onResolve: resolve2, + /** @deprecated **/ + close: resolve2, + /** @deprecated **/ + open: isOpen + })); + }); + }, [instances, hashStack]); + return React.createElement(React.Fragment, null, mapKeys); +}; +var Container = reactExports.forwardRef(InstanceContainer); +Container.defaultProps = { + exitTimeout: 500, + enterTimeout: 50 +}; +var create = function(Component, options) { + return function(props) { + return getContainer(void 0).create(Component, options, props); + }; +}; +const SaveCodeForm = ({ suggestedFilename, onSubmit }) => { + const [filename, setFilename] = React.useState(suggestedFilename ?? ""); + return /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { id: "save-form", onSubmit: () => onSubmit({ filename }), children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "filename", children: "File Name:" }), + /* @__PURE__ */ jsxRuntimeExports.jsx( + "input", + { + type: "text", + id: "filename", + name: "filename", + placeholder: "Enter file name", + required: true, + value: filename, + onChange: (e) => setFilename(e.target.value) + } + ), + /* @__PURE__ */ jsxRuntimeExports.jsx("button", { id: "submit", type: "submit", disabled: !filename, children: "Save" }) + ] }); +}; +function setElementPicked(elementInfo, userGesture) { + window.playwrightElementPicked(elementInfo, userGesture); +} +function setRunningFileId(fileId) { + window.playwrightSetRunningFile(fileId); +} +function download(filename, text) { + const blob = new Blob([text], { type: "text/plain" }); + const url = URL.createObjectURL(blob); + try { + const a = document.createElement("a"); + a.href = url; + a.download = filename; + a.click(); + } finally { + URL.revokeObjectURL(url); + } +} +function generateDatetimeSuffix() { + return (/* @__PURE__ */ new Date()).toISOString().replace(/[-:]/g, "").replace(/\..+/, "").replace("T", "-"); +} +const codegenFilenames = { + "javascript": "example.js", + "playwright-test": "example.spec.ts", + "java-junit": "TestExample.java", + "java": "Example.java", + "python-pytest": "test_example.py", + "python": "example.py", + "python-async": "example.py", + "csharp-mstest": "Tests.cs", + "csharp-nunit": "Tests.cs", + "csharp": "Example.cs" +}; +const CrxRecorder = ({}) => { + const [settings2, setSettings] = reactExports.useState(defaultSettings); + const [sources, setSources] = reactExports.useState([]); + const [paused, setPaused] = reactExports.useState(false); + const [log, setLog] = reactExports.useState(/* @__PURE__ */ new Map()); + const [mode, setMode] = reactExports.useState("none"); + const [selectedFileId, setSelectedFileId] = reactExports.useState(defaultSettings.targetLanguage); + reactExports.useEffect(() => { + const port = chrome.runtime.connect({ name: "recorder" }); + const onMessage = (msg) => { + if (!("type" in msg) || msg.type !== "recorder") + return; + switch (msg.method) { + case "setPaused": + setPaused(msg.paused); + break; + case "setMode": + setMode(msg.mode); + chrome.runtime.sendMessage({ type: "edge_share_crx_recorder_update", mode: msg.mode }).catch(() => { + }); + break; + case "setSources": + setSources(msg.sources); + chrome.runtime.sendMessage({ type: "edge_share_crx_recorder_update", sources: msg.sources }).catch(() => { + }); + break; + case "resetCallLogs": + setLog(/* @__PURE__ */ new Map()); + break; + case "updateCallLogs": + setLog((log2) => { + const newLog = new Map(log2); + for (const callLog of msg.callLogs) { + callLog.reveal = !log2.has(callLog.id); + newLog.set(callLog.id, callLog); + } + return newLog; + }); + break; + case "setRunningFile": + setRunningFileId(msg.file); + break; + case "elementPicked": + setElementPicked(msg.elementInfo, msg.userGesture); + break; + } + }; + port.onMessage.addListener(onMessage); + window.dispatch = async (data) => { + port.postMessage({ type: "recorderEvent", ...data }); + if (data.event === "fileChanged") + setSelectedFileId(data.params.file); + }; + loadSettings().then((settings22) => { + setSettings(settings22); + setSelectedFileId(settings22.targetLanguage); + }).catch(() => { + }); + addSettingsChangedListener(setSettings); + return () => { + removeSettingsChangedListener(setSettings); + port.disconnect(); + }; + }, []); + const source = reactExports.useMemo(() => sources.find((s) => s.id === selectedFileId), [sources, selectedFileId]); + const requestStorageState = reactExports.useCallback(() => { + if (!settings2.experimental) + return; + chrome.runtime.sendMessage({ event: "storageStateRequested" }).then((storageState) => { + const fileSuffix = generateDatetimeSuffix(); + download(`storageState-${fileSuffix}.json`, JSON.stringify(storageState, null, 2)); + }); + }, [settings2]); + const showPreferences = reactExports.useCallback(() => { + const modal = create( + ({ isOpen, onResolve }) => /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { title: "Preferences", isOpen, onClose: onResolve, children: /* @__PURE__ */ jsxRuntimeExports.jsx(PreferencesForm, {}) }) + ); + modal().catch(() => { + }); + }, []); + const saveCode = reactExports.useCallback(() => { + if (!settings2.experimental) + return; + const modal = create(({ isOpen, onResolve, onReject }) => { + return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { title: "Save code", isOpen, onClose: onReject, children: /* @__PURE__ */ jsxRuntimeExports.jsx(SaveCodeForm, { onSubmit: onResolve, suggestedFilename: codegenFilenames[selectedFileId] }) }); + }); + modal().then(({ filename }) => { + const code = source == null ? void 0 : source.text; + if (!code) + return; + download(filename, code); + }).catch(() => { + }); + }, [settings2, source, selectedFileId]); + reactExports.useEffect(() => { + if (!settings2.experimental) + return; + const keydownHandler = (e) => { + if (e.ctrlKey && e.key === "s") { + e.preventDefault(); + saveCode(); + } + }; + window.addEventListener("keydown", keydownHandler); + return () => { + window.removeEventListener("keydown", keydownHandler); + }; + }, [selectedFileId, settings2, saveCode]); + const dispatchEditedCode = reactExports.useCallback((code) => { + window.dispatch({ event: "codeChanged", params: { code } }); + }, []); + const dispatchCursorActivity = reactExports.useCallback((position) => { + window.dispatch({ event: "cursorActivity", params: { position } }); + }, []); + return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx(Container, {}), + /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "recorder", children: [ + settings2.experimental && /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "save", title: "Save", disabled: false, onClick: saveCode, children: "Save" }), + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { flex: "auto" } }), + /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "dropdown", children: [ + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "tools", title: "Tools", disabled: false, onClick: () => { + } }), + /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "dropdown-content right-align", children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "#", onClick: requestStorageState, children: "Download storage state" }) }) + ] }), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarSeparator, {}), + /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "settings-gear", title: "Preferences", onClick: showPreferences }) + ] }) }), + /* @__PURE__ */ jsxRuntimeExports.jsx(Recorder, { sources, paused, log, mode, onEditedCode: dispatchEditedCode, onCursorActivity: dispatchCursorActivity }) + ] }) + ] }); +}; +(async () => { + applyTheme(); + clientExports.createRoot(document.querySelector("#root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(CrxRecorder, {})); +})(); diff --git a/extension/edge-share-crx/manifest.json b/extension/edge-share-crx/manifest.json new file mode 100644 index 0000000..4998fe2 --- /dev/null +++ b/extension/edge-share-crx/manifest.json @@ -0,0 +1,80 @@ +{ + "name": "Browser Connection Playwright CRX", + "version": "0.15.0", + "description": "Playwright CRX recorder integrated with browser-connection relay sharing.", + "manifest_version": 3, + "icons": { + "16": "icon-16x16.png", + "32": "icon-32x32.png", + "48": "icon-48x48.png", + "128": "icon-192x192.png" + }, + "background": { + "service_worker": "background.js", + "type": "module" + }, + "action": { + "default_icon": { + "16": "icon-16x16.png", + "32": "icon-32x32.png" + }, + "default_title": "Record" + }, + "commands": { + "record": { + "suggested_key": { + "default": "Shift+Alt+R" + }, + "description": "Start recording" + }, + "inspect": { + "suggested_key": { + "default": "Shift+Alt+C" + }, + "description": "Start inspecting" + } + }, + "side_panel": { + "default_path": "empty.html" + }, + "options_ui": { + "page": "preferences.html", + "open_in_tab": false + }, + "permissions": [ + "activeTab", + "debugger", + "scripting", + "tabs", + "contextMenus", + "storage", + "sidePanel" + ], + "host_permissions": [ + "" + ], + "content_scripts": [ + { + "matches": [ + "" + ], + "js": [ + "edge_share_content.js" + ], + "run_at": "document_start" + } + ], + "web_accessible_resources": [ + { + "resources": [ + "provider.js" + ], + "matches": [ + "" + ] + } + ], + "content_security_policy": { + "extension_pages": "script-src 'self'; object-src 'self'; connect-src 'self' http://* https://* ws://* wss://*;" + } +} diff --git a/extension/edge-share-crx/playwright-logo.svg b/extension/edge-share-crx/playwright-logo.svg new file mode 100644 index 0000000..7b3ca7d --- /dev/null +++ b/extension/edge-share-crx/playwright-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/extension/edge-share-crx/preferences.css b/extension/edge-share-crx/preferences.css new file mode 100644 index 0000000..5cc12be --- /dev/null +++ b/extension/edge-share-crx/preferences.css @@ -0,0 +1,4 @@ +body { + font-family: sans-serif; + margin: 20px; +} diff --git a/extension/edge-share-crx/preferences.html b/extension/edge-share-crx/preferences.html new file mode 100644 index 0000000..c415c30 --- /dev/null +++ b/extension/edge-share-crx/preferences.html @@ -0,0 +1,31 @@ + + + + + + + Playwright CRX - Preferences + + + + + + + +
    + + diff --git a/extension/edge-share-crx/preferences.js b/extension/edge-share-crx/preferences.js new file mode 100644 index 0000000..9d96c6f --- /dev/null +++ b/extension/edge-share-crx/preferences.js @@ -0,0 +1,5 @@ +import { c as clientExports, j as jsxRuntimeExports, P as PreferencesForm } from "./form.js"; +import "./settings.js"; +(async () => { + clientExports.createRoot(document.querySelector("#root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(PreferencesForm, {})); +})(); diff --git a/extension/edge-share-crx/provider.js b/extension/edge-share-crx/provider.js new file mode 100644 index 0000000..1463eea --- /dev/null +++ b/extension/edge-share-crx/provider.js @@ -0,0 +1,115 @@ +"use strict"; + +(() => { + if (window.browserConnection) { + return; + } + + const SOURCE_PAGE = "browser-connection:page"; + const SOURCE_CONTENT = "browser-connection:content"; + const SOURCE_RECORDER = "browser-connection:recorder"; + const pending = new Map(); + let nextId = 1; + + function request(input) { + const payload = normalizeRequest(input); + const id = String(nextId++); + + return new Promise((resolve, reject) => { + pending.set(id, { resolve, reject }); + window.postMessage( + { + source: SOURCE_PAGE, + id, + method: payload.method, + params: payload.params + }, + window.location.origin + ); + }); + } + + function normalizeRequest(input) { + if (!input || typeof input !== "object") { + throw new Error("browserConnection.request expects an object"); + } + const method = String(input.method || "").trim(); + if (!method) { + throw new Error("browserConnection request method is required"); + } + const params = input.params && typeof input.params === "object" ? input.params : {}; + return { method, params }; + } + + window.addEventListener("message", (event) => { + if (event.source !== window || event.origin !== window.location.origin) { + return; + } + const message = event.data; + if (!message || message.source !== SOURCE_CONTENT || !message.id) { + return; + } + + const entry = pending.get(message.id); + if (!entry) { + return; + } + pending.delete(message.id); + + if (message.ok) { + entry.resolve(message.result); + } else { + entry.reject(new Error(message.error || "browserConnection request failed")); + } + }); + + Object.defineProperty(window, "browserConnection", { + value: Object.freeze({ request }), + enumerable: false, + configurable: false, + writable: false + }); + + window.dispatchEvent(new Event("browserConnection#initialized")); + + installNavigationRecorder(); + + function installNavigationRecorder() { + if (window.__browserConnectionRecorderInstalled) { + return; + } + Object.defineProperty(window, "__browserConnectionRecorderInstalled", { + value: true, + enumerable: false, + configurable: false, + writable: false + }); + + const notify = () => { + window.postMessage( + { + source: SOURCE_RECORDER, + kind: "navigate", + href: location.href, + title: document.title || "" + }, + window.location.origin + ); + }; + + const pushState = history.pushState; + const replaceState = history.replaceState; + history.pushState = function (...args) { + const result = pushState.apply(this, args); + queueMicrotask(notify); + return result; + }; + history.replaceState = function (...args) { + const result = replaceState.apply(this, args); + queueMicrotask(notify); + return result; + }; + window.addEventListener("popstate", notify); + window.addEventListener("hashchange", notify); + } +})(); diff --git a/extension/edge-share-crx/settings.js b/extension/edge-share-crx/settings.js new file mode 100644 index 0000000..e55ce38 --- /dev/null +++ b/extension/edge-share-crx/settings.js @@ -0,0 +1,41 @@ +const defaultSettings = { + testIdAttributeName: "data-testid", + targetLanguage: "playwright-test", + sidepanel: true, + experimental: false, + playInIncognito: false +}; +async function loadSettings() { + const [isAllowedIncognitoAccess, loadedPreferences] = await Promise.all([ + chrome.extension.isAllowedIncognitoAccess(), + chrome.storage.sync.get(["testIdAttributeName", "targetLanguage", "sidepanel", "playInIncognito", "experimental"]) + ]); + return { ...defaultSettings, ...loadedPreferences, playInIncognito: !!loadedPreferences.playInIncognito && isAllowedIncognitoAccess }; +} +async function storeSettings(settings) { + await chrome.storage.sync.set(settings); +} +const listeners = /* @__PURE__ */ new Map(); +function addSettingsChangedListener(listener) { + const wrappedListener = ({ testIdAttributeName, targetLanguage, sidepanel, playInIncognito, experimental }) => { + if (!testIdAttributeName && !targetLanguage && sidepanel && playInIncognito && experimental) + return; + loadSettings().then(listener).catch(() => { + }); + }; + listeners.set(listener, wrappedListener); + chrome.storage.sync.onChanged.addListener(wrappedListener); +} +function removeSettingsChangedListener(listener) { + const wrappedListener = listeners.get(listener); + if (!wrappedListener) + return; + chrome.storage.sync.onChanged.removeListener(wrappedListener); +} +export { + addSettingsChangedListener as a, + defaultSettings as d, + loadSettings as l, + removeSettingsChangedListener as r, + storeSettings as s +}; diff --git a/src/mcp/control_panel.html b/src/mcp/control_panel.html index 335fe35..66160b5 100644 --- a/src/mcp/control_panel.html +++ b/src/mcp/control_panel.html @@ -852,7 +852,7 @@

    Agent timeline

    User action recorder idle 0

    V+abw+Ie>k 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%0D^j&J}N7YV7!_u3h1U8LKLgyk;-t zGrQQ<8%$LkqU?OBka1jO?$Z0*umU&qzzhYDTV+~9SFge11&4akXIY!;)|-2=J%Ax6 zif3MWq%-Wr%v^$5c})em9?0$~)Pf4_Zn%<2S+U`~7*+G}&zNqUPxK7=mTh6EQ^bl^ zz!lh)pyW_H^n#a##P4Cjm%!avDaBlWnpDT4;C$i`;}02yWS^De7Q4lF>w%9@_rQi3 zFol>RVmE~#cmzo0rz`o^>MedytKo^jrt2XOshEPUiW_G(AB(sda8KSpOUreJ%9i1Wb>LGy4s>!=0H*nM@bZS}; zqgmNNn(uO4%<^e50kH~&IrG5qwBN9;zSlPFHDE%=7=&uJoO#8y-r}pFJ>JBgLX;@# ze@WpEnNFC0WS?GugH01zW&%>7L><#3)1wRD%W3Q*cj%p=2C09ugZZU?a z`7I1arDkw_z?Wcq5~LE&jz!E-SrhL92Piuy!DfrSwCs>T)v5aR0EJ3YQkpC%qTM9@wA>w{*hQlcBAaPsK?NUVh*Zx+=I>4Fk=0!f-OB>(1z(D z`Z&{JOm9kXX6ox-c(X~SsBHd|5>1x#I6DI(iIm~gV@Vt4tFJfua$4(KgM@}6#UVhQw+&=IyJjh5>K^q50>lCqSS#q;n|2cvM_J#l706sGAHzmn9vrYhry}Q z!;Uabts)nIRr#@m#6m&CQEuTT!7Q;y35dF|o>m~$4!b-r7;yAhk@hSC@q9T=2+@e= z_U?=@%bRAoMG8zDqLaRR^w%hwb08xEI(ywgOxL4Hjm2v8U2}!z6JLTg&2-pq13)w~ zb|0Kp%KDA^B6jnTN0v=V7KE7>GQlkjq-T253eBLE8ei+&3baNIu5EqPbL^`VEW`ka-yRx zyF2|0`ivS)BGt76VZ(#G=pc!iFpy@^F_5(&y3{n`AFf?7rtEQqphf1`KBNVN+PgH> z+u^J>$nANLW7z}j+BeBBbjKlW(uTt`gou48c|t?+%$~Hz2!{lXi&DB5$qcNki0?wu zUsbkNdo|1ksTW~>0_?KgTvbjZUo{v#`fxzMWM@SVCYDR9d=SP8qc#1hm=@;tlY`;V z+7iIwVf|2}aDphDG@_8>2htVRR;<*yDM(BX`c?b|ziBhJDkcNt=#o^*=F~T-pxCBJ z#iq;i7dk0azh2B~$`^C=qnP^%WVA_k%N%3eMb)~MKH+X%$=vo48<|U1rs45Z(r8cc z-@%E6$?bv@N!(CGQpUz-E!Yr8B?6Y1-PbN5Qk%<(VU}V{Gv!ce@aRgI#8Vqmn_*Lf zXgjbwyafhc{}@+IiP{bKiJA~cT@9Hn_S(FwnbRIF+KU2gFob8takZR|3UIBemM!*Y zGisrI9+9v#vcgg)E2wD-OicPKf1LmiR(r9~Kl(ZYS3YLOpFwv2&KpwX4KVzE`#I;5|nCedRsku873H2jjYimtA6c-D< zP(rmhbt`5q*+J^%$l+I9-#iN#y{(s-m8!N3^UMZpDE71Eh{~}Q7^+j=m}FvLuM?z@ z!q$2>%94he3GXXBPNp1-mIc#zz1{6w%t-Uxk=wR&zE!%- zk~!n}{ymo%vg!(elEW_qwoorOrv$*tf`GI=4BPIrQKh>d_;c>gI~kr4vwne@@q8&S z=IrXSCqfi7Rs($$>6esH&mOr{fbhchZqk3k)@HIqi*6kmKZbdO1_nmsgUzEh7=`LB z)1UsWW^x6jZOL&CI?a%W%R#VO8T`_qBp8|7+ftfYI2Tw`JM5oyXmANi)nRv0?B~b) z$b=LmHC1d`(d5yY1?3z%YmCkmlPOHTS}I!1v){T;I7?BmC-<8{CN z-LaFkP0J(-e!{kN4%MM8tz`aBMm+T1B~tF?z;~fvl)Y_3ibeYMHLEb`Aa!UD9cd{{ zuf!lcS?w}|d?hD}gN-vK-5%o?HSjzemnRr2XQQUyv+-l@V><@*3x?LqRrSTzu@YWC z^jz74MSgr}Pt0%BJe0K((-ry;5N327p{IQ%AJx_5V-b;ERVzD44v2L1Ytz&EAUjo$ z+4QZ6>0??H8OV_t@=(?5VKvqL4Clpp^-+m}^#X+NzJox7gdo5Kkk!jrRuXMDACJ?G zUTS&M&h-<~3M~mrhfU}oxOCJ5SL+haKOWWFx~u}%Sg3vv*(9s}kiym97!kVEuCzIz zw7jK-a|g+m{kDlKmo$cN^!oL5Y%J83+L1A-Lfyl$0`t^Icn3ZtmP3WL2ozI~17-y{ zaPZj5>i}?;Qi`{W!rE02ovzAhnQmf@GfnH~N5rL06?jijz z=$2T__i1)ZToQhOI4gq2p>o_58%Nt3Lmy`GVQnx+e5T^c7ch%`)pkN(E&VFf1AUA9 z2*yY>`+BZ#u}$zxTD>|9OI8r;3Z!fA^_Kr+h`*&m3x}M*mjMFM1SWbb6>#){(v(_} zA`LGyE+&Opq%!u*wjH`Lu(jYCFvW-ZD`(?cjdWfvp6NAb05I&Kss3fB=`&Xj8&e(_ z;izrB(12}QxzA|sL!xcOJL%|5d#;r0!s-RhlOL;j1iePwL_*PXL6q!p!?cs4O|*s? z6P4{}kjY+b-nm#;hV?-hNn2-nhW-A;aK?cA7Zu=tSk}*{5KA=fzo+eBtY_vuTfn@+ zq&n^QWKlJL@4tWheCOB9WeU&!*NrbYM4S7Y6P7i-+AfU0hnewkvfLvYoS`?5VQ8C+ z-cu+toOU7po~^1x{MO5SCVd*%I_g@*%u0KCy%igbDgg;sh7^zVNkXihWPMt@(FQc{ zlvTA{rr)hxFDlRJdVEu|(nMKXiDyyR0oVAlY)f{``0)?wnqX~(^U=hbd?Q6c()sz+Ad(z(Vx);$gAyQ77krIQw zhdN>C=AK*Xpr}{Ab=3-$I+|(jE#`2Bx;>hIzNH@A>i<6eX8ks0AJmOF#zz_2yBKTepD?qG2pP|^+qbhE6clHL zLRLPfNLI}*>MdFDY_XWtTeokUef#60swRqT%Ej4I9cZiD=Fu&+TP~_mHMza07Pkr2 zxBnM_bBlibh~RgCT{ATg=u~M%EaC9VshPrB?c!xM2W`y8<^!_rgOz)7oR2ajvyS&!8AHpg7cu50KJ)Iq1X zfANv4$#oQ_)lkG7++$=9a3u`1qA2RiCEVWt^l8-aetY$wV(ktyx>`<-I4dPK#@%=Jz{!P;bde6V>T-sM0kcJRnU5b zMewRCA{fs24fquxHRDz86pb4({j(dO^xq0qMWhP!j!6OmGA(nk@3E3Bv=57}ge|pV zX9{0(_IrN-`Rg74bNXJ2$n4l%CBE1A^K*dtp2o`&rp64mq`ujcU`zUas5YhFk6U*o ze|%p|7Xt>}<@!+V6w|8=o;2tXRvnUP8z@)pR_*i8s!vle=sYdX6kekd^sWA7nasaa{)R|+K`Uz+fe5TnCjv;=7 zH26Adzpzb{dy4tF$z1b=w6rW;d&>&Zkc$8@AM(+ngnw$hILR^x%vYS5??LVY;*74I@UJ^aK96Ans)LD5K1+D zS}2LPfHWK1p3X9P>(Pq3YOOX2b&9)g>}-p25*3%e7F45Qy`h)+K4 zzyF@PFtE%sqrb)bD3p9?)RjLteWm4kGxY_XNgHS^E}lExC&#F5a_AmQb3&7J8`VxY z`Ibp)p-sW5xQ0<c^yF|5B*L#9X`eO6q;++$am9>oR4^GL<4`EcF>3~bGpaNPr zrl`#*oIy-nwSI_uKE9oJk+R?TZZqvBoEE>Elu5-n4)d%Ne7Eu@xykgC=(5TBW0qOBx*`suc^Zz} zr=b|L#h^pE0{M^RzEO34o=?Yb*!|v37E#~KX)U51?4f(lUp@N)?V->$nnR_Q&e}zd zcYl=Qz(95g>elfX90;M(v#MD3V7*R6T)KT~>)A#lCUR-aaNrC#n^U z^l4GrW)Vmk?Oh6Y-8OoH>W4Oj*a}DyW3+=`$Um2II$HLj@jqbf5if#k8~r#n_7xAB zJlH;Xsrv}j!JU-BjZFrwqOU4;K2X~(Ifa7ZAn5(Z7ypsJvZFibp?rN)kf>3&+}O5t z24`%Yv2EM7ZQHhO+qP}nR_5MRDoIuHKkV=Ed)QTLRj=N?x}Tc4b}e>eqo>Tsv5Pu& zaU7qyA(9vK;9$l%?KhAZG)GBzx^4u~DMyB%1w{BBGnuRo0!;O=R#+AZuggUlr%WvcV(jm;M*3FSkS~V6a(QSg z+eVq03VLJIkXqmKl>PnI@sop;<2=B@Wc@gsk%=K7{WC|z_c5RYfO*^@I<)3ckHO4T zM+N|mQBG4bp?=UDdas-9*-o*AKgTZJ(wyZ90OWifdUKJ=N*s%PF*~XyS;6$kn|1UV ztY`F;(j0Bmgazp<)7S`Z9G?&ZFrHsTuwJl{uFW759(GlXAupf3@s(Gq1PG1R_>myw zEEGM0?yjzGdn@o21Lb|u`4z%FV!&n1jXo%;#T6L2*ILMJygw^qWGueY$YI}74B%gM zfTPA{rzHf8j(McM2Tg6Le}yIUdEGA^_2S#qTtQJR-!hOEIyMqtcZ>5u>iaia)*OPy z-%$@47$B1z0ZB;{LK}}JB(FyEI0it}Pv>N{^EZQ0AOw1_~;YE^Z=D<{}GRU{KNK^lpL57@r56jnuF@ev-qq*GQ4J!o<74m#;>RE7dTZgig={}WQ{6G#5^~AkFPGL;f!t#WZk$Z) zPB#~qq?S?4v$4?lUF{5GeEo7`O>2bi&1sNpRqP145)kY@Yh^L zN*3e*0@{Xj>WyM-&Q1%mRg3VBfK$GGwa#4Wo|u4s`6`tdq2E9$$apUWxgf z3=L7nsR1tRZr|(^kY&*J!+2J6(cz>n6dnt2llTXP{x`a@f`F;x{0Ej}>wwz+5GRF9 znujp4GhMly@gIa{#@p;aitlM1Dm14YVCkE}LmUk_2WNz1@G1v|D}z<4>#V^2fRveKwNt^*x@NxXd5C+DXxe=2LHa%p$}j>NUv zb}{(2bgb7xi?0@O4oza^W$7~>0;^ZL6E&v2R?7WY7t+@bJJJ=l24cILTIQf>sFc0? zz}x)HMA4!^-!0TDns$56M3XDDUNW|z#Xs-WU4h!L03#>#UEeA?^%l6u+`Zcd-;Ltk zY$GYWVDSmJ%Tv~Kcf8+srYlF7t4Hseqo3nvw-^t`ac3tYvH~WG#O+_k^aNV z51>3QR1jGadusuj$zx@C2ela5(fedEJ=Rs57}EkIQN}SJ32pOGjpl1t>IcJ2&Xchb zIEJ|au5vcfr@nAe7;@ax=8yz!QQK5&shEmCj}BH=w+~@@i9~lY3CFN8w2z&^ z>^v+De2I-QsK4{I%h>$p%N%kS=((nm-2rMhKXErfT%cJL^-ipoRggL3^19SgtC z@o`)M7S4~35|+NXG@Xx%)nZQhnIbbEQaT}#V=fBhz(9zK_Xy{N+lw&7^AF$%u|BGq z3j9gegzwU#9!wpD44gA|y?|_+pN^EPtt~U(WlE-KXJFs3j9dV<98M-R$J7cFPv3Q! zCfZUnT0mHTBO!y%C_iq5U@<=N--rEx{(B>;=@!E0$0Fc`tftd5AdXb9>$`W6xEU0) zmcQ;t^l!v)ha>(+?lC~uE!7dd-gD1Q6r5Zg3*w>HhlE!XD7VoXkEN0oBEKMDA(V4% z(PYV!o?j0FBZ@lNminzgF2X=Ee;Ht-R=CDjq;AL!nT#0b4S zfX4`T^uKej6kH}Y?Ag66HUku#Ik1D&&1_ul3ZfzDCLMsAM@ zgYX8{HlJei(bYj4lcW6AjIx6?l8tL_WF1!KL$n7T8*BM(;Vm+7jnHYhymuV~_r{m$ zpHj&7_?3l~y|MS#&lrBiMUioXom9n$4*IT){*(@Q|L1Q@Env#^693=X?Y}A6p7yjO?jxPE*!BIX`5i+j)?wL5YPMhY4%?wJsLJ{t4Uok`w0v zw8FLm`pBF3JT(Mj7;YDejR$4tJl$eK_YWs8J~QMCCbm0_R_CjsbN|Xi%{k*autB1t zIlk0%gBe_k=5yTz9pX;$ zONV@)M(U~Yk^FhGu}rlx0>|i<+wndNG`U_dhT(N4E~gxUCel#ptnkel^gMqJkM7gW zJna3zz%XO(0oW6BG%?PIG+Dl3>6{yTXJMR~Y?<6y)55nbNqA%5DE>_RGt7#W)rZjw zhhmZy@Px_|NO|Jf+`8M8#dnQ}Uh9Z@{v;RZsG?8U{faY|dUVZW(fLi4J|1?W;dI@L zPv~VkOHkbZc2S?Ib4q!_jh1aS|4Mg$Hz$Nt&1Z$9BWO>y^~5&duXPF9Pp&Cwi@plG z8i3sV(BUYc^Ir>#7aT1S*<26x8tnyQ@los3TgFSaI~!!lI@NpsSg)iBy9DQ7`z`T5 z{kkJ5k=*mrN|K1CrUdetodx7m+tnw5%hcw}=y8FCvR{?&S%f?FC}iAHA3OtLI}|^3 z+6c0;HPoV2F7yu{5uNwm7IdH~tx=)%KW{Hy;QJc$6WX`OO$ktjPH@^=xga_~pAA9T z1reP~v^L01qYXI_Uj5rKZrsqjU<9*-=*be9p1oxFSISk*$aUv!bOMG=uAAeMrTsVw zKhvx`ZT_lDk-If@uu9f^hHAKu;0{#sqfs7LH}+L{NJZ`cxr9052^0c5xgo)va^snPTF{|erZb6Gs= z^&EAe#_9blX&b}y8_IE7@s~4vy#_L1A6%2rJv2;u4b>);7WA*sCG)*7p6nj29;L^* zq$Y3*9P6$2`Fylk8OtnUI&e)>#l2g$7##)L7>;l7I5thpy>gC1#6{IO`~hO2k&vB& zM0Eok>Q@6y2cJJ8_1Rfmp#R2{791_~-E5+fbO&k43RU^&zU_>p{DM{|vTDE|;pS_= zr$>LSClm>6k)g{nMj*4pb8tuPlJMjDJCISua^OvQBRjD;%@1 z1aF0G7ubWz&AbpTVo+HQwCYc*o|lOcc~{Kjl5-y5`IWx%?%h77Y0I4lr3sy0tLj|r z0dy1TptO3hSHLElejG6IRc@_g+Y0BN1hd}65eNR6vT1AT@bnKzfLx8&vM$34@?oB~ zQXGshS)h8vw{YHo7D9qLTC}TP4r=Uk(QE^7ynpfZ2bM&^2-3TxQqokHdCvL;iIoky z(C?@Vnd7b!mn+XDhwmv+R$jeYjRi>_wkbss%|`%kG;TYBNAlVtHD7zLFwuIPK}B2B z97l93D~qnI8X||Z*rR7RU~rSi6G8D$o9mG=bEJ=O^YR|ghO+>PhaRfZbKLq@W5eG2 zVM`42+O;2#qh=4Av#t@INZ2yLn+8|oz%$& z0xHYbD&4fn1Q9r9c_&@a`%I3f=-V`e?ufxTz40W*o+LGKn z9HHRA`a17)dClEC9jfuk+IYebbzv-FEB7>r$(scPn0-Kw z;9o?abRXqFvYZqd`mm1H6`J{rEeOy?Yf2(S-^}Zfp3T(pLFTQkW>D*YQeeiezfhEb@|K2m~A6`PJ{y&M#c z!u)>J1702o*HYX#9DSbbwnVQe2=!>KY>z4LLEP(SsT2f69q_ z%-9CC^UiXVnwpFCDA(B)5~8qPy!}?PD$8lS&af~IK|AP&VxCaeF~P!@3Z}4Q&g(Sh zRsM;3ETV)b)oE)uNlQb8RUBzv+y&Um7ps0fx)nK)!O7Z0#O-}W;P5SArYRSP9HD#+ zFO**mxu4gWbVGtk;D~EtkHH>K6~>+WG}}EC7l}tPS!cg?;;kjDJEFP+)jH&x4^b3p zO=(mGREm5({{``NfE-#58>v0%O(l3?tY?1OTxIA*=k*yn8CK5E&VZJ@WjBC2M?GQm z0V)Q#2IvNSsB4*4mpK-DlPZ#Wl2DG}>8yQU+}62|VQ1IounAV~plGQ- z<1$F#h;9(9oEdiq3t>-=OyauNs}fm~l;cm0N$QfVEp^trPybzN6ctfKfwGoQ^v4&~qk#0y-HUHbL%BsOOAl2BlG&`6s+BODwJD)o28`EqU#1*CE19hk$ z5A5ewm*tW{ptdosB=X=@V5K60b$Yj7-vT4gStJ>s9O%^W<|+vX^BlXzH-CFonU7CB zFnD=H=>is6R>WwiuCtWZu-V?>cB^ZjyviCBb*58u7%}kT8D7sm5}5&g zNX=ovOUf{#vD}5*u6Pqo6E5_4&U!sfN%swvd-=cZb<4rU>0JF;i4XgQ@16RL?a5Y0 z3U;4)nw6^%O7&JaDF^l^<^}soLLNNYW{#D`R@6DsC#Z)RLCMW$A`X=8!B&8OMo*4w zZ#93+tp^tCqNvc13X9RSdy`adc3ljxn<+AfFZqhvH2${J2xfr2WyY24(r-%`*CBrN zZS2=f5cN49KUyo~$a(*Y_}&aZrmCwAaOQu>0k=>uXZuq0JhXPQdRc=UB#fVmiqp@;+nhh0sV6)) zH$87{qa%(+#6Dl|hlcXf&^P3XJ89?!O{C+V`|yw`X&$A7`?TRR1p1sxCC0S)OkJ;X zAyyBp59V!u{lUYDVF}%Ac8RusmzwTRCdj+jvL%UR-u_et4lN{MRIQivX*P};x#bGv zbU#X}?gOIrj+x*yTH@D6jcD8$;xQPC_B`KuBfVWlMfE=~`$vB~cz1t?M)1it0y#YL z0X6{paM3kJuQb}nulT0Rym?yU&2_Of=eWty&Rjt$5-rCh1*yhO#2lUQpJ2DlJky|j zo?PbvO3Ya^lRpN{0OYt505U5r-b(7dpWDerVr^|~)PZh|$8akT{ZOl~`;`0PRS5a2 z&FAc)!)Nr~Udj6!a8}Bx>4>BXK)+Y43_~n_IrB$S)8gMyFRnPSQbsVcnjIOkx6CT= z%X1`u8q`ti$!e~P5rYfkgym+SqEN_agj|3QoWJi2D18TY9WEYZjqE<=|LR?07gziJ znHcShlJ5InU6HsC%#rW-r4GD@a!__Juc;j#CJhLV?`F(RGD4xqim1XO(|Fhzg%Rhr z3w>KtYT57j>DGT0f++COOP&*7#^fR}aAg1Zd`}N5?O}oykz(b}PQFrT{X;&YS58CB zdsfyWR~OtvN{SfalMIvaWj;%0Mvj2+JY-7Z@_AAWnvON>B+}KLsJ?EYf@39EsC+Msy4n%={c8$_dLUXEwaIr#Y(! zvzhcDNZwE8Y>VB{s&%#(D`JOHow2#(Z>tb|cpCH>*o(kU;oW^yoAgsU?M=n!4K zGQ34yZ+ehPT&FdhwhenH@a@n1N9RK(GFFlpZ*=gzX^i{Y0W7F6tD!u9U@PW2#pjfo zjoZm6YxA0&q=aMDgvWp(uY2pR_pt7H72+^62H-o~e%qrkSEsv_cQZWZbxWhJxYi}A z&{~pwxF4&SBK$NNbV<)$gzyhwJakUE03Pn`^Mk_A+rGZMYfJ~Exj5cNc61Io>1M6= zmlGyUV~tU0#odk%!v~D3t~!%g7`6|N!MtL-&AmLBjlPMuWA+o<2zZu=4z+25{LTTU zt^a(Lp@aaPZS)dm_!KgWI=B4Rj9XJ6*Vit|=aYxfnWfi82a%9WPUiDTuerZrNFK#V&4+TpM~3UJOe>El$(~x% zo!kZzIUEwZ$*%crlZLQ+&-*`m{h_Nr zRRogfC>kgkS*-tbWK+?vwb7s(xVI6KkL%gMGKqIw5U8 z4|9}d9LA1hD9b<>1qP?R*AXA=yE9AoI;n<@t_jx+S+^*EmMH*9oW|^iYz4nElrdbC zVMdNjo2AUiaqc5-RG`4ZgolOY`(-t6&um@ad;;@+GN1)YjnUzU$+9gC8R97E;9(qU zx^P{!GyR)%X^!9x9{$ZP)7H$FsY5C!_TkTzDF4L#v%fPqv1I?+%~n+>rS9-3^Y~GX zh8|Lb_YUgGrXo{Z(k#K1)9@)j#=qr!!}eCwLZ~-g49)~LS-OiUvVJ|BCC0LSwqH$5 zyW7OZPSvsS;Oj(`m~4Ay{bHuU&h<9?m34dP-F@qte7_9~53cqdvH}*~6nheQA$~QF zeoc>C4P(xXn?yE2CcDGdebu8265hdb@DYr)E;c#fBt) zg-yS>$W z)!Fj`28ZCtq$yYPa)n5#Ncbt~qCoHjT#hmTwh_d2U;$JZY6Yv+cdA=*LQe>q4rmVU z%+J~lIm$43vN-8Ei$~8V~x-A_p#U8{00PCiI-HNaQ_h;qjI`w#hYSYzrp+t z#_GEvlt<{?aJ_GFmi<&LP7~Gv`3m(^2#7@|!OT=yd}3H0JSqK78D!)E059dF0j2NU$uPE@?=_-M zJW^Ipbn-jC>3kW}=+q4>ZUKB%hFisXgja<$lup;CKF?vNtfz)H@NviJ6fc#K%L@09 zWsN8c(1|*ooY)?!qWnV^DA*c(7bNk5T3Ttsb%;xU$g}$P< znLXJ<)cokS#@VW`QZhGKN28Y*_ya8qq{!H&(|AD;{HlKEz>7X2yG%28U%>OWQKA(V z`@C~>^jh`5f*2VG>TXEriCbrADCRsiIhu6Gzme-sq0$RZl_ z*KbyWW2G{hayURWIr$I^B7Sio^N6VCY2~6VVz&xG zs_2L(gWRB=f%lk({8Io>V?O{%2d|Dr;@X5ewmFJHP52P6bPe@o8Jr`#zo0nMIR=F2 zT#D40DM?Bf%+TM@un$6`hzAHg*W?w_r&VO`Gt3w;P#FDUI8&qzzO#w$5;)hZk=3m~ zaG;@fp0I5fD~Q6FKlQ*{5~psuy(GO}|kZSTULz6HyFc3i8o%%zhc2(K0T(&-UN3Q7IbpBSwOkQQZ_ z7TL5ucWjS!dLwv2ryoW{ekIs2VH@vb!A%({Wl7oCrFkshCTZZ!p#(4-ZiwMN zqd{Q#ZAgKr=@kuq`Ul~EOb%f1yi1;urM68tLbC^M{Z%d27d4xl=57v^h`(HBITo)Y zue6loCl#kNC9(@FUvK7--ONyGII1+Mtv*N12{DOqc#78=1p^=4I;);2H6^^=es%p; z@b#s8(K8-8dNPg#ZS!kDmQ9eF3>+PjmE2Nqg~3$zw-RnGg1b)~vGIt-3x*xS*7J{P zyYgxWMiY>EBm}A2Xo!za_g0fkv2N>q54L1%kZFPOj+Kv$6j#IbjjKcGZs{zvM!S^d z3L4lZ#LLw8BJC}_x`rU(?igjFJocQDYUL(f=boN_zikYNm;{t;gkeY{zUdUMVP%ZIXXcb&O|`5X6ja*?^*7#<#r$qvrBC zN6?DE!-P#A>|IhEITwA?sOSe%8iq+H(!{IKd79j=RWM1s^~U?b?CKkkyrTPIsOy15?w zkNgW&ziggJJ}amm>|L05^{?CmP*wsM1O)&900MxFVqFt7x<ESLC03Q%VAs!(7f^LA0sAy-Eju;pvn$pdxn1n4iyHeFA;wLrK{w=`L zXH(`RT>ed?%0$#pQLpNZ@@kIUwl!$gEX2DDcSp(yJK1KAuEG#G;!|eTh0)+ed#J*G zmHaz?y9!}^BEAw+nmX9QDa^!m7Z>)6R;+pB=b)i$Se$V!hDM1xp9k#3aZ9qtcKiw< za99VOMxx}2GH2_Tu;@$Llag0>0|dQ6w#UwPxJ~E&%uDsc`FkS+by%cq?v~Q}stVO& zDpMlDnV{lfS>`58ip|j^zXtZ^_HJfy85N}DmxIlU8)vC)fq9Tn6zLAL=@9O%1O8A^a zO2$(QLutL50PsS6!vD;&v;CoWf3 ztMS8Ufzob~9uAw@lV*{T{T~n6Hm!lvg4fvH9U89GCCmCHs>w9Gw4u;(WP$9XfwNqg zVm^ccw%we`Tl69aGV-R6D>QG9TJ$B?H%&ssb|vnr_bcj#hF8WI&;PF9HS%@M;86QY zMhF0aGGqV%s{d5Kww8KsF7{?7rjFE>HYPSS4$db3UC855|Ib1mN|lM(8b%zv`9>K$ z=1#wU!&e2{knUoI8IP5L_9=dE7|fUHgPYnD9`wOUfJ2U zj=Ax9f4qJZn0nLmcsc&saLKvuv$@&f^!|CcnZdtLX7yg%U-9Yux!rpk7|G%3c3buS zISGmB;r4NTIa{Fh@p`_zyQAkyethWJ=6=Y0U_|qIz0R=ldHX1F*^rsR*H%9(TW)XD zFt55f4(ds0C26ToYcfo`7?OW!R?{v^66RE(>CRYU`XHhydu&hh7%zTO9(Q2mTF$I3 zkw39cvWk@LuyxTgdqaflUyd2-EH=7I+7NeIx27&pa+@?(H@Z`mQWo>SFj{qHAG}CO zZmWBq5|(gy)L@NQGvpzIUj9O|8LZeK&^A-uX}>=koM2mm1&C+vO=W+YCZDFyJ^jX< zIHGT6R>)9_Sz)r@NRnQ@3V0O#$=qTl_0k6{wzs!kt*j9wR1IlF!){4t7_q+x7(`=5UgVz#a*8U7XnJw>^&G51L8}0b z{Y`qck1AzNwg-?uQ>}{5cZC2-vTVIlTt0}jDq3ShYIy=e3oznMSFFfxII`pUyp5-R z1p#j%6!ul4r#a=WN22vgGA!bcf;8skJF;wMyU+BGj_0SwPLQ|raz#oIK4yYaId9+8 zTb{p~-Sq4rkRi_%zLAB2nbKCfYqWp6(>~)8562mFm?`I#vG8Ylyz$oyPdoU2jd@wp z_EEmn`4qC6!q3hk9-CV>oZuEL*kWvyg*xmemU38yKgB%ng0}SH z3CSBQ0(uV51!QQI@Cx?bc4=~Ys9r|lqCtM%#Z}sue zV(^~EEEE3Wy@;0S3U3V#;ju5s&a})g@kL-GI1~-!?mA@85V_0+O$x~Mj;->s^rlXR z28}b-Xz*zsm)!St{t5MjLe1?ylXxva`O{H1bRPQBIv;r&X!?U>JN%WJzBUWy%o9WU z*PIGwO77d7HK4~02d-t=8xGLUwq=qjq4RTKUNLGs7JeHiZZsK(C;c@PdJ_S$I|N?S zxnsC6Ktl#Zhfa8+mHEsifZw9#E)L$gbVm+%A4m~ZA<`lwl(9+u9v>5{ zY5Wy>|1J{Es3Ozae=VLXUrH`=DQ*|aW5qzCWsf+=YO9`&^?Dubw`o@c4zPKa;6|A} z|E+AZr|?UIqKKGq-KNq29Ou^K5|&rmEq|XFI@G2hpdo|c%MJaWh4EPfHut7o&)BGI z;KN?97jSk2yYGQ`y~fP1uK9+tIo`7mpbGjTkC8OEOkrCe-51Rth;`HSVC>eZ7s19! zTvIf5%iEt__0maEp7=Fo3~1^v)|#p+KWB-*6f}~nTbk1%1|UQTqpEKWpZ)ue1pd2G zM*LZMXxO+|fCtP6U(E}}%$nH9D?8L+&z5Jw0fOEYFHj}#d?-!sfs!@Bn`>;aWPnu4 z5JbuoOk~UvsL2&k*QiXN*(_U3U>?HV#@(7+BeeBp8_QItR|B!f?4$AfxRLQd|=7b zsU1lnaExJD5uWk#moCJ7KIjb=F0-H+6BQQj(WWbD_(Z?9K+-9<(INCkFDQ7(zD$}> zm5_6-lUru*)o&_v{6B2!lw|7eesi|gv4UVuai(f?Xkan5&04aE1mNK7HKvz@+6RBO z@%V0)T#`@nRCwv**?6q=QGpCb;7Tl1Jg8`?oZiheHbYY}W$J_yW@z}1FfwN{>ev(K zB`MAqi;8{15wW(DL=4;_oIyVfT8f1pqz7G@b^ijFh z;BqQWG7_VLrK$%=Z%Eae51RBcCF?_x_2Mt+#yDKKGYm7(Q$86uKd9e77B51IqntPZ zU6}ixc^LYh@g-}u4oZl6PNQ5F9O4eXR1#L=CpP_a)j2TE2}As0rtNPVa6Th&O1o@l z-$KAQk~znm5F%7F*|1BsU>0e?&e4IXO@NIIxj9VV6mT3jH!o8QnVL4I*}i?at|a=d zhCKIH@?c+3H<;d*j9HyJ{_17XR|eTK-!r}(rrKasKUVq6PkfM&uS5iC3qBEnPGkf# zmNyzo^@i)BI>$9vm)PaM(XZqsQ1};!cuB-rpdlu+x2NLMmSF|WC2@P07E^!8Hkg%{ zcGx-0uKzku3Ry1d!-hKNt~9OA|!U6+@S`$5M8f$obVmz#}FO8y8eOw zI9Nd^9C^4i<87#a7J#{XJ9t>Z=FldeiyjIIhTh}ld?$4qwcc;N=S{IRmNghxle#7; z+-uWTqJOBS$2vSXfc+2%V|$79X+7RW+{qQ@AXR8`Uz?W=y6wPpm{Kw2iZh;h`Y`9i z@)G*E&hP>Lzk$iRD4kx}?^y5z4FEv$pMc5#8Z1m5tt|f&BB@f|h(2I}@ye-@?V_bd zAgg0ch!}wkr&iD9MOSr{dsM4CRpqEZ6u&o|&;QYWN7HGLq6LN_iXd_m#S@3=(Wj_S zff3bLuycioz$Yr@yuyv0-t&v40~`+rrBSF&6ogy?yWAeLy0p$xH*7<-eU%o2j3e1; zKn{#BuZhR@Fk21;Q74!9F71H`OO#z_mIERO5xiBamcqX}mCwi$vS>!N*G^J&%LQ#dyvR-ws&GJLc%>Mq`PscN!m=&v71 zHl=29CfLCJkDp;2BZX{pTiRE;lUCpwtm`VB8r0;kI6~~xg1w>JbS#Kwss|r!$8wA~ zW3Qsy8aBPSt?+go$p#$;o*lChCoABZ^vLB)<@0@KbPGN1!1B2#+2N8P_lZ9q9}IcK zbvDbzQMxqQat~QupsH&_^^)k6>KPM(Te4qtsULl~3Wfb?u53-NLEiMW8v1BiXD0G2 zayV1H=9ou#unx^L+&EP$hEcXSRRH?M{txt!)dxw7vJ-oj{TZp#ZpD>P!GL=_oT(#k zBhd!n9#TW!6_=3d`5DhU2Tyl|Mropjf~irs1oXQw#c|s4s(%XP^CNALMPrm}o5l@B z7ho|h&MQo9=i^^rr>teuqIw$CQLNKNEhDCVw6oew9yx#^TiUBQtX%*dJ$w8A_yQx0i6JBMSsEa@3#U90Nw=L)>L6L4IQ=`O z0EczNh)d}`N@(&OTHUY3@77L5!}&-H>VNx!9UT5$HC46sU}%3v$;8A4VdfQX5qtOO zbRTYcAoSzcP26YsBeb=MEl;9D!TnFc8|JNF8-5r~^bc;k}WC+Ti+wHPx4p^stp(grf)x57r6KjlI1|a&y9>^~9A}G}^?$1KgyJke# zo+DjL5mwDcMR=(~H{-Cmx$Q8D)rXnVXm%=8>ik1ZbE40e}3}5i&uyyS8{kDJszEam#)c9NnNq4UHrHs z(2T}Lgl!4aH%t4dvFV{GVfg@yp}Z*au8|mJ7uAS?4C?j|?dVP3xXl&l|L%*cXwXTW zzhnyn5dZ-7f4UC?8$%;0Gkbd*dnp@3Crcw51Bd@fz5IVBwkk{un@yJc4j)kXVM3`| z`@@mtJ1jP)ltL-L3ue(wpqIG#QdGSzad~YH;cpL<;6iPQHEWvMI_-pkw7pJ~*L%>9 zmkXJm?zchhPEIy9_XWd!)-uI{)h|E;TAf;%{#yP~D?MdPGDd|;)%jA%zg_yB)2q#v zNZR$CWv~`X3s6Rdv$leef@7v+<8CAq9k3PY?Q_&JLnN1~jo8juBfqGpP-?9dRzf^m z``{-{k%+mzjJ1;K{C@YM5772;?`fl@=ldmveL#-ff*{heg>%BNYpb^5Ie93>HHs&; z1_i^(BeJ3x_*r3B8sNhB^5XEl3d!NHVgz9KH<5!qG!A@!*Q?+VJ(p!aZ>;2zY-O&@ ze4JsAV%$g#s!9J~%gQA3Rzr{hFwg2tJ}%*)I#w9rs)D~(9!mkL_~(+XloZjJOmJ#D z0qIAVi}^~`Poc-NyWRc8PG&l}F{zO`NK{P-FQC;)VLTGoSj`#J@SKik1b>tGn}{I< zwjv{I|LRB)ns}+b0x7?xkvZj++&rtQN=m6ddeoZraxg6ov4wQMXwzQ{@#N12M`vrR zt8a@h0Y!CnTu9kdeN9Ae+%?kT;8!4N1B1`Q+d;|Bi&3_-I7f~n5v>q+oa+sfLeip? zRQItU!U4%IgfmtdAn5}tKL)dsTc(PWyRp+P`b%nPX!)4dnYLOA@G;fe?vcquJ%P=~ z?U|^I03X@2(9euJ(8)MuOSyQ>W4OdJe!DIS3v=j7GYt%4%(KRDS z)I22|F)wcNghBOz4!lt|BC?7+bBPZsfvL0bR~tCczn0JV8Dm9m$uq3m@5zRv#rD%? z3y>4IIT9X|aW@Czp{aEOwT57yjQ1;j5%UK*0K~xJ6DgF7Q7{sB2R4_GY|s?kot_hr zl(B3hUH~kG*{HqHl5Sk??-T*lU+ag)O2P*TeGh(dr=l55tAZlXW5~haX<6U;JD~U` zXwBOxrmJ8fi^%oepJ66cPi$qC~Yy`V`3xtRtqM3281xW#7TX#nJdjF*JpmAgCL zA8$`5KbmzFFE`#ECI(Cpq5%N*+eyKDK0&*fNH-09WHdcsyWf{su^r$Xk+k~Y$`RC~ z_r{GWSy^pd6YH)whx>z9YWZf(1dV>wv#tQrKg3K#hj@*b6A}bwKhw>38>{ zeK?`}`(ENU4>%zl2a*oO$d&!Nnky6*?g%NSo2^hi(borXTVdT+80Jn52Y1tXMs*#} z6}i`#U9MJJwW|Wy=8Mbe%pZL{alrxQR!n8MHt+6$Z4I6uKqHgrJbl$`24MKB)Wji)$HiFfj@V%R(aa?oEeDog zic^7f`<+d@Vhv_8D{Xl7)zojhuFSaB6fq=ZOSpyKFI%+!B~<&kS2k+Flpl^4}`|L`){MkOPy>spvVLC(jg7S~+` z2wn=63XVmM5_|!~>LvkrEio+FLfykxg-P zzUfs?YwAw+iEMPE)P)Rbk(LqVK zSzf_?xj(D?JnOwRLsQG}XU;je+-k#?kOx1pwQo0_yn8FZ6>vnHGn}#@LT$O< z{Gub#Rr}QRO^CDb){Itkz8Q43wcl|FHr;xcCsQqx3RICU7b7tEAghh`+5I1^ zgV71}0$@zJE9U)$?G7+Dt99-vxLEJ}k-RPB1el5V)dI}5C0^Ow;Bf*1E8*G(6cT<( zv(S6rv+1NFLX)q$9%jiE4eMkQqfGxPNfQ$?cIPj zk983VnVr$XtC{P+fn<8wk|#iW>ElIGnvX;bol)#OMg z8k5Cc1bBYw>D<~savJJ^STN?q5)@ZNnh=oO^#k@U{<`3I;5cVud8THZjTl+a4bbyI zjGN(Zu29SBWCiE&wYY93-)T?;AtPA1!~LSz-r&szb-GT`N8{dkKs6lMac`-UiGTUA zTAyrmYFk-lB@XP9|w_A+j_Ut9Y1WbZxW}IAE*6u^LoceX6deLlz=wx`=b?^3#C4Om~W6wHQpFaw!p3we0&^B5oKTU@^A-T7TM=L(XSpg>Dp4fItAA zlWJ8BPOUe+*VbEy&;>f@aP>C@sO}AC$^+7G`-T}s^qKa5L&TF`$ULbueTo7E05JPI zJ`?>Xh$t__CnzOEV`cc?FnRy~&Ez}9_gViw$qC+khJ$)G9kE=Iw=6QN1M?vf!)<00 zg{wzcn#vQXDBr)}idAKRjfMG-W_fWmFuup@=djOF1osMS!Z;p0Ipk;>1Sz-hB(AHc zlsQAL&~qh(@ijuH4KnPZTy<4*F0@;_w$+p4rM`->9r9J3XQHnk)KDm#JXfEsl5|sm`+zi4|E2&A1LObx|l@qG`b=ol&tAt-HeuYjs zF%(+&?ABx{y(#Y>9Ju#_DKchUSECM$)1vFHXj3-78&5#KRE0bKn98iLNK?mMJ=ho~ zE>7UYzw*a++?|~Y$wQH|1V4{lfkl_~`2%u`zojdZgyR{MXEj;NNA#o_l~nszpz>0y z)IjI6?kGq2P2Qa;)LC;&=wXz9m;;V~D_4yxMh&iz{M{^g?wdiWSa9OhfnL2KZD0A^ zfNzBwoC4F<_9f9pc%{LASx+;p#?ugAFYgcXFv#IM^ucig-!l3-Zt{qNTlW{2_yD;!SC-^7eT{@2CFwE(@ z1Fa4v3?q+m3k@?)xVj@Vi~ofK&sL8k3HZUOL%X*AV(}n#qI#nGFH_yluH%3H2LBn5 z0RaDnXg{64ws3yF|8LO#FMo4#F}E;xF?TREcm4lGBPNb!-lV?pq@)&(4sJ{q#`e~B z-h8C4#tyDbuI4V*7W|(d*&Dl9T08KOva>pQ@xysKnjo%7g6_GJ@59-C0uZ)c^7P}s`mBqku<>-L}iC13q?&P1+%s`#>EW{ zj^K7Xb=mrM=ist7njRe)HjVo<%Pi(7bUAZ7+l?BmEnnC1P)kb(HpV3(?xNX6QX*L2 zi6e@_vf;~=%v#O=(bspMd7stS_`E`AwPmNJkEH%P?ndSN!};36W43jfovdd~OCSRAaE$WvR{-O9TN@w?I<;)S|9gQH|N1C&=?ZU75| zz!&wW_!J_;6CPfgOU)GY3Q}{_z0ah>HG_g89@)xhG)j*q^r~^pH~MWAk-*&Q$7)3r zG}oNC=13cT0cV_Tt!s?yER3Lpl2yq{BsFwH83{Cq6Y?tQhiwlAitqNhM8)W3#7{PS zoF=QRDQF4w{GpMR@Jd*IjHa?fiC4~uyE>)LCD)OarwVBv>ruh3u!ghAlCdCC8(eVa zJ{FgMqt7mbcNzUTb_x;6BM-0U6_?ysG*{zD{Ppj9bpQ4$z$Wm!5=f%wxqVBg40UBQ zn$2j+A^YiEvM)MU?1!Ee3tzM7pIlE@#ATvwR0-K?990G_N8FpafdS0=&cQajdIK?R zLX$e*eVAT6OD=h;jfD)V3<=j$M`85E$jjpK7MxS@$xR*9OoA^8B&NlV<{RB*-+-0A(y4hmbF zd>R9>VYd{e2Q8RH%p(Zv%q*CFavdH8maZB*Fr3@xO%GOM+c;~ezOrFm#jUE)F!Wfk zD07LGe5K=`^}kH-?JY$K$B(Zf!%BA%|LSE}NLIBAWeYw)A{~73LadS%o5mceBB#Cr{*J_w<$0^|FW`CC9~8{ zcvmq@YARjsv!`37d|*jF^EojH>iVTQHc!|%w7dQ>2=lwZILU*&`6tTq0e(H*cA)cD`GOCYmS;FTh!@DV7`#`zQuEs`&|T3DV(1_)}q?m1Z56-Or#$$@Zu zi^yvc0-jyK_0bhl>Nh;#E%s zZF>9PdA}RNGuHX+@IocPcJVprc-+de-Oe!_V(~Rywy09{DuJ6|X)D2`g+CAgtXelr ziPCwGJ9sR}LjLTAwI4d8Y7|24zG`8QP+L4y*9)@e>T7txr7{fWyK&XM;pbm)VfM9ZfYkizn=CkUdI9rCoZX`L4Hi( z;<>u#jAJ(?ZyOXV)zHJykhDmXTi0?>D9$Npdf$M$Gj8CQE6w zZN%81qtiuBNTA`I!E%vGw)P|GA-&zcj1GsAyE)d3NW)SKz<7phf_@Nu6>U?{lh(*x zSB?-}rV|cC%t`~3>tf-Rf(yA)Ix2+tFJ$m9VW{-3-|XjcUl-rr%(wKvOL;Nw;=Yvh zk0PNDt1y*8^$dfeo!w8%IgI?$`x~Z(ZC6fmcdCR4jYHTN=+OovEZtVi{w+Q440KNP zG+QakfwI5&ncbh!kC?Qe)P>bE+v2KqUq}A2Fye)sAPpSIRU5Vgij%zr$SgRUK-B#S z8n_C!?_m(u^K#x?!r9cG@EZ9Y?_#a#N-3``pphwEf@Hy^)@REp+P7rTYEs%?SPEDuPF4Enu6YtOH|6TxOt;TWk3Xl-i@xn*0^J(61|=0L%UBq$sujBz z|F4k=`4|XBOB2jPlk?uzx)_tAVGHM_wji-#hyD@4GjPkQ1^V|z@!u9_Eg?dNFX za|!e|p0yg!HD>?fE4^}tH;#ej5}OyfQ8d#XTE`LsS%6KoGubLI046|Zl?}3+c>?-M zKETgM+y3T#hqWIh4YwVJdN(a$msub7Ji&Ul(*?3m*XnFJ#9O;S4J#I1XH7}=&kkLG z&Zp6CC;1=$PP-bhtP(7 zE1JYBxb84!*!Nk8+qo%qa&(7-yFWsk|f@nvuwg18lUw`2& zUETYUQKRJz8CVXNnw>N~p}E7fONB;69Y>4-cdl}=Z;A5lED)>lSeHJr z7}(Md7OCvJD^hf_i4zKbbVrFyW=5Ynhf^~cAz{h%&i}E0sZ9}9Ft+zFffL}~AE0wJ zC9(8Fz0ivvyl!7I3w`EgAxHc3{cIZRBuR94*faVqSyB3JZx=#<%eF#K!WnTfnQzy} zU45Yx?+TpG$tN33JfFNeW8QkM8Q~ug5w@t|43X=qSGZxj6dgOZnb~s2LNsx(wI^Tu zx^)X3?yenDtjd66C2-v!{hJidr>VC3Tx$Hs_1Q#q8&bgp{cqkpoa5S-HUza0WNaS5 z6FFNt3O4-ick5vA7tW2LfcLl(b9u$BTvvNlls}VRptncf63keWzI{y z-tZ$d#n1Jjr(IEL1tl^rCJn^)N(T+*JR4fHyLRzSNLTDWG=LQN81fjFqZgzs4Dk<< zn9>MUoVuNJCo=5|gSa&;G=?SYu~}gZ*fsN66nF@9L+iT*yP;*?)9*Q7a+u!NajkL3 zdMF-a`RzKh^Kf?SUmZ#bQ`+fza2)dm3X6(+vbtux8s)imL+vxJ5iM(r?JDzK;^k4D z$TFV{rc@LrUyl?17RyGwd^?uuHWO>E7HY(|4J?;TL%iVZLx5ns3+QQ{BrGAo4kQG` z;59vYU;|D7ZqVhq?|EV+`~GF@U#s}?=U(x|+p+t?GjD6{E>396$D{EneOovQ(_U)B zHgIU{OV<4VQIO0>v0;eE*pHJyJ0bKT{KJHFk+GR3Bx$ts^gTcMRYa=AyY<&wi?H%n z&3Xh)Tn-irAe*_6>c{R76O(_0fB!`>*`*Mnhyk8q6Nej+U7mOp4*q@(=`^nRLt21V zUjnR&+4X{pv|$rgRf5bQevi?1QH|33Ax463rnQmmB?RV?9pUFR!o$54K_$JREHzoU!N>fQQ7Y|K?1 zap7n_)C(|Z8ijCNGJEt`-?d>Bw1)e}44@8qK-et_t|;IX@>&T|+Bd0?X-W@z5ehhu zP=&G$ni9ytU6RAxoaz%`J%pS~l>Z%i^@(&`(P*A!gd)I}*$>j&|AZQt(APe2mr&bf z-xwU`=Xo~p-^HSA{AS;C9bC>iIJs%_T?d)<@mNKm zKSrO4ZZ-!*He_K8WEED35r>#(s|AZwl??(_|8zWAST2)(npeZrh|FNPEon8zWGNlL zYU&0_cvKF)lKAfwAGAwY2=dfRhW!{)PLBM*_r@=VcbTWLzW-*WUy46A^Iso5Wp@R?y3QVczM9F@@Z`|Ad_?-h#v(=H0cWzpnwO%hbjWBSrGxE zowLdduMma=Lk%74f{H=mo!#uX6s`JpXvQBu1a7hs$BJa_ql2=%x_(1(iqS$h*!Wc? zr~9>vbL?d~Q;MshvT0nh6BL>#+nq#f6!4nd7G%b{slqiRdU`?DHI3JCvct{~PwI<9 zom_2nsH&&v3kOx*gWB$m){>U>UR3clkQ4cmhfE|zWIYl5In)Bb18_z+*n;!Z`@FJo z>+$d_zT;!tL&YOfzN(`vm02+hWV!+rW7D9OYa^SWNO88B*r&FIEsZSVWqfq8p55%> zj~C<7MajGh^na1vWD{LNFU7W{QG}a29bG2RY9uyMf}%%m@^4*?MrX??zqxYsbzJb$ zeVqV zPs+U9>keG8OV<`hNlyfp=>k8Q2EwKVGPLwRU=k6Tj(R{lCM~=BwpWv~OGJ7+4YX$* zcnwaRi|bQvA|T?kk=0U>Swmp*zT9;WCr$n!a%wACNi*BHFvUz*WtEsiZ_T|l+n=U`gQ&VNDdL-3m7l>AZ z63SbzBbvOkqHkk^!gVjDh5D;MWjB{5Z2dsR6VjgQ2QiLg1~!#S2mJmSl()4nA2pi6 z$rxQq6|o)>SxYWiOHyl%N0%U#{02ZeSbHqgd<6&5(w?HAaqR}sXa$QSoeDG})634( zD?A+JpoDEv->HGbi9ALPv^B^mZr%^Mr%uh;kx6=>7p4kiVa9gfsld=s@g2K_uLiMb z!{tL^2k$Yl+n-z@r;p&WGG5-RxHtj=?WWij<(tu^Izzb=7mZcQA3f+BDYQrba`0to zt!`M>4xEWpv+n&MiwnM(+G=zS3S}mBQz5xfNZF41jZ#<-9j&O}4u+BKXR>B@fhIe@ z<^MT1sx)qH=}QgY{t8J}vZWa!EFpcB=6Le(9gr?ZCf;;PNw@v_zP5IL_ z4%v)!?xrg{b=(J$GlXRo_&dIh;N{wbA}ilI>o(!&##IrY(M|=0S(!Y|$rhJ~zm0}D zKj!XC#{|G$)<(0cJJjb7V1*z|8aTRSu`OYL9Ff5!xI1lU10#pJN=3D8z+I4_6yc^e zuLE$M7|nO=MAKnbb9Xd%HWTM-?|Rw}R$Hg!tjpKjG!8-%zV0kjLe0o&zv-G`__#dg zs=rQTX!$Uk^QoWD#*VrNl(~Hj7%#+ZKMquEK3I%k+=>jwQw|Kvq-pcxLGGBB7O8Upiis@JV7QK^qBp!A;WI~oKoS4VV;^MER()^EzkFX8!91km*I{*OM- zQBr0zWpOk<-1dHnfsg6fBI)WZ+5C98CWTCCr+Ik{im9vZ;3#f=l}2kDr=ZLP*>ow> zPVnEsPd(CUZqyw{$oiFH>kcse=0n_|ZyVDJSGq!;u}zD!BcPDg{x~7x>)qS&9gK&c z|0nvvRG|SpU;SYmN!B|s$&h&*N%41nF9a&s*-27orqrdyISAH=9RglUIwcMW7H zfS~q><`*=qhVQR4g~M9JLNH~#bkKymb{c{><~rz?U~Wa|4l0FK~WVP?a(cS>&jizP829AOm#4$k8G zvy0~x^g2oZ{XLA|Ly;aS{n0~e-e&YRkS!1m8agXHpXYv_40|y?SXzO?tS5Oqi`3HC z_um>K>=7;*8Y7+HB^<}}F}F*$8j>!3XR$Xb3W6N}0AEvWj+8$C4zbi3kh z*n4J;eus-jBq=)a@IFn9*GO=t+vK;<3%a6ZvkuQn2hLM9(?D)qRWZZ-U5^ApkL8KF5gg0{fv<$~3Ng?1Rh@ugplEnvX>} zWjCk<>LL#9xmFmb;tMl3gilb=a5>eEyY9BC!eSZ%6o7h=ZyZ>!OWw9Hr`p}xu$f8@ zlEm&)2@DtxEr;lW3J2|OTq-VinApU-TqM?3pr1kY$%X?VS-HX~IawW1pw_xzV850YrFovQ5pU`GyI;K@RzRSa>4fjxu(S3WhFWdh5a}Lun1P!g9YzSotW&;mE^b4 zmU(h_*Q5U1BZ5J3{alIV-G<;vfx$J8 znaw4QQw9TWrU>uGZ+OW?+5JChFH0#tbT&0m&{BilbpADPx>`oks0ed~7)G%?I2CSt zC%6#x;YT1J2ytwPmwJS3KgWRw?HcEHFyfe6a!uR!J_k9D$5rzCP9`VpRFiF5To|wy z@wO%4%$Q

  • -

    Start recording here or in the extension. A floating recorder stays visible on supported Edge pages.

    +

    Start recording here or from the extension action. Playwright CRX opens the recorder in the browser side panel.

    From 82e4f4afe9fa7bd545ad0104d8fc803198c99edc Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 12:26:50 +0000 Subject: [PATCH 23/29] feat: run shared playwright through extension --- README.md | 10 +- artifacts/edge-share.zip | Bin 1453924 -> 1454769 bytes extension/edge-share-crx/edge_share_relay.js | 115 ++++- src/bin/playwright/mod.rs | 513 +------------------ src/bin/rbc.rs | 6 +- src/mcp/control_panel.html | 20 +- src/shared_browser.rs | 7 + tests/shared_browser_relay.rs | 52 +- 8 files changed, 177 insertions(+), 546 deletions(-) diff --git a/README.md b/README.md index 7c902ca..d7e7528 100644 --- a/README.md +++ b/README.md @@ -224,11 +224,11 @@ argument is treated as the legacy docker-git project id and `rbc` falls back to CDP/control-panel ports. `rbc pw` uses real Playwright through `chromium.connectOverCDP` for CDP-backed Chromium/Edge -targets. For Edge extension share links it runs a Playwright-compatible subset over the relay. The -shared-extension subset supports common page operations such as `goto`, `title`, `url`, `evaluate`, -`click`, `fill`, `type`, `press`, `screenshot`, `locator`, `getByText`, `getByRole`, -`waitForSelector`, `waitForTimeout`, and `waitForLoadState`. Unsupported Playwright APIs fail with -a clear error that lists the available subset. +targets. For Edge extension share links it sends the script to the extension and runs it with the +bundled Playwright CRX runtime against the selected tab. Shared-extension scripts should use the +Playwright Test action shape generated by the recorder; a bare `--code` body is wrapped into +`test('rbc', async ({ page }) => { ... })` before it is sent to the extension. Unsupported CRX +actions fail with the extension runtime error. ```js // /tmp/playwright-task.js diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index fb4c1162521d2f42704d838a481bc2775a7337c0..f0b2bb5f173d8b2e3c92875f6243eadb2ef8eacb 100644 GIT binary patch delta 11690 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 delta 10795 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 diff --git a/extension/edge-share-crx/edge_share_relay.js b/extension/edge-share-crx/edge_share_relay.js index db0c9c2..35919fc 100644 --- a/extension/edge-share-crx/edge_share_relay.js +++ b/extension/edge-share-crx/edge_share_relay.js @@ -592,6 +592,20 @@ function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } +function withTimeout(promise, timeoutMs, label) { + let timer = null; + const timeout = new Promise((_, reject) => { + timer = setTimeout(() => { + reject(new Error(`${label} timed out after ${timeoutMs}ms`)); + }, timeoutMs); + }); + return Promise.race([promise, timeout]).finally(() => { + if (timer) { + clearTimeout(timer); + } + }); +} + async function handleRelayMessage(rawData) { let message; try { @@ -665,6 +679,9 @@ async function handleCommand(command, params) { if (command === "activate_tab") { return commandActivateTab(params); } + if (command === "run_playwright") { + return commandRunPlaywright(params); + } if (command === "start_recording") { return startRecording(params); } @@ -836,6 +853,61 @@ async function commandActivateTab(params) { return { tab: tabSummary(tab) }; } +async function commandRunPlaywright(params = {}) { + if (!params || typeof params.code !== "string" || !params.code.trim()) { + throw new Error("run_playwright requires params.code"); + } + if (typeof globalThis.getCrxApp !== "function") { + throw new Error("Playwright CRX runtime is not available in this extension build"); + } + if (params.allowClose !== true && /\.\s*close\s*\(/.test(params.code)) { + throw new Error("run_playwright blocks close() by default; pass --allow-close to allow it"); + } + + let tabId = await getTargetTabId(params); + let tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); + if (/^chrome:\/\//i.test(tab.url || "")) { + tab = await chromeCall(chrome.tabs.create, chrome.tabs, { + windowId: tab.windowId, + url: "about:blank", + active: true + }); + tabId = tab.id; + } + if (!Number.isInteger(tabId)) { + throw new Error("run_playwright could not resolve a target tab"); + } + + const code = normalizePlaywrightCrxCode(params.code); + const timeoutMs = Number.isFinite(Number(params.timeoutMs)) + ? clampNumber(params.timeoutMs, 1000, 10 * 60 * 1000) + : 0; + + try { + const app = await globalThis.getCrxApp(!!tab.incognito); + if (!app || typeof app.attach !== "function" || typeof app.run !== "function") { + throw new Error("Playwright CRX application does not expose attach/run"); + } + const page = await app.attach(tabId); + const run = app.run(code, page); + if (timeoutMs > 0) { + await withTimeout(run, timeoutMs, "run_playwright"); + } else { + await run; + } + state.activeTabId = tabId; + await persistState({ activeTabId: tabId, lastError: "" }); + return { + ok: true, + mode: "playwright-crx", + tab: await currentTabSummary(tabId) + }; + } catch (error) { + await persistState({ lastError: errorMessage(error) }).catch(reportError); + throw error; + } +} + async function startRecording(params = {}) { const tabId = Number.isInteger(params.tabId) ? params.tabId : await getTargetTabId({}); const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); @@ -1177,7 +1249,9 @@ function upsertRecordedAction(actions, action) { function renderRecordedPlaywright(actions) { const lines = [ - "module.exports = async ({ page }) => {" + "import { test, expect } from '@playwright/test';", + "", + "test('rbc recording', async ({ page }) => {" ]; let previousTabId = null; for (const action of actions) { @@ -1188,21 +1262,50 @@ function renderRecordedPlaywright(actions) { if (action.kind === "navigate" && action.url) { lines.push(` await page.goto(${JSON.stringify(action.url)});`); } else if (action.kind === "click" && action.selector) { - lines.push(` await page.click(${JSON.stringify(action.selector)});`); + lines.push(` await page.locator(${JSON.stringify(action.selector)}).click();`); } else if (action.kind === "fill" && action.selector) { - lines.push(` await page.fill(${JSON.stringify(action.selector)}, ${JSON.stringify(action.text || "")});`); + lines.push(` await page.locator(${JSON.stringify(action.selector)}).fill(${JSON.stringify(action.text || "")});`); } else if (action.kind === "press" && action.key) { if (action.selector) { - lines.push(` await page.press(${JSON.stringify(action.selector)}, ${JSON.stringify(action.key)});`); + lines.push(` await page.locator(${JSON.stringify(action.selector)}).press(${JSON.stringify(action.key)});`); } else { - lines.push(` await page.keyboard.press(${JSON.stringify(action.key)});`); + lines.push(` await page.locator("body").press(${JSON.stringify(action.key)});`); } } } - lines.push("};"); + lines.push("});"); return lines.join("\n"); } +function normalizePlaywrightCrxCode(code) { + const source = String(code || "").trim(); + if (!source) { + return source; + } + if (/\btest\s*\(/.test(source)) { + return source; + } + + const moduleMatch = source.match( + /^module\.exports\s*=\s*async\s*\(\s*\{\s*page\s*\}\s*\)\s*=>\s*\{([\s\S]*)\}\s*;?\s*$/ + ); + const body = moduleMatch ? moduleMatch[1].trim() : source; + return [ + "import { test, expect } from '@playwright/test';", + "", + "test('rbc', async ({ page }) => {", + indentPlaywrightBody(body), + "});" + ].join("\n"); +} + +function indentPlaywrightBody(body) { + return String(body || "") + .split(/\r?\n/) + .map((line) => (line.trim() ? ` ${line}` : "")) + .join("\n"); +} + function isRecordableUrl(url) { return /^https?:\/\//i.test(String(url || "")); } diff --git a/src/bin/playwright/mod.rs b/src/bin/playwright/mod.rs index 81a0c65..0549f75 100644 --- a/src/bin/playwright/mod.rs +++ b/src/bin/playwright/mod.rs @@ -3,9 +3,8 @@ use docker_git_browser_connection::browser_actions::BrowserTarget; use docker_git_browser_connection::shared_browser::SharedBrowserClient; use serde_json::{json, Value}; use std::fs; -use std::io::{BufRead, BufReader, Read, Write}; use std::path::{Path, PathBuf}; -use std::process::{ChildStderr, Command, Stdio}; +use std::process::{Command, Stdio}; use std::time::{SystemTime, UNIX_EPOCH}; const PLAYWRIGHT_CORE_VERSION: &str = "1.61.1"; @@ -38,12 +37,9 @@ fn run_shared_playwright_script( source: &str, allow_close: bool, ) -> Result { - ensure_node_available()?; - let wrapper = shared_playwright_wrapper_source(source, allow_close)?; - let wrapper_path = write_temp_playwright_wrapper(&wrapper)?; - let output = run_node_shared_playwright_wrapper(share_url, &wrapper_path); - let _ = fs::remove_file(&wrapper_path); - output + let client = SharedBrowserClient::new(share_url); + let result = client.run_playwright(source, allow_close)?; + render_shared_result(&result) } pub(super) fn parse_playwright_result(text: &str) -> Value { @@ -94,122 +90,6 @@ fn run_node_playwright_wrapper(wrapper_path: &Path) -> Result { .to_string()) } -fn run_node_shared_playwright_wrapper(share_url: &str, wrapper_path: &Path) -> Result { - let mut child = Command::new("node") - .arg(wrapper_path) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .context("failed to run node for shared-extension rbc pw")?; - let mut stdin = child - .stdin - .take() - .ok_or_else(|| anyhow!("failed to open node stdin for shared-extension rbc pw"))?; - let stdout = child - .stdout - .take() - .ok_or_else(|| anyhow!("failed to open node stdout for shared-extension rbc pw"))?; - let mut stderr = child - .stderr - .take() - .ok_or_else(|| anyhow!("failed to open node stderr for shared-extension rbc pw"))?; - let client = SharedBrowserClient::new(share_url); - let mut reader = BufReader::new(stdout); - let mut line = String::new(); - let mut final_result = None; - let mut final_error = None; - let mut plain_output = String::new(); - - loop { - line.clear(); - let bytes = reader - .read_line(&mut line) - .context("failed to read shared-extension rbc pw bridge output")?; - if bytes == 0 { - break; - } - let text = line.trim_end_matches(['\r', '\n']); - if text.is_empty() { - continue; - } - - let Ok(message) = serde_json::from_str::(text) else { - plain_output.push_str(text); - plain_output.push('\n'); - continue; - }; - match message.get("type").and_then(Value::as_str) { - Some("rbc-command") => { - let response = shared_bridge_response(&client, &message); - writeln!(stdin, "{}", serde_json::to_string(&response)?) - .context("failed to write shared-extension rbc pw bridge response")?; - } - Some("rbc-result") => { - final_result = Some(message.get("result").cloned().unwrap_or(Value::Null)); - break; - } - Some("rbc-error") => { - let error = message - .get("error") - .and_then(Value::as_str) - .unwrap_or("shared-extension rbc pw failed"); - final_error = Some(error.to_string()); - break; - } - _ => { - plain_output.push_str(text); - plain_output.push('\n'); - } - } - } - - drop(stdin); - let status = child - .wait() - .context("failed to wait for shared-extension rbc pw")?; - let stderr_text = read_stderr(&mut stderr)?; - if let Some(error) = final_error { - return Err(anyhow!("{error}")); - } - if !status.success() { - return Err(anyhow!( - "shared-extension rbc pw failed with status {status}\n{}", - stderr_text.trim() - )); - } - if let Some(result) = final_result { - return render_shared_result(&result); - } - let plain_output = plain_output.trim_end_matches(['\r', '\n']).to_string(); - if !plain_output.is_empty() { - return Ok(plain_output); - } - if !stderr_text.trim().is_empty() { - return Err(anyhow!("{}", stderr_text.trim())); - } - Ok(String::new()) -} - -fn shared_bridge_response(client: &SharedBrowserClient, message: &Value) -> Value { - let id = message.get("id").cloned().unwrap_or(Value::Null); - let command = match message.get("command").and_then(Value::as_str) { - Some(command) if !command.trim().is_empty() => command, - _ => { - return json!({ - "id": id, - "ok": false, - "error": "shared-extension rbc pw bridge command is required" - }) - } - }; - let params = message.get("params").cloned().unwrap_or_else(|| json!({})); - match client.call_command(command, params) { - Ok(result) => json!({ "id": id, "ok": true, "result": result }), - Err(error) => json!({ "id": id, "ok": false, "error": error.to_string() }), - } -} - fn render_shared_result(value: &Value) -> Result { if value.is_null() { return Ok(String::new()); @@ -220,14 +100,6 @@ fn render_shared_result(value: &Value) -> Result { serde_json::to_string_pretty(value).context("failed to render shared-extension rbc pw result") } -fn read_stderr(stderr: &mut ChildStderr) -> Result { - let mut text = String::new(); - stderr - .read_to_string(&mut text) - .context("failed to read shared-extension rbc pw stderr")?; - Ok(text) -} - fn node_resolve_playwright_core(node_modules: Option<&Path>) -> Result> { let mut command = Command::new("node"); command @@ -352,367 +224,6 @@ ${{userSource}} )) } -fn shared_playwright_wrapper_source(user_source: &str, allow_close: bool) -> Result { - let user_source = - serde_json::to_string(user_source).context("failed to encode Playwright script")?; - let mut source = String::new(); - source.push_str( - r#""use strict"; -const fs = require("fs"); -const readline = require("readline"); -"#, - ); - source.push_str("const userSource = "); - source.push_str(&user_source); - source.push_str(";\nconst allowClose = "); - source.push_str(if allow_close { "true" } else { "false" }); - source.push_str( - r#"; - -const availableSubset = "page.goto, page.title, page.url, page.evaluate, page.click, page.fill, page.type, page.press, page.screenshot, page.content, page.textContent, page.innerText, page.inputValue, page.locator, page.getByText, page.getByRole, page.waitForSelector, page.waitForTimeout, page.waitForLoadState"; -let nextId = 1; -const pending = new Map(); -const input = readline.createInterface({ input: process.stdin, crlfDelay: Infinity }); - -input.on("line", (line) => { - let message; - try { - message = JSON.parse(line); - } catch (error) { - return; - } - const waiter = pending.get(message.id); - if (!waiter) return; - pending.delete(message.id); - if (message.ok === false) { - waiter.reject(new Error(message.error || "shared-extension command failed")); - } else { - waiter.resolve(message.result); - } -}); - -function hostCommand(command, params) { - const id = nextId++; - process.stdout.write(JSON.stringify({ type: "rbc-command", id, command, params: params || {} }) + "\n"); - return new Promise((resolve, reject) => { - pending.set(id, { resolve, reject }); - }); -} - -function unsupported(name) { - return async () => { - throw new Error(`Playwright method ${name} is not available for shared-extension targets. Available subset: ${availableSubset}`); - }; -} - -function commandValue(result) { - if (result && typeof result === "object" && Object.prototype.hasOwnProperty.call(result, "value")) { - return result.value; - } - return result; -} - -function matcher(value, options) { - if (value instanceof RegExp) { - return { kind: "regex", source: value.source, flags: value.flags }; - } - return { - kind: "text", - value: String(value ?? ""), - exact: options && options.exact === true - }; -} - -function locatorExpression(locator, action, args) { - return `(() => { - const locator = ${JSON.stringify(locator)}; - const action = ${JSON.stringify(action)}; - const args = ${JSON.stringify(args || [])}; - - function visible(element) { - if (!element || !element.isConnected) return false; - const style = window.getComputedStyle(element); - if (style.visibility === "hidden" || style.display === "none") return false; - const rect = element.getBoundingClientRect(); - return rect.width > 0 && rect.height > 0; - } - - function textOf(element) { - return String(element && (element.innerText || element.textContent || element.value || "") || "").replace(/\\s+/g, " ").trim(); - } - - function nameOf(element) { - return String( - element.getAttribute("aria-label") || - element.getAttribute("alt") || - element.getAttribute("title") || - element.value || - element.innerText || - element.textContent || - "" - ).replace(/\\s+/g, " ").trim(); - } - - function implicitRole(element) { - const tag = element.tagName.toLowerCase(); - const type = String(element.getAttribute("type") || "").toLowerCase(); - if (tag === "button") return "button"; - if (tag === "a" && element.hasAttribute("href")) return "link"; - if (tag === "select") return "combobox"; - if (tag === "textarea") return "textbox"; - if (tag === "input") { - if (["button", "submit", "reset"].includes(type)) return "button"; - if (["checkbox"].includes(type)) return "checkbox"; - if (["radio"].includes(type)) return "radio"; - return "textbox"; - } - if (/^h[1-6]$/.test(tag)) return "heading"; - if (tag === "img") return "img"; - return ""; - } - - function matchesMatcher(text, expected) { - if (!expected) return true; - const value = String(text || ""); - if (expected.kind === "regex") { - return new RegExp(expected.source, expected.flags || "").test(value); - } - return expected.exact ? value === expected.value : value.toLowerCase().includes(String(expected.value).toLowerCase()); - } - - function allElements() { - return Array.from(document.querySelectorAll("body *")); - } - - function findAll() { - if (locator.kind === "css") { - return Array.from(document.querySelectorAll(locator.selector)); - } - if (locator.kind === "text") { - return allElements().filter((element) => visible(element) && matchesMatcher(textOf(element), locator.text)); - } - if (locator.kind === "role") { - return allElements().filter((element) => { - const role = element.getAttribute("role") || implicitRole(element); - return role === locator.role && visible(element) && matchesMatcher(nameOf(element), locator.name); - }); - } - throw new Error("Unsupported locator kind: " + locator.kind); - } - - function one() { - const matches = findAll(); - const element = matches[locator.index || 0]; - if (!element) throw new Error("No element matches locator: " + locator.description); - return element; - } - - function fillElement(element, text, replace) { - element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); - element.focus(); - if (element.isContentEditable) { - if (replace) element.innerText = ""; - document.execCommand("insertText", false, text); - } else if ("value" in element) { - if (replace) { - element.value = text; - } else { - element.value = String(element.value || "") + text; - } - element.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertText", data: text })); - element.dispatchEvent(new Event("change", { bubbles: true })); - } else { - throw new Error("Target element is not editable"); - } - } - - if (action === "count") return findAll().length; - const element = one(); - if (action === "visible") return visible(element); - if (action === "textContent") return element.textContent || ""; - if (action === "innerText") return element.innerText || ""; - if (action === "inputValue") return element.value || ""; - if (action === "click") { - element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); - const rect = element.getBoundingClientRect(); - const x = rect.left + rect.width / 2; - const y = rect.top + rect.height / 2; - element.dispatchEvent(new MouseEvent("mouseover", { bubbles: true, clientX: x, clientY: y })); - element.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, clientX: x, clientY: y })); - element.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, clientX: x, clientY: y })); - element.click(); - return { text: textOf(element), rect: { x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height) } }; - } - if (action === "fill") { - fillElement(element, String(args[0] ?? ""), true); - return { textLength: String(args[0] ?? "").length }; - } - if (action === "type") { - fillElement(element, String(args[0] ?? ""), false); - return { textLength: String(args[0] ?? "").length }; - } - if (action === "focus") { - element.scrollIntoView({ block: "center", inline: "center", behavior: "auto" }); - element.focus(); - return true; - } - throw new Error("Unsupported locator action: " + action); - })()`; -} - -async function evaluateExpression(expression) { - return commandValue(await hostCommand("evaluate", { expression })); -} - -function createLocator(spec) { - async function action(name, args) { - return evaluateExpression(locatorExpression(spec, name, args || [])); - } - return { - click: () => action("click"), - fill: (text) => action("fill", [String(text ?? "")]), - type: (text) => action("type", [String(text ?? "")]), - press: async (key) => { - await action("focus"); - return hostCommand("press_key", { key: String(key) }); - }, - textContent: () => action("textContent"), - innerText: () => action("innerText"), - inputValue: () => action("inputValue"), - count: () => action("count"), - isVisible: () => action("visible"), - waitFor: async (options = {}) => waitForLocator(spec, options), - first: () => createLocator({ ...spec, index: 0, description: `${spec.description}.first()` }), - nth: (index) => createLocator({ ...spec, index, description: `${spec.description}.nth(${index})` }) - }; -} - -async function waitForLocator(spec, options = {}) { - const timeout = Number(options.timeout ?? 30000); - const state = options.state || "visible"; - const started = Date.now(); - while (Date.now() - started <= timeout) { - const locator = createLocator(spec); - const count = await locator.count(); - const visible = count > 0 ? await locator.isVisible() : false; - if (state === "attached" && count > 0) return locator; - if (state === "hidden" && (count === 0 || !visible)) return locator; - if ((state === "visible" || !state) && visible) return locator; - await page.waitForTimeout(100); - } - throw new Error(`Timed out waiting for ${spec.description} to be ${state}`); -} - -const page = { - goto: (url) => hostCommand("navigate", { url: String(url) }), - title: () => evaluateExpression("document.title"), - url: () => evaluateExpression("location.href"), - evaluate: (fnOrExpression, arg) => { - const expression = typeof fnOrExpression === "function" - ? `(${fnOrExpression.toString()})(${JSON.stringify(arg)})` - : String(fnOrExpression); - return evaluateExpression(expression); - }, - click: (selector) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }).click(), - fill: (selector, text) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }).fill(text), - type: (selector, text) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }).type(text), - press: async (selectorOrKey, key) => { - if (key === undefined) { - return hostCommand("press_key", { key: String(selectorOrKey) }); - } - await createLocator({ kind: "css", selector: String(selectorOrKey), description: String(selectorOrKey) }).press(key); - return null; - }, - screenshot: async (options = {}) => { - const result = await hostCommand("screenshot", { - fullPage: options.fullPage === true, - format: options.type === "jpeg" ? "jpeg" : "png", - quality: options.quality - }); - const dataUrl = result.dataUrl || ""; - const base64 = result.data || (dataUrl.includes(",") ? dataUrl.split(",").slice(1).join(",") : ""); - const buffer = Buffer.from(base64, "base64"); - if (options.path) fs.writeFileSync(options.path, buffer); - return buffer; - }, - content: () => evaluateExpression("document.documentElement ? document.documentElement.outerHTML : ''"), - textContent: (selector) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }).textContent(), - innerText: (selector) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }).innerText(), - inputValue: (selector) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }).inputValue(), - locator: (selector) => createLocator({ kind: "css", selector: String(selector), description: String(selector) }), - getByText: (text, options) => createLocator({ kind: "text", text: matcher(text, options), description: `text=${String(text)}` }), - getByRole: (role, options = {}) => createLocator({ kind: "role", role: String(role), name: options.name === undefined ? null : matcher(options.name, options), description: `role=${String(role)}` }), - waitForSelector: (selector, options = {}) => waitForLocator({ kind: "css", selector: String(selector), description: String(selector) }, options), - waitForTimeout: (ms) => new Promise((resolve) => setTimeout(resolve, Number(ms) || 0)), - waitForLoadState: async (state = "load", options = {}) => { - const timeout = Number(options.timeout ?? 30000); - const started = Date.now(); - while (Date.now() - started <= timeout) { - const readyState = await evaluateExpression("document.readyState"); - if (state === "domcontentloaded" && (readyState === "interactive" || readyState === "complete")) return; - if ((state === "load" || state === "networkidle") && readyState === "complete") return; - await page.waitForTimeout(100); - } - throw new Error(`Timed out waiting for load state ${state}`); - }, - keyboard: { - press: (key) => hostCommand("press_key", { key: String(key) }), - type: (text) => hostCommand("type", { text: String(text) }) - }, - mouse: { - click: unsupported("page.mouse.click") - } -}; - -const context = { - pages: () => [page], - newPage: unsupported("context.newPage"), - close: allowClose ? async () => {} : unsupported("context.close"), - storageState: unsupported("context.storageState"), - route: unsupported("context.route") -}; -const browser = { - contexts: () => [context], - newContext: unsupported("browser.newContext"), - close: allowClose ? async () => {} : unsupported("browser.close") -}; -const pages = [page]; -const playwright = { - chromium: { - connectOverCDP: unsupported("playwright.chromium.connectOverCDP") - } -}; - -function normalizeResult(value) { - if (value === undefined) return null; - if (Buffer.isBuffer(value)) { - return { type: "Buffer", data: value.toString("base64") }; - } - return value; -} - -(async () => { - const run = new Function( - "playwright", - "browser", - "context", - "page", - "pages", - `"use strict"; return (async () => { -${userSource} - })();` - ); - const result = await run(playwright, browser, context, page, pages); - process.stdout.write(JSON.stringify({ type: "rbc-result", result: normalizeResult(result) }) + "\n"); -})().catch((error) => { - process.stdout.write(JSON.stringify({ type: "rbc-error", error: error && error.stack ? error.stack : String(error) }) + "\n"); - process.exitCode = 1; -}); -"#, - ); - Ok(source) -} - fn unix_ms() -> u128 { SystemTime::now() .duration_since(UNIX_EPOCH) @@ -741,16 +252,12 @@ mod tests { } #[test] - fn shared_wrapper_exposes_subset_and_bridge_commands() { - let wrapper = shared_playwright_wrapper_source( - "return await page.getByText(/more/i).count();", - false, - ) + fn shared_results_render_as_pretty_json() { + let result = render_shared_result(&json!({ + "ok": true, + "mode": "playwright-crx" + })) .unwrap(); - assert!(wrapper.contains("rbc-command")); - assert!(wrapper.contains("hostCommand(\"navigate\"")); - assert!(wrapper.contains("getByRole")); - assert!(wrapper.contains("Available subset")); - assert!(wrapper.contains("return await page.getByText(/more/i).count();")); + assert!(result.contains("\"mode\": \"playwright-crx\"")); } } diff --git a/src/bin/rbc.rs b/src/bin/rbc.rs index ce50f4e..68b7c0e 100644 --- a/src/bin/rbc.rs +++ b/src/bin/rbc.rs @@ -94,12 +94,12 @@ enum TopCommand { Tabs, /// Activate a tab by browser tab id. ActivateTab { tab_id: i64 }, - /// Run Playwright JavaScript against a browser target. + /// Run Playwright code against a browser target. Pw { - /// JavaScript file body to run with playwright/browser/context/page in scope. + /// JavaScript file body for CDP targets, or Playwright CRX script for shared targets. #[arg(value_name = "SCRIPT", conflicts_with = "code")] script: Option, - /// JavaScript body to run with playwright/browser/context/page in scope. + /// JavaScript body for CDP targets, or Playwright CRX actions for shared targets. #[arg(long, value_name = "JS", conflicts_with = "script")] code: Option, /// Allow the script to close the shared browser/context. diff --git a/src/mcp/control_panel.html b/src/mcp/control_panel.html index 66160b5..62a4719 100644 --- a/src/mcp/control_panel.html +++ b/src/mcp/control_panel.html @@ -902,6 +902,7 @@

    Windows and tabs

    const edgeBrowserName = "edge"; let lastActive = ""; let autoConnectStarted = false; +let autoReconnectStarted = false; let activityVisible = false; let collapsedWindows = loadCollapsedWindows(); let lastWindows = []; @@ -1044,12 +1045,12 @@

    Windows and tabs

    } function maybeAutoConnectEdge() { - if (autoConnectStarted) return; - autoConnectStarted = true; if (!window.browserConnection || typeof window.browserConnection.request !== "function") { setConnectStatus("Install or enable Edge Share extension to connect this Edge."); return; } + if (autoConnectStarted) return; + autoConnectStarted = true; const key = "browserConnectionAutoConnect:" + window.location.origin + window.location.pathname; if (sessionStorage.getItem(key) === "1" && edgeIsRegistered()) { setConnectStatus("Edge Share extension detected."); @@ -1059,6 +1060,20 @@

    Windows and tabs

    connectEdge(true).catch(error => setConnectStatus(error.message || String(error))); } +function maybeReconnectEdgeAfterTabsError(error) { + if (!error || autoReconnectStarted) return; + const active = (latestInventory?.browsers || []).find(browser => browser.active) || null; + if (active?.kind !== "shared-extension" || active.name !== edgeBrowserName) return; + if (!window.browserConnection || typeof window.browserConnection.request !== "function") { + setConnectStatus("Shared Edge link is stale. Enable the Edge extension to reconnect."); + return; + } + autoReconnectStarted = true; + sessionStorage.removeItem("browserConnectionAutoConnect:" + window.location.origin + window.location.pathname); + setConnectStatus("Shared Edge link is stale. Requesting a new Edge connection."); + connectEdge(true).catch(error => setConnectStatus(error.message || String(error))); +} + function edgeIsRegistered() { return (latestInventory?.browsers || []).some(browser => browser.name === edgeBrowserName && browser.kind === "shared-extension"); } @@ -1097,6 +1112,7 @@

    Windows and tabs

    const err = document.getElementById("tabsError"); err.hidden = !activity.tabsError; err.textContent = activity.tabsError || ""; + maybeReconnectEdgeAfterTabsError(activity.tabsError || ""); renderScreenshot(activity.latestScreenshot, shots); renderTabs(lastWindows); renderEvents(events); diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 982e326..1477d6b 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -237,6 +237,13 @@ impl SharedBrowserClient { self.call("play_recording", json!({})) } + pub fn run_playwright(&self, code: &str, allow_close: bool) -> Result { + self.call( + "run_playwright", + json!({ "code": code, "allowClose": allow_close }), + ) + } + pub fn call_command(&self, command: &str, params: Value) -> Result { self.call(command, params) } diff --git a/tests/shared_browser_relay.rs b/tests/shared_browser_relay.rs index ee264a9..17270fd 100644 --- a/tests/shared_browser_relay.rs +++ b/tests/shared_browser_relay.rs @@ -275,7 +275,7 @@ fn rbc_navigates_shared_browser_through_relay_link_without_mcp() { } #[test] -fn rbc_runs_playwright_subset_through_shared_browser_link() { +fn rbc_runs_playwright_crx_through_shared_browser_link() { let relay_port = unused_local_port(); let relay_bind = format!("127.0.0.1:{relay_port}"); let relay = Command::new(env!("CARGO_BIN_EXE_browser-connection-relay")) @@ -295,32 +295,29 @@ fn rbc_runs_playwright_subset_through_shared_browser_link() { let browser_thread = thread::spawn(move || { let mut socket = retry_browser_connect(&browser_url); ready_tx.send(()).expect("signal browser websocket ready"); - for _ in 0..2 { - let message = socket.read().expect("read relayed browser command"); - if let Message::Text(text) = message { - let request: Value = serde_json::from_str(&text).expect("request is JSON"); - let result = match request["command"].as_str() { - Some("navigate") => { - assert_eq!(request["params"]["url"], "https://example.com/"); - json!({ "tab": { "url": "https://example.com/" } }) - } - Some("evaluate") => { - assert_eq!(request["params"]["expression"], "document.title"); - json!({ "tab": {}, "value": "Shared Title" }) - } - other => panic!("unexpected command: {other:?}"), - }; - socket - .send(Message::Text( - json!({ - "id": request["id"].clone(), + let message = socket.read().expect("read relayed browser command"); + if let Message::Text(text) = message { + let request: Value = serde_json::from_str(&text).expect("request is JSON"); + assert_eq!(request["command"], "run_playwright"); + assert_eq!(request["params"]["allowClose"], false); + assert!(request["params"]["code"] + .as_str() + .expect("code param is a string") + .contains("page.goto('https://example.com/')")); + socket + .send(Message::Text( + json!({ + "id": request["id"].clone(), + "ok": true, + "result": { "ok": true, - "result": result - }) - .to_string(), - )) - .expect("send relayed browser response"); - } + "mode": "playwright-crx", + "tab": { "url": "https://example.com/" } + } + }) + .to_string(), + )) + .expect("send relayed browser response"); } }); ready_rx @@ -367,5 +364,6 @@ fn rbc_runs_playwright_subset_through_shared_browser_link() { let value: Value = serde_json::from_slice(&output.stdout).expect("stdout is JSON"); assert_eq!(value["tool"], "browser_playwright"); assert_eq!(value["target"]["kind"], "shared-extension"); - assert_eq!(value["result"]["title"], "Shared Title"); + assert_eq!(value["result"]["mode"], "playwright-crx"); + assert_eq!(value["result"]["tab"]["url"], "https://example.com/"); } From 67a02f20d6c3687a051ac419cacf0059f6bc0beb Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 12:35:41 +0000 Subject: [PATCH 24/29] fix: register extension relay on service worker startup --- artifacts/edge-share.zip | Bin 1454769 -> 1454756 bytes extension/edge-share-crx/background.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index f0b2bb5f173d8b2e3c92875f6243eadb2ef8eacb..ee1ab7b9bca753ea718ad83c1c5f65e8ce5e2c1e 100644 GIT binary patch delta 51553 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 delta 51545 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 !>^vWTDa;r3FuVEqX4VHW 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 S0QkK-&I#gq?G*qB1oA&h-Kw7e diff --git a/extension/edge-share-crx/background.js b/extension/edge-share-crx/background.js index c355f8b..4f35055 100644 --- a/extension/edge-share-crx/background.js +++ b/extension/edge-share-crx/background.js @@ -143481,4 +143481,4 @@ chrome.runtime.onInstalled.addListener((details) => { void details; }); Object.assign(self, { attach, setTestIdAttributeName, getCrxApp, _debug: debug, _setUnderTest: setUnderTest }); -import("./edge_share_relay.js").catch((error) => console.error(error)); +import "./edge_share_relay.js"; From 2464b010f595aa6649a4fa848de28d233ea89303 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 12:48:37 +0000 Subject: [PATCH 25/29] fix: timeout shared browser commands --- src/shared_browser.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 1477d6b..9a7db06 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -18,6 +18,7 @@ use std::thread; use std::time::Duration; use tungstenite::handshake::server::{Callback, ErrorResponse, Request, Response}; use tungstenite::protocol::WebSocketConfig; +use tungstenite::stream::MaybeTlsStream; use tungstenite::{accept_hdr_with_config, connect, Error as WsError, Message, WebSocket}; pub const DEFAULT_RELAY_BIND: &str = "127.0.0.1:8765"; @@ -25,6 +26,7 @@ pub const MAX_SESSION_ID_BYTES: usize = 128; pub const MAX_TOKEN_BYTES: usize = 512; pub const MAX_JSON_MESSAGE_BYTES: usize = 8 * 1024 * 1024; pub const MAX_SESSIONS: usize = 1024; +pub const SHARED_BROWSER_COMMAND_TIMEOUT: Duration = Duration::from_secs(10); #[derive(Debug, Clone, PartialEq, Eq)] pub struct RelayConfig { @@ -261,6 +263,7 @@ impl SharedBrowserClient { let (mut socket, _) = connect(&websocket_url).with_context(|| { format!("failed to connect to shared browser relay {websocket_url}") })?; + set_agent_socket_timeouts(&mut socket); let request = json!({ "id": 1, "command": command, "params": params }); socket .send(Message::Text(request.to_string())) @@ -303,6 +306,22 @@ impl SharedBrowserClient { } } +fn set_agent_socket_timeouts(socket: &mut WebSocket>) { + let stream = socket.get_mut(); + match stream { + MaybeTlsStream::Plain(stream) => { + let _ = stream.set_read_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); + let _ = stream.set_write_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); + } + MaybeTlsStream::NativeTls(stream) => { + let stream = stream.get_mut(); + let _ = stream.set_read_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); + let _ = stream.set_write_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); + } + _ => {} + } +} + type SharedRelayState = Arc; #[derive(Debug, Default)] From e7209cc066af2d3f5e6263197e958c4cb31aad61 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 13:03:32 +0000 Subject: [PATCH 26/29] fix: adapt shared playwright crx application --- artifacts/edge-share.zip | Bin 1454756 -> 1454994 bytes extension/edge-share-crx/edge_share_relay.js | 37 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index ee1ab7b9bca753ea718ad83c1c5f65e8ce5e2c1e..af6883907a4f664bac1b04ecd2c7a92152feea10 100644 GIT binary patch delta 12114 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 Lb5mpgb65WdkK~#t delta 11855 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 T`0petJOtth3Je5LP*DFLdr$ok diff --git a/extension/edge-share-crx/edge_share_relay.js b/extension/edge-share-crx/edge_share_relay.js index 35919fc..2fb37a9 100644 --- a/extension/edge-share-crx/edge_share_relay.js +++ b/extension/edge-share-crx/edge_share_relay.js @@ -884,9 +884,9 @@ async function commandRunPlaywright(params = {}) { : 0; try { - const app = await globalThis.getCrxApp(!!tab.incognito); + const app = normalizeCrxApplication(await globalThis.getCrxApp(!!tab.incognito)); if (!app || typeof app.attach !== "function" || typeof app.run !== "function") { - throw new Error("Playwright CRX application does not expose attach/run"); + throw new Error(`Playwright CRX application does not expose attach/run: ${describeCrxApplication(app)}`); } const page = await app.attach(tabId); const run = app.run(code, page); @@ -908,6 +908,39 @@ async function commandRunPlaywright(params = {}) { } } +function normalizeCrxApplication(app) { + if (app && typeof app.attach === "function" && typeof app.run === "function") { + return app; + } + if ( + app && + app.crxApplication && + typeof app.crxApplication.attach === "function" && + typeof app.crxApplication.run === "function" + ) { + return app.crxApplication; + } + if ( + app && + app._object && + typeof app._object.attach === "function" && + typeof app._object.run === "function" + ) { + return app._object; + } + return app; +} + +function describeCrxApplication(app) { + if (!app || typeof app !== "object") { + return String(app); + } + const keys = Object.keys(app).slice(0, 20).join(",") || "no enumerable keys"; + const proto = Object.getPrototypeOf(app); + const protoKeys = proto ? Object.getOwnPropertyNames(proto).slice(0, 20).join(",") : "no prototype"; + return `keys=[${keys}] proto=[${protoKeys}]`; +} + async function startRecording(params = {}) { const tabId = Number.isInteger(params.tabId) ? params.tabId : await getTargetTabId({}); const tab = await chromeCall(chrome.tabs.get, chrome.tabs, tabId); From 3c5d0ad6a0b62a5e7e620f8a44271bda3dafe9d0 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:16:59 +0000 Subject: [PATCH 27/29] fix shared edge reconnect and relay routing --- artifacts/edge-share.zip | Bin 1454994 -> 1455381 bytes extension/edge-share-crx/edge_share_relay.js | 84 +++++++- extension/edge-share-crx/manifest.json | 3 +- src/browser_target.rs | 3 +- src/mcp.rs | 85 +++++++- src/mcp/control_panel.rs | 79 ++++++- src/mcp/tests.rs | 42 ++++ src/shared_browser.rs | 214 +++++++++++++++---- tests/mcp_stdio.rs | 15 +- 9 files changed, 468 insertions(+), 57 deletions(-) diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index af6883907a4f664bac1b04ecd2c7a92152feea10..6e288c0fe597580c5342b24f3e1569586dfc611a 100644 GIT binary patch delta 12884 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 diff --git a/extension/edge-share-crx/edge_share_relay.js b/extension/edge-share-crx/edge_share_relay.js index 2fb37a9..ce38f50 100644 --- a/extension/edge-share-crx/edge_share_relay.js +++ b/extension/edge-share-crx/edge_share_relay.js @@ -5,6 +5,7 @@ const DEFAULT_RELAY_URL = "http://127.0.0.1:8765"; const STORAGE_KEY = "edgeShareState"; const RECONNECT_MIN_MS = 1000; const RECONNECT_MAX_MS = 30000; +const RECONNECT_ALARM_NAME = "edge-share-reconnect"; const RELAY_KEEPALIVE_MS = 20 * 1000; const PLATFORM_CONNECT_TTL_MS = 2 * 60 * 1000; const PLATFORM_RELAY_CONNECT_TIMEOUT_MS = 8000; @@ -72,6 +73,14 @@ chrome.debugger.onDetach.addListener((source) => { } }); +if (chrome.alarms && chrome.alarms.onAlarm) { + chrome.alarms.onAlarm.addListener((alarm) => { + if (alarm && alarm.name === RECONNECT_ALARM_NAME) { + restoreState().then(connectIfNeeded).catch(reportError); + } + }); +} + restoreState().then(connectIfNeeded).catch(reportError); async function handleExtensionMessage(message, sender) { @@ -352,6 +361,7 @@ function connectRelay() { socket.addEventListener("open", () => { reconnectDelayMs = RECONNECT_MIN_MS; + clearReconnectTimer(); persistState({ connected: true, status: "connected", lastError: "" }).catch(reportError); sendSocket({ type: "hello", @@ -390,16 +400,25 @@ function connectRelay() { socket.addEventListener("error", () => { clearKeepAliveTimer(); persistState({ lastError: "WebSocket error" }).catch(reportError); + if (state.sharing && !intentionallyClosed) { + scheduleReconnect(); + } }); } function scheduleReconnect() { clearReconnectTimer(); + const delayMs = reconnectDelayMs; reconnectTimer = setTimeout(() => { reconnectTimer = null; reconnectDelayMs = Math.min(reconnectDelayMs * 2, RECONNECT_MAX_MS); connectRelay(); - }, reconnectDelayMs); + }, delayMs); + if (chrome.alarms && chrome.alarms.create) { + chrome.alarms.create(RECONNECT_ALARM_NAME, { + delayInMinutes: Math.max(0.5, delayMs / 60000) + }); + } } function clearReconnectTimer() { @@ -407,6 +426,11 @@ function clearReconnectTimer() { clearTimeout(reconnectTimer); reconnectTimer = null; } + if (chrome.alarms && chrome.alarms.clear) { + chrome.alarms.clear(RECONNECT_ALARM_NAME, () => { + void chrome.runtime.lastError; + }); + } } function startKeepAliveTimer() { @@ -461,6 +485,11 @@ async function handlePlatformRequest(message, sender) { throw new Error("Platform relayUrl must use the requesting page origin"); } + const reused = await tryReusePlatformShare(request); + if (reused) { + return reused; + } + return new Promise((resolve, reject) => { const timeout = setTimeout(() => { pendingPlatformRequests.delete(requestId); @@ -493,6 +522,47 @@ async function handlePlatformRequest(message, sender) { }); } +async function tryReusePlatformShare(request) { + await restoreState(); + if (!state.sharing || !state.shareUrl || !state.sessionId || !state.browserToken) { + return null; + } + if (normalizeRelayUrl(state.relayUrl) !== request.relayUrl) { + return null; + } + if (state.platformOrigin && state.platformOrigin !== request.origin) { + return null; + } + + intentionallyClosed = false; + reconnectDelayMs = RECONNECT_MIN_MS; + await persistState({ + platformOrigin: request.origin, + platformHref: request.href, + workspaceId: request.workspaceId, + poolId: request.poolId, + browserName: request.browserName, + relayUrl: request.relayUrl, + lastError: "", + status: state.connected ? "connected" : "connecting" + }); + if (!socket || socket.readyState !== WebSocket.OPEN) { + connectRelay(); + } + await waitForRelayConnection(PLATFORM_RELAY_CONNECT_TIMEOUT_MS); + const result = publicState(); + return { + shareUrl: result.shareUrl, + sessionId: result.sessionId, + connected: result.connected, + relayUrl: result.relayUrl, + platformOrigin: request.origin, + workspaceId: request.workspaceId, + poolId: request.poolId, + browserName: request.browserName + }; +} + async function getPlatformConnectRequest(requestId) { const entry = pendingPlatformRequests.get(String(requestId || "")); if (!entry) { @@ -1694,8 +1764,16 @@ function sendSocket(message) { if (!socket || socket.readyState !== WebSocket.OPEN) { return false; } - socket.send(JSON.stringify(message)); - return true; + try { + socket.send(JSON.stringify(message)); + return true; + } catch (error) { + persistState({ lastError: errorMessage(error), connected: false }).catch(reportError); + if (state.sharing && !intentionallyClosed) { + scheduleReconnect(); + } + return false; + } } function buildShareUrl(relayUrl, sessionId, agentToken) { diff --git a/extension/edge-share-crx/manifest.json b/extension/edge-share-crx/manifest.json index 4998fe2..49b5f6b 100644 --- a/extension/edge-share-crx/manifest.json +++ b/extension/edge-share-crx/manifest.json @@ -48,7 +48,8 @@ "tabs", "contextMenus", "storage", - "sidePanel" + "sidePanel", + "alarms" ], "host_permissions": [ "" diff --git a/src/browser_target.rs b/src/browser_target.rs index 59730b6..2ace5d0 100644 --- a/src/browser_target.rs +++ b/src/browser_target.rs @@ -1,11 +1,12 @@ use anyhow::{anyhow, Result}; +use serde::{Deserialize, Serialize}; use std::env; pub const MANAGED_BROWSER_NAME: &str = "managed"; pub const EXPLICIT_BROWSER_NAME: &str = "explicit"; pub const PERSONAL_BROWSER_NAME: &str = "personal"; -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct NamedBrowserEndpoint { pub name: String, pub cdp_endpoint: String, diff --git a/src/mcp.rs b/src/mcp.rs index cdbea23..38956c3 100644 --- a/src/mcp.rs +++ b/src/mcp.rs @@ -23,9 +23,12 @@ use crate::{ }; use activity::BrowserActivityLog; use anyhow::{anyhow, Context, Result}; +use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; use std::env; +use std::fs; use std::io::{BufRead, Write}; +use std::path::PathBuf; use std::sync::{Arc, Mutex}; mod activity; @@ -200,7 +203,8 @@ struct McpRuntime { } impl McpRuntime { - fn new(config: McpServerConfig) -> Result { + fn new(mut config: McpServerConfig) -> Result { + load_persisted_runtime_config(&mut config); let explicit_endpoint = explicit_cdp_endpoint(&config)?; let active_browser = config.active_browser.clone().unwrap_or_else(|| { if explicit_endpoint.is_some() { @@ -513,6 +517,7 @@ impl McpRuntime { self.active_browser = name; self.ensure_active_display()?; + self.persist_runtime_config()?; let inventory = self.browser_inventory()?; serde_json::to_string_pretty(&json!({ "selected": self.active_browser, @@ -558,6 +563,23 @@ impl McpRuntime { )) } + fn persist_runtime_config(&self) -> Result<()> { + if self.config.control_port.is_none() { + return Ok(()); + } + let state = PersistedRuntimeState { + active_browser: Some(self.active_browser.clone()), + browser_endpoints: self.config.browser_endpoints.clone(), + }; + let path = runtime_state_path(&self.config.project_id); + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .with_context(|| format!("failed to create {}", parent.display()))?; + } + let body = serde_json::to_vec_pretty(&state).context("failed to encode runtime state")?; + fs::write(&path, body).with_context(|| format!("failed to write {}", path.display())) + } + fn ensure_active_display(&mut self) -> Result<()> { if !self.config.start_browser { return Ok(()); @@ -628,6 +650,67 @@ fn explicit_cdp_endpoint(config: &McpServerConfig) -> Result> { .transpose() } +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +struct PersistedRuntimeState { + active_browser: Option, + browser_endpoints: Vec, +} + +fn load_persisted_runtime_config(config: &mut McpServerConfig) { + if config.control_port.is_none() { + return; + } + let path = runtime_state_path(&config.project_id); + let Ok(body) = fs::read_to_string(&path) else { + return; + }; + let Ok(state) = serde_json::from_str::(&body) else { + return; + }; + for endpoint in state.browser_endpoints { + if !config + .browser_endpoints + .iter() + .any(|existing| existing.name == endpoint.name) + { + config.browser_endpoints.push(endpoint); + } + } + if config.active_browser.is_none() { + config.active_browser = state + .active_browser + .and_then(|name| normalize_browser_name(&name).ok()); + } +} + +fn runtime_state_path(project_id: &str) -> PathBuf { + runtime_state_dir().join(format!("{}.json", runtime_state_file_stem(project_id))) +} + +fn runtime_state_dir() -> PathBuf { + env::var_os("BROWSER_CONNECTION_STATE_DIR") + .map(PathBuf::from) + .unwrap_or_else(|| env::temp_dir().join("browser-connection")) +} + +fn runtime_state_file_stem(project_id: &str) -> String { + let stem = project_id + .chars() + .map(|ch| { + if ch.is_ascii_alphanumeric() || matches!(ch, '-' | '_' | '.') { + ch + } else { + '_' + } + }) + .collect::(); + if stem.is_empty() { + "default".to_string() + } else { + stem + } +} + #[allow(clippy::too_many_arguments)] fn browser_entry( name: &str, diff --git a/src/mcp/control_panel.rs b/src/mcp/control_panel.rs index 6281290..f1ea453 100644 --- a/src/mcp/control_panel.rs +++ b/src/mcp/control_panel.rs @@ -2,10 +2,12 @@ use super::{McpRuntime, PERSONAL_BROWSER_NAME}; use crate::shared_browser::BrowserShareRelay; use anyhow::{anyhow, Context, Result}; use serde_json::{json, Value}; +use std::env; use std::fmt::Write as _; -use std::fs::File; +use std::fs::{self, File, OpenOptions}; use std::io::{Read, Write}; use std::net::{TcpListener, TcpStream}; +use std::path::PathBuf; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -13,20 +15,20 @@ use std::time::Duration; const MAX_HTTP_REQUEST_BYTES: usize = 64 * 1024; pub(super) fn spawn_control_panel(runtime: Arc>) -> Result<()> { - let port = { + let (port, project_id) = { let runtime = runtime .lock() .map_err(|_| anyhow!("MCP runtime lock was poisoned"))?; - runtime.config.control_port - }; - let Some(port) = port else { - return Ok(()); + let Some(port) = runtime.config.control_port else { + return Ok(()); + }; + (port, runtime.config.project_id.clone()) }; let listener = TcpListener::bind(("127.0.0.1", port)) .with_context(|| format!("failed to bind browser control panel on 127.0.0.1:{port}"))?; let relay = BrowserShareRelay::new(); - let control_token = Arc::new(generate_control_token()?); + let control_token = Arc::new(load_or_create_control_token(&project_id)?); thread::Builder::new() .name("browser-control-panel".to_string()) .spawn(move || { @@ -580,6 +582,69 @@ fn generate_control_token() -> Result { Ok(token) } +fn load_or_create_control_token(project_id: &str) -> Result { + let path = control_token_path(project_id); + if let Ok(token) = fs::read_to_string(&path) { + let token = token.trim(); + if is_control_token(token) { + return Ok(token.to_string()); + } + } + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .with_context(|| format!("failed to create {}", parent.display()))?; + } + let token = generate_control_token()?; + let mut options = OpenOptions::new(); + options.create(true).write(true).truncate(true); + #[cfg(unix)] + { + use std::os::unix::fs::OpenOptionsExt; + options.mode(0o600); + } + let mut file = options + .open(&path) + .with_context(|| format!("failed to write {}", path.display()))?; + file.write_all(token.as_bytes()) + .with_context(|| format!("failed to write {}", path.display()))?; + Ok(token) +} + +fn is_control_token(token: &str) -> bool { + token.len() == 64 && token.bytes().all(|byte| byte.is_ascii_hexdigit()) +} + +fn control_token_path(project_id: &str) -> PathBuf { + runtime_state_dir().join(format!( + "{}.control-token", + runtime_state_file_stem(project_id) + )) +} + +fn runtime_state_dir() -> PathBuf { + env::var_os("BROWSER_CONNECTION_STATE_DIR") + .map(PathBuf::from) + .unwrap_or_else(|| env::temp_dir().join("browser-connection")) +} + +fn runtime_state_file_stem(project_id: &str) -> String { + let stem = project_id + .chars() + .map(|ch| { + if ch.is_ascii_alphanumeric() || matches!(ch, '-' | '_' | '.') { + ch + } else { + '_' + } + }) + .collect::(); + if stem.is_empty() { + "default".to_string() + } else { + stem + } +} + fn escape_js_string(value: &str) -> String { value .chars() diff --git a/src/mcp/tests.rs b/src/mcp/tests.rs index 0fa35f1..fa8d00f 100644 --- a/src/mcp/tests.rs +++ b/src/mcp/tests.rs @@ -1,5 +1,6 @@ use super::*; use serde_json::{json, Value}; +use std::fs; use std::io::Cursor; fn encode_message(value: Value) -> Vec { @@ -350,6 +351,47 @@ fn browser_list_reports_control_panel_url_when_enabled() { assert_eq!(inventory["controlPanelUrl"], "http://127.0.0.1:6888/"); } +#[test] +fn runtime_restores_panel_selected_shared_browser_from_state_file() { + let project = format!( + "dg-test-persist-{}-{}", + std::process::id(), + activity::now_ms() + ); + let config = McpServerConfig::new(&project, None, None, false).with_control_port(Some(6888)); + let mut runtime = McpRuntime::new(config).expect("runtime config is valid"); + + runtime + .select_browser( + "edge", + None, + None, + None, + Some("https://relay.example/share/s1#agent=a1"), + ) + .expect("shared browser selection persists"); + + let restored = McpRuntime::new( + McpServerConfig::new(&project, None, None, false).with_control_port(Some(6888)), + ) + .expect("runtime restores persisted shared browser"); + let inventory = restored.browser_inventory().expect("inventory renders"); + + assert_eq!(inventory["active"], "edge"); + assert!(inventory["browsers"] + .as_array() + .expect("browsers array") + .iter() + .any(|browser| { + browser["name"] == "edge" + && browser["kind"] == "shared-extension" + && browser["shareUrl"] == "https://relay.example/share/s1#agent=a1" + && browser["active"] == true + })); + + let _ = fs::remove_file(runtime_state_path(&project)); +} + #[test] fn browser_list_reports_null_control_panel_url_when_disabled() { let config = McpServerConfig::new("dg-test", None, None, false); diff --git a/src/shared_browser.rs b/src/shared_browser.rs index 9a7db06..8b2d5e3 100644 --- a/src/shared_browser.rs +++ b/src/shared_browser.rs @@ -27,6 +27,7 @@ pub const MAX_TOKEN_BYTES: usize = 512; pub const MAX_JSON_MESSAGE_BYTES: usize = 8 * 1024 * 1024; pub const MAX_SESSIONS: usize = 1024; pub const SHARED_BROWSER_COMMAND_TIMEOUT: Duration = Duration::from_secs(10); +pub const SHARED_BROWSER_PLAYWRIGHT_TIMEOUT: Duration = Duration::from_secs(120); #[derive(Debug, Clone, PartialEq, Eq)] pub struct RelayConfig { @@ -240,9 +241,14 @@ impl SharedBrowserClient { } pub fn run_playwright(&self, code: &str, allow_close: bool) -> Result { - self.call( + self.call_with_timeout( "run_playwright", - json!({ "code": code, "allowClose": allow_close }), + json!({ + "code": code, + "allowClose": allow_close, + "timeoutMs": SHARED_BROWSER_PLAYWRIGHT_TIMEOUT.as_millis() as u64 + }), + SHARED_BROWSER_PLAYWRIGHT_TIMEOUT, ) } @@ -259,11 +265,15 @@ impl SharedBrowserClient { } fn call(&self, command: &str, params: Value) -> Result { + self.call_with_timeout(command, params, SHARED_BROWSER_COMMAND_TIMEOUT) + } + + fn call_with_timeout(&self, command: &str, params: Value, timeout: Duration) -> Result { let websocket_url = agent_ws_url_from_share_url(&self.share_url)?; let (mut socket, _) = connect(&websocket_url).with_context(|| { format!("failed to connect to shared browser relay {websocket_url}") })?; - set_agent_socket_timeouts(&mut socket); + set_agent_socket_timeouts(&mut socket, timeout); let request = json!({ "id": 1, "command": command, "params": params }); socket .send(Message::Text(request.to_string())) @@ -306,17 +316,17 @@ impl SharedBrowserClient { } } -fn set_agent_socket_timeouts(socket: &mut WebSocket>) { +fn set_agent_socket_timeouts(socket: &mut WebSocket>, timeout: Duration) { let stream = socket.get_mut(); match stream { MaybeTlsStream::Plain(stream) => { - let _ = stream.set_read_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); - let _ = stream.set_write_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); + let _ = stream.set_read_timeout(Some(timeout)); + let _ = stream.set_write_timeout(Some(timeout)); } MaybeTlsStream::NativeTls(stream) => { let stream = stream.get_mut(); - let _ = stream.set_read_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); - let _ = stream.set_write_timeout(Some(SHARED_BROWSER_COMMAND_TIMEOUT)); + let _ = stream.set_read_timeout(Some(timeout)); + let _ = stream.set_write_timeout(Some(timeout)); } _ => {} } @@ -335,7 +345,8 @@ struct RelaySession { browser_token: String, agent_token: String, browser: Option, - agent: Option, + agents: HashMap, + pending_agent_requests: HashMap, } #[derive(Debug, Clone)] @@ -344,6 +355,12 @@ struct PeerHandle { tx: mpsc::Sender, } +#[derive(Debug, Clone)] +struct PendingAgentRequest { + connection_id: u64, + original_id: Value, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum PeerRole { Browser, @@ -390,7 +407,8 @@ impl RelayState { browser_token: browser_token.clone(), agent_token: agent_token.clone(), browser: None, - agent: None, + agents: HashMap::new(), + pending_agent_requests: HashMap::new(), }); if session_entry.browser_token != *browser_token { return Err(anyhow!("browser token did not match session")); @@ -411,7 +429,9 @@ impl RelayState { if session_entry.agent_token != *agent_token { return Err(anyhow!("agent token did not match session")); } - session_entry.agent = Some(PeerHandle { connection_id, tx }); + session_entry + .agents + .insert(connection_id, PeerHandle { connection_id, tx }); Ok((session.clone(), PeerRole::Agent, connection_id)) } } @@ -435,13 +455,10 @@ impl RelayState { } } PeerRole::Agent => { - if session_entry - .agent - .as_ref() - .is_some_and(|peer| peer.connection_id == connection_id) - { - session_entry.agent = None; - } + session_entry.agents.remove(&connection_id); + session_entry + .pending_agent_requests + .retain(|_, pending| pending.connection_id != connection_id); } } } @@ -453,34 +470,80 @@ impl RelayState { connection_id: u64, raw_message: &str, ) -> Result<()> { - let message = match validate_relay_json_message(from, raw_message)? { + let mut message = match validate_relay_json_message(from, raw_message)? { Some(message) => message, None => return Ok(()), }; - let sessions = self + let mut sessions = self .sessions .lock() .map_err(|_| anyhow!("relay session lock was poisoned"))?; let session_entry = sessions .get(session) .ok_or_else(|| anyhow!("relay session is not registered"))?; - let sender = match from { - PeerRole::Browser => session_entry.browser.as_ref(), - PeerRole::Agent => session_entry.agent.as_ref(), - } - .ok_or_else(|| anyhow!("relay sender is not connected"))?; - if sender.connection_id != connection_id { - return Err(anyhow!("relay sender connection is stale")); + match from { + PeerRole::Agent => { + if !session_entry.agents.contains_key(&connection_id) { + return Err(anyhow!("relay sender connection is stale")); + } + } + PeerRole::Browser => { + let sender = session_entry + .browser + .as_ref() + .ok_or_else(|| anyhow!("relay sender is not connected"))?; + if sender.connection_id != connection_id { + return Err(anyhow!("relay sender connection is stale")); + } + } } - let target = match from { - PeerRole::Browser => session_entry.agent.as_ref(), - PeerRole::Agent => session_entry.browser.as_ref(), + + let session_entry = sessions + .get_mut(session) + .ok_or_else(|| anyhow!("relay session is not registered"))?; + match from { + PeerRole::Agent => { + let original_id = message + .get("id") + .cloned() + .ok_or_else(|| anyhow!("relay JSON message must include request id"))?; + let relay_id = relay_agent_request_id(connection_id, &original_id)?; + message["id"] = Value::String(relay_id.clone()); + session_entry.pending_agent_requests.insert( + relay_id, + PendingAgentRequest { + connection_id, + original_id, + }, + ); + let target = session_entry + .browser + .as_ref() + .ok_or_else(|| anyhow!("relay peer is not connected"))?; + target + .tx + .send(serde_json::to_string(&message)?) + .context("failed to forward relay message") + } + PeerRole::Browser => { + let relay_id = message + .get("id") + .and_then(Value::as_str) + .map(str::to_string) + .ok_or_else(|| anyhow!("relay browser response id was not rewritten"))?; + let Some(pending) = session_entry.pending_agent_requests.remove(&relay_id) else { + return Ok(()); + }; + message["id"] = pending.original_id; + let Some(target) = session_entry.agents.get(&pending.connection_id) else { + return Ok(()); + }; + target + .tx + .send(serde_json::to_string(&message)?) + .context("failed to forward relay message") + } } - .ok_or_else(|| anyhow!("relay peer is not connected"))?; - target - .tx - .send(message) - .context("failed to forward relay message") } } @@ -646,7 +709,7 @@ fn parse_share_path(path: &str) -> Result { } } -fn validate_relay_json_message(from: PeerRole, raw_message: &str) -> Result> { +fn validate_relay_json_message(from: PeerRole, raw_message: &str) -> Result> { if raw_message.len() > MAX_JSON_MESSAGE_BYTES { return Err(anyhow!("relay JSON message exceeded size limit")); } @@ -662,9 +725,18 @@ fn validate_relay_json_message(from: PeerRole, raw_message: &str) -> Result Result { + if original_id.is_null() || original_id.is_array() || original_id.is_object() { + return Err(anyhow!( + "relay JSON message id must be a string, number, or boolean" + )); + } + let encoded_id = + serde_json::to_string(original_id).context("failed to encode relay request id")?; + Ok(format!("{connection_id}:{encoded_id}")) } fn validate_session_id(value: &str) -> Result { @@ -842,12 +914,72 @@ mod tests { .send(Message::Text(r#"{"id":"1","method":"ping"}"#.to_string())) .unwrap(); let forwarded_to_browser = browser.read().unwrap().to_text().unwrap().to_string(); - assert_eq!(forwarded_to_browser, r#"{"id":"1","method":"ping"}"#); + let forwarded_json: Value = serde_json::from_str(&forwarded_to_browser).unwrap(); + let relay_id = forwarded_json["id"].as_str().unwrap().to_string(); + assert!(relay_id.ends_with(":\"1\"")); + assert_eq!(forwarded_json["method"], "ping"); browser - .send(Message::Text(r#"{"id":"1","result":"pong"}"#.to_string())) + .send(Message::Text( + json!({ "id": relay_id, "result": "pong" }).to_string(), + )) .unwrap(); let forwarded_to_agent = agent.read().unwrap().to_text().unwrap().to_string(); assert_eq!(forwarded_to_agent, r#"{"id":"1","result":"pong"}"#); } + + #[test] + fn routes_concurrent_agent_requests_by_rewritten_id() { + let listener = TcpListener::bind(("127.0.0.1", 0)).unwrap(); + let port = listener.local_addr().unwrap().port(); + thread::spawn(move || { + let _ = serve_listener(listener); + }); + + let browser_url = format!( + "ws://127.0.0.1:{port}/ws/browser/session-2?token=browser-token&agent_token=agent-token" + ); + let agent_url = format!("ws://127.0.0.1:{port}/ws/agent/session-2?token=agent-token"); + let (mut browser, _) = connect(browser_url).unwrap(); + let (mut agent_a, _) = connect(agent_url.clone()).unwrap(); + let (mut agent_b, _) = connect(agent_url).unwrap(); + + agent_a + .send(Message::Text(r#"{"id":1,"method":"first"}"#.to_string())) + .unwrap(); + agent_b + .send(Message::Text(r#"{"id":1,"method":"second"}"#.to_string())) + .unwrap(); + + let first_to_browser: Value = + serde_json::from_str(browser.read().unwrap().to_text().unwrap()).unwrap(); + let second_to_browser: Value = + serde_json::from_str(browser.read().unwrap().to_text().unwrap()).unwrap(); + let mut first_id = String::new(); + let mut second_id = String::new(); + for message in [first_to_browser, second_to_browser] { + match message["method"].as_str().unwrap() { + "first" => first_id = message["id"].as_str().unwrap().to_string(), + "second" => second_id = message["id"].as_str().unwrap().to_string(), + other => panic!("unexpected method {other}"), + } + } + assert_ne!(first_id, second_id); + + browser + .send(Message::Text( + json!({ "id": second_id, "result": "second-ok" }).to_string(), + )) + .unwrap(); + browser + .send(Message::Text( + json!({ "id": first_id, "result": "first-ok" }).to_string(), + )) + .unwrap(); + + let response_b = agent_b.read().unwrap().to_text().unwrap().to_string(); + let response_a = agent_a.read().unwrap().to_text().unwrap().to_string(); + assert_eq!(response_b, r#"{"id":1,"result":"second-ok"}"#); + assert_eq!(response_a, r#"{"id":1,"result":"first-ok"}"#); + } } diff --git a/tests/mcp_stdio.rs b/tests/mcp_stdio.rs index 0c49241..0b8e937 100644 --- a/tests/mcp_stdio.rs +++ b/tests/mcp_stdio.rs @@ -4,7 +4,7 @@ use std::process::{Command, Stdio}; use std::thread; use std::time::Duration; -use serde_json::Value; +use serde_json::{json, Value}; use tungstenite::stream::MaybeTlsStream; use tungstenite::{connect, Message, WebSocket}; @@ -456,10 +456,19 @@ fn control_panel_embeds_browser_share_relay() { .to_text() .expect("command is text") .to_string(); - assert_eq!(forwarded_to_browser, r#"{"id":"1","method":"ping"}"#); + let forwarded_json: Value = + serde_json::from_str(&forwarded_to_browser).expect("forwarded command is JSON"); + let relay_id = forwarded_json["id"] + .as_str() + .expect("relay request id is a string") + .to_string(); + assert!(relay_id.ends_with(":\"1\"")); + assert_eq!(forwarded_json["method"], "ping"); browser - .send(Message::Text(r#"{"id":"1","result":"pong"}"#.to_string())) + .send(Message::Text( + json!({ "id": relay_id, "result": "pong" }).to_string(), + )) .expect("send browser response"); let forwarded_to_agent = agent .read() From bd4ddfd6d7cd751491f982202e31034be081423d Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:22:42 +0000 Subject: [PATCH 28/29] fix shared crx playwright runner --- artifacts/edge-share.zip | Bin 1455381 -> 1455505 bytes extension/edge-share-crx/edge_share_relay.js | 38 ++++++++++++++----- extension/edge-share-crx/manifest.json | 2 +- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index 6e288c0fe597580c5342b24f3e1569586dfc611a..234e63082089ee2ea336c4a74232a3c4136dc063 100644 GIT binary patch delta 13171 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 delta 12987 zcmY+r190b0@FpDFwr!gmZR~Gs8yo8rYqPPm7Z} zWnCXh!8gm51q>{73=E7Zt#=iTIIWxw2Md4)gKS?DwY~fg?p}ys;84eqU||1yI`IGa zLCBkUeD%sWB&79?hKqV#mWMHKNjV`!ulu=@ihq?^kMY+?0+*d_I4@^o@%$;!{RuJC zWBh&0qrT?U!Il|i28`gBbkVFem(QJm{ORwpVa2P_wY65JQyTAvr`Mf_sWSjqru*{p zLKOI5Sd}9YN$9X@7j^3PcX4iPc{6>xl5u)66tleQu(8ZKJ3}S?uxSMU65e>fQ5N;v z=9GFwHN0~8TE3iRZ3kp_>|IkY@=7(Ew~G}m3m!c@4ZD4s+J89T-@a59rM;~j4-H9E z`Mx=2e|S-5c7K@qULDL{S}yAt99i5D zMc@0RJFBInxr2z4N$dNHORRKez33&SDm1&mYrK(-Ud%I9$GEDqHY*qy^+sDqMJ-`Z z;F~okO4Svz73U8dt5^)RUUVGoc*}w6di5j^9T4fMj=&UAMMHgdGa8U$Xift!^EdOE ztKJ5jCOcP?bsRqR2vF|EF`h$+Y~O4=-F6yVt;&InbFWIq*S~^>=I9DrsT2*~4z7ga`-})mvD?l&jAM;*HEx(jLgiE!WkF zib1K&4@j#g7RVX@s4RLqtOK?3r%&8`Iysro>>+9wDEs$qfcfIRJ9`Mozz3{Vi~2n7 zkD$>!3+TD~Uu?aGkK1=uj!4JjZsGYWORa5dNvi8wce}wdwRDJw18vz_doe?SaGWAF zV?XURCc%}T5hqZqA=*~Wla**#ZwY+jH9tPdR$mb{wZ-pBM#?^o7qYFSj7DzW?=@3< z`B0_z8u9a}$f* zH5Z31!?PwIEgG(zo=FI7gvvw+yvRqyp$x{r;){k})SgC>JHiwxX#=I0>Zv48l~+LS zHs(7=F6{kqKIK7v8?9ugr6Kl0qH=<)2ZyNOI0M-z(17$ZT?%&>dEpa~d2ckysstud zlLsj;Asd9xO~(rZ87wbk87>{j%t?w?*Jhzn3lgWz`MoHWzOAqvH^LNQ}0x4;{18 z`5~DZM{Vtsaj4kSV2If8GRj3-W7s)p{XlcM5=Ag5au@9&VOz*F7vjKQ)J)FXg4ME^ z`5MZiDlX{Je5j*aLRJlylC@sqU}s7~ezaNeGQl0|qiw|bc&n7wpnUd&|A&F$(wJ8! zP_kIcB>}DFG%S~xT>Q`AuWKolaLl5zp78SEo;CC_hNLSo zf{upE=4tGc6kRKbcKzbqOSPXO1QbhxhoTU$TDn{J!iu)VH{Z&hkF&^b=Le8~$8v z>X5VH-ht-H$xXgxxM~k7Ga6%C+Fq2^^3F0nnRD&)pDVy9K_(sw`!)JV zHCYp)a`?@o5~YM;r~h`hW>xd+A0>1l?-j{H(G^zm`jlsXIb2Jh#q4!qVHayTuE2rz z$KbC7iM4P11N_WpG7*1^9Inw&@Lx{o2o$Bd*r`H?HIOedWRYs+?rm}2qNICk$x|Hs$9;6RS(h&HRPE17PO)<;w`RelLw4 zc#BN7Vw5?UKgr8l=b+CHD2Ns)o<6$0D)9Vix;J~tRyill!(z@d+Bn5+0N$FI0b5B4{3DOyHoa9cVHgaDeisoR&&GygU62UrgZ_mx!vCI^G&W|jtv4QG6AgYcp8 z)R(!*a!srF8p!g&@I;qKwzFDI6WGHPc4;y&7MFR~Y$cg|7o;TZDHXjd8;+Um-L>vl zxi#<7K$OY-T1&f)%emor0BDlC=DFpW6OB8t;)DMCxVEmc{yK>(ew$XG;NdbxaA9`A zr6*n4mIaE5U2ahvT0~~PO4-gIBR4zssf^G=3K@XyHLvj|oyx10o&L+yYlNxz*jH^S zZ~8stQ|>f0xWBa1QI5pF$sEdREp&up42_|jT0;S#B4;s#$OkC`(i_%%N=1t-ETJA_ z-m{@R*flUeumV$4tcR>Kv8^V(>oe>dsj`JV;o@8PH#zDwzq#%P#}s@lM539orR8Q6RI~Hp2vywCDKCxS{b8-tx+qi|w3j=9hw3zvDJ_q^;KyaTr{Oe$>+V(je1Y#0UAy7(=l+|Qcec|tFzDC5vV{?Ete)HiBab8 zV96Uy?APsRAiYi2=spq)zdp4++YG_=-R+#hKYIrYt8*3%5d5Nw1Z{zi@xL ztO+vG#wkC6!648tz!=Ze)5!!ct*10$v z5h;S80A&OKQGhV;apw@0+0H_6wI5u;k^c9T9>3;&mcZ%PL) zQ!s-f<6IYUAHy>+ayaN%H>%z2cT`WQ03QQsry_@txM26+nPdkt)L$CoxyF2Y;Z-;j z^moFt?<$Ix_-QS$c_B)cAn>nQA#mGibyURv37#0BN$KXay$alI_X1iV^od0a>l>A5 zlMJw~AF2LmP1P43O^>Hc5Dios5Y?3l`ehP4hJzYX1SHI1&?%|7I>-{ggtC;zbNRU{ z#^`Cr_*VCIG4v5ESG`zgB6{;MCk&HI&IR9-xbWL1*d7K5jy zsWb{$tPqSCAv*1)n?0=xkG^Q5LOSo|2#yhhl!d+Ev=w|kca~t?GGj}f)DWd3;)Zu}Y*=P^Fr4$H{ zDxhhAv(%H!l%ABJ3HDU5Jw0UOofH3k@j4S z`1F7{!&7Q@hzSPMqhKk!-T}E5l^yS9!#xcsU(0u$sjL7E?bj(8V%K|%wd^>S+rsU! zHyUp)dv7?oQc8i|nS3W?0(l{>p`LU_p6e7{)*8|ujd*M11&_J7tR_tk*F?GPiH5)f zuk^N_ed5DDteXwdG5pmTYn^zVZH)3{kfo}`JJ|l{u4=16g22i*SQoa+5S}ic_Sdcv ztL>Gx9XviBZaosGp6s$MEz4Zi^;$dS9*f#zy;acif@R$ zAbJnmg8>SxEj5MePM8 z%7`+b#VSDMXuT8HfAM#M2m}{L1vX}Uc7-qBX4~D_q+`qPgYDS5gCoY* zWaM0Vld|+$LRZxfFN-uo-ck)}is6*s)R3%2WcjYLl^{2af7mARmT9ctS-eXsX>{1k zPmqgK(kM)JsooLEW$~`ei#!2Z>!&aUb$_5IbVABb{y-yD5R)XO?}^E3mRJWoc+gs9 zG!f!My1iWs&IN*#IzNz%M-65z8PpRM&JbfClyHcX-(}*{79E~0oZE9~Sy{2e&zSeE zV~+HzAy!yLRyj-m%&W9FtW?KenZ7cKF5hUyR51VvI2WWsLes3BQey+?0g&o~HJrEO z%%!BGFE~dbOS-FP)-xN8`+ zPTlTam;>KiE9M1+pEE_$Z1a*cBqjgn$ydHhl&q3%`D$9o?y#6MUT4!WU&+2=PbfWX zkvp+NV!x2{kG*WpDWjEUYF1g|fv!qxy3ucLn}^baj`W@IzCV}YO)*B6y8Fm*EzWkb z7qQu=^S`AdB5aef_@nbGU zdnC@4Hjk=yA1Rxq=P{TP#4=_V%s_g52jsayOGE&qaZ=lT5ehkT(O3Nvk}!CQS0*kU za!wQ73r}4SU&VRTrWV+j4I)f~Hsjf=NOfD(IgNua>?(t)mYupZR6p0a|A?!_3DHRgwYSDY>Ha2wG;gkbNu# zPX$0@Z( zFI!@-#f;bHwIoRV+leBtR><|U3~E7H>carEpuack5>8e2aa_YOT6N`MGxK(1-hA+4 zoBCm^i@u>gScxWjQsLN5T@vGhJC*noLG{T?Zj1F+l8+e`+nDKu|3G4{W4c0Y73>)B$R|}?!X$^q!b83J?7HUgNKrdq0yx&}RHeC%vccy5GWyUiR+XlM5baNnII-d2aGP_|ZBGeNjT5o6F4Lt&!zDq$t#b zC7z3lZb1Z84Ma^aqnh^_fLR!_InG++Q->ENFLmyEidNIAhzl9VSmbmig2AM4rYJYJ2i}6ru@W8Z z0Lr0vQe7XyYP|cg0e>fD2GXHC-9b4Rvr<(9z5T%o)#+Wqq)rqfAPa9(mtVfeiO)6@ z-!21}u#(1O5(vSBA{s)=pFIA1J{dPbpHVS&SH%5hZqhcnq*MR9Hq$38I`+EE5(=In zXKbh0Mf@E`1rlhH{p$ND=;%Gwda)TlPmubOORfO4mPwdD(_9Ko^M}h3MDK`9LO+(r z?V(+XV6iI@JH-2A*R34)6pV5 z9OO0_IrnF>LE7N{vQWEZ*vhGM>D|daGX8RQw#t+#3F~H1R^mQI_Xx^JuuHa)806WL z6W-Ul8Duanka%uG5a7JNDV><|phx^HPT#^okoSi`4>>(fs$+H#rB?aA@701YVDgM8 z9cpCRQO@tKaoNc2I1N=ZUuWCJeqoiy`bj;81Ok(J3(+p8O@R?bcFxB8ltZW~23F2B zvSk-ymjIB)d%ZYu!)xUykSpx|mwY*lShH>GpYlBguv&>Jzof`{cxgeauRex5{>|tl zobA4Qj72aM->pWvy8J?m{9znr{wrNVM5i&}5{I1!73b>NG}k#m0V(`JnNh?f1dsE! zEZ;&7-iDE^vCjrMbYg?y2h=F;hj^*!ZdQTr+GzTO$l4|OMV{h#lADinF6P&zhSqum zKBZ|J&~p7P)W*r`$|=gLorb^t$ZL7wg_ClZXtYRp*=(&>bS2v5hfy-~JI422VHgwrN z!=*0Jyl1@gPHgc?L^xmSIVHE%jI)<_M*(ZHYxm<4EO|M*Y^*fan}4pSANk`NJZ(b( z;OW~TCGtX}DLaKw)>)w}b<<|uz{^9BdVW9FYHEE8icOB2WNjL>W6u92pD- z15+dcl2j-RYWz+-H(ETQZE3E>neDdmD4-E1Jue&H%cG<#oHGgI>O1Lqka-iutlsBd zQiIK|`tt~{L)B+)n4MJ3Mhc(z7LeruzVTA}hof?P9X(ZtfQxgD{+^NOCIMUAJl39m zE^{A*M#ddy3+_!yZ^p?bklO(wUP4^lElQseY@aza1){sU{*oXoY@ZBa-_5Iu`wCdX zU&k6GCp>LJ^9{b~iCn$04G5}kd7>LP74LPas~^%1F==UM5G_Wc&O|LInmT9z1!9Ej z`70dzanHKO#onVj_y&;O47m_aXbbmCA>Cq*d|_48&)WH;DZ}|LH#t273VTa#A@cop zm#_ioGiCohMn&MBWe7uNMaMgipTdQ^#$OWj;#9Qtsz=abX*)de}^zZR*T z$Lm(kdM7W#)#yVzx6ssY#!CtqEHk_xIsaWMYO>bb9r$tRjp}33Sg%@FKIksOa|3ON zb54iJhw2c(BeoJEEe;6+Y45 ztkITu9?Lcjz+R9yc&%~_%% z)cr|kRR8)atHrU8<=^}u5L3$cXAmoB^5}_VA~yF;VyziM^5Ih(t+`pYP4lPi&2|N9 z^QzylZ)iz+_VKm5C+{z}S*fcPob!p15OD_qNlI#N^;)DRW!a(jHP#C=o&<;Vb?7ju z*JG))QuVI(gy~1}` zRK4?2d=LjkjT@>Y|S+5HVdbp!OEgQ9Eo{lpu81z-1b<=&$+Pi5*)}S67Gr8#4WVKV z3G~yF0q&Ioam%(g`{Sb^Cb`IjkOGgzG)LZIhAJ$i+Opi2sevL3LdLJ3P&c3Q_w>uo zY3g}LrHa6fNRb|ZT3B?3jkK{6`7g^I_6{4kX^DE)UZ*h7Ij||*&hC-E%ugVn7;4p;zYUnNW zyjyRM1uNOJ&F5>$sGH^dzpiI{MsgZz;i#Gr-i-;!|NiS|MI)^UzvB6P@9)9X60iJO z0)oBGqvBcyFs^PQN4k1go;{Gd7nnf${qyPVHM-Ht%RQa?I!ytnqjG{!Mv?iCPRg{p zR+cq#jCoAo6lJwrh&p%C&HNn3bZjpFD7eS<6Og9F&hwL?|ILbZCSna^tW5!~%v!&#Sq$(8&K03JWvpbo;;jkiGKlcQ3Er>%1K zZ=Ge!j}#O|mks!((7&IX13IjyLb1;8nc4k~^%4qOve1hMp?UkQ868sSx6iLfTd;KH z*5)LxQz?ZzOy9#~yQjnW8Hq%MO)r#fK8x) zr_M~igsP{dV;om4YZfddkmaWlL%a6NW*s}}hnvs?OT@htjwJG>-*c5C$j`XS@WG(2 ztXFJ1BYscjji8ef7!W$`vyjDjoN39x(7f7g5NB!{!qa^A|Bf48X-2ve@}naBNG63x z0_1Ot`x5QpA?={C)oh7do7zaqe+CGZQpRE&w$(<^4KW0J3Y|Myjb4^*3d-oKu}k;E zsgE8#m4B6Qqady!E2P`E3r#kh6g&PbH~PNEuIDoc=&|E>nTKG7$KH$>W2Yj=`yChxO!iLmd>!`*c6%nl&1 z@Hn?T)jwyN7*5$$S}$EeFalE{`vu(BweMU~G3y4)k7FT*nOEuNc8uoP+(#}gVDfhe z)#a{bN($ED>&>@O@UP2T@zqN*opD#ER=h}Zkc*1X`iTAr$a1;s$xSTJYM!IFMd5@G z=C?bAsXi~z0t`D%7)S-Nu~V%O+qeDbMqi|*s@0S|%gW|bT#ROM8^A~RAEhBB@K=J? z7#?uzE%Ce~J(TRQA)Z}Iu2TGO>B6xI)0Hc83nb~(nd|g-yuwBWgwC%#?s>A__FHTU zm)pm?Etg3HSM&Q`oHz51aW3fRI=olKi+LkMOauNFNh*;|+Bw&*`#P)1A8))^&@qb( z?+cEzbqFgdI!10DH^3*?_yh#ewW4|8xnw^mY>OR>)R;Rvb=A5HO>RYjHosxFN^VqY zD2w_qi*v=8>}vbToICoo`9hDw ztnwh*x6+<|GEsnskgg|}^^cC`{5hO(bpqzYTJ7g2lvHllIY3Q~i`DcT=p&qG$vTQv zYr&Iw{|$vz;Oxsd@(FJpYTp(4!oK%QHdig{c^dgW1TwhW=_U_6_#>?T^=fPR>It>J>xXNWg%AIU727a0`w9L)*g>~~IW)8*9A6qEqu#)9;-R@DYgKsZFzk_!Q zt#slC4`9&sOCxnW^G~`gI-;ItuwhD5!)huOsi~Ymma_UCh$Z5gOB{@iAfdUR8>>vr zbu~pxG#@mjKkG_!M=R)H&k%su4=Y?rb#hN#&~)HHJ^D|XxGTSg0?YX93I(=6E4%u#0h6Ylm?6avjJoDbWI7py)He5H_3@^wgc#Ov87PT;F9H@0q+ z6jiTuchP%lI$$PC*gKmsCZj=ZfJkp8^cOecPdmNis6p!cCZHRB^|JKLh@B~Ss^_Tf z3qW*>^G+EAkwxhw8T@L%Pu$U2Dt=jTT$SJ->(%r?cC&IhIwrp}G1Ld0*t53NWyLsQ zX4b#cGW={;9zdKCspOm%EBr>`NIhKJ$sgumY%|f`0{Oj{Lg?rp?&OOzBGl;V>+Z#l zHvD-4>?CR+}%;R)ROEyU1%X#kZQ0qo|nt7NPKVbiUu{=tN>mnuE+#L43s6W zDDud0JTpjlEoEroXq?j76?1_V48vbG;XDk8Z@TI%k1XC#NEl$cQ$6` zof3??tIo#7J)jbu464&&rIKRM*5x%9zA+qm49R?Ivx{3Jmb?_*l}|oT=2@qe(iluPJMpTL0(v; z+KjB5)sVbRi0`qu{j6kkGMK?lmX{aecIjkaeHIb=auZ&Qeu&I#4)>UNybw*gNi#n%WrM7XKGJyk{&0$tWG)sX{~f~?P7 zhygmqM3gQ@!k<5AiiTEvz_$&}eKG>^|Ggtn47J*!{quAC2hN6&HxWsfgg;U-ARG)n z2A^RhwwJ?x2mG(JI7WXWgP~CMf9`q(;|jyB=PkL#)+XJ82yAdi`z}E4 z#{I{;UnEZH5n;?y!1E}*I!t%)3}U0pRZmQwADiCqV)wJK*f8hzhO2idpA$4W-ddAU zmtRD?bKv^PDBjr-SI$JuU6$!Js1a8~elqM?`^ccC2kuL?E)k7?@=)!@BuZm9+3_?# zl6#E_AHva?%_f@UgAGFXh*P-wt3y1Fb=C~$=n+Wb8*?w}fygq?c5`UyuKHE;;($!A zZAUC`Z^e#5*L+1tiq;LTI&AM3wV|0RhtBJcy0=f4R2e5S&+MT;@xtNozr7fBmn-L% zrsRKOa$vxT>QhK~ z>jij952JLkRbCW1hN-pcN7Gx-pDdzk%K7bgn8pWd8{`C-vB0{*pNXq(r*HEZ1P3U{ z3NsCFPxfHj5?>3alR-c1Sac)&xhE&2xv*k%z3&!=02K+SzbCtGVqumxZEFgKeF}t{ zBc%QWGmMNnHR~D6JnHAk+XjaD)~8X{{WsoQ`4bQkW% zEU@=wK#jY7Z0OL0;eK|a0tON6xBX2qIQHGo2c2Vd)F-x28}s40s95g|$jbY7GNgP2 zdThjWixVYEXr%9-!(NsI)3Q7tzop9kcbihNXLt0g2|RzwHd22#np0Z&*n8s@Y0ddq zxa+<6AS|A7AVRv<6hxj4IMh^RKux;TD|8MF0}g)+*gYbD`g)NoojvD>`8!(DO-gNW z;J{ndt4FHP_%qQY(uee0zfFv|OxoN5cDueFE!2}SC-p|{#DtylKa9@uW0kwAN8)$7 zrTH~>$=Vp~1=veb(?J`eT%en^1+&%Eo~>V1U)>sIsU!LwBCI8TS*=^u+@^}t(Egbc zz~8l3puxtN(|dWn#OT<_5fFY&g7N?_D(f;_D&1iF$u&*#CzN z<&%U<9>75gS1KBSWgS3)FP=Bc8rsm^^(LOLhW9-Fg4El5bEKzHwlF;`YAd#I#B|IF zy6lL%;^E>Wtwnf7e6HQOy?It9=rGj;q;{U@V5;ejyGRI4v(1cc0zVkvrRZMXo?+$B z;MINl+=fKsy3-WyX?B(N_z|C0KYiY{#WP6E{+!glemn~XHSHym4Rpl}?#V>h(eMR6 zuTbbgSfS51RcpJM_Mbn+ilKfS5pAtnNsmOv9BSX&KmPQ}MdX!jA5lrx`*QZ zeftte9v}#H93IcvQA&e@S*6QI$AE+i4Er@S!`VkMOsS?qIl} zyl0bi8;Ol@nn@|-rxP{b^2ck-5PzNfukzoV&#|||+(YER55^C%_|PF{F_1%64fq27 z)_>}3@V11UZ`R$ZAiDt0By762txMqu|BWgpm4_z2F%URoc|#*bjmZ|gDaHtn0^jcd zdnr3LgN{WJI1M5+@44Tr%C%@AfzQ>K#q01ADouG}QWWqABQE^h8jX2g#@|tDvfM7N z>xW3Qp3NGb1|xRr4b!^(`uK==SC05rxx-*ujL@TEae7+9Wsw2axTiiBbx+xhDF^o! zIo2FPA=WY%Q7^D_q!o$9y}(@$xm?$bMv{h}W!OiPQ;eqNuNxNsYte}3>7fu&K+wne z`Pb2?!lW?uy%_yYf>Fe5Ak=Tkm>hk?sfFFTS>b-^EH_NbTv(!}Z_2EPD?%eYOu@0p z8XE3CH~Vhz(a?a_zcu3??)0$RR1$(U-s7?!nf2<{I{ThTVcKJ2uF9}@WZZ&;q$@U` zr|I)f9S{l7=EyN!dJ2U(0Tw**l~4q0ZB1}?>a&z={e8QLK$f@sjTT4jS}lS%nOEVM zl{jM;^{D3IIs#n9=i6iPCneds^t6Cw7}f%6VdPhjlp!!98+|D+j<$46HPC!V>lYr@ zD{+CsfMTuKtoQx$F794V4g&*nh@xkizcrtfkQgX$e6Q|Abp zsCx4iuJa2zB7hO&KVY^5Fk+2>!*TxiCtmQ7wIfZ58H*R9a5XK08H*I3{I;a_k4=(W ziQTaA*^#)-lL=dN{K3y^P+B)L76D*tZ!QU0WXJOw>v00UTFnhZMQ^u~gL6h*Q9gc=ystoP8|Ad;T&&3r#NoMb4-k)S$tc;Mu3NFE^TkLA3< z`L1mb%O4P~R{M&1X7A|H3Bx-k(Tw7p3fzl+frDa3SZF4W9E6dsA56^6s@?m3%SNL| z`O`0EJ>(3vk*)+`1Na}aw!5kW#vh)YKqX&LR$Ps@Y=Y9a%lZ6zG@GoMH`mg^O*&7h z=jMt&`~3as+AVMnz&xOAF&j|ovJv=8`hb!pezNr_6fbs~CVgQC8fvd)_$u0Y%t3h7 z(CM4Ot&!VN!kcl5*oRt7fFzJPb5Z;?_0dQla#TI$qNGv&gkpjMCmnoM_!?Xd*`M-{ zDtd=H?OS<_Y&&FcNS{Gck_s=z8a*Mu*d~0-Us^5=LygnR>$T+%t z*d$Zgw@U@ovquZO~08jOg4xUX3dMCr9&7z#PI z{cUq(mgO7jO@8zfs9l=Y_LyP>2fO-jgYKvwv9w8<@h+d&M(fBnYhSs{Xsqz@%MEhF zpt|;p*6+`~4l^_Egmw|Zw|GN8A3aCX6YnICPwOA|un~l8SpNY#jgSpT4dwrB&PelR z!;$)59T{n=Y&b+|+iW-_kPwU*X{t;(jA@MQIFb;j3~4UxI5Ph?fqU3-a3Fe^{+E_8 z?T#G>1F~@S|EIGt;XtL)vtgm2;DP<0(HNA+`aiZt95{*)aU1_zNM*%=PMhMuk%v${ z{h!s3Bs8Qnv@p_KAJa^@aI7IzUjD~QYzqx0 d?VJlo60#o;CrKQVAWe}QM+Byg4(GpZ{C^9@bxi;O diff --git a/extension/edge-share-crx/edge_share_relay.js b/extension/edge-share-crx/edge_share_relay.js index ce38f50..099bb04 100644 --- a/extension/edge-share-crx/edge_share_relay.js +++ b/extension/edge-share-crx/edge_share_relay.js @@ -955,11 +955,12 @@ async function commandRunPlaywright(params = {}) { try { const app = normalizeCrxApplication(await globalThis.getCrxApp(!!tab.incognito)); - if (!app || typeof app.attach !== "function" || typeof app.run !== "function") { - throw new Error(`Playwright CRX application does not expose attach/run: ${describeCrxApplication(app)}`); + const runPlaywright = crxRunFunction(app); + if (!app || typeof app.attach !== "function" || typeof runPlaywright !== "function") { + throw new Error(`Playwright CRX application does not expose attach/run or recorder.run: ${describeCrxApplication(app)}`); } const page = await app.attach(tabId); - const run = app.run(code, page); + const run = runPlaywright(code, page); if (timeoutMs > 0) { await withTimeout(run, timeoutMs, "run_playwright"); } else { @@ -979,14 +980,14 @@ async function commandRunPlaywright(params = {}) { } function normalizeCrxApplication(app) { - if (app && typeof app.attach === "function" && typeof app.run === "function") { + if (app && typeof app.attach === "function" && typeof crxRunFunction(app) === "function") { return app; } if ( app && app.crxApplication && typeof app.crxApplication.attach === "function" && - typeof app.crxApplication.run === "function" + typeof crxRunFunction(app.crxApplication) === "function" ) { return app.crxApplication; } @@ -994,21 +995,40 @@ function normalizeCrxApplication(app) { app && app._object && typeof app._object.attach === "function" && - typeof app._object.run === "function" + typeof crxRunFunction(app._object) === "function" ) { return app._object; } return app; } +function crxRunFunction(app) { + if (!app || typeof app !== "object") { + return null; + } + if (typeof app.run === "function") { + return app.run.bind(app); + } + if (app.recorder && typeof app.recorder.run === "function") { + return app.recorder.run.bind(app.recorder); + } + if (app._object) { + return crxRunFunction(app._object); + } + return null; +} + function describeCrxApplication(app) { if (!app || typeof app !== "object") { return String(app); } - const keys = Object.keys(app).slice(0, 20).join(",") || "no enumerable keys"; + const keys = Object.keys(app).slice(0, 40).join(",") || "no enumerable keys"; const proto = Object.getPrototypeOf(app); - const protoKeys = proto ? Object.getOwnPropertyNames(proto).slice(0, 20).join(",") : "no prototype"; - return `keys=[${keys}] proto=[${protoKeys}]`; + const protoKeys = proto ? Object.getOwnPropertyNames(proto).slice(0, 40).join(",") : "no prototype"; + const recorder = app.recorder && typeof app.recorder === "object" + ? ` recorderKeys=[${Object.keys(app.recorder).slice(0, 20).join(",") || "no enumerable keys"}]` + : ""; + return `keys=[${keys}] proto=[${protoKeys}]${recorder}`; } async function startRecording(params = {}) { diff --git a/extension/edge-share-crx/manifest.json b/extension/edge-share-crx/manifest.json index 49b5f6b..8d9ab62 100644 --- a/extension/edge-share-crx/manifest.json +++ b/extension/edge-share-crx/manifest.json @@ -1,6 +1,6 @@ { "name": "Browser Connection Playwright CRX", - "version": "0.15.0", + "version": "0.15.1", "description": "Playwright CRX recorder integrated with browser-connection relay sharing.", "manifest_version": 3, "icons": { From 7f91ac41820a5c05d76300c8fcff449b2dadc8d1 Mon Sep 17 00:00:00 2001 From: skulidropek <66840575+skulidropek@users.noreply.github.com> Date: Sat, 27 Jun 2026 14:26:58 +0000 Subject: [PATCH 29/29] fix shared crx recorder playback target --- artifacts/edge-share.zip | Bin 1455505 -> 1455552 bytes extension/edge-share-crx/edge_share_relay.js | 24 +++++++++---------- extension/edge-share-crx/manifest.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/artifacts/edge-share.zip b/artifacts/edge-share.zip index 234e63082089ee2ea336c4a74232a3c4136dc063..2963faad4fdae52ccc403911038d4ad598ce04bc 100644 GIT binary patch delta 12052 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 delta 11996 zcmZ9yWlWt7ur-RiyKAxH?(SaPtvKug#r-Kx@d9Pz?yzxpihFS=?(Xj2`<;`UdvhmQ zf5tLDCX-Co>N(N>b)x?x6gm_p6gCtt6h0Io6fqPj6gd_*>Gn6mgk@pp^e1n(o2>%z zxTekSh@G7G#~n;jt-Z~&leesoRpDoki|!g1KG89Z$=T1sb~E(#MfVS$X5GGx%`f+d zdpCOW?3gvP5C}x!esV+L>tyG<&#T zKke{-U!mZCv15J;S-i_26m|xD(7&Zqtak-a%jWIIXAQJ^7#%&0buM14yAI@N`;cKu zb$@^^mZvArjU)sJo}iUM<8=tdh?j6o{G^J(v?I~=-(Axuk3mRGT*aXBnQ{=2V%l9{ zvvcom;h8n>VM;KSr&Jw*%%J0AU^~BZZK<2uaLd9>!X8$m02$@)X)N7h&Y9#=N-OfH z*VD1KCQajcDmne;8ytWiy^Mx?P~RZPS`odd6PU8Hpn7apemYlZk}^N!o2|x$c-+Ba z%i3dBM3|=d$DpcMEDmG{gT4iv)1uI7ZptIU%(3sz*S?F=wb}+L!lYm5{X7}c^ zq~e^oYN&Fh!%B_sc6?^9(`bYe*kZ>LzeU-!nbi==>Kb+=lGMF>39)*anlp!A1OF*_ z4$*MS#t)Djx|!88K)3-!h*W26T-U4Xd<;0(U=x}{^u1){qMy2p>%lc$7EjMvCNA4p zx&ZX>PWOv}DB`OvLE=rrkAV&^_}>Y#3d$CH(8($|;kZ=gg!SQue^u|D6R&p!?91V` zceqB*Bpj~wpNY{63h1jNKkax(0B8c5nCX5}OO6COlA=#UX*K{ubbWm#OtQ#W!n=PA zN9n}Ar&%roQ0~HyAx7~wPc9|KhCMbtOz0WKlm#$EU+X$M$=3)bIJ$nE*Ict=;MluZ?$oa= zE1aBsP0VCN*-isa5_7Vu{SuR2Z*mmfM5jh)Wi;g;(^g^eZohOeP5Rm_p_@M@E}=+H zUx>1c71jGYINV!37ot{+$}s)JlW!oVfaVwC${5D3w_H(2ETMU(jQz8kXT?d2IvD(O zwK;~)=lCGjs8gfOe$KTot6Zr%sN<-bJlzUYyCM=g!Bv}@ljXIMy z%x6gq`6f!+M9td_*L>IZ97C-kE9}*@=VMsZ1A$7;Sos~`XhlK2x0d%Z?h)szZ-#q+ zED64uB6R}tKSIk%{{lxu=_O4w2Yb($$GD#Q$sIa|J#v|G511Isdm;^<2S)4pYgb7nl=8 zEEy0m*sVVb@;5pR$H>lez=m(NY9&amEKzkz9T1%=CxJ6HT@|TcxRv}2AFYqQ5>X#` z2@XjW<82Zch_$qP88P;-+)e08!2GT@wlr;VZbvE-DkT>vR3|r^;EaYmW?9a5mZqp; z@%ylm!-19=m)wmvJ5a907-z~)(4?4%Z}m%BnRtPE3eudvkJsX+h}GKBk2dg@_GVd43>&6Lb{h&5ToVkphWV?JQF z{JO2%ow`>2?MZ9w4^_FFYX9l?HG)=azSfpA^rt88Y2mR0#A-|h>0``OspFb@5B+~_ zpl>ENV=Y@;4sB?$VAh)=BdwDvDl-Jl40O7kV~ZJ!ia%_X%$6}dFf9WUql!YLLH(R6 zUj?PVb(RcBI7S(L?2{fHbbfZXBZvTajSAY7DW%`%%X=MmzghWHj7)t;c0Fk<`Lc39 zLHK)@-J13+KN)?-@{G$UtfGxn4=s+riL>vxIK^X+pV4(Vvu*nLh@g*ZTC!%zaiQ<2 zzVT3Sk^a#yf5f!hp-CXz{qUkNj!D4#-%IiCv|hBlOR;JsDBoC$t}!)=IQ|pRzpVVF zbUx97zm2S9+KJFss(mltPAVg6F<1~qVoZt0l4mTceqV%`!H5;Zc8VNk^P3vKI%qy2 zQ-F47CeR`D=XcKEyEi=cVO=z4gR!J4VE;sy062%n>v!bi5veIEwY)78aICzxU^Y;w*o_M!&Soml+6} zNfLWN;Z3~eu}C!*9DyiX5gMl;$byBOYn1H%IT75I7mRR_eC0$DKj3}Xy(F~?L=lt}c147#>k zJPlYwK(OLBsUK1H0Sp(hFnhwE1sW2HXS3d+fAS!ea6$V66KVj)VY~V!N4ft*DFk|; z(c8=jx;&0j!@#&?_K1SZ+Ye`v`M_ZMW^vEZ1|xr-ElQt{OiUGBUb=nRFoc>1HX0j` z#1Lx|$eysVo+2aB*+av%&IVm~e9myyoD7tvQpTc`a;Ek>Y>)~JouK@;)_a7oEb^9| zQ$(d256b__iwtC}{2S|6n$Oa*!niX}vGdZ^8t^pvig0gE933M8qlkFM?a+Sv52=B% z5P_vCF|-T2aZYa_`pbb=wi9Wb>_e>dsPf{@Me(wEMe-m%Reu}C3 z&USdhr8j`!v*~*x5!1@qP#w*cQYuG=*?v49c1EI)Ty+2>>Su%k2QaC# z8ibpc6pQqNv5|48VT4P-Jjgh*(6(S- zWE^s6WpFAojtWf9FnAvshX(NEonjWT;Qez{bCMs1{n(xheM!!!wx9T^ViHA2L}3EF z`R9DjFu8R+h~L;yQr$sd!Z}EWT!GEjASBs~C4?f2pRm4!VDRjP-++^;WV!wApnY$k zgGC}$Zz)uD(ms;LH6cDqlZ^ew-c3xc3uxGznXG?3C0ppj6n7#%n+B}Hi~HJ%jen2u zayU9{X(kAG=cBBq1?Owah{lIHVrUy!%ItOP$~vL)jDbmF%f>1|Wnq8Y#{H|pYUn^i zO9gzD=ps#fnqWQ>;q9%R6$M{@BT!@4mB(seinl;$gpQbbEv~l~jMwI{n0=ivW}QmV zWC4p-u1D(LeT$2)5YS2Mzw?t9ocq+@oWU3Bt0J*3v+ z_IYBx!aBv38})ID-CEXXJ3RuUi20(?Cm46_Vaci8s#&dpTari@X(}NLetP$XUdB2x z5hiPBJ@G<)Sg8N*1$Qc3@CeOYx0$rmGUHePQ`f>Hmhr;86*!Dx{#=F|uva;%iOXAO zh=Rg@GuA*~_TFHOr=`t!dhVn!_Gn!!yAI`ss-t}DwJVdu$0sDBT~Ipw3*IB31y!!n!6P}>TZgu?5?=3BF*40X!M1DBny!z!&G)q#k*d9;E<~7_RwpJPztE90 zV=N?@RW_Ed0&Ul*$Mg7=?A^KDqrp3HQ|({&TRy^AzL39!!4f znIMWm#r+g}Ok159z2!LW8EPiNhP_UU<}HpjtG`tqoUHCH=m_OXnPgC8HmLYIo_op~ ziYL-47&xQJ!rc!d`&krEklJtCvS7pDc2%so8?EIWfOz7&ZMBCFHUtMaXy~y_Cla%s z>OOpFS^29Iua2%3=k`r{&)ORa;mb}q?0IG>TdX?VX{AX>5o9gY2%t6{Cl4+nrZSxuMbRUAuu)43;jqHVycb+z&A_;Cjp4Jw0jkBq)q~?Jy)Q^5-X4K*;xb zTaaG+Xpj3=sRoI_GLn5$Fuv=e};ki(3=foqj;M^Dcs-e!WQY^m!9$HK>Gb#wWnEiOo(a4|c?K zc@i!;A)Y+;^y~U4feVf>i8rbN^U0LO^GQMcvWGmaGsnl`sV}dR#N}|5wL&etZWHgA zV~1>jCU_R(zq`lI48F&}`2%>$vS9FfBC8h5A!nL-YSBs5-xnM4xVsP*ZmJ!{5Asic9H zc#{tIdI}pwFe-NR{D-WH|_%yC_cA}#ro<;`a5#3jjCOqZ+}(-3Afm!A8Q+_|hM$LeP-sc2;rvrp z->Ef5tf-gMh%_fkmjp;``r*!8BMXN65*=%1durLkKm{19SH_Ekpn0{WPOK+R^Og<5d**cfs79x zL=Wo1>|0_xdwz#H#qDeeNQ>LJ7DA+fzHMyB*$_FqBg}f9*TPp=@X93hXhNQOLo0~r zk&2H0V_3pA8zr6SZkXMMrp~$(v`w}RX@P4U%)u@Wv<3J`5uD->k`A2(3SO?HPMQr( z>9qHVJuTDQ6%GR4StCKHLYnTU$3~d8Spq^~ah$u=4f6LM?}}RD`n?9U`w3Gv5VLZc z!G&JeSoVG7gQ5P-x_A2lTgFIE+ISSh;?RU9C@JC06p7(+2$y_<|1_mL3Vj!GIbD{@ z@M*yr1u*lmTq&Yx>pbO_zp-}gU@K-TF@Bk18p-i?cK*SN?Y#KO_JQmoU1%-Ki*W8} zupTph`qcKnZRnstMoHgu?o#9vj}e;#a#vC>AEW_Xne=~DX>!ec4r(@gyOtB*Da?y< zj2UVsifgb%psnUTt~a53FMsT)^IA*gC|1e30YblwlFo}x!6358oQZC?{l~ujh>3~J zAr&ZeLY$)&-e;RtzJ7k!Z5ipX?K@ z0PL4_w|tr$q5VAtSj^_zK15@;Oi);_xWFY9%NJfa)4E*R5_f&}IUqZQW_lI+ts z3r4E;TQrG-RS%J-PF04fZ+qp(PI&qv0dfXb_uiIWl*|iEz5`1$xe`)yGi5gdH}90G9n$$6H)W>Y?=8xdh_qdZkz*>>k z$=4M#!YUQ3EcmdMAZuP&YmqO_`wZbydRXaX@X2PmxN;^Cblbm5NPOB((iC$Bya}{j zK19SpyZ&s4ngODzMK#d6Qz2dx0$fSD=Z>5zHbJiSt^?M%yiQ;Fn1^9eW7W(Tn~Yx; zewD-y5d1CM2Rq*8Dy>w394geK0jCd8wVx@BF}D;?9k}LZN~Y~`z%JRKp3Lc`I&JeZ z8YR}@koTl-|LtwT{5GD8{khX3zS^F^IuSoQx{~IKu!0d5+eF9{eY*%wMUv4h=ij@| zvKcW{)r0oDUx0yxjyZsCLI!!!F2v>XoeayM-hleXOOU>#wm^k_p;?0j2o5!&hkCxe zy=6d|#R-sk$1g~(o^91eN_S?@OvQ;Si9bHvCq#s85Lh=yJUFYAG!JD_m-L0)>ZaP$ zb~Js`p&g&rg%|j{F(Ob!xVpNoN@!Y)9|@8ob6FJq9OQTKccseE_W9qnc`#)Zrp36< z_-`96*6qW$JPnl?44D2I0J~?R^M*!}*}ux*UvmTxQ+|x4HZ@7ZC1_%DF~&;_`hc25h~Y*amdJ~F3`h3-Eggq$O67tffJPYyeM^WQ!@8;BU@P8KF z#rs%HS<2J;01noSw9GH%DjUh{i4C`Px`&@|hTkNcf6bu6d~Ts$Cl*%Q(C21+^}BJG zO!Y~Pk+n4#KN*hkp0E7)o~!3&nMUnul@l+BVmB(WP(Bph|t1h>OV*7Iw^LiU4Q2@FWm{ZehPJgpxvx zgs97nKsTsRH;hu1p`ZWtT6rnLw)c599yZ!3^H?!X<;s!s`6LXz>s0O8ppJtNl zXI4#8kFz7t#rkpzQN>7j_kBuK%Z4y_Jrw4`(a!y28FDkQXqJuLkTG(zQS{&GE5EHz zde;EW1MW;40~0Y*<)zFLrsW9rhOBzNV5Yh6zn0?smP^mj4G`8CxYbZGaQYHIR6}UP?{#9wENo>E)bPfTi~gX;E%kt2 zAWki>OvGd}$$ZNM#vW$iSv!;@bHs_XD@q&iK?s%qdJuvTuA4hJ2E`(bJ9z;`=9A`l z_!ruEE%M@r58YhJo|Q(mT+V$+q(BjKDo_^*u9*59@-__>#o*JvaE0n9B(VP9UvF(=w_K@uw ze#92OJ)0f~l4~SmEryB8aOz@r_*((O%AWEk>w?=+;hZYUsY;WF>Tl|Ar6zx!&Hq@f z?Ad2e6nkW-zA53vYaA)Qf2W=v-n}+$hmU*|z&rY82UjHR?vTY=Y_R5a7G6wvroC6@ zFgPyNs|s53we*n49Yk5(N~b3VzFlo@ZA^4gdn`0qH^|^?tvwbWUdZGq2qektkrszK z41S_Je_a|+O?Jt*r?PB2!caz7D9e@fYg|~5BJ~dTTw+m7fzA%0S1k4X1FAqC*OL%^ zW&%k_xhvv=xKT;BxZdZ&q?M;u^=Inuzff(|mz6;xDxQ>GT7%jlW82(7hEHoLB-fxD zvr+&vF=C;o?{!w2b28oJ__v;~br)^o*;#@MU#9au4&%hlaPdf<5N95~)5~ZHJ&Cmu zwUKj-Vf+P&trzhwfv`0fyej|b$ZoH!=-oA{yLQiu8qo@6 z*3oywu02B4uD1=f{D1ub%!b%6^6AqU(YA=|ZysFVVg5EtSQo!e4VOiSO~#wN zAezYg<1j0E_GEoc__`9Q987_Ca`Y|sW{Lk1)*v>&?%T`rLcdb$_WI|~Ma!BDazQYM zPjW^0ys>hJim{ocz(e>1Cd2UcEvrmfYhig9V*kkii=Sfgk8cHbGqb84N1*pCW&fUB z;U2K#p)KjV`fKuYKj5@UnThop5dDExvy{VB@$oMGwzYYQ2|Ma@jrZQ#-Ae83!+|B> zN93Z>d#w$00^W?n(DVo4)H~1rUgQp(df_chtYvp>o^7Fku6SB3e&i zJ$xT(@jpfH*aA@+j&oagdP9bb=A2+l4yK)Uq~*{O+j0r=4TTx_u^Omyl=GcD6fleNPr^$;Al8>&#!f z$ptftq_%bU1tNV0KW**35Z2imXZ_skEQX0$%l!V;&qT1zrt>@R6*li#ZU1CtmPzJD z?x8H9*xs~H-tuE=@B!kQ(y;(kO}3O#41s7<1^_(*Gn<#uS!?M zMm5q2HvZjMznt=k@~e`N(YWSKB==A@?=%yKN=j27FP@~d>+)~C?o+)?2$1)!T+2;(LyKZ`FC;2dwp#K5MrXa((?SL3|f?IYt{6r%2A4IjkxD}TO}`DuQ-Z2 zfP!Ga`uF5ReRSQ(V_aU@7?9u5@*>j#byP2OgZAmO?t!N(+VKQaX;2a8#X1HRe8pvY zgjvJBG(J+|{NCV7Z|&D5=AX1m8nWoAKuQ+Nq;V>m*Hva!qm@=7)a0xXQo%HFWryQM znv%Gy*`SjoeZVlZt2uWke7>K6FKBWP5S5rY(uP+#3>=VkA-(!UA}|~1T*8=fQ>lc8 zMr22yHGKkVTFLfhw?k$WQ;V@_8${2t5C8TbZDvFBYOXOCBK%3#WH^JQYdUvp8?h5{ zwDxaD(vNxzPjb8DVO2c3H2*vAkd(B=R2_=JIs=`BAdKlHA-r6?kO!wpEv%>|APtJv z#f9>4dB~0D8Uh8oplAus6^R?XfPd83q_g=3k}b7vvU;71_{rWK)9|+bq!FxES|G;A z_=jcZek%GYKkos+o+w5hYpQL_lsVdrOx{LRm?$0Z z$W{BM<^}$qP};}%ch5P3=t*AU3 zjk$BLn%H=e!iMsY1>0#$@C6MHA2}V}(Qw{QUbq~!l`+o&=IAV9i;84^ExsbJcYp&} ziWY~3s-Mzzk?POg;U8FYZv_Kv4H|B`3LFnOEj(#qz8-Wn0&pBH4lCgN&ENKQV~6!- zyKw-iJIv;IQxD5G2=4)7_>mQ-fQt@d#O}@#dOR6)gL_ycUAp$;PvQ=RU_S)5l#%>e z1ao6Y1O$v(cZrg9 zVgIzOa@C^yJZTPXR(|We?5KTt|DF=zEa62qRFx8DKEIlxCG*>w%X(;jjRgUQa*eVERllp_mr;F{VS!UsnWLxw=0b(M*)> zl7-zlWT(zI>O%%zZ!-81Cn1e?L^eKr2l0eGpJrkTjbL^O}2nm^6W4GrC2bjQR*T0~JxI5>L-l|@EcogNXyXvD1l*;#D-m*bzhO(D6pY#sj&9zz-=ctt?(dg!h0BtP<pCqYEqWi8!9=Ezo%WahVdw|Nr*7UL+xC}4Cwlkg>b3aT^`bJM+T+U*!$yj= zg0=%K*=J9zHT=Q2i6huz-n)oF6jMu4@HdRpwc+OvlANNAFeMa)0A{IsL6%~a6_tLaM1TdeM1rVRM@B;1B<9QPd5xB zeWXaY`aCI*%l_tqZ&yh`@_uuB?IHJb*xqUN1(2-Cr1HA=HEzK3@<14`bZ%-${3w`l zYB_&OzvV`(Yhz~M>4#2K_YX`XV=;;k4Z>=D?O)d~c+*ST9A@$8T$7yJg2`{FuLGLb z4_EO7i&}%X$yYG|#RpZ|p=y7~pc?^2{oCDR?PqJbm{yyfDmy}cfB)R$-* zJrD8^YNM~Xal5C2M;t9}m6%|jN`!kSF@9Lmyfngkuk5a)eTsbu;>pvDseD` z5r-Ezj}V$Jy?S-wEFg8A`y~k1a@G@*jpA#$3)Mzbt%UL(F@@5LH%%=}(bfAUYX934 z=goQF-wCut@cLPI4gPOpL}%!IyRo1|S}c<(R6My=B8yX9aQi7z~Xj*UnTR*I{t2g;pv($#xJlh@Q*hfp?L!OYpe|^qGbI{Fb6*8lIfG|bsu!>26;)wv9 z=Iwu%(#T5W4=;x3>0Yu%!|Jz%o=tRjt5d#CQNP#UZK`j?Qjq;8u(T>Z&&Khl!n+)I z{sWSLv80hxt3tGOxEemprY_)I>yJEumW6Q6M8kVxcA!_}TEgn+gqU^-m;}@GdX(~| zx|ocoTsKjq|KmR_?U7%BwA6xnB0B-MBXXXK*aURKykAKd9KH`zr=11_6hM~~*Hpr}^p2hjQ4yNgZE_K#KkmiFr2s%iaeErKhM_#wPRg`#U_d*{f;*TSy z<)r6$sBcE1C#m>fzjV*hzQYpwNHQ?_vcUhYkz{~6_}>$-z)u#T-ATi=ZODcInsKAmy4))_|kUc zSuPl1MOyW2kNmnxR7S)0J8bU{!Uza6&VRsdhA`s|Ln96Ur=86oY1Rh^u;TF}r2Z$H z-B<>uTU-~_G#zES(>V^ApBzZqKUi=?CG15*w87`BcqG6`-LHN07^k{vFCJ#Z z)HPy=WCD*+yPki&l)-%Rn&>M@7UBb4?v4I`|MR4H?9HTcFfJqO-QSa8G)W>B(bhRQ zeAi$uBgOLid}Uv1O-(q;jMnsmx%n1L=av*VmwwHAd$>YO_xIav%=c8Yh}~ZAUuM-e zC$;lBR+mfeT;{;+h_BG{P?Zg=C$Ev&#C@%QV$bW1)!7I3{UM(NV~cmy--b37DSuUE zrXLVAG1&0OU0%}`a{h0i(*Vm+UCI32d}k|ly+4`FQTkY%`X4428=vDg?_YV@6*V=6 zrOC8$XjFFm%+4EINcXys7IlB;peLUa^Z7|^V~)o+X3hf3{Ia%~1?v{VjG{}~^4kh; zGsDson!+b~djQ^Qr

    SXGNmtZ7bw)SM=kv1eOvZ7YR#y?y544vK)FFm&)Hvlh>c` z*J;L~B~e{Ww9RU2bJONxytmf&jRlDwSmS&&=JdI7(N^1MVJbAJ=>EhX%vAa`G$xJ+}L5uMk$@Icl_4j|kh$ z^$Qt{_@p}bDb6MQpjFv=;8Ah=zKLoL&*HE7<8I^+oj-0k#75*?$zEnfM%4m)=2p0u znURPvP)&^hg(#St6-6Nbm31zbY+~jCE56*@xe-w|Kb$StPGctAprBA;(PB3OMJOgD zEEe_kjmB62Z@CPXSG;pVrS_8fV{{J4d;l4!S~;_^i}w=}Zs@kl`>zjXi7#irMksRN z{Re!oA_sxi|4+wV#z7zl6T1q&;vf))4P?dv=P?tIfk6>im|#Or0vTuYt09GKMqDJBR1Wg>tB>vP~?U=l(7Kh_XL%7OR4Efcs1lwncV z@W5A01f*aN_WzRK{;zA|_ 0) { await withTimeout(run, timeoutMs, "run_playwright"); } else { @@ -980,14 +980,14 @@ async function commandRunPlaywright(params = {}) { } function normalizeCrxApplication(app) { - if (app && typeof app.attach === "function" && typeof crxRunFunction(app) === "function") { + if (app && typeof app.attach === "function" && typeof crxRunner(app).run === "function") { return app; } if ( app && app.crxApplication && typeof app.crxApplication.attach === "function" && - typeof crxRunFunction(app.crxApplication) === "function" + typeof crxRunner(app.crxApplication).run === "function" ) { return app.crxApplication; } @@ -995,27 +995,27 @@ function normalizeCrxApplication(app) { app && app._object && typeof app._object.attach === "function" && - typeof crxRunFunction(app._object) === "function" + typeof crxRunner(app._object).run === "function" ) { return app._object; } return app; } -function crxRunFunction(app) { +function crxRunner(app) { if (!app || typeof app !== "object") { - return null; + return { run: null, acceptsPage: false }; } if (typeof app.run === "function") { - return app.run.bind(app); + return { run: app.run.bind(app), acceptsPage: true }; } if (app.recorder && typeof app.recorder.run === "function") { - return app.recorder.run.bind(app.recorder); + return { run: app.recorder.run.bind(app.recorder), acceptsPage: false }; } if (app._object) { - return crxRunFunction(app._object); + return crxRunner(app._object); } - return null; + return { run: null, acceptsPage: false }; } function describeCrxApplication(app) { diff --git a/extension/edge-share-crx/manifest.json b/extension/edge-share-crx/manifest.json index 8d9ab62..bdf1920 100644 --- a/extension/edge-share-crx/manifest.json +++ b/extension/edge-share-crx/manifest.json @@ -1,6 +1,6 @@ { "name": "Browser Connection Playwright CRX", - "version": "0.15.1", + "version": "0.15.2", "description": "Playwright CRX recorder integrated with browser-connection relay sharing.", "manifest_version": 3, "icons": {