about-system 0.10.15 → 0.10.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-info-api-fNqdECMN.js","sources":["../src/cache/cache-config.ts","../src/utils/network.ts","../src/cache/cache.ts","../__vite-browser-external","../src/info/settings.ts","../src/utils/platform.ts","../src/utils/command.ts","../src/info/platform.ts","../src/info/hardware-bench.test.ts?url","../src/info/hardware-probes.test.ts?url","../src/info/hardware.test.ts?url","../src/info/memory.test.ts?url","../src/info/memory.ts?url","../src/info/network.test.ts?url","../src/info/network.ts?url","../src/info/platform-os.test.ts?url","../src/info/platform.test.ts?url","../src/info/platform.ts?url","../src/info/process.test.ts?url","../src/info/process.ts?url","../src/info/settings.test.ts?url","../src/info/settings.ts?url","../src/info/software.test.ts?url","../src/info/software.ts?url","../src/info/system-status.test.ts?url","../src/info/system-status.ts?url","../node_modules/fuse.js/dist/fuse.mjs","../src/info/hardware.ts","../src/info/memory.ts","../src/info/process.ts","../src/info/network.ts","../src/info/system-status.ts","../src/info/software.ts","../src/system-info-api.ts"],"sourcesContent":["/**\n * Cache configuration and constants\n * @module cache-config\n */\n\nimport os from \"os\";\nimport path from \"path\";\n\n/**\n * Cache file location in system's temporary directory\n * @constant\n */\nexport const CACHE_FILE = path.join(os.tmpdir(), \"systeminfo-cache.json\");\n\n/**\n * Cache duration configuration for different system information types\n * Values are in milliseconds\n *\n * @constant\n * @property {number} ipInfo - Public IP / city / ISP lookup (10 minutes)\n * @property {number} cpu - CPU information cache (24 hours)\n * @property {number} gpu - GPU information cache (24 hours)\n * @property {number} os - OS information cache (24 hours)\n * @property {number} device - Device information cache (24 hours)\n * @property {number} kernel - Kernel information cache (1 hour)\n * @property {number} pacman - Package managers cache (10 minutes)\n * @property {number} ports - Open ports cache (5 minutes)\n * @property {number} containers - Docker containers cache (5 minutes)\n * @property {number} top_process - Top process cache (5 seconds)\n * @property {number} disk_used - Disk usage cache (1 minute)\n * @property {number} ram_used - RAM usage cache (10 seconds)\n * @property {number} services_running - Services cache (5 minutes)\n * @property {number} temperature - Temperature cache (30 seconds)\n * @property {number} battery - Battery status cache (1 minute)\n * @property {number} network_interfaces - Network interfaces cache (5 minutes)\n * @property {number} mount_points - Mount points cache (10 minutes)\n */\nexport const CACHE_DURATION = {\n ipInfo: 10 * 60 * 1000,\n cpu: 24 * 60 * 60 * 1000,\n gpu: 24 * 60 * 60 * 1000,\n os: 24 * 60 * 60 * 1000,\n device: 24 * 60 * 60 * 1000,\n kernel: 60 * 60 * 1000,\n pacman: 10 * 60 * 1000,\n ports: 5 * 60 * 1000,\n containers: 5 * 60 * 1000,\n top_process: 5 * 1000,\n disk_used: 60 * 1000,\n ram_used: 10 * 1000,\n services_running: 5 * 60 * 1000,\n temperature: 30 * 1000,\n battery: 60 * 1000,\n network_interfaces: 5 * 60 * 1000,\n mount_points: 10 * 60 * 1000,\n};\n\n/**\n * Default IPInfo.io API token for geolocation\n * @constant\n */\nexport const DEFAULT_IPINFO_TOKEN = \"da2d6cc4baa5d1\";\n\n/**\n * Default network request timeout in milliseconds\n * @constant\n */\nexport const DEFAULT_NETWORK_TIMEOUT = 3000;\n","/**\n * Network utilities for IP information fetching\n * @module network\n */\n\nimport http from \"http\";\nimport https from \"https\";\nimport {\n DEFAULT_IPINFO_TOKEN,\n DEFAULT_NETWORK_TIMEOUT,\n} from \"../cache/cache-config\";\n\n/**\n * IP information from ipinfo.io API\n * @interface IPInfo\n */\nexport interface IPInfo {\n /** Public IP address */\n ip?: string;\n /** City location */\n city?: string;\n /** Reverse DNS hostname */\n hostname?: string;\n /** ISP organization string (includes AS number) */\n org?: string;\n}\n\n/**\n * IP information from ip-api.com (fallback)\n * @interface IPAPIInfo\n */\ninterface IPAPIInfo {\n status?: string;\n query?: string;\n city?: string;\n isp?: string;\n org?: string;\n as?: string;\n}\n\n/**\n * GETs a URL and parses the body as JSON. Never rejects: resolves `null` on\n * any error, on abort, or once `timeout` ms have passed in total — a hard\n * deadline for the whole request, not a socket-idle timeout.\n */\nfunction getJSON(\n url: string,\n timeout: number,\n signal?: AbortSignal\n): Promise<any> {\n return new Promise((resolve) => {\n if (signal?.aborted) return resolve(null);\n\n let settled = false;\n let req: http.ClientRequest | undefined;\n const finish = (value: any) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n resolve(value);\n };\n const onAbort = () => {\n req?.destroy();\n finish(null);\n };\n const timer = setTimeout(onAbort, timeout);\n signal?.addEventListener(\"abort\", onAbort);\n\n try {\n const get = url.startsWith(\"https:\") ? https.get : http.get;\n req = get(url, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk));\n res.on(\"end\", () => {\n try {\n finish(JSON.parse(data));\n } catch {\n finish(null);\n }\n });\n res.on(\"error\", () => finish(null));\n });\n req.on(\"error\", () => finish(null));\n } catch {\n finish(null);\n }\n });\n}\n\n/**\n * Fetches IP information for this machine from the ipinfo.io lite API\n * @param {string} token - IPInfo.io API token\n * @param {number} timeout - Total request deadline in milliseconds\n * @param {AbortSignal} signal - Abandons the request when aborted\n * @returns {Promise<IPInfo>} IP information object or empty object on error\n */\nexport async function fetchFromIPInfo(\n token: string = DEFAULT_IPINFO_TOKEN,\n timeout: number = DEFAULT_NETWORK_TIMEOUT,\n signal?: AbortSignal\n): Promise<IPInfo> {\n const parsed = await getJSON(\n `https://api.ipinfo.io/lite/me?token=${token}`,\n timeout,\n signal\n );\n if (!parsed || typeof parsed !== \"object\") return {};\n // ipinfo lite returns { ip, asn, as_name, country, ... } — no city.\n const org =\n parsed.org ?? (parsed.asn && parsed.as_name ? `${parsed.asn} ${parsed.as_name}` : undefined);\n return {\n ip: parsed.ip,\n city: parsed.city,\n hostname: parsed.hostname,\n org,\n };\n}\n\n/**\n * Fetches IP geolocation information from ip-api.com (fallback). The free\n * tier is plain HTTP only.\n * @param {number} timeout - Total request deadline in milliseconds\n * @param {AbortSignal} signal - Abandons the request when aborted\n * @returns {Promise<IPInfo>} IP information object or empty object on error\n */\nexport async function fetchFromIPAPI(\n timeout: number = DEFAULT_NETWORK_TIMEOUT,\n signal?: AbortSignal\n): Promise<IPInfo> {\n const parsed: IPAPIInfo | null = await getJSON(\n \"http://ip-api.com/json/?fields=status,message,query,city,isp,org,as\",\n timeout,\n signal\n );\n if (!parsed || parsed.status !== \"success\") return {};\n return {\n ip: parsed.query,\n city: parsed.city,\n hostname: undefined,\n org: parsed.org || parsed.isp || parsed.as,\n };\n}\n\n/**\n * Fetches IP information from ipinfo.io and ip-api.com in parallel and merges\n * them: ipinfo.io wins per field, ip-api.com fills the gaps (ipinfo lite has\n * no city). Both requests share the same deadline, so this never takes longer\n * than `timeout`.\n * @param {string} token - IPInfo.io API token\n * @param {number} timeout - Total deadline in milliseconds\n * @param {AbortSignal} signal - Abandons both requests when aborted\n * @returns {Promise<IPInfo>} IP information object or empty object on error\n */\nexport async function fetchIPInfo(\n token: string = DEFAULT_IPINFO_TOKEN,\n timeout: number = DEFAULT_NETWORK_TIMEOUT,\n signal?: AbortSignal\n): Promise<IPInfo> {\n const [ipinfo, ipapi] = await Promise.all([\n fetchFromIPInfo(token, timeout, signal),\n fetchFromIPAPI(timeout, signal),\n ]);\n\n const merged: IPInfo = {};\n for (const source of [ipapi, ipinfo]) {\n for (const [key, value] of Object.entries(source)) {\n if (value) merged[key as keyof IPInfo] = value;\n }\n }\n // ipinfo answers over IPv6 when the machine has it; the short IPv4 address\n // reads better in a one-line greeting, so keep ip-api's when it has one.\n if (merged.ip?.includes(\":\") && ipapi.ip && !ipapi.ip.includes(\":\")) {\n merged.ip = ipapi.ip;\n }\n return merged;\n}\n","/**\n * Cache management utilities\n * @module cache\n */\n\nimport fs from \"fs\";\nimport { CACHE_FILE, CACHE_DURATION } from \"./cache-config\";\n\n/**\n * Represents a cached value with timestamp\n * @interface CacheEntry\n */\nexport interface CacheEntry {\n /** The cached value */\n value: any;\n /** Unix timestamp when the value was cached */\n timestamp: number;\n}\n\n/**\n * Cache storage structure\n * @interface Cache\n */\nexport interface Cache {\n [key: string]: CacheEntry;\n}\n\n/**\n * Loads cache from disk\n * @returns {Cache} Cached data or empty object if cache doesn't exist or is corrupted\n */\nexport function loadCache(): Cache {\n try {\n if (fs.existsSync(CACHE_FILE)) {\n return JSON.parse(fs.readFileSync(CACHE_FILE, \"utf8\"));\n }\n } catch (error) {\n // Corrupted cache - return empty object\n }\n return {};\n}\n\n/**\n * Saves cache to disk\n * @param {Cache} cache - Cache object to save\n */\nexport function saveCache(cache: Cache): void {\n try {\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch (error) {\n // Silently fail if can't write cache\n }\n}\n\n/**\n * Checks if a cache entry is still valid based on configured duration\n * @param {CacheEntry} cacheEntry - The cache entry to validate\n * @param {string} key - The key name to determine cache duration\n * @returns {boolean} True if cache is still valid\n */\nexport function isCacheValid(cacheEntry: CacheEntry, key: string): boolean {\n if (!cacheEntry || !cacheEntry.timestamp) return false;\n const age = Date.now() - cacheEntry.timestamp;\n const maxAge = CACHE_DURATION[key as keyof typeof CACHE_DURATION] || 60000;\n return age < maxAge;\n}\n\n/**\n * Retrieves a value from cache if valid\n * @param {Cache} cache - Cache object\n * @param {string} key - Key to retrieve\n * @returns {any} Cached value or null if not found/expired\n */\nexport function getCachedValue(cache: Cache, key: string): any {\n if (!cache[key]) return null;\n const cacheEntry = cache[key];\n if (!isCacheValid(cacheEntry, key)) {\n delete cache[key];\n return null;\n }\n return cacheEntry.value;\n}\n\n/**\n * Stores a value in cache with current timestamp\n * @param {Cache} cache - Cache object\n * @param {string} key - Key to store under\n * @param {any} value - Value to cache\n */\nexport function setCachedValue(cache: Cache, key: string, value: any): void {\n cache[key] = {\n value,\n timestamp: Date.now(),\n };\n}\n","export default {}","/**\n * Settings configuration and management\n * @module info/settings\n */\n\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport process from \"process\";\n\n// Settings file paths\nexport const SETTINGS_FILE = path.join(\n os.homedir(),\n \".config\",\n \"systeminfo-settings.json\",\n);\nexport const CACHE_FILE = path.join(os.tmpdir(), \"systeminfo-cache.json\");\n\n// Color codes\n//\n// These are deliberately darker/more saturated than a typical terminal\n// palette. The original bright variants (e.g. yellow 226, cyan 51, gray 250)\n// have very high luminance and are nearly unreadable on a light/white\n// terminal background. `lightblue` was also mislabeled: it pointed at gold\n// (220), not a blue at all. Every value below reads clearly on both light\n// and dark backgrounds.\nexport const colors = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[38;5;160m\",\n orange: \"\\x1b[38;5;130m\",\n yellow: \"\\x1b[38;5;58m\",\n green: \"\\x1b[38;5;22m\",\n blue: \"\\x1b[38;5;25m\",\n cyan: \"\\x1b[38;5;23m\",\n purple: \"\\x1b[38;5;91m\",\n magenta: \"\\x1b[38;5;125m\",\n gray: \"\\x1b[38;5;238m\",\n lightblue: \"\\x1b[38;5;24m\",\n};\n\n// Background variants, keyed the same as `colors`, used when\n// `display.show_backgrounds` is enabled. Each entry sets its own background\n// block plus a foreground text color chosen for contrast against it, so\n// every item is legible on its own regardless of what the terminal's\n// background actually is.\nexport const backgrounds = {\n red: \"\\x1b[48;5;88m\\x1b[38;5;255m\",\n orange: \"\\x1b[48;5;166m\\x1b[38;5;232m\",\n yellow: \"\\x1b[48;5;178m\\x1b[38;5;232m\",\n green: \"\\x1b[48;5;22m\\x1b[38;5;255m\",\n blue: \"\\x1b[48;5;18m\\x1b[38;5;255m\",\n cyan: \"\\x1b[48;5;23m\\x1b[38;5;255m\",\n purple: \"\\x1b[48;5;54m\\x1b[38;5;255m\",\n magenta: \"\\x1b[48;5;53m\\x1b[38;5;255m\",\n gray: \"\\x1b[48;5;236m\\x1b[38;5;255m\",\n lightblue: \"\\x1b[48;5;26m\\x1b[38;5;255m\",\n};\n\n// Default settings\nexport const DEFAULT_SETTINGS = {\n display_order: [\n [\n \"user\",\n \"hostname\",\n \"os\",\n \"device\",\n \"kernel\",\n \"cpu\",\n \"bench\",\n \"gpu\",\n \"gpu_bench\",\n ],\n [\n \"disk_used\",\n \"disk_size\",\n \"ram_used\",\n \"top_process\",\n \"uptime\",\n \"temperature\",\n \"battery\",\n \"load_average\",\n ],\n [\"ip\", \"iplocal\", \"city\"],\n [\"shell\", \"services_running\", \"pacman\", \"containers\"],\n ],\n colors: {\n user: \"red\",\n hostname: \"orange\",\n disk_used: \"purple\",\n disk_size: \"purple\",\n ram_used: \"yellow\",\n top_process: \"magenta\",\n uptime: \"cyan\",\n ip: \"green\",\n iplocal: \"yellow\",\n city: \"green\",\n domain: \"gray\",\n isp: \"lightblue\",\n os: \"gray\",\n cpu: \"orange\",\n gpu: \"yellow\",\n bench: \"red\",\n gpu_bench: \"red\",\n device: \"yellow\",\n kernel: \"green\",\n shell: \"orange\",\n pacman: \"multicolor\",\n ports: \"multicolor\",\n containers: \"green\",\n memory_available: \"blue\",\n swap_used: \"purple\",\n load_average: \"red\",\n users_logged_in: \"cyan\",\n network_interfaces: \"yellow\",\n mount_points: \"gray\",\n services_running: \"green\",\n temperature: \"red\",\n battery: \"green\",\n screen_resolution: \"blue\",\n },\n emojis: {\n user: \"👤 \",\n hostname: \"🏠 \",\n ip: \"🌎 \",\n iplocal: \"🌐 \",\n city: \"📍 \",\n domain: \"🔗 \",\n isp: \"👮 \",\n os: \"⚡ \",\n cpu: \"📈 \",\n gpu: \"🎮 \",\n bench: \"💪 \",\n gpu_bench: \"🏎️ \",\n device: \"💻 \",\n kernel: \"🔧 \",\n shell: \"🐚 \",\n pacman: \"🚀 \",\n disk_used: \"📁 \",\n disk_size: \"💽 \",\n ram_used: \"💾 \",\n top_process: \"🔝 \",\n uptime: \"⏱️ \",\n ports: \"🔌 \",\n containers: \"📦 \",\n memory_available: \"🧠 \",\n swap_used: \"🔄 \",\n load_average: \"⚖️ \",\n users_logged_in: \"👥 \",\n network_interfaces: \"🌐 \",\n mount_points: \"📂 \",\n services_running: \"⚙️ \",\n temperature: \"🌡️ \",\n battery_charging: \"🔌 \",\n battery: \"🔋 \",\n screen_resolution: \"🖥️ \",\n },\n labels: {\n user: \"User\",\n hostname: \"Host\",\n ip: \"IP\",\n iplocal: \"Local IP\",\n city: \"City\",\n domain: \"Domain\",\n isp: \"ISP\",\n os: \"OS\",\n cpu: \"CPU\",\n gpu: \"GPU\",\n bench: \"Bench\",\n gpu_bench: \"GPU Bench\",\n device: \"Device\",\n kernel: \"Kernel\",\n shell: \"Shell\",\n pacman: \"Packages\",\n disk_used: \"Disk\",\n disk_size: \"Disk Size\",\n ram_used: \"RAM\",\n top_process: \"Top\",\n uptime: \"Uptime\",\n ports: \"Ports\",\n containers: \"Containers\",\n memory_available: \"Memory\",\n swap_used: \"Swap\",\n load_average: \"Load\",\n users_logged_in: \"Users\",\n network_interfaces: \"Network\",\n mount_points: \"Mounts\",\n services_running: \"Services\",\n temperature: \"Temp\",\n battery_charging: \"Battery\",\n battery: \"Battery\",\n screen_resolution: \"Resolution\",\n },\n display: {\n show_emojis: true,\n show_backgrounds: true,\n single_line: true,\n line_wrap_length: process?.stdout?.columns || 100,\n },\n network: {\n show_offline_message: true,\n },\n advanced: {\n debug: false,\n },\n};\n\nexport interface Settings {\n display_order: string[][];\n colors: Record<string, string>;\n emojis: Record<string, string>;\n labels: Record<string, string>;\n display: {\n show_emojis: boolean;\n /** true (default): give every item its own background color block, so it stays legible regardless of the terminal's background */\n show_backgrounds: boolean;\n /** true: print one continuous line and let the terminal soft-wrap it; false: hard-wrap at line_wrap_length */\n single_line: boolean;\n line_wrap_length: number;\n };\n network: {\n show_offline_message: boolean;\n };\n advanced: {\n debug: boolean;\n };\n}\n\n/**\n * Loads settings from the configuration file\n * @returns Settings object (defaults merged with user settings)\n */\nexport function loadSettings(): Settings {\n try {\n if (fs.existsSync(SETTINGS_FILE)) {\n const settings = JSON.parse(fs.readFileSync(SETTINGS_FILE, \"utf8\"));\n return { ...DEFAULT_SETTINGS, ...settings };\n }\n } catch {}\n return DEFAULT_SETTINGS;\n}\n\n/**\n * Saves settings to the configuration file\n * @param settings - The settings object to save\n * @returns True if successful, false otherwise\n */\nexport function saveSettings(settings: Settings): boolean {\n try {\n const configDir = path.dirname(SETTINGS_FILE);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n fs.writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 2));\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Platform detection utilities\n * @module platform\n */\n\nimport os from \"os\";\n\n/**\n * Platform detection constants\n */\nexport const IS_WINDOWS = os.platform() === \"win32\";\nexport const IS_MAC = os.platform() === \"darwin\";\nexport const IS_LINUX = os.platform() === \"linux\";\n","/**\n * Command execution utilities\n * @module command\n */\n\nimport { execSync } from \"child_process\";\nimport { IS_WINDOWS } from \"./platform\";\n\n/**\n * Executes a shell command safely with timeout\n * @param {string} command - Command to execute\n * @param {object} options - Additional options for execSync\n * @returns {string} Command output or empty string on error\n */\nexport function execCommand(command: string, options = {}): string {\n try {\n const cmd = IS_WINDOWS ? `cmd /c ${command}` : command;\n return execSync(cmd, {\n encoding: \"utf8\",\n timeout: 10000,\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n ...options,\n })\n .toString()\n .trim();\n } catch (error) {\n return \"\";\n }\n}\n\n/**\n * Checks if a command exists in the system PATH\n * @param {string} command - Command name to check\n * @returns {boolean} True if command exists\n */\nexport function commandExists(command: string): boolean {\n try {\n if (IS_WINDOWS) {\n execSync(`where ${command}`, { stdio: \"ignore\" });\n } else {\n execSync(`which ${command}`, { stdio: \"ignore\" });\n }\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Platform-related system information functions\n * @module info/platform\n */\n\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_WINDOWS, IS_MAC, IS_LINUX } from \"../utils/platform\";\nimport { execCommand, commandExists } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\n\n/**\n * Gets the current username\n * @returns Current system username\n */\nexport function user(): string {\n return os.userInfo().username;\n}\n\n/**\n * Gets the system hostname\n * @returns Computer hostname/network name\n */\nexport function hostname(): string {\n return os.hostname();\n}\n\n/**\n * Gets operating system name and version\n * Platform-specific detection for Windows, macOS, and Linux\n * @param context - Info context with cache\n * @returns OS name and version string\n * @example \"Windows 11 Pro\", \"macOS Ventura 13.2.1\", \"Ubuntu 22.04.3 LTS\"\n */\nexport function os_info(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"os\");\n if (cached) return cached;\n\n const platform = os.platform();\n const release = os.release();\n let osName = \"\";\n\n if (IS_WINDOWS) {\n try {\n const version = execCommand(\"ver\");\n const match = version.match(/Microsoft Windows \\[Version ([^\\]]+)\\]/);\n osName = match ? `Windows ${match[1]}` : `Windows ${release}`;\n } catch {\n osName = `Windows ${release}`;\n }\n } else if (IS_MAC) {\n const productName = execCommand(\"sw_vers -productName\");\n const productVersion = execCommand(\"sw_vers -productVersion\");\n osName =\n productName && productVersion\n ? `${productName} ${productVersion}`\n : `macOS ${release}`;\n } else if (IS_LINUX) {\n try {\n const osRelease = fs.readFileSync(\"/etc/os-release\", \"utf8\");\n const nameMatch = osRelease.match(/^NAME=\"([^\"]+)\"/m);\n const versionMatch = osRelease.match(/^VERSION_ID=\"([^\"]+)\"/m);\n osName = nameMatch ? nameMatch[1] : \"Linux\";\n if (versionMatch) osName += ` ${versionMatch[1]}`;\n } catch {\n osName = `Linux ${release}`;\n }\n } else {\n osName = `${platform} ${release}`;\n }\n\n setCachedValue(context.cache, \"os\", osName);\n return osName;\n}\n\n/**\n * Gets kernel version string\n * Returns the operating system kernel version from os.release()\n * @param context - Info context with cache\n * @returns Kernel version string\n * @example \"5.15.0-56-generic\", \"6.11.11-valve12-1-neptune\"\n */\nexport function kernel(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"kernel\");\n if (cached) return cached;\n\n const kernel = os.release();\n setCachedValue(context.cache, \"kernel\", kernel);\n return kernel;\n}\n\n/**\n * Gets device or computer model name\n * Uses WMI on Windows, DMI on Linux, getprop on Android\n * @param context - Info context with cache\n * @returns Device model name or empty string\n * @example \"Dell OptiPlex 7090\", \"MacBook Pro 16-inch\", \"Valve Steam Deck\"\n */\nexport function device(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"device\");\n if (cached !== null) return cached;\n\n if (IS_WINDOWS) {\n try {\n const wmic = execCommand(\"wmic csproduct get name /format:list\");\n const nameMatch = wmic.match(/Name=(.+)/);\n if (nameMatch) {\n const device = nameMatch[1].trim();\n if (device && device !== \"\") {\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n }\n } catch {}\n\n try {\n const ps = execCommand(\n 'powershell.exe -Command \"Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty Model\"'\n );\n if (ps.trim()) {\n const device = ps.trim();\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n } catch {}\n } else if (IS_MAC) {\n const profile = execCommand(\"system_profiler SPHardwareDataType\");\n const nameMatch = profile.match(/Model Name:\\s*(.+)/);\n if (nameMatch) {\n const device = nameMatch[1].trim();\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n } else if (IS_LINUX) {\n try {\n if (commandExists(\"getprop\")) {\n const device = execCommand(\"getprop ro.product.model\");\n if (device) {\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n }\n\n const dmiPath = \"/sys/devices/virtual/dmi/id/product_name\";\n if (fs.existsSync(dmiPath)) {\n const device = fs.readFileSync(dmiPath, \"utf8\").trim();\n if (device) {\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"device\", \"\");\n return \"\";\n}\n","export default \"data:video/mp2t;base64,LyoqCiAqIEBmaWxlb3ZlcnZpZXcgVGhlIGZvdXIgR2Vla2JlbmNoIGxvb2t1cHMgc2hhcmUgYSB0YWJsZSBmb3JtYXQKICogKGBbbmFtZSwgc2NvcmUsIHJhbmtdW11gKSBhbmQgYSBmdXp6eSBtYXRjaGVyLCBzbyB0aGV5J3JlIGRyaXZlbiBoZXJlIHdpdGggYQogKiBzbWFsbCBmaXh0dXJlIHJhdGhlciB0aGFuIHRoZSBtdWx0aS1tZWdhYnl0ZSByZWFsIHRhYmxlcy4KICovCmltcG9ydCB7IGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gInZpdGVzdCI7Cgp2aS5tb2NrKCIuLi91dGlscy9wbGF0Zm9ybSIsICgpID0+ICh7IElTX0xJTlVYOiB0cnVlLCBJU19NQUM6IGZhbHNlLCBJU19XSU5ET1dTOiBmYWxzZSB9KSk7Cgpjb25zdCBleGVjQ29tbWFuZCA9IHZpLmhvaXN0ZWQoKCkgPT4gdmkuZm4oKSk7CnZpLm1vY2soIi4uL3V0aWxzL2NvbW1hbmQiLCAoKSA9PiAoeyBleGVjQ29tbWFuZCwgY29tbWFuZEV4aXN0czogdmkuZm4oKSB9KSk7Cgpjb25zdCBmaWxlcyA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICBleGlzdGluZzogbmV3IFNldDxzdHJpbmc+KCksCiAgZGF0YToge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiwKfSkpOwpjb25zdCBmc01vY2sgPSB2aS5ob2lzdGVkKCgpID0+ICh7CiAgZXhpc3RzU3luYzogdmkuZm4oKHA6IHN0cmluZykgPT4gZmlsZXMuZXhpc3RpbmcuaGFzKHApKSwKICByZWFkRmlsZVN5bmM6IHZpLmZuKChwOiBzdHJpbmcpID0+IHsKICAgIGlmICghKHAgaW4gZmlsZXMuZGF0YSkpIHRocm93IG5ldyBFcnJvcigiRU5PRU5UIik7CiAgICByZXR1cm4gZmlsZXMuZGF0YVtwXTsKICB9KSwKICB3cml0ZUZpbGVTeW5jOiB2aS5mbigpLAp9KSk7CnZpLm1vY2soImZzIiwgKCkgPT4gKHsgLi4uZnNNb2NrLCBkZWZhdWx0OiBmc01vY2sgfSkpOwoKdmkubW9jaygib3MiLCAoKSA9PiB7CiAgY29uc3QgYXBpID0geyB0bXBkaXI6ICgpID0+ICIvdG1wIiwgY3B1czogKCkgPT4gW10sIHBsYXRmb3JtOiAoKSA9PiAibGludXgiIH07CiAgcmV0dXJuIHsgLi4uYXBpLCBkZWZhdWx0OiBhcGkgfTsKfSk7Cgpjb25zdCBoID0gYXdhaXQgaW1wb3J0KCIuL2hhcmR3YXJlIik7CmltcG9ydCB0eXBlIHsgSW5mb0NvbnRleHQgfSBmcm9tICIuLi90eXBlcy9pbnRlcm5hbC10eXBlcyI7Cgpjb25zdCBDUFVfVEFCTEUgPSB7CiAgc2NvcmVzOiBbCiAgICBbIkFNRCBSeXplbiA5IDc5NTBYIiwgMzAwMCwgMV0sCiAgICBbIkludGVsIENvcmUgaTktMTM5MDBLIiwgMjkwMCwgMl0sCiAgICBbIkFwcGxlIE0yIFBybyIsIDI3MDAsIDNdLAogICAgWyJRdWFsY29tbSBTbmFwZHJhZ29uIFggRWxpdGUiLCAyNTAwLCA0XSwKICAgIFsiQU1EIEVQWUMgNzc2MyIsIDI0MDAsIDVdLAogICAgWyJNeXN0ZXJ5IENoaXAgOTAwMCIsIDEwMDAsIDZdLAogIF0sCn07CmNvbnN0IEdQVV9UQUJMRSA9IHsKICBzY29yZXM6IFsKICAgIFsiTlZJRElBIEdlRm9yY2UgUlRYIDQwOTAiLCAzMDAwMDAsIDFdLAogICAgWyJBTUQgUmFkZW9uIFJYIDc5MDAgWFRYIiwgMjAwMDAwLCAyXSwKICAgIFsiSW50ZWwgQXJjIEE3NzAiLCAxMDAwMDAsIDNdLAogICAgWyJPYnNjdXJlIEFjY2VsZXJhdG9yIiwgNTAwMDAsIDRdLAogIF0sCn07Cgpjb25zdCBjdHggPSAoY2FjaGU6IEluZm9Db250ZXh0WyJjYWNoZSJdID0ge30pOiBJbmZvQ29udGV4dCA9PiAoeyBjYWNoZSB9KTsKCi8qKiBNYWtlIGBjcHUoKWAvYGdwdSgpYCByZXNvbHZlIHRvIGEgbmFtZSB2aWEgdGhlIChtb2NrZWQpIHNoZWxsIHRvb2xzLiAqLwpjb25zdCByZXNvbHZlQ3B1ID0gKG5hbWU6IHN0cmluZykgPT4KICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4gKGMgPT09ICJsc2NwdSIgPyBgTW9kZWwgbmFtZTogJHtuYW1lfWAgOiAiIikpOwpjb25zdCByZXNvbHZlR3B1ID0gKG5hbWU6IHN0cmluZykgPT4KICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4KICAgIGMgPT09ICJsc3BjaSIgPyBgMDE6MDAuMCBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyOiBOVklESUEgWyR7bmFtZX1dYCA6ICIiLAogICk7CgpiZWZvcmVFYWNoKCgpID0+IHsKICBmaWxlcy5leGlzdGluZyA9IG5ldyBTZXQoWyJjcHUtZ2Vla2JlbmNoLmpzb24iLCAiZ3B1LWdlZWtiZW5jaC5qc29uIl0pOwogIGZpbGVzLmRhdGEgPSB7CiAgICAiY3B1LWdlZWtiZW5jaC5qc29uIjogSlNPTi5zdHJpbmdpZnkoQ1BVX1RBQkxFKSwKICAgICJncHUtZ2Vla2JlbmNoLmpzb24iOiBKU09OLnN0cmluZ2lmeShHUFVfVEFCTEUpLAogIH07CiAgZXhlY0NvbW1hbmQubW9ja1Jlc2V0KCkubW9ja1JldHVyblZhbHVlKCIiKTsKfSk7CgpkZXNjcmliZSgiYmVuY2ggKENQVSkiLCAoKSA9PiB7CiAgaXQoImZvcm1hdHMgc2NvcmUsIHJhbmsgYW5kIHBlcmNlbnRpbGUgZm9yIHRoZSBmdXp6eS1tYXRjaGVkIENQVSIsICgpID0+IHsKICAgIHJlc29sdmVDcHUoIkFNRCBSeXplbiA5IDc5NTBYIik7CiAgICBleHBlY3QoaC5iZW5jaChjdHgoKSkpLnRvQmUoIjNrICMxIFRvcCAxJSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aCBubyBDUFUgbmFtZSBvciBubyBmdXp6eSBtYXRjaCIsICgpID0+IHsKICAgIGV4cGVjdChoLmJlbmNoKGN0eCgpKSkudG9CZSgiIik7CiAgICByZXNvbHZlQ3B1KCJ6enp6enp6enp6enogcXFxcXFxcXEiKTsKICAgIGV4cGVjdChoLmJlbmNoKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSB3aGVuIHRoZSBiZW5jaG1hcmsgZmlsZSBpcyB1bnJlYWRhYmxlIG9yIG1hbGZvcm1lZCIsICgpID0+IHsKICAgIHJlc29sdmVDcHUoIkFNRCBSeXplbiA5IDc5NTBYIik7CiAgICBmaWxlcy5kYXRhWyJjcHUtZ2Vla2JlbmNoLmpzb24iXSA9ICJ7bm90IGpzb24iOwogICAgZXhwZWN0KGguYmVuY2goY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoImZpbmRzIHRoZSB0YWJsZSB1bmRlciBzcmMvYmVuY2ggb3IgLi9iZW5jaCB3aGVuIG5vdCBpbiB0aGUgY3dkIiwgKCkgPT4gewogICAgcmVzb2x2ZUNwdSgiQU1EIFJ5emVuIDkgNzk1MFgiKTsKICAgIGZpbGVzLmV4aXN0aW5nID0gbmV3IFNldChbInNyYy9iZW5jaC9jcHUtZ2Vla2JlbmNoLmpzb24iXSk7CiAgICBmaWxlcy5kYXRhID0geyAic3JjL2JlbmNoL2NwdS1nZWVrYmVuY2guanNvbiI6IEpTT04uc3RyaW5naWZ5KENQVV9UQUJMRSkgfTsKICAgIGV4cGVjdChoLmJlbmNoKGN0eCgpKSkudG9CZSgiM2sgIzEgVG9wIDElIik7CgogICAgZmlsZXMuZXhpc3RpbmcgPSBuZXcgU2V0KFsiLi9iZW5jaC9jcHUtZ2Vla2JlbmNoLmpzb24iXSk7CiAgICBmaWxlcy5kYXRhID0geyAiLi9iZW5jaC9jcHUtZ2Vla2JlbmNoLmpzb24iOiBKU09OLnN0cmluZ2lmeShDUFVfVEFCTEUpIH07CiAgICBleHBlY3QoaC5iZW5jaChjdHgoKSkpLnRvQmUoIjNrICMxIFRvcCAxJSIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byB0aGUgbW9kdWxlLXJlbGF0aXZlIHBhdGggd2hlbiBubyBrbm93biBsb2NhdGlvbiBleGlzdHMiLCAoKSA9PiB7CiAgICByZXNvbHZlQ3B1KCJBTUQgUnl6ZW4gOSA3OTUwWCIpOwogICAgZmlsZXMuZXhpc3RpbmcgPSBuZXcgU2V0KCk7CiAgICBmaWxlcy5kYXRhID0ge307CiAgICAvLyBOb3RoaW5nIHJlYWRhYmxlIGFueXdoZXJlIOKGkiBzd2FsbG93ZWQsIGNhY2hlZCBhcyBlbXB0eS4KICAgIGV4cGVjdChoLmJlbmNoKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJzZXJ2ZXMgZnJvbSB0aGUgY2FjaGUiLCAoKSA9PiB7CiAgICBjb25zdCBjID0gY3R4KHsgYmVuY2g6IHsgdmFsdWU6ICJjYWNoZWQiLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSB9KTsKICAgIGV4cGVjdChoLmJlbmNoKGMpKS50b0JlKCJjYWNoZWQiKTsKICB9KTsKfSk7CgpkZXNjcmliZSgiY3B1X2JlbmNoX2luZm8iLCAoKSA9PiB7CiAgaXQuZWFjaChbCiAgICBbIkFNRCBSeXplbiA5IDc5NTBYIiwgIkdlZWtiZW5jaCA2OiAzayAoUmFuayAjMSwgVG9wIDElKSAtIEFNRCJdLAogICAgWyJJbnRlbCBDb3JlIGk5LTEzOTAwSyIsICJHZWVrYmVuY2ggNjogM2sgKFJhbmsgIzIsIFRvcCAxNyUpIC0gSW50ZWwiXSwKICAgIFsiQXBwbGUgTTIgUHJvIiwgIkdlZWtiZW5jaCA2OiAzayAoUmFuayAjMywgVG9wIDM0JSkgLSBBUk0iXSwKICAgIFsiUXVhbGNvbW0gU25hcGRyYWdvbiBYIEVsaXRlIiwgIkdlZWtiZW5jaCA2OiAzayAoUmFuayAjNCwgVG9wIDUwJSkgLSBBUk0iXSwKICAgIFsiQU1EIEVQWUMgNzc2MyIsICJHZWVrYmVuY2ggNjogMmsgKFJhbmsgIzUsIFRvcCA2NyUpIC0gQU1EIl0sCiAgICBbIk15c3RlcnkgQ2hpcCA5MDAwIiwgIkdlZWtiZW5jaCA2OiAxayAoUmFuayAjNiwgVG9wIDg0JSkgLSBVbmtub3duIl0sCiAgXSkoImxhYmVscyAlcyB3aXRoIGl0cyBhcmNoaXRlY3R1cmUiLCAobmFtZSwgZXhwZWN0ZWQpID0+IHsKICAgIHJlc29sdmVDcHUobmFtZSk7CiAgICBleHBlY3QoaC5jcHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQmUoZXhwZWN0ZWQpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aCBubyBDUFUsIG5vIG1hdGNoLCBvciBhIGJhZCB0YWJsZTsgYW5kIHNlcnZlcyBjYWNoZSIsICgpID0+IHsKICAgIGV4cGVjdChoLmNwdV9iZW5jaF9pbmZvKGN0eCgpKSkudG9CZSgiIik7CiAgICByZXNvbHZlQ3B1KCJ6enp6enp6enp6enogcXFxcXFxcXEiKTsKICAgIGV4cGVjdChoLmNwdV9iZW5jaF9pbmZvKGN0eCgpKSkudG9CZSgiIik7CiAgICByZXNvbHZlQ3B1KCJBTUQgUnl6ZW4gOSA3OTUwWCIpOwogICAgZmlsZXMuZGF0YVsiY3B1LWdlZWtiZW5jaC5qc29uIl0gPSAib29wcyI7CiAgICBleHBlY3QoaC5jcHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQmUoIiIpOwogICAgZXhwZWN0KAogICAgICBoLmNwdV9iZW5jaF9pbmZvKGN0eCh7IGNwdV9iZW5jaF9pbmZvOiB7IHZhbHVlOiAiY2FjaGVkIiwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0gfSkpLAogICAgKS50b0JlKCJjYWNoZWQiKTsKICB9KTsKCiAgaXQoImxvY2F0ZXMgdGhlIHRhYmxlIGF0IHRoZSBhbHRlcm5hdGUgcGF0aHMiLCAoKSA9PiB7CiAgICByZXNvbHZlQ3B1KCJBTUQgUnl6ZW4gOSA3OTUwWCIpOwogICAgZmlsZXMuZXhpc3RpbmcgPSBuZXcgU2V0KFsic3JjL2JlbmNoL2NwdS1nZWVrYmVuY2guanNvbiJdKTsKICAgIGZpbGVzLmRhdGEgPSB7ICJzcmMvYmVuY2gvY3B1LWdlZWtiZW5jaC5qc29uIjogSlNPTi5zdHJpbmdpZnkoQ1BVX1RBQkxFKSB9OwogICAgZXhwZWN0KGguY3B1X2JlbmNoX2luZm8oY3R4KCkpKS50b0NvbnRhaW4oIkFNRCIpOwogICAgZmlsZXMuZXhpc3RpbmcgPSBuZXcgU2V0KFsiLi9iZW5jaC9jcHUtZ2Vla2JlbmNoLmpzb24iXSk7CiAgICBmaWxlcy5kYXRhID0geyAiLi9iZW5jaC9jcHUtZ2Vla2JlbmNoLmpzb24iOiBKU09OLnN0cmluZ2lmeShDUFVfVEFCTEUpIH07CiAgICBleHBlY3QoaC5jcHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQ29udGFpbigiQU1EIik7CiAgICBmaWxlcy5leGlzdGluZyA9IG5ldyBTZXQoKTsKICAgIGZpbGVzLmRhdGEgPSB7fTsKICAgIGV4cGVjdChoLmNwdV9iZW5jaF9pbmZvKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImdwdV9iZW5jaCIsICgpID0+IHsKICBpdCgiZm9ybWF0cyB0aGUgZnV6enktbWF0Y2hlZCBHUFUiLCAoKSA9PiB7CiAgICByZXNvbHZlR3B1KCJHZUZvcmNlIFJUWCA0MDkwIik7CiAgICBleHBlY3QoaC5ncHVfYmVuY2goY3R4KCkpKS50b0JlKCIzMDBrICMxIFRvcCAxJSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aCBubyBHUFUsIG5vIG1hdGNoLCBvciBhIGJhZCB0YWJsZTsgc2VydmVzIGNhY2hlIiwgKCkgPT4gewogICAgZXhwZWN0KGguZ3B1X2JlbmNoKGN0eCgpKSkudG9CZSgiIik7CiAgICByZXNvbHZlR3B1KCJ6enp6enp6enp6enogcXFxcXFxcXEiKTsKICAgIGV4cGVjdChoLmdwdV9iZW5jaChjdHgoKSkpLnRvQmUoIiIpOwogICAgcmVzb2x2ZUdwdSgiR2VGb3JjZSBSVFggNDA5MCIpOwogICAgZmlsZXMuZGF0YVsiZ3B1LWdlZWtiZW5jaC5qc29uIl0gPSAib29wcyI7CiAgICBleHBlY3QoaC5ncHVfYmVuY2goY3R4KCkpKS50b0JlKCIiKTsKICAgIGV4cGVjdChoLmdwdV9iZW5jaChjdHgoeyBncHVfYmVuY2g6IHsgdmFsdWU6ICJjIiwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0gfSkpKS50b0JlKCJjIik7CiAgfSk7CgogIGl0KCJsb2NhdGVzIHRoZSB0YWJsZSBhdCB0aGUgYWx0ZXJuYXRlIHBhdGhzIiwgKCkgPT4gewogICAgcmVzb2x2ZUdwdSgiR2VGb3JjZSBSVFggNDA5MCIpOwogICAgZmlsZXMuZXhpc3RpbmcgPSBuZXcgU2V0KFsic3JjL2JlbmNoL2dwdS1nZWVrYmVuY2guanNvbiJdKTsKICAgIGZpbGVzLmRhdGEgPSB7ICJzcmMvYmVuY2gvZ3B1LWdlZWtiZW5jaC5qc29uIjogSlNPTi5zdHJpbmdpZnkoR1BVX1RBQkxFKSB9OwogICAgZXhwZWN0KGguZ3B1X2JlbmNoKGN0eCgpKSkudG9CZSgiMzAwayAjMSBUb3AgMSUiKTsKICAgIGZpbGVzLmV4aXN0aW5nID0gbmV3IFNldChbIi4vYmVuY2gvZ3B1LWdlZWtiZW5jaC5qc29uIl0pOwogICAgZmlsZXMuZGF0YSA9IHsgIi4vYmVuY2gvZ3B1LWdlZWtiZW5jaC5qc29uIjogSlNPTi5zdHJpbmdpZnkoR1BVX1RBQkxFKSB9OwogICAgZXhwZWN0KGguZ3B1X2JlbmNoKGN0eCgpKSkudG9CZSgiMzAwayAjMSBUb3AgMSUiKTsKICAgIGZpbGVzLmV4aXN0aW5nID0gbmV3IFNldCgpOwogICAgZmlsZXMuZGF0YSA9IHt9OwogICAgZXhwZWN0KGguZ3B1X2JlbmNoKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImdwdV9iZW5jaF9pbmZvIiwgKCkgPT4gewogIGl0LmVhY2goWwogICAgWyJHZUZvcmNlIFJUWCA0MDkwIiwgIkdlZWtiZW5jaCA2OiAzMDBrIChSYW5rICMxLCBUb3AgMSUpIC0gTlZJRElBIl0sCiAgICBbIlJhZGVvbiBSWCA3OTAwIFhUWCIsICJHZWVrYmVuY2ggNjogMjAwayAoUmFuayAjMiwgVG9wIDI1JSkgLSBBTUQiXSwKICAgIFsiSW50ZWwgQXJjIEE3NzAiLCAiR2Vla2JlbmNoIDY6IDEwMGsgKFJhbmsgIzMsIFRvcCA1MCUpIC0gSW50ZWwiXSwKICAgIFsiT2JzY3VyZSBBY2NlbGVyYXRvciIsICJHZWVrYmVuY2ggNjogNTBrIChSYW5rICM0LCBUb3AgNzUlKSAtIFVua25vd24iXSwKICBdKSgibGFiZWxzICVzIHdpdGggaXRzIHZlbmRvciIsIChuYW1lLCBleHBlY3RlZCkgPT4gewogICAgcmVzb2x2ZUdwdShuYW1lKTsKICAgIGV4cGVjdChoLmdwdV9iZW5jaF9pbmZvKGN0eCgpKSkudG9CZShleHBlY3RlZCk7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSB3aXRoIG5vIEdQVSwgbm8gbWF0Y2gsIG9yIGEgYmFkIHRhYmxlOyBzZXJ2ZXMgY2FjaGUiLCAoKSA9PiB7CiAgICBleHBlY3QoaC5ncHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQmUoIiIpOwogICAgcmVzb2x2ZUdwdSgienp6enp6enp6enp6IHFxcXFxcXFxIik7CiAgICBleHBlY3QoaC5ncHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQmUoIiIpOwogICAgcmVzb2x2ZUdwdSgiR2VGb3JjZSBSVFggNDA5MCIpOwogICAgZmlsZXMuZGF0YVsiZ3B1LWdlZWtiZW5jaC5qc29uIl0gPSAib29wcyI7CiAgICBleHBlY3QoaC5ncHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQmUoIiIpOwogICAgZXhwZWN0KAogICAgICBoLmdwdV9iZW5jaF9pbmZvKGN0eCh7IGdwdV9iZW5jaF9pbmZvOiB7IHZhbHVlOiAiYyIsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9IH0pKSwKICAgICkudG9CZSgiYyIpOwogIH0pOwoKICBpdCgibG9jYXRlcyB0aGUgdGFibGUgYXQgdGhlIGFsdGVybmF0ZSBwYXRocyIsICgpID0+IHsKICAgIHJlc29sdmVHcHUoIkdlRm9yY2UgUlRYIDQwOTAiKTsKICAgIGZpbGVzLmV4aXN0aW5nID0gbmV3IFNldChbInNyYy9iZW5jaC9ncHUtZ2Vla2JlbmNoLmpzb24iXSk7CiAgICBmaWxlcy5kYXRhID0geyAic3JjL2JlbmNoL2dwdS1nZWVrYmVuY2guanNvbiI6IEpTT04uc3RyaW5naWZ5KEdQVV9UQUJMRSkgfTsKICAgIGV4cGVjdChoLmdwdV9iZW5jaF9pbmZvKGN0eCgpKSkudG9Db250YWluKCJOVklESUEiKTsKICAgIGZpbGVzLmV4aXN0aW5nID0gbmV3IFNldChbIi4vYmVuY2gvZ3B1LWdlZWtiZW5jaC5qc29uIl0pOwogICAgZmlsZXMuZGF0YSA9IHsgIi4vYmVuY2gvZ3B1LWdlZWtiZW5jaC5qc29uIjogSlNPTi5zdHJpbmdpZnkoR1BVX1RBQkxFKSB9OwogICAgZXhwZWN0KGguZ3B1X2JlbmNoX2luZm8oY3R4KCkpKS50b0NvbnRhaW4oIk5WSURJQSIpOwogICAgZmlsZXMuZXhpc3RpbmcgPSBuZXcgU2V0KCk7CiAgICBmaWxlcy5kYXRhID0ge307CiAgICBleHBlY3QoaC5ncHVfYmVuY2hfaW5mbyhjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwp9KTsK\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgYWZ0ZXJFYWNoLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tICJ2aXRlc3QiOwoKY29uc3QgZmxhZ3MgPSB2aS5ob2lzdGVkKCgpID0+ICh7IGxpbnV4OiB0cnVlLCBtYWM6IGZhbHNlLCB3aW5kb3dzOiBmYWxzZSB9KSk7CnZpLm1vY2soIi4uL3V0aWxzL3BsYXRmb3JtIiwgKCkgPT4gKHsKICBnZXQgSVNfTElOVVgoKSB7CiAgICByZXR1cm4gZmxhZ3MubGludXg7CiAgfSwKICBnZXQgSVNfTUFDKCkgewogICAgcmV0dXJuIGZsYWdzLm1hYzsKICB9LAogIGdldCBJU19XSU5ET1dTKCkgewogICAgcmV0dXJuIGZsYWdzLndpbmRvd3M7CiAgfSwKfSkpOwoKY29uc3QgZXhlY0NvbW1hbmQgPSB2aS5ob2lzdGVkKCgpID0+IHZpLmZuKCkpOwp2aS5tb2NrKCIuLi91dGlscy9jb21tYW5kIiwgKCkgPT4gKHsgZXhlY0NvbW1hbmQsIGNvbW1hbmRFeGlzdHM6IHZpLmZuKCkgfSkpOwoKY29uc3QgZnNNb2NrID0gdmkuaG9pc3RlZCgoKSA9PiAoewogIGV4aXN0c1N5bmM6IHZpLmZuKCgpID0+IGZhbHNlKSwKICByZWFkRmlsZVN5bmM6IHZpLmZuKCgpID0+ICIiKSwKICB3cml0ZUZpbGVTeW5jOiB2aS5mbigpLAp9KSk7CnZpLm1vY2soImZzIiwgKCkgPT4gKHsgLi4uZnNNb2NrLCBkZWZhdWx0OiBmc01vY2sgfSkpOwoKY29uc3Qgb3NNb2NrID0gdmkuaG9pc3RlZCgoKSA9PiAoewogIGNwdXM6IHZpLmZuKCgpID0+IFtdIGFzIHsgbW9kZWw6IHN0cmluZyB9W10pLAogIHRtcGRpcjogdmkuZm4oKCkgPT4gIi90bXAiKSwKICBwbGF0Zm9ybTogdmkuZm4oKCkgPT4gImxpbnV4IiksCn0pKTsKdmkubW9jaygib3MiLCAoKSA9PiAoeyAuLi5vc01vY2ssIGRlZmF1bHQ6IG9zTW9jayB9KSk7Cgpjb25zdCBoID0gYXdhaXQgaW1wb3J0KCIuL2hhcmR3YXJlIik7CmltcG9ydCB0eXBlIHsgSW5mb0NvbnRleHQgfSBmcm9tICIuLi90eXBlcy9pbnRlcm5hbC10eXBlcyI7Cgpjb25zdCBjdHggPSAoKTogSW5mb0NvbnRleHQgPT4gKHsgY2FjaGU6IHt9IH0pOwpjb25zdCBwbGF0Zm9ybSA9IChrOiAibGludXgiIHwgIm1hYyIgfCAid2luZG93cyIgfCAib3RoZXIiKSA9PiB7CiAgZmxhZ3MubGludXggPSBrID09PSAibGludXgiOwogIGZsYWdzLm1hYyA9IGsgPT09ICJtYWMiOwogIGZsYWdzLndpbmRvd3MgPSBrID09PSAid2luZG93cyI7Cn07CgpiZWZvcmVFYWNoKCgpID0+IHsKICBwbGF0Zm9ybSgibGludXgiKTsKICBleGVjQ29tbWFuZC5tb2NrUmVzZXQoKS5tb2NrUmV0dXJuVmFsdWUoIiIpOwogIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1Jlc2V0KCkubW9ja1JldHVyblZhbHVlKCIiKTsKICBvc01vY2suY3B1cy5tb2NrUmVzZXQoKS5tb2NrUmV0dXJuVmFsdWUoW10pOwp9KTsKCmFmdGVyRWFjaCgoKSA9PiB7CiAgZGVsZXRlIHByb2Nlc3MuZW52LkRJU1BMQVk7Cn0pOwoKZGVzY3JpYmUoImNwdSIsICgpID0+IHsKICBpdCgicmVhZHMgdGhlIG1vZGVsIGZyb20gbHNjcHUgb24gTGludXggYW5kIHRyaW1zIGB3aXRoIC4uLmAgc3VmZml4ZXMiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIkFyY2hpdGVjdHVyZTogeDg2XzY0XG5Nb2RlbCBuYW1lOiAgQU1EIFJ5emVuIDcgNTgwMFggd2l0aCBSYWRlb25cbkZsYWdzOiBhIik7CiAgICBleHBlY3QoaC5jcHUoY3R4KCkpKS50b0JlKCJBTUQgUnl6ZW4gNyA1ODAwWCIpOwogIH0pOwoKICBpdCgic3RvcHMgdGhlIGxzY3B1IG1vZGVsIGF0IGEgY29tbWEiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIk1vZGVsIG5hbWU6IEludGVsKFIpIENvcmUoVE0pIGk3LCA4IGNvcmVzIik7CiAgICBleHBlY3QoaC5jcHUoY3R4KCkpKS50b0JlKCJJbnRlbChSKSBDb3JlKFRNKSBpNyIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byAvcHJvYy9jcHVpbmZvIG1vZGVsIG5hbWUsIHRoZW4gSGFyZHdhcmUiLCAoKSA9PiB7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tSZXR1cm5WYWx1ZSgicHJvY2Vzc29yIDogMFxubW9kZWwgbmFtZSA6IEZhbmN5IENQVVxuIik7CiAgICBleHBlY3QoaC5jcHUoY3R4KCkpKS50b0JlKCJGYW5jeSBDUFUiKTsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCJIYXJkd2FyZSA6IEJDTTI3MTFcbiIpOwogICAgZXhwZWN0KGguY3B1KGN0eCgpKSkudG9CZSgiQkNNMjcxMSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2hlbiBMaW51eCBvZmZlcnMgbm8gQ1BVIG5hbWUiLCAoKSA9PiB7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigieCIpOwogICAgfSk7CiAgICBleHBlY3QoaC5jcHUoY3R4KCkpKS50b0JlKCIiKTsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCJub3RoaW5nIHVzZWZ1bCIpOwogICAgZXhwZWN0KGguY3B1KGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJ1c2VzIHdtaWMgb24gV2luZG93cywgdGhlbiBQb3dlclNoZWxsIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIndpbmRvd3MiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiTmFtZT1JbnRlbChSKSBDb3JlKFRNKSBpOS05OTAwSyBDUFUgQCAzLjYwR0h6XHJcbiIpOwogICAgZXhwZWN0KGguY3B1KGN0eCgpKSkudG9CZSgiSW50ZWwoUikgQ29yZShUTSkgaTktOTkwMEsgQ1BVIEAgMy42MEdIeiIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKChjOiBzdHJpbmcpID0+IChjLnN0YXJ0c1dpdGgoIndtaWMiKSA/ICIiIDogIlJ5emVuIDUgMzYwMFxyXG4iKSk7CiAgICBleHBlY3QoaC5jcHUoY3R4KCkpKS50b0JlKCJSeXplbiA1IDM2MDAiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgICBleHBlY3QoaC5jcHUoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoInVzZXMgb3MuY3B1cyBlbHNld2hlcmUgKG1hY09TKSIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJtYWMiKTsKICAgIG9zTW9jay5jcHVzLm1vY2tSZXR1cm5WYWx1ZShbeyBtb2RlbDogIkFwcGxlIE0yXHJcblBybyAiIH1dKTsKICAgIGV4cGVjdChoLmNwdShjdHgoKSkpLnRvQmUoIkFwcGxlIE0yIFBybyIpOwogICAgb3NNb2NrLmNwdXMubW9ja1JldHVyblZhbHVlKFtdKTsKICAgIGV4cGVjdChoLmNwdShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgic2VydmVzIGZyb20gdGhlIGNhY2hlIiwgKCkgPT4gewogICAgY29uc3QgYyA9IGN0eCgpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJNb2RlbCBuYW1lOiBDYWNoZWQgQ1BVIik7CiAgICBoLmNwdShjKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiTW9kZWwgbmFtZTogT3RoZXIiKTsKICAgIGV4cGVjdChoLmNwdShjKSkudG9CZSgiQ2FjaGVkIENQVSIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJncHUiLCAoKSA9PiB7CiAgaXQoImxpc3RzIGRpc3BsYXktY2xhc3MgbHNwY2kgZGV2aWNlcyB1c2luZyB0aGUgYnJhY2tldGVkIG1hcmtldGluZyBuYW1lIiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKAogICAgICBbCiAgICAgICAgIjAwOjAyLjAgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gVUhEIEdyYXBoaWNzIDYzMCBbVUhEIEdyYXBoaWNzIDYzMF0iLAogICAgICAgICIwMTowMC4wIFZHQSBjb21wYXRpYmxlIGNvbnRyb2xsZXI6IE5WSURJQSBDb3Jwb3JhdGlvbiBHQTEwNCBbR2VGb3JjZSBSVFggMzA3MF0gKHJldiBhMSkiLAogICAgICAgICIwMTowMC4xIEF1ZGlvIGRldmljZTogTlZJRElBIENvcnBvcmF0aW9uIEdBMTA0IEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyIsCiAgICAgICAgIjAyOjAwLjAgRXRoZXJuZXQgY29udHJvbGxlcjogUmVhbHRlayIsCiAgICAgICAgIjAzOjAwLjAgM0QgY29udHJvbGxlcjogTlZJRElBIENvcnBvcmF0aW9uIEdBMTA0IFtHZUZvcmNlIFJUWCAzMDcwXSIsCiAgICAgIF0uam9pbigiXG4iKSwKICAgICk7CiAgICBleHBlY3QoaC5ncHUoY3R4KCkpKS50b0JlKCJVSEQgR3JhcGhpY3MgNjMwLCBHZUZvcmNlIFJUWCAzMDcwIik7CiAgfSk7CgogIGl0KCJzdHJpcHMgdGhlIGNsYXNzIHByZWZpeCBhbmQgcmV2aXNpb24gd2hlbiB0aGVyZSBhcmUgbm8gYnJhY2tldHMiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIjAwOjAyLjAgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlcjogSW50ZWwgQ29ycG9yYXRpb24gSEQgR3JhcGhpY3MgKHJldiAwOSkiKTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIkludGVsIENvcnBvcmF0aW9uIEhEIEdyYXBoaWNzIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSB3aGVuIG5vIEdQVSBpcyBmb3VuZCwgb3IgbHNwY2kgZmFpbHMiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIjAwOjFmLjAgSVNBIGJyaWRnZTogSW50ZWwiKTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIiIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgibGlzdHMgd21pYyBhZGFwdGVycyBvbiBXaW5kb3dzLCBpZ25vcmluZyBNaWNyb3NvZnQgQmFzaWMiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgid2luZG93cyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJOYW1lPU5WSURJQSBHZUZvcmNlIFJUWCA0MDkwXHJcbk5hbWU9TWljcm9zb2Z0IEJhc2ljIERpc3BsYXkgQWRhcHRlclxyXG5OYW1lPUludGVsIFVIRFxyXG4iKTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIk5WSURJQSBHZUZvcmNlIFJUWCA0MDkwLCBJbnRlbCBVSEQiKTsKICB9KTsKCiAgaXQoImZhbGxzIGJhY2sgdG8gUG93ZXJTaGVsbCBvbiBXaW5kb3dzIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIndpbmRvd3MiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoYzogc3RyaW5nKSA9PgogICAgICBjLnN0YXJ0c1dpdGgoIndtaWMiKSA/ICIiIDogIkFNRCBSYWRlb24gUlggNzkwMFxyXG5NaWNyb3NvZnQgQmFzaWMgUmVuZGVyXHJcblxyXG4iLAogICAgKTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIkFNRCBSYWRlb24gUlggNzkwMCIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgibGlzdHMgY2hpcHNldCBtb2RlbHMgb24gbWFjT1MiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIkdyYXBoaWNzOlxuICBDaGlwc2V0IE1vZGVsOiBBcHBsZSBNMiBQcm9cbiAgQ2hpcHNldCBNb2RlbDogQU1EIFJhZGVvbiBQcm8iKTsKICAgIGV4cGVjdChoLmdwdShjdHgoKSkpLnRvQmUoIkFwcGxlIE0yIFBybywgQU1EIFJhZGVvbiBQcm8iKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgibm9uZSIpOwogICAgZXhwZWN0KGguZ3B1KGN0eCgpKSkudG9CZSgiIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KGguZ3B1KGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiB1bmtub3duIHBsYXRmb3JtcyBhbmQgc2VydmVzIGZyb20gdGhlIGNhY2hlIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm90aGVyIik7CiAgICBjb25zdCBjID0gY3R4KCk7CiAgICBleHBlY3QoaC5ncHUoYykpLnRvQmUoIiIpOwogICAgcGxhdGZvcm0oImxpbnV4Iik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIjAwOjAyLjAgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlcjogSW50ZWwgVUhEIEdyYXBoaWNzIFtVSERdIik7CiAgICBleHBlY3QoaC5ncHUoYykpLnRvQmUoIiIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJzY3JlZW5fcmVzb2x1dGlvbiIsICgpID0+IHsKICBpdCgicGFyc2VzIHRoZSB4cmFuZHIgZ2VvbWV0cnkgb24gTGludXggd2hlbiBESVNQTEFZIGlzIHNldCIsICgpID0+IHsKICAgIHByb2Nlc3MuZW52LkRJU1BMQVkgPSAiOjAiOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJTY3JlZW4gMDogbWluaW11bSA4IHggOFxuSERNSS0xIGNvbm5lY3RlZCBwcmltYXJ5IDI1NjB4MTQ0MCswKzAiKTsKICAgIGV4cGVjdChoLnNjcmVlbl9yZXNvbHV0aW9uKCkpLnRvQmUoIjI1NjB4MTQ0MCIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aG91dCBESVNQTEFZLCB3aXRob3V0IGEgbWF0Y2gsIG9yIHdoZW4geHJhbmRyIHRocm93cyIsICgpID0+IHsKICAgIGV4cGVjdChoLnNjcmVlbl9yZXNvbHV0aW9uKCkpLnRvQmUoIiIpOwogICAgcHJvY2Vzcy5lbnYuRElTUExBWSA9ICI6MCI7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIm5vdGhpbmciKTsKICAgIGV4cGVjdChoLnNjcmVlbl9yZXNvbHV0aW9uKCkpLnRvQmUoIiIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChoLnNjcmVlbl9yZXNvbHV0aW9uKCkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgicGFyc2VzIHRoZSBzeXN0ZW1fcHJvZmlsZXIgcmVzb2x1dGlvbiBvbiBtYWNPUyIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJtYWMiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiUmVzb2x1dGlvbjogMzAyNCB4IDE5NjQgUmV0aW5hIik7CiAgICBleHBlY3QoaC5zY3JlZW5fcmVzb2x1dGlvbigpKS50b0JlKCIzMDI0eDE5NjQiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgibm9wZSIpOwogICAgZXhwZWN0KGguc2NyZWVuX3Jlc29sdXRpb24oKSkudG9CZSgiIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KGguc2NyZWVuX3Jlc29sdXRpb24oKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBvdGhlciBwbGF0Zm9ybXMiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgid2luZG93cyIpOwogICAgZXhwZWN0KGguc2NyZWVuX3Jlc29sdXRpb24oKSkudG9CZSgiIik7CiAgfSk7Cn0pOwo=\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tICJ2aXRlc3QiOwppbXBvcnQgeyBmb3JtYXRCZW5jaCwgdG9wUGVyY2VudCB9IGZyb20gIi4vaGFyZHdhcmUiOwoKLyoqIEJ1aWxkcyBhIHRhYmxlIG9mIGBjb3VudGAgZW50cmllcyBhdCBlYWNoIHNjb3JlLCBoaWdoZXN0IGZpcnN0LiAqLwpmdW5jdGlvbiB0YWJsZShncm91cHM6IFtzY29yZTogbnVtYmVyLCBjb3VudDogbnVtYmVyXVtdKTogbnVtYmVyW10gewogIHJldHVybiBncm91cHMuZmxhdE1hcCgoW3Njb3JlLCBjb3VudF0pID0+IEFycmF5PG51bWJlcj4oY291bnQpLmZpbGwoc2NvcmUpKTsKfQoKZGVzY3JpYmUoInRvcFBlcmNlbnQiLCAoKSA9PiB7CiAgLy8gMSwwMDAgZW50cmllczogNCBhdCAxMDAsIDE4IGF0IDk5LCAzNSBhdCA5OCwgODAgYXQgOTcsIHJlc3QgYXQgNTAKICBjb25zdCBzY29yZXMgPSB0YWJsZShbWzEwMCwgNF0sIFs5OSwgMThdLCBbOTgsIDM1XSwgWzk3LCA4MF0sIFs1MCwgODYzXV0pOwoKICBpdCgiZ3JhZGVzIGJ5IGhvdyBtYW55IHNjb3JlIHN0cmljdGx5IGhpZ2hlciwgc28gdGllcyBzaGFyZSBhIGJ1Y2tldCIsICgpID0+IHsKICAgIGV4cGVjdCh0b3BQZXJjZW50KDEwMCwgc2NvcmVzKSkudG9CZSgxKTsKICAgIGV4cGVjdCh0b3BQZXJjZW50KDk5LCBzY29yZXMpKS50b0JlKDEpOwogICAgZXhwZWN0KHRvcFBlcmNlbnQoOTgsIHNjb3JlcykpLnRvQmUoMyk7CiAgICBleHBlY3QodG9wUGVyY2VudCg5Nywgc2NvcmVzKSkudG9CZSg2KTsKICB9KTsKCiAgaXQoImtlZXBzIGEgbGFyZ2UgdGllIHRvZ2V0aGVyIGluc3RlYWQgb2Ygc3BsaXR0aW5nIGl0IGJ5IHJhbmsiLCAoKSA9PiB7CiAgICBjb25zdCB0aWVkID0gdGFibGUoW1sxMDAsIDUwXSwgWzkwLCA5NTBdXSk7CiAgICBleHBlY3QodG9wUGVyY2VudCgxMDAsIHRpZWQpKS50b0JlKDEpOwogICAgZXhwZWN0KHRvcFBlcmNlbnQoOTAsIHRpZWQpKS50b0JlKDUpOwogIH0pOwoKICBpdCgic3RheXMgd2l0aGluIDEuLjEwMCIsICgpID0+IHsKICAgIGV4cGVjdCh0b3BQZXJjZW50KDEsIHRhYmxlKFtbMTAsIDk5OV0sIFsxLCAxXV0pKSkudG9CZSgxMDApOwogICAgZXhwZWN0KHRvcFBlcmNlbnQoNSwgW10pKS50b0JlKDEwMCk7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImZvcm1hdEJlbmNoIiwgKCkgPT4gewogIGNvbnN0IHNjb3JlcyA9IHRhYmxlKFtbMzc5NjcsIDFdLCBbMzAwMDAsIDY2XSwgWzIwNTEyLCAxXSwgWzEwMDAwLCA5MzJdXSk7CgogIGl0KCJyb3VuZHMgdGhlIHNjb3JlIHRvIHdob2xlIHRob3VzYW5kcyBhbmQgYXBwZW5kcyB0aGUgVG9wIHBlcmNlbnRpbGUiLCAoKSA9PiB7CiAgICBleHBlY3QoZm9ybWF0QmVuY2goMzc5NjcsIDEsIHNjb3JlcykpLnRvQmUoIjM4ayAjMSBUb3AgMSUiKTsKICAgIGV4cGVjdChmb3JtYXRCZW5jaCgyMDUxMiwgNjgsIHNjb3JlcykpLnRvQmUoIjIxayAjNjggVG9wIDclIik7CiAgfSk7CgogIGl0KCJuZXZlciBwcmludHMgYSBkZWNpbWFsIGluIHRoZSBzY29yZSIsICgpID0+IHsKICAgIGV4cGVjdChmb3JtYXRCZW5jaCgxOTI0OSwgOTEsIHNjb3JlcykpLm5vdC50b01hdGNoKC9cZFwuXGQvKTsKICB9KTsKfSk7Cg==\"","export default \"data:video/mp2t;base64,LyoqCiAqIEBmaWxlb3ZlcnZpZXcgTWVtb3J5IGFuZCBkaXNrIHByb2Jlcy4gRXZlcnkgZnVuY3Rpb24gYnJhbmNoZXMgb24gdGhlIGhvc3QKICogcGxhdGZvcm0sIHNvIGB1dGlscy9wbGF0Zm9ybWAgaXMgbW9ja2VkIHdpdGggbGl2ZSBnZXR0ZXJzIGFuZCBlYWNoIHRlc3QKICogcGlja3MgdGhlIE9TIGl0IHdhbnRzIHRvIGltcGVyc29uYXRlLgogKi8KaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAidml0ZXN0IjsKCmNvbnN0IGZsYWdzID0gdmkuaG9pc3RlZCgoKSA9PiAoeyBsaW51eDogdHJ1ZSwgbWFjOiBmYWxzZSwgd2luZG93czogZmFsc2UgfSkpOwp2aS5tb2NrKCIuLi91dGlscy9wbGF0Zm9ybSIsICgpID0+ICh7CiAgZ2V0IElTX0xJTlVYKCkgewogICAgcmV0dXJuIGZsYWdzLmxpbnV4OwogIH0sCiAgZ2V0IElTX01BQygpIHsKICAgIHJldHVybiBmbGFncy5tYWM7CiAgfSwKICBnZXQgSVNfV0lORE9XUygpIHsKICAgIHJldHVybiBmbGFncy53aW5kb3dzOwogIH0sCn0pKTsKCmNvbnN0IGV4ZWNDb21tYW5kID0gdmkuaG9pc3RlZCgoKSA9PiB2aS5mbigpKTsKdmkubW9jaygiLi4vdXRpbHMvY29tbWFuZCIsICgpID0+ICh7IGV4ZWNDb21tYW5kLCBjb21tYW5kRXhpc3RzOiB2aS5mbigpIH0pKTsKCmNvbnN0IGZzTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICByZWFkRmlsZVN5bmM6IHZpLmZuKCksCiAgZXhpc3RzU3luYzogdmkuZm4oKCkgPT4gZmFsc2UpLAogIHdyaXRlRmlsZVN5bmM6IHZpLmZuKCksCn0pKTsKdmkubW9jaygiZnMiLCAoKSA9PiAoeyAuLi5mc01vY2ssIGRlZmF1bHQ6IGZzTW9jayB9KSk7Cgpjb25zdCBvc01vY2sgPSB2aS5ob2lzdGVkKCgpID0+ICh7CiAgdG90YWxtZW06IHZpLmZuKCgpID0+IDE2ICogMTAyNCAqKiAzKSwKICBmcmVlbWVtOiB2aS5mbigoKSA9PiA0ICogMTAyNCAqKiAzKSwKICB0bXBkaXI6IHZpLmZuKCgpID0+ICIvdG1wIiksCiAgcGxhdGZvcm06IHZpLmZuKCgpID0+ICJsaW51eCIpLAp9KSk7CnZpLm1vY2soIm9zIiwgKCkgPT4gKHsgLi4ub3NNb2NrLCBkZWZhdWx0OiBvc01vY2sgfSkpOwoKY29uc3QgbSA9IGF3YWl0IGltcG9ydCgiLi9tZW1vcnkiKTsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKCmNvbnN0IGN0eCA9IChjYWNoZTogSW5mb0NvbnRleHRbImNhY2hlIl0gPSB7fSk6IEluZm9Db250ZXh0ID0+ICh7IGNhY2hlIH0pOwpjb25zdCBwbGF0Zm9ybSA9IChwOiAibGludXgiIHwgIm1hYyIgfCAid2luZG93cyIpID0+IHsKICBmbGFncy5saW51eCA9IHAgPT09ICJsaW51eCI7CiAgZmxhZ3MubWFjID0gcCA9PT0gIm1hYyI7CiAgZmxhZ3Mud2luZG93cyA9IHAgPT09ICJ3aW5kb3dzIjsKfTsKCmNvbnN0IE1FTUlORk8gPSBbCiAgIk1lbVRvdGFsOiAgICAgICAxNjc3NzIxNiBrQiIsCiAgIk1lbUZyZWU6ICAgICAgICAgNDE5NDMwNCBrQiIsCiAgIk1lbUF2YWlsYWJsZTogICAgODM4ODYwOCBrQiIsCiAgIlN3YXBUb3RhbDogICAgICAgMjA5NzE1MiBrQiIsCiAgIlN3YXBGcmVlOiAgICAgICAgMTU3Mjg2NCBrQiIsCl0uam9pbigiXG4iKTsKCmJlZm9yZUVhY2goKCkgPT4gewogIHBsYXRmb3JtKCJsaW51eCIpOwogIGV4ZWNDb21tYW5kLm1vY2tSZXNldCgpLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgZnNNb2NrLnJlYWRGaWxlU3luYy5tb2NrUmVzZXQoKS5tb2NrUmV0dXJuVmFsdWUoTUVNSU5GTyk7CiAgb3NNb2NrLnRvdGFsbWVtLm1vY2tSZXR1cm5WYWx1ZSgxNiAqIDEwMjQgKiogMyk7CiAgb3NNb2NrLmZyZWVtZW0ubW9ja1JldHVyblZhbHVlKDQgKiAxMDI0ICoqIDMpOwp9KTsKCmRlc2NyaWJlKCJyYW1fdXNlZCIsICgpID0+IHsKICBpdCgicmVhZHMgL3Byb2MvbWVtaW5mbyBvbiBMaW51eCIsICgpID0+IHsKICAgIGV4cGVjdChtLnJhbV91c2VkKGN0eCgpKSkudG9CZSgiMTIvMTZHQiIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byBvcy50b3RhbG1lbSB3aGVuIC9wcm9jL21lbWluZm8gaXMgdW5yZWFkYWJsZSIsICgpID0+IHsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJub3BlIik7CiAgICB9KTsKICAgIGV4cGVjdChtLnJhbV91c2VkKGN0eCgpKSkudG9CZSgiMTIvMTZHQiIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byBvcy50b3RhbG1lbSB3aGVuIG1lbWluZm8gbGFja3MgdGhlIGtleXMiLCAoKSA9PiB7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tSZXR1cm5WYWx1ZSgiZ2FyYmFnZSIpOwogICAgZXhwZWN0KG0ucmFtX3VzZWQoY3R4KCkpKS50b0JlKCIxMi8xNkdCIik7CiAgfSk7CgogIGl0KCJ1c2VzIG9zIG1lbW9yeSBvbiBub24tTGludXggaG9zdHMiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBvc01vY2sudG90YWxtZW0ubW9ja1JldHVyblZhbHVlKDggKiAxMDI0ICoqIDMpOwogICAgb3NNb2NrLmZyZWVtZW0ubW9ja1JldHVyblZhbHVlKDIgKiAxMDI0ICoqIDMpOwogICAgZXhwZWN0KG0ucmFtX3VzZWQoY3R4KCkpKS50b0JlKCI2LzhHQiIpOwogICAgZXhwZWN0KGZzTW9jay5yZWFkRmlsZVN5bmMpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7CiAgfSk7CgogIGl0KCJzZXJ2ZXMgYSBjYWNoZWQgdmFsdWUgYW5kIHN0b3JlcyBhIGZyZXNoIG9uZSIsICgpID0+IHsKICAgIGNvbnN0IGNhY2hlID0ge307CiAgICBleHBlY3QobS5yYW1fdXNlZChjdHgoY2FjaGUpKSkudG9CZSgiMTIvMTZHQiIpOwogICAgZnNNb2NrLnJlYWRGaWxlU3luYy5tb2NrUmV0dXJuVmFsdWUoIk1lbVRvdGFsOiAxIGtCXG5NZW1GcmVlOiAxIGtCIik7CiAgICBleHBlY3QobS5yYW1fdXNlZChjdHgoY2FjaGUpKSkudG9CZSgiMTIvMTZHQiIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJtZW1vcnlfYXZhaWxhYmxlIiwgKCkgPT4gewogIGl0KCJyZWFkcyBNZW1BdmFpbGFibGUgb24gTGludXgiLCAoKSA9PiB7CiAgICBleHBlY3QobS5tZW1vcnlfYXZhaWxhYmxlKCkpLnRvQmUoIjhHQiBhdmFpbGFibGUiKTsKICB9KTsKCiAgaXQoInJldHVybnMgZW1wdHkgd2hlbiBNZW1BdmFpbGFibGUgaXMgbWlzc2luZyBvciB1bnJlYWRhYmxlIG9uIExpbnV4IiwgKCkgPT4gewogICAgZnNNb2NrLnJlYWRGaWxlU3luYy5tb2NrUmV0dXJuVmFsdWUoIk1lbVRvdGFsOiAxIGtCIik7CiAgICBleHBlY3QobS5tZW1vcnlfYXZhaWxhYmxlKCkpLnRvQmUoIiIpOwogICAgZnNNb2NrLnJlYWRGaWxlU3luYy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KG0ubWVtb3J5X2F2YWlsYWJsZSgpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoImRlcml2ZXMgZnJlZStpbmFjdGl2ZSBwYWdlcyBmcm9tIHZtX3N0YXQgb24gbWFjT1MiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoCiAgICAgIFsKICAgICAgICAiTWFjaCBWaXJ0dWFsIE1lbW9yeSBTdGF0aXN0aWNzOiAocGFnZSBzaXplIG9mIDE2Mzg0IGJ5dGVzKSIsCiAgICAgICAgIlBhZ2VzIGZyZWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2MjE0NC4iLAogICAgICAgICJQYWdlcyBpbmFjdGl2ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAyNjIxNDQuIiwKICAgICAgXS5qb2luKCJcbiIpLAogICAgKTsKICAgIC8vICgyNjIxNDQgKyAyNjIxNDQpICogMTYzODQgYnl0ZXMgPSA4IEdpQgogICAgZXhwZWN0KG0ubWVtb3J5X2F2YWlsYWJsZSgpKS50b0JlKCI4R0IgYXZhaWxhYmxlIik7CiAgICBleHBlY3QoZXhlY0NvbW1hbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCJ2bV9zdGF0Iik7CiAgfSk7CgogIGl0KCJyZXR1cm5zIGVtcHR5IG9uIG1hY09TIHdoZW4gdm1fc3RhdCBvdXRwdXQgaXMgdW5wYXJzZWFibGUiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIm5vbnNlbnNlIik7CiAgICBleHBlY3QobS5tZW1vcnlfYXZhaWxhYmxlKCkpLnRvQmUoIiIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChtLm1lbW9yeV9hdmFpbGFibGUoKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJyZXR1cm5zIGVtcHR5IG9uIFdpbmRvd3MiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgid2luZG93cyIpOwogICAgZXhwZWN0KG0ubWVtb3J5X2F2YWlsYWJsZSgpKS50b0JlKCIiKTsKICB9KTsKfSk7CgpkZXNjcmliZSgic3dhcF91c2VkIiwgKCkgPT4gewogIGl0KCJjb21wdXRlcyBwZXJjZW50IGFuZCBNQiBvbiBMaW51eCIsICgpID0+IHsKICAgIC8vIDIgR2lCIHRvdGFsLCAwLjUgR2lCIHVzZWQKICAgIGV4cGVjdChtLnN3YXBfdXNlZCgpKS50b0JlKCIyNSUgKDUxMk1CKSBzd2FwIik7CiAgfSk7CgogIGl0KCJyZXR1cm5zIGVtcHR5IHdoZW4gdGhlcmUgaXMgbm8gc3dhcCBvciBtZW1pbmZvIGlzIGJhZCIsICgpID0+IHsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCJTd2FwVG90YWw6IDAga0JcblN3YXBGcmVlOiAwIGtCIik7CiAgICBleHBlY3QobS5zd2FwX3VzZWQoKSkudG9CZSgiIik7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tSZXR1cm5WYWx1ZSgibm90aGluZyIpOwogICAgZXhwZWN0KG0uc3dhcF91c2VkKCkpLnRvQmUoIiIpOwogICAgZnNNb2NrLnJlYWRGaWxlU3luYy5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KG0uc3dhcF91c2VkKCkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgicGFyc2VzIHN5c2N0bCB2bS5zd2FwdXNhZ2Ugb24gbWFjT1MiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoInRvdGFsID0gMjA0OC4wME0gIHVzZWQgPSA1MTIuMDBNICBmcmVlID0gMTUzNi4wME0gIChlbmNyeXB0ZWQpIik7CiAgICBleHBlY3QobS5zd2FwX3VzZWQoKSkudG9CZSgiMjUlICg1MTJNQikgc3dhcCIpOwogIH0pOwoKICBpdCgicmVwb3J0cyB6ZXJvIHN3YXAgb24gbWFjT1Mgd2hlbiB0b3RhbCBpcyAwIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm1hYyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJ0b3RhbCA9IDAuMDBNICB1c2VkID0gMC4wME0gIGZyZWUgPSAwLjAwTSIpOwogICAgZXhwZWN0KG0uc3dhcF91c2VkKCkpLnRvQmUoIjAlICgwTUIpIHN3YXAiKTsKICB9KTsKCiAgaXQoInJldHVybnMgZW1wdHkgb24gbWFjT1Mgd2l0aCB1bnBhcnNlYWJsZSBvdXRwdXQsIGFuZCBvbiBXaW5kb3dzIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm1hYyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCI/Iik7CiAgICBleHBlY3QobS5zd2FwX3VzZWQoKSkudG9CZSgiIik7CiAgICBwbGF0Zm9ybSgid2luZG93cyIpOwogICAgZXhwZWN0KG0uc3dhcF91c2VkKCkpLnRvQmUoIiIpOwogIH0pOwp9KTsKCmNvbnN0IERGX0ggPSBbCiAgIkZpbGVzeXN0ZW0gICAgICBTaXplICBVc2VkIEF2YWlsIFVzZSUgTW91bnRlZCBvbiIsCiAgIi9kZXYvc2RhMSAgICAgICAxMDBHICAgNDVHICAgNTBHICA0NyUgLyIsCiAgInRtcGZzICAgICAgICAgICAxLjBHICAgICAwICAxLjBHICAgMCUgL2Rldi9zaG0iLAogICIvZGV2L3NkYjEgICAgICAgNTAwRyAgMzkwRyAgIDgwRyAgNzglIC9tbnQvZGF0YSIsCl0uam9pbigiXG4iKTsKCmRlc2NyaWJlKCJkaXNrX3VzZWQiLCAoKSA9PiB7CiAgaXQoImZpbmRzIHRoZSByb290IGZpbGVzeXN0ZW0gcGVyY2VudGFnZSIsICgpID0+IHsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZShERl9IKTsKICAgIGV4cGVjdChtLmRpc2tfdXNlZChjdHgoKSkpLnRvQmUoIjQ3JSIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byBhIHJlZ2V4IHdoZW4gbm8gbGluZSBlbmRzIGluICcgLycgd2l0aCBhICUgY29sdW1uIiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJGaWxlc3lzdGVtIFVzZSUgTW91bnRlZFxucm9vdGZzIDMzJSAvIik7CiAgICBleHBlY3QobS5kaXNrX3VzZWQoY3R4KCkpKS50b0JlKCIzMyUiKTsKICB9KTsKCiAgaXQoInJldHVybnMgZW1wdHkgd2hlbiBub3RoaW5nIG1hdGNoZXMiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIkZpbGVzeXN0ZW0gU2l6ZVxubm9uZSIpOwogICAgZXhwZWN0KG0uZGlza191c2VkKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJyZWFkcyB0aGUgZW11bGF0ZWQgc3RvcmFnZSBsaW5lIG9uIEFuZHJvaWQiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIi9kZXYvZnVzZSAxMDBHIDQwRyA2MEcgNDAlIC9zdG9yYWdlL2VtdWxhdGVkIik7CiAgICBleHBlY3QobS5kaXNrX3VzZWQoY3R4KCkpKS50b0JlKCI0MCUiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiL3N0b3JhZ2UvZW11bGF0ZWQgb25seSIpOwogICAgZXhwZWN0KG0uZGlza191c2VkKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBXaW5kb3dzLCBhbmQgY2FjaGVzIHRoZSByZXN1bHQiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgid2luZG93cyIpOwogICAgY29uc3QgY2FjaGUgPSB7fTsKICAgIGV4cGVjdChtLmRpc2tfdXNlZChjdHgoY2FjaGUpKSkudG9CZSgiIik7CiAgICBwbGF0Zm9ybSgibGludXgiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZShERl9IKTsKICAgIGV4cGVjdChtLmRpc2tfdXNlZChjdHgoY2FjaGUpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJyZXR1cm5zIGVtcHR5IHdoZW4gZGYgdGhyb3dzIGluc2lkZSB0aGUgcHJvYmUiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KG0uZGlza191c2VkKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7Cn0pOwoKY29uc3QgR0IgPSAxMDI0ICogMTAyNDsKY29uc3QgZGZLID0gKHJvd3M6IHN0cmluZ1tdKSA9PgogIFsiRmlsZXN5c3RlbSAxSy1ibG9ja3MgVXNlZCBBdmFpbGFibGUgVXNlJSBNb3VudGVkIG9uIiwgLi4ucm93c10uam9pbigiXG4iKTsKCmRlc2NyaWJlKCJkaXNrX3NpemUiLCAoKSA9PiB7CiAgaXQoInJlcG9ydHMgYSBzaW5nbGUgcmVhbCBkaXNrIHdpdGhvdXQgaXRzIG1vdW50IHBvaW50IiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKAogICAgICBkZksoWwogICAgICAgIGAvZGV2L3NkYTEgJHsxMDAgKiBHQn0gJHs0NSAqIEdCfSAkezUwICogR0J9IDQ3JSAvYCwKICAgICAgICBgdG1wZnMgJHsxMDAgKiBHQn0gMCAkezEwMCAqIEdCfSAwJSAvcnVuYCwKICAgICAgICBgL2Rldi9zZGEyICR7MTAwICogR0J9ICR7MSAqIEdCfSAkezk5ICogR0J9IDElIC9ib290YCwKICAgICAgICBgL2Rldi9zbWFsbCAxMDAwIDEwIDk5MCAxJSAvc21hbGxgLAogICAgICAgICJzaG9ydCByb3ciLAogICAgICAgIGAvZGV2L2JhZCBhYmMgZGVmIDEgMSUgL2JhZGAsCiAgICAgIF0pLAogICAgKTsKICAgIGV4cGVjdChtLmRpc2tfc2l6ZShjdHgoKSkpLnRvQmUoIjQ1LzEwMEdCIik7CiAgfSk7CgogIGl0KCJsYWJlbHMgZWFjaCBkaXNrIGJ5IG1vdW50IHBvaW50IHdoZW4gc2V2ZXJhbCBhcmUgZm91bmQiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoCiAgICAgIGRmSyhbCiAgICAgICAgYC9kZXYvc2RhMSAkezEwMCAqIEdCfSAkezQ1ICogR0J9ICR7NTAgKiBHQn0gNDclIC9gLAogICAgICAgIGAvZGV2L3NkYjEgJHs1MDAgKiBHQn0gJHszOTAgKiBHQn0gJHs4MCAqIEdCfSA3OCUgL21udC9kYXRhYCwKICAgICAgICBgZGV2dG1wZnMgJHs1MCAqIEdCfSAwICR7NTAgKiBHQn0gMCUgL2RldmAsCiAgICAgICAgYG92ZXJsYXkgJHs1MCAqIEdCfSAwICR7NTAgKiBHQn0gMCUgL3Zhci9saWIvZG9ja2VyYCwKICAgICAgICBgcHJvYyAkezUwICogR0J9IDAgJHs1MCAqIEdCfSAwJSAvcHJvY2AsCiAgICAgICAgYHN5c2ZzICR7NTAgKiBHQn0gMCAkezUwICogR0J9IDAlIC9zeXNgLAogICAgICBdKSwKICAgICk7CiAgICBleHBlY3QobS5kaXNrX3NpemUoY3R4KCkpKS50b0JlKCIvKDQ1LzEwMEdCKSAvbW50L2RhdGEoMzkwLzUwMEdCKSIpOwogIH0pOwoKICBpdCgicmV0dXJucyBlbXB0eSB3aGVuIG5vIGRpc2sgcXVhbGlmaWVzIiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKGRmSyhbYHRtcGZzICR7MTAwICogR0J9IDAgJHsxMDAgKiBHQn0gMCUgL3J1bmBdKSk7CiAgICBleHBlY3QobS5kaXNrX3NpemUoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoIm9ubHkgY291bnRzIC8gYW5kIC9Wb2x1bWVzLyogb24gbWFjT1MiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoCiAgICAgIGRmSyhbCiAgICAgICAgYC9kZXYvZGlzazNzMSAkezUwMCAqIEdCfSAkezIwMCAqIEdCfSAkezMwMCAqIEdCfSA0MCUgL2AsCiAgICAgICAgYC9kZXYvZGlzazNzNSAkezUwMCAqIEdCfSAkezIwMCAqIEdCfSAkezMwMCAqIEdCfSA0MCUgL1N5c3RlbS9Wb2x1bWVzL0RhdGFgLAogICAgICAgIGAvZGV2L2Rpc2s0czEgJHsxMDAwICogR0J9ICR7OTAwICogR0J9ICR7MTAwICogR0J9IDkwJSAvVm9sdW1lcy9CYWNrdXBgLAogICAgICBdKSwKICAgICk7CiAgICBleHBlY3QobS5kaXNrX3NpemUoY3R4KCkpKS50b0JlKCIvKDIwMC81MDBHQikgL1ZvbHVtZXMvQmFja3VwKDkwMC8xMDAwR0IpIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBXaW5kb3dzIGFuZCB3aGVuIGRmIHRocm93cyIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJ3aW5kb3dzIik7CiAgICBleHBlY3QobS5kaXNrX3NpemUoY3R4KCkpKS50b0JlKCIiKTsKICAgIHBsYXRmb3JtKCJsaW51eCIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChtLmRpc2tfc2l6ZShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgic2VydmVzIHRoZSBjYWNoZWQgdmFsdWUiLCAoKSA9PiB7CiAgICBjb25zdCBjYWNoZSA9IHt9OwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKGRmSyhbYC9kZXYvc2RhMSAkezEwMCAqIEdCfSAkezQ1ICogR0J9IDEgNDclIC9gXSkpOwogICAgZXhwZWN0KG0uZGlza19zaXplKGN0eChjYWNoZSkpKS50b0JlKCI0NS8xMDBHQiIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICAgIGV4cGVjdChtLmRpc2tfc2l6ZShjdHgoY2FjaGUpKSkudG9CZSgiNDUvMTAwR0IiKTsKICB9KTsKfSk7CgpkZXNjcmliZSgibW91bnRfcG9pbnRzIiwgKCkgPT4gewogIGl0KCJsaXN0cyBub24tc3lzdGVtIG1vdW50cyB3aXRoIHVzYWdlIG9uIExpbnV4IChtYXggMykiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoCiAgICAgIFsKICAgICAgICAiRmlsZXN5c3RlbSBTaXplIFVzZWQgQXZhaWwgVXNlJSBNb3VudGVkIG9uIiwKICAgICAgICAiL2Rldi9zZGExIDEwMEcgNDVHIDUwRyA0NyUgLyIsCiAgICAgICAgInRtcGZzIDFHIDAgMUcgMCUgL2Rldi9zaG0iLAogICAgICAgICIvZGV2L3NkYjEgNTAwRyAzOTBHIDgwRyA3OCUgL21udC9kYXRhIiwKICAgICAgICAiL2Rldi9zZGMxIDUwMEcgMTAwRyA4MEcgMjAlIC9ob21lIiwKICAgICAgICAiL2Rldi9zZGQxIDUwMEcgMTAwRyA4MEcgMjElIC9zcnYiLAogICAgICAgICIvZGV2L3NkZTEgNTAwRyAxMDBHIDgwRyAyMiUgL29wdCIsCiAgICAgICAgIndlaXJkIDFHIiwKICAgICAgICAibm9wZXJjZW50IG1vdW50IiwKICAgICAgICAiL2Rldi94IDFHIDFHIDAgMSUgL1N5c3RlbS9Wb2x1bWVzL0RhdGEiLAogICAgICBdLmpvaW4oIlxuIiksCiAgICApOwogICAgZXhwZWN0KG0ubW91bnRfcG9pbnRzKGN0eCgpKSkudG9CZSgiL21udC9kYXRhKDc4JSkgL2hvbWUoMjAlKSAvc3J2KDIxJSkiKTsKICB9KTsKCiAgaXQoInJlcG9ydHMgb25seSAvVm9sdW1lcyBtb3VudHMgb24gbWFjT1MiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoCiAgICAgIFsKICAgICAgICAiRmlsZXN5c3RlbSBTaXplIFVzZWQgQXZhaWwgQ2FwYWNpdHkgTW91bnRlZCBvbiIsCiAgICAgICAgIi9kZXYvZGlzazNzMSA1MDBHIDIwMEcgMzAwRyA0MCUgLyIsCiAgICAgICAgIi9kZXYvZGlzazRzMSAxVCA5MDBHIDEwMEcgOTAlIC9Wb2x1bWVzL0JhY2t1cCIsCiAgICAgICAgIi9kZXYvZGlzazNzNSA1MDBHIDIwMEcgMzAwRyA0MCUgL1N5c3RlbS9Wb2x1bWVzL0RhdGEiLAogICAgICBdLmpvaW4oIlxuIiksCiAgICApOwogICAgZXhwZWN0KG0ubW91bnRfcG9pbnRzKGN0eCgpKSkudG9CZSgiL1ZvbHVtZXMvQmFja3VwKDkwJSkiKTsKICB9KTsKCiAgaXQoImlzIGVtcHR5IG9uIFdpbmRvd3MgYW5kIHdoZW4gZGYgdGhyb3dzIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIndpbmRvd3MiKTsKICAgIGV4cGVjdChtLm1vdW50X3BvaW50cyhjdHgoKSkpLnRvQmUoIiIpOwogICAgcGxhdGZvcm0oImxpbnV4Iik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KG0ubW91bnRfcG9pbnRzKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJzZXJ2ZXMgdGhlIGNhY2hlZCB2YWx1ZSIsICgpID0+IHsKICAgIGNvbnN0IGNhY2hlID0ge307CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoCiAgICAgICJoXG4vZGV2L2EgMUcgMUcgMCA1JSAvbW50L2EiLAogICAgKTsKICAgIGV4cGVjdChtLm1vdW50X3BvaW50cyhjdHgoY2FjaGUpKSkudG9CZSgiL21udC9hKDUlKSIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICAgIGV4cGVjdChtLm1vdW50X3BvaW50cyhjdHgoY2FjaGUpKSkudG9CZSgiL21udC9hKDUlKSIpOwogIH0pOwp9KTsK\"","export default \"data:video/mp2t;base64,LyoqCiAqIE1lbW9yeSBhbmQgZGlzay1yZWxhdGVkIHN5c3RlbSBpbmZvcm1hdGlvbiBmdW5jdGlvbnMKICogQG1vZHVsZSBpbmZvL21lbW9yeQogKi8KCmltcG9ydCBvcyBmcm9tICJvcyI7CmltcG9ydCBmcyBmcm9tICJmcyI7CmltcG9ydCB0eXBlIHsgSW5mb0NvbnRleHQgfSBmcm9tICIuLi90eXBlcy9pbnRlcm5hbC10eXBlcyI7CmltcG9ydCB7IElTX0xJTlVYLCBJU19NQUMgfSBmcm9tICIuLi91dGlscy9wbGF0Zm9ybSI7CmltcG9ydCB7IGV4ZWNDb21tYW5kIH0gZnJvbSAiLi4vdXRpbHMvY29tbWFuZCI7CmltcG9ydCB7IGdldENhY2hlZFZhbHVlLCBzZXRDYWNoZWRWYWx1ZSB9IGZyb20gIi4uL2NhY2hlL2NhY2hlIjsKCi8qKgogKiBHZXRzIG1lbW9yeSB1c2FnZSBpbiBnaWdhYnl0ZXMKICogUmVhZHMgZnJvbSAvcHJvYy9tZW1pbmZvIG9uIExpbnV4LCBmYWxscyBiYWNrIHRvIG9zLnRvdGFsbWVtKCkKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBNZW1vcnkgdXNhZ2UgYXMgInVzZWQvdG90YWwgR0IiCiAqIEBleGFtcGxlICIxMi8zMkdCIiwgIjYvMTZHQiIKICovCmV4cG9ydCBmdW5jdGlvbiByYW1fdXNlZChjb250ZXh0OiBJbmZvQ29udGV4dCk6IHN0cmluZyB7CiAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgInJhbV91c2VkIik7CiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDsKCiAgaWYgKElTX0xJTlVYKSB7CiAgICB0cnkgewogICAgICBjb25zdCBtZW1pbmZvID0gZnMucmVhZEZpbGVTeW5jKCIvcHJvYy9tZW1pbmZvIiwgInV0ZjgiKTsKICAgICAgY29uc3QgdG90YWxNYXRjaCA9IG1lbWluZm8ubWF0Y2goL01lbVRvdGFsOlxzKyhcZCspIGtCLyk7CiAgICAgIGNvbnN0IGZyZWVNYXRjaCA9IG1lbWluZm8ubWF0Y2goL01lbUZyZWU6XHMrKFxkKykga0IvKTsKCiAgICAgIGlmICh0b3RhbE1hdGNoICYmIGZyZWVNYXRjaCkgewogICAgICAgIGNvbnN0IHRvdGFsTUIgPSBNYXRoLnJvdW5kKHBhcnNlSW50KHRvdGFsTWF0Y2hbMV0pIC8gMTAyNCk7CiAgICAgICAgY29uc3QgZnJlZU1CID0gTWF0aC5yb3VuZChwYXJzZUludChmcmVlTWF0Y2hbMV0pIC8gMTAyNCk7CiAgICAgICAgY29uc3QgdXNlZE1CID0gdG90YWxNQiAtIGZyZWVNQjsKCiAgICAgICAgY29uc3QgdG90YWxHQiA9IE1hdGgucm91bmQodG90YWxNQiAvIDEwMjQpOwogICAgICAgIGNvbnN0IHVzZWRHQiA9IE1hdGgucm91bmQodXNlZE1CIC8gMTAyNCk7CgogICAgICAgIGNvbnN0IHJlc3VsdCA9IGAke3VzZWRHQn0vJHt0b3RhbEdCfUdCYDsKICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAicmFtX3VzZWQiLCByZXN1bHQpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICB9CgogIGNvbnN0IHRvdGFsTWVtID0gb3MudG90YWxtZW0oKTsKICBjb25zdCBmcmVlTWVtID0gb3MuZnJlZW1lbSgpOwogIGNvbnN0IHVzZWRNZW0gPSB0b3RhbE1lbSAtIGZyZWVNZW07CgogIGNvbnN0IHRvdGFsR0IgPSBNYXRoLnJvdW5kKHRvdGFsTWVtIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpOwogIGNvbnN0IHVzZWRHQiA9IE1hdGgucm91bmQodXNlZE1lbSAvICgxMDI0ICogMTAyNCAqIDEwMjQpKTsKCiAgY29uc3QgcmVzdWx0ID0gYCR7dXNlZEdCfS8ke3RvdGFsR0J9R0JgOwogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJyYW1fdXNlZCIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqCiAqIEdldHMgYXZhaWxhYmxlIG1lbW9yeSBpbiBnaWdhYnl0ZXMKICogUmVhZHMgTWVtQXZhaWxhYmxlIGZyb20gL3Byb2MvbWVtaW5mbyAoTGludXgpIG9yIGRlcml2ZXMgaXQgZnJvbQogKiB2bV9zdGF0J3MgZnJlZStpbmFjdGl2ZSBwYWdlcyAobWFjT1MpCiAqIEByZXR1cm5zIEF2YWlsYWJsZSBtZW1vcnkgd2l0aCAiR0IgYXZhaWxhYmxlIiBzdWZmaXggb3IgZW1wdHkgc3RyaW5nCiAqIEBleGFtcGxlICIxMkdCIGF2YWlsYWJsZSIsICI0R0IgYXZhaWxhYmxlIgogKi8KZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeV9hdmFpbGFibGUoKTogc3RyaW5nIHsKICBpZiAoSVNfTElOVVgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IG1lbWluZm8gPSBmcy5yZWFkRmlsZVN5bmMoIi9wcm9jL21lbWluZm8iLCAidXRmOCIpOwogICAgICBjb25zdCBhdmFpbGFibGVNYXRjaCA9IG1lbWluZm8ubWF0Y2goL01lbUF2YWlsYWJsZTpccysoXGQrKSBrQi8pOwogICAgICBpZiAoYXZhaWxhYmxlTWF0Y2gpIHsKICAgICAgICBjb25zdCBhdmFpbGFibGVHQiA9IE1hdGgucm91bmQocGFyc2VJbnQoYXZhaWxhYmxlTWF0Y2hbMV0pIC8gMTAyNCAvIDEwMjQpOwogICAgICAgIHJldHVybiBgJHthdmFpbGFibGVHQn1HQiBhdmFpbGFibGVgOwogICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICByZXR1cm4gIiI7CiAgfQoKICBpZiAoSVNfTUFDKSB7CiAgICB0cnkgewogICAgICBjb25zdCB2bVN0YXQgPSBleGVjQ29tbWFuZCgidm1fc3RhdCIpOwogICAgICBjb25zdCBwYWdlU2l6ZU1hdGNoID0gdm1TdGF0Lm1hdGNoKC9wYWdlIHNpemUgb2YgKFxkKykgYnl0ZXMvKTsKICAgICAgY29uc3QgZnJlZU1hdGNoID0gdm1TdGF0Lm1hdGNoKC9QYWdlcyBmcmVlOlxzKyhcZCspXC4vKTsKICAgICAgY29uc3QgaW5hY3RpdmVNYXRjaCA9IHZtU3RhdC5tYXRjaCgvUGFnZXMgaW5hY3RpdmU6XHMrKFxkKylcLi8pOwoKICAgICAgaWYgKHBhZ2VTaXplTWF0Y2ggJiYgZnJlZU1hdGNoICYmIGluYWN0aXZlTWF0Y2gpIHsKICAgICAgICBjb25zdCBwYWdlU2l6ZSA9IHBhcnNlSW50KHBhZ2VTaXplTWF0Y2hbMV0pOwogICAgICAgIGNvbnN0IGF2YWlsYWJsZVBhZ2VzID0gcGFyc2VJbnQoZnJlZU1hdGNoWzFdKSArIHBhcnNlSW50KGluYWN0aXZlTWF0Y2hbMV0pOwogICAgICAgIGNvbnN0IGF2YWlsYWJsZUdCID0gTWF0aC5yb3VuZCgoYXZhaWxhYmxlUGFnZXMgKiBwYWdlU2l6ZSkgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSk7CiAgICAgICAgcmV0dXJuIGAke2F2YWlsYWJsZUdCfUdCIGF2YWlsYWJsZWA7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIHJldHVybiAiIjsKICB9CgogIHJldHVybiAiIjsKfQoKLyoqCiAqIEdldHMgc3dhcCBtZW1vcnkgdXNhZ2UKICogQ2FsY3VsYXRlcyBzd2FwIHVzYWdlIGZyb20gL3Byb2MvbWVtaW5mbyAoTGludXgpIG9yIGBzeXNjdGwgdm0uc3dhcHVzYWdlYAogKiAobWFjT1MpCiAqIEByZXR1cm5zIFN3YXAgdXNhZ2UgYXMgInBlcmNlbnRhZ2UgKHNpemUgTUIpIHN3YXAiIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiMTUlICg1MTJNQikgc3dhcCIsICIwJSAoME1CKSBzd2FwIgogKi8KZXhwb3J0IGZ1bmN0aW9uIHN3YXBfdXNlZCgpOiBzdHJpbmcgewogIGlmIChJU19MSU5VWCkgewogICAgdHJ5IHsKICAgICAgY29uc3QgbWVtaW5mbyA9IGZzLnJlYWRGaWxlU3luYygiL3Byb2MvbWVtaW5mbyIsICJ1dGY4Iik7CiAgICAgIGNvbnN0IHN3YXBUb3RhbE1hdGNoID0gbWVtaW5mby5tYXRjaCgvU3dhcFRvdGFsOlxzKyhcZCspIGtCLyk7CiAgICAgIGNvbnN0IHN3YXBGcmVlTWF0Y2ggPSBtZW1pbmZvLm1hdGNoKC9Td2FwRnJlZTpccysoXGQrKSBrQi8pOwoKICAgICAgaWYgKHN3YXBUb3RhbE1hdGNoICYmIHN3YXBGcmVlTWF0Y2gpIHsKICAgICAgICBjb25zdCBzd2FwVG90YWwgPSBwYXJzZUludChzd2FwVG90YWxNYXRjaFsxXSk7CiAgICAgICAgY29uc3Qgc3dhcEZyZWUgPSBwYXJzZUludChzd2FwRnJlZU1hdGNoWzFdKTsKICAgICAgICBjb25zdCBzd2FwVXNlZCA9IHN3YXBUb3RhbCAtIHN3YXBGcmVlOwoKICAgICAgICBpZiAoc3dhcFRvdGFsID4gMCkgewogICAgICAgICAgY29uc3Qgc3dhcFVzZWRQZXJjZW50ID0gTWF0aC5yb3VuZCgoc3dhcFVzZWQgLyBzd2FwVG90YWwpICogMTAwKTsKICAgICAgICAgIGNvbnN0IHN3YXBVc2VkTUIgPSBNYXRoLnJvdW5kKHN3YXBVc2VkIC8gMTAyNCk7CiAgICAgICAgICByZXR1cm4gYCR7c3dhcFVzZWRQZXJjZW50fSUgKCR7c3dhcFVzZWRNQn1NQikgc3dhcGA7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICByZXR1cm4gIiI7CiAgfQoKICBpZiAoSVNfTUFDKSB7CiAgICB0cnkgewogICAgICBjb25zdCBzd2FwdXNhZ2UgPSBleGVjQ29tbWFuZCgic3lzY3RsIC1uIHZtLnN3YXB1c2FnZSIpOwogICAgICBjb25zdCBtYXRjaCA9IHN3YXB1c2FnZS5tYXRjaCgKICAgICAgICAvdG90YWxccyo9XHMqKFtcZC5dKylNXHMrdXNlZFxzKj1ccyooW1xkLl0rKU1ccytmcmVlXHMqPVxzKihbXGQuXSspTS8KICAgICAgKTsKCiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIGNvbnN0IHN3YXBUb3RhbCA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pOwogICAgICAgIGNvbnN0IHN3YXBVc2VkTUIgPSBwYXJzZUZsb2F0KG1hdGNoWzJdKTsKCiAgICAgICAgaWYgKHN3YXBUb3RhbCA+IDApIHsKICAgICAgICAgIGNvbnN0IHN3YXBVc2VkUGVyY2VudCA9IE1hdGgucm91bmQoKHN3YXBVc2VkTUIgLyBzd2FwVG90YWwpICogMTAwKTsKICAgICAgICAgIHJldHVybiBgJHtzd2FwVXNlZFBlcmNlbnR9JSAoJHtNYXRoLnJvdW5kKHN3YXBVc2VkTUIpfU1CKSBzd2FwYDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAiMCUgKDBNQikgc3dhcCI7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIHJldHVybiAiIjsKICB9CgogIHJldHVybiAiIjsKfQoKLyoqCiAqIEdldHMgcm9vdCBmaWxlc3lzdGVtIGRpc2sgdXNhZ2UgcGVyY2VudGFnZQogKiBVc2VzIGRmIGNvbW1hbmQgb24gTGludXgvQW5kcm9pZC9tYWNPUwogKiBAcGFyYW0gY29udGV4dCAtIEluZm8gY29udGV4dCB3aXRoIGNhY2hlCiAqIEByZXR1cm5zIFBlcmNlbnRhZ2Ugc3RyaW5nIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiNDUlIiwgIjc4JSIKICovCmV4cG9ydCBmdW5jdGlvbiBkaXNrX3VzZWQoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJkaXNrX3VzZWQiKTsKICBpZiAoY2FjaGVkICE9PSBudWxsKSByZXR1cm4gY2FjaGVkOwoKICBpZiAoSVNfTElOVVggfHwgSVNfTUFDKSB7CiAgICB0cnkgewogICAgICBjb25zdCBkZiA9IGV4ZWNDb21tYW5kKCJkZiAtaCIpOwogICAgICBsZXQgZGlza1VzYWdlID0gIiI7CgogICAgICBpZiAoZGYuaW5jbHVkZXMoIi9zdG9yYWdlL2VtdWxhdGVkIikpIHsKICAgICAgICBjb25zdCBtYXRjaCA9IGRmLm1hdGNoKC9ccysoXGQrJSlccytcL3N0b3JhZ2VcL2VtdWxhdGVkLyk7CiAgICAgICAgZGlza1VzYWdlID0gbWF0Y2ggPyBtYXRjaFsxXSA6ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxpbmVzID0gZGYuc3BsaXQoIlxuIik7CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIiAvIikpIHsKICAgICAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRJbmRleCA9IHBhcnRzLmZpbmRJbmRleCgocGFydCkgPT4gcGFydC5pbmNsdWRlcygiJSIpKTsKICAgICAgICAgICAgaWYgKHBlcmNlbnRJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICBkaXNrVXNhZ2UgPSBwYXJ0c1twZXJjZW50SW5kZXhdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWRpc2tVc2FnZSkgewogICAgICAgICAgY29uc3Qgcm9vdE1hdGNoID0gZGYubWF0Y2goLyhcZCslKVxzK1wvXHMqJC9tKTsKICAgICAgICAgIGRpc2tVc2FnZSA9IHJvb3RNYXRjaCA/IHJvb3RNYXRjaFsxXSA6ICIiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgImRpc2tfdXNlZCIsIGRpc2tVc2FnZSk7CiAgICAgIHJldHVybiBkaXNrVXNhZ2U7CiAgICB9IGNhdGNoIHt9CiAgfQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGlza191c2VkIiwgIiIpOwogIHJldHVybiAiIjsKfQoKLyoqCiAqIE1pbmltdW0gdG90YWwgc2l6ZSAoaW4gS0IpIGZvciBhIHBhcnRpdGlvbiB0byBiZSBjb25zaWRlcmVkIGEgcmVhbCBkaXNrCiAqIHJhdGhlciB0aGFuIGEgc21hbGwgc3lzdGVtL2Jvb3QgcGFydGl0aW9uCiAqLwpjb25zdCBNSU5fUkVBTF9ESVNLX0tCID0gMTAgKiAxMDI0ICogMTAyNDsgLy8gMTBHQgoKLyoqCiAqIEdldHMgZGlzayBzaXplICh1c2VkL3RvdGFsKSBmb3IgZWFjaCByZWFsIGRpc2sKICogVXNlcyBgZGYgLWtgIG9uIExpbnV4L21hY09TLCBmaWx0ZXJpbmcgb3V0IHBzZXVkbyBmaWxlc3lzdGVtcywgc3lzdGVtL2Jvb3QKICogcGFydGl0aW9ucyAoZS5nLiAvYm9vdCwgL1N5c3RlbS9Wb2x1bWVzLyopLCBhbmQgYW55dGhpbmcgdW5kZXIgMTBHQiwgc2luY2UKICogdGhvc2UgYXJlbid0IGRpc2tzIGEgdXNlciB3b3VsZCBjYXJlIGFib3V0LiBXaGVuIGV4YWN0bHkgb25lIHJlYWwgZGlzayBpcwogKiBmb3VuZCAodGhlIGNvbW1vbiBjYXNlKSB0aGUgcmVzdWx0IG9taXRzIHRoZSBtb3VudCBwb2ludDsgd2hlbiBtdWx0aXBsZQogKiByZWFsIGRpc2tzIGFyZSBmb3VuZCAoZS5nLiBhIGRhdGEgZHJpdmUgb3IgZXh0ZXJuYWwgdm9sdW1lKSwgZWFjaCBpcwogKiBsYWJlbGVkIGJ5IGl0cyBtb3VudCBwb2ludC4KICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBEaXNrIHNpemUgYXMgInVzZWQvdG90YWwgR0IiIG9yICJtb3VudCh1c2VkL3RvdGFsIEdCKSAuLi4iIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiMjU2LzUxMkdCIiwgIi8oMTAwLzUwMEdCKSAvVm9sdW1lcy9CYWNrdXAoOTAwLzIwMDBHQikiCiAqLwpleHBvcnQgZnVuY3Rpb24gZGlza19zaXplKGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGlza19zaXplIik7CiAgaWYgKGNhY2hlZCAhPT0gbnVsbCkgcmV0dXJuIGNhY2hlZDsKCiAgaWYgKCFJU19MSU5VWCAmJiAhSVNfTUFDKSB7CiAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGlza19zaXplIiwgIiIpOwogICAgcmV0dXJuICIiOwogIH0KCiAgdHJ5IHsKICAgIGNvbnN0IGRmID0gZXhlY0NvbW1hbmQoImRmIC1rIik7CiAgICBjb25zdCBsaW5lcyA9IGRmLnRyaW0oKS5zcGxpdCgiXG4iKS5zbGljZSgxKTsKICAgIGNvbnN0IGRpc2tzOiB7IG1vdW50OiBzdHJpbmc7IHVzZWRHQjogbnVtYmVyOyB0b3RhbEdCOiBudW1iZXIgfVtdID0gW107CgogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGNvbnN0IHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBpZiAocGFydHMubGVuZ3RoIDwgNikgY29udGludWU7CgogICAgICBjb25zdCBmaWxlc3lzdGVtID0gcGFydHNbMF07CiAgICAgIGNvbnN0IHRvdGFsS0IgPSBwYXJzZUludChwYXJ0c1sxXSk7CiAgICAgIGNvbnN0IHVzZWRLQiA9IHBhcnNlSW50KHBhcnRzWzJdKTsKICAgICAgY29uc3QgbW91bnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKCiAgICAgIGlmIChpc05hTih0b3RhbEtCKSB8fCBpc05hTih1c2VkS0IpIHx8IHRvdGFsS0IgPCBNSU5fUkVBTF9ESVNLX0tCKSBjb250aW51ZTsKCiAgICAgIGlmIChJU19NQUMpIHsKICAgICAgICAvLyBPbmx5IHRoZSBib290IGRpc2sgKCIvIikgYW5kIGV4dGVybmFsbHkgbW91bnRlZCByZWFsIGRpc2tzIGNvdW50LgogICAgICAgIC8vIEFQRlMgaW50ZXJuYWwgc3lzdGVtIHZvbHVtZXMgKERhdGEsIFZNLCBQcmVib290LCBVcGRhdGUsIC4uLikgYWxsCiAgICAgICAgLy8gbGl2ZSB1bmRlciAvU3lzdGVtL1ZvbHVtZXMgYW5kIGFyZW4ndCBzZXBhcmF0ZSBwaHlzaWNhbCBkaXNrcy4KICAgICAgICBpZiAobW91bnQgIT09ICIvIiAmJiAhbW91bnQuc3RhcnRzV2l0aCgiL1ZvbHVtZXMvIikpIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgKICAgICAgICAgIGZpbGVzeXN0ZW0uc3RhcnRzV2l0aCgiZGV2dG1wZnMiKSB8fAogICAgICAgICAgZmlsZXN5c3RlbS5zdGFydHNXaXRoKCJ0bXBmcyIpIHx8CiAgICAgICAgICBmaWxlc3lzdGVtID09PSAib3ZlcmxheSIgfHwKICAgICAgICAgIG1vdW50LnN0YXJ0c1dpdGgoIi9ib290IikgfHwKICAgICAgICAgIG1vdW50LnN0YXJ0c1dpdGgoIi9kZXYiKSB8fAogICAgICAgICAgbW91bnQuc3RhcnRzV2l0aCgiL3Byb2MiKSB8fAogICAgICAgICAgbW91bnQuc3RhcnRzV2l0aCgiL3N5cyIpIHx8CiAgICAgICAgICBtb3VudC5zdGFydHNXaXRoKCIvcnVuIikKICAgICAgICApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZGlza3MucHVzaCh7CiAgICAgICAgbW91bnQsCiAgICAgICAgdXNlZEdCOiBNYXRoLnJvdW5kKHVzZWRLQiAvICgxMDI0ICogMTAyNCkpLAogICAgICAgIHRvdGFsR0I6IE1hdGgucm91bmQodG90YWxLQiAvICgxMDI0ICogMTAyNCkpLAogICAgICB9KTsKICAgIH0KCiAgICBsZXQgcmVzdWx0ID0gIiI7CiAgICBpZiAoZGlza3MubGVuZ3RoID09PSAxKSB7CiAgICAgIHJlc3VsdCA9IGAke2Rpc2tzWzBdLnVzZWRHQn0vJHtkaXNrc1swXS50b3RhbEdCfUdCYDsKICAgIH0gZWxzZSBpZiAoZGlza3MubGVuZ3RoID4gMSkgewogICAgICByZXN1bHQgPSBkaXNrcwogICAgICAgIC5tYXAoKGQpID0+IGAke2QubW91bnR9KCR7ZC51c2VkR0J9LyR7ZC50b3RhbEdCfUdCKWApCiAgICAgICAgLmpvaW4oIiAiKTsKICAgIH0KCiAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGlza19zaXplIiwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSBjYXRjaCB7fQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGlza19zaXplIiwgIiIpOwogIHJldHVybiAiIjsKfQoKLyoqCiAqIEdldHMgbW91bnRlZCBmaWxlc3lzdGVtIGluZm9ybWF0aW9uCiAqIExpc3RzIG5vbi1zeXN0ZW0gbW91bnQgcG9pbnRzIHdpdGggdXNhZ2UgZnJvbSBkZiAoTGludXgvbWFjT1MpCiAqIE9uIExpbnV4LCBleGNsdWRlcyAvLCAvZGV2LCAvcHJvYywgL3N5cyBhbmQgaW50ZXJuYWwgL1N5c3RlbS9Wb2x1bWVzIG1vdW50cy4KICogT24gbWFjT1MsIEFQRlMgaW50ZXJuYWwgdm9sdW1lcyAoRGF0YSwgVk0sIFByZWJvb3QsIFVwZGF0ZSwgLi4uKSBhbGwgbGl2ZQogKiB1bmRlciAvU3lzdGVtL1ZvbHVtZXMgYW5kIGFyZSBub3QgdXNlci1yZWxldmFudCwgc28gb25seSAvVm9sdW1lcyAoZXh0ZXJuYWwKICogZGlza3MsIG5ldHdvcmsgc2hhcmVzLCBkaXNrIGltYWdlcykgYXJlIHJlcG9ydGVkLgogKiBAcGFyYW0gY29udGV4dCAtIEluZm8gY29udGV4dCB3aXRoIGNhY2hlCiAqIEByZXR1cm5zIFNwYWNlLXNlcGFyYXRlZCBtb3VudCBwb2ludHMgd2l0aCB1c2FnZSBvciBlbXB0eSBzdHJpbmcKICogQGV4YW1wbGUgIi9ob21lKDQ1JSkgL21udC9kYXRhKDc4JSkiLCAiL1ZvbHVtZXMvQmFja3VwKDc4JSkiCiAqLwpleHBvcnQgZnVuY3Rpb24gbW91bnRfcG9pbnRzKGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAibW91bnRfcG9pbnRzIik7CiAgaWYgKGNhY2hlZCAhPT0gbnVsbCkgcmV0dXJuIGNhY2hlZDsKCiAgaWYgKCFJU19MSU5VWCAmJiAhSVNfTUFDKSB7CiAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAibW91bnRfcG9pbnRzIiwgIiIpOwogICAgcmV0dXJuICIiOwogIH0KCiAgdHJ5IHsKICAgIGNvbnN0IGRmID0gZXhlY0NvbW1hbmQoImRmIC1oIik7CiAgICBjb25zdCBsaW5lcyA9IGRmLnNwbGl0KCJcbiIpLnNsaWNlKDEpOwogICAgY29uc3QgbW91bnRQb2ludHM6IHN0cmluZ1tdID0gW107CgogICAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4gewogICAgICBjb25zdCBwYXJ0cyA9IGxpbmUudHJpbSgpLnNwbGl0KC9ccysvKTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHJldHVybjsKCiAgICAgIGNvbnN0IG1vdW50UG9pbnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTsKICAgICAgY29uc3QgdXNhZ2UgPSBwYXJ0cy5maW5kKChwYXJ0KSA9PiAvXlxkKyUkLy50ZXN0KHBhcnQpKSB8fCAiIjsKCiAgICAgIGlmICghdXNhZ2UpIHJldHVybjsKCiAgICAgIGlmIChJU19NQUMpIHsKICAgICAgICAvLyBTa2lwIHRoZSAiTWFjaW50b3NoIEhEIiBzZWxmLXN5bWxpbmsgYW5kIGFueSBvdGhlciBzeW1saW5rIGJhY2sgdG8gLwogICAgICAgIGlmIChtb3VudFBvaW50LnN0YXJ0c1dpdGgoIi9Wb2x1bWVzLyIpICYmIG1vdW50UG9pbnQgIT09ICIvIikgewogICAgICAgICAgbW91bnRQb2ludHMucHVzaChgJHttb3VudFBvaW50fSgke3VzYWdlfSlgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoCiAgICAgICAgIW1vdW50UG9pbnQuc3RhcnRzV2l0aCgiL2RldiIpICYmCiAgICAgICAgIW1vdW50UG9pbnQuc3RhcnRzV2l0aCgiL3Byb2MiKSAmJgogICAgICAgICFtb3VudFBvaW50LnN0YXJ0c1dpdGgoIi9zeXMiKSAmJgogICAgICAgICFtb3VudFBvaW50LnN0YXJ0c1dpdGgoIi9TeXN0ZW0vVm9sdW1lcyIpICYmCiAgICAgICAgbW91bnRQb2ludCAhPT0gIi8iCiAgICAgICkgewogICAgICAgIG1vdW50UG9pbnRzLnB1c2goYCR7bW91bnRQb2ludH0oJHt1c2FnZX0pYCk7CiAgICAgIH0KICAgIH0pOwoKICAgIGNvbnN0IHJlc3VsdCA9IG1vdW50UG9pbnRzLnNsaWNlKDAsIDMpLmpvaW4oIiAiKTsKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJtb3VudF9wb2ludHMiLCByZXN1bHQpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9IGNhdGNoIHt9CgogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJtb3VudF9wb2ludHMiLCAiIik7CiAgcmV0dXJuICIiOwp9Cg==\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAidml0ZXN0IjsKCmNvbnN0IGZsYWdzID0gdmkuaG9pc3RlZCgoKSA9PiAoeyBsaW51eDogdHJ1ZSwgbWFjOiBmYWxzZSwgd2luZG93czogZmFsc2UgfSkpOwp2aS5tb2NrKCIuLi91dGlscy9wbGF0Zm9ybSIsICgpID0+ICh7CiAgZ2V0IElTX0xJTlVYKCkgewogICAgcmV0dXJuIGZsYWdzLmxpbnV4OwogIH0sCiAgZ2V0IElTX01BQygpIHsKICAgIHJldHVybiBmbGFncy5tYWM7CiAgfSwKICBnZXQgSVNfV0lORE9XUygpIHsKICAgIHJldHVybiBmbGFncy53aW5kb3dzOwogIH0sCn0pKTsKCmNvbnN0IGV4ZWNDb21tYW5kID0gdmkuaG9pc3RlZCgoKSA9PiB2aS5mbigpKTsKdmkubW9jaygiLi4vdXRpbHMvY29tbWFuZCIsICgpID0+ICh7IGV4ZWNDb21tYW5kLCBjb21tYW5kRXhpc3RzOiB2aS5mbigpIH0pKTsKCmNvbnN0IG9zTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICBuZXR3b3JrSW50ZXJmYWNlczogdmkuZm4oKSwKICB0bXBkaXI6IHZpLmZuKCgpID0+ICIvdG1wIiksCiAgcGxhdGZvcm06IHZpLmZuKCgpID0+ICJsaW51eCIpLAp9KSk7CnZpLm1vY2soIm9zIiwgKCkgPT4gKHsgLi4ub3NNb2NrLCBkZWZhdWx0OiBvc01vY2sgfSkpOwoKY29uc3QgbiA9IGF3YWl0IGltcG9ydCgiLi9uZXR3b3JrIik7CmltcG9ydCB0eXBlIHsgSW5mb0NvbnRleHQgfSBmcm9tICIuLi90eXBlcy9pbnRlcm5hbC10eXBlcyI7Cgpjb25zdCBjdHggPSAoZXh0cmE6IFBhcnRpYWw8SW5mb0NvbnRleHQ+ID0ge30pOiBJbmZvQ29udGV4dCA9PiAoeyBjYWNoZToge30sIC4uLmV4dHJhIH0pOwpjb25zdCBwbGF0Zm9ybSA9IChwOiAibGludXgiIHwgIm1hYyIgfCAid2luZG93cyIpID0+IHsKICBmbGFncy5saW51eCA9IHAgPT09ICJsaW51eCI7CiAgZmxhZ3MubWFjID0gcCA9PT0gIm1hYyI7CiAgZmxhZ3Mud2luZG93cyA9IHAgPT09ICJ3aW5kb3dzIjsKfTsKCmNvbnN0IGlmYWNlID0gKGFkZHJlc3M6IHN0cmluZywgaW50ZXJuYWwgPSBmYWxzZSwgZmFtaWx5ID0gIklQdjQiKSA9PiAoewogIGFkZHJlc3MsCiAgZmFtaWx5LAogIGludGVybmFsLAp9KTsKCmJlZm9yZUVhY2goKCkgPT4gewogIHBsYXRmb3JtKCJsaW51eCIpOwogIGV4ZWNDb21tYW5kLm1vY2tSZXNldCgpLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgb3NNb2NrLm5ldHdvcmtJbnRlcmZhY2VzLm1vY2tSZXNldCgpLm1vY2tSZXR1cm5WYWx1ZSh7fSk7Cn0pOwoKZGVzY3JpYmUoImlwaW5mby1kZXJpdmVkIGZpZWxkcyIsICgpID0+IHsKICBjb25zdCBpbmZvID0geyBpcDogIjEuMi4zLjQiLCBjaXR5OiAiUGFyaXMiLCBob3N0bmFtZTogImhvc3QuZXhhbXBsZSIsIG9yZzogIkFTMTIzIEV4YW1wbGUgTmV0IEluYyIgfTsKCiAgaXQoImlwIC8gY2l0eSByZWFkIGZyb20gdGhlIGNvbnRleHQiLCAoKSA9PiB7CiAgICBleHBlY3Qobi5pcChjdHgoeyBpcEluZm86IGluZm8gfSkpKS50b0JlKCIxLjIuMy40Iik7CiAgICBleHBlY3Qobi5jaXR5KGN0eCh7IGlwSW5mbzogaW5mbyB9KSkpLnRvQmUoIlBhcmlzIik7CiAgICBleHBlY3Qobi5pcChjdHgoKSkpLnRvQmUoIiIpOwogICAgZXhwZWN0KG4uY2l0eShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgiZG9tYWluIHByZWZpeGVzIGh0dHA6Ly8gb25seSB3aGVuIGEgaG9zdG5hbWUgaXMga25vd24iLCAoKSA9PiB7CiAgICBleHBlY3Qobi5kb21haW4oY3R4KHsgaXBJbmZvOiBpbmZvIH0pKSkudG9CZSgiaHR0cDovL2hvc3QuZXhhbXBsZSIpOwogICAgZXhwZWN0KG4uZG9tYWluKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpc3AgZHJvcHMgdGhlIGxlYWRpbmcgQVMgbnVtYmVyIiwgKCkgPT4gewogICAgZXhwZWN0KG4uaXNwKGN0eCh7IGlwSW5mbzogaW5mbyB9KSkpLnRvQmUoIkV4YW1wbGUgTmV0IEluYyIpOwogICAgZXhwZWN0KG4uaXNwKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImlwbG9jYWwiLCAoKSA9PiB7CiAgaXQoInByZWZlcnMgdGhlIHdsYW4wIGFkZHJlc3MgZnJvbSBpZmNvbmZpZyBvbiBMaW51eCIsICgpID0+IHsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiZXRoMDogZmxhZ3NcbiAgaW5ldCAxMC4wLjAuMlxud2xhbjA6IGZsYWdzXG4gIGluZXQgMTkyLjE2OC4xLjUwIG5ldG1hc2siKTsKICAgIGV4cGVjdChuLmlwbG9jYWwoKSkudG9CZSgiMTkyLjE2OC4xLjUwIik7CiAgfSk7CgogIGl0KCJmYWxscyBiYWNrIHRvIGBpcCBhZGRyYCwgc2tpcHBpbmcgbG9vcGJhY2siLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4KICAgICAgYy5zdGFydHNXaXRoKCJpZmNvbmZpZyIpCiAgICAgICAgPyAiIgogICAgICAgIDogImluZXQgMTI3LjAuMC4xLzggbG9cbmluZXQgMTAuMC4wLjUvMjQgZXRoMFxuaW5ldCAxNzIuMTYuMC45LzE2IGV0aDEiLAogICAgKTsKICAgIGV4cGVjdChuLmlwbG9jYWwoKSkudG9CZSgiMTAuMC4wLjUgMTcyLjE2LjAuOSIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byBvcy5uZXR3b3JrSW50ZXJmYWNlcyB3aGVuIHRoZSBzaGVsbCB0b29scyBmaW5kIG5vdGhpbmciLCAoKSA9PiB7CiAgICBvc01vY2submV0d29ya0ludGVyZmFjZXMubW9ja1JldHVyblZhbHVlKHsKICAgICAgbG86IFtpZmFjZSgiMTI3LjAuMC4xIiwgdHJ1ZSldLAogICAgICBldGgwOiBbaWZhY2UoIjEwLjEuMS4xIiksIGlmYWNlKCJmZTgwOjoxIiwgZmFsc2UsICJJUHY2IildLAogICAgICB3bDogdW5kZWZpbmVkLAogICAgfSk7CiAgICBleHBlY3Qobi5pcGxvY2FsKCkpLnRvQmUoIjEwLjEuMS4xIik7CiAgfSk7CgogIGl0KCJzdXJ2aXZlcyB0aGUgc2hlbGwgaGVscGVycyB0aHJvd2luZyIsICgpID0+IHsKICAgIGV4ZWNDb21tYW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigieCIpOwogICAgfSk7CiAgICBvc01vY2submV0d29ya0ludGVyZmFjZXMubW9ja1JldHVyblZhbHVlKHsgZW4wOiBbaWZhY2UoIjE5Mi4xNjguMC4yIildIH0pOwogICAgZXhwZWN0KG4uaXBsb2NhbCgpKS50b0JlKCIxOTIuMTY4LjAuMiIpOwogIH0pOwoKICBpdCgidXNlcyBvcy5uZXR3b3JrSW50ZXJmYWNlcyBkaXJlY3RseSBvbiBtYWNPUyIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJtYWMiKTsKICAgIG9zTW9jay5uZXR3b3JrSW50ZXJmYWNlcy5tb2NrUmV0dXJuVmFsdWUoeyBlbjA6IFtpZmFjZSgiMTkyLjE2OC4wLjkiKV0gfSk7CiAgICBleHBlY3Qobi5pcGxvY2FsKCkpLnRvQmUoIjE5Mi4xNjguMC45Iik7CiAgICBleHBlY3QoZXhlY0NvbW1hbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoIm5ldHdvcmtfaW50ZXJmYWNlcyIsICgpID0+IHsKICBpdCgibGlzdHMgYWN0aXZlIG5vbi1sb29wYmFjayBJUHY0IGludGVyZmFjZXMiLCAoKSA9PiB7CiAgICBvc01vY2submV0d29ya0ludGVyZmFjZXMubW9ja1JldHVyblZhbHVlKHsKICAgICAgbG86IFtpZmFjZSgiMTI3LjAuMC4xIiwgdHJ1ZSldLAogICAgICBldGgwOiBbaWZhY2UoIjEwLjAuMC4xIildLAogICAgICBkb2NrZXIwOiBbaWZhY2UoIjE3Mi4xNy4wLjEiLCB0cnVlKV0sCiAgICAgIHdsYW4wOiBbaWZhY2UoImZlODA6OjEiLCBmYWxzZSwgIklQdjYiKSwgaWZhY2UoIjEwLjAuMC4yIildLAogICAgICBlbXB0eTogdW5kZWZpbmVkLAogICAgfSk7CiAgICBleHBlY3Qobi5uZXR3b3JrX2ludGVyZmFjZXMoY3R4KCkpKS50b0JlKCJldGgwIHdsYW4wIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBXaW5kb3dzIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIndpbmRvd3MiKTsKICAgIGV4cGVjdChuLm5ldHdvcmtfaW50ZXJmYWNlcyhjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2hlbiBvcy5uZXR3b3JrSW50ZXJmYWNlcyB0aHJvd3MiLCAoKSA9PiB7CiAgICBvc01vY2submV0d29ya0ludGVyZmFjZXMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChuLm5ldHdvcmtfaW50ZXJmYWNlcyhjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgic2VydmVzIGZyb20gdGhlIGNhY2hlIiwgKCkgPT4gewogICAgY29uc3QgYyA9IGN0eCgpOwogICAgb3NNb2NrLm5ldHdvcmtJbnRlcmZhY2VzLm1vY2tSZXR1cm5WYWx1ZSh7IGV0aDA6IFtpZmFjZSgiMTAuMC4wLjEiKV0gfSk7CiAgICBleHBlY3Qobi5uZXR3b3JrX2ludGVyZmFjZXMoYykpLnRvQmUoImV0aDAiKTsKICAgIG9zTW9jay5uZXR3b3JrSW50ZXJmYWNlcy5tb2NrUmV0dXJuVmFsdWUoe30pOwogICAgZXhwZWN0KG4ubmV0d29ya19pbnRlcmZhY2VzKGMpKS50b0JlKCJldGgwIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoInBvcnRzIiwgKCkgPT4gewogIGNvbnN0IExTT0YgPSBbCiAgICAiQ09NTUFORCBQSUQgVVNFUiBGRCBUWVBFIERFVklDRSBTSVpFL09GRiBOT0RFIE5BTUUiLAogICAgIm5vZGUgMTAwIG1lIDIwdSBJUHY0IDB4MSAwdDAgVENQICo6MzAwMCAoTElTVEVOKSIucmVwbGFjZSgiKjozMDAwIChMSVNURU4pIiwgIio6MzAwMCIpLAogICAgIm5naW54LXdvIDEwMSBtZSA2dSBJUHY2IDB4MiAwdDAgVENQIFs6OjFdOjgwODAiLAogICAgIm5vZGUgMTAyIG1lIDIxdSBJUHY0IDB4MyAwdDAgVENQICo6MzAwMCIsCiAgICAic2hvcnQgbGluZSIsCiAgICAid2VpcmQgMTAzIG1lIDV1IElQdjQgMHg0IDB0MCBUQ1Agbm9wb3J0IiwKICBdLmpvaW4oIlxuIik7CgogIGl0KCJsaXN0cyB1bmlxdWUgcG9ydCtwcm9jZXNzIHBhaXJzIiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKExTT0YpOwogICAgZXhwZWN0KG4ucG9ydHMoY3R4KCkpKS50b0JlKCIzMDAwbm9kZSA4MDgwbmdpbiIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgb24gV2luZG93cyBhbmQgd2hlbiBsc29mIHRocm93cyIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJ3aW5kb3dzIik7CiAgICBleHBlY3Qobi5wb3J0cyhjdHgoKSkpLnRvQmUoIiIpOwogICAgcGxhdGZvcm0oImxpbnV4Iik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KG4ucG9ydHMoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoInNlcnZlcyBmcm9tIHRoZSBjYWNoZSIsICgpID0+IHsKICAgIGNvbnN0IGMgPSBjdHgoKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZShMU09GKTsKICAgIG4ucG9ydHMoYyk7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIiIpOwogICAgZXhwZWN0KG4ucG9ydHMoYykpLnRvQmUoIjMwMDBub2RlIDgwODBuZ2luIik7CiAgfSk7Cn0pOwo=\"","export default \"data:video/mp2t;base64,LyoqCiAqIE5ldHdvcmstcmVsYXRlZCBzeXN0ZW0gaW5mb3JtYXRpb24gZnVuY3Rpb25zCiAqIEBtb2R1bGUgaW5mby9uZXR3b3JrCiAqLwoKaW1wb3J0IG9zIGZyb20gIm9zIjsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKaW1wb3J0IHsgSVNfTElOVVgsIElTX01BQyB9IGZyb20gIi4uL3V0aWxzL3BsYXRmb3JtIjsKaW1wb3J0IHsgZXhlY0NvbW1hbmQgfSBmcm9tICIuLi91dGlscy9jb21tYW5kIjsKaW1wb3J0IHsgZ2V0Q2FjaGVkVmFsdWUsIHNldENhY2hlZFZhbHVlIH0gZnJvbSAiLi4vY2FjaGUvY2FjaGUiOwoKLyoqCiAqIEdldHMgcHVibGljIElQIGFkZHJlc3MuIFRoZSBpcCwgY2l0eSwgZG9tYWluIGFuZCBpc3AgYmxvY2tzIGFsbCByZWFkIHRoZSBvbmUKICogc2hhcmVkIGxvb2t1cCBpbiBgY29udGV4dC5pcEluZm9gLCB3aGljaCBgZ2V0U3lzdGVtSW5mb2AgY2FjaGVzIGZvciAxMCBtaW51dGVzLgogKiBAcGFyYW0gY29udGV4dCAtIEluZm8gY29udGV4dCB3aXRoIElQIGluZm8KICogQHJldHVybnMgUHVibGljIElQIGFkZHJlc3Mgb3IgZW1wdHkgc3RyaW5nCiAqIEBleGFtcGxlICIyMDMuMC4xMTMuNDIiCiAqLwpleHBvcnQgZnVuY3Rpb24gaXAoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIHJldHVybiBjb250ZXh0LmlwSW5mbz8uaXAgfHwgIiI7Cn0KCi8qKgogKiBHZXRzIGxvY2FsL3ByaXZhdGUgSVAgYWRkcmVzcyhlcykKICogVHJpZXMgaWZjb25maWcgYW5kIGlwIGNvbW1hbmRzIG9uIExpbnV4LCBmYWxscyBiYWNrIHRvIE5vZGUuanMgQVBJCiAqIEByZXR1cm5zIFNwYWNlLXNlcGFyYXRlZCBsb2NhbCBJUCBhZGRyZXNzZXMgKFJGQyAxOTE4IHJhbmdlcykKICogQGV4YW1wbGUgIjE5Mi4xNjguMS4xMDAiIG9yICIxMC4wLjAuNTAgMTkyLjE2OC4xLjEwMCIKICovCmV4cG9ydCBmdW5jdGlvbiBpcGxvY2FsKCk6IHN0cmluZyB7CiAgaWYgKElTX0xJTlVYKSB7CiAgICB0cnkgewogICAgICBjb25zdCBpZmNvbmZpZyA9IGV4ZWNDb21tYW5kKCJpZmNvbmZpZyAyPi9kZXYvbnVsbCIpOwogICAgICBjb25zdCB3bGFuTWF0Y2ggPSBpZmNvbmZpZy5tYXRjaCgKICAgICAgICAvd2xhbjBbXHNcU10qP2luZXQgKFxkK1wuXGQrXC5cZCtcLlxkKykvCiAgICAgICk7CiAgICAgIGlmICh3bGFuTWF0Y2gpIHsKICAgICAgICByZXR1cm4gd2xhbk1hdGNoWzFdOwogICAgICB9CiAgICB9IGNhdGNoIHt9CgogICAgdHJ5IHsKICAgICAgY29uc3QgaXBBZGRyID0gZXhlY0NvbW1hbmQoImlwIGFkZHIgc2hvdyAyPi9kZXYvbnVsbCIpOwogICAgICBjb25zdCBhZGRyZXNzZXM6IHN0cmluZ1tdID0gW107CiAgICAgIGNvbnN0IG1hdGNoZXMgPSBpcEFkZHIubWF0Y2hBbGwoL2luZXQgKFxkK1wuXGQrXC5cZCtcLlxkKylcL1xkKy9nKTsKICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7CiAgICAgICAgaWYgKCFtYXRjaFsxXS5zdGFydHNXaXRoKCIxMjcuIikpIHsKICAgICAgICAgIGFkZHJlc3Nlcy5wdXNoKG1hdGNoWzFdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIGFkZHJlc3Nlcy5qb2luKCIgIik7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICB9CgogIGNvbnN0IGludGVyZmFjZXMgPSBvcy5uZXR3b3JrSW50ZXJmYWNlcygpOwogIGNvbnN0IGFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTsKCiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGludGVyZmFjZXMpKSB7CiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBpbnRlcmZhY2VzW25hbWVdIHx8IFtdKSB7CiAgICAgIGlmIChkZXZpY2UuZmFtaWx5ID09PSAiSVB2NCIgJiYgIWRldmljZS5pbnRlcm5hbCkgewogICAgICAgIGFkZHJlc3Nlcy5wdXNoKGRldmljZS5hZGRyZXNzKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGFkZHJlc3Nlcy5qb2luKCIgIik7Cn0KCi8qKgogKiBHZXRzIGdlb2dyYXBoaWMgY2l0eSBiYXNlZCBvbiBwdWJsaWMgSVAKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBJUCBnZW9sb2NhdGlvbiBkYXRhCiAqIEByZXR1cm5zIENpdHkgbmFtZSBvciBlbXB0eSBzdHJpbmcKICogQGV4YW1wbGUgIlNhbiBGcmFuY2lzY28iLCAiTmV3IFlvcmsiLCAiTG9uZG9uIgogKi8KZXhwb3J0IGZ1bmN0aW9uIGNpdHkoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIHJldHVybiBjb250ZXh0LmlwSW5mbz8uY2l0eSB8fCAiIjsKfQoKLyoqCiAqIEdldHMgcmV2ZXJzZSBETlMgaG9zdG5hbWUgd2l0aCBIVFRQIHByZWZpeAogKiBAcGFyYW0gY29udGV4dCAtIEluZm8gY29udGV4dCB3aXRoIElQIGluZm8KICogQHJldHVybnMgRG9tYWluIHdpdGggaHR0cDovLyBwcmVmaXggb3IgZW1wdHkgc3RyaW5nCiAqIEBleGFtcGxlICJodHRwOi8vZXhhbXBsZS5jb20iLCAiaHR0cDovL2hvc3QtMjAzLTAtMTEzLTQyLmV4YW1wbGUubmV0IgogKi8KZXhwb3J0IGZ1bmN0aW9uIGRvbWFpbihjb250ZXh0OiBJbmZvQ29udGV4dCk6IHN0cmluZyB7CiAgY29uc3QgaG9zdG5hbWUgPSBjb250ZXh0LmlwSW5mbz8uaG9zdG5hbWU7CiAgcmV0dXJuIGhvc3RuYW1lID8gYGh0dHA6Ly8ke2hvc3RuYW1lfWAgOiAiIjsKfQoKLyoqCiAqIEdldHMgSW50ZXJuZXQgU2VydmljZSBQcm92aWRlciBuYW1lCiAqIFN0cmlwcyBBUyBudW1iZXIgcHJlZml4IGZyb20gb3JnYW5pemF0aW9uIHN0cmluZwogKiBAcGFyYW0gY29udGV4dCAtIEluZm8gY29udGV4dCB3aXRoIElQIGluZm8KICogQHJldHVybnMgSVNQIG5hbWUgb3IgZW1wdHkgc3RyaW5nCiAqIEBleGFtcGxlICJDb21jYXN0IENhYmxlIiwgIlZlcml6b24gQnVzaW5lc3MiLCAiQ2xvdWRmbGFyZSBJbmMiCiAqLwpleHBvcnQgZnVuY3Rpb24gaXNwKGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBvcmcgPSBjb250ZXh0LmlwSW5mbz8ub3JnOwogIHJldHVybiBvcmcgPyBvcmcuc3BsaXQoIiAiKS5zbGljZSgxKS5qb2luKCIgIikgOiAiIjsKfQoKLyoqCiAqIEdldHMgYWN0aXZlIG5ldHdvcmsgaW50ZXJmYWNlIG5hbWVzCiAqIExpc3RzIG5vbi1sb29wYmFjayBpbnRlcmZhY2VzIHdpdGggSVB2NCBhZGRyZXNzZXMgKExpbnV4L21hY09TIG9ubHkpCiAqIEBwYXJhbSBjb250ZXh0IC0gSW5mbyBjb250ZXh0IHdpdGggY2FjaGUKICogQHJldHVybnMgU3BhY2Utc2VwYXJhdGVkIGludGVyZmFjZSBuYW1lcyBvciBlbXB0eSBzdHJpbmcKICogQGV4YW1wbGUgImV0aDAgd2xhbjAiLCAiZW4wIGVuMSIKICovCmV4cG9ydCBmdW5jdGlvbiBuZXR3b3JrX2ludGVyZmFjZXMoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJuZXR3b3JrX2ludGVyZmFjZXMiKTsKICBpZiAoY2FjaGVkICE9PSBudWxsKSByZXR1cm4gY2FjaGVkOwoKICBpZiAoIUlTX0xJTlVYICYmICFJU19NQUMpIHsKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJuZXR3b3JrX2ludGVyZmFjZXMiLCAiIik7CiAgICByZXR1cm4gIiI7CiAgfQoKICB0cnkgewogICAgY29uc3QgaW50ZXJmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKCk7CiAgICBjb25zdCBhY3RpdmVJbnRlcmZhY2VzOiBzdHJpbmdbXSA9IFtdOwoKICAgIGZvciAoY29uc3QgW25hbWUsIGFkZHJzXSBvZiBPYmplY3QuZW50cmllcyhpbnRlcmZhY2VzKSkgewogICAgICBpZiAobmFtZSAhPT0gImxvIikgewogICAgICAgIGNvbnN0IGlwdjRBZGRyID0gYWRkcnM/LmZpbmQoCiAgICAgICAgICAoYWRkcikgPT4gYWRkci5mYW1pbHkgPT09ICJJUHY0IiAmJiAhYWRkci5pbnRlcm5hbAogICAgICAgICk7CiAgICAgICAgaWYgKGlwdjRBZGRyKSB7CiAgICAgICAgICBhY3RpdmVJbnRlcmZhY2VzLnB1c2gobmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY29uc3QgcmVzdWx0ID0gYWN0aXZlSW50ZXJmYWNlcy5qb2luKCIgIik7CiAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAibmV0d29ya19pbnRlcmZhY2VzIiwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSBjYXRjaCB7fQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAibmV0d29ya19pbnRlcmZhY2VzIiwgIiIpOwogIHJldHVybiAiIjsKfQovKioKICogR2V0cyBvcGVuIFRDUCBwb3J0cyB3aXRoIHNlcnZpY2UgbmFtZXMKICogVXNlcyBsc29mIHRvIGZpbmQgbGlzdGVuaW5nIFRDUCBwb3J0cyAoTGludXgvbWFjT1Mgb25seSkKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBTcGFjZS1zZXBhcmF0ZWQgcG9ydCtwcm9jZXNzIHBhaXJzIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiODBodHRwIDQ0M2h0dHAgMjJzc2giLCAiMzAwMG5vZGUgNTQzMnBvc3QiCiAqLwpleHBvcnQgZnVuY3Rpb24gcG9ydHMoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJwb3J0cyIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGlmIChJU19MSU5VWCB8fCBJU19NQUMpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGxzb2YgPSBleGVjQ29tbWFuZCgibHNvZiAtblAgLWlUQ1AgLXNUQ1A6TElTVEVOIik7CiAgICAgIGNvbnN0IGxpbmVzID0gbHNvZi5zcGxpdCgiXG4iKS5zbGljZSgxKTsKICAgICAgY29uc3QgcG9ydHMgPSBuZXcgU2V0PHN0cmluZz4oKTsKCiAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHsKICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3BsaXQoL1xzKy8pOwogICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gOSkgewogICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHBhcnRzWzhdOwogICAgICAgICAgY29uc3QgcG9ydE1hdGNoID0gYWRkcmVzcy5tYXRjaCgvOihcZCspJC8pOwogICAgICAgICAgaWYgKHBvcnRNYXRjaCkgewogICAgICAgICAgICBjb25zdCBwb3J0ID0gcG9ydE1hdGNoWzFdOwogICAgICAgICAgICBjb25zdCBwcm9jZXNzID0gcGFydHNbMF0uc3Vic3RyaW5nKDAsIDQpOwogICAgICAgICAgICBwb3J0cy5hZGQoYCR7cG9ydH0ke3Byb2Nlc3N9YCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGNvbnN0IHJlc3VsdCA9IEFycmF5LmZyb20ocG9ydHMpLmpvaW4oIiAiKTsKICAgICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgInBvcnRzIiwgcmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0gY2F0Y2gge30KICB9CgogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJwb3J0cyIsICIiKTsKICByZXR1cm4gIiI7Cn0K\"","export default \"data:video/mp2t;base64,LyoqCiAqIEBmaWxlb3ZlcnZpZXcgVGhlIFdpbmRvd3MgYW5kIG1hY09TIGJyYW5jaGVzIG9mIHRoZSBwbGF0Zm9ybSBmYWN0cywgd2hpY2gKICogdGhlIExpbnV4LW9ubHkgc3VpdGUgaW4gcGxhdGZvcm0udGVzdC50cyBjYW5ub3QgcmVhY2guCiAqLwppbXBvcnQgeyBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tICJ2aXRlc3QiOwoKY29uc3QgZmxhZ3MgPSB2aS5ob2lzdGVkKCgpID0+ICh7IGxpbnV4OiBmYWxzZSwgbWFjOiBmYWxzZSwgd2luZG93czogZmFsc2UgfSkpOwp2aS5tb2NrKCIuLi91dGlscy9wbGF0Zm9ybSIsICgpID0+ICh7CiAgZ2V0IElTX0xJTlVYKCkgewogICAgcmV0dXJuIGZsYWdzLmxpbnV4OwogIH0sCiAgZ2V0IElTX01BQygpIHsKICAgIHJldHVybiBmbGFncy5tYWM7CiAgfSwKICBnZXQgSVNfV0lORE9XUygpIHsKICAgIHJldHVybiBmbGFncy53aW5kb3dzOwogIH0sCn0pKTsKCmNvbnN0IGV4ZWNDb21tYW5kID0gdmkuaG9pc3RlZCgoKSA9PiB2aS5mbigpKTsKY29uc3QgY29tbWFuZEV4aXN0cyA9IHZpLmhvaXN0ZWQoKCkgPT4gdmkuZm4oKSk7CnZpLm1vY2soIi4uL3V0aWxzL2NvbW1hbmQiLCAoKSA9PiAoeyBleGVjQ29tbWFuZCwgY29tbWFuZEV4aXN0cyB9KSk7Cgpjb25zdCBvc01vY2sgPSB2aS5ob2lzdGVkKCgpID0+ICh7CiAgcGxhdGZvcm06IHZpLmZuKCgpID0+ICJmcmVlYnNkIiksCiAgcmVsZWFzZTogdmkuZm4oKCkgPT4gIjE0LjAiKSwKICBob3N0bmFtZTogdmkuZm4oKCkgPT4gImgiKSwKICB1c2VySW5mbzogdmkuZm4oKCkgPT4gKHsgdXNlcm5hbWU6ICJ1IiB9KSksCiAgdG1wZGlyOiB2aS5mbigoKSA9PiAiL3RtcCIpLAp9KSk7CnZpLm1vY2soIm9zIiwgKCkgPT4gKHsgLi4ub3NNb2NrLCBkZWZhdWx0OiBvc01vY2sgfSkpOwoKY29uc3QgZnNNb2NrID0gdmkuaG9pc3RlZCgoKSA9PiAoewogIGV4aXN0c1N5bmM6IHZpLmZuKCgpID0+IGZhbHNlKSwKICByZWFkRmlsZVN5bmM6IHZpLmZuKCgpID0+ICIiKSwKfSkpOwp2aS5tb2NrKCJmcyIsICgpID0+ICh7IC4uLmZzTW9jaywgZGVmYXVsdDogZnNNb2NrIH0pKTsKCmNvbnN0IHAgPSBhd2FpdCBpbXBvcnQoIi4vcGxhdGZvcm0iKTsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKCmNvbnN0IGN0eCA9ICgpOiBJbmZvQ29udGV4dCA9PiAoeyBjYWNoZToge30gfSk7CmNvbnN0IG9ubHkgPSAoazogImxpbnV4IiB8ICJtYWMiIHwgIndpbmRvd3MiIHwgIm5vbmUiKSA9PiB7CiAgZmxhZ3MubGludXggPSBrID09PSAibGludXgiOwogIGZsYWdzLm1hYyA9IGsgPT09ICJtYWMiOwogIGZsYWdzLndpbmRvd3MgPSBrID09PSAid2luZG93cyI7Cn07CgpiZWZvcmVFYWNoKCgpID0+IHsKICBvbmx5KCJub25lIik7CiAgZXhlY0NvbW1hbmQubW9ja1Jlc2V0KCkubW9ja1JldHVyblZhbHVlKCIiKTsKICBjb21tYW5kRXhpc3RzLm1vY2tSZXNldCgpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7Cn0pOwoKZGVzY3JpYmUoIm9zX2luZm8gb2ZmIExpbnV4IiwgKCkgPT4gewogIGl0KCJmYWxscyBiYWNrIHRvICc8cGxhdGZvcm0+IDxyZWxlYXNlPicgb24gYW4gdW5rbm93biBPUyIsICgpID0+IHsKICAgIGV4cGVjdChwLm9zX2luZm8oY3R4KCkpKS50b0JlKCJmcmVlYnNkIDE0LjAiKTsKICB9KTsKCiAgaXQoImNvbWJpbmVzIHRoZSBtYWNPUyBwcm9kdWN0IG5hbWUgYW5kIHZlcnNpb24gZnJvbSBzd192ZXJzIiwgKCkgPT4gewogICAgb25seSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4KICAgICAgYy5lbmRzV2l0aCgicHJvZHVjdE5hbWUiKSA/ICJtYWNPUyIgOiAiMTQuNC4xIiwKICAgICk7CiAgICBleHBlY3QocC5vc19pbmZvKGN0eCgpKSkudG9CZSgibWFjT1MgMTQuNC4xIik7CiAgfSk7CgogIGl0KCJmYWxscyBiYWNrIHRvICdtYWNPUyA8cmVsZWFzZT4nIHdoZW4gc3dfdmVycyBpcyBzaWxlbnQiLCAoKSA9PiB7CiAgICBvbmx5KCJtYWMiKTsKICAgIGV4cGVjdChwLm9zX2luZm8oY3R4KCkpKS50b0JlKCJtYWNPUyAxNC4wIik7CiAgfSk7CgogIGl0KCJwYXJzZXMgdGhlIFdpbmRvd3MgdmVyc2lvbiBmcm9tIGB2ZXJgIiwgKCkgPT4gewogICAgb25seSgid2luZG93cyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJNaWNyb3NvZnQgV2luZG93cyBbVmVyc2lvbiAxMC4wLjIyNjMxLjM0NDddIik7CiAgICBleHBlY3QocC5vc19pbmZvKGN0eCgpKSkudG9CZSgiV2luZG93cyAxMC4wLjIyNjMxLjM0NDciKTsKICB9KTsKCiAgaXQoImZhbGxzIGJhY2sgdG8gdGhlIGtlcm5lbCByZWxlYXNlIHdoZW4gYHZlcmAgaXMgdW5wYXJzZWFibGUgb3IgdGhyb3dzIiwgKCkgPT4gewogICAgb25seSgid2luZG93cyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJnYXJiYWdlIik7CiAgICBleHBlY3QocC5vc19pbmZvKGN0eCgpKSkudG9CZSgiV2luZG93cyAxNC4wIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KHAub3NfaW5mbyhjdHgoKSkpLnRvQmUoIldpbmRvd3MgMTQuMCIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJkZXZpY2Ugb2ZmIExpbnV4IiwgKCkgPT4gewogIGl0KCJyZWFkcyB0aGUgV2luZG93cyBtb2RlbCBmcm9tIHdtaWMiLCAoKSA9PiB7CiAgICBvbmx5KCJ3aW5kb3dzIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIk5hbWU9U3VyZmFjZSBMYXB0b3AgNVxyXG4iKTsKICAgIGV4cGVjdChwLmRldmljZShjdHgoKSkpLnRvQmUoIlN1cmZhY2UgTGFwdG9wIDUiKTsKICB9KTsKCiAgaXQoImZhbGxzIGJhY2sgdG8gUG93ZXJTaGVsbCBvbiBXaW5kb3dzIHdoZW4gd21pYyBnaXZlcyBub3RoaW5nIiwgKCkgPT4gewogICAgb25seSgid2luZG93cyIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKChjOiBzdHJpbmcpID0+CiAgICAgIGMuc3RhcnRzV2l0aCgid21pYyIpID8gIiIgOiAiVGhpbmtQYWQgWDFcclxuIiwKICAgICk7CiAgICBleHBlY3QocC5kZXZpY2UoY3R4KCkpKS50b0JlKCJUaGlua1BhZCBYMSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgb24gV2luZG93cyB3aGVuIG5laXRoZXIgdG9vbCBhbnN3ZXJzIiwgKCkgPT4gewogICAgb25seSgid2luZG93cyIpOwogICAgZXhwZWN0KHAuZGV2aWNlKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJyZWFkcyB0aGUgbWFjT1MgbW9kZWwgbmFtZSBmcm9tIHN5c3RlbV9wcm9maWxlciIsICgpID0+IHsKICAgIG9ubHkoIm1hYyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJIYXJkd2FyZTpcbiAgTW9kZWwgTmFtZTogTWFjQm9vayBQcm9cbiAgQ2hpcDogTTMiKTsKICAgIGV4cGVjdChwLmRldmljZShjdHgoKSkpLnRvQmUoIk1hY0Jvb2sgUHJvIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBtYWNPUyB3aGVuIHN5c3RlbV9wcm9maWxlciBoYXMgbm8gbW9kZWwgbGluZSIsICgpID0+IHsKICAgIG9ubHkoIm1hYyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJub3RoaW5nIik7CiAgICBleHBlY3QocC5kZXZpY2UoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKfSk7Cg==\"","export default \"data:video/mp2t;base64,LyoqCiAqIEBmaWxlb3ZlcnZpZXcgQ292ZXJzIHRoZSBwbGF0Zm9ybSBmYWN0cyBgYWJvdXQtc3lzdGVtYCBvcGVucyBpdHMgcmVhZG91dAogKiB3aXRoOiB1c2VyLCBob3N0bmFtZSwgT1MgbmFtZSwga2VybmVsIGFuZCBkZXZpY2UgbW9kZWwuCiAqCiAqIEVhY2ggb2YgdGhlc2Ugc2hlbGxzIG91dCB0byBhIGRpZmZlcmVudCB0b29sIHBlciBwbGF0Zm9ybSBhbmQgcGFyc2VzIGl0cwogKiBvdXRwdXQsIHNvIHRoZSB0ZXN0cyBkcml2ZSB0aGUgTGludXggcGF0aCAodGhlIG9uZSBDSSBydW5zIG9uKSBlbmQgdG8gZW5kIGFuZAogKiBwaW4gdGhlIHR3byBiZWhhdmlvdXJzIHRoYXQgaG9sZCBldmVyeXdoZXJlOiB0aGUgY2FjaGUgaXMgY29uc3VsdGVkIGJlZm9yZQogKiBhbnkgY29tbWFuZCBydW5zLCBhbmQgYSBtaXNzaW5nIHRvb2wgZGVncmFkZXMgdG8gYSBmYWxsYmFjayByYXRoZXIgdGhhbgogKiB0aHJvd2luZy4KICovCgppbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gInZpdGVzdCI7CgovLyBUaGVzZSBtb2R1bGVzIGJpbmQgdGhlaXIgaW1wb3J0cyBieSBuYW1lLCBzbyB0aGUgZGVwZW5kZW5jaWVzIGhhdmUgdG8gYmUKLy8gbW9ja2VkIG91dHJpZ2h0IHJhdGhlciB0aGFuIHNwaWVkIG9uIHRocm91Z2ggYSBuYW1lc3BhY2Ugb2JqZWN0Lgpjb25zdCBleGVjQ29tbWFuZCA9IHZpLmhvaXN0ZWQoKCkgPT4gdmkuZm4oKSk7CmNvbnN0IGNvbW1hbmRFeGlzdHMgPSB2aS5ob2lzdGVkKCgpID0+IHZpLmZuKCkpOwp2aS5tb2NrKCIuLi91dGlscy9jb21tYW5kIiwgKCkgPT4gKHsgZXhlY0NvbW1hbmQsIGNvbW1hbmRFeGlzdHMgfSkpOwoKY29uc3Qgb3NNb2NrID0gdmkuaG9pc3RlZCgoKSA9PiAoewogIHBsYXRmb3JtOiB2aS5mbigoKSA9PiAibGludXgiKSwKICByZWxlYXNlOiB2aS5mbigoKSA9PiAiNi4xLjAtZ2VuZXJpYyIpLAogIGhvc3RuYW1lOiB2aS5mbigoKSA9PiAid29ya3N0YXRpb24iKSwKICB1c2VySW5mbzogdmkuZm4oKCkgPT4gKHsgdXNlcm5hbWU6ICJhZGEiIH0pKSwKICAvLyBjYWNoZS1jb25maWcgcmVzb2x2ZXMgdGhlIGNhY2hlIGZpbGUgdW5kZXIgdGhlIHRlbXAgZGlyZWN0b3J5IGF0IGltcG9ydCB0aW1lLgogIHRtcGRpcjogdmkuZm4oKCkgPT4gIi90bXAiKSwKfSkpOwp2aS5tb2NrKCJvcyIsICgpID0+ICh7IC4uLm9zTW9jaywgZGVmYXVsdDogb3NNb2NrIH0pKTsKCmNvbnN0IGZzTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICBleGlzdHNTeW5jOiB2aS5mbigoKSA9PiBmYWxzZSksCiAgcmVhZEZpbGVTeW5jOiB2aS5mbigoKSA9PiAiIiksCn0pKTsKdmkubW9jaygiZnMiLCAoKSA9PiAoeyAuLi5mc01vY2ssIGRlZmF1bHQ6IGZzTW9jayB9KSk7Cgpjb25zdCB7IGRldmljZSwgaG9zdG5hbWUsIGtlcm5lbCwgb3NfaW5mbywgdXNlciB9ID0gYXdhaXQgaW1wb3J0KCIuL3BsYXRmb3JtIik7CmNvbnN0IHsgSVNfTElOVVggfSA9IGF3YWl0IGltcG9ydCgiLi4vdXRpbHMvcGxhdGZvcm0iKTsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKCmNvbnN0IGNvbnRleHQgPSAoKTogSW5mb0NvbnRleHQgPT4gKHsgY2FjaGU6IHt9IH0pOwoKYmVmb3JlRWFjaCgoKSA9PiB7CiAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICBjb21tYW5kRXhpc3RzLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7CiAgZnNNb2NrLmV4aXN0c1N5bmMubW9ja1JldHVyblZhbHVlKGZhbHNlKTsKICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tSZXR1cm5WYWx1ZSgiIik7Cn0pOwoKYWZ0ZXJFYWNoKCgpID0+IHsKICB2aS5jbGVhckFsbE1vY2tzKCk7Cn0pOwoKZGVzY3JpYmUoInVzZXIgYW5kIGhvc3RuYW1lIiwgKCkgPT4gewogIGl0KCJyZWFkcyB0aGUgY3VycmVudCB1c2VybmFtZSIsICgpID0+IHsKICAgIGV4cGVjdCh1c2VyKCkpLnRvQmUoImFkYSIpOwogIH0pOwoKICBpdCgicmVhZHMgdGhlIG1hY2hpbmUncyBuZXR3b3JrIG5hbWUiLCAoKSA9PiB7CiAgICBleHBlY3QoaG9zdG5hbWUoKSkudG9CZSgid29ya3N0YXRpb24iKTsKICB9KTsKfSk7CgpkZXNjcmliZSgia2VybmVsIiwgKCkgPT4gewogIGl0KCJyZXBvcnRzIHRoZSBrZXJuZWwgcmVsZWFzZSIsICgpID0+IHsKICAgIGV4cGVjdChrZXJuZWwoY29udGV4dCgpKSkudG9CZSgiNi4xLjAtZ2VuZXJpYyIpOwogIH0pOwoKICBpdCgiY2FjaGVzIHRoZSByZXN1bHQiLCAoKSA9PiB7CiAgICBjb25zdCBjdHggPSBjb250ZXh0KCk7CiAgICBrZXJuZWwoY3R4KTsKICAgIGV4cGVjdChjdHguY2FjaGUua2VybmVsPy52YWx1ZSkudG9CZSgiNi4xLjAtZ2VuZXJpYyIpOwogIH0pOwoKICBpdCgic2VydmVzIGEgY2FjaGVkIGtlcm5lbCB3aXRob3V0IGFza2luZyB0aGUgT1MgYWdhaW4iLCAoKSA9PiB7CiAgICBjb25zdCBjdHggPSBjb250ZXh0KCk7CiAgICBjdHguY2FjaGUua2VybmVsID0geyB2YWx1ZTogImNhY2hlZC1rZXJuZWwiLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTsKCiAgICBleHBlY3Qoa2VybmVsKGN0eCkpLnRvQmUoImNhY2hlZC1rZXJuZWwiKTsKICAgIGV4cGVjdChvc01vY2sucmVsZWFzZSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTsKICB9KTsKfSk7CgpkZXNjcmliZSgib3NfaW5mbyIsICgpID0+IHsKICBpdCgic2VydmVzIGEgY2FjaGVkIHZhbHVlIHdpdGhvdXQgcnVubmluZyBhbnkgY29tbWFuZCIsICgpID0+IHsKICAgIGNvbnN0IGN0eCA9IGNvbnRleHQoKTsKICAgIGN0eC5jYWNoZS5vcyA9IHsgdmFsdWU6ICJDYWNoZWQgT1MgMS4wIiwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07CgogICAgZXhwZWN0KG9zX2luZm8oY3R4KSkudG9CZSgiQ2FjaGVkIE9TIDEuMCIpOwogICAgZXhwZWN0KGV4ZWNDb21tYW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpOwogIH0pOwoKICBpdCgiY2FjaGVzIHdoYXRldmVyIGl0IHJlc29sdmVzIiwgKCkgPT4gewogICAgY29uc3QgY3R4ID0gY29udGV4dCgpOwogICAgY29uc3QgcmVzb2x2ZWQgPSBvc19pbmZvKGN0eCk7CiAgICBleHBlY3QoY3R4LmNhY2hlLm9zPy52YWx1ZSkudG9CZShyZXNvbHZlZCk7CiAgfSk7CgogIGl0KCJuZXZlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgd2hhdGV2ZXIgdGhlIHBsYXRmb3JtIiwgKCkgPT4gewogICAgZXhwZWN0KG9zX2luZm8oY29udGV4dCgpKSkudG9CZVRydXRoeSgpOwogIH0pOwoKICBpdC5ydW5JZihJU19MSU5VWCkoInJlYWRzIHRoZSBkaXN0cmlidXRpb24gZnJvbSAvZXRjL29zLXJlbGVhc2UiLCAoKSA9PiB7CiAgICBmc01vY2suZXhpc3RzU3luYy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tSZXR1cm5WYWx1ZSgKICAgICAgJ05BTUU9IlVidW50dSJcblZFUlNJT05fSUQ9IjIyLjA0IlxuSUQ9dWJ1bnR1XG4nLAogICAgKTsKCiAgICBleHBlY3Qob3NfaW5mbyhjb250ZXh0KCkpKS50b0JlKCJVYnVudHUgMjIuMDQiKTsKICB9KTsKCiAgaXQucnVuSWYoSVNfTElOVVgpKCJ1c2VzIHRoZSBuYW1lIGFsb25lIHdoZW4gdGhlcmUgaXMgbm8gdmVyc2lvbiBpZCIsICgpID0+IHsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCdOQU1FPSJBcmNoIExpbnV4IlxuJyk7CiAgICBleHBlY3Qob3NfaW5mbyhjb250ZXh0KCkpKS50b0JlKCJBcmNoIExpbnV4Iik7CiAgfSk7CgogIGl0LnJ1bklmKElTX0xJTlVYKSgiZmFsbHMgYmFjayB0byB0aGUga2VybmVsIHJlbGVhc2Ugd2l0aCBubyBvcy1yZWxlYXNlIGZpbGUiLCAoKSA9PiB7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRU5PRU5UIik7CiAgICB9KTsKCiAgICBleHBlY3Qob3NfaW5mbyhjb250ZXh0KCkpKS50b0JlKCJMaW51eCA2LjEuMC1nZW5lcmljIik7CiAgfSk7CgogIGl0LnJ1bklmKElTX0xJTlVYKSgiZmFsbHMgYmFjayB0byBhIGJhcmUgTGludXggd2hlbiB0aGUgZmlsZSBoYXMgbm8gTkFNRSIsICgpID0+IHsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCJJRD11bmtub3duXG4iKTsKICAgIGV4cGVjdChvc19pbmZvKGNvbnRleHQoKSkpLnRvQmUoIkxpbnV4Iik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImRldmljZSIsICgpID0+IHsKICBpdCgic2VydmVzIGEgY2FjaGVkIG1vZGVsIHdpdGhvdXQgcHJvYmluZyIsICgpID0+IHsKICAgIGNvbnN0IGN0eCA9IGNvbnRleHQoKTsKICAgIGN0eC5jYWNoZS5kZXZpY2UgPSB7IHZhbHVlOiAiQ2FjaGVkIEJveCIsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9OwoKICAgIGV4cGVjdChkZXZpY2UoY3R4KSkudG9CZSgiQ2FjaGVkIEJveCIpOwogICAgZXhwZWN0KGV4ZWNDb21tYW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpOwogIH0pOwoKICBpdCgiY2FjaGVzIGFuIGVtcHR5IHJlc3VsdCB0b28sIHNvIHRoZSBwcm9iZSBpcyBub3QgcmVwZWF0ZWQiLCAoKSA9PiB7CiAgICBjb25zdCBjdHggPSBjb250ZXh0KCk7CiAgICBkZXZpY2UoY3R4KTsKICAgIGV4cGVjdChjdHguY2FjaGUuZGV2aWNlKS50b0JlRGVmaW5lZCgpOwogIH0pOwoKICBpdCgicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiBub3RoaW5nIGlkZW50aWZpZXMgdGhlIG1hY2hpbmUiLCAoKSA9PiB7CiAgICBleHBlY3QoZGV2aWNlKGNvbnRleHQoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdC5ydW5JZihJU19MSU5VWCkoInJlYWRzIHRoZSBtb2RlbCBmcm9tIHRoZSBETUkgcHJvZHVjdCBuYW1lIiwgKCkgPT4gewogICAgZnNNb2NrLmV4aXN0c1N5bmMubW9ja0ltcGxlbWVudGF0aW9uKAogICAgICAocGF0aDogc3RyaW5nKSA9PiBwYXRoID09PSAiL3N5cy9kZXZpY2VzL3ZpcnR1YWwvZG1pL2lkL3Byb2R1Y3RfbmFtZSIsCiAgICApOwogICAgZnNNb2NrLnJlYWRGaWxlU3luYy5tb2NrUmV0dXJuVmFsdWUoIk9wdGlQbGV4IDcwOTBcbiIpOwoKICAgIGV4cGVjdChkZXZpY2UoY29udGV4dCgpKSkudG9CZSgiT3B0aVBsZXggNzA5MCIpOwogIH0pOwoKICBpdC5ydW5JZihJU19MSU5VWCkoInByZWZlcnMgQW5kcm9pZCdzIGdldHByb3Agd2hlbiBpdCBpcyBhdmFpbGFibGUiLCAoKSA9PiB7CiAgICBjb21tYW5kRXhpc3RzLm1vY2tJbXBsZW1lbnRhdGlvbigoY21kOiBzdHJpbmcpID0+IGNtZCA9PT0gImdldHByb3AiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiUGl4ZWwgOCIpOwoKICAgIGV4cGVjdChkZXZpY2UoY29udGV4dCgpKSkudG9CZSgiUGl4ZWwgOCIpOwogICAgZXhwZWN0KGV4ZWNDb21tYW5kKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgiZ2V0cHJvcCByby5wcm9kdWN0Lm1vZGVsIik7CiAgfSk7CgogIGl0LnJ1bklmKElTX0xJTlVYKSgiZmFsbHMgdGhyb3VnaCB0byBETUkgd2hlbiBnZXRwcm9wIGFuc3dlcnMgbm90aGluZyIsICgpID0+IHsKICAgIGNvbW1hbmRFeGlzdHMubW9ja0ltcGxlbWVudGF0aW9uKChjbWQ6IHN0cmluZykgPT4gY21kID09PSAiZ2V0cHJvcCIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICAgIGZzTW9jay5leGlzdHNTeW5jLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCJTdGVhbSBEZWNrXG4iKTsKCiAgICBleHBlY3QoZGV2aWNlKGNvbnRleHQoKSkpLnRvQmUoIlN0ZWFtIERlY2siKTsKICB9KTsKCiAgaXQucnVuSWYoSVNfTElOVVgpKCJpZ25vcmVzIGEgYmxhbmsgRE1JIHByb2R1Y3QgbmFtZSIsICgpID0+IHsKICAgIGZzTW9jay5leGlzdHNTeW5jLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCIgICBcbiIpOwoKICAgIGV4cGVjdChkZXZpY2UoY29udGV4dCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0LnJ1bklmKElTX0xJTlVYKSgic3Vydml2ZXMgYW4gdW5yZWFkYWJsZSBETUkgZmlsZSIsICgpID0+IHsKICAgIGZzTW9jay5leGlzdHNTeW5jLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJFQUNDRVMiKTsKICAgIH0pOwoKICAgIGV4cGVjdChkZXZpY2UoY29udGV4dCgpKSkudG9CZSgiIik7CiAgfSk7Cn0pOwo=\"","export default \"data:video/mp2t;base64,LyoqCiAqIFBsYXRmb3JtLXJlbGF0ZWQgc3lzdGVtIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwogKiBAbW9kdWxlIGluZm8vcGxhdGZvcm0KICovCgppbXBvcnQgb3MgZnJvbSAib3MiOwppbXBvcnQgZnMgZnJvbSAiZnMiOwppbXBvcnQgdHlwZSB7IEluZm9Db250ZXh0IH0gZnJvbSAiLi4vdHlwZXMvaW50ZXJuYWwtdHlwZXMiOwppbXBvcnQgeyBJU19XSU5ET1dTLCBJU19NQUMsIElTX0xJTlVYIH0gZnJvbSAiLi4vdXRpbHMvcGxhdGZvcm0iOwppbXBvcnQgeyBleGVjQ29tbWFuZCwgY29tbWFuZEV4aXN0cyB9IGZyb20gIi4uL3V0aWxzL2NvbW1hbmQiOwppbXBvcnQgeyBnZXRDYWNoZWRWYWx1ZSwgc2V0Q2FjaGVkVmFsdWUgfSBmcm9tICIuLi9jYWNoZS9jYWNoZSI7CgovKioKICogR2V0cyB0aGUgY3VycmVudCB1c2VybmFtZQogKiBAcmV0dXJucyBDdXJyZW50IHN5c3RlbSB1c2VybmFtZQogKi8KZXhwb3J0IGZ1bmN0aW9uIHVzZXIoKTogc3RyaW5nIHsKICByZXR1cm4gb3MudXNlckluZm8oKS51c2VybmFtZTsKfQoKLyoqCiAqIEdldHMgdGhlIHN5c3RlbSBob3N0bmFtZQogKiBAcmV0dXJucyBDb21wdXRlciBob3N0bmFtZS9uZXR3b3JrIG5hbWUKICovCmV4cG9ydCBmdW5jdGlvbiBob3N0bmFtZSgpOiBzdHJpbmcgewogIHJldHVybiBvcy5ob3N0bmFtZSgpOwp9CgovKioKICogR2V0cyBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgYW5kIHZlcnNpb24KICogUGxhdGZvcm0tc3BlY2lmaWMgZGV0ZWN0aW9uIGZvciBXaW5kb3dzLCBtYWNPUywgYW5kIExpbnV4CiAqIEBwYXJhbSBjb250ZXh0IC0gSW5mbyBjb250ZXh0IHdpdGggY2FjaGUKICogQHJldHVybnMgT1MgbmFtZSBhbmQgdmVyc2lvbiBzdHJpbmcKICogQGV4YW1wbGUgIldpbmRvd3MgMTEgUHJvIiwgIm1hY09TIFZlbnR1cmEgMTMuMi4xIiwgIlVidW50dSAyMi4wNC4zIExUUyIKICovCmV4cG9ydCBmdW5jdGlvbiBvc19pbmZvKGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAib3MiKTsKICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkOwoKICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7CiAgY29uc3QgcmVsZWFzZSA9IG9zLnJlbGVhc2UoKTsKICBsZXQgb3NOYW1lID0gIiI7CgogIGlmIChJU19XSU5ET1dTKSB7CiAgICB0cnkgewogICAgICBjb25zdCB2ZXJzaW9uID0gZXhlY0NvbW1hbmQoInZlciIpOwogICAgICBjb25zdCBtYXRjaCA9IHZlcnNpb24ubWF0Y2goL01pY3Jvc29mdCBXaW5kb3dzIFxbVmVyc2lvbiAoW15cXV0rKVxdLyk7CiAgICAgIG9zTmFtZSA9IG1hdGNoID8gYFdpbmRvd3MgJHttYXRjaFsxXX1gIDogYFdpbmRvd3MgJHtyZWxlYXNlfWA7CiAgICB9IGNhdGNoIHsKICAgICAgb3NOYW1lID0gYFdpbmRvd3MgJHtyZWxlYXNlfWA7CiAgICB9CiAgfSBlbHNlIGlmIChJU19NQUMpIHsKICAgIGNvbnN0IHByb2R1Y3ROYW1lID0gZXhlY0NvbW1hbmQoInN3X3ZlcnMgLXByb2R1Y3ROYW1lIik7CiAgICBjb25zdCBwcm9kdWN0VmVyc2lvbiA9IGV4ZWNDb21tYW5kKCJzd192ZXJzIC1wcm9kdWN0VmVyc2lvbiIpOwogICAgb3NOYW1lID0KICAgICAgcHJvZHVjdE5hbWUgJiYgcHJvZHVjdFZlcnNpb24KICAgICAgICA/IGAke3Byb2R1Y3ROYW1lfSAke3Byb2R1Y3RWZXJzaW9ufWAKICAgICAgICA6IGBtYWNPUyAke3JlbGVhc2V9YDsKICB9IGVsc2UgaWYgKElTX0xJTlVYKSB7CiAgICB0cnkgewogICAgICBjb25zdCBvc1JlbGVhc2UgPSBmcy5yZWFkRmlsZVN5bmMoIi9ldGMvb3MtcmVsZWFzZSIsICJ1dGY4Iik7CiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IG9zUmVsZWFzZS5tYXRjaCgvXk5BTUU9IihbXiJdKykiL20pOwogICAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBvc1JlbGVhc2UubWF0Y2goL15WRVJTSU9OX0lEPSIoW14iXSspIi9tKTsKICAgICAgb3NOYW1lID0gbmFtZU1hdGNoID8gbmFtZU1hdGNoWzFdIDogIkxpbnV4IjsKICAgICAgaWYgKHZlcnNpb25NYXRjaCkgb3NOYW1lICs9IGAgJHt2ZXJzaW9uTWF0Y2hbMV19YDsKICAgIH0gY2F0Y2ggewogICAgICBvc05hbWUgPSBgTGludXggJHtyZWxlYXNlfWA7CiAgICB9CiAgfSBlbHNlIHsKICAgIG9zTmFtZSA9IGAke3BsYXRmb3JtfSAke3JlbGVhc2V9YDsKICB9CgogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJvcyIsIG9zTmFtZSk7CiAgcmV0dXJuIG9zTmFtZTsKfQoKLyoqCiAqIEdldHMga2VybmVsIHZlcnNpb24gc3RyaW5nCiAqIFJldHVybnMgdGhlIG9wZXJhdGluZyBzeXN0ZW0ga2VybmVsIHZlcnNpb24gZnJvbSBvcy5yZWxlYXNlKCkKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBLZXJuZWwgdmVyc2lvbiBzdHJpbmcKICogQGV4YW1wbGUgIjUuMTUuMC01Ni1nZW5lcmljIiwgIjYuMTEuMTEtdmFsdmUxMi0xLW5lcHR1bmUiCiAqLwpleHBvcnQgZnVuY3Rpb24ga2VybmVsKGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAia2VybmVsIik7CiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDsKCiAgY29uc3Qga2VybmVsID0gb3MucmVsZWFzZSgpOwogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJrZXJuZWwiLCBrZXJuZWwpOwogIHJldHVybiBrZXJuZWw7Cn0KCi8qKgogKiBHZXRzIGRldmljZSBvciBjb21wdXRlciBtb2RlbCBuYW1lCiAqIFVzZXMgV01JIG9uIFdpbmRvd3MsIERNSSBvbiBMaW51eCwgZ2V0cHJvcCBvbiBBbmRyb2lkCiAqIEBwYXJhbSBjb250ZXh0IC0gSW5mbyBjb250ZXh0IHdpdGggY2FjaGUKICogQHJldHVybnMgRGV2aWNlIG1vZGVsIG5hbWUgb3IgZW1wdHkgc3RyaW5nCiAqIEBleGFtcGxlICJEZWxsIE9wdGlQbGV4IDcwOTAiLCAiTWFjQm9vayBQcm8gMTYtaW5jaCIsICJWYWx2ZSBTdGVhbSBEZWNrIgogKi8KZXhwb3J0IGZ1bmN0aW9uIGRldmljZShjb250ZXh0OiBJbmZvQ29udGV4dCk6IHN0cmluZyB7CiAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgImRldmljZSIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGlmIChJU19XSU5ET1dTKSB7CiAgICB0cnkgewogICAgICBjb25zdCB3bWljID0gZXhlY0NvbW1hbmQoIndtaWMgY3Nwcm9kdWN0IGdldCBuYW1lIC9mb3JtYXQ6bGlzdCIpOwogICAgICBjb25zdCBuYW1lTWF0Y2ggPSB3bWljLm1hdGNoKC9OYW1lPSguKykvKTsKICAgICAgaWYgKG5hbWVNYXRjaCkgewogICAgICAgIGNvbnN0IGRldmljZSA9IG5hbWVNYXRjaFsxXS50cmltKCk7CiAgICAgICAgaWYgKGRldmljZSAmJiBkZXZpY2UgIT09ICIiKSB7CiAgICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGV2aWNlIiwgZGV2aWNlKTsKICAgICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHt9CgogICAgdHJ5IHsKICAgICAgY29uc3QgcHMgPSBleGVjQ29tbWFuZCgKICAgICAgICAncG93ZXJzaGVsbC5leGUgLUNvbW1hbmQgIkdldC1XbWlPYmplY3QgLUNsYXNzIFdpbjMyX0NvbXB1dGVyU3lzdGVtIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgTW9kZWwiJwogICAgICApOwogICAgICBpZiAocHMudHJpbSgpKSB7CiAgICAgICAgY29uc3QgZGV2aWNlID0gcHMudHJpbSgpOwogICAgICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJkZXZpY2UiLCBkZXZpY2UpOwogICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICB9IGVsc2UgaWYgKElTX01BQykgewogICAgY29uc3QgcHJvZmlsZSA9IGV4ZWNDb21tYW5kKCJzeXN0ZW1fcHJvZmlsZXIgU1BIYXJkd2FyZURhdGFUeXBlIik7CiAgICBjb25zdCBuYW1lTWF0Y2ggPSBwcm9maWxlLm1hdGNoKC9Nb2RlbCBOYW1lOlxzKiguKykvKTsKICAgIGlmIChuYW1lTWF0Y2gpIHsKICAgICAgY29uc3QgZGV2aWNlID0gbmFtZU1hdGNoWzFdLnRyaW0oKTsKICAgICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgImRldmljZSIsIGRldmljZSk7CiAgICAgIHJldHVybiBkZXZpY2U7CiAgICB9CiAgfSBlbHNlIGlmIChJU19MSU5VWCkgewogICAgdHJ5IHsKICAgICAgaWYgKGNvbW1hbmRFeGlzdHMoImdldHByb3AiKSkgewogICAgICAgIGNvbnN0IGRldmljZSA9IGV4ZWNDb21tYW5kKCJnZXRwcm9wIHJvLnByb2R1Y3QubW9kZWwiKTsKICAgICAgICBpZiAoZGV2aWNlKSB7CiAgICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGV2aWNlIiwgZGV2aWNlKTsKICAgICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCBkbWlQYXRoID0gIi9zeXMvZGV2aWNlcy92aXJ0dWFsL2RtaS9pZC9wcm9kdWN0X25hbWUiOwogICAgICBpZiAoZnMuZXhpc3RzU3luYyhkbWlQYXRoKSkgewogICAgICAgIGNvbnN0IGRldmljZSA9IGZzLnJlYWRGaWxlU3luYyhkbWlQYXRoLCAidXRmOCIpLnRyaW0oKTsKICAgICAgICBpZiAoZGV2aWNlKSB7CiAgICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGV2aWNlIiwgZGV2aWNlKTsKICAgICAgICAgIHJldHVybiBkZXZpY2U7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHt9CiAgfQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiZGV2aWNlIiwgIiIpOwogIHJldHVybiAiIjsKfQo=\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAidml0ZXN0IjsKCmNvbnN0IGZsYWdzID0gdmkuaG9pc3RlZCgoKSA9PiAoeyBsaW51eDogdHJ1ZSwgbWFjOiBmYWxzZSwgd2luZG93czogZmFsc2UgfSkpOwp2aS5tb2NrKCIuLi91dGlscy9wbGF0Zm9ybSIsICgpID0+ICh7CiAgZ2V0IElTX0xJTlVYKCkgewogICAgcmV0dXJuIGZsYWdzLmxpbnV4OwogIH0sCiAgZ2V0IElTX01BQygpIHsKICAgIHJldHVybiBmbGFncy5tYWM7CiAgfSwKICBnZXQgSVNfV0lORE9XUygpIHsKICAgIHJldHVybiBmbGFncy53aW5kb3dzOwogIH0sCn0pKTsKCmNvbnN0IGV4ZWNDb21tYW5kID0gdmkuaG9pc3RlZCgoKSA9PiB2aS5mbigpKTsKdmkubW9jaygiLi4vdXRpbHMvY29tbWFuZCIsICgpID0+ICh7IGV4ZWNDb21tYW5kLCBjb21tYW5kRXhpc3RzOiB2aS5mbigpIH0pKTsKCmNvbnN0IG9zTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICB1cHRpbWU6IHZpLmZuKCgpID0+IDApLAogIHRtcGRpcjogdmkuZm4oKCkgPT4gIi90bXAiKSwKICBwbGF0Zm9ybTogdmkuZm4oKCkgPT4gImxpbnV4IiksCn0pKTsKdmkubW9jaygib3MiLCAoKSA9PiAoeyAuLi5vc01vY2ssIGRlZmF1bHQ6IG9zTW9jayB9KSk7Cgpjb25zdCBwID0gYXdhaXQgaW1wb3J0KCIuL3Byb2Nlc3MiKTsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKCmNvbnN0IGN0eCA9ICgpOiBJbmZvQ29udGV4dCA9PiAoeyBjYWNoZToge30gfSk7CmNvbnN0IHBsYXRmb3JtID0gKHY6ICJsaW51eCIgfCAibWFjIiB8ICJ3aW5kb3dzIikgPT4gewogIGZsYWdzLmxpbnV4ID0gdiA9PT0gImxpbnV4IjsKICBmbGFncy5tYWMgPSB2ID09PSAibWFjIjsKICBmbGFncy53aW5kb3dzID0gdiA9PT0gIndpbmRvd3MiOwp9OwoKYmVmb3JlRWFjaCgoKSA9PiB7CiAgcGxhdGZvcm0oImxpbnV4Iik7CiAgZXhlY0NvbW1hbmQubW9ja1Jlc2V0KCkubW9ja1JldHVyblZhbHVlKCIiKTsKfSk7CgpkZXNjcmliZSgidG9wX3Byb2Nlc3MiLCAoKSA9PiB7CiAgaXQoInJlcG9ydHMgdGhlIGJ1c2llc3QgcHJvY2VzcyBvbiBMaW51eCB3aXRoIGEgc2luZ2xlIHBlcmNlbnQgc2lnbiIsICgpID0+IHsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiIDEyLjUgL3Vzci9iaW4vbm9kZVxuICAzLjAgYmFzaCIpOwogICAgZXhwZWN0KHAudG9wX3Byb2Nlc3MoY3R4KCkpKS50b0JlKCIxMiUgbm9kZSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2hlbiBwcyBvdXRwdXQgY2Fubm90IGJlIHBhcnNlZCBvbiBMaW51eCIsICgpID0+IHsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgICBleHBlY3QocC50b3BfcHJvY2VzcyhjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgicGFyc2VzIGBwcyAtcmAgb3V0cHV0IG9uIG1hY09TIGFuZCByb3VuZHMgdGhlIENQVSB2YWx1ZSIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJtYWMiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiJUNQVSBDT01NXG4gMzcuNiBHb29nbGUgQ2hyb21lXG4gMi4wIEZpbmRlciIpOwogICAgZXhwZWN0KHAudG9wX3Byb2Nlc3MoY3R4KCkpKS50b0JlKCIzOCUgR29vZ2xlIENocm9tZSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgb24gbWFjT1Mgd2hlbiB0aGVyZSBpcyBubyBkYXRhIHJvdyBvciBpdCBpcyBtYWxmb3JtZWQiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIiVDUFUgQ09NTSIpOwogICAgZXhwZWN0KHAudG9wX3Byb2Nlc3MoY3R4KCkpKS50b0JlKCIiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiJUNQVSBDT01NXG5hYmMiKTsKICAgIGV4cGVjdChwLnRvcF9wcm9jZXNzKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBXaW5kb3dzIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIndpbmRvd3MiKTsKICAgIGV4cGVjdChwLnRvcF9wcm9jZXNzKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJzZXJ2ZXMgZnJvbSB0aGUgY2FjaGUiLCAoKSA9PiB7CiAgICBjb25zdCBjID0gY3R4KCk7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIjUuMSBub2RlIik7CiAgICBleHBlY3QocC50b3BfcHJvY2VzcyhjKSkudG9CZSgiNSUgbm9kZSIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCI5OS45IG90aGVyIik7CiAgICBleHBlY3QocC50b3BfcHJvY2VzcyhjKSkudG9CZSgiNSUgbm9kZSIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJ1cHRpbWUiLCAoKSA9PiB7CiAgaXQuZWFjaChbCiAgICBbMCwgIjBkIDBoIDBtIl0sCiAgICBbNTksICIwZCAwaCAwbSJdLAogICAgWzNfNjYwLCAiMGQgMWggMW0iXSwKICAgIFs5MF8wNjEsICIxZCAxaCAxbSJdLAogICAgWzg2XzQwMCAqIDEwICsgN18yMDAgKyAxXzgwMCwgIjEwZCAyaCAzMG0iXSwKICBdKSgiZm9ybWF0cyAlaSBzZWNvbmRzIiwgKHNlY3MsIGV4cGVjdGVkKSA9PiB7CiAgICBvc01vY2sudXB0aW1lLm1vY2tSZXR1cm5WYWx1ZShzZWNzKTsKICAgIGV4cGVjdChwLnVwdGltZSgpKS50b0JlKGV4cGVjdGVkKTsKICB9KTsKfSk7CgpkZXNjcmliZSgidXNlcnNfbG9nZ2VkX2luIiwgKCkgPT4gewogIGl0KCJjb3VudHMgbm9uLWJsYW5rIGB3aG9gIGxpbmVzIiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJhIHR0eTFcblxuYiBwdHMvMFxuIik7CiAgICBleHBlY3QocC51c2Vyc19sb2dnZWRfaW4oKSkudG9CZSgiMiB1c2VycyIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aCBub2JvZHkgbG9nZ2VkIGluIG9yIG9uIFdpbmRvd3MiLCAoKSA9PiB7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIiIpOwogICAgZXhwZWN0KHAudXNlcnNfbG9nZ2VkX2luKCkpLnRvQmUoIiIpOwogICAgcGxhdGZvcm0oIndpbmRvd3MiKTsKICAgIGV4cGVjdChwLnVzZXJzX2xvZ2dlZF9pbigpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoImlzIGVtcHR5IHdoZW4gdGhlIGNvbW1hbmQgdGhyb3dzIiwgKCkgPT4gewogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChwLnVzZXJzX2xvZ2dlZF9pbigpKS50b0JlKCIiKTsKICB9KTsKfSk7Cg==\"","export default \"data:video/mp2t;base64,LyoqCiAqIFByb2Nlc3MtcmVsYXRlZCBzeXN0ZW0gaW5mb3JtYXRpb24gZnVuY3Rpb25zCiAqIEBtb2R1bGUgaW5mby9wcm9jZXNzCiAqLwoKaW1wb3J0IG9zIGZyb20gIm9zIjsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKaW1wb3J0IHsgSVNfTElOVVgsIElTX01BQyB9IGZyb20gIi4uL3V0aWxzL3BsYXRmb3JtIjsKaW1wb3J0IHsgZXhlY0NvbW1hbmQgfSBmcm9tICIuLi91dGlscy9jb21tYW5kIjsKaW1wb3J0IHsgZ2V0Q2FjaGVkVmFsdWUsIHNldENhY2hlZFZhbHVlIH0gZnJvbSAiLi4vY2FjaGUvY2FjaGUiOwoKLyoqCiAqIEdldHMgdGhlIGhpZ2hlc3QgQ1BVLWNvbnN1bWluZyBwcm9jZXNzCiAqIFVzZXMgcHMgY29tbWFuZCB0byBmaW5kIHRvcCBwcm9jZXNzIGJ5IENQVSB1c2FnZSAoTGludXgvbWFjT1Mgb25seSkKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBQcm9jZXNzIGluZm8gYXMgInBlcmNlbnRhZ2UgcHJvY2Vzc25hbWUiIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiOCUgZmlyZWZveCIsICIxNSUgY2hyb21lIiwgIjMlIHN5c3RlbWQiCiAqLwpleHBvcnQgZnVuY3Rpb24gdG9wX3Byb2Nlc3MoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJ0b3BfcHJvY2VzcyIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGlmIChJU19MSU5VWCkgewogICAgdHJ5IHsKICAgICAgY29uc3QgcHMgPSBleGVjQ29tbWFuZCgicHMgLWVvIHBjcHUsY29tbSAtLXNvcnQ9LSVjcHUgLS1uby1oZWFkZXJzIik7CiAgICAgIGNvbnN0IGxpbmVzID0gcHMuc3BsaXQoIlxuIik7CiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgdG9wUHJvY2VzcyA9IGxpbmVzWzBdLnRyaW0oKS5yZXBsYWNlKC9ccysvLCAiICIpLnNwbGl0KCIgIik7CiAgICAgICAgY29uc3QgY3B1ID0gdG9wUHJvY2Vzc1swXS5yZXBsYWNlKC9cLlxkKy8sICIiKTsKICAgICAgICBjb25zdCBwcm9jZXNzID0gdG9wUHJvY2Vzc1sxXS5zcGxpdCgiLyIpLnBvcCgpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGAke2NwdX0lICR7cHJvY2Vzc31gOwogICAgICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJ0b3BfcHJvY2VzcyIsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSBjYXRjaCB7fQogIH0gZWxzZSBpZiAoSVNfTUFDKSB7CiAgICB0cnkgewogICAgICAvLyAtYyBnaXZlcyB0aGUgc2hvcnQgY29tbWFuZCBuYW1lLCAtciBzb3J0cyBieSAlQ1BVIGRlc2NlbmRpbmcKICAgICAgY29uc3QgcHMgPSBleGVjQ29tbWFuZCgicHMgLUFjZW8gcGNwdSxjb21tIC1yIik7CiAgICAgIGNvbnN0IGxpbmVzID0gcHMuc3BsaXQoIlxuIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7CiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSB7CiAgICAgICAgY29uc3QgdG9wUHJvY2VzcyA9IGxpbmVzWzFdLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgICAgY29uc3QgY3B1VmFsdWUgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodG9wUHJvY2Vzc1swXSkpOwogICAgICAgIGNvbnN0IHByb2Nlc3MgPSB0b3BQcm9jZXNzLnNsaWNlKDEpLmpvaW4oIiAiKTsKICAgICAgICBpZiAoIWlzTmFOKGNwdVZhbHVlKSAmJiBwcm9jZXNzKSB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBgJHtjcHVWYWx1ZX0lICR7cHJvY2Vzc31gOwogICAgICAgICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgInRvcF9wcm9jZXNzIiwgcmVzdWx0KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHt9CiAgfQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAidG9wX3Byb2Nlc3MiLCAiIik7CiAgcmV0dXJuICIiOwp9CgovKioKICogR2V0cyBzeXN0ZW0gdXB0aW1lIHNpbmNlIGxhc3QgYm9vdAogKiBAcmV0dXJucyBVcHRpbWUgZm9ybWF0dGVkIGFzICJYZCBZaCBabSIKICogQGV4YW1wbGUgIjJkIDE0aCAyM20iLCAiMGQgM2ggNDVtIgogKi8KZXhwb3J0IGZ1bmN0aW9uIHVwdGltZSgpOiBzdHJpbmcgewogIGNvbnN0IHVwdGltZVNlY29uZHMgPSBvcy51cHRpbWUoKTsKICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcih1cHRpbWVTZWNvbmRzIC8gODY0MDApOwogIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcigodXB0aW1lU2Vjb25kcyAlIDg2NDAwKSAvIDM2MDApOwogIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh1cHRpbWVTZWNvbmRzICUgMzYwMCkgLyA2MCk7CiAgcmV0dXJuIGAke2RheXN9ZCAke2hvdXJzfWggJHttaW51dGVzfW1gOwp9CgovKioKICogR2V0cyBudW1iZXIgb2YgbG9nZ2VkIGluIHVzZXJzCiAqIFVzZXMgd2hvIGNvbW1hbmQgdG8gY291bnQgYWN0aXZlIHVzZXIgc2Vzc2lvbnMgKExpbnV4L21hY09TIG9ubHkpCiAqIEByZXR1cm5zIFVzZXIgY291bnQgd2l0aCAidXNlcnMiIHN1ZmZpeCBvciBlbXB0eSBzdHJpbmcKICogQGV4YW1wbGUgIjMgdXNlcnMiLCAiMSB1c2VycyIKICovCmV4cG9ydCBmdW5jdGlvbiB1c2Vyc19sb2dnZWRfaW4oKTogc3RyaW5nIHsKICBpZiAoIUlTX0xJTlVYICYmICFJU19NQUMpIHJldHVybiAiIjsKCiAgdHJ5IHsKICAgIGNvbnN0IHdobyA9IGV4ZWNDb21tYW5kKCJ3aG8iKTsKICAgIGNvbnN0IHVzZXJzID0gd2hvLnNwbGl0KCJcbiIpLmZpbHRlcigobGluZSkgPT4gbGluZS50cmltKCkpLmxlbmd0aDsKICAgIGlmICh1c2VycyA+IDApIHsKICAgICAgcmV0dXJuIGAke3VzZXJzfSB1c2Vyc2A7CiAgICB9CiAgfSBjYXRjaCB7fQogIHJldHVybiAiIjsKfQo=\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAidml0ZXN0IjsKCmNvbnN0IGZzTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICBleGlzdHNTeW5jOiB2aS5mbigpLAogIHJlYWRGaWxlU3luYzogdmkuZm4oKSwKICB3cml0ZUZpbGVTeW5jOiB2aS5mbigpLAogIG1rZGlyU3luYzogdmkuZm4oKSwKfSkpOwp2aS5tb2NrKCJmcyIsICgpID0+ICh7IC4uLmZzTW9jaywgZGVmYXVsdDogZnNNb2NrIH0pKTsKCmNvbnN0IG9zTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICBob21lZGlyOiB2aS5mbigoKSA9PiAiL2hvbWUvYWRhIiksCiAgdG1wZGlyOiB2aS5mbigoKSA9PiAiL3RtcGRpciIpLAp9KSk7CnZpLm1vY2soIm9zIiwgKCkgPT4gKHsgLi4ub3NNb2NrLCBkZWZhdWx0OiBvc01vY2sgfSkpOwoKY29uc3QgcyA9IGF3YWl0IGltcG9ydCgiLi9zZXR0aW5ncyIpOwoKYmVmb3JlRWFjaCgoKSA9PiB7CiAgZm9yIChjb25zdCBmIG9mIE9iamVjdC52YWx1ZXMoZnNNb2NrKSkgZi5tb2NrUmVzZXQoKTsKfSk7CgpkZXNjcmliZSgicGF0aHMiLCAoKSA9PiB7CiAgaXQoInBsYWNlcyBzZXR0aW5ncyB1bmRlciB+Ly5jb25maWcgYW5kIHRoZSBjYWNoZSB1bmRlciB0aGUgdGVtcCBkaXIiLCAoKSA9PiB7CiAgICBleHBlY3Qocy5TRVRUSU5HU19GSUxFKS50b0JlKCIvaG9tZS9hZGEvLmNvbmZpZy9zeXN0ZW1pbmZvLXNldHRpbmdzLmpzb24iKTsKICAgIGV4cGVjdChzLkNBQ0hFX0ZJTEUpLnRvQmUoIi90bXBkaXIvc3lzdGVtaW5mby1jYWNoZS5qc29uIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImRlZmF1bHRzIiwgKCkgPT4gewogIGl0KCJkZWZpbmVzIGEgY29sb3IsIGVtb2ppIGFuZCBsYWJlbCBmb3IgZXZlcnkgZGlzcGxheWVkIGl0ZW0iLCAoKSA9PiB7CiAgICBjb25zdCBzaG93biA9IHMuREVGQVVMVF9TRVRUSU5HUy5kaXNwbGF5X29yZGVyLmZsYXQoKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIHNob3duKSB7CiAgICAgIGlmIChrZXkgPT09ICJwYWNtYW4iIHx8IGtleSA9PT0gImJlbmNoIiB8fCBrZXkgPT09ICJncHVfYmVuY2giKSBjb250aW51ZTsKICAgICAgZXhwZWN0KHMuREVGQVVMVF9TRVRUSU5HUy5sYWJlbHMpLnRvSGF2ZVByb3BlcnR5KGtleSk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIE9iamVjdC52YWx1ZXMocy5ERUZBVUxUX1NFVFRJTkdTLmNvbG9ycykpIHsKICAgICAgaWYgKGNvbG9yID09PSAibXVsdGljb2xvciIpIGNvbnRpbnVlOwogICAgICBleHBlY3Qocy5jb2xvcnMpLnRvSGF2ZVByb3BlcnR5KGNvbG9yKTsKICAgICAgZXhwZWN0KHMuYmFja2dyb3VuZHMpLnRvSGF2ZVByb3BlcnR5KGNvbG9yKTsKICAgIH0KICB9KTsKCiAgaXQoInVzZXMgQU5TSSBlc2NhcGVzIGZvciBldmVyeSBwYWxldHRlIGVudHJ5IiwgKCkgPT4gewogICAgZm9yIChjb25zdCB2IG9mIFsuLi5PYmplY3QudmFsdWVzKHMuY29sb3JzKSwgLi4uT2JqZWN0LnZhbHVlcyhzLmJhY2tncm91bmRzKV0pIHsKICAgICAgZXhwZWN0KHYuc3RhcnRzV2l0aCgiXHgxYlsiKSkudG9CZSh0cnVlKTsKICAgIH0KICB9KTsKCiAgaXQoImZhbGxzIGJhY2sgdG8gMTAwIGNvbHVtbnMgd2hlbiBzdGRvdXQgaGFzIG5vIHdpZHRoIiwgKCkgPT4gewogICAgZXhwZWN0KHMuREVGQVVMVF9TRVRUSU5HUy5kaXNwbGF5LmxpbmVfd3JhcF9sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTsKICB9KTsKfSk7CgpkZXNjcmliZSgibG9hZFNldHRpbmdzIiwgKCkgPT4gewogIGl0KCJyZXR1cm5zIHRoZSBkZWZhdWx0cyB3aGVuIG5vIHNldHRpbmdzIGZpbGUgZXhpc3RzIiwgKCkgPT4gewogICAgZnNNb2NrLmV4aXN0c1N5bmMubW9ja1JldHVyblZhbHVlKGZhbHNlKTsKICAgIGV4cGVjdChzLmxvYWRTZXR0aW5ncygpKS50b0JlKHMuREVGQVVMVF9TRVRUSU5HUyk7CiAgfSk7CgogIGl0KCJzaGFsbG93LW1lcmdlcyB0aGUgdXNlcidzIGZpbGUgb3ZlciB0aGUgZGVmYXVsdHMiLCAoKSA9PiB7CiAgICBmc01vY2suZXhpc3RzU3luYy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tSZXR1cm5WYWx1ZShKU09OLnN0cmluZ2lmeSh7IGxhYmVsczogeyB1c2VyOiAiTWUiIH0gfSkpOwogICAgY29uc3QgbG9hZGVkID0gcy5sb2FkU2V0dGluZ3MoKTsKICAgIGV4cGVjdChsb2FkZWQubGFiZWxzKS50b0VxdWFsKHsgdXNlcjogIk1lIiB9KTsKICAgIGV4cGVjdChsb2FkZWQuY29sb3JzKS50b0JlKHMuREVGQVVMVF9TRVRUSU5HUy5jb2xvcnMpOwogICAgZXhwZWN0KGZzTW9jay5yZWFkRmlsZVN5bmMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHMuU0VUVElOR1NfRklMRSwgInV0ZjgiKTsKICB9KTsKCiAgaXQoImZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHRzIG9uIG1hbGZvcm1lZCBKU09OIG9yIGEgcmVhZCBlcnJvciIsICgpID0+IHsKICAgIGZzTW9jay5leGlzdHNTeW5jLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTsKICAgIGZzTW9jay5yZWFkRmlsZVN5bmMubW9ja1JldHVyblZhbHVlKCJ7bm90IGpzb24iKTsKICAgIGV4cGVjdChzLmxvYWRTZXR0aW5ncygpKS50b0JlKHMuREVGQVVMVF9TRVRUSU5HUyk7CiAgICBmc01vY2sucmVhZEZpbGVTeW5jLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRUFDQ0VTIik7CiAgICB9KTsKICAgIGV4cGVjdChzLmxvYWRTZXR0aW5ncygpKS50b0JlKHMuREVGQVVMVF9TRVRUSU5HUyk7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoInNhdmVTZXR0aW5ncyIsICgpID0+IHsKICBpdCgiY3JlYXRlcyB0aGUgY29uZmlnIGRpciB3aGVuIG1pc3NpbmcgYW5kIHdyaXRlcyBwcmV0dHkgSlNPTiIsICgpID0+IHsKICAgIGZzTW9jay5leGlzdHNTeW5jLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7CiAgICBleHBlY3Qocy5zYXZlU2V0dGluZ3Mocy5ERUZBVUxUX1NFVFRJTkdTKSkudG9CZSh0cnVlKTsKICAgIGV4cGVjdChmc01vY2subWtkaXJTeW5jKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgiL2hvbWUvYWRhLy5jb25maWciLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGNvbnN0IFtmaWxlLCBib2R5XSA9IGZzTW9jay53cml0ZUZpbGVTeW5jLm1vY2suY2FsbHNbMF07CiAgICBleHBlY3QoZmlsZSkudG9CZShzLlNFVFRJTkdTX0ZJTEUpOwogICAgZXhwZWN0KEpTT04ucGFyc2UoYm9keSkpLnRvRXF1YWwoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzLkRFRkFVTFRfU0VUVElOR1MpKSk7CiAgICBleHBlY3QoYm9keSkudG9Db250YWluKCdcbiAgImRpc3BsYXlfb3JkZXIiJyk7CiAgfSk7CgogIGl0KCJza2lwcyBta2RpciB3aGVuIHRoZSBkaXIgZXhpc3RzIiwgKCkgPT4gewogICAgZnNNb2NrLmV4aXN0c1N5bmMubW9ja1JldHVyblZhbHVlKHRydWUpOwogICAgZXhwZWN0KHMuc2F2ZVNldHRpbmdzKHMuREVGQVVMVF9TRVRUSU5HUykpLnRvQmUodHJ1ZSk7CiAgICBleHBlY3QoZnNNb2NrLm1rZGlyU3luYykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTsKICB9KTsKCiAgaXQoInJlcG9ydHMgZmFpbHVyZSBpbnN0ZWFkIG9mIHRocm93aW5nIiwgKCkgPT4gewogICAgZnNNb2NrLmV4aXN0c1N5bmMubW9ja1JldHVyblZhbHVlKHRydWUpOwogICAgZnNNb2NrLndyaXRlRmlsZVN5bmMubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJFUk9GUyIpOwogICAgfSk7CiAgICBleHBlY3Qocy5zYXZlU2V0dGluZ3Mocy5ERUZBVUxUX1NFVFRJTkdTKSkudG9CZShmYWxzZSk7CiAgfSk7Cn0pOwo=\"","export default \"data:video/mp2t;base64,LyoqCiAqIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gYW5kIG1hbmFnZW1lbnQKICogQG1vZHVsZSBpbmZvL3NldHRpbmdzCiAqLwoKaW1wb3J0IHBhdGggZnJvbSAicGF0aCI7CmltcG9ydCBvcyBmcm9tICJvcyI7CmltcG9ydCBmcyBmcm9tICJmcyI7CmltcG9ydCBwcm9jZXNzIGZyb20gInByb2Nlc3MiOwoKLy8gU2V0dGluZ3MgZmlsZSBwYXRocwpleHBvcnQgY29uc3QgU0VUVElOR1NfRklMRSA9IHBhdGguam9pbigKICBvcy5ob21lZGlyKCksCiAgIi5jb25maWciLAogICJzeXN0ZW1pbmZvLXNldHRpbmdzLmpzb24iLAopOwpleHBvcnQgY29uc3QgQ0FDSEVfRklMRSA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgInN5c3RlbWluZm8tY2FjaGUuanNvbiIpOwoKLy8gQ29sb3IgY29kZXMKLy8KLy8gVGhlc2UgYXJlIGRlbGliZXJhdGVseSBkYXJrZXIvbW9yZSBzYXR1cmF0ZWQgdGhhbiBhIHR5cGljYWwgdGVybWluYWwKLy8gcGFsZXR0ZS4gVGhlIG9yaWdpbmFsIGJyaWdodCB2YXJpYW50cyAoZS5nLiB5ZWxsb3cgMjI2LCBjeWFuIDUxLCBncmF5IDI1MCkKLy8gaGF2ZSB2ZXJ5IGhpZ2ggbHVtaW5hbmNlIGFuZCBhcmUgbmVhcmx5IHVucmVhZGFibGUgb24gYSBsaWdodC93aGl0ZQovLyB0ZXJtaW5hbCBiYWNrZ3JvdW5kLiBgbGlnaHRibHVlYCB3YXMgYWxzbyBtaXNsYWJlbGVkOiBpdCBwb2ludGVkIGF0IGdvbGQKLy8gKDIyMCksIG5vdCBhIGJsdWUgYXQgYWxsLiBFdmVyeSB2YWx1ZSBiZWxvdyByZWFkcyBjbGVhcmx5IG9uIGJvdGggbGlnaHQKLy8gYW5kIGRhcmsgYmFja2dyb3VuZHMuCmV4cG9ydCBjb25zdCBjb2xvcnMgPSB7CiAgcmVzZXQ6ICJceDFiWzBtIiwKICByZWQ6ICJceDFiWzM4OzU7MTYwbSIsCiAgb3JhbmdlOiAiXHgxYlszODs1OzEzMG0iLAogIHllbGxvdzogIlx4MWJbMzg7NTs1OG0iLAogIGdyZWVuOiAiXHgxYlszODs1OzIybSIsCiAgYmx1ZTogIlx4MWJbMzg7NTsyNW0iLAogIGN5YW46ICJceDFiWzM4OzU7MjNtIiwKICBwdXJwbGU6ICJceDFiWzM4OzU7OTFtIiwKICBtYWdlbnRhOiAiXHgxYlszODs1OzEyNW0iLAogIGdyYXk6ICJceDFiWzM4OzU7MjM4bSIsCiAgbGlnaHRibHVlOiAiXHgxYlszODs1OzI0bSIsCn07CgovLyBCYWNrZ3JvdW5kIHZhcmlhbnRzLCBrZXllZCB0aGUgc2FtZSBhcyBgY29sb3JzYCwgdXNlZCB3aGVuCi8vIGBkaXNwbGF5LnNob3dfYmFja2dyb3VuZHNgIGlzIGVuYWJsZWQuIEVhY2ggZW50cnkgc2V0cyBpdHMgb3duIGJhY2tncm91bmQKLy8gYmxvY2sgcGx1cyBhIGZvcmVncm91bmQgdGV4dCBjb2xvciBjaG9zZW4gZm9yIGNvbnRyYXN0IGFnYWluc3QgaXQsIHNvCi8vIGV2ZXJ5IGl0ZW0gaXMgbGVnaWJsZSBvbiBpdHMgb3duIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgdGVybWluYWwncwovLyBiYWNrZ3JvdW5kIGFjdHVhbGx5IGlzLgpleHBvcnQgY29uc3QgYmFja2dyb3VuZHMgPSB7CiAgcmVkOiAiXHgxYls0ODs1Ozg4bVx4MWJbMzg7NTsyNTVtIiwKICBvcmFuZ2U6ICJceDFiWzQ4OzU7MTY2bVx4MWJbMzg7NTsyMzJtIiwKICB5ZWxsb3c6ICJceDFiWzQ4OzU7MTc4bVx4MWJbMzg7NTsyMzJtIiwKICBncmVlbjogIlx4MWJbNDg7NTsyMm1ceDFiWzM4OzU7MjU1bSIsCiAgYmx1ZTogIlx4MWJbNDg7NTsxOG1ceDFiWzM4OzU7MjU1bSIsCiAgY3lhbjogIlx4MWJbNDg7NTsyM21ceDFiWzM4OzU7MjU1bSIsCiAgcHVycGxlOiAiXHgxYls0ODs1OzU0bVx4MWJbMzg7NTsyNTVtIiwKICBtYWdlbnRhOiAiXHgxYls0ODs1OzUzbVx4MWJbMzg7NTsyNTVtIiwKICBncmF5OiAiXHgxYls0ODs1OzIzNm1ceDFiWzM4OzU7MjU1bSIsCiAgbGlnaHRibHVlOiAiXHgxYls0ODs1OzI2bVx4MWJbMzg7NTsyNTVtIiwKfTsKCi8vIERlZmF1bHQgc2V0dGluZ3MKZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1MgPSB7CiAgZGlzcGxheV9vcmRlcjogWwogICAgWwogICAgICAidXNlciIsCiAgICAgICJob3N0bmFtZSIsCiAgICAgICJvcyIsCiAgICAgICJkZXZpY2UiLAogICAgICAia2VybmVsIiwKICAgICAgImNwdSIsCiAgICAgICJiZW5jaCIsCiAgICAgICJncHUiLAogICAgICAiZ3B1X2JlbmNoIiwKICAgIF0sCiAgICBbCiAgICAgICJkaXNrX3VzZWQiLAogICAgICAiZGlza19zaXplIiwKICAgICAgInJhbV91c2VkIiwKICAgICAgInRvcF9wcm9jZXNzIiwKICAgICAgInVwdGltZSIsCiAgICAgICJ0ZW1wZXJhdHVyZSIsCiAgICAgICJiYXR0ZXJ5IiwKICAgICAgImxvYWRfYXZlcmFnZSIsCiAgICBdLAogICAgWyJpcCIsICJpcGxvY2FsIiwgImNpdHkiXSwKICAgIFsic2hlbGwiLCAic2VydmljZXNfcnVubmluZyIsICJwYWNtYW4iLCAiY29udGFpbmVycyJdLAogIF0sCiAgY29sb3JzOiB7CiAgICB1c2VyOiAicmVkIiwKICAgIGhvc3RuYW1lOiAib3JhbmdlIiwKICAgIGRpc2tfdXNlZDogInB1cnBsZSIsCiAgICBkaXNrX3NpemU6ICJwdXJwbGUiLAogICAgcmFtX3VzZWQ6ICJ5ZWxsb3ciLAogICAgdG9wX3Byb2Nlc3M6ICJtYWdlbnRhIiwKICAgIHVwdGltZTogImN5YW4iLAogICAgaXA6ICJncmVlbiIsCiAgICBpcGxvY2FsOiAieWVsbG93IiwKICAgIGNpdHk6ICJncmVlbiIsCiAgICBkb21haW46ICJncmF5IiwKICAgIGlzcDogImxpZ2h0Ymx1ZSIsCiAgICBvczogImdyYXkiLAogICAgY3B1OiAib3JhbmdlIiwKICAgIGdwdTogInllbGxvdyIsCiAgICBiZW5jaDogInJlZCIsCiAgICBncHVfYmVuY2g6ICJyZWQiLAogICAgZGV2aWNlOiAieWVsbG93IiwKICAgIGtlcm5lbDogImdyZWVuIiwKICAgIHNoZWxsOiAib3JhbmdlIiwKICAgIHBhY21hbjogIm11bHRpY29sb3IiLAogICAgcG9ydHM6ICJtdWx0aWNvbG9yIiwKICAgIGNvbnRhaW5lcnM6ICJncmVlbiIsCiAgICBtZW1vcnlfYXZhaWxhYmxlOiAiYmx1ZSIsCiAgICBzd2FwX3VzZWQ6ICJwdXJwbGUiLAogICAgbG9hZF9hdmVyYWdlOiAicmVkIiwKICAgIHVzZXJzX2xvZ2dlZF9pbjogImN5YW4iLAogICAgbmV0d29ya19pbnRlcmZhY2VzOiAieWVsbG93IiwKICAgIG1vdW50X3BvaW50czogImdyYXkiLAogICAgc2VydmljZXNfcnVubmluZzogImdyZWVuIiwKICAgIHRlbXBlcmF0dXJlOiAicmVkIiwKICAgIGJhdHRlcnk6ICJncmVlbiIsCiAgICBzY3JlZW5fcmVzb2x1dGlvbjogImJsdWUiLAogIH0sCiAgZW1vamlzOiB7CiAgICB1c2VyOiAi8J+RpCAiLAogICAgaG9zdG5hbWU6ICLwn4+gICIsCiAgICBpcDogIvCfjI4gIiwKICAgIGlwbG9jYWw6ICLwn4yQICIsCiAgICBjaXR5OiAi8J+TjSAiLAogICAgZG9tYWluOiAi8J+UlyAiLAogICAgaXNwOiAi8J+RriAiLAogICAgb3M6ICLimqEgIiwKICAgIGNwdTogIvCfk4ggIiwKICAgIGdwdTogIvCfjq4gIiwKICAgIGJlbmNoOiAi8J+SqiAiLAogICAgZ3B1X2JlbmNoOiAi8J+Pju+4jyAiLAogICAgZGV2aWNlOiAi8J+SuyAiLAogICAga2VybmVsOiAi8J+UpyAiLAogICAgc2hlbGw6ICLwn5CaICIsCiAgICBwYWNtYW46ICLwn5qAICIsCiAgICBkaXNrX3VzZWQ6ICLwn5OBICIsCiAgICBkaXNrX3NpemU6ICLwn5K9ICIsCiAgICByYW1fdXNlZDogIvCfkr4gIiwKICAgIHRvcF9wcm9jZXNzOiAi8J+UnSAiLAogICAgdXB0aW1lOiAi4o+x77iPICIsCiAgICBwb3J0czogIvCflIwgIiwKICAgIGNvbnRhaW5lcnM6ICLwn5OmICIsCiAgICBtZW1vcnlfYXZhaWxhYmxlOiAi8J+noCAiLAogICAgc3dhcF91c2VkOiAi8J+UhCAiLAogICAgbG9hZF9hdmVyYWdlOiAi4pqW77iPICIsCiAgICB1c2Vyc19sb2dnZWRfaW46ICLwn5GlICIsCiAgICBuZXR3b3JrX2ludGVyZmFjZXM6ICLwn4yQICIsCiAgICBtb3VudF9wb2ludHM6ICLwn5OCICIsCiAgICBzZXJ2aWNlc19ydW5uaW5nOiAi4pqZ77iPICIsCiAgICB0ZW1wZXJhdHVyZTogIvCfjKHvuI8gIiwKICAgIGJhdHRlcnlfY2hhcmdpbmc6ICLwn5SMICIsCiAgICBiYXR0ZXJ5OiAi8J+UiyAiLAogICAgc2NyZWVuX3Jlc29sdXRpb246ICLwn5al77iPICIsCiAgfSwKICBsYWJlbHM6IHsKICAgIHVzZXI6ICJVc2VyIiwKICAgIGhvc3RuYW1lOiAiSG9zdCIsCiAgICBpcDogIklQIiwKICAgIGlwbG9jYWw6ICJMb2NhbCBJUCIsCiAgICBjaXR5OiAiQ2l0eSIsCiAgICBkb21haW46ICJEb21haW4iLAogICAgaXNwOiAiSVNQIiwKICAgIG9zOiAiT1MiLAogICAgY3B1OiAiQ1BVIiwKICAgIGdwdTogIkdQVSIsCiAgICBiZW5jaDogIkJlbmNoIiwKICAgIGdwdV9iZW5jaDogIkdQVSBCZW5jaCIsCiAgICBkZXZpY2U6ICJEZXZpY2UiLAogICAga2VybmVsOiAiS2VybmVsIiwKICAgIHNoZWxsOiAiU2hlbGwiLAogICAgcGFjbWFuOiAiUGFja2FnZXMiLAogICAgZGlza191c2VkOiAiRGlzayIsCiAgICBkaXNrX3NpemU6ICJEaXNrIFNpemUiLAogICAgcmFtX3VzZWQ6ICJSQU0iLAogICAgdG9wX3Byb2Nlc3M6ICJUb3AiLAogICAgdXB0aW1lOiAiVXB0aW1lIiwKICAgIHBvcnRzOiAiUG9ydHMiLAogICAgY29udGFpbmVyczogIkNvbnRhaW5lcnMiLAogICAgbWVtb3J5X2F2YWlsYWJsZTogIk1lbW9yeSIsCiAgICBzd2FwX3VzZWQ6ICJTd2FwIiwKICAgIGxvYWRfYXZlcmFnZTogIkxvYWQiLAogICAgdXNlcnNfbG9nZ2VkX2luOiAiVXNlcnMiLAogICAgbmV0d29ya19pbnRlcmZhY2VzOiAiTmV0d29yayIsCiAgICBtb3VudF9wb2ludHM6ICJNb3VudHMiLAogICAgc2VydmljZXNfcnVubmluZzogIlNlcnZpY2VzIiwKICAgIHRlbXBlcmF0dXJlOiAiVGVtcCIsCiAgICBiYXR0ZXJ5X2NoYXJnaW5nOiAiQmF0dGVyeSIsCiAgICBiYXR0ZXJ5OiAiQmF0dGVyeSIsCiAgICBzY3JlZW5fcmVzb2x1dGlvbjogIlJlc29sdXRpb24iLAogIH0sCiAgZGlzcGxheTogewogICAgc2hvd19lbW9qaXM6IHRydWUsCiAgICBzaG93X2JhY2tncm91bmRzOiB0cnVlLAogICAgc2luZ2xlX2xpbmU6IHRydWUsCiAgICBsaW5lX3dyYXBfbGVuZ3RoOiBwcm9jZXNzPy5zdGRvdXQ/LmNvbHVtbnMgfHwgMTAwLAogIH0sCiAgbmV0d29yazogewogICAgc2hvd19vZmZsaW5lX21lc3NhZ2U6IHRydWUsCiAgfSwKICBhZHZhbmNlZDogewogICAgZGVidWc6IGZhbHNlLAogIH0sCn07CgpleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHsKICBkaXNwbGF5X29yZGVyOiBzdHJpbmdbXVtdOwogIGNvbG9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsKICBlbW9qaXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47CiAgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OwogIGRpc3BsYXk6IHsKICAgIHNob3dfZW1vamlzOiBib29sZWFuOwogICAgLyoqIHRydWUgKGRlZmF1bHQpOiBnaXZlIGV2ZXJ5IGl0ZW0gaXRzIG93biBiYWNrZ3JvdW5kIGNvbG9yIGJsb2NrLCBzbyBpdCBzdGF5cyBsZWdpYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIHRlcm1pbmFsJ3MgYmFja2dyb3VuZCAqLwogICAgc2hvd19iYWNrZ3JvdW5kczogYm9vbGVhbjsKICAgIC8qKiB0cnVlOiBwcmludCBvbmUgY29udGludW91cyBsaW5lIGFuZCBsZXQgdGhlIHRlcm1pbmFsIHNvZnQtd3JhcCBpdDsgZmFsc2U6IGhhcmQtd3JhcCBhdCBsaW5lX3dyYXBfbGVuZ3RoICovCiAgICBzaW5nbGVfbGluZTogYm9vbGVhbjsKICAgIGxpbmVfd3JhcF9sZW5ndGg6IG51bWJlcjsKICB9OwogIG5ldHdvcms6IHsKICAgIHNob3dfb2ZmbGluZV9tZXNzYWdlOiBib29sZWFuOwogIH07CiAgYWR2YW5jZWQ6IHsKICAgIGRlYnVnOiBib29sZWFuOwogIH07Cn0KCi8qKgogKiBMb2FkcyBzZXR0aW5ncyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKICogQHJldHVybnMgU2V0dGluZ3Mgb2JqZWN0IChkZWZhdWx0cyBtZXJnZWQgd2l0aCB1c2VyIHNldHRpbmdzKQogKi8KZXhwb3J0IGZ1bmN0aW9uIGxvYWRTZXR0aW5ncygpOiBTZXR0aW5ncyB7CiAgdHJ5IHsKICAgIGlmIChmcy5leGlzdHNTeW5jKFNFVFRJTkdTX0ZJTEUpKSB7CiAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoU0VUVElOR1NfRklMRSwgInV0ZjgiKSk7CiAgICAgIHJldHVybiB7IC4uLkRFRkFVTFRfU0VUVElOR1MsIC4uLnNldHRpbmdzIH07CiAgICB9CiAgfSBjYXRjaCB7fQogIHJldHVybiBERUZBVUxUX1NFVFRJTkdTOwp9CgovKioKICogU2F2ZXMgc2V0dGluZ3MgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQogKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3Mgb2JqZWN0IHRvIHNhdmUKICogQHJldHVybnMgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKICovCmV4cG9ydCBmdW5jdGlvbiBzYXZlU2V0dGluZ3Moc2V0dGluZ3M6IFNldHRpbmdzKTogYm9vbGVhbiB7CiAgdHJ5IHsKICAgIGNvbnN0IGNvbmZpZ0RpciA9IHBhdGguZGlybmFtZShTRVRUSU5HU19GSUxFKTsKICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEaXIpKSB7CiAgICAgIGZzLm1rZGlyU3luYyhjb25maWdEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgfQogICAgZnMud3JpdGVGaWxlU3luYyhTRVRUSU5HU19GSUxFLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikpOwogICAgcmV0dXJuIHRydWU7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9Cg==\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAidml0ZXN0IjsKCmNvbnN0IGZsYWdzID0gdmkuaG9pc3RlZCgoKSA9PiAoeyB3aW5kb3dzOiBmYWxzZSB9KSk7CnZpLm1vY2soIi4uL3V0aWxzL3BsYXRmb3JtIiwgKCkgPT4gKHsKICBnZXQgSVNfV0lORE9XUygpIHsKICAgIHJldHVybiBmbGFncy53aW5kb3dzOwogIH0sCiAgSVNfTElOVVg6IHRydWUsCiAgSVNfTUFDOiBmYWxzZSwKfSkpOwoKY29uc3QgZXhlY0NvbW1hbmQgPSB2aS5ob2lzdGVkKCgpID0+IHZpLmZuKCkpOwpjb25zdCBjb21tYW5kRXhpc3RzID0gdmkuaG9pc3RlZCgoKSA9PiB2aS5mbigpKTsKdmkubW9jaygiLi4vdXRpbHMvY29tbWFuZCIsICgpID0+ICh7IGV4ZWNDb21tYW5kLCBjb21tYW5kRXhpc3RzIH0pKTsKCmNvbnN0IG9zTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICB1c2VySW5mbzogdmkuZm4oKCkgPT4gKHsgc2hlbGw6ICIvYmluL3pzaCIgfSkpLAogIHRtcGRpcjogdmkuZm4oKCkgPT4gIi90bXAiKSwKICBwbGF0Zm9ybTogdmkuZm4oKCkgPT4gImxpbnV4IiksCn0pKTsKdmkubW9jaygib3MiLCAoKSA9PiAoeyAuLi5vc01vY2ssIGRlZmF1bHQ6IG9zTW9jayB9KSk7CnZpLm1vY2soInByb2Nlc3MiLCAoKSA9PiAoeyBkZWZhdWx0OiB7IHBwaWQ6IDQyNDIgfSB9KSk7Cgpjb25zdCBzID0gYXdhaXQgaW1wb3J0KCIuL3NvZnR3YXJlIik7CmltcG9ydCB0eXBlIHsgSW5mb0NvbnRleHQgfSBmcm9tICIuLi90eXBlcy9pbnRlcm5hbC10eXBlcyI7Cgpjb25zdCBjdHggPSAoKTogSW5mb0NvbnRleHQgPT4gKHsgY2FjaGU6IHt9IH0pOwoKYmVmb3JlRWFjaCgoKSA9PiB7CiAgZmxhZ3Mud2luZG93cyA9IGZhbHNlOwogIGV4ZWNDb21tYW5kLm1vY2tSZXNldCgpLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgY29tbWFuZEV4aXN0cy5tb2NrUmVzZXQoKS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpOwogIG9zTW9jay51c2VySW5mby5tb2NrUmVzZXQoKS5tb2NrUmV0dXJuVmFsdWUoeyBzaGVsbDogIi9iaW4venNoIiB9KTsKfSk7CgpkZXNjcmliZSgic2hlbGwiLCAoKSA9PiB7CiAgaXQoInJldHVybnMgdGhlIGxvZ2luIHNoZWxsJ3MgYmFzZW5hbWUiLCAoKSA9PiB7CiAgICBleHBlY3Qocy5zaGVsbChjdHgoKSkpLnRvQmUoInpzaCIpOwogIH0pOwoKICBpdCgiZmFsbHMgYmFjayB0byB0aGUgcGFyZW50IHByb2Nlc3MgbmFtZSB3aGVuIHRoZXJlIGlzIG5vIGxvZ2luIHNoZWxsIiwgKCkgPT4gewogICAgb3NNb2NrLnVzZXJJbmZvLm1vY2tSZXR1cm5WYWx1ZSh7IHNoZWxsOiAiIiB9KTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiL3Vzci9iaW4vZmlzaCIpOwogICAgZXhwZWN0KHMuc2hlbGwoY3R4KCkpKS50b0JlKCJmaXNoIik7CiAgICBleHBlY3QoZXhlY0NvbW1hbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCJwcyAtcCA0MjQyIC1vIGNvbW09Iik7CiAgfSk7CgogIGl0KCJmYWxscyBiYWNrIHRvIHBzIHdoZW4gdXNlckluZm8gdGhyb3dzIiwgKCkgPT4gewogICAgb3NNb2NrLnVzZXJJbmZvLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigieCIpOwogICAgfSk7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoImJhc2giKTsKICAgIGV4cGVjdChzLnNoZWxsKGN0eCgpKSkudG9CZSgiYmFzaCIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2hlbiBub3RoaW5nIGlkZW50aWZpZXMgdGhlIHNoZWxsIiwgKCkgPT4gewogICAgb3NNb2NrLnVzZXJJbmZvLm1vY2tSZXR1cm5WYWx1ZSh7IHNoZWxsOiAiIiB9KTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgICBleHBlY3Qocy5zaGVsbChjdHgoKSkpLnRvQmUoIiIpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ4Iik7CiAgICB9KTsKICAgIGV4cGVjdChzLnNoZWxsKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBXaW5kb3dzIGFuZCBzZXJ2ZXMgZnJvbSBjYWNoZSIsICgpID0+IHsKICAgIGZsYWdzLndpbmRvd3MgPSB0cnVlOwogICAgY29uc3QgYyA9IGN0eCgpOwogICAgZXhwZWN0KHMuc2hlbGwoYykpLnRvQmUoIiIpOwogICAgZmxhZ3Mud2luZG93cyA9IGZhbHNlOwogICAgZXhwZWN0KHMuc2hlbGwoYykpLnRvQmUoIiIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJwYWNrYWdlcyIsICgpID0+IHsKICBpdCgibGlzdHMgdGhlIHBhY2thZ2UgbWFuYWdlcnMvdG9vbHMgdGhhdCBleGlzdCIsICgpID0+IHsKICAgIGNvbW1hbmRFeGlzdHMubW9ja0ltcGxlbWVudGF0aW9uKChjOiBzdHJpbmcpID0+IFsiYXB0IiwgIm5wbSIsICJidW4iXS5pbmNsdWRlcyhjKSk7CiAgICBjb25zdCBjID0gY3R4KCk7CiAgICBleHBlY3Qocy5wYWNrYWdlcyhjKSkudG9CZSgiYXB0IG5wbSBidW4iKTsKICAgIGNvbW1hbmRFeGlzdHMubW9ja1JldHVyblZhbHVlKGZhbHNlKTsKICAgIGV4cGVjdChzLnBhY2thZ2VzKGMpKS50b0JlKCJhcHQgbnBtIGJ1biIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2hlbiBub3RoaW5nIGlzIGluc3RhbGxlZCIsICgpID0+IHsKICAgIGV4cGVjdChzLnBhY2thZ2VzKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoImNvbW1vbl92ZXJzaW9ucyIsICgpID0+IHsKICBjb25zdCBvdXRwdXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gewogICAgIm5vZGUgLS12ZXJzaW9uIjogInYyMi4xLjAiLAogICAgImdpdCAtLXZlcnNpb24iOiAiZ2l0IHZlcnNpb24gMi40NC4wIiwKICAgICJkb2NrZXIgLS12ZXJzaW9uIjogIkRvY2tlciB2ZXJzaW9uIDI2LjEuMCwgYnVpbGQgYWJjIiwKICAgICJweXRob24zIC0tdmVyc2lvbiI6ICJQeXRob24gMy4xMi4zIiwKICAgICJnbyB2ZXJzaW9uIjogImdvIHZlcnNpb24gZ28xLjIyLjAgbGludXgvYW1kNjQiLAogICAgInJ1c3RjIC0tdmVyc2lvbiI6ICJydXN0YyAxLjc3LjAgKGFiYyAyMDI0LTAzLTE3KSIsCiAgfTsKCiAgaXQoImNsZWFucyBlYWNoIHRvb2wncyB2ZXJzaW9uIG91dHB1dCIsICgpID0+IHsKICAgIGNvbW1hbmRFeGlzdHMubW9ja1JldHVyblZhbHVlKHRydWUpOwogICAgZXhlY0NvbW1hbmQubW9ja0ltcGxlbWVudGF0aW9uKChjOiBzdHJpbmcpID0+IG91dHB1dHNbY10pOwogICAgZXhwZWN0KHMuY29tbW9uX3ZlcnNpb25zKGN0eCgpKSkudG9CZSgKICAgICAgIm5vZGU6MjIuMS4wIGdpdDoyLjQ0LjAgZG9ja2VyOjI2LjEuMCBweXRob24zOjMuMTIuMyBnbzoxLjIyLjAgcnVzdGM6MS43Ny4wIiwKICAgICk7CiAgfSk7CgogIGl0KCJza2lwcyBtaXNzaW5nIHRvb2xzLCBlbXB0eSB2ZXJzaW9ucyBhbmQgZmFpbGluZyBjb21tYW5kcyIsICgpID0+IHsKICAgIGNvbW1hbmRFeGlzdHMubW9ja0ltcGxlbWVudGF0aW9uKChjOiBzdHJpbmcpID0+IFsibm9kZSIsICJnaXQiLCAiZ28iXS5pbmNsdWRlcyhjKSk7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4gewogICAgICBpZiAoYy5zdGFydHNXaXRoKCJnaXQiKSkgcmV0dXJuICIiOwogICAgICBpZiAoYy5zdGFydHNXaXRoKCJnbyIpKSB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgICAgcmV0dXJuIG91dHB1dHNbY107CiAgICB9KTsKICAgIGNvbnN0IGMgPSBjdHgoKTsKICAgIGV4cGVjdChzLmNvbW1vbl92ZXJzaW9ucyhjKSkudG9CZSgibm9kZToyMi4xLjAiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgidjEiKTsKICAgIGV4cGVjdChzLmNvbW1vbl92ZXJzaW9ucyhjKSkudG9CZSgibm9kZToyMi4xLjAiKTsKICB9KTsKfSk7CgpkZXNjcmliZSgiY29udGFpbmVycyIsICgpID0+IHsKICBpdCgiaXMgZW1wdHkgd2l0aG91dCBkb2NrZXIiLCAoKSA9PiB7CiAgICBleHBlY3Qocy5jb250YWluZXJzKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSB3aGVuIG5vIGNvbnRhaW5lcnMgYXJlIHJ1bm5pbmciLCAoKSA9PiB7CiAgICBjb21tYW5kRXhpc3RzLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiIik7CiAgICBleHBlY3Qocy5jb250YWluZXJzKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJsaXN0cyBuYW1lcyB3aXRoIHRoZWlyIGRlLWR1cGxpY2F0ZWQgcHVibGlzaGVkIHBvcnRzIiwgKCkgPT4gewogICAgY29tbWFuZEV4aXN0cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4KICAgICAgYyA9PT0gImRvY2tlciBwcyAtcSIKICAgICAgICA/ICJhYmNcbmRlZlxuZ2hpIgogICAgICAgIDogWwogICAgICAgICAgICAid2ViXHQwLjAuMC4wOjgwODAtPjgwL3RjcCwgOjo6ODA4MC0+ODAvdGNwLCAwLjAuMC4wOjkwMDAtOTAwMi0+OTAwMC05MDAyL3RjcCIsCiAgICAgICAgICAgICJkYlx0NTQzMi90Y3AiLAogICAgICAgICAgICAiYmFyZSIsCiAgICAgICAgICAgICJcdDAuMC4wLjA6MS0+MS90Y3AiLAogICAgICAgICAgXS5qb2luKCJcbiIpLAogICAgKTsKICAgIGNvbnN0IGMgPSBjdHgoKTsKICAgIGV4cGVjdChzLmNvbnRhaW5lcnMoYykpLnRvQmUoIndlYiA4MCA5MDAwLTkwMDIgZGIgYmFyZSIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICAgIGV4cGVjdChzLmNvbnRhaW5lcnMoYykpLnRvQmUoIndlYiA4MCA5MDAwLTkwMDIgZGIgYmFyZSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2hlbiBkb2NrZXIgZXJyb3JzIiwgKCkgPT4gewogICAgY29tbWFuZEV4aXN0cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KHMuY29udGFpbmVycyhjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwp9KTsK\"","export default \"data:video/mp2t;base64,LyoqCiAqIFNvZnR3YXJlIGFuZCBwYWNrYWdlLXJlbGF0ZWQgc3lzdGVtIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwogKiBAbW9kdWxlIGluZm8vc29mdHdhcmUKICovCgppbXBvcnQgb3MgZnJvbSAib3MiOwppbXBvcnQgcHJvY2VzcyBmcm9tICJwcm9jZXNzIjsKaW1wb3J0IHR5cGUgeyBJbmZvQ29udGV4dCB9IGZyb20gIi4uL3R5cGVzL2ludGVybmFsLXR5cGVzIjsKaW1wb3J0IHsgSVNfV0lORE9XUyB9IGZyb20gIi4uL3V0aWxzL3BsYXRmb3JtIjsKaW1wb3J0IHsgZXhlY0NvbW1hbmQsIGNvbW1hbmRFeGlzdHMgfSBmcm9tICIuLi91dGlscy9jb21tYW5kIjsKaW1wb3J0IHsgZ2V0Q2FjaGVkVmFsdWUsIHNldENhY2hlZFZhbHVlIH0gZnJvbSAiLi4vY2FjaGUvY2FjaGUiOwoKLyoqCiAqIEdldHMgdGhlIGN1cnJlbnQgc2hlbGwgbmFtZQogKiBVc2VzIHRoZSB1c2VyJ3MgbG9naW4gc2hlbGwgKG1hY09TL0xpbnV4KSwgZmFsbHMgYmFjayB0byBwcyBmb3IgdGhlCiAqIHBhcmVudCBwcm9jZXNzIHNoZWxsCiAqIEByZXR1cm5zIFNoZWxsIG5hbWUgb3IgZW1wdHkgc3RyaW5nIG9uIFdpbmRvd3MKICogQGV4YW1wbGUgImJhc2giLCAienNoIiwgImZpc2giLCAibnUiCiAqLwpleHBvcnQgZnVuY3Rpb24gc2hlbGwoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJzaGVsbCIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGlmICghSVNfV0lORE9XUykgewogICAgdHJ5IHsKICAgICAgY29uc3QgbG9naW5TaGVsbCA9IG9zLnVzZXJJbmZvKCkuc2hlbGw7CiAgICAgIGlmIChsb2dpblNoZWxsKSB7CiAgICAgICAgY29uc3Qgc2hlbGxOYW1lID0gbG9naW5TaGVsbC5zcGxpdCgiLyIpLnBvcCgpIGFzIHN0cmluZzsKICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAic2hlbGwiLCBzaGVsbE5hbWUpOwogICAgICAgIHJldHVybiBzaGVsbE5hbWU7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KCiAgICB0cnkgewogICAgICBjb25zdCBwcGlkID0gcHJvY2Vzcy5wcGlkOwogICAgICBjb25zdCBzaGVsbE5hbWUgPSBleGVjQ29tbWFuZChgcHMgLXAgJHtwcGlkfSAtbyBjb21tPWApLnNwbGl0KCIvIikucG9wKCk7CiAgICAgIGlmIChzaGVsbE5hbWUpIHsKICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAic2hlbGwiLCBzaGVsbE5hbWUpOwogICAgICAgIHJldHVybiBzaGVsbE5hbWU7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICB9CgogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJzaGVsbCIsICIiKTsKICByZXR1cm4gIiI7Cn0KCi8qKgogKiBHZXRzIGF2YWlsYWJsZSBwYWNrYWdlIG1hbmFnZXJzIGFuZCBkZXZlbG9wbWVudCB0b29scwogKiBDaGVja3MgZm9yIHBhY2thZ2UgbWFuYWdlcnMgKGFwdCwgeXVtLCBucG0sIGV0Yy4pIGFuZCBlZGl0b3JzIChudmltLCBoeCkKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBTcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMKICogQGV4YW1wbGUgImFwdCBucG0gZG9ja2VyIG52aW0iLCAieWF5IHBhY21hbiBidW4gaHgiCiAqLwpleHBvcnQgZnVuY3Rpb24gcGFja2FnZXMoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJwYWNrYWdlcyIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGNvbnN0IGNvbW1hbmRzID0gWwogICAgImFwdCIsCiAgICAiYnJldyIsCiAgICAibnBtIiwKICAgICJ1diIsCiAgICAiZG9ja2VyIiwKICAgICJoeCIsCiAgICAibnZpbSIsCiAgICAiYnVuIiwKICAgICJ5YXkiLAogICAgInBhY21hbiIsCiAgICAieXVtIiwKICAgICJkbmYiLAogICAgInp5cHBlciIsCiAgICAiZW1lcmdlIiwKICAgICJhcGsiLAogICAgInNuYXAiLAogICAgImZsYXRwYWsiLAogIF07CiAgY29uc3QgYXZhaWxhYmxlID0gY29tbWFuZHMuZmlsdGVyKChjbWQpID0+IGNvbW1hbmRFeGlzdHMoY21kKSk7CgogIGNvbnN0IHJlc3VsdCA9IGF2YWlsYWJsZS5qb2luKCIgIik7CiAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgInBhY2thZ2VzIiwgcmVzdWx0KTsKICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogR2V0cyB2ZXJzaW9ucyBvZiBjb21tb24gc29mdHdhcmUgdG9vbHMKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3RyaW5nIG9mIHRvb2wgdmVyc2lvbnMKICogQGV4YW1wbGUgIm5vZGU6MjAuMS4wIGdpdDoyLjM0LjEiCiAqLwpleHBvcnQgZnVuY3Rpb24gY29tbW9uX3ZlcnNpb25zKGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiY29tbW9uX3ZlcnNpb25zIik7CiAgaWYgKGNhY2hlZCAhPT0gbnVsbCkgcmV0dXJuIGNhY2hlZDsKCiAgY29uc3QgdG9vbHMgPSBbCiAgICB7CiAgICAgIGNtZDogIm5vZGUiLAogICAgICBhcmdzOiAiLS12ZXJzaW9uIiwKICAgICAgY2xlYW46ICh2OiBzdHJpbmcpID0+IHYucmVwbGFjZSgvXnYvLCAiIiksCiAgICB9LAogICAgewogICAgICBjbWQ6ICJnaXQiLAogICAgICBhcmdzOiAiLS12ZXJzaW9uIiwKICAgICAgY2xlYW46ICh2OiBzdHJpbmcpID0+IHYucmVwbGFjZSgiZ2l0IHZlcnNpb24gIiwgIiIpLAogICAgfSwKICAgIHsKICAgICAgY21kOiAiZG9ja2VyIiwKICAgICAgYXJnczogIi0tdmVyc2lvbiIsCiAgICAgIGNsZWFuOiAodjogc3RyaW5nKSA9PiB2LnJlcGxhY2UoL0RvY2tlciB2ZXJzaW9uIChbXixdKyksLiovLCAiJDEiKSwKICAgIH0sCiAgICB7CiAgICAgIGNtZDogInB5dGhvbjMiLAogICAgICBhcmdzOiAiLS12ZXJzaW9uIiwKICAgICAgY2xlYW46ICh2OiBzdHJpbmcpID0+IHYucmVwbGFjZSgiUHl0aG9uICIsICIiKSwKICAgIH0sCiAgICB7CiAgICAgIGNtZDogImdvIiwKICAgICAgYXJnczogInZlcnNpb24iLAogICAgICBjbGVhbjogKHY6IHN0cmluZykgPT4gdi5yZXBsYWNlKCJnbyB2ZXJzaW9uIGdvIiwgIiIpLnNwbGl0KCIgIilbMF0sCiAgICB9LAogICAgewogICAgICBjbWQ6ICJydXN0YyIsCiAgICAgIGFyZ3M6ICItLXZlcnNpb24iLAogICAgICBjbGVhbjogKHY6IHN0cmluZykgPT4gdi5yZXBsYWNlKCJydXN0YyAiLCAiIikuc3BsaXQoIiAiKVswXSwKICAgIH0sCiAgXTsKCiAgY29uc3QgdmVyc2lvbnM6IHN0cmluZ1tdID0gW107CgogIGZvciAoY29uc3QgdG9vbCBvZiB0b29scykgewogICAgaWYgKGNvbW1hbmRFeGlzdHModG9vbC5jbWQpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgb3V0cHV0ID0gZXhlY0NvbW1hbmQoYCR7dG9vbC5jbWR9ICR7dG9vbC5hcmdzfWApOwogICAgICAgIGNvbnN0IHZlcnNpb24gPSB0b29sLmNsZWFuKG91dHB1dCkudHJpbSgpOwogICAgICAgIGlmICh2ZXJzaW9uKSB7CiAgICAgICAgICB2ZXJzaW9ucy5wdXNoKGAke3Rvb2wuY21kfToke3ZlcnNpb259YCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIHt9CiAgICB9CiAgfQoKICBjb25zdCByZXN1bHQgPSB2ZXJzaW9ucy5qb2luKCIgIik7CiAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgImNvbW1vbl92ZXJzaW9ucyIsIHJlc3VsdCk7CiAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogR2V0cyBydW5uaW5nIERvY2tlciBjb250YWluZXIgbmFtZXMKICogTGlzdHMgYWN0aXZlIERvY2tlciBjb250YWluZXJzIHdpdGggdGhlaXIgbmFtZXMKICogQHBhcmFtIGNvbnRleHQgLSBJbmZvIGNvbnRleHQgd2l0aCBjYWNoZQogKiBAcmV0dXJucyBTcGFjZS1zZXBhcmF0ZWQgY29udGFpbmVyIG5hbWVzIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAibmdpbnggcmVkaXMgcG9zdGdyZXMiLCAid2ViLWFwcCBkYi1zZXJ2ZXIiCiAqLwpleHBvcnQgZnVuY3Rpb24gY29udGFpbmVycyhjb250ZXh0OiBJbmZvQ29udGV4dCk6IHN0cmluZyB7CiAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgImNvbnRhaW5lcnMiKTsKICBpZiAoY2FjaGVkICE9PSBudWxsKSByZXR1cm4gY2FjaGVkOwoKICBpZiAoIWNvbW1hbmRFeGlzdHMoImRvY2tlciIpKSB7CiAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiY29udGFpbmVycyIsICIiKTsKICAgIHJldHVybiAiIjsKICB9CgogIHRyeSB7CiAgICBjb25zdCBjb250YWluZXJDb3VudCA9IGV4ZWNDb21tYW5kKCJkb2NrZXIgcHMgLXEiKQogICAgICAuc3BsaXQoIlxuIikKICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS50cmltKCkpLmxlbmd0aDsKICAgIGlmIChjb250YWluZXJDb3VudCA9PT0gMCkgewogICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiY29udGFpbmVycyIsICIiKTsKICAgICAgcmV0dXJuICIiOwogICAgfQoKICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBleGVjQ29tbWFuZCgKICAgICAgJ2RvY2tlciBwcyAtLWZvcm1hdCAie3suTmFtZXN9fVx0e3suUG9ydHN9fSInCiAgICApOwogICAgY29uc3QgbGluZXMgPSBjb250YWluZXJzLnNwbGl0KCJcbiIpLmZpbHRlcigobGluZSkgPT4gbGluZS50cmltKCkpOwoKICAgIGNvbnN0IGNvbnRhaW5lckluZm86IHN0cmluZ1tdID0gW107CgogICAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4gewogICAgICBjb25zdCBbbmFtZSwgcG9ydHNdID0gbGluZS5zcGxpdCgiXHQiKTsKICAgICAgaWYgKG5hbWUpIHsKICAgICAgICBjb250YWluZXJJbmZvLnB1c2gobmFtZSk7CgogICAgICAgIGlmIChwb3J0cykgewogICAgICAgICAgY29uc3QgcG9ydE1hdGNoZXMgPSBwb3J0cy5tYXRjaCgvLT4oXGQrKC1cZCspPylcLy9nKTsKICAgICAgICAgIGlmIChwb3J0TWF0Y2hlcykgewogICAgICAgICAgICBjb25zdCB1bmlxdWVQb3J0cyA9IFsKICAgICAgICAgICAgICAuLi5uZXcgU2V0KAogICAgICAgICAgICAgICAgcG9ydE1hdGNoZXMubWFwKChwKSA9PiBwLnJlcGxhY2UoL14tPihcZCsoLVxkKyk/KVwvJC8sICIkMSIpKQogICAgICAgICAgICAgICksCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGNvbnRhaW5lckluZm8ucHVzaCguLi51bmlxdWVQb3J0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBjb25zdCByZXN1bHQgPSBjb250YWluZXJJbmZvLmpvaW4oIiAiKTsKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJjb250YWluZXJzIiwgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfSBjYXRjaCB7fQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiY29udGFpbmVycyIsICIiKTsKICByZXR1cm4gIiI7Cn0K\"","export default \"data:video/mp2t;base64,aW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAidml0ZXN0IjsKCmNvbnN0IGZsYWdzID0gdmkuaG9pc3RlZCgoKSA9PiAoeyBsaW51eDogdHJ1ZSwgbWFjOiBmYWxzZSB9KSk7CnZpLm1vY2soIi4uL3V0aWxzL3BsYXRmb3JtIiwgKCkgPT4gKHsKICBnZXQgSVNfTElOVVgoKSB7CiAgICByZXR1cm4gZmxhZ3MubGludXg7CiAgfSwKICBnZXQgSVNfTUFDKCkgewogICAgcmV0dXJuIGZsYWdzLm1hYzsKICB9LAogIElTX1dJTkRPV1M6IGZhbHNlLAp9KSk7Cgpjb25zdCBleGVjQ29tbWFuZCA9IHZpLmhvaXN0ZWQoKCkgPT4gdmkuZm4oKSk7CmNvbnN0IGNvbW1hbmRFeGlzdHMgPSB2aS5ob2lzdGVkKCgpID0+IHZpLmZuKCkpOwp2aS5tb2NrKCIuLi91dGlscy9jb21tYW5kIiwgKCkgPT4gKHsgZXhlY0NvbW1hbmQsIGNvbW1hbmRFeGlzdHMgfSkpOwoKY29uc3QgZmlsZXMgPSB2aS5ob2lzdGVkKCgpID0+ICh7IG1hcDoge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSk7CmNvbnN0IGZzTW9jayA9IHZpLmhvaXN0ZWQoKCkgPT4gKHsKICBleGlzdHNTeW5jOiB2aS5mbigocDogc3RyaW5nKSA9PiBwIGluIGZpbGVzLm1hcCksCiAgcmVhZEZpbGVTeW5jOiB2aS5mbigocDogc3RyaW5nKSA9PiB7CiAgICBpZiAoIShwIGluIGZpbGVzLm1hcCkpIHRocm93IG5ldyBFcnJvcigiRU5PRU5UIik7CiAgICByZXR1cm4gZmlsZXMubWFwW3BdOwogIH0pLAogIHdyaXRlRmlsZVN5bmM6IHZpLmZuKCksCn0pKTsKdmkubW9jaygiZnMiLCAoKSA9PiAoeyAuLi5mc01vY2ssIGRlZmF1bHQ6IGZzTW9jayB9KSk7Cgpjb25zdCBvc01vY2sgPSB2aS5ob2lzdGVkKCgpID0+ICh7CiAgbG9hZGF2ZzogdmkuZm4oKCkgPT4gWzAuNSwgMS4yNSwgMl0pLAogIHRtcGRpcjogdmkuZm4oKCkgPT4gIi90bXAiKSwKICBwbGF0Zm9ybTogdmkuZm4oKCkgPT4gImxpbnV4IiksCn0pKTsKdmkubW9jaygib3MiLCAoKSA9PiAoeyAuLi5vc01vY2ssIGRlZmF1bHQ6IG9zTW9jayB9KSk7Cgpjb25zdCBzdCA9IGF3YWl0IGltcG9ydCgiLi9zeXN0ZW0tc3RhdHVzIik7CmltcG9ydCB0eXBlIHsgSW5mb0NvbnRleHQgfSBmcm9tICIuLi90eXBlcy9pbnRlcm5hbC10eXBlcyI7Cgpjb25zdCBjdHggPSAoKTogSW5mb0NvbnRleHQgPT4gKHsgY2FjaGU6IHt9IH0pOwpjb25zdCBwbGF0Zm9ybSA9ICh2OiAibGludXgiIHwgIm1hYyIgfCAib3RoZXIiKSA9PiB7CiAgZmxhZ3MubGludXggPSB2ID09PSAibGludXgiOwogIGZsYWdzLm1hYyA9IHYgPT09ICJtYWMiOwp9OwoKYmVmb3JlRWFjaCgoKSA9PiB7CiAgcGxhdGZvcm0oImxpbnV4Iik7CiAgZmlsZXMubWFwID0ge307CiAgZXhlY0NvbW1hbmQubW9ja1Jlc2V0KCkubW9ja1JldHVyblZhbHVlKCIiKTsKICBjb21tYW5kRXhpc3RzLm1vY2tSZXNldCgpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7Cn0pOwoKZGVzY3JpYmUoImxvYWRfYXZlcmFnZSIsICgpID0+IHsKICBpdCgicmVhZHMgL3Byb2MvbG9hZGF2ZyBvbiBMaW51eCIsICgpID0+IHsKICAgIGZpbGVzLm1hcFsiL3Byb2MvbG9hZGF2ZyJdID0gIjAuMTAgMC4yMCAwLjMwIDEvMjAwIDk5OSI7CiAgICBleHBlY3Qoc3QubG9hZF9hdmVyYWdlKGN0eCgpKSkudG9CZSgiMC4xMCAwLjIwIDAuMzAiKTsKICB9KTsKCiAgaXQoImlzIGVtcHR5IHdoZW4gL3Byb2MvbG9hZGF2ZyBpcyB1bnJlYWRhYmxlIiwgKCkgPT4gewogICAgZXhwZWN0KHN0LmxvYWRfYXZlcmFnZShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgiZm9ybWF0cyBvcy5sb2FkYXZnIG9uIG1hY09TIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm1hYyIpOwogICAgZXhwZWN0KHN0LmxvYWRfYXZlcmFnZShjdHgoKSkpLnRvQmUoIjAuNTAgMS4yNSAyLjAwIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBvdGhlciBwbGF0Zm9ybXMiLCAoKSA9PiB7CiAgICBwbGF0Zm9ybSgib3RoZXIiKTsKICAgIGV4cGVjdChzdC5sb2FkX2F2ZXJhZ2UoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKfSk7CgpkZXNjcmliZSgiYmF0dGVyeSIsICgpID0+IHsKICBpdCgicmVhZHMgY2FwYWNpdHkvc3RhdHVzIGZyb20gc3lzZnMgb24gTGludXgiLCAoKSA9PiB7CiAgICBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L0JBVDAvY2FwYWNpdHkiXSA9ICI4N1xuIjsKICAgIGZpbGVzLm1hcFsiL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvQkFUMC9zdGF0dXMiXSA9ICJDaGFyZ2luZ1xuIjsKICAgIGV4cGVjdChzdC5iYXR0ZXJ5KGN0eCgpKSkudG9CZSgiODclKyIpOwogIH0pOwoKICBpdCgib21pdHMgdGhlICsgd2hlbiBkaXNjaGFyZ2luZywgb3Igd2hlbiBzdGF0dXMgaXMgdW5hdmFpbGFibGUiLCAoKSA9PiB7CiAgICBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L0JBVDAvY2FwYWNpdHkiXSA9ICI1MCI7CiAgICBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L0JBVDAvc3RhdHVzIl0gPSAiRGlzY2hhcmdpbmciOwogICAgZXhwZWN0KHN0LmJhdHRlcnkoY3R4KCkpKS50b0JlKCI1MCUiKTsKICAgIGRlbGV0ZSBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L0JBVDAvc3RhdHVzIl07CiAgICBleHBlY3Qoc3QuYmF0dGVyeShjdHgoKSkpLnRvQmUoIjUwJSIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aCBubyBiYXR0ZXJ5IiwgKCkgPT4gewogICAgZXhwZWN0KHN0LmJhdHRlcnkoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoInBhcnNlcyBwbXNldCBvbiBtYWNPUyIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJtYWMiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiTm93IGRyYXdpbmcgZnJvbSAnQUMgUG93ZXInXG4gLUludGVybmFsQmF0dGVyeS0wIChpZD0xKVx0NjQlOyBjaGFyZ2luZzsgMTowMCByZW1haW5pbmciKTsKICAgIGV4cGVjdChzdC5iYXR0ZXJ5KGN0eCgpKSkudG9CZSgiNjQlKyIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCItSW50ZXJuYWxCYXR0ZXJ5LTBcdDY0JTsgZGlzY2hhcmdpbmc7IDM6MDAgcmVtYWluaW5nIik7CiAgICBleHBlY3Qoc3QuYmF0dGVyeShjdHgoKSkpLnRvQmUoIjY0JSIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJObyBiYXR0ZXJpZXMiKTsKICAgIGV4cGVjdChzdC5iYXR0ZXJ5KGN0eCgpKSkudG9CZSgiIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KHN0LmJhdHRlcnkoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoImlzIGVtcHR5IG9uIG90aGVyIHBsYXRmb3JtcywgYW5kIGNhY2hlZCIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJvdGhlciIpOwogICAgY29uc3QgYyA9IGN0eCgpOwogICAgZXhwZWN0KHN0LmJhdHRlcnkoYykpLnRvQmUoIiIpOwogICAgcGxhdGZvcm0oImxpbnV4Iik7CiAgICBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L0JBVDAvY2FwYWNpdHkiXSA9ICIxMCI7CiAgICBleHBlY3Qoc3QuYmF0dGVyeShjKSkudG9CZSgiIik7CiAgfSk7Cn0pOwoKZGVzY3JpYmUoInRlbXBlcmF0dXJlIiwgKCkgPT4gewogIGl0KCJyZWFkcyB0aGUgZmlyc3QgcGxhdXNpYmxlIHN5c2ZzIHRoZXJtYWwgc291cmNlIiwgKCkgPT4gewogICAgZmlsZXMubWFwWyIvc3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lMC90ZW1wIl0gPSAiMCI7CiAgICBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvaHdtb24vaHdtb24wL3RlbXAxX2lucHV0Il0gPSAiNTQzMjEiOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGN0eCgpKSkudG9CZSgiNTTCsEMiKTsKICB9KTsKCiAgaXQoInJlamVjdHMgaW1wbGF1c2libGUgcmVhZGluZ3MiLCAoKSA9PiB7CiAgICBmaWxlcy5tYXBbIi9zeXMvY2xhc3MvdGhlcm1hbC90aGVybWFsX3pvbmUwL3RlbXAiXSA9ICIyMDAwMDAiOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSB3aGVuIG5vIHNlbnNvcnMgZXhpc3QiLCAoKSA9PiB7CiAgICBleHBlY3Qoc3QudGVtcGVyYXR1cmUoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoInVzZXMgb3N4LWNwdS10ZW1wIG9uIG1hY09TIHdoZW4gaW5zdGFsbGVkIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm1hYyIpOwogICAgY29tbWFuZEV4aXN0cy5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIjYxLjfCsEMiKTsKICAgIGV4cGVjdChzdC50ZW1wZXJhdHVyZShjdHgoKSkpLnRvQmUoIjYywrBDIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIjk5OS4wwrBDIik7CiAgICBleHBlY3Qoc3QudGVtcGVyYXR1cmUoY3R4KCkpKS50b0JlKCIiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgibm8gdGVtcCIpOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGN0eCgpKSkudG9CZSgiIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGN0eCgpKSkudG9CZSgiIik7CiAgfSk7CgogIGl0KCJpcyBlbXB0eSBvbiBtYWNPUyB3aXRob3V0IG9zeC1jcHUtdGVtcCBhbmQgb24gb3RoZXIgcGxhdGZvcm1zIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm1hYyIpOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGN0eCgpKSkudG9CZSgiIik7CiAgICBwbGF0Zm9ybSgib3RoZXIiKTsKICAgIGV4cGVjdChzdC50ZW1wZXJhdHVyZShjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgic2VydmVzIGZyb20gdGhlIGNhY2hlIiwgKCkgPT4gewogICAgY29uc3QgYyA9IGN0eCgpOwogICAgZmlsZXMubWFwWyIvc3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lMC90ZW1wIl0gPSAiNDAwMDAiOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGMpKS50b0JlKCI0MMKwQyIpOwogICAgZmlsZXMubWFwWyIvc3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lMC90ZW1wIl0gPSAiOTAwMDAiOwogICAgZXhwZWN0KHN0LnRlbXBlcmF0dXJlKGMpKS50b0JlKCI0MMKwQyIpOwogIH0pOwp9KTsKCmRlc2NyaWJlKCJzZXJ2aWNlc19ydW5uaW5nIiwgKCkgPT4gewogIGl0KCJjb3VudHMgcnVubmluZyB1bml0cyB2aWEgc3lzdGVtY3RsIiwgKCkgPT4gewogICAgY29tbWFuZEV4aXN0cy5tb2NrSW1wbGVtZW50YXRpb24oKGM6IHN0cmluZykgPT4gYyA9PT0gInN5c3RlbWN0bCIpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCJhLnNlcnZpY2UgbG9hZGVkIGFjdGl2ZSBydW5uaW5nIEFcbmIuc2VydmljZSBsb2FkZWQgYWN0aXZlIHJ1bm5pbmcgQlxuZm9vdGVyIik7CiAgICBleHBlY3Qoc3Quc2VydmljZXNfcnVubmluZyhjdHgoKSkpLnRvQmUoIjIgc2VydmljZXMiKTsKICB9KTsKCiAgaXQoImZhbGxzIGJhY2sgdG8gYHNlcnZpY2UgLS1zdGF0dXMtYWxsYCIsICgpID0+IHsKICAgIGNvbW1hbmRFeGlzdHMubW9ja0ltcGxlbWVudGF0aW9uKChjOiBzdHJpbmcpID0+IGMgPT09ICJzZXJ2aWNlIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIiBbICsgXSAgY3JvblxuIFsgLSBdICBuZ2lueFxuIFsgKyBdICBzc2giKTsKICAgIGV4cGVjdChzdC5zZXJ2aWNlc19ydW5uaW5nKGN0eCgpKSkudG9CZSgiMiBzZXJ2aWNlcyIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgd2l0aCBubyBzZXJ2aWNlIG1hbmFnZXIsIHplcm8gc2VydmljZXMsIG9yIG9uIGVycm9yIiwgKCkgPT4gewogICAgZXhwZWN0KHN0LnNlcnZpY2VzX3J1bm5pbmcoY3R4KCkpKS50b0JlKCIiKTsKICAgIGNvbW1hbmRFeGlzdHMubW9ja1JldHVyblZhbHVlKHRydWUpOwogICAgZXhlY0NvbW1hbmQubW9ja1JldHVyblZhbHVlKCIiKTsKICAgIGV4cGVjdChzdC5zZXJ2aWNlc19ydW5uaW5nKGN0eCgpKSkudG9CZSgiIik7CiAgICBleGVjQ29tbWFuZC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gewogICAgICB0aHJvdyBuZXcgRXJyb3IoIngiKTsKICAgIH0pOwogICAgZXhwZWN0KHN0LnNlcnZpY2VzX3J1bm5pbmcoY3R4KCkpKS50b0JlKCIiKTsKICB9KTsKCiAgaXQoImNvdW50cyBsYXVuY2hjdGwgZW50cmllcyBvbiBtYWNPUyIsICgpID0+IHsKICAgIHBsYXRmb3JtKCJtYWMiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiUElEIFN0YXR1cyBMYWJlbFxuMSAwIGNvbS5hXG4tIDAgY29tLmJcblxuIik7CiAgICBleHBlY3Qoc3Quc2VydmljZXNfcnVubmluZyhjdHgoKSkpLnRvQmUoIjIgc2VydmljZXMiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tSZXR1cm5WYWx1ZSgiUElEIFN0YXR1cyBMYWJlbCIpOwogICAgZXhwZWN0KHN0LnNlcnZpY2VzX3J1bm5pbmcoY3R4KCkpKS50b0JlKCIiKTsKICAgIGV4ZWNDb21tYW5kLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7CiAgICAgIHRocm93IG5ldyBFcnJvcigieCIpOwogICAgfSk7CiAgICBleHBlY3Qoc3Quc2VydmljZXNfcnVubmluZyhjdHgoKSkpLnRvQmUoIiIpOwogIH0pOwoKICBpdCgiaXMgZW1wdHkgb24gb3RoZXIgcGxhdGZvcm1zLCBhbmQgY2FjaGVkIiwgKCkgPT4gewogICAgcGxhdGZvcm0oIm90aGVyIik7CiAgICBjb25zdCBjID0gY3R4KCk7CiAgICBleHBlY3Qoc3Quc2VydmljZXNfcnVubmluZyhjKSkudG9CZSgiIik7CiAgICBwbGF0Zm9ybSgibWFjIik7CiAgICBleGVjQ29tbWFuZC5tb2NrUmV0dXJuVmFsdWUoIlBJRFxuMSAwIGEiKTsKICAgIGV4cGVjdChzdC5zZXJ2aWNlc19ydW5uaW5nKGMpKS50b0JlKCIiKTsKICB9KTsKfSk7Cg==\"","export default \"data:video/mp2t;base64,LyoqCiAqIFN5c3RlbSBzdGF0dXMgYW5kIGhlYWx0aCBpbmZvcm1hdGlvbiBmdW5jdGlvbnMKICogQG1vZHVsZSBpbmZvL3N5c3RlbS1zdGF0dXMKICovCgppbXBvcnQgZnMgZnJvbSAiZnMiOwppbXBvcnQgb3MgZnJvbSAib3MiOwppbXBvcnQgdHlwZSB7IEluZm9Db250ZXh0IH0gZnJvbSAiLi4vdHlwZXMvaW50ZXJuYWwtdHlwZXMiOwppbXBvcnQgeyBJU19MSU5VWCwgSVNfTUFDIH0gZnJvbSAiLi4vdXRpbHMvcGxhdGZvcm0iOwppbXBvcnQgeyBleGVjQ29tbWFuZCwgY29tbWFuZEV4aXN0cyB9IGZyb20gIi4uL3V0aWxzL2NvbW1hbmQiOwppbXBvcnQgeyBnZXRDYWNoZWRWYWx1ZSwgc2V0Q2FjaGVkVmFsdWUgfSBmcm9tICIuLi9jYWNoZS9jYWNoZSI7CgovKioKICogR2V0cyBzeXN0ZW0gbG9hZCBhdmVyYWdlcwogKiBSZWFkcyAxLCA1LCBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgZnJvbSAvcHJvYy9sb2FkYXZnIChMaW51eCkgb3IKICogb3MubG9hZGF2ZygpIChtYWNPUykKICogQHJldHVybnMgU3BhY2Utc2VwYXJhdGVkIGxvYWQgYXZlcmFnZXMgKDFtIDVtIDE1bSkgb3IgZW1wdHkgc3RyaW5nCiAqIEBleGFtcGxlICIwLjUyIDAuNTggMC41OSIsICIyLjEwIDEuOTUgMS44OCIKICovCmV4cG9ydCBmdW5jdGlvbiBsb2FkX2F2ZXJhZ2UoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGlmIChJU19NQUMpIHsKICAgIHJldHVybiBvcwogICAgICAubG9hZGF2ZygpCiAgICAgIC5tYXAoKG4pID0+IG4udG9GaXhlZCgyKSkKICAgICAgLmpvaW4oIiAiKTsKICB9CgogIGlmICghSVNfTElOVVgpIHJldHVybiAiIjsKCiAgdHJ5IHsKICAgIGNvbnN0IGxvYWRhdmcgPSBmcy5yZWFkRmlsZVN5bmMoIi9wcm9jL2xvYWRhdmciLCAidXRmOCIpOwogICAgY29uc3QgbG9hZHMgPSBsb2FkYXZnLnNwbGl0KCIgIikuc2xpY2UoMCwgMyk7CiAgICByZXR1cm4gbG9hZHMuam9pbigiICIpOwogIH0gY2F0Y2gge30KICByZXR1cm4gIiI7Cn0KCi8qKgogKiBHZXRzIGJhdHRlcnkgY2hhcmdlIGxldmVsIGFuZCBjaGFyZ2luZyBzdGF0dXMKICogUmVhZHMgZnJvbSAvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS9CQVQwIChMaW51eCBsYXB0b3BzIG9ubHkpCiAqIEBwYXJhbSBjb250ZXh0IC0gSW5mbyBjb250ZXh0IHdpdGggY2FjaGUKICogQHJldHVybnMgQmF0dGVyeSBwZXJjZW50YWdlIHdpdGggb3B0aW9uYWwgKyBmb3IgY2hhcmdpbmcsIG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiODUlIiwgIjQyJSsiLCAiMTAwJSIKICovCmV4cG9ydCBmdW5jdGlvbiBiYXR0ZXJ5KGNvbnRleHQ6IEluZm9Db250ZXh0KTogc3RyaW5nIHsKICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiYmF0dGVyeSIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGlmIChJU19NQUMpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IGJhdHQgPSBleGVjQ29tbWFuZCgicG1zZXQgLWcgYmF0dCIpOwogICAgICBjb25zdCBwZXJjZW50TWF0Y2ggPSBiYXR0Lm1hdGNoKC8oXGQrKSUvKTsKICAgICAgaWYgKHBlcmNlbnRNYXRjaCkgewogICAgICAgIGNvbnN0IGlzQ2hhcmdpbmcgPSAvO1xzKihjaGFyZ2luZ3xjaGFyZ2VkKTsvaS50ZXN0KGJhdHQpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGAke3BlcmNlbnRNYXRjaFsxXX0lJHtpc0NoYXJnaW5nID8gIisiIDogIiJ9YDsKICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAiYmF0dGVyeSIsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSBjYXRjaCB7fQoKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJiYXR0ZXJ5IiwgIiIpOwogICAgcmV0dXJuICIiOwogIH0KCiAgaWYgKCFJU19MSU5VWCkgewogICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgImJhdHRlcnkiLCAiIik7CiAgICByZXR1cm4gIiI7CiAgfQoKICB0cnkgewogICAgY29uc3QgYmF0dGVyeVBhdGggPSAiL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvQkFUMCI7CiAgICBjb25zdCBjYXBhY2l0eVBhdGggPSBgJHtiYXR0ZXJ5UGF0aH0vY2FwYWNpdHlgOwogICAgY29uc3Qgc3RhdHVzUGF0aCA9IGAke2JhdHRlcnlQYXRofS9zdGF0dXNgOwoKICAgIGlmIChmcy5leGlzdHNTeW5jKGNhcGFjaXR5UGF0aCkpIHsKICAgICAgY29uc3QgY2FwYWNpdHkgPSBmcy5yZWFkRmlsZVN5bmMoY2FwYWNpdHlQYXRoLCAidXRmOCIpLnRyaW0oKTsKICAgICAgY29uc3Qgc3RhdHVzID0gZnMuZXhpc3RzU3luYyhzdGF0dXNQYXRoKQogICAgICAgID8gZnMucmVhZEZpbGVTeW5jKHN0YXR1c1BhdGgsICJ1dGY4IikudHJpbSgpCiAgICAgICAgOiAiVW5rbm93biI7CgogICAgICBjb25zdCBiYXR0ZXJ5UGVyY2VudCA9IHBhcnNlSW50KGNhcGFjaXR5KTsKICAgICAgY29uc3QgaXNDaGFyZ2luZyA9IHN0YXR1cyA9PT0gIkNoYXJnaW5nIjsKICAgICAgY29uc3QgcmVzdWx0ID0gYCR7YmF0dGVyeVBlcmNlbnR9JSR7aXNDaGFyZ2luZyA/ICIrIiA6ICIifWA7CiAgICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJiYXR0ZXJ5IiwgcmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9IGNhdGNoIHt9CgogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJiYXR0ZXJ5IiwgIiIpOwogIHJldHVybiAiIjsKfQoKLyoqCiAqIEdldHMgc3lzdGVtIHRlbXBlcmF0dXJlIGluIENlbHNpdXMKICogUmVhZHMgZnJvbSB0aGVybWFsIHpvbmUgb3IgaHdtb24gc2Vuc29ycyAoTGludXgpLCBvciBmcm9tIHRoZQogKiBgb3N4LWNwdS10ZW1wYCBDTEkgKG1hY09TLCBpZiBpbnN0YWxsZWQgdmlhIGBicmV3IGluc3RhbGwgb3N4LWNwdS10ZW1wYCkgLQogKiBtYWNPUyBoYXMgbm8gdW5wcml2aWxlZ2VkIEFQSSBmb3IgdGhpcywgc28gbm90aGluZyBpcyByZXBvcnRlZCB3aXRob3V0IGl0CiAqIEBwYXJhbSBjb250ZXh0IC0gSW5mbyBjb250ZXh0IHdpdGggY2FjaGUKICogQHJldHVybnMgVGVtcGVyYXR1cmUgd2l0aCDCsEMgc3VmZml4IG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiNDXCsEMiLCAiNjLCsEMiCiAqLwpleHBvcnQgZnVuY3Rpb24gdGVtcGVyYXR1cmUoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJ0ZW1wZXJhdHVyZSIpOwogIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7CgogIGlmIChJU19NQUMpIHsKICAgIGlmIChjb21tYW5kRXhpc3RzKCJvc3gtY3B1LXRlbXAiKSkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IG91dHB1dCA9IGV4ZWNDb21tYW5kKCJvc3gtY3B1LXRlbXAiKTsKICAgICAgICBjb25zdCBtYXRjaCA9IG91dHB1dC5tYXRjaCgvKFtcZC5dKylccyrCsD9DLyk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBjb25zdCB0ZW1wQyA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFsxXSkpOwogICAgICAgICAgaWYgKHRlbXBDID4gMCAmJiB0ZW1wQyA8IDE1MCkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBgJHt0ZW1wQ33CsENgOwogICAgICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAidGVtcGVyYXR1cmUiLCByZXN1bHQpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBjYXRjaCB7fQogICAgfQoKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJ0ZW1wZXJhdHVyZSIsICIiKTsKICAgIHJldHVybiAiIjsKICB9CgogIGlmICghSVNfTElOVVgpIHsKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJ0ZW1wZXJhdHVyZSIsICIiKTsKICAgIHJldHVybiAiIjsKICB9CgogIHRyeSB7CiAgICBjb25zdCB0ZW1wU291cmNlcyA9IFsKICAgICAgIi9zeXMvY2xhc3MvdGhlcm1hbC90aGVybWFsX3pvbmUwL3RlbXAiLAogICAgICAiL3N5cy9jbGFzcy9od21vbi9od21vbjAvdGVtcDFfaW5wdXQiLAogICAgICAiL3N5cy9jbGFzcy9od21vbi9od21vbjEvdGVtcDFfaW5wdXQiLAogICAgXTsKCiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0ZW1wU291cmNlcykgewogICAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2UpKSB7CiAgICAgICAgY29uc3QgdGVtcCA9IGZzLnJlYWRGaWxlU3luYyhzb3VyY2UsICJ1dGY4IikudHJpbSgpOwogICAgICAgIGNvbnN0IHRlbXBDID0gTWF0aC5yb3VuZChwYXJzZUludCh0ZW1wKSAvIDEwMDApOwoKICAgICAgICBpZiAodGVtcEMgPiAwICYmIHRlbXBDIDwgMTUwKSB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBgJHt0ZW1wQ33CsENgOwogICAgICAgICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgInRlbXBlcmF0dXJlIiwgcmVzdWx0KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSBjYXRjaCB7fQoKICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAidGVtcGVyYXR1cmUiLCAiIik7CiAgcmV0dXJuICIiOwp9CgovKioKICogR2V0cyBjb3VudCBvZiBydW5uaW5nIHN5c3RlbSBzZXJ2aWNlcwogKiBVc2VzIHN5c3RlbWN0bCBvciBzZXJ2aWNlIGNvbW1hbmQgKExpbnV4IG9ubHkpCiAqIEBwYXJhbSBjb250ZXh0IC0gSW5mbyBjb250ZXh0IHdpdGggY2FjaGUKICogQHJldHVybnMgU2VydmljZSBjb3VudCB3aXRoICJzZXJ2aWNlcyIgc3VmZml4IG9yIGVtcHR5IHN0cmluZwogKiBAZXhhbXBsZSAiMTI1IHNlcnZpY2VzIiwgIjg5IHNlcnZpY2VzIgogKi8KZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VzX3J1bm5pbmcoY29udGV4dDogSW5mb0NvbnRleHQpOiBzdHJpbmcgewogIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJzZXJ2aWNlc19ydW5uaW5nIik7CiAgaWYgKGNhY2hlZCAhPT0gbnVsbCkgcmV0dXJuIGNhY2hlZDsKCiAgaWYgKElTX01BQykgewogICAgdHJ5IHsKICAgICAgY29uc3Qgc2VydmljZXMgPSBleGVjQ29tbWFuZCgibGF1bmNoY3RsIGxpc3QiKTsKICAgICAgY29uc3Qgc2VydmljZUNvdW50ID0gc2VydmljZXMKICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSAmJiAhbGluZS5zdGFydHNXaXRoKCJQSUQiKSkubGVuZ3RoOwoKICAgICAgaWYgKHNlcnZpY2VDb3VudCA+IDApIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBgJHtzZXJ2aWNlQ291bnR9IHNlcnZpY2VzYDsKICAgICAgICBzZXRDYWNoZWRWYWx1ZShjb250ZXh0LmNhY2hlLCAic2VydmljZXNfcnVubmluZyIsIHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSBjYXRjaCB7fQoKICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJzZXJ2aWNlc19ydW5uaW5nIiwgIiIpOwogICAgcmV0dXJuICIiOwogIH0KCiAgaWYgKCFJU19MSU5VWCkgewogICAgc2V0Q2FjaGVkVmFsdWUoY29udGV4dC5jYWNoZSwgInNlcnZpY2VzX3J1bm5pbmciLCAiIik7CiAgICByZXR1cm4gIiI7CiAgfQoKICB0cnkgewogICAgbGV0IHNlcnZpY2VDb3VudCA9IDA7CgogICAgaWYgKGNvbW1hbmRFeGlzdHMoInN5c3RlbWN0bCIpKSB7CiAgICAgIGNvbnN0IHNlcnZpY2VzID0gZXhlY0NvbW1hbmQoCiAgICAgICAgInN5c3RlbWN0bCBsaXN0LXVuaXRzIC0tdHlwZT1zZXJ2aWNlIC0tc3RhdGU9cnVubmluZyAtLW5vLXBhZ2VyIgogICAgICApOwogICAgICBzZXJ2aWNlQ291bnQgPSBzZXJ2aWNlcwogICAgICAgIC5zcGxpdCgiXG4iKQogICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMoIi5zZXJ2aWNlIikpLmxlbmd0aDsKICAgIH0gZWxzZSBpZiAoY29tbWFuZEV4aXN0cygic2VydmljZSIpKSB7CiAgICAgIGNvbnN0IHNlcnZpY2VzID0gZXhlY0NvbW1hbmQoInNlcnZpY2UgLS1zdGF0dXMtYWxsIik7CiAgICAgIHNlcnZpY2VDb3VudCA9IHNlcnZpY2VzCiAgICAgICAgLnNwbGl0KCJcbiIpCiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygiKyIpKS5sZW5ndGg7CiAgICB9CgogICAgaWYgKHNlcnZpY2VDb3VudCA+IDApIHsKICAgICAgY29uc3QgcmVzdWx0ID0gYCR7c2VydmljZUNvdW50fSBzZXJ2aWNlc2A7CiAgICAgIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJzZXJ2aWNlc19ydW5uaW5nIiwgcmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9IGNhdGNoIHt9CgogIHNldENhY2hlZFZhbHVlKGNvbnRleHQuY2FjaGUsICJzZXJ2aWNlc19ydW5uaW5nIiwgIiIpOwogIHJldHVybiAiIjsKfQo=\"","/**\n * Fuse.js v7.5.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2026 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n//#region src/helpers/typeGuards.ts\nfunction isArray(value) {\n\treturn !Array.isArray ? getTag(value) === \"[object Array]\" : Array.isArray(value);\n}\nfunction baseToString(value) {\n\tif (typeof value == \"string\") return value;\n\tif (typeof value === \"bigint\") return value.toString();\n\tconst result = value + \"\";\n\treturn result == \"0\" && 1 / value == -Infinity ? \"-0\" : result;\n}\nfunction toString(value) {\n\treturn value == null ? \"\" : baseToString(value);\n}\nfunction isString(value) {\n\treturn typeof value === \"string\";\n}\nfunction isNumber(value) {\n\treturn typeof value === \"number\";\n}\nfunction isBoolean(value) {\n\treturn value === true || value === false || isObjectLike(value) && getTag(value) == \"[object Boolean]\";\n}\nfunction isObject(value) {\n\treturn typeof value === \"object\";\n}\nfunction isObjectLike(value) {\n\treturn isObject(value) && value !== null;\n}\nfunction isDefined(value) {\n\treturn value !== void 0 && value !== null;\n}\nfunction isBlank(value) {\n\treturn !value.trim().length;\n}\nfunction getTag(value) {\n\treturn value == null ? value === void 0 ? \"[object Undefined]\" : \"[object Null]\" : Object.prototype.toString.call(value);\n}\n\n//#endregion\n//#region src/core/errorMessages.ts\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\nconst INVALID_DOC_INDEX = \"Invalid doc index: must be a non-negative integer within the bounds of the docs array\";\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => `Invalid value for key ${key}`;\nconst PATTERN_LENGTH_TOO_LARGE = (max) => `Pattern length exceeds max of ${max}.`;\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\nconst INVALID_KEY_WEIGHT_VALUE = (key) => `Property 'weight' in key '${key}' must be a positive integer`;\nconst FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED = \"Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.\";\n\n//#endregion\n//#region src/tools/KeyStore.ts\nconst hasOwn = Object.prototype.hasOwnProperty;\nvar KeyStore = class {\n\tconstructor(keys) {\n\t\tthis._keys = [];\n\t\tthis._keyMap = {};\n\t\tlet totalWeight = 0;\n\t\tkeys.forEach((key) => {\n\t\t\tconst obj = createKey(key);\n\t\t\tthis._keys.push(obj);\n\t\t\tthis._keyMap[obj.id] = obj;\n\t\t\ttotalWeight += obj.weight;\n\t\t});\n\t\tthis._keys.forEach((key) => {\n\t\t\tkey.weight /= totalWeight;\n\t\t});\n\t}\n\tget(keyId) {\n\t\treturn this._keyMap[keyId];\n\t}\n\tkeys() {\n\t\treturn this._keys;\n\t}\n\ttoJSON() {\n\t\treturn JSON.stringify(this._keys);\n\t}\n};\nfunction createKey(key) {\n\tlet path = null;\n\tlet id = null;\n\tlet src = null;\n\tlet weight = 1;\n\tlet getFn = null;\n\tif (isString(key) || isArray(key)) {\n\t\tsrc = key;\n\t\tpath = createKeyPath(key);\n\t\tid = createKeyId(key);\n\t} else {\n\t\tif (!hasOwn.call(key, \"name\")) throw new Error(MISSING_KEY_PROPERTY(\"name\"));\n\t\tconst name = key.name;\n\t\tsrc = name;\n\t\tif (hasOwn.call(key, \"weight\") && key.weight !== void 0) {\n\t\t\tweight = key.weight;\n\t\t\tif (weight <= 0) throw new Error(INVALID_KEY_WEIGHT_VALUE(createKeyId(name)));\n\t\t}\n\t\tpath = createKeyPath(name);\n\t\tid = createKeyId(name);\n\t\tgetFn = key.getFn ?? null;\n\t}\n\treturn {\n\t\tpath,\n\t\tid,\n\t\tweight,\n\t\tsrc,\n\t\tgetFn\n\t};\n}\nfunction createKeyPath(key) {\n\treturn isArray(key) ? key : key.split(\".\");\n}\nfunction createKeyId(key) {\n\treturn isArray(key) ? key.join(\".\") : key;\n}\n\n//#endregion\n//#region src/helpers/get.ts\nfunction get(obj, path) {\n\tconst list = [];\n\tlet arr = false;\n\tconst deepGet = (obj, path, index, arrayIndex) => {\n\t\tif (!isDefined(obj)) return;\n\t\tif (!path[index]) list.push(arrayIndex !== void 0 ? {\n\t\t\tv: obj,\n\t\t\ti: arrayIndex\n\t\t} : obj);\n\t\telse {\n\t\t\tconst value = obj[path[index]];\n\t\t\tif (!isDefined(value)) return;\n\t\t\tif (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value) || typeof value === \"bigint\")) list.push(arrayIndex !== void 0 ? {\n\t\t\t\tv: toString(value),\n\t\t\t\ti: arrayIndex\n\t\t\t} : toString(value));\n\t\t\telse if (isArray(value)) {\n\t\t\t\tarr = true;\n\t\t\t\tfor (let i = 0, len = value.length; i < len; i += 1) deepGet(value[i], path, index + 1, i);\n\t\t\t} else if (path.length) deepGet(value, path, index + 1, arrayIndex);\n\t\t}\n\t};\n\tdeepGet(obj, isString(path) ? path.split(\".\") : path, 0);\n\treturn arr ? list : list[0];\n}\n\n//#endregion\n//#region src/core/config.ts\nconst MatchOptions = {\n\tincludeMatches: false,\n\tfindAllMatches: false,\n\tminMatchCharLength: 1\n};\nconst BasicOptions = {\n\tisCaseSensitive: false,\n\tignoreDiacritics: false,\n\tincludeScore: false,\n\tkeys: [],\n\tshouldSort: true,\n\tsortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1\n};\nconst FuzzyOptions = {\n\tlocation: 0,\n\tthreshold: .6,\n\tdistance: 100\n};\nconst AdvancedOptions = {\n\tuseExtendedSearch: false,\n\tuseTokenSearch: false,\n\ttokenize: void 0,\n\ttokenMatch: \"any\",\n\tgetFn: get,\n\tignoreLocation: false,\n\tignoreFieldNorm: false,\n\tfieldNormWeight: 1\n};\nconst Config = Object.freeze({\n\t...BasicOptions,\n\t...MatchOptions,\n\t...FuzzyOptions,\n\t...AdvancedOptions\n});\n\n//#endregion\n//#region src/tools/fieldNorm.ts\nfunction isWordSeparator(code) {\n\treturn code >= 9 && code <= 13 || code === 32 || code === 160;\n}\nfunction norm(weight = 1, mantissa = 3) {\n\tconst cache = /* @__PURE__ */ new Map();\n\tconst m = Math.pow(10, mantissa);\n\treturn {\n\t\tget(value) {\n\t\t\tlet numTokens = 0;\n\t\t\tlet inWord = false;\n\t\t\tfor (let i = 0; i < value.length; i++) if (!isWordSeparator(value.charCodeAt(i))) {\n\t\t\t\tif (!inWord) {\n\t\t\t\t\tnumTokens++;\n\t\t\t\t\tinWord = true;\n\t\t\t\t}\n\t\t\t} else inWord = false;\n\t\t\tif (numTokens === 0) numTokens = 1;\n\t\t\tif (cache.has(numTokens)) return cache.get(numTokens);\n\t\t\tconst n = Math.round(m / Math.pow(numTokens, .5 * weight)) / m;\n\t\t\tcache.set(numTokens, n);\n\t\t\treturn n;\n\t\t},\n\t\tclear() {\n\t\t\tcache.clear();\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/tools/FuseIndex.ts\nvar FuseIndex = class {\n\tconstructor({ getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\t\tthis.norm = norm(fieldNormWeight, 3);\n\t\tthis.getFn = getFn;\n\t\tthis.isCreated = false;\n\t\tthis.docs = [];\n\t\tthis.keys = [];\n\t\tthis._keysMap = {};\n\t\tthis.setIndexRecords();\n\t}\n\tsetSources(docs = []) {\n\t\tthis.docs = docs;\n\t}\n\tsetIndexRecords(records = []) {\n\t\tthis.records = records;\n\t}\n\tsetKeys(keys = []) {\n\t\tthis.keys = keys;\n\t\tthis._keysMap = {};\n\t\tkeys.forEach((key, idx) => {\n\t\t\tthis._keysMap[key.id] = idx;\n\t\t});\n\t}\n\tcreate() {\n\t\tif (this.isCreated || !this.docs.length) return;\n\t\tthis.isCreated = true;\n\t\tconst len = this.docs.length;\n\t\tthis.records = new Array(len);\n\t\tlet recordCount = 0;\n\t\tif (isString(this.docs[0])) for (let i = 0; i < len; i++) {\n\t\t\tconst record = this._createStringRecord(this.docs[i], i);\n\t\t\tif (record) this.records[recordCount++] = record;\n\t\t}\n\t\telse for (let i = 0; i < len; i++) this.records[recordCount++] = this._createObjectRecord(this.docs[i], i);\n\t\tthis.records.length = recordCount;\n\t\tthis.norm.clear();\n\t}\n\tadd(doc, docIndex) {\n\t\tif (!Number.isInteger(docIndex) || docIndex < 0) throw new Error(INVALID_DOC_INDEX);\n\t\tif (isString(doc)) {\n\t\t\tconst record = this._createStringRecord(doc, docIndex);\n\t\t\tif (record) this.records.push(record);\n\t\t\treturn record;\n\t\t}\n\t\tconst record = this._createObjectRecord(doc, docIndex);\n\t\tthis.records.push(record);\n\t\treturn record;\n\t}\n\tremoveAt(idx) {\n\t\tif (!Number.isInteger(idx) || idx < 0) throw new Error(INVALID_DOC_INDEX);\n\t\tfor (let i = 0, len = this.records.length; i < len; i += 1) if (this.records[i].i === idx) {\n\t\t\tthis.records.splice(i, 1);\n\t\t\tbreak;\n\t\t}\n\t\tfor (let i = 0, len = this.records.length; i < len; i += 1) if (this.records[i].i > idx) this.records[i].i -= 1;\n\t}\n\tremoveAll(indices) {\n\t\tconst toRemove = /* @__PURE__ */ new Set();\n\t\tfor (const v of indices) if (Number.isInteger(v) && v >= 0) toRemove.add(v);\n\t\tif (toRemove.size === 0) return;\n\t\tthis.records = this.records.filter((r) => !toRemove.has(r.i));\n\t\tconst sorted = Array.from(toRemove).sort((a, b) => a - b);\n\t\tfor (const record of this.records) {\n\t\t\tlet lo = 0;\n\t\t\tlet hi = sorted.length;\n\t\t\twhile (lo < hi) {\n\t\t\t\tconst mid = lo + hi >>> 1;\n\t\t\t\tif (sorted[mid] < record.i) lo = mid + 1;\n\t\t\t\telse hi = mid;\n\t\t\t}\n\t\t\trecord.i -= lo;\n\t\t}\n\t}\n\tgetValueForItemAtKeyId(item, keyId) {\n\t\treturn item[this._keysMap[keyId]];\n\t}\n\tsize() {\n\t\treturn this.records.length;\n\t}\n\t_createStringRecord(doc, docIndex) {\n\t\tif (!isDefined(doc) || isBlank(doc)) return null;\n\t\treturn {\n\t\t\tv: doc,\n\t\t\ti: docIndex,\n\t\t\tn: this.norm.get(doc)\n\t\t};\n\t}\n\t_createObjectRecord(doc, docIndex) {\n\t\tconst record = {\n\t\t\ti: docIndex,\n\t\t\t$: {}\n\t\t};\n\t\tfor (let keyIndex = 0, keyLen = this.keys.length; keyIndex < keyLen; keyIndex++) {\n\t\t\tconst key = this.keys[keyIndex];\n\t\t\tconst value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\t\t\tif (!isDefined(value)) continue;\n\t\t\tif (isArray(value)) {\n\t\t\t\tconst subRecords = [];\n\t\t\t\tfor (let i = 0, len = value.length; i < len; i += 1) {\n\t\t\t\t\tconst item = value[i];\n\t\t\t\t\tif (!isDefined(item)) continue;\n\t\t\t\t\tif (isString(item)) {\n\t\t\t\t\t\tif (!isBlank(item)) {\n\t\t\t\t\t\t\tconst subRecord = {\n\t\t\t\t\t\t\t\tv: item,\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\tn: this.norm.get(item)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsubRecords.push(subRecord);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (isDefined(item.v)) {\n\t\t\t\t\t\tconst text = isString(item.v) ? item.v : toString(item.v);\n\t\t\t\t\t\tif (!isBlank(text)) {\n\t\t\t\t\t\t\tconst subRecord = {\n\t\t\t\t\t\t\t\tv: text,\n\t\t\t\t\t\t\t\ti: item.i,\n\t\t\t\t\t\t\t\tn: this.norm.get(text)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsubRecords.push(subRecord);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trecord.$[keyIndex] = subRecords;\n\t\t\t} else if (isString(value) && !isBlank(value)) {\n\t\t\t\tconst subRecord = {\n\t\t\t\t\tv: value,\n\t\t\t\t\tn: this.norm.get(value)\n\t\t\t\t};\n\t\t\t\trecord.$[keyIndex] = subRecord;\n\t\t\t}\n\t\t}\n\t\treturn record;\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\tkeys: this.keys.map(({ getFn, ...key }) => key),\n\t\t\trecords: this.records\n\t\t};\n\t}\n};\nfunction createIndex(keys, docs, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\tconst myIndex = new FuseIndex({\n\t\tgetFn,\n\t\tfieldNormWeight\n\t});\n\tmyIndex.setKeys(keys.map(createKey));\n\tmyIndex.setSources(docs);\n\tmyIndex.create();\n\treturn myIndex;\n}\nfunction parseIndex(data, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {\n\tconst { keys, records } = data;\n\tconst myIndex = new FuseIndex({\n\t\tgetFn,\n\t\tfieldNormWeight\n\t});\n\tmyIndex.setKeys(keys);\n\tmyIndex.setIndexRecords(records);\n\treturn myIndex;\n}\n\n//#endregion\n//#region src/search/bitap/convertMaskToIndices.ts\nfunction convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) {\n\tconst indices = [];\n\tlet start = -1;\n\tlet end = -1;\n\tlet i = 0;\n\tfor (let len = matchmask.length; i < len; i += 1) {\n\t\tconst match = matchmask[i];\n\t\tif (match && start === -1) start = i;\n\t\telse if (!match && start !== -1) {\n\t\t\tend = i - 1;\n\t\t\tif (end - start + 1 >= minMatchCharLength) indices.push([start, end]);\n\t\t\tstart = -1;\n\t\t}\n\t}\n\tif (matchmask[i - 1] && i - start >= minMatchCharLength) indices.push([start, i - 1]);\n\treturn indices;\n}\n\n//#endregion\n//#region src/search/bitap/search.ts\nfunction search(text, pattern, patternAlphabet, { location = Config.location, distance = Config.distance, threshold = Config.threshold, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, includeMatches = Config.includeMatches, ignoreLocation = Config.ignoreLocation } = {}) {\n\tif (pattern.length > 32) throw new Error(PATTERN_LENGTH_TOO_LARGE(32));\n\tconst patternLen = pattern.length;\n\tconst textLen = text.length;\n\tconst expectedLocation = Math.max(0, Math.min(location, textLen));\n\tlet currentThreshold = threshold;\n\tlet bestLocation = expectedLocation;\n\tconst calcScore = (errors, currentLocation) => {\n\t\tconst accuracy = errors / patternLen;\n\t\tif (ignoreLocation) return accuracy;\n\t\tconst proximity = Math.abs(expectedLocation - currentLocation);\n\t\tif (!distance) return proximity ? 1 : accuracy;\n\t\treturn accuracy + proximity / distance;\n\t};\n\tconst computeMatches = minMatchCharLength > 1 || includeMatches;\n\tconst matchMask = computeMatches ? Array(textLen) : [];\n\tlet index;\n\twhile ((index = text.indexOf(pattern, bestLocation)) > -1) {\n\t\tconst score = calcScore(0, index);\n\t\tcurrentThreshold = Math.min(score, currentThreshold);\n\t\tbestLocation = index + patternLen;\n\t\tif (computeMatches) {\n\t\t\tlet i = 0;\n\t\t\twhile (i < patternLen) {\n\t\t\t\tmatchMask[index + i] = 1;\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t}\n\tbestLocation = -1;\n\tlet lastBitArr = [];\n\tlet finalScore = 1;\n\tlet bestErrors = 0;\n\tlet binMax = patternLen + textLen;\n\tconst mask = 1 << patternLen - 1;\n\tfor (let i = 0; i < patternLen; i += 1) {\n\t\tlet binMin = 0;\n\t\tlet binMid = binMax;\n\t\twhile (binMin < binMid) {\n\t\t\tif (calcScore(i, expectedLocation + binMid) <= currentThreshold) binMin = binMid;\n\t\t\telse binMax = binMid;\n\t\t\tbinMid = Math.floor((binMax - binMin) / 2 + binMin);\n\t\t}\n\t\tbinMax = binMid;\n\t\tlet start = Math.max(1, expectedLocation - binMid + 1);\n\t\tconst finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\t\tconst bitArr = Array(finish + 2);\n\t\tbitArr[finish + 1] = (1 << i) - 1;\n\t\tfor (let j = finish; j >= start; j -= 1) {\n\t\t\tconst currentLocation = j - 1;\n\t\t\tconst charMatch = patternAlphabet[text[currentLocation]];\n\t\t\tbitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;\n\t\t\tif (i) bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];\n\t\t\tif (bitArr[j] & mask) {\n\t\t\t\tfinalScore = calcScore(i, currentLocation);\n\t\t\t\tif (finalScore <= currentThreshold) {\n\t\t\t\t\tcurrentThreshold = finalScore;\n\t\t\t\t\tbestLocation = currentLocation;\n\t\t\t\t\tbestErrors = i;\n\t\t\t\t\tif (bestLocation <= expectedLocation) break;\n\t\t\t\t\tstart = Math.max(1, 2 * expectedLocation - bestLocation);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (calcScore(i + 1, expectedLocation) > currentThreshold) break;\n\t\tlastBitArr = bitArr;\n\t}\n\tif (computeMatches && bestLocation >= 0) {\n\t\tconst matchEnd = Math.min(textLen - 1, bestLocation + patternLen - 1 + bestErrors);\n\t\tfor (let k = bestLocation; k <= matchEnd; k += 1) if (patternAlphabet[text[k]]) matchMask[k] = 1;\n\t}\n\tconst result = {\n\t\tisMatch: bestLocation >= 0,\n\t\tscore: Math.max(.001, finalScore)\n\t};\n\tif (computeMatches) {\n\t\tconst indices = convertMaskToIndices(matchMask, minMatchCharLength);\n\t\tif (!indices.length) result.isMatch = false;\n\t\telse if (includeMatches) result.indices = indices;\n\t}\n\treturn result;\n}\n\n//#endregion\n//#region src/search/bitap/createPatternAlphabet.ts\nfunction createPatternAlphabet(pattern) {\n\tconst mask = {};\n\tfor (let i = 0, len = pattern.length; i < len; i += 1) {\n\t\tconst char = pattern.charAt(i);\n\t\tmask[char] = (mask[char] || 0) | 1 << len - i - 1;\n\t}\n\treturn mask;\n}\n\n//#endregion\n//#region src/helpers/mergeIndices.ts\nfunction mergeIndices(indices) {\n\tif (indices.length <= 1) return indices;\n\tindices.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n\tconst merged = [indices[0]];\n\tfor (let i = 1, len = indices.length; i < len; i += 1) {\n\t\tconst last = merged[merged.length - 1];\n\t\tconst curr = indices[i];\n\t\tif (curr[0] <= last[1] + 1) last[1] = Math.max(last[1], curr[1]);\n\t\telse merged.push(curr);\n\t}\n\treturn merged;\n}\n\n//#endregion\n//#region src/helpers/diacritics.ts\nconst NON_DECOMPOSABLE_MAP = {\n\t\"ł\": \"l\",\n\t\"Ł\": \"L\",\n\t\"đ\": \"d\",\n\t\"Đ\": \"D\",\n\t\"ø\": \"o\",\n\t\"Ø\": \"O\",\n\t\"ħ\": \"h\",\n\t\"Ħ\": \"H\",\n\t\"ŧ\": \"t\",\n\t\"Ŧ\": \"T\",\n\t\"ı\": \"i\",\n\t\"ß\": \"ss\"\n};\nconst NON_DECOMPOSABLE_RE = new RegExp(\"[\" + Object.keys(NON_DECOMPOSABLE_MAP).join(\"\") + \"]\", \"g\");\nconst stripDiacritics = typeof String.prototype.normalize === \"function\" ? (str) => str.normalize(\"NFD\").replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, \"\").replace(NON_DECOMPOSABLE_RE, (ch) => NON_DECOMPOSABLE_MAP[ch]) : (str) => str;\n\n//#endregion\n//#region src/search/bitap/index.ts\nvar BitapSearch = class {\n\tconstructor(pattern, { location = Config.location, threshold = Config.threshold, distance = Config.distance, includeMatches = Config.includeMatches, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, ignoreLocation = Config.ignoreLocation } = {}) {\n\t\tthis.options = {\n\t\t\tlocation,\n\t\t\tthreshold,\n\t\t\tdistance,\n\t\t\tincludeMatches,\n\t\t\tfindAllMatches,\n\t\t\tminMatchCharLength,\n\t\t\tisCaseSensitive,\n\t\t\tignoreDiacritics,\n\t\t\tignoreLocation\n\t\t};\n\t\tpattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\t\tpattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n\t\tthis.pattern = pattern;\n\t\tthis.chunks = [];\n\t\tif (!this.pattern.length) return;\n\t\tconst addChunk = (pattern, startIndex) => {\n\t\t\tthis.chunks.push({\n\t\t\t\tpattern,\n\t\t\t\talphabet: createPatternAlphabet(pattern),\n\t\t\t\tstartIndex\n\t\t\t});\n\t\t};\n\t\tconst len = this.pattern.length;\n\t\tif (len > 32) {\n\t\t\tlet i = 0;\n\t\t\tconst remainder = len % 32;\n\t\t\tconst end = len - remainder;\n\t\t\twhile (i < end) {\n\t\t\t\taddChunk(this.pattern.substr(i, 32), i);\n\t\t\t\ti += 32;\n\t\t\t}\n\t\t\tif (remainder) {\n\t\t\t\tconst startIndex = len - 32;\n\t\t\t\taddChunk(this.pattern.substr(startIndex), startIndex);\n\t\t\t}\n\t\t} else addChunk(this.pattern, 0);\n\t}\n\tsearchIn(text) {\n\t\tconst { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;\n\t\ttext = isCaseSensitive ? text : text.toLowerCase();\n\t\ttext = ignoreDiacritics ? stripDiacritics(text) : text;\n\t\tif (this.pattern === text) {\n\t\t\tif (text.length < this.options.minMatchCharLength) return {\n\t\t\t\tisMatch: false,\n\t\t\t\tscore: 1\n\t\t\t};\n\t\t\tconst result = {\n\t\t\t\tisMatch: true,\n\t\t\t\tscore: 0\n\t\t\t};\n\t\t\tif (includeMatches) result.indices = [[0, text.length - 1]];\n\t\t\treturn result;\n\t\t}\n\t\tconst { location, distance, threshold, findAllMatches, minMatchCharLength, ignoreLocation } = this.options;\n\t\tconst allIndices = [];\n\t\tlet totalScore = 0;\n\t\tlet hasMatches = false;\n\t\tthis.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n\t\t\tconst { isMatch, score, indices } = search(text, pattern, alphabet, {\n\t\t\t\tlocation: location + startIndex,\n\t\t\t\tdistance,\n\t\t\t\tthreshold,\n\t\t\t\tfindAllMatches,\n\t\t\t\tminMatchCharLength,\n\t\t\t\tincludeMatches,\n\t\t\t\tignoreLocation\n\t\t\t});\n\t\t\tif (isMatch) hasMatches = true;\n\t\t\ttotalScore += score;\n\t\t\tif (isMatch && indices) allIndices.push(...indices);\n\t\t});\n\t\tconst result = {\n\t\t\tisMatch: hasMatches,\n\t\t\tscore: hasMatches ? totalScore / this.chunks.length : 1\n\t\t};\n\t\tif (hasMatches && includeMatches) result.indices = mergeIndices(allIndices);\n\t\treturn result;\n\t}\n};\n\n//#endregion\n//#region src/search/extended/matchers.ts\nconst MULTI_MATCH_TYPES = new Set([\"fuzzy\", \"include\"]);\nfunction isInverse(type) {\n\treturn type.startsWith(\"inverse\");\n}\nconst matchers = [\n\t{\n\t\ttype: \"exact\",\n\t\tmultiRegex: /^=\"(.*)\"$/,\n\t\tsingleRegex: /^=(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text === pattern;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, pattern.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"include\",\n\t\tmultiRegex: /^'\"(.*)\"$/,\n\t\tsingleRegex: /^'(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"include\",\n\t\t\tsearch(text) {\n\t\t\t\tlet location = 0;\n\t\t\t\tlet index;\n\t\t\t\tconst indices = [];\n\t\t\t\tconst patternLen = pattern.length;\n\t\t\t\twhile ((index = text.indexOf(pattern, location)) > -1) {\n\t\t\t\t\tlocation = index + patternLen;\n\t\t\t\t\tindices.push([index, location - 1]);\n\t\t\t\t}\n\t\t\t\tconst isMatch = !!indices.length;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"prefix-exact\",\n\t\tmultiRegex: /^\\^\"(.*)\"$/,\n\t\tsingleRegex: /^\\^(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"prefix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.startsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, pattern.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-prefix-exact\",\n\t\tmultiRegex: /^!\\^\"(.*)\"$/,\n\t\tsingleRegex: /^!\\^(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-prefix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = !text.startsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-suffix-exact\",\n\t\tmultiRegex: /^!\"(.*)\"\\$$/,\n\t\tsingleRegex: /^!(.*)\\$$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-suffix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = !text.endsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"suffix-exact\",\n\t\tmultiRegex: /^\"(.*)\"\\$$/,\n\t\tsingleRegex: /^(.*)\\$$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"suffix-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.endsWith(pattern);\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [text.length - pattern.length, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"inverse-exact\",\n\t\tmultiRegex: /^!\"(.*)\"$/,\n\t\tsingleRegex: /^!(.*)$/,\n\t\tcreate: (pattern) => ({\n\t\t\ttype: \"inverse-exact\",\n\t\t\tsearch(text) {\n\t\t\t\tconst isMatch = text.indexOf(pattern) === -1;\n\t\t\t\treturn {\n\t\t\t\t\tisMatch,\n\t\t\t\t\tscore: isMatch ? 0 : 1,\n\t\t\t\t\tindices: [0, text.length - 1]\n\t\t\t\t};\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\ttype: \"fuzzy\",\n\t\tmultiRegex: /^\"(.*)\"$/,\n\t\tsingleRegex: /^(.*)$/,\n\t\tcreate: (pattern, options = {}) => {\n\t\t\tconst bitap = new BitapSearch(pattern, {\n\t\t\t\tlocation: options.location ?? Config.location,\n\t\t\t\tthreshold: options.threshold ?? Config.threshold,\n\t\t\t\tdistance: options.distance ?? Config.distance,\n\t\t\t\tincludeMatches: options.includeMatches ?? Config.includeMatches,\n\t\t\t\tfindAllMatches: options.findAllMatches ?? Config.findAllMatches,\n\t\t\t\tminMatchCharLength: options.minMatchCharLength ?? Config.minMatchCharLength,\n\t\t\t\tisCaseSensitive: options.isCaseSensitive ?? Config.isCaseSensitive,\n\t\t\t\tignoreDiacritics: options.ignoreDiacritics ?? Config.ignoreDiacritics,\n\t\t\t\tignoreLocation: options.ignoreLocation ?? Config.ignoreLocation\n\t\t\t});\n\t\t\treturn {\n\t\t\t\ttype: \"fuzzy\",\n\t\t\t\tsearch(text) {\n\t\t\t\t\treturn bitap.searchIn(text);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n];\n\n//#endregion\n//#region src/search/extended/parseQuery.ts\nconst matchersLen = matchers.length;\nconst ESCAPED_PIPE = \"\\0\";\nconst OR_TOKEN = \"|\";\nfunction tokenize(pattern) {\n\tconst tokens = [];\n\tconst len = pattern.length;\n\tlet i = 0;\n\twhile (i < len) {\n\t\twhile (i < len && pattern[i] === \" \") i++;\n\t\tif (i >= len) break;\n\t\tlet j = i;\n\t\twhile (j < len && pattern[j] !== \" \" && pattern[j] !== \"\\\"\") j++;\n\t\tif (j < len && pattern[j] === \"\\\"\") {\n\t\t\tj++;\n\t\t\twhile (j < len) {\n\t\t\t\tif (pattern[j] === \"\\\"\") {\n\t\t\t\t\tconst next = j + 1;\n\t\t\t\t\tif (next >= len || pattern[next] === \" \") {\n\t\t\t\t\t\tj++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (pattern[next] === \"$\" && (next + 1 >= len || pattern[next + 1] === \" \")) {\n\t\t\t\t\t\tj += 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tj++;\n\t\t\t}\n\t\t\ttokens.push(pattern.substring(i, j));\n\t\t\ti = j;\n\t\t} else {\n\t\t\twhile (j < len && pattern[j] !== \" \") j++;\n\t\t\ttokens.push(pattern.substring(i, j));\n\t\t\ti = j;\n\t\t}\n\t}\n\treturn tokens;\n}\nfunction getMatch(pattern, exp) {\n\tconst matches = pattern.match(exp);\n\treturn matches ? matches[1] : null;\n}\nfunction parseQuery(pattern, options = {}) {\n\treturn pattern.replace(/\\\\\\|/g, ESCAPED_PIPE).split(OR_TOKEN).map((item) => {\n\t\tconst query = tokenize(item.replace(/\\u0000/g, \"|\").trim()).filter((item) => item && !!item.trim());\n\t\tconst results = [];\n\t\tfor (let i = 0, len = query.length; i < len; i += 1) {\n\t\t\tconst queryItem = query[i];\n\t\t\tlet found = false;\n\t\t\tlet idx = -1;\n\t\t\twhile (!found && ++idx < matchersLen) {\n\t\t\t\tconst def = matchers[idx];\n\t\t\t\tconst token = getMatch(queryItem, def.multiRegex);\n\t\t\t\tif (token) {\n\t\t\t\t\tresults.push(def.create(token, options));\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (found) continue;\n\t\t\tidx = -1;\n\t\t\twhile (++idx < matchersLen) {\n\t\t\t\tconst def = matchers[idx];\n\t\t\t\tconst token = getMatch(queryItem, def.singleRegex);\n\t\t\t\tif (token) {\n\t\t\t\t\tresults.push(def.create(token, options));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t});\n}\n\n//#endregion\n//#region src/search/extended/index.ts\nvar ExtendedSearch = class {\n\tconstructor(pattern, { isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, includeMatches = Config.includeMatches, minMatchCharLength = Config.minMatchCharLength, ignoreLocation = Config.ignoreLocation, findAllMatches = Config.findAllMatches, location = Config.location, threshold = Config.threshold, distance = Config.distance } = {}) {\n\t\tthis.query = null;\n\t\tthis.options = {\n\t\t\tisCaseSensitive,\n\t\t\tignoreDiacritics,\n\t\t\tincludeMatches,\n\t\t\tminMatchCharLength,\n\t\t\tfindAllMatches,\n\t\t\tignoreLocation,\n\t\t\tlocation,\n\t\t\tthreshold,\n\t\t\tdistance\n\t\t};\n\t\tpattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\t\tpattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n\t\tthis.pattern = pattern;\n\t\tthis.query = parseQuery(this.pattern, this.options);\n\t}\n\tstatic condition(_, options) {\n\t\treturn options.useExtendedSearch;\n\t}\n\tsearchIn(text) {\n\t\tconst query = this.query;\n\t\tif (!query) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;\n\t\ttext = isCaseSensitive ? text : text.toLowerCase();\n\t\ttext = ignoreDiacritics ? stripDiacritics(text) : text;\n\t\tlet numMatches = 0;\n\t\tconst allIndices = [];\n\t\tlet totalScore = 0;\n\t\tlet hasInverse = false;\n\t\tfor (let i = 0, qLen = query.length; i < qLen; i += 1) {\n\t\t\tconst searchers = query[i];\n\t\t\tallIndices.length = 0;\n\t\t\tnumMatches = 0;\n\t\t\thasInverse = false;\n\t\t\tfor (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n\t\t\t\tconst matcher = searchers[j];\n\t\t\t\tconst { isMatch, indices, score } = matcher.search(text);\n\t\t\t\tif (isMatch) {\n\t\t\t\t\tnumMatches += 1;\n\t\t\t\t\ttotalScore += score;\n\t\t\t\t\tif (isInverse(matcher.type)) hasInverse = true;\n\t\t\t\t\tif (includeMatches) if (MULTI_MATCH_TYPES.has(matcher.type)) allIndices.push(...indices);\n\t\t\t\t\telse allIndices.push(indices);\n\t\t\t\t} else {\n\t\t\t\t\ttotalScore = 0;\n\t\t\t\t\tnumMatches = 0;\n\t\t\t\t\tallIndices.length = 0;\n\t\t\t\t\thasInverse = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (numMatches) {\n\t\t\t\tconst result = {\n\t\t\t\t\tisMatch: true,\n\t\t\t\t\tscore: totalScore / numMatches\n\t\t\t\t};\n\t\t\t\tif (hasInverse) result.hasInverse = true;\n\t\t\t\tif (includeMatches) result.indices = mergeIndices(allIndices);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t}\n};\n\n//#endregion\n//#region src/core/register.ts\nconst registeredSearchers = [];\nfunction register(...args) {\n\tregisteredSearchers.push(...args);\n}\nfunction createSearcher(pattern, options) {\n\tfor (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n\t\tconst searcherClass = registeredSearchers[i];\n\t\tif (searcherClass.condition(pattern, options)) return new searcherClass(pattern, options);\n\t}\n\treturn new BitapSearch(pattern, options);\n}\n\n//#endregion\n//#region src/core/queryParser.ts\nconst LogicalOperator = {\n\tAND: \"$and\",\n\tOR: \"$or\"\n};\nconst KeyType = {\n\tPATH: \"$path\",\n\tPATTERN: \"$val\"\n};\nconst isExpression = (query) => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\nconst isPath = (query) => !!query[KeyType.PATH];\nconst isLeaf = (query) => !isArray(query) && isObject(query) && !isExpression(query);\nconst convertToExplicit = (query) => ({ [LogicalOperator.AND]: Object.keys(query).map((key) => ({ [key]: query[key] })) });\nfunction parse(query, options, { auto = true } = {}) {\n\tconst next = (query) => {\n\t\tif (isString(query)) {\n\t\t\tconst obj = {\n\t\t\t\tkeyId: null,\n\t\t\t\tpattern: query\n\t\t\t};\n\t\t\tif (auto) obj.searcher = createSearcher(query, options);\n\t\t\treturn obj;\n\t\t}\n\t\tconst keys = Object.keys(query);\n\t\tconst isQueryPath = isPath(query);\n\t\tif (!isQueryPath && keys.length > 1 && !isExpression(query)) return next(convertToExplicit(query));\n\t\tif (isLeaf(query)) {\n\t\t\tconst key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\t\t\tconst pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\t\t\tif (!isString(pattern)) throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key));\n\t\t\tconst obj = {\n\t\t\t\tkeyId: createKeyId(key),\n\t\t\t\tpattern\n\t\t\t};\n\t\t\tif (auto) obj.searcher = createSearcher(pattern, options);\n\t\t\treturn obj;\n\t\t}\n\t\tconst node = {\n\t\t\tchildren: [],\n\t\t\toperator: keys[0]\n\t\t};\n\t\tkeys.forEach((key) => {\n\t\t\tconst value = query[key];\n\t\t\tif (isArray(value)) value.forEach((item) => {\n\t\t\t\tnode.children.push(next(item));\n\t\t\t});\n\t\t});\n\t\treturn node;\n\t};\n\tif (!isExpression(query)) query = convertToExplicit(query);\n\treturn next(query);\n}\n\n//#endregion\n//#region src/core/computeScore.ts\nfunction computeScoreSingle(matches, { ignoreFieldNorm = Config.ignoreFieldNorm }) {\n\tlet totalScore = 1;\n\tmatches.forEach(({ key, norm, score }) => {\n\t\tconst weight = key ? key.weight : null;\n\t\ttotalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm));\n\t});\n\treturn totalScore;\n}\nfunction computeScore(results, { ignoreFieldNorm = Config.ignoreFieldNorm }) {\n\tresults.forEach((result) => {\n\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t});\n}\n\n//#endregion\n//#region src/tools/MaxHeap.ts\nvar MaxHeap = class {\n\tconstructor(limit, comparator) {\n\t\tthis.limit = limit;\n\t\tthis.heap = [];\n\t\tthis.comparator = comparator;\n\t}\n\tget size() {\n\t\treturn this.heap.length;\n\t}\n\tinsert(item) {\n\t\tif (this.size < this.limit) {\n\t\t\tthis.heap.push(item);\n\t\t\tthis._bubbleUp(this.size - 1);\n\t\t} else if (this.comparator(item, this.heap[0]) < 0) {\n\t\t\tthis.heap[0] = item;\n\t\t\tthis._sinkDown(0);\n\t\t}\n\t}\n\textractSorted() {\n\t\treturn this.heap.sort(this.comparator);\n\t}\n\t_bubbleUp(i) {\n\t\tconst heap = this.heap;\n\t\twhile (i > 0) {\n\t\t\tconst parent = i - 1 >> 1;\n\t\t\tif (this.comparator(heap[i], heap[parent]) <= 0) break;\n\t\t\tconst tmp = heap[i];\n\t\t\theap[i] = heap[parent];\n\t\t\theap[parent] = tmp;\n\t\t\ti = parent;\n\t\t}\n\t}\n\t_sinkDown(i) {\n\t\tconst heap = this.heap;\n\t\tconst len = heap.length;\n\t\tlet largest = i;\n\t\tdo {\n\t\t\ti = largest;\n\t\t\tconst left = 2 * i + 1;\n\t\t\tconst right = 2 * i + 2;\n\t\t\tif (left < len && this.comparator(heap[left], heap[largest]) > 0) largest = left;\n\t\t\tif (right < len && this.comparator(heap[right], heap[largest]) > 0) largest = right;\n\t\t\tif (largest !== i) {\n\t\t\t\tconst tmp = heap[i];\n\t\t\t\theap[i] = heap[largest];\n\t\t\t\theap[largest] = tmp;\n\t\t\t}\n\t\t} while (largest !== i);\n\t}\n};\n\n//#endregion\n//#region src/core/formatMatches.ts\nfunction formatMatches(result) {\n\tconst matches = [];\n\tresult.matches.forEach((match) => {\n\t\tif (!isDefined(match.indices) || !match.indices.length) return;\n\t\tconst obj = {\n\t\t\tindices: match.indices,\n\t\t\tvalue: match.value\n\t\t};\n\t\tif (match.key) obj.key = match.key.id;\n\t\tif (match.idx > -1) obj.refIndex = match.idx;\n\t\tmatches.push(obj);\n\t});\n\treturn matches;\n}\n\n//#endregion\n//#region src/core/format.ts\nfunction format(results, docs, { includeMatches = Config.includeMatches, includeScore = Config.includeScore } = {}) {\n\treturn results.map((result) => {\n\t\tconst { idx } = result;\n\t\tconst data = {\n\t\t\titem: docs[idx],\n\t\t\trefIndex: idx\n\t\t};\n\t\tif (includeMatches) data.matches = formatMatches(result);\n\t\tif (includeScore) data.score = result.score;\n\t\treturn data;\n\t});\n}\n\n//#endregion\n//#region src/search/token/analyzer.ts\nconst DEFAULT_TOKEN = /[\\p{L}\\p{M}\\p{N}_]+/gu;\nconst warned = /* @__PURE__ */ new WeakSet();\nfunction warnNonGlobal(regex) {\n\tif (!warned.has(regex)) {\n\t\twarned.add(regex);\n\t\tconsole.warn(`[Fuse] tokenize regex ${regex} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`);\n\t}\n}\nfunction resolveTokenize(tokenize) {\n\tif (typeof tokenize === \"function\") {\n\t\tlet validated = false;\n\t\treturn (text) => {\n\t\t\tconst result = tokenize(text);\n\t\t\tif (!validated) {\n\t\t\t\tvalidated = true;\n\t\t\t\tif (!Array.isArray(result) || result.some((t) => typeof t !== \"string\")) throw new Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(result) ? \"array containing non-strings\" : typeof result}.`);\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n\tif (tokenize instanceof RegExp) {\n\t\tif (!tokenize.global) warnNonGlobal(tokenize);\n\t\treturn (text) => text.match(tokenize) || [];\n\t}\n\treturn (text) => text.match(DEFAULT_TOKEN) || [];\n}\nfunction createAnalyzer({ isCaseSensitive = false, ignoreDiacritics = false, tokenize } = {}) {\n\tconst tokenizeFn = resolveTokenize(tokenize);\n\treturn { tokenize(text) {\n\t\tif (!isCaseSensitive) text = text.toLowerCase();\n\t\tif (ignoreDiacritics) text = stripDiacritics(text);\n\t\treturn tokenizeFn(text);\n\t} };\n}\n\n//#endregion\n//#region src/search/token/index.ts\nconst MAX_MASK_TERMS = 31;\nvar TokenSearch = class {\n\tstatic condition(_, options) {\n\t\treturn options.useTokenSearch;\n\t}\n\tconstructor(pattern, options) {\n\t\tthis.options = options;\n\t\tthis.analyzer = createAnalyzer({\n\t\t\tisCaseSensitive: options.isCaseSensitive,\n\t\t\tignoreDiacritics: options.ignoreDiacritics,\n\t\t\ttokenize: options.tokenize\n\t\t});\n\t\tconst queryTerms = this.analyzer.tokenize(pattern);\n\t\tconst { df, fieldCount } = options._invertedIndex;\n\t\tthis.termSearchers = [];\n\t\tthis.idfWeights = [];\n\t\tfor (const term of queryTerms) {\n\t\t\tthis.termSearchers.push(new BitapSearch(term, {\n\t\t\t\tlocation: options.location,\n\t\t\t\tthreshold: options.threshold,\n\t\t\t\tdistance: options.distance,\n\t\t\t\tincludeMatches: options.includeMatches,\n\t\t\t\tfindAllMatches: options.findAllMatches,\n\t\t\t\tminMatchCharLength: options.minMatchCharLength,\n\t\t\t\tisCaseSensitive: options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: options.ignoreDiacritics,\n\t\t\t\tignoreLocation: true\n\t\t\t}));\n\t\t\tconst docFreq = df.get(term) || 0;\n\t\t\tconst idf = Math.log(1 + (fieldCount - docFreq + .5) / (docFreq + .5));\n\t\t\tthis.idfWeights.push(idf);\n\t\t}\n\t\tthis.combineAll = options.tokenMatch === \"all\";\n\t\tthis.numTerms = this.termSearchers.length;\n\t\tthis.useMask = this.numTerms <= 31;\n\t}\n\tsearchIn(text) {\n\t\tif (!this.termSearchers.length) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst allIndices = [];\n\t\tlet weightedScore = 0;\n\t\tlet maxPossibleScore = 0;\n\t\tlet matchedCount = 0;\n\t\tlet matchedMask = 0;\n\t\tconst matchedTerms = this.combineAll && !this.useMask ? /* @__PURE__ */ new Set() : null;\n\t\tfor (let i = 0; i < this.termSearchers.length; i++) {\n\t\t\tconst result = this.termSearchers[i].searchIn(text);\n\t\t\tconst idf = this.idfWeights[i];\n\t\t\tmaxPossibleScore += idf;\n\t\t\tif (result.isMatch) {\n\t\t\t\tmatchedCount++;\n\t\t\t\tweightedScore += idf * (1 - result.score);\n\t\t\t\tif (result.indices) allIndices.push(...result.indices);\n\t\t\t\tif (this.combineAll) if (this.useMask) matchedMask |= 1 << i;\n\t\t\t\telse matchedTerms.add(i);\n\t\t\t}\n\t\t}\n\t\tif (matchedCount === 0) return {\n\t\t\tisMatch: false,\n\t\t\tscore: 1\n\t\t};\n\t\tconst normalized = maxPossibleScore > 0 ? 1 - weightedScore / maxPossibleScore : 0;\n\t\tconst searchResult = {\n\t\t\tisMatch: true,\n\t\t\tscore: Math.max(.001, normalized)\n\t\t};\n\t\tif (this.options.includeMatches && allIndices.length) searchResult.indices = mergeIndices(allIndices);\n\t\tif (this.combineAll) {\n\t\t\tif (this.useMask) searchResult.matchedMask = matchedMask;\n\t\t\telse searchResult.matchedTerms = matchedTerms;\n\t\t\tsearchResult.termCount = this.numTerms;\n\t\t}\n\t\treturn searchResult;\n\t}\n};\n\n//#endregion\n//#region src/search/token/InvertedIndex.ts\nfunction addField(index, text, docIdx, analyzer) {\n\tconst tokens = analyzer.tokenize(text);\n\tif (!tokens.length) return;\n\tindex.fieldCount++;\n\tindex.docFieldCount.set(docIdx, (index.docFieldCount.get(docIdx) || 0) + 1);\n\tconst distinctTerms = new Set(tokens);\n\tlet perDocTerms = index.docTermFieldHits.get(docIdx);\n\tif (!perDocTerms) {\n\t\tperDocTerms = /* @__PURE__ */ new Map();\n\t\tindex.docTermFieldHits.set(docIdx, perDocTerms);\n\t}\n\tfor (const term of distinctTerms) {\n\t\tperDocTerms.set(term, (perDocTerms.get(term) || 0) + 1);\n\t\tindex.df.set(term, (index.df.get(term) || 0) + 1);\n\t}\n}\nfunction ingestRecord(index, record, keyCount, analyzer) {\n\tconst { i: docIdx, v, $: fields } = record;\n\tif (v !== void 0) {\n\t\taddField(index, v, docIdx, analyzer);\n\t\treturn;\n\t}\n\tif (!fields) return;\n\tfor (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n\t\tconst value = fields[keyIdx];\n\t\tif (!value) continue;\n\t\tif (Array.isArray(value)) for (const sub of value) addField(index, sub.v, docIdx, analyzer);\n\t\telse addField(index, value.v, docIdx, analyzer);\n\t}\n}\nfunction buildInvertedIndex(records, keyCount, analyzer) {\n\tconst index = {\n\t\tfieldCount: 0,\n\t\tdf: /* @__PURE__ */ new Map(),\n\t\tdocFieldCount: /* @__PURE__ */ new Map(),\n\t\tdocTermFieldHits: /* @__PURE__ */ new Map()\n\t};\n\tfor (const record of records) ingestRecord(index, record, keyCount, analyzer);\n\treturn index;\n}\nfunction addToInvertedIndex(index, record, keyCount, analyzer) {\n\tingestRecord(index, record, keyCount, analyzer);\n}\nfunction removeFromInvertedIndex(index, docIdx) {\n\tconst fieldCount = index.docFieldCount.get(docIdx);\n\tif (fieldCount === void 0) return;\n\tindex.fieldCount -= fieldCount;\n\tindex.docFieldCount.delete(docIdx);\n\tconst perDocTerms = index.docTermFieldHits.get(docIdx);\n\tif (!perDocTerms) return;\n\tfor (const [term, hits] of perDocTerms) {\n\t\tconst next = (index.df.get(term) || 0) - hits;\n\t\tif (next <= 0) index.df.delete(term);\n\t\telse index.df.set(term, next);\n\t}\n\tindex.docTermFieldHits.delete(docIdx);\n}\nfunction removeAndShiftInvertedIndex(index, removedIndices) {\n\tif (removedIndices.length === 0) return;\n\tconst sorted = Array.from(new Set(removedIndices)).sort((a, b) => a - b);\n\tfor (const idx of sorted) removeFromInvertedIndex(index, idx);\n\tconst shift = (oldIdx) => {\n\t\tlet lo = 0;\n\t\tlet hi = sorted.length;\n\t\twhile (lo < hi) {\n\t\t\tconst mid = lo + hi >>> 1;\n\t\t\tif (sorted[mid] < oldIdx) lo = mid + 1;\n\t\t\telse hi = mid;\n\t\t}\n\t\treturn oldIdx - lo;\n\t};\n\tconst firstRemoved = sorted[0];\n\tconst shiftedDocFieldCount = /* @__PURE__ */ new Map();\n\tfor (const [oldKey, count] of index.docFieldCount) shiftedDocFieldCount.set(oldKey > firstRemoved ? shift(oldKey) : oldKey, count);\n\tindex.docFieldCount = shiftedDocFieldCount;\n\tconst shiftedDocTermFieldHits = /* @__PURE__ */ new Map();\n\tfor (const [oldKey, terms] of index.docTermFieldHits) shiftedDocTermFieldHits.set(oldKey > firstRemoved ? shift(oldKey) : oldKey, terms);\n\tindex.docTermFieldHits = shiftedDocTermFieldHits;\n}\n\n//#endregion\n//#region src/core/index.ts\nvar Fuse = class {\n\tconstructor(docs, options, index) {\n\t\tthis.options = {\n\t\t\t...Config,\n\t\t\t...options\n\t\t};\n\t\tif (this.options.useExtendedSearch && false);\n\t\tif (this.options.useTokenSearch && false);\n\t\tthis._keyStore = new KeyStore(this.options.keys);\n\t\tthis._docs = docs;\n\t\tthis._myIndex = null;\n\t\tthis._invertedIndex = null;\n\t\tthis.setCollection(docs, index);\n\t\tthis._lastQuery = null;\n\t\tthis._lastSearcher = null;\n\t}\n\t_getSearcher(query) {\n\t\tif (this._lastQuery === query) return this._lastSearcher;\n\t\tconst searcher = createSearcher(query, this._invertedIndex ? {\n\t\t\t...this.options,\n\t\t\t_invertedIndex: this._invertedIndex\n\t\t} : this.options);\n\t\tthis._lastQuery = query;\n\t\tthis._lastSearcher = searcher;\n\t\treturn searcher;\n\t}\n\tsetCollection(docs, index) {\n\t\tthis._docs = docs;\n\t\tif (index && !(index instanceof FuseIndex)) throw new Error(INCORRECT_INDEX_TYPE);\n\t\tthis._myIndex = index || createIndex(this.options.keys, this._docs, {\n\t\t\tgetFn: this.options.getFn,\n\t\t\tfieldNormWeight: this.options.fieldNormWeight\n\t\t});\n\t\tif (this.options.useTokenSearch) {\n\t\t\tconst analyzer = createAnalyzer({\n\t\t\t\tisCaseSensitive: this.options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: this.options.ignoreDiacritics,\n\t\t\t\ttokenize: this.options.tokenize\n\t\t\t});\n\t\t\tthis._invertedIndex = buildInvertedIndex(this._myIndex.records, this._myIndex.keys.length, analyzer);\n\t\t}\n\t\tthis._invalidateSearcherCache();\n\t}\n\tadd(doc) {\n\t\tif (!isDefined(doc)) return;\n\t\tthis._docs.push(doc);\n\t\tconst record = this._myIndex.add(doc, this._docs.length - 1);\n\t\tif (this._invertedIndex && record) {\n\t\t\tconst analyzer = createAnalyzer({\n\t\t\t\tisCaseSensitive: this.options.isCaseSensitive,\n\t\t\t\tignoreDiacritics: this.options.ignoreDiacritics,\n\t\t\t\ttokenize: this.options.tokenize\n\t\t\t});\n\t\t\taddToInvertedIndex(this._invertedIndex, record, this._myIndex.keys.length, analyzer);\n\t\t}\n\t\tthis._invalidateSearcherCache();\n\t}\n\tremove(predicate = () => false) {\n\t\tconst results = [];\n\t\tconst indicesToRemove = [];\n\t\tfor (let i = 0, len = this._docs.length; i < len; i += 1) if (predicate(this._docs[i], i)) {\n\t\t\tresults.push(this._docs[i]);\n\t\t\tindicesToRemove.push(i);\n\t\t}\n\t\tif (indicesToRemove.length) {\n\t\t\tif (this._invertedIndex) removeAndShiftInvertedIndex(this._invertedIndex, indicesToRemove);\n\t\t\tconst toRemove = new Set(indicesToRemove);\n\t\t\tthis._docs = this._docs.filter((_, i) => !toRemove.has(i));\n\t\t\tthis._myIndex.removeAll(indicesToRemove);\n\t\t\tthis._invalidateSearcherCache();\n\t\t}\n\t\treturn results;\n\t}\n\tremoveAt(idx) {\n\t\tif (!Number.isInteger(idx) || idx < 0 || idx >= this._docs.length) throw new Error(INVALID_DOC_INDEX);\n\t\tif (this._invertedIndex) removeAndShiftInvertedIndex(this._invertedIndex, [idx]);\n\t\tconst doc = this._docs.splice(idx, 1)[0];\n\t\tthis._myIndex.removeAt(idx);\n\t\tthis._invalidateSearcherCache();\n\t\treturn doc;\n\t}\n\t_invalidateSearcherCache() {\n\t\tthis._lastQuery = null;\n\t\tthis._lastSearcher = null;\n\t}\n\tgetIndex() {\n\t\treturn this._myIndex;\n\t}\n\t_normalizedKeys() {\n\t\treturn this._myIndex.keys.map((key) => this._keyStore.get(key.id) || key);\n\t}\n\tsearch(query, options) {\n\t\tconst { limit = -1 } = options || {};\n\t\tconst { includeMatches, includeScore, shouldSort, sortFn, ignoreFieldNorm } = this.options;\n\t\tif (isString(query) && !query.trim()) {\n\t\t\tlet docs = this._docs.map((item, idx) => ({\n\t\t\t\titem,\n\t\t\t\trefIndex: idx\n\t\t\t}));\n\t\t\tif (isNumber(limit) && limit > -1) docs = docs.slice(0, limit);\n\t\t\treturn docs;\n\t\t}\n\t\tconst useHeap = shouldSort && isNumber(limit) && limit > 0 && isString(query);\n\t\tconst comparator = sortFn;\n\t\tconst stable = (a, b) => comparator(a, b) || a.idx - b.idx;\n\t\tlet results;\n\t\tif (useHeap) {\n\t\t\tconst heap = new MaxHeap(limit, stable);\n\t\t\tif (isString(this._docs[0])) this._searchStringList(query, {\n\t\t\t\theap,\n\t\t\t\tignoreFieldNorm\n\t\t\t});\n\t\t\telse this._searchObjectList(query, {\n\t\t\t\theap,\n\t\t\t\tignoreFieldNorm\n\t\t\t});\n\t\t\tresults = heap.extractSorted();\n\t\t} else {\n\t\t\tresults = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query);\n\t\t\tcomputeScore(results, { ignoreFieldNorm });\n\t\t\tif (shouldSort) results.sort(isString(query) ? stable : comparator);\n\t\t\tif (isNumber(limit) && limit > -1) results = results.slice(0, limit);\n\t\t}\n\t\treturn format(results, this._docs, {\n\t\t\tincludeMatches,\n\t\t\tincludeScore\n\t\t});\n\t}\n\t_searchStringList(query, { heap, ignoreFieldNorm } = {}) {\n\t\tconst searcher = this._getSearcher(query);\n\t\tconst requireAllTokens = this.options.useTokenSearch && this.options.tokenMatch === \"all\";\n\t\tconst { records } = this._myIndex;\n\t\tconst results = heap ? null : [];\n\t\trecords.forEach(({ v: text, i: idx, n: norm }) => {\n\t\t\tif (!isDefined(text)) return;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices\n\t\t\t\t};\n\t\t\t\tif (requireAllTokens) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tconst matches = [match];\n\t\t\t\tif (!requireAllTokens || this._coversAllTokens(matches)) {\n\t\t\t\t\tconst result = {\n\t\t\t\t\t\titem: text,\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\tmatches\n\t\t\t\t\t};\n\t\t\t\t\tif (heap) {\n\t\t\t\t\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t\t\t\t\t\theap.insert(result);\n\t\t\t\t\t} else results.push(result);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_searchLogical(query) {\n\t\tconst expression = parse(query, this.options);\n\t\tconst keys = this._normalizedKeys();\n\t\tconst evaluate = (node, item, idx) => {\n\t\t\tif (!(\"children\" in node)) {\n\t\t\t\tconst { keyId, searcher } = node;\n\t\t\t\tlet matches;\n\t\t\t\tif (keyId === null) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tkeys.forEach((key, keyIndex) => {\n\t\t\t\t\t\tmatches.push(...this._findMatches({\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\tvalue: item[keyIndex],\n\t\t\t\t\t\t\tsearcher\n\t\t\t\t\t\t}));\n\t\t\t\t\t});\n\t\t\t\t} else matches = this._findMatches({\n\t\t\t\t\tkey: this._keyStore.get(keyId),\n\t\t\t\t\tvalue: this._myIndex.getValueForItemAtKeyId(item, keyId),\n\t\t\t\t\tsearcher\n\t\t\t\t});\n\t\t\t\tif (matches && matches.length) return [{\n\t\t\t\t\tidx,\n\t\t\t\t\titem,\n\t\t\t\t\tmatches\n\t\t\t\t}];\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst { children, operator } = node;\n\t\t\tconst res = [];\n\t\t\tfor (let i = 0, len = children.length; i < len; i += 1) {\n\t\t\t\tconst child = children[i];\n\t\t\t\tconst result = evaluate(child, item, idx);\n\t\t\t\tif (result.length) res.push(...result);\n\t\t\t\telse if (operator === LogicalOperator.AND) return [];\n\t\t\t}\n\t\t\treturn res;\n\t\t};\n\t\tconst records = this._myIndex.records;\n\t\tconst resultMap = /* @__PURE__ */ new Map();\n\t\tconst results = [];\n\t\trecords.forEach(({ $: item, i: idx }) => {\n\t\t\tif (isDefined(item)) {\n\t\t\t\tconst expResults = evaluate(expression, item, idx);\n\t\t\t\tif (expResults.length) {\n\t\t\t\t\tif (!resultMap.has(idx)) {\n\t\t\t\t\t\tresultMap.set(idx, {\n\t\t\t\t\t\t\tidx,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tmatches: []\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresults.push(resultMap.get(idx));\n\t\t\t\t\t}\n\t\t\t\t\texpResults.forEach(({ matches }) => {\n\t\t\t\t\t\tresultMap.get(idx).matches.push(...matches);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_searchObjectList(query, { heap, ignoreFieldNorm } = {}) {\n\t\tconst searcher = this._getSearcher(query);\n\t\tconst requireAllTokens = this.options.useTokenSearch && this.options.tokenMatch === \"all\";\n\t\tconst { records } = this._myIndex;\n\t\tconst keys = this._normalizedKeys();\n\t\tconst results = heap ? null : [];\n\t\trecords.forEach(({ $: item, i: idx }) => {\n\t\t\tif (!isDefined(item)) return;\n\t\t\tconst matches = [];\n\t\t\tlet anyKeyFailed = false;\n\t\t\tlet hasInverse = false;\n\t\t\tkeys.forEach((key, keyIndex) => {\n\t\t\t\tconst keyMatches = this._findMatches({\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: item[keyIndex],\n\t\t\t\t\tsearcher\n\t\t\t\t});\n\t\t\t\tif (keyMatches.length) {\n\t\t\t\t\tmatches.push(...keyMatches);\n\t\t\t\t\tif (keyMatches[0].hasInverse) hasInverse = true;\n\t\t\t\t} else anyKeyFailed = true;\n\t\t\t});\n\t\t\tif (hasInverse && anyKeyFailed) return;\n\t\t\tif (matches.length && (!requireAllTokens || this._coversAllTokens(matches))) {\n\t\t\t\tconst result = {\n\t\t\t\t\tidx,\n\t\t\t\t\titem,\n\t\t\t\t\tmatches\n\t\t\t\t};\n\t\t\t\tif (heap) {\n\t\t\t\t\tresult.score = computeScoreSingle(result.matches, { ignoreFieldNorm });\n\t\t\t\t\theap.insert(result);\n\t\t\t\t} else results.push(result);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t}\n\t_findMatches({ key, value, searcher }) {\n\t\tif (!isDefined(value)) return [];\n\t\tconst matches = [];\n\t\tif (isArray(value)) value.forEach(({ v: text, i: idx, n: norm }) => {\n\t\t\tif (!isDefined(text)) return;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tidx,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices,\n\t\t\t\t\thasInverse: searchResult.hasInverse\n\t\t\t\t};\n\t\t\t\tif (searchResult.termCount !== void 0) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t});\n\t\telse {\n\t\t\tconst { v: text, n: norm } = value;\n\t\t\tconst searchResult = searcher.searchIn(text);\n\t\t\tif (searchResult.isMatch) {\n\t\t\t\tconst match = {\n\t\t\t\t\tscore: searchResult.score,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue: text,\n\t\t\t\t\tnorm,\n\t\t\t\t\tindices: searchResult.indices,\n\t\t\t\t\thasInverse: searchResult.hasInverse\n\t\t\t\t};\n\t\t\t\tif (searchResult.termCount !== void 0) {\n\t\t\t\t\tmatch.matchedMask = searchResult.matchedMask;\n\t\t\t\t\tmatch.matchedTerms = searchResult.matchedTerms;\n\t\t\t\t\tmatch.termCount = searchResult.termCount;\n\t\t\t\t}\n\t\t\t\tmatches.push(match);\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\t_coversAllTokens(matches) {\n\t\tconst termCount = matches.length ? matches[0].termCount : void 0;\n\t\tif (termCount === void 0) return true;\n\t\tif (termCount <= 31) {\n\t\t\tlet coverage = 0;\n\t\t\tfor (let i = 0; i < matches.length; i++) coverage |= matches[i].matchedMask || 0;\n\t\t\treturn coverage === 2 ** termCount - 1;\n\t\t}\n\t\tconst coverage = /* @__PURE__ */ new Set();\n\t\tfor (let i = 0; i < matches.length; i++) {\n\t\t\tconst terms = matches[i].matchedTerms;\n\t\t\tif (terms) for (const t of terms) coverage.add(t);\n\t\t}\n\t\treturn coverage.size === termCount;\n\t}\n};\n\n//#endregion\n//#region src/entry.ts\nFuse.version = \"7.5.0\";\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\nFuse.match = function(pattern, text, options) {\n\tif (options && options.useTokenSearch) throw new Error(FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED);\n\treturn createSearcher(pattern, {\n\t\t...Config,\n\t\t...options\n\t}).searchIn(text);\n};\nFuse.parseQuery = parse;\nregister(ExtendedSearch);\nregister(TokenSearch);\nFuse.use = function(...plugins) {\n\tplugins.forEach((plugin) => register(plugin));\n};\nvar entry_default = Fuse;\n\n//#endregion\nexport { entry_default as default };","/**\n * Hardware-related system information functions\n * @module info/hardware\n */\n\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_WINDOWS, IS_MAC, IS_LINUX } from \"../utils/platform\";\nimport { execCommand } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\nimport Fuse from \"fuse.js\";\n\n/**\n * Formats a Geekbench score in whole thousands with its rank and the share of\n * the table scoring above it.\n * @param score - Raw Geekbench score\n * @param rank - Rank in the benchmark table (1 = fastest)\n * @param scores - Every score in the benchmark table\n * @returns Score, rank and top percentile\n * @example formatBench(20512, 68, scores) // \"21k #68 Top 7%\"\n */\nexport function formatBench(score: number, rank: number, scores: number[]): string {\n return `${Math.round(score / 1000)}k #${rank} Top ${topPercent(score, scores)}%`;\n}\n\n/**\n * Score-based top percentile with ties: the share of entries scoring strictly\n * higher, rounded up, so every entry with the same score shares one bucket and\n * the fastest scores all read \"Top 1%\".\n * @param score - Raw Geekbench score\n * @param scores - Every score in the benchmark table\n * @returns Whole percentage between 1 and 100\n */\nexport function topPercent(score: number, scores: number[]): number {\n if (!scores.length) return 100;\n const above = scores.filter((s) => s > score).length;\n return Math.min(100, Math.max(1, Math.ceil((above / scores.length) * 100)));\n}\n\n/**\n * Gets CPU model name and specifications\n * Uses platform-specific commands (wmic/lscpu/cpuinfo)\n * Automatically strips \"with Radeon Graphics\" and similar suffixes\n * @param context - Info context with cache\n * @returns CPU model string or empty string\n * @example \"Intel Core i7-12700K\", \"AMD Ryzen 9 5900HX\", \"Apple M2 Pro\"\n */\nexport function cpu(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"cpu\");\n if (cached) return cached;\n\n let cpuName = \"\";\n\n if (IS_WINDOWS) {\n try {\n const wmic = execCommand(\"wmic cpu get name /format:list\");\n const nameMatch = wmic.match(/Name=(.+)/);\n if (nameMatch) {\n cpuName = nameMatch[1].trim();\n }\n } catch {}\n\n if (!cpuName) {\n try {\n const ps = execCommand(\n 'powershell.exe -Command \"Get-WmiObject -Class Win32_Processor | Select-Object -ExpandProperty Name\"'\n );\n if (ps.trim()) {\n cpuName = ps.trim();\n }\n } catch {}\n }\n } else if (IS_LINUX) {\n try {\n const lscpu = execCommand(\"lscpu\");\n const modelMatch = lscpu.match(/Model name:\\s*([^\\n,]+)/);\n if (modelMatch) {\n cpuName = modelMatch[1].trim();\n }\n } catch {}\n\n if (!cpuName) {\n try {\n const cpuInfo = fs.readFileSync(\"/proc/cpuinfo\", \"utf8\");\n const modelMatch = cpuInfo.match(/model name\\s*:\\s*([^\\n]+)/);\n const hardwareMatch = cpuInfo.match(/Hardware\\s*:\\s*([^\\n]+)/);\n\n if (modelMatch) {\n cpuName = modelMatch[1].trim();\n } else if (hardwareMatch) {\n cpuName = hardwareMatch[1].trim();\n }\n } catch {}\n }\n } else {\n const cpus = os.cpus();\n if (cpus.length > 0) {\n cpuName = cpus[0].model.trim().replace(/[\\r\\n]+/g, \" \");\n }\n }\n\n if (!cpuName) {\n setCachedValue(context.cache, \"cpu\", \"\");\n return \"\";\n }\n\n cpuName = cpuName.trim().replace(/with .*/, \"\").trim();\n\n setCachedValue(context.cache, \"cpu\", cpuName);\n return cpuName;\n}\n\n/**\n * Gets graphics card model name\n * Extracts GPU info from lspci (Linux) or WMI (Windows)\n * Filters out basic/generic display adapters\n * @param context - Info context with cache\n * @returns GPU model string or empty string\n * @example \"NVIDIA GeForce RTX 4070\", \"AMD Radeon RX 6800 XT\"\n */\nexport function gpu(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"gpu\");\n if (cached !== null) return cached;\n\n if (IS_WINDOWS) {\n const gpus: string[] = [];\n\n try {\n const wmic = execCommand(\n \"wmic path win32_VideoController get name /format:list\"\n );\n const nameMatches = wmic.matchAll(/Name=(.+)/g);\n for (const match of nameMatches) {\n const name = match[1].trim();\n if (name && !name.includes(\"Microsoft Basic\")) {\n gpus.push(name);\n }\n }\n } catch {}\n\n if (gpus.length === 0) {\n try {\n const ps = execCommand(\n \"powershell.exe -Command \\\"Get-WmiObject -Class Win32_VideoController | Where-Object {$_.Name -notlike '*Microsoft Basic*'} | Select-Object -ExpandProperty Name\\\"\"\n );\n if (ps.trim()) {\n for (const line of ps.trim().split(/\\r?\\n/)) {\n const name = line.trim();\n if (name && !name.includes(\"Microsoft Basic\")) {\n gpus.push(name);\n }\n }\n }\n } catch {}\n }\n\n if (gpus.length > 0) {\n const result = gpus.join(\", \");\n setCachedValue(context.cache, \"gpu\", result);\n return result;\n }\n } else if (IS_MAC) {\n try {\n const profile = execCommand(\"system_profiler SPDisplaysDataType\");\n const gpus = Array.from(profile.matchAll(/Chipset Model:\\s*(.+)/g)).map(\n (match) => match[1].trim()\n );\n\n if (gpus.length > 0) {\n const result = gpus.join(\", \");\n setCachedValue(context.cache, \"gpu\", result);\n return result;\n }\n } catch {}\n } else if (IS_LINUX) {\n try {\n const lspci = execCommand(\"lspci\");\n const gpus: string[] = [];\n const classPattern = /(?:VGA compatible controller|3D controller|Display controller)/i;\n const gpuPattern = /(?:NVIDIA|GeForce|RTX|GTX|Quadro|Tesla|AMD|ATI|Radeon|Navi|Vega|RX|Intel.*(?:Arc|UHD|Iris|HD Graphics))/i;\n\n for (const line of lspci.split(\"\\n\")) {\n if (!classPattern.test(line) || !gpuPattern.test(line)) continue;\n\n let name: string;\n const allBrackets = line.match(/\\[([^\\]]+)\\]/g);\n if (allBrackets && allBrackets.length > 0) {\n const last = allBrackets[allBrackets.length - 1];\n name = last.replace(/^\\[|\\]$/g, \"\");\n } else {\n name = line\n .replace(/^.*(?:VGA compatible controller|3D controller|Display controller):\\s*/i, \"\")\n .replace(/\\s*\\(rev [a-f0-9]+\\)\\s*$/i, \"\")\n .trim();\n }\n\n if (name && !gpus.includes(name)) {\n gpus.push(name);\n }\n }\n\n if (gpus.length > 0) {\n const result = gpus.join(\", \");\n setCachedValue(context.cache, \"gpu\", result);\n return result;\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"gpu\", \"\");\n return \"\";\n}\n\n/**\n * Gets screen resolution\n * Uses xrandr on Linux (X11/Xorg only) or system_profiler on macOS\n * @returns Resolution in WIDTHxHEIGHT format or empty string\n * @example \"1920x1080\", \"2560x1440\", \"3840x2160\"\n */\nexport function screen_resolution(): string {\n if (IS_MAC) {\n try {\n const profile = execCommand(\"system_profiler SPDisplaysDataType\");\n const resolutionMatch = profile.match(/Resolution:\\s*(\\d+) x (\\d+)/);\n if (resolutionMatch) {\n return `${resolutionMatch[1]}x${resolutionMatch[2]}`;\n }\n } catch {}\n return \"\";\n }\n\n if (!IS_LINUX) return \"\";\n\n try {\n if (process.env.DISPLAY) {\n const xrandr = execCommand(\"xrandr\");\n const resolutionMatch = xrandr.match(/(\\d+x\\d+)\\+\\d+\\+\\d+/);\n if (resolutionMatch) {\n return resolutionMatch[1];\n }\n }\n } catch {}\n return \"\";\n}\n\n/**\n * Gets CPU benchmark score and rank from Geekbench 6 data\n * Uses fuzzy matching to find similar CPU models\n * @param context - Info context with cache\n * @returns Benchmark info with score and rank, or empty string\n * @example \"38k #1 Top 1%\", \"21k #68 Top 7%\"\n */\nexport function bench(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"bench\");\n if (cached) return cached;\n\n const cpuName = cpu(context);\n if (!cpuName) {\n setCachedValue(context.cache, \"bench\", \"\");\n return \"\";\n }\n\n try {\n let benchmarkPath: string;\n const benchmarkFile = \"cpu-geekbench.json\";\n\n // Try multiple resolution strategies\n if (fs.existsSync(benchmarkFile)) {\n benchmarkPath = benchmarkFile;\n } else if (fs.existsSync(`src/bench/${benchmarkFile}`)) {\n benchmarkPath = `src/bench/${benchmarkFile}`;\n } else if (fs.existsSync(`./bench/${benchmarkFile}`)) {\n benchmarkPath = `./bench/${benchmarkFile}`;\n } else {\n // Last resort: construct path from import.meta.url\n try {\n const url = new URL(`./${benchmarkFile}`, import.meta.url);\n benchmarkPath = url.pathname;\n if (!fs.existsSync(benchmarkPath)) {\n const distPath = url.pathname.substring(0, url.pathname.lastIndexOf('/'));\n benchmarkPath = distPath + `/${benchmarkFile}`;\n }\n } catch {\n benchmarkPath = benchmarkFile;\n }\n }\n\n const benchmarkData = fs.readFileSync(benchmarkPath, \"utf8\");\n const parsed = JSON.parse(benchmarkData);\n const scores = parsed.scores as [string, number, number][];\n\n const cpuList = scores.map((item) => ({ name: item[0], score: item[1], rank: item[2] }));\n\n const fuse = new Fuse(cpuList, {\n keys: [\"name\"],\n threshold: 0.6,\n minMatchCharLength: 3,\n });\n\n const results = fuse.search(cpuName);\n if (results.length > 0) {\n const match = results[0].item;\n const result = formatBench(match.score, match.rank, scores.map((item) => item[1]));\n setCachedValue(context.cache, \"bench\", result);\n return result;\n }\n } catch (e) {\n // Silently fail\n }\n\n setCachedValue(context.cache, \"bench\", \"\");\n return \"\";\n}\n\n/**\n * Gets detailed CPU benchmark information from Geekbench 6 data\n * Includes score, rank, and architecture type (ARM/Intel/AMD)\n * @param context - Info context with cache\n * @returns Detailed benchmark info with architecture, or empty string\n * @example \"Geekbench 6: 38k (Rank #1, Top 1%) - ARM\", \"Geekbench 6: 21k (Rank #68, Top 7%) - Intel\"\n */\nexport function cpu_bench_info(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"cpu_bench_info\");\n if (cached) return cached;\n\n const cpuName = cpu(context);\n if (!cpuName) {\n setCachedValue(context.cache, \"cpu_bench_info\", \"\");\n return \"\";\n }\n\n try {\n let benchmarkPath: string;\n const benchmarkFile = \"cpu-geekbench.json\";\n\n // Try multiple resolution strategies\n if (fs.existsSync(benchmarkFile)) {\n benchmarkPath = benchmarkFile;\n } else if (fs.existsSync(`src/bench/${benchmarkFile}`)) {\n benchmarkPath = `src/bench/${benchmarkFile}`;\n } else if (fs.existsSync(`./bench/${benchmarkFile}`)) {\n benchmarkPath = `./bench/${benchmarkFile}`;\n } else {\n // Last resort: construct path from import.meta.url\n try {\n const url = new URL(`./${benchmarkFile}`, import.meta.url);\n benchmarkPath = url.pathname;\n if (!fs.existsSync(benchmarkPath)) {\n const distPath = url.pathname.substring(0, url.pathname.lastIndexOf('/'));\n benchmarkPath = distPath + `/${benchmarkFile}`;\n }\n } catch {\n benchmarkPath = benchmarkFile;\n }\n }\n\n const benchmarkData = fs.readFileSync(benchmarkPath, \"utf8\");\n const parsed = JSON.parse(benchmarkData);\n const scores = parsed.scores as [string, number, number][];\n\n const cpuList = scores.map((item) => ({\n name: item[0],\n score: item[1],\n rank: item[2],\n }));\n\n const fuse = new Fuse(cpuList, {\n keys: [\"name\"],\n threshold: 0.6,\n minMatchCharLength: 3,\n });\n\n const results = fuse.search(cpuName);\n if (results.length > 0) {\n const match = results[0].item;\n const score = Math.round(match.score / 1000);\n const rank = match.rank;\n const top = topPercent(match.score, scores.map((item) => item[1]));\n\n // Detect architecture type\n let arch = \"Unknown\";\n if (match.name.includes(\"Apple\") || match.name.includes(\"ARM\")) {\n arch = \"ARM\";\n } else if (match.name.includes(\"Intel\")) {\n arch = \"Intel\";\n } else if (match.name.includes(\"AMD\") || match.name.includes(\"Ryzen\") || match.name.includes(\"EPYC\")) {\n arch = \"AMD\";\n } else if (match.name.includes(\"Qualcomm\")) {\n arch = \"ARM\";\n }\n\n const result = `Geekbench 6: ${score}k (Rank #${rank}, Top ${top}%) - ${arch}`;\n setCachedValue(context.cache, \"cpu_bench_info\", result);\n return result;\n }\n } catch (e) {\n // Silently fail\n }\n\n setCachedValue(context.cache, \"cpu_bench_info\", \"\");\n return \"\";\n}\n\n/**\n * Gets GPU benchmark score and rank from Geekbench 6 data\n * Uses fuzzy matching to find similar GPU models\n * @param context - Info context with cache\n * @returns Benchmark info with score and rank, or empty string\n * @example \"38k #1 Top 1%\", \"21k #68 Top 7%\"\n */\nexport function gpu_bench(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"gpu_bench\");\n if (cached) return cached;\n\n const gpuName = gpu(context);\n if (!gpuName) {\n setCachedValue(context.cache, \"gpu_bench\", \"\");\n return \"\";\n }\n\n try {\n let benchmarkPath: string;\n const benchmarkFile = \"gpu-geekbench.json\";\n\n // Try multiple resolution strategies\n if (fs.existsSync(benchmarkFile)) {\n benchmarkPath = benchmarkFile;\n } else if (fs.existsSync(`src/bench/${benchmarkFile}`)) {\n benchmarkPath = `src/bench/${benchmarkFile}`;\n } else if (fs.existsSync(`./bench/${benchmarkFile}`)) {\n benchmarkPath = `./bench/${benchmarkFile}`;\n } else {\n // Last resort: construct path from import.meta.url\n try {\n const url = new URL(`./${benchmarkFile}`, import.meta.url);\n benchmarkPath = url.pathname;\n if (!fs.existsSync(benchmarkPath)) {\n const distPath = url.pathname.substring(0, url.pathname.lastIndexOf('/'));\n benchmarkPath = distPath + `/${benchmarkFile}`;\n }\n } catch {\n benchmarkPath = benchmarkFile;\n }\n }\n\n const benchmarkData = fs.readFileSync(benchmarkPath, \"utf8\");\n const parsed = JSON.parse(benchmarkData);\n const scores = parsed.scores as [string, number, number][];\n\n const gpuList = scores.map((item) => ({ name: item[0], score: item[1], rank: item[2] }));\n\n const fuse = new Fuse(gpuList, {\n keys: [\"name\"],\n threshold: 0.6,\n minMatchCharLength: 3,\n });\n\n const results = fuse.search(gpuName);\n if (results.length > 0) {\n const match = results[0].item;\n const result = formatBench(match.score, match.rank, scores.map((item) => item[1]));\n setCachedValue(context.cache, \"gpu_bench\", result);\n return result;\n }\n } catch (e) {\n // Silently fail\n }\n\n setCachedValue(context.cache, \"gpu_bench\", \"\");\n return \"\";\n}\n\n/**\n * Gets detailed GPU benchmark information from Geekbench 6 data\n * Includes score, rank, and vendor detection\n * @param context - Info context with cache\n * @returns Detailed benchmark info with vendor, or empty string\n * @example \"Geekbench 6: 38k (Rank #1, Top 1%) - NVIDIA\", \"Geekbench 6: 21k (Rank #68, Top 7%) - AMD\"\n */\nexport function gpu_bench_info(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"gpu_bench_info\");\n if (cached) return cached;\n\n const gpuName = gpu(context);\n if (!gpuName) {\n setCachedValue(context.cache, \"gpu_bench_info\", \"\");\n return \"\";\n }\n\n try {\n let benchmarkPath: string;\n const benchmarkFile = \"gpu-geekbench.json\";\n\n // Try multiple resolution strategies\n if (fs.existsSync(benchmarkFile)) {\n benchmarkPath = benchmarkFile;\n } else if (fs.existsSync(`src/bench/${benchmarkFile}`)) {\n benchmarkPath = `src/bench/${benchmarkFile}`;\n } else if (fs.existsSync(`./bench/${benchmarkFile}`)) {\n benchmarkPath = `./bench/${benchmarkFile}`;\n } else {\n // Last resort: construct path from import.meta.url\n try {\n const url = new URL(`./${benchmarkFile}`, import.meta.url);\n benchmarkPath = url.pathname;\n if (!fs.existsSync(benchmarkPath)) {\n const distPath = url.pathname.substring(0, url.pathname.lastIndexOf('/'));\n benchmarkPath = distPath + `/${benchmarkFile}`;\n }\n } catch {\n benchmarkPath = benchmarkFile;\n }\n }\n\n const benchmarkData = fs.readFileSync(benchmarkPath, \"utf8\");\n const parsed = JSON.parse(benchmarkData);\n const scores = parsed.scores as [string, number, number][];\n\n const gpuList = scores.map((item) => ({\n name: item[0],\n score: item[1],\n rank: item[2],\n }));\n\n const fuse = new Fuse(gpuList, {\n keys: [\"name\"],\n threshold: 0.6,\n minMatchCharLength: 3,\n });\n\n const results = fuse.search(gpuName);\n if (results.length > 0) {\n const match = results[0].item;\n const score = Math.round(match.score / 1000);\n const rank = match.rank;\n const top = topPercent(match.score, scores.map((item) => item[1]));\n\n // Detect vendor from GPU name\n let vendor = \"Unknown\";\n const upperName = match.name.toUpperCase();\n if (upperName.includes(\"NVIDIA\") || upperName.includes(\"GEFORCE\") ||\n upperName.includes(\"RTX\") || upperName.includes(\"GTX\") ||\n upperName.includes(\"QUADRO\") || upperName.includes(\"TESL\") ||\n upperName.includes(\"B200\") || upperName.includes(\"H100\") ||\n upperName.includes(\"A100\") || upperName.includes(\"A40\") ||\n upperName.includes(\"L40\") || upperName.includes(\"L20\")) {\n vendor = \"NVIDIA\";\n } else if (upperName.includes(\"AMD\") || upperName.includes(\"RADEON\") ||\n upperName.includes(\"RX \") || upperName.includes(\"HD\") ||\n upperName.includes(\"EPYC\") || upperName.includes(\"INSTINCT\") ||\n upperName.includes(\"NAVI\") || upperName.includes(\"VEGA\")) {\n vendor = \"AMD\";\n } else if (upperName.includes(\"INTEL\") || upperName.includes(\"ARC\") ||\n upperName.includes(\"UHD\") || upperName.includes(\"IRIS\") ||\n upperName.includes(\"HD GRAPHICS\")) {\n vendor = \"Intel\";\n }\n\n const result = `Geekbench 6: ${score}k (Rank #${rank}, Top ${top}%) - ${vendor}`;\n setCachedValue(context.cache, \"gpu_bench_info\", result);\n return result;\n }\n } catch (e) {\n // Silently fail\n }\n\n setCachedValue(context.cache, \"gpu_bench_info\", \"\");\n return \"\";\n}\n","/**\n * Memory and disk-related system information functions\n * @module info/memory\n */\n\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_LINUX, IS_MAC } from \"../utils/platform\";\nimport { execCommand } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\n\n/**\n * Gets memory usage in gigabytes\n * Reads from /proc/meminfo on Linux, falls back to os.totalmem()\n * @param context - Info context with cache\n * @returns Memory usage as \"used/total GB\"\n * @example \"12/32GB\", \"6/16GB\"\n */\nexport function ram_used(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"ram_used\");\n if (cached) return cached;\n\n if (IS_LINUX) {\n try {\n const meminfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n const totalMatch = meminfo.match(/MemTotal:\\s+(\\d+) kB/);\n const freeMatch = meminfo.match(/MemFree:\\s+(\\d+) kB/);\n\n if (totalMatch && freeMatch) {\n const totalMB = Math.round(parseInt(totalMatch[1]) / 1024);\n const freeMB = Math.round(parseInt(freeMatch[1]) / 1024);\n const usedMB = totalMB - freeMB;\n\n const totalGB = Math.round(totalMB / 1024);\n const usedGB = Math.round(usedMB / 1024);\n\n const result = `${usedGB}/${totalGB}GB`;\n setCachedValue(context.cache, \"ram_used\", result);\n return result;\n }\n } catch {}\n }\n\n const totalMem = os.totalmem();\n const freeMem = os.freemem();\n const usedMem = totalMem - freeMem;\n\n const totalGB = Math.round(totalMem / (1024 * 1024 * 1024));\n const usedGB = Math.round(usedMem / (1024 * 1024 * 1024));\n\n const result = `${usedGB}/${totalGB}GB`;\n setCachedValue(context.cache, \"ram_used\", result);\n return result;\n}\n\n/**\n * Gets available memory in gigabytes\n * Reads MemAvailable from /proc/meminfo (Linux) or derives it from\n * vm_stat's free+inactive pages (macOS)\n * @returns Available memory with \"GB available\" suffix or empty string\n * @example \"12GB available\", \"4GB available\"\n */\nexport function memory_available(): string {\n if (IS_LINUX) {\n try {\n const meminfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n const availableMatch = meminfo.match(/MemAvailable:\\s+(\\d+) kB/);\n if (availableMatch) {\n const availableGB = Math.round(parseInt(availableMatch[1]) / 1024 / 1024);\n return `${availableGB}GB available`;\n }\n } catch {}\n return \"\";\n }\n\n if (IS_MAC) {\n try {\n const vmStat = execCommand(\"vm_stat\");\n const pageSizeMatch = vmStat.match(/page size of (\\d+) bytes/);\n const freeMatch = vmStat.match(/Pages free:\\s+(\\d+)\\./);\n const inactiveMatch = vmStat.match(/Pages inactive:\\s+(\\d+)\\./);\n\n if (pageSizeMatch && freeMatch && inactiveMatch) {\n const pageSize = parseInt(pageSizeMatch[1]);\n const availablePages = parseInt(freeMatch[1]) + parseInt(inactiveMatch[1]);\n const availableGB = Math.round((availablePages * pageSize) / (1024 * 1024 * 1024));\n return `${availableGB}GB available`;\n }\n } catch {}\n return \"\";\n }\n\n return \"\";\n}\n\n/**\n * Gets swap memory usage\n * Calculates swap usage from /proc/meminfo (Linux) or `sysctl vm.swapusage`\n * (macOS)\n * @returns Swap usage as \"percentage (size MB) swap\" or empty string\n * @example \"15% (512MB) swap\", \"0% (0MB) swap\"\n */\nexport function swap_used(): string {\n if (IS_LINUX) {\n try {\n const meminfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n const swapTotalMatch = meminfo.match(/SwapTotal:\\s+(\\d+) kB/);\n const swapFreeMatch = meminfo.match(/SwapFree:\\s+(\\d+) kB/);\n\n if (swapTotalMatch && swapFreeMatch) {\n const swapTotal = parseInt(swapTotalMatch[1]);\n const swapFree = parseInt(swapFreeMatch[1]);\n const swapUsed = swapTotal - swapFree;\n\n if (swapTotal > 0) {\n const swapUsedPercent = Math.round((swapUsed / swapTotal) * 100);\n const swapUsedMB = Math.round(swapUsed / 1024);\n return `${swapUsedPercent}% (${swapUsedMB}MB) swap`;\n }\n }\n } catch {}\n return \"\";\n }\n\n if (IS_MAC) {\n try {\n const swapusage = execCommand(\"sysctl -n vm.swapusage\");\n const match = swapusage.match(\n /total\\s*=\\s*([\\d.]+)M\\s+used\\s*=\\s*([\\d.]+)M\\s+free\\s*=\\s*([\\d.]+)M/\n );\n\n if (match) {\n const swapTotal = parseFloat(match[1]);\n const swapUsedMB = parseFloat(match[2]);\n\n if (swapTotal > 0) {\n const swapUsedPercent = Math.round((swapUsedMB / swapTotal) * 100);\n return `${swapUsedPercent}% (${Math.round(swapUsedMB)}MB) swap`;\n }\n\n return \"0% (0MB) swap\";\n }\n } catch {}\n return \"\";\n }\n\n return \"\";\n}\n\n/**\n * Gets root filesystem disk usage percentage\n * Uses df command on Linux/Android/macOS\n * @param context - Info context with cache\n * @returns Percentage string or empty string\n * @example \"45%\", \"78%\"\n */\nexport function disk_used(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"disk_used\");\n if (cached !== null) return cached;\n\n if (IS_LINUX || IS_MAC) {\n try {\n const df = execCommand(\"df -h\");\n let diskUsage = \"\";\n\n if (df.includes(\"/storage/emulated\")) {\n const match = df.match(/\\s+(\\d+%)\\s+\\/storage\\/emulated/);\n diskUsage = match ? match[1] : \"\";\n } else {\n const lines = df.split(\"\\n\");\n for (const line of lines) {\n if (line.trim().endsWith(\" /\")) {\n const parts = line.trim().split(/\\s+/);\n const percentIndex = parts.findIndex((part) => part.includes(\"%\"));\n if (percentIndex !== -1) {\n diskUsage = parts[percentIndex];\n break;\n }\n }\n }\n\n if (!diskUsage) {\n const rootMatch = df.match(/(\\d+%)\\s+\\/\\s*$/m);\n diskUsage = rootMatch ? rootMatch[1] : \"\";\n }\n }\n\n setCachedValue(context.cache, \"disk_used\", diskUsage);\n return diskUsage;\n } catch {}\n }\n\n setCachedValue(context.cache, \"disk_used\", \"\");\n return \"\";\n}\n\n/**\n * Minimum total size (in KB) for a partition to be considered a real disk\n * rather than a small system/boot partition\n */\nconst MIN_REAL_DISK_KB = 10 * 1024 * 1024; // 10GB\n\n/**\n * Gets disk size (used/total) for each real disk\n * Uses `df -k` on Linux/macOS, filtering out pseudo filesystems, system/boot\n * partitions (e.g. /boot, /System/Volumes/*), and anything under 10GB, since\n * those aren't disks a user would care about. When exactly one real disk is\n * found (the common case) the result omits the mount point; when multiple\n * real disks are found (e.g. a data drive or external volume), each is\n * labeled by its mount point.\n * @param context - Info context with cache\n * @returns Disk size as \"used/total GB\" or \"mount(used/total GB) ...\" or empty string\n * @example \"256/512GB\", \"/(100/500GB) /Volumes/Backup(900/2000GB)\"\n */\nexport function disk_size(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"disk_size\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX && !IS_MAC) {\n setCachedValue(context.cache, \"disk_size\", \"\");\n return \"\";\n }\n\n try {\n const df = execCommand(\"df -k\");\n const lines = df.trim().split(\"\\n\").slice(1);\n const disks: { mount: string; usedGB: number; totalGB: number }[] = [];\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 6) continue;\n\n const filesystem = parts[0];\n const totalKB = parseInt(parts[1]);\n const usedKB = parseInt(parts[2]);\n const mount = parts[parts.length - 1];\n\n if (isNaN(totalKB) || isNaN(usedKB) || totalKB < MIN_REAL_DISK_KB) continue;\n\n if (IS_MAC) {\n // Only the boot disk (\"/\") and externally mounted real disks count.\n // APFS internal system volumes (Data, VM, Preboot, Update, ...) all\n // live under /System/Volumes and aren't separate physical disks.\n if (mount !== \"/\" && !mount.startsWith(\"/Volumes/\")) continue;\n } else {\n if (\n filesystem.startsWith(\"devtmpfs\") ||\n filesystem.startsWith(\"tmpfs\") ||\n filesystem === \"overlay\" ||\n mount.startsWith(\"/boot\") ||\n mount.startsWith(\"/dev\") ||\n mount.startsWith(\"/proc\") ||\n mount.startsWith(\"/sys\") ||\n mount.startsWith(\"/run\")\n ) {\n continue;\n }\n }\n\n disks.push({\n mount,\n usedGB: Math.round(usedKB / (1024 * 1024)),\n totalGB: Math.round(totalKB / (1024 * 1024)),\n });\n }\n\n let result = \"\";\n if (disks.length === 1) {\n result = `${disks[0].usedGB}/${disks[0].totalGB}GB`;\n } else if (disks.length > 1) {\n result = disks\n .map((d) => `${d.mount}(${d.usedGB}/${d.totalGB}GB)`)\n .join(\" \");\n }\n\n setCachedValue(context.cache, \"disk_size\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"disk_size\", \"\");\n return \"\";\n}\n\n/**\n * Gets mounted filesystem information\n * Lists non-system mount points with usage from df (Linux/macOS)\n * On Linux, excludes /, /dev, /proc, /sys and internal /System/Volumes mounts.\n * On macOS, APFS internal volumes (Data, VM, Preboot, Update, ...) all live\n * under /System/Volumes and are not user-relevant, so only /Volumes (external\n * disks, network shares, disk images) are reported.\n * @param context - Info context with cache\n * @returns Space-separated mount points with usage or empty string\n * @example \"/home(45%) /mnt/data(78%)\", \"/Volumes/Backup(78%)\"\n */\nexport function mount_points(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"mount_points\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX && !IS_MAC) {\n setCachedValue(context.cache, \"mount_points\", \"\");\n return \"\";\n }\n\n try {\n const df = execCommand(\"df -h\");\n const lines = df.split(\"\\n\").slice(1);\n const mountPoints: string[] = [];\n\n lines.forEach((line) => {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 2) return;\n\n const mountPoint = parts[parts.length - 1];\n const usage = parts.find((part) => /^\\d+%$/.test(part)) || \"\";\n\n if (!usage) return;\n\n if (IS_MAC) {\n // Skip the \"Macintosh HD\" self-symlink and any other symlink back to /\n if (mountPoint.startsWith(\"/Volumes/\") && mountPoint !== \"/\") {\n mountPoints.push(`${mountPoint}(${usage})`);\n }\n return;\n }\n\n if (\n !mountPoint.startsWith(\"/dev\") &&\n !mountPoint.startsWith(\"/proc\") &&\n !mountPoint.startsWith(\"/sys\") &&\n !mountPoint.startsWith(\"/System/Volumes\") &&\n mountPoint !== \"/\"\n ) {\n mountPoints.push(`${mountPoint}(${usage})`);\n }\n });\n\n const result = mountPoints.slice(0, 3).join(\" \");\n setCachedValue(context.cache, \"mount_points\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"mount_points\", \"\");\n return \"\";\n}\n","/**\n * Process-related system information functions\n * @module info/process\n */\n\nimport os from \"os\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_LINUX, IS_MAC } from \"../utils/platform\";\nimport { execCommand } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\n\n/**\n * Gets the highest CPU-consuming process\n * Uses ps command to find top process by CPU usage (Linux/macOS only)\n * @param context - Info context with cache\n * @returns Process info as \"percentage processname\" or empty string\n * @example \"8% firefox\", \"15% chrome\", \"3% systemd\"\n */\nexport function top_process(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"top_process\");\n if (cached !== null) return cached;\n\n if (IS_LINUX) {\n try {\n const ps = execCommand(\"ps -eo pcpu,comm --sort=-%cpu --no-headers\");\n const lines = ps.split(\"\\n\");\n if (lines.length > 0) {\n const topProcess = lines[0].trim().replace(/\\s+/, \" \").split(\" \");\n const cpu = topProcess[0].replace(/\\.\\d+/, \"\");\n const process = topProcess[1].split(\"/\").pop();\n const result = `${cpu}% ${process}`;\n setCachedValue(context.cache, \"top_process\", result);\n return result;\n }\n } catch {}\n } else if (IS_MAC) {\n try {\n // -c gives the short command name, -r sorts by %CPU descending\n const ps = execCommand(\"ps -Aceo pcpu,comm -r\");\n const lines = ps.split(\"\\n\").filter((line) => line.trim());\n if (lines.length > 1) {\n const topProcess = lines[1].trim().split(/\\s+/);\n const cpuValue = Math.round(parseFloat(topProcess[0]));\n const process = topProcess.slice(1).join(\" \");\n if (!isNaN(cpuValue) && process) {\n const result = `${cpuValue}% ${process}`;\n setCachedValue(context.cache, \"top_process\", result);\n return result;\n }\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"top_process\", \"\");\n return \"\";\n}\n\n/**\n * Gets system uptime since last boot\n * @returns Uptime formatted as \"Xd Yh Zm\"\n * @example \"2d 14h 23m\", \"0d 3h 45m\"\n */\nexport function uptime(): string {\n const uptimeSeconds = os.uptime();\n const days = Math.floor(uptimeSeconds / 86400);\n const hours = Math.floor((uptimeSeconds % 86400) / 3600);\n const minutes = Math.floor((uptimeSeconds % 3600) / 60);\n return `${days}d ${hours}h ${minutes}m`;\n}\n\n/**\n * Gets number of logged in users\n * Uses who command to count active user sessions (Linux/macOS only)\n * @returns User count with \"users\" suffix or empty string\n * @example \"3 users\", \"1 users\"\n */\nexport function users_logged_in(): string {\n if (!IS_LINUX && !IS_MAC) return \"\";\n\n try {\n const who = execCommand(\"who\");\n const users = who.split(\"\\n\").filter((line) => line.trim()).length;\n if (users > 0) {\n return `${users} users`;\n }\n } catch {}\n return \"\";\n}\n","/**\n * Network-related system information functions\n * @module info/network\n */\n\nimport os from \"os\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_LINUX, IS_MAC } from \"../utils/platform\";\nimport { execCommand } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\n\n/**\n * Gets public IP address. The ip, city, domain and isp blocks all read the one\n * shared lookup in `context.ipInfo`, which `getSystemInfo` caches for 10 minutes.\n * @param context - Info context with IP info\n * @returns Public IP address or empty string\n * @example \"203.0.113.42\"\n */\nexport function ip(context: InfoContext): string {\n return context.ipInfo?.ip || \"\";\n}\n\n/**\n * Gets local/private IP address(es)\n * Tries ifconfig and ip commands on Linux, falls back to Node.js API\n * @returns Space-separated local IP addresses (RFC 1918 ranges)\n * @example \"192.168.1.100\" or \"10.0.0.50 192.168.1.100\"\n */\nexport function iplocal(): string {\n if (IS_LINUX) {\n try {\n const ifconfig = execCommand(\"ifconfig 2>/dev/null\");\n const wlanMatch = ifconfig.match(\n /wlan0[\\s\\S]*?inet (\\d+\\.\\d+\\.\\d+\\.\\d+)/\n );\n if (wlanMatch) {\n return wlanMatch[1];\n }\n } catch {}\n\n try {\n const ipAddr = execCommand(\"ip addr show 2>/dev/null\");\n const addresses: string[] = [];\n const matches = ipAddr.matchAll(/inet (\\d+\\.\\d+\\.\\d+\\.\\d+)\\/\\d+/g);\n for (const match of matches) {\n if (!match[1].startsWith(\"127.\")) {\n addresses.push(match[1]);\n }\n }\n if (addresses.length > 0) {\n return addresses.join(\" \");\n }\n } catch {}\n }\n\n const interfaces = os.networkInterfaces();\n const addresses: string[] = [];\n\n for (const name of Object.keys(interfaces)) {\n for (const device of interfaces[name] || []) {\n if (device.family === \"IPv4\" && !device.internal) {\n addresses.push(device.address);\n }\n }\n }\n\n return addresses.join(\" \");\n}\n\n/**\n * Gets geographic city based on public IP\n * @param context - Info context with IP geolocation data\n * @returns City name or empty string\n * @example \"San Francisco\", \"New York\", \"London\"\n */\nexport function city(context: InfoContext): string {\n return context.ipInfo?.city || \"\";\n}\n\n/**\n * Gets reverse DNS hostname with HTTP prefix\n * @param context - Info context with IP info\n * @returns Domain with http:// prefix or empty string\n * @example \"http://example.com\", \"http://host-203-0-113-42.example.net\"\n */\nexport function domain(context: InfoContext): string {\n const hostname = context.ipInfo?.hostname;\n return hostname ? `http://${hostname}` : \"\";\n}\n\n/**\n * Gets Internet Service Provider name\n * Strips AS number prefix from organization string\n * @param context - Info context with IP info\n * @returns ISP name or empty string\n * @example \"Comcast Cable\", \"Verizon Business\", \"Cloudflare Inc\"\n */\nexport function isp(context: InfoContext): string {\n const org = context.ipInfo?.org;\n return org ? org.split(\" \").slice(1).join(\" \") : \"\";\n}\n\n/**\n * Gets active network interface names\n * Lists non-loopback interfaces with IPv4 addresses (Linux/macOS only)\n * @param context - Info context with cache\n * @returns Space-separated interface names or empty string\n * @example \"eth0 wlan0\", \"en0 en1\"\n */\nexport function network_interfaces(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"network_interfaces\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX && !IS_MAC) {\n setCachedValue(context.cache, \"network_interfaces\", \"\");\n return \"\";\n }\n\n try {\n const interfaces = os.networkInterfaces();\n const activeInterfaces: string[] = [];\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (name !== \"lo\") {\n const ipv4Addr = addrs?.find(\n (addr) => addr.family === \"IPv4\" && !addr.internal\n );\n if (ipv4Addr) {\n activeInterfaces.push(name);\n }\n }\n }\n\n const result = activeInterfaces.join(\" \");\n setCachedValue(context.cache, \"network_interfaces\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"network_interfaces\", \"\");\n return \"\";\n}\n/**\n * Gets open TCP ports with service names\n * Uses lsof to find listening TCP ports (Linux/macOS only)\n * @param context - Info context with cache\n * @returns Space-separated port+process pairs or empty string\n * @example \"80http 443http 22ssh\", \"3000node 5432post\"\n */\nexport function ports(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"ports\");\n if (cached !== null) return cached;\n\n if (IS_LINUX || IS_MAC) {\n try {\n const lsof = execCommand(\"lsof -nP -iTCP -sTCP:LISTEN\");\n const lines = lsof.split(\"\\n\").slice(1);\n const ports = new Set<string>();\n\n lines.forEach((line) => {\n const parts = line.split(/\\s+/);\n if (parts.length >= 9) {\n const address = parts[8];\n const portMatch = address.match(/:(\\d+)$/);\n if (portMatch) {\n const port = portMatch[1];\n const process = parts[0].substring(0, 4);\n ports.add(`${port}${process}`);\n }\n }\n });\n\n const result = Array.from(ports).join(\" \");\n setCachedValue(context.cache, \"ports\", result);\n return result;\n } catch {}\n }\n\n setCachedValue(context.cache, \"ports\", \"\");\n return \"\";\n}\n","/**\n * System status and health information functions\n * @module info/system-status\n */\n\nimport fs from \"fs\";\nimport os from \"os\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_LINUX, IS_MAC } from \"../utils/platform\";\nimport { execCommand, commandExists } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\n\n/**\n * Gets system load averages\n * Reads 1, 5, and 15 minute load averages from /proc/loadavg (Linux) or\n * os.loadavg() (macOS)\n * @returns Space-separated load averages (1m 5m 15m) or empty string\n * @example \"0.52 0.58 0.59\", \"2.10 1.95 1.88\"\n */\nexport function load_average(context: InfoContext): string {\n if (IS_MAC) {\n return os\n .loadavg()\n .map((n) => n.toFixed(2))\n .join(\" \");\n }\n\n if (!IS_LINUX) return \"\";\n\n try {\n const loadavg = fs.readFileSync(\"/proc/loadavg\", \"utf8\");\n const loads = loadavg.split(\" \").slice(0, 3);\n return loads.join(\" \");\n } catch {}\n return \"\";\n}\n\n/**\n * Gets battery charge level and charging status\n * Reads from /sys/class/power_supply/BAT0 (Linux laptops only)\n * @param context - Info context with cache\n * @returns Battery percentage with optional + for charging, or empty string\n * @example \"85%\", \"42%+\", \"100%\"\n */\nexport function battery(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"battery\");\n if (cached !== null) return cached;\n\n if (IS_MAC) {\n try {\n const batt = execCommand(\"pmset -g batt\");\n const percentMatch = batt.match(/(\\d+)%/);\n if (percentMatch) {\n const isCharging = /;\\s*(charging|charged);/i.test(batt);\n const result = `${percentMatch[1]}%${isCharging ? \"+\" : \"\"}`;\n setCachedValue(context.cache, \"battery\", result);\n return result;\n }\n } catch {}\n\n setCachedValue(context.cache, \"battery\", \"\");\n return \"\";\n }\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"battery\", \"\");\n return \"\";\n }\n\n try {\n const batteryPath = \"/sys/class/power_supply/BAT0\";\n const capacityPath = `${batteryPath}/capacity`;\n const statusPath = `${batteryPath}/status`;\n\n if (fs.existsSync(capacityPath)) {\n const capacity = fs.readFileSync(capacityPath, \"utf8\").trim();\n const status = fs.existsSync(statusPath)\n ? fs.readFileSync(statusPath, \"utf8\").trim()\n : \"Unknown\";\n\n const batteryPercent = parseInt(capacity);\n const isCharging = status === \"Charging\";\n const result = `${batteryPercent}%${isCharging ? \"+\" : \"\"}`;\n setCachedValue(context.cache, \"battery\", result);\n return result;\n }\n } catch {}\n\n setCachedValue(context.cache, \"battery\", \"\");\n return \"\";\n}\n\n/**\n * Gets system temperature in Celsius\n * Reads from thermal zone or hwmon sensors (Linux), or from the\n * `osx-cpu-temp` CLI (macOS, if installed via `brew install osx-cpu-temp`) -\n * macOS has no unprivileged API for this, so nothing is reported without it\n * @param context - Info context with cache\n * @returns Temperature with °C suffix or empty string\n * @example \"45°C\", \"62°C\"\n */\nexport function temperature(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"temperature\");\n if (cached !== null) return cached;\n\n if (IS_MAC) {\n if (commandExists(\"osx-cpu-temp\")) {\n try {\n const output = execCommand(\"osx-cpu-temp\");\n const match = output.match(/([\\d.]+)\\s*°?C/);\n if (match) {\n const tempC = Math.round(parseFloat(match[1]));\n if (tempC > 0 && tempC < 150) {\n const result = `${tempC}°C`;\n setCachedValue(context.cache, \"temperature\", result);\n return result;\n }\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"temperature\", \"\");\n return \"\";\n }\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"temperature\", \"\");\n return \"\";\n }\n\n try {\n const tempSources = [\n \"/sys/class/thermal/thermal_zone0/temp\",\n \"/sys/class/hwmon/hwmon0/temp1_input\",\n \"/sys/class/hwmon/hwmon1/temp1_input\",\n ];\n\n for (const source of tempSources) {\n if (fs.existsSync(source)) {\n const temp = fs.readFileSync(source, \"utf8\").trim();\n const tempC = Math.round(parseInt(temp) / 1000);\n\n if (tempC > 0 && tempC < 150) {\n const result = `${tempC}°C`;\n setCachedValue(context.cache, \"temperature\", result);\n return result;\n }\n }\n }\n } catch {}\n\n setCachedValue(context.cache, \"temperature\", \"\");\n return \"\";\n}\n\n/**\n * Gets count of running system services\n * Uses systemctl or service command (Linux only)\n * @param context - Info context with cache\n * @returns Service count with \"services\" suffix or empty string\n * @example \"125 services\", \"89 services\"\n */\nexport function services_running(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"services_running\");\n if (cached !== null) return cached;\n\n if (IS_MAC) {\n try {\n const services = execCommand(\"launchctl list\");\n const serviceCount = services\n .split(\"\\n\")\n .filter((line) => line.trim() && !line.startsWith(\"PID\")).length;\n\n if (serviceCount > 0) {\n const result = `${serviceCount} services`;\n setCachedValue(context.cache, \"services_running\", result);\n return result;\n }\n } catch {}\n\n setCachedValue(context.cache, \"services_running\", \"\");\n return \"\";\n }\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"services_running\", \"\");\n return \"\";\n }\n\n try {\n let serviceCount = 0;\n\n if (commandExists(\"systemctl\")) {\n const services = execCommand(\n \"systemctl list-units --type=service --state=running --no-pager\"\n );\n serviceCount = services\n .split(\"\\n\")\n .filter((line) => line.includes(\".service\")).length;\n } else if (commandExists(\"service\")) {\n const services = execCommand(\"service --status-all\");\n serviceCount = services\n .split(\"\\n\")\n .filter((line) => line.includes(\"+\")).length;\n }\n\n if (serviceCount > 0) {\n const result = `${serviceCount} services`;\n setCachedValue(context.cache, \"services_running\", result);\n return result;\n }\n } catch {}\n\n setCachedValue(context.cache, \"services_running\", \"\");\n return \"\";\n}\n","/**\n * Software and package-related system information functions\n * @module info/software\n */\n\nimport os from \"os\";\nimport process from \"process\";\nimport type { InfoContext } from \"../types/internal-types\";\nimport { IS_WINDOWS } from \"../utils/platform\";\nimport { execCommand, commandExists } from \"../utils/command\";\nimport { getCachedValue, setCachedValue } from \"../cache/cache\";\n\n/**\n * Gets the current shell name\n * Uses the user's login shell (macOS/Linux), falls back to ps for the\n * parent process shell\n * @returns Shell name or empty string on Windows\n * @example \"bash\", \"zsh\", \"fish\", \"nu\"\n */\nexport function shell(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"shell\");\n if (cached !== null) return cached;\n\n if (!IS_WINDOWS) {\n try {\n const loginShell = os.userInfo().shell;\n if (loginShell) {\n const shellName = loginShell.split(\"/\").pop() as string;\n setCachedValue(context.cache, \"shell\", shellName);\n return shellName;\n }\n } catch {}\n\n try {\n const ppid = process.ppid;\n const shellName = execCommand(`ps -p ${ppid} -o comm=`).split(\"/\").pop();\n if (shellName) {\n setCachedValue(context.cache, \"shell\", shellName);\n return shellName;\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"shell\", \"\");\n return \"\";\n}\n\n/**\n * Gets available package managers and development tools\n * Checks for package managers (apt, yum, npm, etc.) and editors (nvim, hx)\n * @param context - Info context with cache\n * @returns Space-separated list of available commands\n * @example \"apt npm docker nvim\", \"yay pacman bun hx\"\n */\nexport function packages(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"packages\");\n if (cached !== null) return cached;\n\n const commands = [\n \"apt\",\n \"brew\",\n \"npm\",\n \"uv\",\n \"docker\",\n \"hx\",\n \"nvim\",\n \"bun\",\n \"yay\",\n \"pacman\",\n \"yum\",\n \"dnf\",\n \"zypper\",\n \"emerge\",\n \"apk\",\n \"snap\",\n \"flatpak\",\n ];\n const available = commands.filter((cmd) => commandExists(cmd));\n\n const result = available.join(\" \");\n setCachedValue(context.cache, \"packages\", result);\n return result;\n}\n\n/**\n * Gets versions of common software tools\n * @param context - Info context with cache\n * @returns Formatted string of tool versions\n * @example \"node:20.1.0 git:2.34.1\"\n */\nexport function common_versions(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"common_versions\");\n if (cached !== null) return cached;\n\n const tools = [\n {\n cmd: \"node\",\n args: \"--version\",\n clean: (v: string) => v.replace(/^v/, \"\"),\n },\n {\n cmd: \"git\",\n args: \"--version\",\n clean: (v: string) => v.replace(\"git version \", \"\"),\n },\n {\n cmd: \"docker\",\n args: \"--version\",\n clean: (v: string) => v.replace(/Docker version ([^,]+),.*/, \"$1\"),\n },\n {\n cmd: \"python3\",\n args: \"--version\",\n clean: (v: string) => v.replace(\"Python \", \"\"),\n },\n {\n cmd: \"go\",\n args: \"version\",\n clean: (v: string) => v.replace(\"go version go\", \"\").split(\" \")[0],\n },\n {\n cmd: \"rustc\",\n args: \"--version\",\n clean: (v: string) => v.replace(\"rustc \", \"\").split(\" \")[0],\n },\n ];\n\n const versions: string[] = [];\n\n for (const tool of tools) {\n if (commandExists(tool.cmd)) {\n try {\n const output = execCommand(`${tool.cmd} ${tool.args}`);\n const version = tool.clean(output).trim();\n if (version) {\n versions.push(`${tool.cmd}:${version}`);\n }\n } catch {}\n }\n }\n\n const result = versions.join(\" \");\n setCachedValue(context.cache, \"common_versions\", result);\n return result;\n}\n/**\n * Gets running Docker container names\n * Lists active Docker containers with their names\n * @param context - Info context with cache\n * @returns Space-separated container names or empty string\n * @example \"nginx redis postgres\", \"web-app db-server\"\n */\nexport function containers(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"containers\");\n if (cached !== null) return cached;\n\n if (!commandExists(\"docker\")) {\n setCachedValue(context.cache, \"containers\", \"\");\n return \"\";\n }\n\n try {\n const containerCount = execCommand(\"docker ps -q\")\n .split(\"\\n\")\n .filter((line) => line.trim()).length;\n if (containerCount === 0) {\n setCachedValue(context.cache, \"containers\", \"\");\n return \"\";\n }\n\n const containers = execCommand(\n 'docker ps --format \"{{.Names}}\\t{{.Ports}}\"'\n );\n const lines = containers.split(\"\\n\").filter((line) => line.trim());\n\n const containerInfo: string[] = [];\n\n lines.forEach((line) => {\n const [name, ports] = line.split(\"\\t\");\n if (name) {\n containerInfo.push(name);\n\n if (ports) {\n const portMatches = ports.match(/->(\\d+(-\\d+)?)\\//g);\n if (portMatches) {\n const uniquePorts = [\n ...new Set(\n portMatches.map((p) => p.replace(/^->(\\d+(-\\d+)?)\\/$/, \"$1\"))\n ),\n ];\n containerInfo.push(...uniquePorts);\n }\n }\n }\n });\n\n const result = containerInfo.join(\" \");\n setCachedValue(context.cache, \"containers\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"containers\", \"\");\n return \"\";\n}\n","/**\n * @fileoverview System Information API\n *\n * A comprehensive cross-platform system information collection API.\n * Provides clean JSON data without formatting, suitable for programmatic use.\n *\n * @module system-info-api\n * @author vtempest\n * @license rights.institute/prosper\n */\n\nimport os from \"os\";\nimport fs from \"fs\";\nimport { fetchIPInfo } from \"./utils/network\";\nimport type { IPInfo } from \"./utils/network\";\nimport path from \"path\";\nimport type { SystemInfo, SystemInfoOptions } from \"./systeminfo-types\";\nimport type { Cache } from \"./cache/cache\";\nimport { isCacheValid } from \"./cache/cache\";\nimport { CACHE_FILE } from \"./info/settings\"; // Using CACHE_FILE from settings to ensure consistency\n\n// Import info functions from modules\nimport { user, hostname, os_info, kernel, device } from \"./info/platform\";\nimport { cpu, gpu, screen_resolution, bench, cpu_bench_info, gpu_bench, gpu_bench_info } from \"./info/hardware\";\nimport {\n disk_used,\n disk_size,\n ram_used,\n memory_available,\n swap_used,\n mount_points,\n} from \"./info/memory\";\nimport { top_process, uptime, users_logged_in } from \"./info/process\";\nimport {\n ip,\n iplocal,\n city,\n domain,\n isp,\n network_interfaces,\n ports,\n} from \"./info/network\";\nimport {\n services_running,\n temperature,\n battery,\n load_average,\n} from \"./info/system-status\";\nimport { shell, packages, containers } from \"./info/software\";\n\n/**\n * Cache duration configuration for different system information types\n * Values are in milliseconds\n */\nconst CACHE_DURATION = {\n ip: 10 * 60 * 1000,\n cpu: 24 * 60 * 60 * 1000,\n gpu: 24 * 60 * 60 * 1000,\n bench: 24 * 60 * 60 * 1000,\n cpu_bench_info: 24 * 60 * 60 * 1000,\n gpu_bench: 24 * 60 * 60 * 1000,\n gpu_bench_info: 24 * 60 * 60 * 1000,\n os: 24 * 60 * 60 * 1000,\n device: 24 * 60 * 60 * 1000,\n kernel: 60 * 60 * 1000,\n pacman: 10 * 60 * 1000,\n ports: 5 * 60 * 1000,\n containers: 5 * 60 * 1000,\n top_process: 5 * 1000,\n disk_used: 60 * 1000,\n disk_size: 60 * 1000,\n ram_used: 10 * 1000,\n services_running: 5 * 60 * 1000,\n temperature: 30 * 1000,\n battery: 60 * 1000,\n network_interfaces: 5 * 60 * 1000,\n mount_points: 10 * 60 * 1000,\n};\n\n/**\n * Platform detection constants\n */\nconst IS_WINDOWS = os.platform() === \"win32\";\nconst IS_MAC = os.platform() === \"darwin\";\nconst IS_LINUX = os.platform() === \"linux\";\n\n/**\n * Context object passed to info collection functions\n */\ninterface InfoContext {\n cache: Cache;\n ipInfo?: IPInfo;\n}\n\n/**\n * Loads cache from disk\n */\nfunction loadCache(): Cache {\n try {\n if (fs.existsSync(CACHE_FILE)) {\n return JSON.parse(fs.readFileSync(CACHE_FILE, \"utf8\"));\n }\n } catch (error) {\n // Corrupted cache - return empty object\n }\n return {};\n}\n\n/**\n * Saves cache to disk\n */\nfunction saveCache(cache: Cache): void {\n try {\n const cacheDir = path.dirname(CACHE_FILE);\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch (error) {\n // Silently fail if can't write cache\n }\n}\n\n/**\n * System information collection functions map\n */\nexport const infoFunctions = {\n user,\n hostname,\n ip,\n iplocal,\n city,\n domain,\n isp,\n os: os_info, // Mapped from os_info\n cpu,\n gpu,\n bench,\n cpu_bench_info,\n gpu_bench,\n gpu_bench_info,\n disk_used,\n disk_size,\n ram_used,\n top_process,\n uptime,\n device,\n kernel,\n shell,\n pacman: packages, // Mapped from packages\n ports,\n containers,\n memory_available,\n swap_used,\n load_average,\n users_logged_in,\n network_interfaces,\n mount_points,\n services_running,\n temperature,\n battery,\n screen_resolution,\n};\n\n/** Blocks derived from the public IP lookup. */\nconst IP_BLOCKS = new Set([\"ip\", \"city\", \"domain\", \"isp\"]);\n\n/** Lets pending I/O callbacks (keypresses, HTTP responses) run between blocks. */\nconst yieldToEventLoop = () => new Promise<void>((resolve) => setImmediate(resolve));\n\n/**\n * Returns the cached public IP lookup, or fetches it when the cache entry is\n * older than 10 minutes. A failed fetch keeps the previous value and is still\n * timestamped, so an offline machine is not re-queried on every launch. An\n * aborted fetch leaves the cache untouched.\n */\nasync function getIPInfo(cache: Cache, signal?: AbortSignal): Promise<IPInfo> {\n const entry = cache[\"ipInfo\"];\n if (entry && isCacheValid(entry, \"ipInfo\")) return entry.value || {};\n\n const fresh = await fetchIPInfo(undefined, undefined, signal);\n const value = fresh.ip ? fresh : entry?.value || {};\n if (!signal?.aborted) {\n cache[\"ipInfo\"] = { value, timestamp: Date.now() };\n }\n return value;\n}\n\n/**\n * Get system information as a clean JSON object.\n *\n * `options.keys` limits collection to those blocks (all by default).\n * `options.signal` stops collection early: whatever was gathered before the\n * abort is returned, and the remaining blocks are left out.\n */\nexport async function getSystemInfo(\n options: SystemInfoOptions = {}\n): Promise<SystemInfo> {\n const { keys, signal } = options;\n const cache = loadCache();\n const context: InfoContext = { cache };\n\n const wanted = Object.keys(infoFunctions).filter(\n (key) => !keys || keys.includes(key)\n );\n\n // Start the IP lookup first so it overlaps with the local blocks.\n const ipInfoPromise = wanted.some((key) => IP_BLOCKS.has(key))\n ? getIPInfo(cache, signal)\n : undefined;\n\n const collected: Record<string, unknown> = {};\n const run = async (key: string) => {\n try {\n collected[key] = await infoFunctions[key as keyof typeof infoFunctions](context);\n } catch {\n collected[key] = \"\";\n }\n };\n\n for (const key of wanted) {\n if (IP_BLOCKS.has(key)) continue;\n await yieldToEventLoop();\n if (signal?.aborted) break;\n await run(key);\n }\n\n // On abort the lookup resolves at once with whatever was cached.\n if (ipInfoPromise) {\n context.ipInfo = await ipInfoPromise;\n for (const key of wanted) {\n if (IP_BLOCKS.has(key)) await run(key);\n }\n }\n\n // Keep the infoFunctions key order regardless of collection order.\n const info: Partial<SystemInfo> = {\n timestamp: new Date().toISOString(),\n platform: IS_WINDOWS\n ? \"windows\"\n : IS_MAC\n ? \"macos\"\n : IS_LINUX\n ? \"linux\"\n : \"unknown\",\n };\n for (const key of wanted) {\n if (key in collected) info[key as keyof SystemInfo] = collected[key] as any;\n }\n\n saveCache(cache);\n\n return info as SystemInfo;\n}\n\nexport { loadCache, saveCache };\n"],"names":["path","os","CACHE_DURATION","DEFAULT_IPINFO_TOKEN","DEFAULT_NETWORK_TIMEOUT","getJSON","url","timeout","signal","resolve","settled","req","finish","value","timer","onAbort","https","http","res","data","chunk","fetchFromIPInfo","token","parsed","org","fetchFromIPAPI","fetchIPInfo","ipinfo","ipapi","merged","source","key","isCacheValid","cacheEntry","age","maxAge","getCachedValue","cache","setCachedValue","process$1","SETTINGS_FILE","CACHE_FILE","colors","backgrounds","DEFAULT_SETTINGS","process","loadSettings","fs","settings","saveSettings","configDir","IS_WINDOWS","IS_MAC","IS_LINUX","execCommand","command","options","cmd","execSync","commandExists","user","hostname","os_info","context","cached","platform","release","osName","match","productName","productVersion","osRelease","nameMatch","versionMatch","kernel","device","ps","dmiPath","__vite_glob_3_0","__vite_glob_3_1","__vite_glob_3_2","__vite_glob_3_3","__vite_glob_3_4","__vite_glob_3_5","__vite_glob_3_6","__vite_glob_3_7","__vite_glob_3_8","__vite_glob_3_9","__vite_glob_3_10","__vite_glob_3_11","__vite_glob_3_12","__vite_glob_3_13","__vite_glob_3_14","__vite_glob_3_15","__vite_glob_3_16","__vite_glob_3_17","isArray","getTag","baseToString","result","toString","isString","isNumber","isBoolean","isObjectLike","isObject","isDefined","isBlank","INCORRECT_INDEX_TYPE","INVALID_DOC_INDEX","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","PATTERN_LENGTH_TOO_LARGE","max","MISSING_KEY_PROPERTY","name","INVALID_KEY_WEIGHT_VALUE","FUSE_MATCH_TOKEN_SEARCH_UNSUPPORTED","hasOwn","KeyStore","keys","totalWeight","obj","createKey","keyId","id","src","weight","getFn","createKeyPath","createKeyId","get","list","arr","deepGet","index","arrayIndex","i","len","MatchOptions","BasicOptions","a","b","FuzzyOptions","AdvancedOptions","Config","isWordSeparator","code","norm","mantissa","m","numTokens","inWord","n","FuseIndex","fieldNormWeight","docs","records","idx","recordCount","record","doc","docIndex","indices","toRemove","v","r","sorted","lo","hi","mid","item","keyIndex","keyLen","subRecords","subRecord","text","createIndex","myIndex","parseIndex","convertMaskToIndices","matchmask","minMatchCharLength","start","end","search","pattern","patternAlphabet","location","distance","threshold","findAllMatches","includeMatches","ignoreLocation","patternLen","textLen","expectedLocation","currentThreshold","bestLocation","calcScore","errors","currentLocation","accuracy","proximity","computeMatches","matchMask","score","lastBitArr","finalScore","bestErrors","binMax","mask","binMin","binMid","bitArr","j","charMatch","matchEnd","k","createPatternAlphabet","char","mergeIndices","last","curr","NON_DECOMPOSABLE_MAP","NON_DECOMPOSABLE_RE","stripDiacritics","str","ch","BitapSearch","isCaseSensitive","ignoreDiacritics","addChunk","startIndex","remainder","allIndices","totalScore","hasMatches","alphabet","isMatch","MULTI_MATCH_TYPES","isInverse","type","matchers","bitap","matchersLen","ESCAPED_PIPE","OR_TOKEN","tokenize","tokens","next","getMatch","exp","matches","parseQuery","query","results","queryItem","found","def","ExtendedSearch","_","numMatches","hasInverse","qLen","searchers","pLen","matcher","registeredSearchers","register","args","createSearcher","searcherClass","LogicalOperator","KeyType","isExpression","isPath","isLeaf","convertToExplicit","parse","auto","isQueryPath","node","computeScoreSingle","ignoreFieldNorm","computeScore","MaxHeap","limit","comparator","heap","parent","tmp","largest","left","right","formatMatches","format","includeScore","DEFAULT_TOKEN","warned","warnNonGlobal","regex","resolveTokenize","validated","t","createAnalyzer","tokenizeFn","TokenSearch","queryTerms","df","fieldCount","term","docFreq","idf","weightedScore","maxPossibleScore","matchedCount","matchedMask","matchedTerms","normalized","searchResult","addField","docIdx","analyzer","distinctTerms","perDocTerms","ingestRecord","keyCount","fields","keyIdx","sub","buildInvertedIndex","addToInvertedIndex","removeFromInvertedIndex","hits","removeAndShiftInvertedIndex","removedIndices","shift","oldIdx","firstRemoved","shiftedDocFieldCount","oldKey","count","shiftedDocTermFieldHits","terms","Fuse","searcher","predicate","indicesToRemove","shouldSort","sortFn","useHeap","stable","requireAllTokens","expression","evaluate","children","operator","child","resultMap","expResults","anyKeyFailed","keyMatches","termCount","coverage","plugins","plugin","entry_default","formatBench","rank","scores","topPercent","above","s","cpu","cpuName","modelMatch","cpuInfo","hardwareMatch","cpus","gpu","gpus","nameMatches","line","profile","lspci","classPattern","gpuPattern","allBrackets","screen_resolution","resolutionMatch","bench","benchmarkPath","benchmarkFile","__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","benchmarkData","cpuList","cpu_bench_info","__vite_glob_1_0","__vite_glob_1_1","__vite_glob_1_2","__vite_glob_1_3","__vite_glob_1_4","__vite_glob_1_5","__vite_glob_1_6","__vite_glob_1_7","__vite_glob_1_8","__vite_glob_1_9","__vite_glob_1_10","__vite_glob_1_11","__vite_glob_1_12","__vite_glob_1_13","__vite_glob_1_14","__vite_glob_1_15","__vite_glob_1_16","__vite_glob_1_17","top","arch","gpu_bench","gpuName","__vite_glob_2_0","__vite_glob_2_1","__vite_glob_2_2","__vite_glob_2_3","__vite_glob_2_4","__vite_glob_2_5","__vite_glob_2_6","__vite_glob_2_7","__vite_glob_2_8","__vite_glob_2_9","__vite_glob_2_10","__vite_glob_2_11","__vite_glob_2_12","__vite_glob_2_13","__vite_glob_2_14","__vite_glob_2_15","__vite_glob_2_16","__vite_glob_2_17","gpuList","gpu_bench_info","vendor","upperName","ram_used","meminfo","totalMatch","freeMatch","totalMB","freeMB","usedMB","totalGB","totalMem","freeMem","usedMem","memory_available","availableMatch","vmStat","pageSizeMatch","inactiveMatch","pageSize","availablePages","swap_used","swapTotalMatch","swapFreeMatch","swapTotal","swapFree","swapUsed","swapUsedPercent","swapUsedMB","disk_used","diskUsage","lines","parts","percentIndex","part","rootMatch","MIN_REAL_DISK_KB","disk_size","disks","filesystem","totalKB","usedKB","mount","d","mount_points","mountPoints","mountPoint","usage","top_process","topProcess","cpuValue","uptime","uptimeSeconds","days","hours","minutes","users_logged_in","users","ip","iplocal","wlanMatch","ipAddr","addresses","interfaces","city","domain","isp","network_interfaces","activeInterfaces","addrs","addr","ports","portMatch","port","load_average","battery","batt","percentMatch","isCharging","batteryPath","capacityPath","statusPath","capacity","status","temperature","tempC","tempSources","temp","services_running","serviceCount","shell","loginShell","shellName","ppid","packages","containers","containerInfo","portMatches","uniquePorts","p","loadCache","saveCache","cacheDir","infoFunctions","IP_BLOCKS","yieldToEventLoop","getIPInfo","entry","fresh","getSystemInfo","wanted","ipInfoPromise","collected","run","info"],"mappings":"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","x_google_ignoreList":[26]}