@openclaw/crabline 0.1.17 → 0.1.19

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.
Files changed (33) hide show
  1. package/README.md +8 -0
  2. package/dist/src/openclaw/private-file.js +71 -24
  3. package/dist/src/openclaw/private-file.js.map +1 -1
  4. package/dist/src/platform/process-owned-lock.d.ts +5 -2
  5. package/dist/src/platform/process-owned-lock.js +20 -10
  6. package/dist/src/platform/process-owned-lock.js.map +1 -1
  7. package/dist/src/servers/discord.js +25 -35
  8. package/dist/src/servers/discord.js.map +1 -1
  9. package/dist/src/servers/http.d.ts +3 -0
  10. package/dist/src/servers/http.js +15 -0
  11. package/dist/src/servers/http.js.map +1 -1
  12. package/dist/src/servers/matrix.js +8 -8
  13. package/dist/src/servers/matrix.js.map +1 -1
  14. package/dist/src/servers/mattermost.js +7 -10
  15. package/dist/src/servers/mattermost.js.map +1 -1
  16. package/dist/src/servers/recorder.d.ts +16 -6
  17. package/dist/src/servers/recorder.js +52 -12
  18. package/dist/src/servers/recorder.js.map +1 -1
  19. package/dist/src/servers/signal.js +8 -8
  20. package/dist/src/servers/signal.js.map +1 -1
  21. package/dist/src/servers/slack.js +8 -8
  22. package/dist/src/servers/slack.js.map +1 -1
  23. package/dist/src/servers/telegram.d.ts +2 -2
  24. package/dist/src/servers/telegram.js +8 -8
  25. package/dist/src/servers/telegram.js.map +1 -1
  26. package/dist/src/servers/whatsapp-baileys-websocket.js +4 -3
  27. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  28. package/dist/src/servers/whatsapp.js +13 -18
  29. package/dist/src/servers/whatsapp.js.map +1 -1
  30. package/dist/src/servers/zalo.js +8 -7
  31. package/dist/src/servers/zalo.js.map +1 -1
  32. package/docs/channel-setup.md +14 -1
  33. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"process-owned-lock.js","sourceRoot":"","sources":["../../../src/platform/process-owned-lock.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport fs, { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\nimport { resolveWindowsPowerShellPath } from \"./windows-acl.js\";\n\ntype LockOwner = {\n executionIdentity: string | null;\n machineIdentity: string | null;\n pid: number;\n processIdentity: string | null;\n processNamespace: string | null;\n processStartedAtMs: number;\n token: string;\n version: 1 | 2 | 3 | 4;\n};\n\ntype OwnerStatus = \"active\" | \"dead\" | \"foreign\" | \"superseded\" | \"unknown\";\n\ntype ParsedLockOwner = {\n lockDirectory: string;\n owner: LockOwner;\n publishedAtMs: number;\n};\n\ntype RecoveryClaim = {\n activeIdentity: DirectoryIdentity;\n activePath: string;\n ownerGenerationKey: string;\n supersededPaths: SupersededRecoveryClaim[];\n};\n\ntype DirectoryIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\ntype SupersededRecoveryClaim = {\n identity: DirectoryIdentity & { mtimeMs: bigint };\n ownerFingerprint: string;\n path: string;\n};\n\ntype RetainedRecoveryClaim = {\n claim: RecoveryClaim;\n retainedByToken: string;\n};\n\ntype AbandonedDirectoryIdentity = DirectoryIdentity & {\n ownerGenerationKey: string;\n};\n\nconst retainedCoordinationClaims = new Map<string, RetainedRecoveryClaim>();\nconst abandonedOwnerKeys = new Set<string>();\nconst abandonedDirectoryIdentities = new Map<string, AbandonedDirectoryIdentity>();\n\nconst OWNER_FILE = \"crabline-owner.json\";\nconst ABANDONED_OWNER_PREFIX = \".crabline-abandoned-\";\nconst ABANDONED_OWNER_NAME_PATTERN = /^\\.crabline-abandoned-[0-9a-f]{64}$/u;\nconst MAX_OWNER_BYTES = 4096;\nconst MAX_PROCESS_ID = 2_147_483_647;\nconst IDENTITY_CACHE_MS = 1000;\nconst CURRENT_IDENTITY_ATTEMPTS = 3;\nconst COORDINATION_RELEASE_RETRY_MS = 10;\nconst COORDINATION_RELEASE_WAIT_MS = 5000;\nconst LEGACY_PROCESS_START_TOLERANCE_MS = 2000;\nconst OWNERLESS_LOCK_RECOVERY_MS = 10 * 60 * 1000;\nconst CURRENT_PROCESS_STARTED_AT_MS = Math.trunc(performance.timeOrigin);\nconst CURRENT_EXECUTION_IDENTITY = randomUUID();\nconst DARWIN_PRECISE_IDENTITY_PATTERN = /^darwin:\\d+\\.\\d+:us:\\d+$/u;\nconst DARWIN_COARSE_IDENTITY_PATTERN = /^darwin:\\d+\\.\\d+:s:(\\d+)$/u;\nconst LINUX_PID_NAMESPACE_PATTERN = /^pid:\\[\\d+\\]$/u;\nconst DARWIN_MONTHS = new Map([\n [\"Jan\", 0],\n [\"Feb\", 1],\n [\"Mar\", 2],\n [\"Apr\", 3],\n [\"May\", 4],\n [\"Jun\", 5],\n [\"Jul\", 6],\n [\"Aug\", 7],\n [\"Sep\", 8],\n [\"Oct\", 9],\n [\"Nov\", 10],\n [\"Dec\", 11],\n]);\n\nfunction isValidProcessId(pid: number): boolean {\n return Number.isSafeInteger(pid) && pid > 0 && pid <= MAX_PROCESS_ID;\n}\n\nfunction isProcessAlive(pid: number): boolean {\n if (!isValidProcessId(pid)) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nexport function isDeadLinuxProcessState(value: string): boolean {\n const commandEnd = value.lastIndexOf(\") \");\n if (commandEnd < 0) {\n return false;\n }\n const state = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[0];\n return state === \"Z\" || state === \"X\" || state === \"x\";\n}\n\nfunction isDefunctProcess(pid: number): boolean {\n if (process.platform === \"linux\") {\n try {\n return isDeadLinuxProcessState(readFileSync(`/proc/${pid}/stat`, \"utf8\"));\n } catch {\n return false;\n }\n }\n if (process.platform === \"darwin\") {\n const result = spawnSync(\"/bin/ps\", [\"-o\", \"stat=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env: { ...process.env, LC_ALL: \"C\" },\n timeout: 1000,\n });\n return result.status === 0 && /^Z/u.test(result.stdout.trim());\n }\n return false;\n}\n\nfunction processIdentityFromLinuxStat(value: string, bootId: string): string | null {\n const normalizedBootId = bootId.trim();\n if (!/^[0-9a-f-]{16,64}$/iu.test(normalizedBootId)) {\n return null;\n }\n const commandEnd = value.lastIndexOf(\") \");\n if (commandEnd < 0) {\n return null;\n }\n const startTicks = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[19];\n return startTicks && /^\\d+$/u.test(startTicks) ? `linux:${normalizedBootId}:${startTicks}` : null;\n}\n\nfunction processIdentityFromDarwin(processDetails: string, bootTime: string): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const launchMatch =\n /^Launch Time:\\s*(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3,6}) ([+-])(\\d{2})(\\d{2})$/mu.exec(\n processDetails,\n );\n if (!bootMatch) {\n return null;\n }\n if (launchMatch) {\n const [, year, month, day, hour, minute, second, fraction, sign, offsetHour, offsetMinute] =\n launchMatch as RegExpExecArray &\n [string, string, string, string, string, string, string, string, string, string, string];\n const offsetMs =\n (Number(offsetHour) * 60 + Number(offsetMinute)) * 60_000 * (sign === \"+\" ? 1 : -1);\n const fractionMicros = Number(fraction.padEnd(6, \"0\"));\n const utcMilliseconds =\n Date.UTC(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour),\n Number(minute),\n Number(second),\n Math.floor(fractionMicros / 1000),\n ) - offsetMs;\n if (Number.isSafeInteger(utcMilliseconds) && utcMilliseconds > 0) {\n const startedAtMicros = BigInt(utcMilliseconds) * 1000n + BigInt(fractionMicros % 1000);\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:us:${startedAtMicros}`;\n }\n }\n const normalizedDetails = processDetails.trim().replace(/\\s+/gu, \" \");\n if (normalizedDetails.length === 0 || normalizedDetails.length > 64) {\n return null;\n }\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:${normalizedDetails}`;\n}\n\nfunction coarseProcessIdentityFromDarwin(processDetails: string, bootTime: string): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const startMatch =\n /^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\s+([A-Z][a-z]{2})\\s+(\\d{1,2})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(\\d{4})\\s*$/u.exec(\n processDetails,\n );\n const month = DARWIN_MONTHS.get(startMatch?.[1] ?? \"\");\n if (!bootMatch || !startMatch || month === undefined) {\n return null;\n }\n const startedAtMs = Date.UTC(\n Number(startMatch[6]),\n month,\n Number(startMatch[2]),\n Number(startMatch[3]),\n Number(startMatch[4]),\n Number(startMatch[5]),\n );\n return Number.isSafeInteger(startedAtMs) && startedAtMs > 0\n ? `darwin:${bootMatch[1]}.${bootMatch[2]}:s:${Math.trunc(startedAtMs / 1000)}`\n : null;\n}\n\nfunction readProcessIdentity(pid: number): string | null {\n if (process.platform === \"linux\") {\n try {\n return processIdentityFromLinuxStat(\n readFileSync(`/proc/${pid}/stat`, \"utf8\"),\n readFileSync(\"/proc/sys/kernel/random/boot_id\", \"utf8\"),\n );\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n const options = {\n encoding: \"utf8\" as const,\n env: { ...process.env, LC_ALL: \"C\", TZ: \"UTC\" },\n maxBuffer: 512 * 1024,\n timeout: 1000,\n };\n const bootTime = spawnSync(\"/usr/sbin/sysctl\", [\"-n\", \"kern.boottime\"], options);\n const preciseDetails = spawnSync(\"/usr/bin/vmmap\", [\"-summary\", String(pid)], {\n ...options,\n timeout: 3000,\n });\n const sampleDetails =\n preciseDetails.status === 0\n ? undefined\n : spawnSync(\"/usr/bin/sample\", [String(pid), \"1\", \"1\"], {\n ...options,\n timeout: 3000,\n });\n const nativeDetails =\n preciseDetails.status === 0\n ? preciseDetails\n : sampleDetails?.status === 0\n ? sampleDetails\n : undefined;\n const identity =\n bootTime.status === 0 && nativeDetails\n ? processIdentityFromDarwin(nativeDetails.stdout, bootTime.stdout)\n : null;\n if (identity !== null && DARWIN_PRECISE_IDENTITY_PATTERN.test(identity)) {\n return identity;\n }\n const coarseDetails = spawnSync(\"/bin/ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], options);\n return bootTime.status === 0 && coarseDetails.status === 0\n ? coarseProcessIdentityFromDarwin(coarseDetails.stdout, bootTime.stdout)\n : null;\n }\n if (process.platform !== \"win32\") {\n return null;\n }\n let powershellPath: string;\n try {\n powershellPath = resolveWindowsPowerShellPath(process.env.SystemRoot);\n } catch {\n return null;\n }\n const result = spawnSync(\n powershellPath,\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks.ToString()`,\n ],\n { encoding: \"utf8\", timeout: 1000, windowsHide: true },\n );\n const ticks = result.status === 0 ? result.stdout.trim() : \"\";\n return /^\\d+$/u.test(ticks) ? `windows:${ticks}` : null;\n}\n\nfunction readProcessNamespace(pid: number): string | null {\n if (process.platform !== \"linux\") {\n return null;\n }\n try {\n const namespace = fs.readlinkSync(`/proc/${pid}/ns/pid`);\n return LINUX_PID_NAMESPACE_PATTERN.test(namespace) ? namespace : null;\n } catch {\n return null;\n }\n}\n\nfunction readMachineIdentity(): string | null {\n if (process.platform === \"linux\") {\n try {\n const bootId = readFileSync(\"/proc/sys/kernel/random/boot_id\", \"utf8\").trim();\n return /^[0-9a-f-]{16,64}$/iu.test(bootId) ? `linux:${bootId}` : null;\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n const result = spawnSync(\"/usr/sbin/ioreg\", [\"-rd1\", \"-c\", \"IOPlatformExpertDevice\"], {\n encoding: \"utf8\",\n env: { ...process.env, LC_ALL: \"C\" },\n timeout: 1000,\n });\n const platformUuid = /\"IOPlatformUUID\"\\s*=\\s*\"([^\"]+)\"/u.exec(result.stdout)?.[1];\n return result.status === 0 && platformUuid ? `darwin:${platformUuid.toLowerCase()}` : null;\n }\n if (process.platform !== \"win32\") {\n return null;\n }\n let powershellPath: string;\n try {\n powershellPath = resolveWindowsPowerShellPath(process.env.SystemRoot);\n } catch {\n return null;\n }\n const result = spawnSync(\n powershellPath,\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"(Get-ItemProperty -LiteralPath 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Cryptography' -Name MachineGuid -ErrorAction Stop).MachineGuid\",\n ],\n { encoding: \"utf8\", timeout: 1000, windowsHide: true },\n );\n const machineGuid = result.status === 0 ? result.stdout.trim() : \"\";\n return /^[0-9a-f-]{16,64}$/iu.test(machineGuid) ? `windows:${machineGuid.toLowerCase()}` : null;\n}\n\nlet cachedLinuxClockTicks: number | undefined;\n\nfunction processStartedAtMsFromIdentity(identity: string | null): number | null {\n const darwinStart = /^darwin:\\d+\\.\\d+:us:(\\d+)$/u.exec(identity ?? \"\")?.[1];\n if (darwinStart) {\n return Number(BigInt(darwinStart) / 1000n);\n }\n const coarseDarwinStart = DARWIN_COARSE_IDENTITY_PATTERN.exec(identity ?? \"\")?.[1];\n if (coarseDarwinStart) {\n return Number(coarseDarwinStart) * 1000;\n }\n const windowsStart = /^windows:(\\d+)$/u.exec(identity ?? \"\")?.[1];\n if (windowsStart) {\n const unixEpochTicks = 621_355_968_000_000_000n;\n const ticks = BigInt(windowsStart);\n return ticks >= unixEpochTicks ? Number((ticks - unixEpochTicks) / 10_000n) : null;\n }\n return null;\n}\n\nfunction readLegacyProcessStartedAtMs(pid: number): number | null {\n if (process.platform === \"linux\") {\n try {\n const processStat = readFileSync(`/proc/${pid}/stat`, \"utf8\");\n const commandEnd = processStat.lastIndexOf(\") \");\n const startTicks =\n commandEnd < 0\n ? undefined\n : processStat\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[19];\n const bootTime = /^btime\\s+(\\d+)$/mu.exec(readFileSync(\"/proc/stat\", \"utf8\"))?.[1];\n if (!startTicks || !/^\\d+$/u.test(startTicks) || !bootTime) {\n return null;\n }\n if (cachedLinuxClockTicks === undefined) {\n const result = spawnSync(\"/usr/bin/getconf\", [\"CLK_TCK\"], {\n encoding: \"utf8\",\n timeout: 1000,\n });\n const ticks = result.status === 0 ? Number(result.stdout.trim()) : Number.NaN;\n if (!Number.isSafeInteger(ticks) || ticks <= 0) {\n return null;\n }\n cachedLinuxClockTicks = ticks;\n }\n return Number(bootTime) * 1000 + (Number(startTicks) * 1000) / cachedLinuxClockTicks;\n } catch {\n return null;\n }\n }\n return processStartedAtMsFromIdentity(readProcessIdentity(pid));\n}\n\nfunction legacyProcessStartMatches(expected: number, observed: number): boolean {\n return Math.abs(expected - observed) <= LEGACY_PROCESS_START_TOLERANCE_MS;\n}\n\nfunction isCoarseDarwinIdentity(identity: string): boolean {\n return DARWIN_COARSE_IDENTITY_PATTERN.test(identity);\n}\n\nfunction isExactProcessIdentity(identity: string): boolean {\n return (\n /^linux:[0-9a-f-]{16,64}:\\d+$/iu.test(identity) ||\n DARWIN_PRECISE_IDENTITY_PATTERN.test(identity) ||\n /^windows:\\d+$/u.test(identity)\n );\n}\n\nfunction directoryIdentity(stats: Pick<fs.BigIntStats, \"dev\" | \"ino\">): DirectoryIdentity {\n return { dev: stats.dev, ino: stats.ino };\n}\n\nfunction directoryIdentityMatches(\n expected: DirectoryIdentity | undefined,\n actual: Pick<fs.BigIntStats, \"dev\" | \"ino\">,\n): boolean {\n return expected !== undefined && expected.dev === actual.dev && expected.ino === actual.ino;\n}\n\nfunction lockCleanupError(message: string): NodeJS.ErrnoException {\n return Object.assign(new Error(message), { code: \"ELOCKED\" });\n}\n\nfunction isLockArtifactName(name: string): boolean {\n return name === OWNER_FILE || ABANDONED_OWNER_NAME_PATTERN.test(name);\n}\n\nfunction verifiedLockDirectoryStats(\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n): fs.BigIntStats | undefined {\n let stats: fs.BigIntStats;\n try {\n stats = fs.lstatSync(directoryPath, { bigint: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n if (\n !stats.isDirectory() ||\n stats.isSymbolicLink() ||\n !directoryIdentityMatches(expectedIdentity, stats) ||\n (expectedMtimeMs !== undefined && stats.mtimeMs !== expectedMtimeMs)\n ) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n return stats;\n}\n\nfunction removeVerifiedLockDirectorySync(\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n beforeRemove?: (directoryPath: string) => void,\n afterClaim?: (directoryPath: string) => void,\n): void {\n if (!verifiedLockDirectoryStats(directoryPath, expectedIdentity, expectedMtimeMs)) {\n return;\n }\n const sourcePath = String(directoryPath);\n const quarantinePath = `${sourcePath}.cleanup.${randomUUID()}`;\n beforeRemove?.(sourcePath);\n if (!verifiedLockDirectoryStats(sourcePath, expectedIdentity, expectedMtimeMs)) {\n return;\n }\n fs.renameSync(directoryPath, quarantinePath);\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity, expectedMtimeMs)) {\n throw lockCleanupError(\"Recorder lock cleanup target disappeared.\");\n }\n afterClaim?.(quarantinePath);\n try {\n const entries = fs.readdirSync(quarantinePath);\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifacts: string[] = [];\n for (const entry of entries) {\n if (!isLockArtifactName(entry)) {\n throw lockCleanupError(\"Recorder lock cleanup found an unexpected artifact.\");\n }\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifactPath = path.join(quarantinePath, entry);\n const artifact = fs.lstatSync(artifactPath, { bigint: true });\n if (!artifact.isFile() || artifact.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock cleanup found an unsafe artifact.\");\n }\n artifacts.push(artifactPath);\n }\n artifacts.sort(\n (left, right) =>\n Number(path.basename(left) === OWNER_FILE) - Number(path.basename(right) === OWNER_FILE),\n );\n for (const artifactPath of artifacts) {\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifact = fs.lstatSync(artifactPath, { bigint: true });\n if (!artifact.isFile() || artifact.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock cleanup artifact changed.\");\n }\n fs.unlinkSync(artifactPath);\n }\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target disappeared.\");\n }\n fs.rmdirSync(quarantinePath);\n } catch (error) {\n try {\n if (verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n fs.utimesSync(quarantinePath, new Date(0), new Date(0));\n }\n } catch {\n // Do not mutate a replacement directory after cleanup loses its identity fence.\n }\n throw error;\n }\n}\n\nfunction canonicalLockDirectoryPath(directoryPath: fs.PathLike): string {\n const resolved = path.resolve(String(directoryPath));\n let canonicalParent: string;\n try {\n canonicalParent = fs.realpathSync.native(path.dirname(resolved));\n } catch {\n canonicalParent = path.dirname(resolved);\n }\n const canonical = path.join(canonicalParent, path.basename(resolved));\n return process.platform === \"win32\" ? path.win32.normalize(canonical).toLowerCase() : canonical;\n}\n\nfunction abandonedOwnerKey(directoryPath: fs.PathLike, ownerToken: string): string {\n return `${canonicalLockDirectoryPath(directoryPath)}\\0${ownerToken}`;\n}\n\nfunction recoveryClaimPath(directoryPath: fs.PathLike, fingerprint = \"coordination\"): string {\n const canonicalDirectory = canonicalLockDirectoryPath(directoryPath);\n const digest = createHash(\"sha256\")\n .update(canonicalDirectory)\n .update(\"\\0\")\n .update(fingerprint)\n .digest(\"hex\");\n return path.join(path.dirname(canonicalDirectory), `.crabline-reclaim-${digest}`);\n}\n\nfunction lockOwnerMatches(\n left: ParsedLockOwner | null | undefined,\n right: ParsedLockOwner | null | undefined,\n): boolean {\n if (!left || !right) {\n return left === right;\n }\n return left.owner.token === right.owner.token;\n}\n\nlet cachedCurrentProcessIdentity: string | undefined;\nlet cachedCurrentMachineIdentity: string | undefined;\n\nfunction readProcessIdentityWithRetry(\n pid: number,\n reader: (candidatePid: number) => string | null,\n): string | null {\n for (let attempt = 0; attempt < CURRENT_IDENTITY_ATTEMPTS; attempt++) {\n const identity = reader(pid);\n if (identity !== null) {\n return identity;\n }\n }\n return null;\n}\n\nfunction readProcessNamespaceWithRetry(pid: number): string | null {\n for (let attempt = 0; attempt < CURRENT_IDENTITY_ATTEMPTS; attempt++) {\n const namespace = readProcessNamespace(pid);\n if (namespace !== null) {\n return namespace;\n }\n }\n return null;\n}\n\nfunction parseOpenedOwner(ownerHandle: number): Omit<ParsedLockOwner, \"lockDirectory\"> | undefined {\n const stats = fs.fstatSync(ownerHandle);\n if (!stats.isFile() || stats.size === 0 || stats.size > MAX_OWNER_BYTES) {\n return undefined;\n }\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(ownerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n return undefined;\n }\n offset += bytesRead;\n }\n const value = JSON.parse(raw.toString(\"utf8\")) as Partial<LockOwner>;\n if (\n (value.version !== 1 && value.version !== 2 && value.version !== 3 && value.version !== 4) ||\n !isValidProcessId(value.pid ?? 0) ||\n typeof value.token !== \"string\" ||\n value.token.length === 0 ||\n value.token.length > 128 ||\n !Number.isSafeInteger(value.processStartedAtMs) ||\n (value.executionIdentity !== undefined &&\n value.executionIdentity !== null &&\n (typeof value.executionIdentity !== \"string\" ||\n value.executionIdentity.length === 0 ||\n value.executionIdentity.length > 128)) ||\n (value.machineIdentity !== undefined &&\n value.machineIdentity !== null &&\n (typeof value.machineIdentity !== \"string\" ||\n value.machineIdentity.length === 0 ||\n value.machineIdentity.length > 256)) ||\n (value.processNamespace !== undefined &&\n value.processNamespace !== null &&\n (typeof value.processNamespace !== \"string\" ||\n !LINUX_PID_NAMESPACE_PATTERN.test(value.processNamespace))) ||\n (value.processIdentity !== null &&\n (typeof value.processIdentity !== \"string\" ||\n value.processIdentity.length === 0 ||\n value.processIdentity.length > 256))\n ) {\n return undefined;\n }\n if (\n (value.version === 2 || value.version === 3 || value.version === 4) &&\n (value.processIdentity === null ||\n !isExactProcessIdentity(value.processIdentity) ||\n (/^linux:/u.test(value.processIdentity) &&\n (value.processNamespace === null ||\n value.processNamespace === undefined ||\n !LINUX_PID_NAMESPACE_PATTERN.test(value.processNamespace))))\n ) {\n return undefined;\n }\n if (\n (value.version === 3 || value.version === 4) &&\n (value.machineIdentity === null ||\n value.machineIdentity === undefined ||\n !/^(darwin|linux|windows):.+$/u.test(value.machineIdentity))\n ) {\n return undefined;\n }\n if (\n value.version === 4 &&\n (value.executionIdentity === null ||\n value.executionIdentity === undefined ||\n !/^[0-9a-f-]{36}$/iu.test(value.executionIdentity))\n ) {\n return undefined;\n }\n return {\n owner: {\n ...(value as LockOwner),\n executionIdentity: value.executionIdentity ?? null,\n machineIdentity: value.machineIdentity ?? null,\n processNamespace: value.processNamespace ?? null,\n },\n publishedAtMs: stats.mtimeMs,\n };\n}\n\nfunction parseOwner(lockDirectory: fs.PathLike): ParsedLockOwner | null | undefined {\n let ownerHandle: number;\n try {\n ownerHandle = fs.openSync(\n path.join(String(lockDirectory), OWNER_FILE),\n fs.constants.O_RDONLY | fs.constants.O_NONBLOCK | fs.constants.O_NOFOLLOW,\n );\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\" ? undefined : null;\n }\n let parsed: Omit<ParsedLockOwner, \"lockDirectory\"> | undefined;\n try {\n parsed = parseOpenedOwner(ownerHandle);\n } catch {\n parsed = undefined;\n }\n try {\n fs.closeSync(ownerHandle);\n } catch {\n return null;\n }\n return parsed === undefined\n ? null\n : {\n ...parsed,\n lockDirectory: String(lockDirectory),\n };\n}\n\nfunction restoreDisplacedPublishedLockDirectory(\n displacedPath: string,\n lockDirectory: string,\n): void {\n try {\n const displaced = fs.lstatSync(displacedPath, { bigint: true });\n const owner = parseOwner(displacedPath);\n if (\n !displaced.isDirectory() ||\n displaced.isSymbolicLink() ||\n owner === null ||\n owner === undefined\n ) {\n return;\n }\n } catch {\n return;\n }\n try {\n fs.lstatSync(lockDirectory);\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n return;\n }\n }\n try {\n // The coordination claim excludes compliant publishers. If an unexpected\n // published directory races this restore, its owner file makes it nonempty,\n // so rename refuses to replace it and the displaced directory stays preserved.\n fs.renameSync(displacedPath, lockDirectory);\n } catch {\n // Preserve the displaced directory at its claim-local path if restoration races.\n }\n}\n\nfunction renamedDirectoryMatches(\n claimedPath: string,\n lockDirectory: string,\n expectedIdentity: DirectoryIdentity,\n): boolean {\n try {\n const claimed = fs.lstatSync(claimedPath, { bigint: true });\n if (\n claimed.isDirectory() &&\n !claimed.isSymbolicLink() &&\n directoryIdentityMatches(expectedIdentity, claimed)\n ) {\n return true;\n }\n } catch {\n // Restore or preserve any directory displaced after the final identity check.\n }\n restoreDisplacedPublishedLockDirectory(claimedPath, lockDirectory);\n return false;\n}\n\nfunction abandonedOwnerMarkerPath(lockDirectory: fs.PathLike, ownerToken: string): string {\n const digest = createHash(\"sha256\").update(ownerToken).digest(\"hex\");\n return path.join(String(lockDirectory), `${ABANDONED_OWNER_PREFIX}${digest}`);\n}\n\nfunction hasAbandonedOwnerMarker(candidate: ParsedLockOwner): boolean {\n const markerPath = abandonedOwnerMarkerPath(candidate.lockDirectory, candidate.owner.token);\n let markerHandle: number;\n try {\n markerHandle = fs.openSync(markerPath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);\n } catch {\n return false;\n }\n let matches = false;\n try {\n const stats = fs.fstatSync(markerHandle);\n if (stats.isFile() && stats.size > 0 && stats.size <= 256) {\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(markerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n break;\n }\n offset += bytesRead;\n }\n matches = offset === raw.byteLength && raw.toString(\"utf8\").trim() === candidate.owner.token;\n }\n } catch {\n matches = false;\n }\n try {\n fs.closeSync(markerHandle);\n } catch {\n return false;\n }\n return matches;\n}\n\nfunction publishAbandonedOwnerMarker(lockDirectory: fs.PathLike, ownerToken: string): boolean {\n const candidate = parseOwner(lockDirectory);\n if (!candidate || candidate.owner.token !== ownerToken) {\n return false;\n }\n const markerPath = abandonedOwnerMarkerPath(lockDirectory, ownerToken);\n let markerHandle: number | undefined;\n let markerIdentity: fs.BigIntStats | undefined;\n try {\n markerHandle = fs.openSync(\n markerPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW,\n 0o600,\n );\n markerIdentity = fs.fstatSync(markerHandle, { bigint: true });\n const contents = Buffer.from(`${ownerToken}\\n`);\n let offset = 0;\n while (offset < contents.byteLength) {\n const written = fs.writeSync(\n markerHandle,\n contents,\n offset,\n contents.byteLength - offset,\n offset,\n );\n if (written === 0) {\n throw new Error(\"Recorder lock abandonment publication made no progress.\");\n }\n offset += written;\n }\n fs.fsyncSync(markerHandle);\n fs.closeSync(markerHandle);\n markerHandle = undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return hasAbandonedOwnerMarker(candidate);\n }\n if (markerIdentity !== undefined) {\n try {\n const current = fs.lstatSync(markerPath, { bigint: true });\n if (markerIdentity.dev === current.dev && markerIdentity.ino === current.ino) {\n fs.unlinkSync(markerPath);\n }\n } catch {\n // Preserve a replacement marker that cannot be proven to be ours.\n }\n }\n return false;\n } finally {\n if (markerHandle !== undefined) {\n try {\n fs.closeSync(markerHandle);\n } catch {\n // The failed abandonment publication remains non-authoritative.\n }\n }\n }\n const refreshed = parseOwner(lockDirectory);\n if (!refreshed || refreshed.owner.token !== ownerToken || !hasAbandonedOwnerMarker(refreshed)) {\n try {\n fs.unlinkSync(markerPath);\n } catch {\n // A changed marker is ignored unless it matches the current owner token.\n }\n return false;\n }\n return true;\n}\n\nfunction hasRecoverableMalformedOwner(lockDirectory: fs.PathLike): boolean {\n let ownerHandle: number;\n try {\n ownerHandle = fs.openSync(\n path.join(String(lockDirectory), OWNER_FILE),\n fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW,\n );\n } catch {\n return false;\n }\n let recoverable = false;\n try {\n const stats = fs.fstatSync(ownerHandle);\n if (!stats.isFile() || stats.size > MAX_OWNER_BYTES) {\n recoverable = false;\n } else if (stats.size === 0) {\n recoverable = true;\n } else {\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(ownerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n recoverable = true;\n break;\n }\n offset += bytesRead;\n }\n if (offset === raw.byteLength) {\n JSON.parse(raw.toString(\"utf8\"));\n }\n }\n } catch (error) {\n recoverable = error instanceof SyntaxError;\n }\n try {\n fs.closeSync(ownerHandle);\n } catch {\n return false;\n }\n return recoverable;\n}\n\nfunction syntheticFreshStat(stats: fs.Stats): fs.Stats {\n const fresh = Object.assign(Object.create(Object.getPrototypeOf(stats)), stats) as fs.Stats;\n Object.defineProperty(fresh, \"mtime\", {\n configurable: true,\n enumerable: true,\n value: new Date(),\n });\n return fresh;\n}\n\nfunction syntheticStaleStat(stats: fs.Stats): fs.Stats {\n const stale = Object.assign(Object.create(Object.getPrototypeOf(stats)), stats) as fs.Stats;\n Object.defineProperty(stale, \"mtime\", {\n configurable: true,\n enumerable: true,\n value: new Date(0),\n });\n return stale;\n}\n\nfunction statMtimeMs(stats: { mtimeMs: bigint | number }): number {\n return typeof stats.mtimeMs === \"bigint\" ? Number(stats.mtimeMs) : stats.mtimeMs;\n}\n\nfunction isRecoverableOwnerlessClaim(stats: { mtimeMs: bigint | number }): boolean {\n return Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS;\n}\n\nfunction isRecoverableUnverifiableOwner(candidate: ParsedLockOwner, status: OwnerStatus): boolean {\n return (\n status === \"superseded\" &&\n candidate.owner.version === 1 &&\n (candidate.owner.processIdentity === null ||\n isCoarseDarwinIdentity(candidate.owner.processIdentity)) &&\n Date.now() - candidate.publishedAtMs >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nfunction isRecoverableForeignOwner(\n candidate: ParsedLockOwner,\n status: OwnerStatus,\n stats: { mtimeMs: bigint | number },\n): boolean {\n return (\n status === \"foreign\" &&\n candidate.owner.version >= 2 &&\n Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nfunction isRecoverableUnknownOwner(\n candidate: ParsedLockOwner,\n status: OwnerStatus,\n stats: { mtimeMs: bigint | number },\n): boolean {\n return (\n status === \"unknown\" &&\n candidate.owner.version >= 2 &&\n candidate.owner.processIdentity !== null &&\n isExactProcessIdentity(candidate.owner.processIdentity) &&\n Date.now() - candidate.publishedAtMs >= OWNERLESS_LOCK_RECOVERY_MS &&\n Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nexport function createProcessOwnedLockFileSystem(\n options: {\n beforeDirectoryRemoval?: (directoryPath: string) => void;\n machineIdentityReader?: () => string | null;\n onDirectoryOwned?: (directoryPath: string, identity: { dev: bigint; ino: bigint }) => void;\n processIdentityReader?: (pid: number) => string | null;\n } = {},\n): typeof fs {\n if (\n process.platform !== \"linux\" &&\n process.platform !== \"darwin\" &&\n process.platform !== \"win32\"\n ) {\n return fs;\n }\n const token = randomUUID();\n const removeLockDirectorySync = (\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n afterClaim?: (directoryPath: string) => void,\n ): void => {\n removeVerifiedLockDirectorySync(\n directoryPath,\n expectedIdentity,\n expectedMtimeMs,\n options.beforeDirectoryRemoval,\n afterClaim,\n );\n };\n const identityReader = options.processIdentityReader ?? readProcessIdentity;\n let currentProcessIdentity: string | null;\n if (options.processIdentityReader) {\n currentProcessIdentity = readProcessIdentityWithRetry(process.pid, identityReader);\n } else {\n if (cachedCurrentProcessIdentity === undefined) {\n const currentIdentity = readProcessIdentityWithRetry(process.pid, identityReader);\n if (currentIdentity !== null) {\n cachedCurrentProcessIdentity = currentIdentity;\n }\n }\n currentProcessIdentity = cachedCurrentProcessIdentity ?? null;\n }\n if (\n currentProcessIdentity === null ||\n (!isExactProcessIdentity(currentProcessIdentity) &&\n !(process.platform === \"darwin\" && isCoarseDarwinIdentity(currentProcessIdentity)))\n ) {\n throw new Error(\"Recorder lock process identity is unavailable.\");\n }\n let currentMachineIdentity: string | null;\n if (options.machineIdentityReader) {\n currentMachineIdentity = options.machineIdentityReader();\n } else {\n if (cachedCurrentMachineIdentity === undefined) {\n const machineIdentity = readMachineIdentity();\n if (machineIdentity !== null) {\n cachedCurrentMachineIdentity = machineIdentity;\n }\n }\n currentMachineIdentity = cachedCurrentMachineIdentity ?? null;\n }\n if (currentMachineIdentity === null) {\n throw new Error(\"Recorder lock machine identity is unavailable.\");\n }\n const currentProcessNamespace = readProcessNamespaceWithRetry(process.pid);\n if (process.platform === \"linux\" && currentProcessNamespace === null) {\n throw new Error(\"Recorder lock process namespace is unavailable.\");\n }\n const ownedDirectories = new Map<string, DirectoryIdentity>();\n const interruptedPublicationIdentities = new Map<string, DirectoryIdentity>();\n let cachedForeignIdentity:\n | {\n checkedAt: number;\n ownerGenerationKey: string;\n identity: string | null;\n pid: number;\n startedAtMs: number | null;\n }\n | undefined;\n const owner: LockOwner = {\n executionIdentity: CURRENT_EXECUTION_IDENTITY,\n machineIdentity: currentMachineIdentity,\n pid: process.pid,\n processIdentity: currentProcessIdentity,\n processNamespace: currentProcessNamespace,\n processStartedAtMs: CURRENT_PROCESS_STARTED_AT_MS,\n token,\n version: isExactProcessIdentity(currentProcessIdentity) ? 4 : 1,\n };\n\n const publishOwner = (directory: string): void => {\n const ownerPath = path.join(directory, OWNER_FILE);\n let ownerHandle: number | undefined;\n let openedIdentity: fs.BigIntStats | undefined;\n try {\n ownerHandle = fs.openSync(\n ownerPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL,\n 0o600,\n );\n openedIdentity = fs.fstatSync(ownerHandle, { bigint: true });\n const contents = Buffer.from(`${JSON.stringify(owner)}\\n`);\n let offset = 0;\n while (offset < contents.byteLength) {\n const written = fs.writeSync(\n ownerHandle,\n contents,\n offset,\n contents.byteLength - offset,\n offset,\n );\n if (written === 0) {\n throw new Error(\"Recorder lock owner publication made no progress.\");\n }\n offset += written;\n }\n fs.closeSync(ownerHandle);\n ownerHandle = undefined;\n } catch (error) {\n if (openedIdentity !== undefined) {\n try {\n const current = fs.lstatSync(ownerPath, { bigint: true });\n if (openedIdentity.dev === current.dev && openedIdentity.ino === current.ino) {\n fs.unlinkSync(ownerPath);\n }\n } catch {\n // Preserve a replacement path that cannot be proven to be ours.\n }\n }\n throw error;\n } finally {\n if (ownerHandle !== undefined) {\n try {\n fs.closeSync(ownerHandle);\n } catch {\n // Preserve the publication error already being reported.\n }\n }\n }\n };\n\n const abandonOwner = (directory: string): boolean => {\n abandonedOwnerKeys.add(abandonedOwnerKey(directory, token));\n const published = publishAbandonedOwnerMarker(directory, token);\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const ownedIdentity = ownedDirectories.get(coordinationKey);\n if (!ownedIdentity) {\n return published;\n }\n try {\n const current = fs.lstatSync(directory, { bigint: true });\n if (current.isDirectory() && directoryIdentityMatches(ownedIdentity, current)) {\n abandonedDirectoryIdentities.set(coordinationKey, {\n ...ownedIdentity,\n ownerGenerationKey: token,\n });\n }\n } catch {\n // The path no longer names the directory published by this wrapper.\n }\n return published;\n };\n\n const ownerStatus = (\n candidate: ParsedLockOwner | null | undefined,\n forceIdentityRefresh = false,\n ): OwnerStatus => {\n if (!candidate) {\n return \"unknown\";\n }\n const claim = candidate.owner;\n if (\n abandonedOwnerKeys.has(abandonedOwnerKey(candidate.lockDirectory, claim.token)) ||\n hasAbandonedOwnerMarker(candidate)\n ) {\n return \"dead\";\n }\n if (\n claim.version >= 3 &&\n claim.machineIdentity !== null &&\n claim.machineIdentity !== currentMachineIdentity\n ) {\n return \"foreign\";\n }\n if (\n process.platform === \"linux\" &&\n claim.version >= 2 &&\n (claim.processNamespace === null ||\n currentProcessNamespace === null ||\n claim.processNamespace !== currentProcessNamespace)\n ) {\n return \"foreign\";\n }\n if (claim.version === 2 && (process.platform === \"darwin\" || process.platform === \"win32\")) {\n return \"foreign\";\n }\n if (!isProcessAlive(claim.pid)) {\n if (process.platform === \"linux\" && claim.version === 1 && claim.processNamespace === null) {\n return \"unknown\";\n }\n return \"dead\";\n }\n if (isDefunctProcess(claim.pid)) {\n return \"dead\";\n }\n if (claim.pid === process.pid) {\n if (claim.processIdentity !== null && isExactProcessIdentity(claim.processIdentity)) {\n if (claim.processIdentity !== currentProcessIdentity) {\n return \"dead\";\n }\n return claim.version === 4 &&\n claim.executionIdentity !== null &&\n claim.executionIdentity !== CURRENT_EXECUTION_IDENTITY\n ? \"foreign\"\n : \"active\";\n }\n if (claim.processStartedAtMs !== CURRENT_PROCESS_STARTED_AT_MS) {\n return \"superseded\";\n }\n return claim.executionIdentity !== null &&\n claim.executionIdentity !== CURRENT_EXECUTION_IDENTITY\n ? \"superseded\"\n : \"active\";\n }\n const now = Date.now();\n if (\n forceIdentityRefresh ||\n !cachedForeignIdentity ||\n cachedForeignIdentity.pid !== claim.pid ||\n cachedForeignIdentity.ownerGenerationKey !== claim.token ||\n now - cachedForeignIdentity.checkedAt >= IDENTITY_CACHE_MS\n ) {\n const observedIdentity = identityReader(claim.pid);\n cachedForeignIdentity = {\n checkedAt: now,\n identity: observedIdentity,\n ownerGenerationKey: claim.token,\n pid: claim.pid,\n startedAtMs:\n processStartedAtMsFromIdentity(observedIdentity) ??\n readLegacyProcessStartedAtMs(claim.pid),\n };\n }\n if (\n claim.processIdentity === null ||\n isCoarseDarwinIdentity(claim.processIdentity) ||\n !isExactProcessIdentity(claim.processIdentity)\n ) {\n if (claim.version !== 1 || cachedForeignIdentity.startedAtMs === null) {\n return \"unknown\";\n }\n return legacyProcessStartMatches(claim.processStartedAtMs, cachedForeignIdentity.startedAtMs)\n ? \"active\"\n : \"superseded\";\n }\n if (cachedForeignIdentity.identity === null) {\n return \"unknown\";\n }\n if (process.platform === \"darwin\" && isCoarseDarwinIdentity(cachedForeignIdentity.identity)) {\n return cachedForeignIdentity.startedAtMs === null\n ? \"unknown\"\n : legacyProcessStartMatches(claim.processStartedAtMs, cachedForeignIdentity.startedAtMs)\n ? \"active\"\n : \"superseded\";\n }\n return cachedForeignIdentity.identity === claim.processIdentity ? \"active\" : \"dead\";\n };\n\n const createRecoveryClaim = (\n claimPath: string,\n callback: (error: NodeJS.ErrnoException | null, claim?: RecoveryClaim) => void,\n ): void => {\n fs.mkdir(claimPath, { mode: 0o700 }, (claimError) => {\n if (!claimError) {\n let createdIdentity: DirectoryIdentity | undefined;\n try {\n const created = fs.lstatSync(claimPath, { bigint: true });\n if (!created.isDirectory() || created.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery claim changed during creation.\");\n }\n createdIdentity = directoryIdentity(created);\n publishOwner(claimPath);\n const published = verifiedLockDirectoryStats(claimPath, createdIdentity);\n if (!published) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during publication.\");\n }\n callback(null, {\n activeIdentity: directoryIdentity(published),\n activePath: claimPath,\n ownerGenerationKey: token,\n supersededPaths: [],\n });\n } catch (ownerError) {\n if (createdIdentity) {\n try {\n removeLockDirectorySync(claimPath, createdIdentity);\n } catch {\n // Preserve an unverified replacement instead of deleting it by pathname.\n }\n }\n callback(ownerError as NodeJS.ErrnoException);\n }\n return;\n }\n if (claimError.code !== \"EEXIST\") {\n callback(claimError);\n return;\n }\n let existingFingerprint: string | undefined;\n let existingIdentity: SupersededRecoveryClaim[\"identity\"] | undefined;\n let existingOwnerFingerprint: string | undefined;\n try {\n const initialStats = fs.lstatSync(claimPath, { bigint: true });\n if (initialStats.isDirectory() && !initialStats.isSymbolicLink()) {\n const initialIdentity = directoryIdentity(initialStats);\n const existingClaim = parseOwner(claimPath);\n const stats = verifiedLockDirectoryStats(\n claimPath,\n initialIdentity,\n initialStats.mtimeMs,\n );\n if (!stats) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during inspection.\");\n }\n if (existingClaim) {\n const status = ownerStatus(existingClaim);\n const recoverableForeign =\n status === \"foreign\" && isRecoverableForeignOwner(existingClaim, status, stats);\n const recoverableUnverifiable = isRecoverableUnverifiableOwner(existingClaim, status);\n const recoverableUnknown =\n isRecoverableUnknownOwner(existingClaim, status, stats) &&\n isRecoverableUnknownOwner(existingClaim, ownerStatus(existingClaim, true), stats);\n if (\n status === \"dead\" ||\n recoverableForeign ||\n recoverableUnverifiable ||\n recoverableUnknown\n ) {\n existingFingerprint = `owner:${existingClaim.owner.token}`;\n existingOwnerFingerprint = existingFingerprint;\n }\n } else if (isRecoverableOwnerlessClaim(stats)) {\n existingOwnerFingerprint = existingClaim === undefined ? \"ownerless\" : \"malformed\";\n existingFingerprint = `${existingOwnerFingerprint}:${stats.dev}:${stats.ino}:${stats.mtimeMs}`;\n }\n if (existingFingerprint) {\n existingIdentity = {\n ...directoryIdentity(stats),\n mtimeMs: stats.mtimeMs,\n };\n }\n }\n } catch {\n // Treat a concurrently changing claim as active.\n }\n if (!existingFingerprint || !existingIdentity || !existingOwnerFingerprint) {\n callback(\n Object.assign(new Error(\"Recorder lock recovery is already in progress.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const takeoverPath = recoveryClaimPath(claimPath, existingFingerprint);\n createRecoveryClaim(takeoverPath, (takeoverError, takeoverClaim) => {\n if (takeoverError || !takeoverClaim) {\n callback(\n takeoverError ??\n Object.assign(new Error(\"Recorder lock recovery claim failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n } else {\n callback(null, {\n activeIdentity: takeoverClaim.activeIdentity,\n activePath: takeoverClaim.activePath,\n ownerGenerationKey: takeoverClaim.ownerGenerationKey,\n supersededPaths: [\n {\n identity: existingIdentity,\n ownerFingerprint: existingOwnerFingerprint,\n path: claimPath,\n },\n ...takeoverClaim.supersededPaths,\n ],\n });\n }\n });\n });\n };\n\n const releaseRecoveryClaim = (\n directory: string,\n claim: RecoveryClaim,\n callback: () => void,\n ): void => {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n // Retire nested takeover paths before the base claim so any failure leaves\n // the active claim discoverable through the original coordination path.\n const supersededPaths = [...claim.supersededPaths].reverse();\n let removedSupersededPath = false;\n const removeActiveClaim = (): void => {\n let activeError: NodeJS.ErrnoException | null = null;\n try {\n removeLockDirectorySync(\n claim.activePath,\n claim.activeIdentity,\n undefined,\n (claimedPath) => {\n claim.activePath = claimedPath;\n },\n );\n } catch (error) {\n activeError = error as NodeJS.ErrnoException;\n }\n if (activeError && !abandonOwner(claim.activePath)) {\n retainedCoordinationClaims.set(coordinationKey, {\n claim,\n retainedByToken: token,\n });\n }\n callback();\n };\n const preserveActiveClaim = (): void => {\n if (!abandonOwner(claim.activePath)) {\n retainedCoordinationClaims.set(coordinationKey, {\n claim,\n retainedByToken: token,\n });\n }\n callback();\n };\n const removeSuperseded = (index: number): void => {\n const superseded = supersededPaths[index];\n if (!superseded) {\n removeActiveClaim();\n return;\n }\n let current: fs.BigIntStats | undefined;\n try {\n current = verifiedLockDirectoryStats(\n superseded.path,\n superseded.identity,\n superseded.identity.mtimeMs,\n );\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n if (!current) {\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n return;\n }\n const currentOwner = parseOwner(superseded.path);\n try {\n current = verifiedLockDirectoryStats(\n superseded.path,\n superseded.identity,\n superseded.identity.mtimeMs,\n );\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n if (!current) {\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n return;\n }\n const currentFingerprint = currentOwner\n ? `owner:${currentOwner.owner.token}`\n : currentOwner === undefined\n ? \"ownerless\"\n : \"malformed\";\n if (currentFingerprint !== superseded.ownerFingerprint) {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n try {\n removeLockDirectorySync(superseded.path, superseded.identity, superseded.identity.mtimeMs);\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n };\n removeSuperseded(0);\n };\n\n const acquireCoordinationClaim = (\n directory: string,\n callback: (error: NodeJS.ErrnoException | null, claim?: RecoveryClaim) => void,\n ): void => {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const retained = retainedCoordinationClaims.get(coordinationKey);\n if (retained) {\n if (retained.retainedByToken !== token && !ownedDirectories.has(coordinationKey)) {\n callback(lockCleanupError(\"Recorder lock retained coordination claim is owned elsewhere.\"));\n return;\n }\n const { claim: retainedClaim } = retained;\n let retainedClaimIsOwned = false;\n try {\n const current = verifiedLockDirectoryStats(\n retainedClaim.activePath,\n retainedClaim.activeIdentity,\n );\n const retainedOwner = current ? parseOwner(retainedClaim.activePath) : undefined;\n retainedClaimIsOwned =\n retainedOwner !== undefined &&\n retainedOwner !== null &&\n retainedOwner.owner.token === retainedClaim.ownerGenerationKey &&\n ownerStatus(retainedOwner) === \"active\";\n } catch {\n retainedClaimIsOwned = false;\n }\n if (retainedClaimIsOwned) {\n if (retainedCoordinationClaims.get(coordinationKey) === retained) {\n retainedCoordinationClaims.delete(coordinationKey);\n }\n callback(null, retainedClaim);\n return;\n }\n if (retainedCoordinationClaims.get(coordinationKey) === retained) {\n retainedCoordinationClaims.delete(coordinationKey);\n }\n }\n createRecoveryClaim(recoveryClaimPath(directory), callback);\n };\n\n const lockFs = Object.create(fs) as typeof fs;\n lockFs.mkdir = ((\n directoryPath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n const directory = String(directoryPath);\n acquireCoordinationClaim(directory, (claimError, coordinationClaim) => {\n if (claimError || !coordinationClaim) {\n callback(\n claimError ??\n Object.assign(new Error(\"Recorder lock coordination failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n fs.mkdir(directoryPath, (error) => {\n if (error) {\n if (error.code === \"EEXIST\" && coordinationClaim.supersededPaths.length > 0) {\n try {\n const existing = fs.lstatSync(directoryPath, { bigint: true });\n const candidate = parseOwner(directoryPath);\n if (\n existing.isDirectory() &&\n !existing.isSymbolicLink() &&\n (candidate === undefined || candidate === null)\n ) {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n interruptedPublicationIdentities.set(coordinationKey, directoryIdentity(existing));\n retainedCoordinationClaims.set(coordinationKey, {\n claim: coordinationClaim,\n retainedByToken: token,\n });\n callback(error);\n return;\n }\n } catch {\n // Fall through to normal cleanup for a changing target.\n }\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(error));\n return;\n }\n let createdIdentity: DirectoryIdentity | undefined;\n let ownerPublished = false;\n let publicationError: NodeJS.ErrnoException | null = null;\n try {\n const createdDirectory = fs.lstatSync(directoryPath, { bigint: true });\n if (!createdDirectory.isDirectory() || createdDirectory.isSymbolicLink()) {\n throw new Error(\"Recorder lock directory changed during creation.\");\n }\n const candidateIdentity = directoryIdentity(createdDirectory);\n const createdEntries = fs.readdirSync(directoryPath);\n if (\n createdEntries.length > 0 ||\n !verifiedLockDirectoryStats(directoryPath, candidateIdentity)\n ) {\n throw lockCleanupError(\"Recorder lock directory changed during creation.\");\n }\n createdIdentity = candidateIdentity;\n publishOwner(directory);\n ownerPublished = true;\n const publishedDirectory = verifiedLockDirectoryStats(directory, createdIdentity);\n if (!publishedDirectory) {\n throw new Error(\"Recorder lock directory changed during owner publication.\");\n }\n const publishedIdentity = directoryIdentity(publishedDirectory);\n options.onDirectoryOwned?.(directory, { ...publishedIdentity });\n ownedDirectories.set(canonicalLockDirectoryPath(directory), publishedIdentity);\n interruptedPublicationIdentities.delete(canonicalLockDirectoryPath(directory));\n } catch (ownerError) {\n publicationError = ownerError as NodeJS.ErrnoException;\n }\n if (publicationError) {\n if (ownerPublished && createdIdentity) {\n try {\n if (verifiedLockDirectoryStats(directory, createdIdentity)) {\n abandonOwner(directory);\n }\n } catch {\n // Preserve an unverified replacement instead of mutating it by pathname.\n }\n } else if (createdIdentity) {\n try {\n removeLockDirectorySync(directoryPath, createdIdentity);\n } catch {\n // Preserve an unverified replacement instead of deleting it by pathname.\n }\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(publicationError));\n return;\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(null));\n });\n });\n }) as typeof fs.mkdir;\n lockFs.stat = ((\n filePath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null, stats?: fs.Stats) => void,\n ) => {\n fs.stat(filePath, (error, stats) => {\n if (error) {\n callback(error);\n return;\n }\n const coordinationKey = canonicalLockDirectoryPath(filePath);\n let identityStats: fs.BigIntStats | undefined;\n try {\n const current = fs.lstatSync(filePath, { bigint: true });\n if (current.isDirectory() && !current.isSymbolicLink()) {\n identityStats = current;\n }\n } catch {\n // A changing path cannot match an identity-based recovery fence.\n }\n if (\n identityStats &&\n directoryIdentityMatches(abandonedDirectoryIdentities.get(coordinationKey), identityStats)\n ) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n const candidate = parseOwner(filePath);\n const status = ownerStatus(candidate);\n if (candidate !== undefined && candidate !== null) {\n interruptedPublicationIdentities.delete(coordinationKey);\n }\n const recoverableInterruptedPublication =\n (candidate === undefined || candidate === null) &&\n identityStats !== undefined &&\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n identityStats,\n ) &&\n Date.now() - stats.mtimeMs >= OWNERLESS_LOCK_RECOVERY_MS;\n const recoverableAgedUnverifiableOwner =\n isRecoverableOwnerlessClaim(stats) &&\n (candidate === undefined || (candidate === null && hasRecoverableMalformedOwner(filePath)));\n const recoverableForeign =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableForeignOwner(candidate, status, stats);\n const recoverableUnknown =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnknownOwner(candidate, status, stats);\n if (\n candidate &&\n abandonedOwnerKeys.has(abandonedOwnerKey(candidate.lockDirectory, candidate.owner.token))\n ) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n if (candidate && hasAbandonedOwnerMarker(candidate)) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n callback(\n null,\n candidate?.owner.token === token ||\n status === \"dead\" ||\n recoverableForeign ||\n recoverableUnknown ||\n recoverableInterruptedPublication ||\n recoverableAgedUnverifiableOwner ||\n (candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnverifiableOwner(candidate, status))\n ? stats\n : syntheticFreshStat(stats),\n );\n });\n }) as typeof fs.stat;\n lockFs.rmdir = ((\n directoryPath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n const directory = String(directoryPath);\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const releaseDeadline = Date.now() + COORDINATION_RELEASE_WAIT_MS;\n const acquireForRemoval = (): void => {\n acquireCoordinationClaim(directory, (claimError, coordinationClaim) => {\n if (\n claimError?.code === \"ELOCKED\" &&\n ownedDirectories.has(coordinationKey) &&\n Date.now() < releaseDeadline\n ) {\n setTimeout(acquireForRemoval, COORDINATION_RELEASE_RETRY_MS);\n return;\n }\n if (claimError || !coordinationClaim) {\n if (ownedDirectories.has(coordinationKey)) {\n abandonOwner(directory);\n }\n callback(\n claimError ??\n Object.assign(new Error(\"Recorder lock coordination failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const finish = (error: NodeJS.ErrnoException | null): void => {\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(error));\n };\n const candidate = parseOwner(directoryPath);\n let initialStats: fs.BigIntStats;\n try {\n initialStats = fs.lstatSync(directoryPath, { bigint: true });\n if (!initialStats.isDirectory() || initialStats.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery target is not a directory.\");\n }\n } catch (error) {\n const pathError = error as NodeJS.ErrnoException;\n finish(\n pathError.code === \"ENOENT\" && ownedDirectories.has(coordinationKey)\n ? lockCleanupError(\"Recorder lock owned release target disappeared.\")\n : pathError,\n );\n return;\n }\n if (candidate !== undefined && candidate !== null) {\n interruptedPublicationIdentities.delete(coordinationKey);\n }\n const ownedIdentity = ownedDirectories.get(coordinationKey);\n const ownsPublishedDirectory = directoryIdentityMatches(ownedIdentity, initialStats);\n if (\n (candidate?.owner.token === token && ownsPublishedDirectory) ||\n ((candidate === null || candidate === undefined) && ownsPublishedDirectory)\n ) {\n const tombstonePath = `${coordinationClaim.activePath}.${token}.release`;\n fs.rename(directoryPath, tombstonePath, (renameError) => {\n if (renameError) {\n abandonOwner(directory);\n finish(renameError);\n return;\n }\n if (\n !renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(initialStats))\n ) {\n finish(lockCleanupError(\"Recorder lock release displaced a replacement directory.\"));\n return;\n }\n ownedDirectories.delete(coordinationKey);\n abandonedDirectoryIdentities.delete(coordinationKey);\n abandonedOwnerKeys.delete(abandonedOwnerKey(directory, token));\n try {\n removeLockDirectorySync(tombstonePath, directoryIdentity(initialStats));\n finish(null);\n } catch (error) {\n finish(error as NodeJS.ErrnoException);\n }\n });\n return;\n }\n if (candidate === null && ownedDirectories.has(coordinationKey)) {\n abandonOwner(directory);\n finish(\n Object.assign(\n new Error(\"Recorder lock owner metadata cannot be verified for release.\"),\n {\n code: \"ELOCKED\",\n },\n ),\n );\n return;\n }\n let ownerlessStats: fs.BigIntStats | undefined;\n let foreignStats: fs.BigIntStats | undefined;\n let recoverableAbandoned = false;\n let recoverableInterruptedPublication = false;\n let recoverableAgedUnverifiableOwner = false;\n const status = ownerStatus(candidate);\n const recoverableUnverifiable =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnverifiableOwner(candidate, status);\n const recoverableForeign =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableForeignOwner(candidate, status, initialStats);\n const recoverableUnknown =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnknownOwner(candidate, status, initialStats);\n if (recoverableForeign) {\n foreignStats = initialStats;\n }\n if (candidate === undefined || candidate === null) {\n ownerlessStats = initialStats;\n recoverableAbandoned = directoryIdentityMatches(\n abandonedDirectoryIdentities.get(coordinationKey),\n ownerlessStats,\n );\n recoverableInterruptedPublication =\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n ownerlessStats,\n ) && Date.now() - statMtimeMs(ownerlessStats) >= OWNERLESS_LOCK_RECOVERY_MS;\n recoverableAgedUnverifiableOwner =\n isRecoverableOwnerlessClaim(ownerlessStats) &&\n (candidate === undefined ||\n (candidate === null && hasRecoverableMalformedOwner(directoryPath)));\n }\n if (\n status !== \"dead\" &&\n !recoverableForeign &&\n !recoverableUnknown &&\n !recoverableUnverifiable &&\n !recoverableAbandoned &&\n !recoverableInterruptedPublication &&\n !recoverableAgedUnverifiableOwner\n ) {\n finish(\n Object.assign(new Error(\"Recorder lock owner is still active or cannot be verified.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const refreshed = parseOwner(directoryPath);\n const refreshedStatus = ownerStatus(refreshed, recoverableUnknown);\n let refreshedStats: fs.BigIntStats | undefined;\n try {\n const current = fs.lstatSync(directoryPath, { bigint: true });\n if (\n current.isDirectory() &&\n !current.isSymbolicLink() &&\n current.dev === initialStats.dev &&\n current.ino === initialStats.ino &&\n current.mtimeMs === initialStats.mtimeMs\n ) {\n refreshedStats = current;\n }\n } catch {\n // A changed recovery target fails authorization below.\n }\n let recoveryStillAuthorized =\n candidate !== undefined &&\n candidate !== null &&\n refreshedStats !== undefined &&\n lockOwnerMatches(candidate, refreshed) &&\n (refreshedStatus === \"dead\" ||\n (recoverableForeign &&\n refreshed !== undefined &&\n refreshed !== null &&\n foreignStats !== undefined &&\n refreshedStats.dev === foreignStats.dev &&\n refreshedStats.ino === foreignStats.ino &&\n refreshedStats.mtimeMs === foreignStats.mtimeMs &&\n isRecoverableForeignOwner(refreshed, refreshedStatus, refreshedStats)) ||\n (recoverableUnknown &&\n refreshed !== undefined &&\n refreshed !== null &&\n isRecoverableUnknownOwner(refreshed, refreshedStatus, refreshedStats)) ||\n (refreshed !== undefined &&\n refreshed !== null &&\n isRecoverableUnverifiableOwner(refreshed, refreshedStatus)));\n if (recoverableAbandoned && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n directoryIdentityMatches(\n abandonedDirectoryIdentities.get(coordinationKey),\n refreshedStats,\n );\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (recoverableInterruptedPublication && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n refreshed === undefined &&\n refreshedStats.dev === ownerlessStats.dev &&\n refreshedStats.ino === ownerlessStats.ino &&\n refreshedStats.mtimeMs === ownerlessStats.mtimeMs &&\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n refreshedStats,\n ) &&\n Date.now() - statMtimeMs(refreshedStats) >= OWNERLESS_LOCK_RECOVERY_MS;\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (recoverableAgedUnverifiableOwner && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n (candidate === undefined ? refreshed === undefined : refreshed === null) &&\n (candidate !== null || hasRecoverableMalformedOwner(directoryPath)) &&\n refreshedStats.dev === ownerlessStats.dev &&\n refreshedStats.ino === ownerlessStats.ino &&\n refreshedStats.mtimeMs === ownerlessStats.mtimeMs &&\n isRecoverableOwnerlessClaim(refreshedStats);\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (!recoveryStillAuthorized) {\n finish(\n Object.assign(new Error(\"Recorder lock owner changed during recovery.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const tombstonePath = `${coordinationClaim.activePath}.${token}.lock`;\n fs.rename(directoryPath, tombstonePath, (renameError) => {\n if (renameError) {\n finish(renameError);\n return;\n }\n if (!renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(initialStats))) {\n finish(lockCleanupError(\"Recorder lock recovery displaced a replacement directory.\"));\n return;\n }\n try {\n removeLockDirectorySync(tombstonePath, directoryIdentity(initialStats));\n if (candidate) {\n abandonedOwnerKeys.delete(\n abandonedOwnerKey(candidate.lockDirectory, candidate.owner.token),\n );\n }\n interruptedPublicationIdentities.delete(coordinationKey);\n const abandonedIdentity = abandonedDirectoryIdentities.get(coordinationKey);\n if (abandonedIdentity) {\n abandonedOwnerKeys.delete(\n abandonedOwnerKey(directory, abandonedIdentity.ownerGenerationKey),\n );\n abandonedDirectoryIdentities.delete(coordinationKey);\n }\n retainedCoordinationClaims.set(canonicalLockDirectoryPath(directory), {\n claim: coordinationClaim,\n retainedByToken: token,\n });\n callback(null);\n } catch (error) {\n finish(error as NodeJS.ErrnoException);\n }\n });\n });\n };\n acquireForRemoval();\n }) as typeof fs.rmdir;\n lockFs.rmdirSync = ((directoryPath: fs.PathLike) => {\n const directory = String(directoryPath);\n const claimPath = recoveryClaimPath(directory);\n fs.mkdirSync(claimPath, { mode: 0o700 });\n const createdClaim = fs.lstatSync(claimPath, { bigint: true });\n if (!createdClaim.isDirectory() || createdClaim.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery claim changed during creation.\");\n }\n const coordinationClaim: RecoveryClaim = {\n activeIdentity: directoryIdentity(createdClaim),\n activePath: claimPath,\n ownerGenerationKey: token,\n supersededPaths: [],\n };\n try {\n publishOwner(claimPath);\n if (!verifiedLockDirectoryStats(claimPath, coordinationClaim.activeIdentity)) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during publication.\");\n }\n const candidate = parseOwner(directoryPath);\n if (candidate?.owner.token !== token) {\n throw Object.assign(new Error(\"Recorder lock is not owned by this process.\"), {\n code: \"ELOCKED\",\n });\n }\n const ownedIdentity = ownedDirectories.get(canonicalLockDirectoryPath(directory));\n const ownedDirectory = fs.lstatSync(directoryPath, { bigint: true });\n if (\n !ownedDirectory.isDirectory() ||\n ownedDirectory.isSymbolicLink() ||\n !directoryIdentityMatches(ownedIdentity, ownedDirectory)\n ) {\n throw lockCleanupError(\"Recorder lock ownership changed before release.\");\n }\n const tombstonePath = `${claimPath}.${token}.release`;\n fs.renameSync(directoryPath, tombstonePath);\n if (!renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(ownedDirectory))) {\n throw lockCleanupError(\"Recorder lock release displaced a replacement directory.\");\n }\n removeLockDirectorySync(tombstonePath, directoryIdentity(ownedDirectory));\n ownedDirectories.delete(canonicalLockDirectoryPath(directory));\n } finally {\n try {\n removeLockDirectorySync(coordinationClaim.activePath, coordinationClaim.activeIdentity);\n } catch {\n // Exit cleanup is best-effort; a live coordination claim is safer than an ABA race.\n }\n }\n }) as typeof fs.rmdirSync;\n return lockFs;\n}\n"]}
1
+ {"version":3,"file":"process-owned-lock.js","sourceRoot":"","sources":["../../../src/platform/process-owned-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAgDhE,MAAM,0BAA0B,GAAG,IAAI,GAAG,EAAiC,CAAC;AAC5E,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAC7C,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAAsC,CAAC;AAEnF,MAAM,UAAU,GAAG,qBAAqB,CAAC;AACzC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AACtD,MAAM,4BAA4B,GAAG,sCAAsC,CAAC;AAC5E,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,yBAAyB,GAAG,CAAC,CAAC;AACpC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AACzC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAC1C,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAC/C,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClD,MAAM,6BAA6B,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AACzE,MAAM,0BAA0B,GAAG,UAAU,EAAE,CAAC;AAChD,MAAM,+BAA+B,GAAG,2BAA2B,CAAC;AACpE,MAAM,8BAA8B,GAAG,4BAA4B,CAAC;AACpE,MAAM,2BAA2B,GAAG,gBAAgB,CAAC;AACrD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,KAAK,EAAE,EAAE,CAAC;IACX,CAAC,KAAK,EAAE,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,cAAc,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;SACrB,IAAI,EAAE;SACN,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,uBAAuB,CAAC,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;YACtE,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACpC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAa,EAAE,MAAc;IACjE,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,KAAK;SACrB,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;SACrB,IAAI,EAAE;SACN,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,OAAO,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,gBAAgB,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpG,CAAC;AAED,SAAS,yBAAyB,CAAC,cAAsB,EAAE,QAAgB;IACzE,MAAM,SAAS,GAAG,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,MAAM,WAAW,GACf,oGAAoG,CAAC,IAAI,CACvG,cAAc,CACf,CAAC;IACJ,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,GACxF,WAC0F,CAAC;QAC7F,MAAM,QAAQ,GACZ,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,eAAe,GACnB,IAAI,CAAC,GAAG,CACN,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,CAAC,GAAG,CAAC,EACX,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,MAAM,CAAC,EACd,MAAM,CAAC,MAAM,CAAC,EACd,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,CAClC,GAAG,QAAQ,CAAC;QACf,IAAI,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACjE,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;YACxF,OAAO,UAAU,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,eAAe,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IACD,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACtE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,+BAA+B,CAAC,cAAsB,EAAE,QAAgB;IAC/E,MAAM,SAAS,GAAG,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,MAAM,UAAU,GACd,yGAAyG,CAAC,IAAI,CAC5G,cAAc,CACf,CAAC;IACJ,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACrB,KAAK,EACL,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACtB,CAAC;IACF,OAAO,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC;QACzD,CAAC,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;QAC9E,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,4BAA4B,CACjC,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,EACzC,YAAY,CAAC,iCAAiC,EAAE,MAAM,CAAC,CACxD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,MAAe;YACzB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE;YAC/C,SAAS,EAAE,GAAG,GAAG,IAAI;YACrB,OAAO,EAAE,IAAI;SACd,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;YAC5E,GAAG,OAAO;YACV,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;gBACpD,GAAG,OAAO;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACT,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,aAAa,EAAE,MAAM,KAAK,CAAC;gBAC3B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,QAAQ,GACZ,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa;YACpC,CAAC,CAAC,yBAAyB,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;YAClE,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,QAAQ,KAAK,IAAI,IAAI,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxE,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1F,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YACxD,CAAC,CAAC,+BAA+B,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;YACxE,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,cAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,cAAc,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CACtB,cAAc,EACd;QACE,YAAY;QACZ,iBAAiB;QACjB,UAAU;QACV,oBAAoB,GAAG,kEAAkE;KAC1F,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CACvD,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;QACzD,OAAO,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9E,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,wBAAwB,CAAC,EAAE;YACpF,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;YACpC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,UAAU,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,cAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,cAAc,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CACtB,cAAc,EACd;QACE,YAAY;QACZ,iBAAiB;QACjB,UAAU;QACV,4HAA4H;KAC7H,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CACvD,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClG,CAAC;AAED,IAAI,qBAAyC,CAAC;AAE9C,SAAS,8BAA8B,CAAC,QAAuB;IAC7D,MAAM,WAAW,GAAG,6BAA6B,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC1C,CAAC;IACD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,mBAAwB,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACnC,OAAO,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,MAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,4BAA4B,CAAC,GAAW;IAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,UAAU,GACd,UAAU,GAAG,CAAC;gBACZ,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,WAAW;qBACR,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;qBACrB,IAAI,EAAE;qBACN,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACnF,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC,SAAS,CAAC,EAAE;oBACxD,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC9E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,qBAAqB,GAAG,KAAK,CAAC;YAChC,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,qBAAqB,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,8BAA8B,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB,EAAE,QAAgB;IACnE,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,iCAAiC,CAAC;AAC5E,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,OAAO,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,OAAO,CACL,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/C,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9C,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA0C;IACnE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAuC,EACvC,MAA2C;IAE3C,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC;AAC9F,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,KAAK,UAAU,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,0BAA0B,CACjC,aAA0B,EAC1B,gBAAmC,EACnC,eAAwB;IAExB,IAAI,KAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IACE,CAAC,KAAK,CAAC,WAAW,EAAE;QACpB,KAAK,CAAC,cAAc,EAAE;QACtB,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,KAAK,CAAC;QAClD,CAAC,eAAe,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,EACpE,CAAC;QACD,MAAM,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,+BAA+B,CACtC,aAA0B,EAC1B,gBAAmC,EACnC,eAAwB,EACxB,YAA8C,EAC9C,UAA4C;IAE5C,IAAI,CAAC,0BAA0B,CAAC,aAAa,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,CAAC;QAClF,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,GAAG,UAAU,YAAY,UAAU,EAAE,EAAE,CAAC;IAC/D,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC;IAC3B,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,CAAC;QAC/E,OAAO;IACT,CAAC;IACD,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,CAAC;QACnF,MAAM,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;IACtE,CAAC;IACD,UAAU,EAAE,CAAC,cAAc,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAClE,MAAM,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,gBAAgB,CAAC,qDAAqD,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAClE,MAAM,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;gBACpD,MAAM,gBAAgB,CAAC,iDAAiD,CAAC,CAAC;YAC5E,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QACD,SAAS,CAAC,IAAI,CACZ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,CAC3F,CAAC;QACF,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAClE,MAAM,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;gBACpD,MAAM,gBAAgB,CAAC,yCAAyC,CAAC,CAAC;YACpE,CAAC;YACD,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAClE,MAAM,gBAAgB,CAAC,2CAA2C,CAAC,CAAC;QACtE,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,IAAI,0BAA0B,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBACjE,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;QAClF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,aAA0B;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,IAAI,eAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClG,CAAC;AAED,SAAS,iBAAiB,CAAC,aAA0B,EAAE,UAAkB;IACvE,OAAO,GAAG,0BAA0B,CAAC,aAAa,CAAC,KAAK,UAAU,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,aAA0B,EAAE,WAAW,GAAG,cAAc;IACjF,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC;SAChC,MAAM,CAAC,kBAAkB,CAAC;SAC1B,MAAM,CAAC,IAAI,CAAC;SACZ,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAwC,EACxC,KAAyC;IAEzC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,IAAI,KAAK,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;AAChD,CAAC;AAED,IAAI,4BAAgD,CAAC;AACrD,IAAI,4BAAgD,CAAC;AAErD,SAAS,4BAA4B,CACnC,GAAW,EACX,MAA+C;IAE/C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,yBAAyB,EAAE,OAAO,EAAE,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAW;IAChD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,yBAAyB,EAAE,OAAO,EAAE,EAAE,CAAC;QACrE,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,eAAe,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;QACzF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,SAAS,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAuB,CAAC;IACrE,IACE,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QAC1F,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;QACxB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAC/C,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS;YACpC,KAAK,CAAC,iBAAiB,KAAK,IAAI;YAChC,CAAC,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ;gBAC1C,KAAK,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;gBACpC,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1C,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS;YAClC,KAAK,CAAC,eAAe,KAAK,IAAI;YAC9B,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;gBACxC,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;gBAClC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACxC,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS;YACnC,KAAK,CAAC,gBAAgB,KAAK,IAAI;YAC/B,CAAC,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ;gBACzC,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC/D,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;YAC7B,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;gBACxC,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;gBAClC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,EACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QACnE,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;YAC7B,CAAC,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC;YAC9C,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;gBACrC,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI;oBAC9B,KAAK,CAAC,gBAAgB,KAAK,SAAS;oBACpC,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAClE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QAC5C,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;YAC7B,KAAK,CAAC,eAAe,KAAK,SAAS;YACnC,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAC9D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,CAAC,KAAK,CAAC,iBAAiB,KAAK,IAAI;YAC/B,KAAK,CAAC,iBAAiB,KAAK,SAAS;YACrC,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,EACrD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,KAAK,EAAE;YACL,GAAI,KAAmB;YACvB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;YAClD,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC9C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;SACjD;QACD,aAAa,EAAE,KAAK,CAAC,OAAO;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,aAA0B;IAC5C,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,EAAE,CAAC,QAAQ,CACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,EAC5C,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAC1E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IACD,IAAI,MAA0D,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,GAAG,MAAM;YACT,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC;SACrC,CAAC;AACR,CAAC;AAED,SAAS,sCAAsC,CAC7C,aAAqB,EACrB,aAAqB;IAErB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QACxC,IACE,CAAC,SAAS,CAAC,WAAW,EAAE;YACxB,SAAS,CAAC,cAAc,EAAE;YAC1B,KAAK,KAAK,IAAI;YACd,KAAK,KAAK,SAAS,EACnB,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,yEAAyE;QACzE,4EAA4E;QAC5E,+EAA+E;QAC/E,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;IACnF,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAAmB,EACnB,aAAqB,EACrB,gBAAmC;IAEnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,IACE,OAAO,CAAC,WAAW,EAAE;YACrB,CAAC,OAAO,CAAC,cAAc,EAAE;YACzB,wBAAwB,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACnD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;IAChF,CAAC;IACD,sCAAsC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,aAA0B,EAAE,UAAkB;IAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,sBAAsB,GAAG,MAAM,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,uBAAuB,CAAC,SAA0B;IACzD,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5F,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC1F,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBACpB,MAAM;gBACR,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC;YACtB,CAAC;YACD,OAAO,GAAG,MAAM,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/F,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,2BAA2B,CAAC,aAA0B,EAAE,UAAkB;IACjF,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,wBAAwB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,YAAgC,CAAC;IACrC,IAAI,cAA0C,CAAC;IAC/C,IAAI,CAAC;QACH,YAAY,GAAG,EAAE,CAAC,QAAQ,CACxB,UAAU,EACV,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAC5F,KAAK,CACN,CAAC;QACF,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;QAChD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAC1B,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,QAAQ,CAAC,UAAU,GAAG,MAAM,EAC5B,MAAM,CACP,CAAC;YACF,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,IAAI,OAAO,CAAC;QACpB,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3B,YAAY,GAAG,SAAS,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,IAAI,cAAc,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;oBAC7E,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9F,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;QAC3E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,4BAA4B,CAAC,aAA0B;IAC9D,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,EAAE,CAAC,QAAQ,CACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,EAC5C,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAChD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,GAAG,eAAe,EAAE,CAAC;YACpD,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;gBACzF,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;oBACpB,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACR,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC;YACtB,CAAC;YACD,IAAI,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,GAAG,KAAK,YAAY,WAAW,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAa,CAAC;IAC5F,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;QACpC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI,IAAI,EAAE;KAClB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAa,CAAC;IAC5F,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE;QACpC,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAmC;IACtD,OAAO,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;AACnF,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAmC;IACtE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,0BAA0B,CAAC;AACvE,CAAC;AAED,SAAS,8BAA8B,CAAC,SAA0B,EAAE,MAAmB;IACrF,OAAO,CACL,MAAM,KAAK,YAAY;QACvB,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC;QAC7B,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;YACvC,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,aAAa,IAAI,0BAA0B,CACnE,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,SAA0B,EAC1B,MAAmB,EACnB,KAAmC;IAEnC,OAAO,CACL,MAAM,KAAK,SAAS;QACpB,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,0BAA0B,CAC9D,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,SAA0B,EAC1B,MAAmB,EACnB,KAAmC;IAEnC,OAAO,CACL,MAAM,KAAK,SAAS;QACpB,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC;QAC5B,SAAS,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI;QACxC,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,aAAa,IAAI,0BAA0B;QAClE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,0BAA0B,CAC9D,CAAC;AACJ,CAAC;AASD,SAAS,oBAAoB,CAAC,OAAgC;IAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,qBAAqB,IAAI,mBAAmB,CAAC;IAC5E,IAAI,sBAAqC,CAAC;IAC1C,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAClC,sBAAsB,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,IAAI,4BAA4B,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,eAAe,GAAG,4BAA4B,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAClF,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,4BAA4B,GAAG,eAAe,CAAC;YACjD,CAAC;QACH,CAAC;QACD,sBAAsB,GAAG,4BAA4B,IAAI,IAAI,CAAC;IAChE,CAAC;IACD,IACE,sBAAsB,KAAK,IAAI;QAC/B,CAAC,CAAC,sBAAsB,CAAC,sBAAsB,CAAC;YAC9C,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,sBAAsB,CAAC,sBAAsB,CAAC,CAAC,CAAC,EACrF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,sBAAqC,CAAC;IAC1C,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAClC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,IAAI,4BAA4B,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,eAAe,GAAG,mBAAmB,EAAE,CAAC;YAC9C,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,4BAA4B,GAAG,eAAe,CAAC;YACjD,CAAC;QACH,CAAC;QACD,sBAAsB,GAAG,4BAA4B,IAAI,IAAI,CAAC;IAChE,CAAC;IACD,IAAI,sBAAsB,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,uBAAuB,GAAG,6BAA6B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,uBAAuB,KAAK,IAAI,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAO,GAA4B,EAAE;IACpF,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5B,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC7B,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC5B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,GAC/E,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,cAAc,GAAG,OAAO,CAAC,qBAAqB,IAAI,mBAAmB,CAAC;IAC5E,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,uBAAuB,GAAG,CAC9B,aAA0B,EAC1B,gBAAmC,EACnC,eAAwB,EACxB,UAA4C,EACtC,EAAE;QACR,+BAA+B,CAC7B,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,OAAO,CAAC,sBAAsB,EAC9B,UAAU,CACX,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9D,MAAM,gCAAgC,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9E,IAAI,qBAQS,CAAC;IACd,MAAM,KAAK,GAAc;QACvB,iBAAiB,EAAE,0BAA0B;QAC7C,eAAe,EAAE,sBAAsB;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,eAAe,EAAE,sBAAsB;QACvC,gBAAgB,EAAE,uBAAuB;QACzC,kBAAkB,EAAE,6BAA6B;QACjD,KAAK;QACL,OAAO,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAQ,EAAE;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,WAA+B,CAAC;QACpC,IAAI,cAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,WAAW,GAAG,EAAE,CAAC,QAAQ,CACvB,SAAS,EACT,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAClE,KAAK,CACN,CAAC;YACF,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAC1B,WAAW,EACX,QAAQ,EACR,MAAM,EACN,QAAQ,CAAC,UAAU,GAAG,MAAM,EAC5B,MAAM,CACP,CAAC;gBACF,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC;YACpB,CAAC;YACD,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC1B,WAAW,GAAG,SAAS,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,IAAI,cAAc,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;wBAC7E,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,gEAAgE;gBAClE,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC;oBACP,yDAAyD;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAW,EAAE;QAClD,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,2BAA2B,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,wBAAwB,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9E,4BAA4B,CAAC,GAAG,CAAC,eAAe,EAAE;oBAChD,GAAG,aAAa;oBAChB,kBAAkB,EAAE,KAAK;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;QACtE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAClB,SAA6C,EAC7C,oBAAoB,GAAG,KAAK,EACf,EAAE;QACf,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC9B,IACE,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/E,uBAAuB,CAAC,SAAS,CAAC,EAClC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IACE,KAAK,CAAC,OAAO,IAAI,CAAC;YAClB,KAAK,CAAC,eAAe,KAAK,IAAI;YAC9B,KAAK,CAAC,eAAe,KAAK,sBAAsB,EAChD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,KAAK,CAAC,OAAO,IAAI,CAAC;YAClB,CAAC,KAAK,CAAC,gBAAgB,KAAK,IAAI;gBAC9B,uBAAuB,KAAK,IAAI;gBAChC,KAAK,CAAC,gBAAgB,KAAK,uBAAuB,CAAC,EACrD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;YAC3F,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC3F,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI,IAAI,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpF,IAAI,KAAK,CAAC,eAAe,KAAK,sBAAsB,EAAE,CAAC;oBACrD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,OAAO,KAAK,CAAC,OAAO,KAAK,CAAC;oBACxB,KAAK,CAAC,iBAAiB,KAAK,IAAI;oBAChC,KAAK,CAAC,iBAAiB,KAAK,0BAA0B;oBACtD,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,QAAQ,CAAC;YACf,CAAC;YACD,IAAI,KAAK,CAAC,kBAAkB,KAAK,6BAA6B,EAAE,CAAC;gBAC/D,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,OAAO,KAAK,CAAC,iBAAiB,KAAK,IAAI;gBACrC,KAAK,CAAC,iBAAiB,KAAK,0BAA0B;gBACtD,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,QAAQ,CAAC;QACf,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IACE,oBAAoB;YACpB,CAAC,qBAAqB;YACtB,qBAAqB,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;YACvC,qBAAqB,CAAC,kBAAkB,KAAK,KAAK,CAAC,KAAK;YACxD,GAAG,GAAG,qBAAqB,CAAC,SAAS,IAAI,iBAAiB,EAC1D,CAAC;YACD,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,qBAAqB,GAAG;gBACtB,SAAS,EAAE,GAAG;gBACd,QAAQ,EAAE,gBAAgB;gBAC1B,kBAAkB,EAAE,KAAK,CAAC,KAAK;gBAC/B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,WAAW,EACT,8BAA8B,CAAC,gBAAgB,CAAC;oBAChD,4BAA4B,CAAC,KAAK,CAAC,GAAG,CAAC;aAC1C,CAAC;QACJ,CAAC;QACD,IACE,KAAK,CAAC,eAAe,KAAK,IAAI;YAC9B,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC;YAC7C,CAAC,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,EAC9C,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,qBAAqB,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBACtE,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,yBAAyB,CAAC,KAAK,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,WAAW,CAAC;gBAC3F,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,YAAY,CAAC;QACnB,CAAC;QACD,IAAI,qBAAqB,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,sBAAsB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5F,OAAO,qBAAqB,CAAC,WAAW,KAAK,IAAI;gBAC/C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,WAAW,CAAC;oBACtF,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,YAAY,CAAC;QACrB,CAAC;QACD,OAAO,qBAAqB,CAAC,QAAQ,KAAK,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACtF,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAC1B,SAAiB,EACjB,QAA8E,EACxE,EAAE;QACR,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE;YAClD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,eAA8C,CAAC;gBACnD,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;wBACvD,MAAM,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;oBAClF,CAAC;oBACD,eAAe,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;oBAC7C,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,SAAS,GAAG,0BAA0B,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;oBACzE,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,gBAAgB,CAAC,8DAA8D,CAAC,CAAC;oBACzF,CAAC;oBACD,QAAQ,CAAC,IAAI,EAAE;wBACb,cAAc,EAAE,iBAAiB,CAAC,SAAS,CAAC;wBAC5C,UAAU,EAAE,SAAS;wBACrB,kBAAkB,EAAE,KAAK;wBACzB,eAAe,EAAE,EAAE;qBACpB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,IAAI,eAAe,EAAE,CAAC;wBACpB,IAAI,CAAC;4BACH,uBAAuB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;wBACtD,CAAC;wBAAC,MAAM,CAAC;4BACP,yEAAyE;wBAC3E,CAAC;oBACH,CAAC;oBACD,QAAQ,CAAC,UAAmC,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,mBAAuC,CAAC;YAC5C,IAAI,gBAAiE,CAAC;YACtE,IAAI,wBAA4C,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/D,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC;oBACjE,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;oBACxD,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;oBAC5C,MAAM,KAAK,GAAG,0BAA0B,CACtC,SAAS,EACT,eAAe,EACf,YAAY,CAAC,OAAO,CACrB,CAAC;oBACF,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,gBAAgB,CAAC,6DAA6D,CAAC,CAAC;oBACxF,CAAC;oBACD,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;wBAC1C,MAAM,kBAAkB,GACtB,MAAM,KAAK,SAAS,IAAI,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;wBAClF,MAAM,uBAAuB,GAAG,8BAA8B,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;wBACtF,MAAM,kBAAkB,GACtB,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC;4BACvD,yBAAyB,CAAC,aAAa,EAAE,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;wBACpF,IACE,MAAM,KAAK,MAAM;4BACjB,kBAAkB;4BAClB,uBAAuB;4BACvB,kBAAkB,EAClB,CAAC;4BACD,mBAAmB,GAAG,SAAS,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;4BAC3D,wBAAwB,GAAG,mBAAmB,CAAC;wBACjD,CAAC;oBACH,CAAC;yBAAM,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC9C,wBAAwB,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;wBACnF,mBAAmB,GAAG,GAAG,wBAAwB,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACjG,CAAC;oBACD,IAAI,mBAAmB,EAAE,CAAC;wBACxB,gBAAgB,GAAG;4BACjB,GAAG,iBAAiB,CAAC,KAAK,CAAC;4BAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;yBACvB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;YACD,IAAI,CAAC,mBAAmB,IAAI,CAAC,gBAAgB,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAC3E,QAAQ,CACN,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,EAAE;oBACzE,IAAI,EAAE,SAAS;iBAChB,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YACvE,mBAAmB,CAAC,YAAY,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE;gBACjE,IAAI,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;oBACpC,QAAQ,CACN,aAAa;wBACX,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,EAAE;4BAC/D,IAAI,EAAE,SAAS;yBAChB,CAAC,CACL,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,EAAE;wBACb,cAAc,EAAE,aAAa,CAAC,cAAc;wBAC5C,UAAU,EAAE,aAAa,CAAC,UAAU;wBACpC,kBAAkB,EAAE,aAAa,CAAC,kBAAkB;wBACpD,eAAe,EAAE;4BACf;gCACE,QAAQ,EAAE,gBAAgB;gCAC1B,gBAAgB,EAAE,wBAAwB;gCAC1C,IAAI,EAAE,SAAS;6BAChB;4BACD,GAAG,aAAa,CAAC,eAAe;yBACjC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAC3B,SAAiB,EACjB,KAAoB,EACpB,QAAoB,EACd,EAAE;QACR,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAC9D,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7D,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAClC,MAAM,iBAAiB,GAAG,GAAS,EAAE;YACnC,IAAI,WAAW,GAAiC,IAAI,CAAC;YACrD,IAAI,CAAC;gBACH,uBAAuB,CACrB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,cAAc,EACpB,SAAS,EACT,CAAC,WAAW,EAAE,EAAE;oBACd,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC;gBACjC,CAAC,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,GAAG,KAA8B,CAAC;YAC/C,CAAC;YACD,IAAI,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnD,0BAA0B,CAAC,GAAG,CAAC,eAAe,EAAE;oBAC9C,KAAK;oBACL,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QACF,MAAM,mBAAmB,GAAG,GAAS,EAAE;YACrC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,0BAA0B,CAAC,GAAG,CAAC,eAAe,EAAE;oBAC9C,KAAK;oBACL,eAAe,EAAE,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QACF,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAQ,EAAE;YAC/C,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,OAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,GAAG,0BAA0B,CAClC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,QAAQ,CAAC,OAAO,CAC5B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,mBAAmB,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,qBAAqB,GAAG,IAAI,CAAC;gBAC7B,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC;gBACH,OAAO,GAAG,0BAA0B,CAClC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,QAAQ,CAAC,OAAO,CAC5B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,mBAAmB,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,qBAAqB,GAAG,IAAI,CAAC;gBAC7B,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,MAAM,kBAAkB,GAAG,YAAY;gBACrC,CAAC,CAAC,SAAS,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE;gBACrC,CAAC,CAAC,YAAY,KAAK,SAAS;oBAC1B,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,WAAW,CAAC;YAClB,IAAI,kBAAkB,KAAK,UAAU,CAAC,gBAAgB,EAAE,CAAC;gBACvD,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,mBAAmB,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,uBAAuB,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7F,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,mBAAmB,EAAE,CAAC;oBACtB,OAAO;gBACT,CAAC;gBACD,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,qBAAqB,GAAG,IAAI,CAAC;YAC7B,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC;QACF,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,wBAAwB,GAAG,CAC/B,SAAiB,EACjB,QAA8E,EACxE,EAAE;QACR,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,eAAe,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;gBACjF,QAAQ,CAAC,gBAAgB,CAAC,+DAA+D,CAAC,CAAC,CAAC;gBAC5F,OAAO;YACT,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;YAC1C,IAAI,oBAAoB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,0BAA0B,CACxC,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,cAAc,CAC7B,CAAC;gBACF,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjF,oBAAoB;oBAClB,aAAa,KAAK,SAAS;wBAC3B,aAAa,KAAK,IAAI;wBACtB,aAAa,CAAC,KAAK,CAAC,KAAK,KAAK,aAAa,CAAC,kBAAkB;wBAC9D,WAAW,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB,GAAG,KAAK,CAAC;YAC/B,CAAC;YACD,IAAI,oBAAoB,EAAE,CAAC;gBACzB,IAAI,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACjE,0BAA0B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACrD,CAAC;gBACD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,0BAA0B,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjE,0BAA0B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,mBAAmB,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAc,CAAC;IAC9C,MAAM,CAAC,KAAK,GAAG,CAAC,CACd,aAA0B,EAC1B,QAAuD,EACvD,EAAE;QACF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QACxC,wBAAwB,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE;YACpE,IAAI,UAAU,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrC,QAAQ,CACN,UAAU;oBACR,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE;wBAC7D,IAAI,EAAE,SAAS;qBAChB,CAAC,CACL,CAAC;gBACF,OAAO;YACT,CAAC;YACD,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,iBAAiB,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5E,IAAI,CAAC;4BACH,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;4BAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;4BAC5C,IACE,QAAQ,CAAC,WAAW,EAAE;gCACtB,CAAC,QAAQ,CAAC,cAAc,EAAE;gCAC1B,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,EAC/C,CAAC;gCACD,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;gCAC9D,gCAAgC,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;gCACnF,0BAA0B,CAAC,GAAG,CAAC,eAAe,EAAE;oCAC9C,KAAK,EAAE,iBAAiB;oCACxB,eAAe,EAAE,KAAK;iCACvB,CAAC,CAAC;gCACH,QAAQ,CAAC,KAAK,CAAC,CAAC;gCAChB,OAAO;4BACT,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,wDAAwD;wBAC1D,CAAC;oBACH,CAAC;oBACD,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC1E,OAAO;gBACT,CAAC;gBACD,IAAI,eAA8C,CAAC;gBACnD,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,IAAI,gBAAgB,GAAiC,IAAI,CAAC;gBAC1D,IAAI,CAAC;oBACH,MAAM,gBAAgB,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACvE,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,gBAAgB,CAAC,cAAc,EAAE,EAAE,CAAC;wBACzE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;oBACtE,CAAC;oBACD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;oBAC9D,MAAM,cAAc,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;oBACrD,IACE,cAAc,CAAC,MAAM,GAAG,CAAC;wBACzB,CAAC,0BAA0B,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAC7D,CAAC;wBACD,MAAM,gBAAgB,CAAC,kDAAkD,CAAC,CAAC;oBAC7E,CAAC;oBACD,eAAe,GAAG,iBAAiB,CAAC;oBACpC,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,cAAc,GAAG,IAAI,CAAC;oBACtB,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;oBAClF,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACxB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;oBAC/E,CAAC;oBACD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;oBAChE,OAAO,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;oBAChE,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC;oBAC/E,gCAAgC,CAAC,MAAM,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC;gBACjF,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,gBAAgB,GAAG,UAAmC,CAAC;gBACzD,CAAC;gBACD,IAAI,gBAAgB,EAAE,CAAC;oBACrB,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;wBACtC,IAAI,CAAC;4BACH,IAAI,0BAA0B,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;gCAC3D,YAAY,CAAC,SAAS,CAAC,CAAC;4BAC1B,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,yEAAyE;wBAC3E,CAAC;oBACH,CAAC;yBAAM,IAAI,eAAe,EAAE,CAAC;wBAC3B,IAAI,CAAC;4BACH,uBAAuB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;wBAC1D,CAAC;wBAAC,MAAM,CAAC;4BACP,yEAAyE;wBAC3E,CAAC;oBACH,CAAC;oBACD,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBACrF,OAAO;gBACT,CAAC;gBACD,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAoB,CAAC;IACtB,MAAM,CAAC,IAAI,GAAG,CAAC,CACb,QAAqB,EACrB,QAAyE,EACzE,EAAE;QACF,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACjC,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,MAAM,eAAe,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YAC7D,IAAI,aAAyC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzD,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;oBACvD,aAAa,GAAG,OAAO,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;YACD,IACE,aAAa;gBACb,wBAAwB,CAAC,4BAA4B,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,EAC1F,CAAC;gBACD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAClD,gCAAgC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,iCAAiC,GACrC,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;gBAC/C,aAAa,KAAK,SAAS;gBAC3B,wBAAwB,CACtB,gCAAgC,CAAC,GAAG,CAAC,eAAe,CAAC,EACrD,aAAa,CACd;gBACD,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,0BAA0B,CAAC;YAC3D,MAAM,gCAAgC,GACpC,2BAA2B,CAAC,KAAK,CAAC;gBAClC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9F,MAAM,kBAAkB,GACtB,SAAS,KAAK,SAAS;gBACvB,SAAS,KAAK,IAAI;gBAClB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,kBAAkB,GACtB,SAAS,KAAK,SAAS;gBACvB,SAAS,KAAK,IAAI;gBAClB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACtD,IACE,SAAS;gBACT,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EACzF,CAAC;gBACD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,IAAI,SAAS,IAAI,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpD,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YACD,QAAQ,CACN,IAAI,EACJ,SAAS,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK;gBAC9B,MAAM,KAAK,MAAM;gBACjB,kBAAkB;gBAClB,kBAAkB;gBAClB,iCAAiC;gBACjC,gCAAgC;gBAChC,CAAC,SAAS,KAAK,SAAS;oBACtB,SAAS,KAAK,IAAI;oBAClB,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACpD,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAmB,CAAC;IACrB,MAAM,CAAC,KAAK,GAAG,CAAC,CACd,aAA0B,EAC1B,QAAuD,EACvD,EAAE;QACF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,4BAA4B,CAAC;QAClE,MAAM,iBAAiB,GAAG,GAAS,EAAE;YACnC,wBAAwB,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE;gBACpE,IACE,UAAU,EAAE,IAAI,KAAK,SAAS;oBAC9B,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC;oBACrC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAC5B,CAAC;oBACD,UAAU,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;oBAC7D,OAAO;gBACT,CAAC;gBACD,IAAI,UAAU,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;wBAC1C,YAAY,CAAC,SAAS,CAAC,CAAC;oBAC1B,CAAC;oBACD,QAAQ,CACN,UAAU;wBACR,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE;4BAC7D,IAAI,EAAE,SAAS;yBAChB,CAAC,CACL,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,CAAC,KAAmC,EAAQ,EAAE;oBAC3D,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5E,CAAC,CAAC;gBACF,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;gBAC5C,IAAI,YAA4B,CAAC;gBACjC,IAAI,CAAC;oBACH,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC7D,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC;wBACjE,MAAM,gBAAgB,CAAC,mDAAmD,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,SAAS,GAAG,KAA8B,CAAC;oBACjD,MAAM,CACJ,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC;wBAClE,CAAC,CAAC,gBAAgB,CAAC,iDAAiD,CAAC;wBACrE,CAAC,CAAC,SAAS,CACd,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBAClD,gCAAgC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC3D,CAAC;gBACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC5D,MAAM,sBAAsB,GAAG,wBAAwB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBACrF,IACE,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,sBAAsB,CAAC;oBAC5D,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,CAAC,IAAI,sBAAsB,CAAC,EAC3E,CAAC;oBACD,MAAM,aAAa,GAAG,GAAG,iBAAiB,CAAC,UAAU,IAAI,KAAK,UAAU,CAAC;oBACzE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE,EAAE;wBACtD,IAAI,WAAW,EAAE,CAAC;4BAChB,YAAY,CAAC,SAAS,CAAC,CAAC;4BACxB,MAAM,CAAC,WAAW,CAAC,CAAC;4BACpB,OAAO;wBACT,CAAC;wBACD,IACE,CAAC,uBAAuB,CAAC,aAAa,EAAE,SAAS,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,EACnF,CAAC;4BACD,MAAM,CAAC,gBAAgB,CAAC,0DAA0D,CAAC,CAAC,CAAC;4BACrF,OAAO;wBACT,CAAC;wBACD,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;wBACzC,4BAA4B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;wBACrD,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;wBAC/D,IAAI,CAAC;4BACH,uBAAuB,CAAC,aAAa,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC;4BACxE,MAAM,CAAC,IAAI,CAAC,CAAC;wBACf,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,MAAM,CAAC,KAA8B,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,SAAS,KAAK,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;oBAChE,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,CACJ,MAAM,CAAC,MAAM,CACX,IAAI,KAAK,CAAC,8DAA8D,CAAC,EACzE;wBACE,IAAI,EAAE,SAAS;qBAChB,CACF,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,cAA0C,CAAC;gBAC/C,IAAI,YAAwC,CAAC;gBAC7C,IAAI,oBAAoB,GAAG,KAAK,CAAC;gBACjC,IAAI,iCAAiC,GAAG,KAAK,CAAC;gBAC9C,IAAI,gCAAgC,GAAG,KAAK,CAAC;gBAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;gBACtC,MAAM,uBAAuB,GAC3B,SAAS,KAAK,SAAS;oBACvB,SAAS,KAAK,IAAI;oBAClB,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACpD,MAAM,kBAAkB,GACtB,SAAS,KAAK,SAAS;oBACvB,SAAS,KAAK,IAAI;oBAClB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC7D,MAAM,kBAAkB,GACtB,SAAS,KAAK,SAAS;oBACvB,SAAS,KAAK,IAAI;oBAClB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC7D,IAAI,kBAAkB,EAAE,CAAC;oBACvB,YAAY,GAAG,YAAY,CAAC;gBAC9B,CAAC;gBACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBAClD,cAAc,GAAG,YAAY,CAAC;oBAC9B,oBAAoB,GAAG,wBAAwB,CAC7C,4BAA4B,CAAC,GAAG,CAAC,eAAe,CAAC,EACjD,cAAc,CACf,CAAC;oBACF,iCAAiC;wBAC/B,wBAAwB,CACtB,gCAAgC,CAAC,GAAG,CAAC,eAAe,CAAC,EACrD,cAAc,CACf,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;oBAC9E,gCAAgC;wBAC9B,2BAA2B,CAAC,cAAc,CAAC;4BAC3C,CAAC,SAAS,KAAK,SAAS;gCACtB,CAAC,SAAS,KAAK,IAAI,IAAI,4BAA4B,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAC3E,CAAC;gBACD,IACE,MAAM,KAAK,MAAM;oBACjB,CAAC,kBAAkB;oBACnB,CAAC,kBAAkB;oBACnB,CAAC,uBAAuB;oBACxB,CAAC,oBAAoB;oBACrB,CAAC,iCAAiC;oBAClC,CAAC,gCAAgC,EACjC,CAAC;oBACD,MAAM,CACJ,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,EAAE;wBACrF,IAAI,EAAE,SAAS;qBAChB,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;gBAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;gBACnE,IAAI,cAA0C,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9D,IACE,OAAO,CAAC,WAAW,EAAE;wBACrB,CAAC,OAAO,CAAC,cAAc,EAAE;wBACzB,OAAO,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG;wBAChC,OAAO,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG;wBAChC,OAAO,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO,EACxC,CAAC;wBACD,cAAc,GAAG,OAAO,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,uDAAuD;gBACzD,CAAC;gBACD,IAAI,uBAAuB,GACzB,SAAS,KAAK,SAAS;oBACvB,SAAS,KAAK,IAAI;oBAClB,cAAc,KAAK,SAAS;oBAC5B,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;oBACtC,CAAC,eAAe,KAAK,MAAM;wBACzB,CAAC,kBAAkB;4BACjB,SAAS,KAAK,SAAS;4BACvB,SAAS,KAAK,IAAI;4BAClB,YAAY,KAAK,SAAS;4BAC1B,cAAc,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG;4BACvC,cAAc,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG;4BACvC,cAAc,CAAC,OAAO,KAAK,YAAY,CAAC,OAAO;4BAC/C,yBAAyB,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;wBACxE,CAAC,kBAAkB;4BACjB,SAAS,KAAK,SAAS;4BACvB,SAAS,KAAK,IAAI;4BAClB,yBAAyB,CAAC,SAAS,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;wBACxE,CAAC,SAAS,KAAK,SAAS;4BACtB,SAAS,KAAK,IAAI;4BAClB,8BAA8B,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnE,IAAI,oBAAoB,IAAI,cAAc,EAAE,CAAC;oBAC3C,IAAI,CAAC;wBACH,uBAAuB;4BACrB,cAAc,KAAK,SAAS;gCAC5B,wBAAwB,CACtB,4BAA4B,CAAC,GAAG,CAAC,eAAe,CAAC,EACjD,cAAc,CACf,CAAC;oBACN,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB,GAAG,KAAK,CAAC;oBAClC,CAAC;gBACH,CAAC;gBACD,IAAI,iCAAiC,IAAI,cAAc,EAAE,CAAC;oBACxD,IAAI,CAAC;wBACH,uBAAuB;4BACrB,cAAc,KAAK,SAAS;gCAC5B,SAAS,KAAK,SAAS;gCACvB,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gCACzC,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gCACzC,cAAc,CAAC,OAAO,KAAK,cAAc,CAAC,OAAO;gCACjD,wBAAwB,CACtB,gCAAgC,CAAC,GAAG,CAAC,eAAe,CAAC,EACrD,cAAc,CACf;gCACD,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;oBAC3E,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB,GAAG,KAAK,CAAC;oBAClC,CAAC;gBACH,CAAC;gBACD,IAAI,gCAAgC,IAAI,cAAc,EAAE,CAAC;oBACvD,IAAI,CAAC;wBACH,uBAAuB;4BACrB,cAAc,KAAK,SAAS;gCAC5B,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC;gCACxE,CAAC,SAAS,KAAK,IAAI,IAAI,4BAA4B,CAAC,aAAa,CAAC,CAAC;gCACnE,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gCACzC,cAAc,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gCACzC,cAAc,CAAC,OAAO,KAAK,cAAc,CAAC,OAAO;gCACjD,2BAA2B,CAAC,cAAc,CAAC,CAAC;oBAChD,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB,GAAG,KAAK,CAAC;oBAClC,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC7B,MAAM,CACJ,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,EAAE;wBACvE,IAAI,EAAE,SAAS;qBAChB,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,MAAM,aAAa,GAAG,GAAG,iBAAiB,CAAC,UAAU,IAAI,KAAK,OAAO,CAAC;gBACtE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE,EAAE;oBACtD,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,CAAC,WAAW,CAAC,CAAC;wBACpB,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,SAAS,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;wBACxF,MAAM,CAAC,gBAAgB,CAAC,2DAA2D,CAAC,CAAC,CAAC;wBACtF,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC;wBACH,uBAAuB,CAAC,aAAa,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC;wBACxE,IAAI,SAAS,EAAE,CAAC;4BACd,kBAAkB,CAAC,MAAM,CACvB,iBAAiB,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAClE,CAAC;wBACJ,CAAC;wBACD,gCAAgC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;wBACzD,MAAM,iBAAiB,GAAG,4BAA4B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBAC5E,IAAI,iBAAiB,EAAE,CAAC;4BACtB,kBAAkB,CAAC,MAAM,CACvB,iBAAiB,CAAC,SAAS,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,CACnE,CAAC;4BACF,4BAA4B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;wBACvD,CAAC;wBACD,0BAA0B,CAAC,GAAG,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE;4BACpE,KAAK,EAAE,iBAAiB;4BACxB,eAAe,EAAE,KAAK;yBACvB,CAAC,CAAC;wBACH,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACjB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,KAA8B,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,iBAAiB,EAAE,CAAC;IACtB,CAAC,CAAoB,CAAC;IACtB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,aAA0B,EAAE,EAAE;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC;YACjE,MAAM,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,iBAAiB,GAAkB;YACvC,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC;YAC/C,UAAU,EAAE,SAAS;YACrB,kBAAkB,EAAE,KAAK;YACzB,eAAe,EAAE,EAAE;SACpB,CAAC;QACF,IAAI,CAAC;YACH,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7E,MAAM,gBAAgB,CAAC,8DAA8D,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAI,SAAS,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACrC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,EAAE;oBAC5E,IAAI,EAAE,SAAS;iBAChB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC;YAClF,MAAM,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,IACE,CAAC,cAAc,CAAC,WAAW,EAAE;gBAC7B,cAAc,CAAC,cAAc,EAAE;gBAC/B,CAAC,wBAAwB,CAAC,aAAa,EAAE,cAAc,CAAC,EACxD,CAAC;gBACD,MAAM,gBAAgB,CAAC,iDAAiD,CAAC,CAAC;YAC5E,CAAC;YACD,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,KAAK,UAAU,CAAC;YACtD,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;gBAC1F,MAAM,gBAAgB,CAAC,0DAA0D,CAAC,CAAC;YACrF,CAAC;YACD,uBAAuB,CAAC,aAAa,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC;YAC1E,gBAAgB,CAAC,MAAM,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,uBAAuB,CAAC,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAC1F,CAAC;YAAC,MAAM,CAAC;gBACP,oFAAoF;YACtF,CAAC;QACH,CAAC;IACH,CAAC,CAAwB,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport fs, { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\nimport { resolveWindowsPowerShellPath } from \"./windows-acl.js\";\n\ntype LockOwner = {\n executionIdentity: string | null;\n machineIdentity: string | null;\n pid: number;\n processIdentity: string | null;\n processNamespace: string | null;\n processStartedAtMs: number;\n token: string;\n version: 1 | 2 | 3 | 4;\n};\n\ntype OwnerStatus = \"active\" | \"dead\" | \"foreign\" | \"superseded\" | \"unknown\";\n\ntype ParsedLockOwner = {\n lockDirectory: string;\n owner: LockOwner;\n publishedAtMs: number;\n};\n\ntype RecoveryClaim = {\n activeIdentity: DirectoryIdentity;\n activePath: string;\n ownerGenerationKey: string;\n supersededPaths: SupersededRecoveryClaim[];\n};\n\ntype DirectoryIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\ntype SupersededRecoveryClaim = {\n identity: DirectoryIdentity & { mtimeMs: bigint };\n ownerFingerprint: string;\n path: string;\n};\n\ntype RetainedRecoveryClaim = {\n claim: RecoveryClaim;\n retainedByToken: string;\n};\n\ntype AbandonedDirectoryIdentity = DirectoryIdentity & {\n ownerGenerationKey: string;\n};\n\nconst retainedCoordinationClaims = new Map<string, RetainedRecoveryClaim>();\nconst abandonedOwnerKeys = new Set<string>();\nconst abandonedDirectoryIdentities = new Map<string, AbandonedDirectoryIdentity>();\n\nconst OWNER_FILE = \"crabline-owner.json\";\nconst ABANDONED_OWNER_PREFIX = \".crabline-abandoned-\";\nconst ABANDONED_OWNER_NAME_PATTERN = /^\\.crabline-abandoned-[0-9a-f]{64}$/u;\nconst MAX_OWNER_BYTES = 4096;\nconst MAX_PROCESS_ID = 2_147_483_647;\nconst IDENTITY_CACHE_MS = 1000;\nconst CURRENT_IDENTITY_ATTEMPTS = 3;\nconst COORDINATION_RELEASE_RETRY_MS = 10;\nconst COORDINATION_RELEASE_WAIT_MS = 5000;\nconst LEGACY_PROCESS_START_TOLERANCE_MS = 2000;\nconst OWNERLESS_LOCK_RECOVERY_MS = 10 * 60 * 1000;\nconst CURRENT_PROCESS_STARTED_AT_MS = Math.trunc(performance.timeOrigin);\nconst CURRENT_EXECUTION_IDENTITY = randomUUID();\nconst DARWIN_PRECISE_IDENTITY_PATTERN = /^darwin:\\d+\\.\\d+:us:\\d+$/u;\nconst DARWIN_COARSE_IDENTITY_PATTERN = /^darwin:\\d+\\.\\d+:s:(\\d+)$/u;\nconst LINUX_PID_NAMESPACE_PATTERN = /^pid:\\[\\d+\\]$/u;\nconst DARWIN_MONTHS = new Map([\n [\"Jan\", 0],\n [\"Feb\", 1],\n [\"Mar\", 2],\n [\"Apr\", 3],\n [\"May\", 4],\n [\"Jun\", 5],\n [\"Jul\", 6],\n [\"Aug\", 7],\n [\"Sep\", 8],\n [\"Oct\", 9],\n [\"Nov\", 10],\n [\"Dec\", 11],\n]);\n\nfunction isValidProcessId(pid: number): boolean {\n return Number.isSafeInteger(pid) && pid > 0 && pid <= MAX_PROCESS_ID;\n}\n\nfunction isProcessAlive(pid: number): boolean {\n if (!isValidProcessId(pid)) {\n return false;\n }\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nexport function isDeadLinuxProcessState(value: string): boolean {\n const commandEnd = value.lastIndexOf(\") \");\n if (commandEnd < 0) {\n return false;\n }\n const state = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[0];\n return state === \"Z\" || state === \"X\" || state === \"x\";\n}\n\nfunction isDefunctProcess(pid: number): boolean {\n if (process.platform === \"linux\") {\n try {\n return isDeadLinuxProcessState(readFileSync(`/proc/${pid}/stat`, \"utf8\"));\n } catch {\n return false;\n }\n }\n if (process.platform === \"darwin\") {\n const result = spawnSync(\"/bin/ps\", [\"-o\", \"stat=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env: { ...process.env, LC_ALL: \"C\" },\n timeout: 1000,\n });\n return result.status === 0 && /^Z/u.test(result.stdout.trim());\n }\n return false;\n}\n\nfunction processIdentityFromLinuxStat(value: string, bootId: string): string | null {\n const normalizedBootId = bootId.trim();\n if (!/^[0-9a-f-]{16,64}$/iu.test(normalizedBootId)) {\n return null;\n }\n const commandEnd = value.lastIndexOf(\") \");\n if (commandEnd < 0) {\n return null;\n }\n const startTicks = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[19];\n return startTicks && /^\\d+$/u.test(startTicks) ? `linux:${normalizedBootId}:${startTicks}` : null;\n}\n\nfunction processIdentityFromDarwin(processDetails: string, bootTime: string): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const launchMatch =\n /^Launch Time:\\s*(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3,6}) ([+-])(\\d{2})(\\d{2})$/mu.exec(\n processDetails,\n );\n if (!bootMatch) {\n return null;\n }\n if (launchMatch) {\n const [, year, month, day, hour, minute, second, fraction, sign, offsetHour, offsetMinute] =\n launchMatch as RegExpExecArray &\n [string, string, string, string, string, string, string, string, string, string, string];\n const offsetMs =\n (Number(offsetHour) * 60 + Number(offsetMinute)) * 60_000 * (sign === \"+\" ? 1 : -1);\n const fractionMicros = Number(fraction.padEnd(6, \"0\"));\n const utcMilliseconds =\n Date.UTC(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour),\n Number(minute),\n Number(second),\n Math.floor(fractionMicros / 1000),\n ) - offsetMs;\n if (Number.isSafeInteger(utcMilliseconds) && utcMilliseconds > 0) {\n const startedAtMicros = BigInt(utcMilliseconds) * 1000n + BigInt(fractionMicros % 1000);\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:us:${startedAtMicros}`;\n }\n }\n const normalizedDetails = processDetails.trim().replace(/\\s+/gu, \" \");\n if (normalizedDetails.length === 0 || normalizedDetails.length > 64) {\n return null;\n }\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:${normalizedDetails}`;\n}\n\nfunction coarseProcessIdentityFromDarwin(processDetails: string, bootTime: string): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const startMatch =\n /^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\s+([A-Z][a-z]{2})\\s+(\\d{1,2})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(\\d{4})\\s*$/u.exec(\n processDetails,\n );\n const month = DARWIN_MONTHS.get(startMatch?.[1] ?? \"\");\n if (!bootMatch || !startMatch || month === undefined) {\n return null;\n }\n const startedAtMs = Date.UTC(\n Number(startMatch[6]),\n month,\n Number(startMatch[2]),\n Number(startMatch[3]),\n Number(startMatch[4]),\n Number(startMatch[5]),\n );\n return Number.isSafeInteger(startedAtMs) && startedAtMs > 0\n ? `darwin:${bootMatch[1]}.${bootMatch[2]}:s:${Math.trunc(startedAtMs / 1000)}`\n : null;\n}\n\nfunction readProcessIdentity(pid: number): string | null {\n if (process.platform === \"linux\") {\n try {\n return processIdentityFromLinuxStat(\n readFileSync(`/proc/${pid}/stat`, \"utf8\"),\n readFileSync(\"/proc/sys/kernel/random/boot_id\", \"utf8\"),\n );\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n const options = {\n encoding: \"utf8\" as const,\n env: { ...process.env, LC_ALL: \"C\", TZ: \"UTC\" },\n maxBuffer: 512 * 1024,\n timeout: 1000,\n };\n const bootTime = spawnSync(\"/usr/sbin/sysctl\", [\"-n\", \"kern.boottime\"], options);\n const preciseDetails = spawnSync(\"/usr/bin/vmmap\", [\"-summary\", String(pid)], {\n ...options,\n timeout: 3000,\n });\n const sampleDetails =\n preciseDetails.status === 0\n ? undefined\n : spawnSync(\"/usr/bin/sample\", [String(pid), \"1\", \"1\"], {\n ...options,\n timeout: 3000,\n });\n const nativeDetails =\n preciseDetails.status === 0\n ? preciseDetails\n : sampleDetails?.status === 0\n ? sampleDetails\n : undefined;\n const identity =\n bootTime.status === 0 && nativeDetails\n ? processIdentityFromDarwin(nativeDetails.stdout, bootTime.stdout)\n : null;\n if (identity !== null && DARWIN_PRECISE_IDENTITY_PATTERN.test(identity)) {\n return identity;\n }\n const coarseDetails = spawnSync(\"/bin/ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], options);\n return bootTime.status === 0 && coarseDetails.status === 0\n ? coarseProcessIdentityFromDarwin(coarseDetails.stdout, bootTime.stdout)\n : null;\n }\n if (process.platform !== \"win32\") {\n return null;\n }\n let powershellPath: string;\n try {\n powershellPath = resolveWindowsPowerShellPath(process.env.SystemRoot);\n } catch {\n return null;\n }\n const result = spawnSync(\n powershellPath,\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks.ToString()`,\n ],\n { encoding: \"utf8\", timeout: 1000, windowsHide: true },\n );\n const ticks = result.status === 0 ? result.stdout.trim() : \"\";\n return /^\\d+$/u.test(ticks) ? `windows:${ticks}` : null;\n}\n\nfunction readProcessNamespace(pid: number): string | null {\n if (process.platform !== \"linux\") {\n return null;\n }\n try {\n const namespace = fs.readlinkSync(`/proc/${pid}/ns/pid`);\n return LINUX_PID_NAMESPACE_PATTERN.test(namespace) ? namespace : null;\n } catch {\n return null;\n }\n}\n\nfunction readMachineIdentity(): string | null {\n if (process.platform === \"linux\") {\n try {\n const bootId = readFileSync(\"/proc/sys/kernel/random/boot_id\", \"utf8\").trim();\n return /^[0-9a-f-]{16,64}$/iu.test(bootId) ? `linux:${bootId}` : null;\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n const result = spawnSync(\"/usr/sbin/ioreg\", [\"-rd1\", \"-c\", \"IOPlatformExpertDevice\"], {\n encoding: \"utf8\",\n env: { ...process.env, LC_ALL: \"C\" },\n timeout: 1000,\n });\n const platformUuid = /\"IOPlatformUUID\"\\s*=\\s*\"([^\"]+)\"/u.exec(result.stdout)?.[1];\n return result.status === 0 && platformUuid ? `darwin:${platformUuid.toLowerCase()}` : null;\n }\n if (process.platform !== \"win32\") {\n return null;\n }\n let powershellPath: string;\n try {\n powershellPath = resolveWindowsPowerShellPath(process.env.SystemRoot);\n } catch {\n return null;\n }\n const result = spawnSync(\n powershellPath,\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"(Get-ItemProperty -LiteralPath 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Cryptography' -Name MachineGuid -ErrorAction Stop).MachineGuid\",\n ],\n { encoding: \"utf8\", timeout: 1000, windowsHide: true },\n );\n const machineGuid = result.status === 0 ? result.stdout.trim() : \"\";\n return /^[0-9a-f-]{16,64}$/iu.test(machineGuid) ? `windows:${machineGuid.toLowerCase()}` : null;\n}\n\nlet cachedLinuxClockTicks: number | undefined;\n\nfunction processStartedAtMsFromIdentity(identity: string | null): number | null {\n const darwinStart = /^darwin:\\d+\\.\\d+:us:(\\d+)$/u.exec(identity ?? \"\")?.[1];\n if (darwinStart) {\n return Number(BigInt(darwinStart) / 1000n);\n }\n const coarseDarwinStart = DARWIN_COARSE_IDENTITY_PATTERN.exec(identity ?? \"\")?.[1];\n if (coarseDarwinStart) {\n return Number(coarseDarwinStart) * 1000;\n }\n const windowsStart = /^windows:(\\d+)$/u.exec(identity ?? \"\")?.[1];\n if (windowsStart) {\n const unixEpochTicks = 621_355_968_000_000_000n;\n const ticks = BigInt(windowsStart);\n return ticks >= unixEpochTicks ? Number((ticks - unixEpochTicks) / 10_000n) : null;\n }\n return null;\n}\n\nfunction readLegacyProcessStartedAtMs(pid: number): number | null {\n if (process.platform === \"linux\") {\n try {\n const processStat = readFileSync(`/proc/${pid}/stat`, \"utf8\");\n const commandEnd = processStat.lastIndexOf(\") \");\n const startTicks =\n commandEnd < 0\n ? undefined\n : processStat\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[19];\n const bootTime = /^btime\\s+(\\d+)$/mu.exec(readFileSync(\"/proc/stat\", \"utf8\"))?.[1];\n if (!startTicks || !/^\\d+$/u.test(startTicks) || !bootTime) {\n return null;\n }\n if (cachedLinuxClockTicks === undefined) {\n const result = spawnSync(\"/usr/bin/getconf\", [\"CLK_TCK\"], {\n encoding: \"utf8\",\n timeout: 1000,\n });\n const ticks = result.status === 0 ? Number(result.stdout.trim()) : Number.NaN;\n if (!Number.isSafeInteger(ticks) || ticks <= 0) {\n return null;\n }\n cachedLinuxClockTicks = ticks;\n }\n return Number(bootTime) * 1000 + (Number(startTicks) * 1000) / cachedLinuxClockTicks;\n } catch {\n return null;\n }\n }\n return processStartedAtMsFromIdentity(readProcessIdentity(pid));\n}\n\nfunction legacyProcessStartMatches(expected: number, observed: number): boolean {\n return Math.abs(expected - observed) <= LEGACY_PROCESS_START_TOLERANCE_MS;\n}\n\nfunction isCoarseDarwinIdentity(identity: string): boolean {\n return DARWIN_COARSE_IDENTITY_PATTERN.test(identity);\n}\n\nfunction isExactProcessIdentity(identity: string): boolean {\n return (\n /^linux:[0-9a-f-]{16,64}:\\d+$/iu.test(identity) ||\n DARWIN_PRECISE_IDENTITY_PATTERN.test(identity) ||\n /^windows:\\d+$/u.test(identity)\n );\n}\n\nfunction directoryIdentity(stats: Pick<fs.BigIntStats, \"dev\" | \"ino\">): DirectoryIdentity {\n return { dev: stats.dev, ino: stats.ino };\n}\n\nfunction directoryIdentityMatches(\n expected: DirectoryIdentity | undefined,\n actual: Pick<fs.BigIntStats, \"dev\" | \"ino\">,\n): boolean {\n return expected !== undefined && expected.dev === actual.dev && expected.ino === actual.ino;\n}\n\nfunction lockCleanupError(message: string): NodeJS.ErrnoException {\n return Object.assign(new Error(message), { code: \"ELOCKED\" });\n}\n\nfunction isLockArtifactName(name: string): boolean {\n return name === OWNER_FILE || ABANDONED_OWNER_NAME_PATTERN.test(name);\n}\n\nfunction verifiedLockDirectoryStats(\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n): fs.BigIntStats | undefined {\n let stats: fs.BigIntStats;\n try {\n stats = fs.lstatSync(directoryPath, { bigint: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n if (\n !stats.isDirectory() ||\n stats.isSymbolicLink() ||\n !directoryIdentityMatches(expectedIdentity, stats) ||\n (expectedMtimeMs !== undefined && stats.mtimeMs !== expectedMtimeMs)\n ) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n return stats;\n}\n\nfunction removeVerifiedLockDirectorySync(\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n beforeRemove?: (directoryPath: string) => void,\n afterClaim?: (directoryPath: string) => void,\n): void {\n if (!verifiedLockDirectoryStats(directoryPath, expectedIdentity, expectedMtimeMs)) {\n return;\n }\n const sourcePath = String(directoryPath);\n const quarantinePath = `${sourcePath}.cleanup.${randomUUID()}`;\n beforeRemove?.(sourcePath);\n if (!verifiedLockDirectoryStats(sourcePath, expectedIdentity, expectedMtimeMs)) {\n return;\n }\n fs.renameSync(directoryPath, quarantinePath);\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity, expectedMtimeMs)) {\n throw lockCleanupError(\"Recorder lock cleanup target disappeared.\");\n }\n afterClaim?.(quarantinePath);\n try {\n const entries = fs.readdirSync(quarantinePath);\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifacts: string[] = [];\n for (const entry of entries) {\n if (!isLockArtifactName(entry)) {\n throw lockCleanupError(\"Recorder lock cleanup found an unexpected artifact.\");\n }\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifactPath = path.join(quarantinePath, entry);\n const artifact = fs.lstatSync(artifactPath, { bigint: true });\n if (!artifact.isFile() || artifact.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock cleanup found an unsafe artifact.\");\n }\n artifacts.push(artifactPath);\n }\n artifacts.sort(\n (left, right) =>\n Number(path.basename(left) === OWNER_FILE) - Number(path.basename(right) === OWNER_FILE),\n );\n for (const artifactPath of artifacts) {\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifact = fs.lstatSync(artifactPath, { bigint: true });\n if (!artifact.isFile() || artifact.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock cleanup artifact changed.\");\n }\n fs.unlinkSync(artifactPath);\n }\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target disappeared.\");\n }\n fs.rmdirSync(quarantinePath);\n } catch (error) {\n try {\n if (verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n fs.utimesSync(quarantinePath, new Date(0), new Date(0));\n }\n } catch {\n // Do not mutate a replacement directory after cleanup loses its identity fence.\n }\n throw error;\n }\n}\n\nfunction canonicalLockDirectoryPath(directoryPath: fs.PathLike): string {\n const resolved = path.resolve(String(directoryPath));\n let canonicalParent: string;\n try {\n canonicalParent = fs.realpathSync.native(path.dirname(resolved));\n } catch {\n canonicalParent = path.dirname(resolved);\n }\n const canonical = path.join(canonicalParent, path.basename(resolved));\n return process.platform === \"win32\" ? path.win32.normalize(canonical).toLowerCase() : canonical;\n}\n\nfunction abandonedOwnerKey(directoryPath: fs.PathLike, ownerToken: string): string {\n return `${canonicalLockDirectoryPath(directoryPath)}\\0${ownerToken}`;\n}\n\nfunction recoveryClaimPath(directoryPath: fs.PathLike, fingerprint = \"coordination\"): string {\n const canonicalDirectory = canonicalLockDirectoryPath(directoryPath);\n const digest = createHash(\"sha256\")\n .update(canonicalDirectory)\n .update(\"\\0\")\n .update(fingerprint)\n .digest(\"hex\");\n return path.join(path.dirname(canonicalDirectory), `.crabline-reclaim-${digest}`);\n}\n\nfunction lockOwnerMatches(\n left: ParsedLockOwner | null | undefined,\n right: ParsedLockOwner | null | undefined,\n): boolean {\n if (!left || !right) {\n return left === right;\n }\n return left.owner.token === right.owner.token;\n}\n\nlet cachedCurrentProcessIdentity: string | undefined;\nlet cachedCurrentMachineIdentity: string | undefined;\n\nfunction readProcessIdentityWithRetry(\n pid: number,\n reader: (candidatePid: number) => string | null,\n): string | null {\n for (let attempt = 0; attempt < CURRENT_IDENTITY_ATTEMPTS; attempt++) {\n const identity = reader(pid);\n if (identity !== null) {\n return identity;\n }\n }\n return null;\n}\n\nfunction readProcessNamespaceWithRetry(pid: number): string | null {\n for (let attempt = 0; attempt < CURRENT_IDENTITY_ATTEMPTS; attempt++) {\n const namespace = readProcessNamespace(pid);\n if (namespace !== null) {\n return namespace;\n }\n }\n return null;\n}\n\nfunction parseOpenedOwner(ownerHandle: number): Omit<ParsedLockOwner, \"lockDirectory\"> | undefined {\n const stats = fs.fstatSync(ownerHandle);\n if (!stats.isFile() || stats.size === 0 || stats.size > MAX_OWNER_BYTES) {\n return undefined;\n }\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(ownerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n return undefined;\n }\n offset += bytesRead;\n }\n const value = JSON.parse(raw.toString(\"utf8\")) as Partial<LockOwner>;\n if (\n (value.version !== 1 && value.version !== 2 && value.version !== 3 && value.version !== 4) ||\n !isValidProcessId(value.pid ?? 0) ||\n typeof value.token !== \"string\" ||\n value.token.length === 0 ||\n value.token.length > 128 ||\n !Number.isSafeInteger(value.processStartedAtMs) ||\n (value.executionIdentity !== undefined &&\n value.executionIdentity !== null &&\n (typeof value.executionIdentity !== \"string\" ||\n value.executionIdentity.length === 0 ||\n value.executionIdentity.length > 128)) ||\n (value.machineIdentity !== undefined &&\n value.machineIdentity !== null &&\n (typeof value.machineIdentity !== \"string\" ||\n value.machineIdentity.length === 0 ||\n value.machineIdentity.length > 256)) ||\n (value.processNamespace !== undefined &&\n value.processNamespace !== null &&\n (typeof value.processNamespace !== \"string\" ||\n !LINUX_PID_NAMESPACE_PATTERN.test(value.processNamespace))) ||\n (value.processIdentity !== null &&\n (typeof value.processIdentity !== \"string\" ||\n value.processIdentity.length === 0 ||\n value.processIdentity.length > 256))\n ) {\n return undefined;\n }\n if (\n (value.version === 2 || value.version === 3 || value.version === 4) &&\n (value.processIdentity === null ||\n !isExactProcessIdentity(value.processIdentity) ||\n (/^linux:/u.test(value.processIdentity) &&\n (value.processNamespace === null ||\n value.processNamespace === undefined ||\n !LINUX_PID_NAMESPACE_PATTERN.test(value.processNamespace))))\n ) {\n return undefined;\n }\n if (\n (value.version === 3 || value.version === 4) &&\n (value.machineIdentity === null ||\n value.machineIdentity === undefined ||\n !/^(darwin|linux|windows):.+$/u.test(value.machineIdentity))\n ) {\n return undefined;\n }\n if (\n value.version === 4 &&\n (value.executionIdentity === null ||\n value.executionIdentity === undefined ||\n !/^[0-9a-f-]{36}$/iu.test(value.executionIdentity))\n ) {\n return undefined;\n }\n return {\n owner: {\n ...(value as LockOwner),\n executionIdentity: value.executionIdentity ?? null,\n machineIdentity: value.machineIdentity ?? null,\n processNamespace: value.processNamespace ?? null,\n },\n publishedAtMs: stats.mtimeMs,\n };\n}\n\nfunction parseOwner(lockDirectory: fs.PathLike): ParsedLockOwner | null | undefined {\n let ownerHandle: number;\n try {\n ownerHandle = fs.openSync(\n path.join(String(lockDirectory), OWNER_FILE),\n fs.constants.O_RDONLY | fs.constants.O_NONBLOCK | fs.constants.O_NOFOLLOW,\n );\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\" ? undefined : null;\n }\n let parsed: Omit<ParsedLockOwner, \"lockDirectory\"> | undefined;\n try {\n parsed = parseOpenedOwner(ownerHandle);\n } catch {\n parsed = undefined;\n }\n try {\n fs.closeSync(ownerHandle);\n } catch {\n return null;\n }\n return parsed === undefined\n ? null\n : {\n ...parsed,\n lockDirectory: String(lockDirectory),\n };\n}\n\nfunction restoreDisplacedPublishedLockDirectory(\n displacedPath: string,\n lockDirectory: string,\n): void {\n try {\n const displaced = fs.lstatSync(displacedPath, { bigint: true });\n const owner = parseOwner(displacedPath);\n if (\n !displaced.isDirectory() ||\n displaced.isSymbolicLink() ||\n owner === null ||\n owner === undefined\n ) {\n return;\n }\n } catch {\n return;\n }\n try {\n fs.lstatSync(lockDirectory);\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n return;\n }\n }\n try {\n // The coordination claim excludes compliant publishers. If an unexpected\n // published directory races this restore, its owner file makes it nonempty,\n // so rename refuses to replace it and the displaced directory stays preserved.\n fs.renameSync(displacedPath, lockDirectory);\n } catch {\n // Preserve the displaced directory at its claim-local path if restoration races.\n }\n}\n\nfunction renamedDirectoryMatches(\n claimedPath: string,\n lockDirectory: string,\n expectedIdentity: DirectoryIdentity,\n): boolean {\n try {\n const claimed = fs.lstatSync(claimedPath, { bigint: true });\n if (\n claimed.isDirectory() &&\n !claimed.isSymbolicLink() &&\n directoryIdentityMatches(expectedIdentity, claimed)\n ) {\n return true;\n }\n } catch {\n // Restore or preserve any directory displaced after the final identity check.\n }\n restoreDisplacedPublishedLockDirectory(claimedPath, lockDirectory);\n return false;\n}\n\nfunction abandonedOwnerMarkerPath(lockDirectory: fs.PathLike, ownerToken: string): string {\n const digest = createHash(\"sha256\").update(ownerToken).digest(\"hex\");\n return path.join(String(lockDirectory), `${ABANDONED_OWNER_PREFIX}${digest}`);\n}\n\nfunction hasAbandonedOwnerMarker(candidate: ParsedLockOwner): boolean {\n const markerPath = abandonedOwnerMarkerPath(candidate.lockDirectory, candidate.owner.token);\n let markerHandle: number;\n try {\n markerHandle = fs.openSync(markerPath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);\n } catch {\n return false;\n }\n let matches = false;\n try {\n const stats = fs.fstatSync(markerHandle);\n if (stats.isFile() && stats.size > 0 && stats.size <= 256) {\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(markerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n break;\n }\n offset += bytesRead;\n }\n matches = offset === raw.byteLength && raw.toString(\"utf8\").trim() === candidate.owner.token;\n }\n } catch {\n matches = false;\n }\n try {\n fs.closeSync(markerHandle);\n } catch {\n return false;\n }\n return matches;\n}\n\nfunction publishAbandonedOwnerMarker(lockDirectory: fs.PathLike, ownerToken: string): boolean {\n const candidate = parseOwner(lockDirectory);\n if (!candidate || candidate.owner.token !== ownerToken) {\n return false;\n }\n const markerPath = abandonedOwnerMarkerPath(lockDirectory, ownerToken);\n let markerHandle: number | undefined;\n let markerIdentity: fs.BigIntStats | undefined;\n try {\n markerHandle = fs.openSync(\n markerPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW,\n 0o600,\n );\n markerIdentity = fs.fstatSync(markerHandle, { bigint: true });\n const contents = Buffer.from(`${ownerToken}\\n`);\n let offset = 0;\n while (offset < contents.byteLength) {\n const written = fs.writeSync(\n markerHandle,\n contents,\n offset,\n contents.byteLength - offset,\n offset,\n );\n if (written === 0) {\n throw new Error(\"Recorder lock abandonment publication made no progress.\");\n }\n offset += written;\n }\n fs.fsyncSync(markerHandle);\n fs.closeSync(markerHandle);\n markerHandle = undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return hasAbandonedOwnerMarker(candidate);\n }\n if (markerIdentity !== undefined) {\n try {\n const current = fs.lstatSync(markerPath, { bigint: true });\n if (markerIdentity.dev === current.dev && markerIdentity.ino === current.ino) {\n fs.unlinkSync(markerPath);\n }\n } catch {\n // Preserve a replacement marker that cannot be proven to be ours.\n }\n }\n return false;\n } finally {\n if (markerHandle !== undefined) {\n try {\n fs.closeSync(markerHandle);\n } catch {\n // The failed abandonment publication remains non-authoritative.\n }\n }\n }\n const refreshed = parseOwner(lockDirectory);\n if (!refreshed || refreshed.owner.token !== ownerToken || !hasAbandonedOwnerMarker(refreshed)) {\n try {\n fs.unlinkSync(markerPath);\n } catch {\n // A changed marker is ignored unless it matches the current owner token.\n }\n return false;\n }\n return true;\n}\n\nfunction hasRecoverableMalformedOwner(lockDirectory: fs.PathLike): boolean {\n let ownerHandle: number;\n try {\n ownerHandle = fs.openSync(\n path.join(String(lockDirectory), OWNER_FILE),\n fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW,\n );\n } catch {\n return false;\n }\n let recoverable = false;\n try {\n const stats = fs.fstatSync(ownerHandle);\n if (!stats.isFile() || stats.size > MAX_OWNER_BYTES) {\n recoverable = false;\n } else if (stats.size === 0) {\n recoverable = true;\n } else {\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(ownerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n recoverable = true;\n break;\n }\n offset += bytesRead;\n }\n if (offset === raw.byteLength) {\n JSON.parse(raw.toString(\"utf8\"));\n }\n }\n } catch (error) {\n recoverable = error instanceof SyntaxError;\n }\n try {\n fs.closeSync(ownerHandle);\n } catch {\n return false;\n }\n return recoverable;\n}\n\nfunction syntheticFreshStat(stats: fs.Stats): fs.Stats {\n const fresh = Object.assign(Object.create(Object.getPrototypeOf(stats)), stats) as fs.Stats;\n Object.defineProperty(fresh, \"mtime\", {\n configurable: true,\n enumerable: true,\n value: new Date(),\n });\n return fresh;\n}\n\nfunction syntheticStaleStat(stats: fs.Stats): fs.Stats {\n const stale = Object.assign(Object.create(Object.getPrototypeOf(stats)), stats) as fs.Stats;\n Object.defineProperty(stale, \"mtime\", {\n configurable: true,\n enumerable: true,\n value: new Date(0),\n });\n return stale;\n}\n\nfunction statMtimeMs(stats: { mtimeMs: bigint | number }): number {\n return typeof stats.mtimeMs === \"bigint\" ? Number(stats.mtimeMs) : stats.mtimeMs;\n}\n\nfunction isRecoverableOwnerlessClaim(stats: { mtimeMs: bigint | number }): boolean {\n return Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS;\n}\n\nfunction isRecoverableUnverifiableOwner(candidate: ParsedLockOwner, status: OwnerStatus): boolean {\n return (\n status === \"superseded\" &&\n candidate.owner.version === 1 &&\n (candidate.owner.processIdentity === null ||\n isCoarseDarwinIdentity(candidate.owner.processIdentity)) &&\n Date.now() - candidate.publishedAtMs >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nfunction isRecoverableForeignOwner(\n candidate: ParsedLockOwner,\n status: OwnerStatus,\n stats: { mtimeMs: bigint | number },\n): boolean {\n return (\n status === \"foreign\" &&\n candidate.owner.version >= 2 &&\n Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nfunction isRecoverableUnknownOwner(\n candidate: ParsedLockOwner,\n status: OwnerStatus,\n stats: { mtimeMs: bigint | number },\n): boolean {\n return (\n status === \"unknown\" &&\n candidate.owner.version >= 2 &&\n candidate.owner.processIdentity !== null &&\n isExactProcessIdentity(candidate.owner.processIdentity) &&\n Date.now() - candidate.publishedAtMs >= OWNERLESS_LOCK_RECOVERY_MS &&\n Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\ntype ProcessOwnedLockOptions = {\n beforeDirectoryRemoval?: (directoryPath: string) => void;\n machineIdentityReader?: () => string | null;\n onDirectoryOwned?: (directoryPath: string, identity: { dev: bigint; ino: bigint }) => void;\n processIdentityReader?: (pid: number) => string | null;\n};\n\nfunction readCurrentLockOwner(options: ProcessOwnedLockOptions) {\n const identityReader = options.processIdentityReader ?? readProcessIdentity;\n let currentProcessIdentity: string | null;\n if (options.processIdentityReader) {\n currentProcessIdentity = readProcessIdentityWithRetry(process.pid, identityReader);\n } else {\n if (cachedCurrentProcessIdentity === undefined) {\n const currentIdentity = readProcessIdentityWithRetry(process.pid, identityReader);\n if (currentIdentity !== null) {\n cachedCurrentProcessIdentity = currentIdentity;\n }\n }\n currentProcessIdentity = cachedCurrentProcessIdentity ?? null;\n }\n if (\n currentProcessIdentity === null ||\n (!isExactProcessIdentity(currentProcessIdentity) &&\n !(process.platform === \"darwin\" && isCoarseDarwinIdentity(currentProcessIdentity)))\n ) {\n throw new Error(\"Recorder lock process identity is unavailable.\");\n }\n let currentMachineIdentity: string | null;\n if (options.machineIdentityReader) {\n currentMachineIdentity = options.machineIdentityReader();\n } else {\n if (cachedCurrentMachineIdentity === undefined) {\n const machineIdentity = readMachineIdentity();\n if (machineIdentity !== null) {\n cachedCurrentMachineIdentity = machineIdentity;\n }\n }\n currentMachineIdentity = cachedCurrentMachineIdentity ?? null;\n }\n if (currentMachineIdentity === null) {\n throw new Error(\"Recorder lock machine identity is unavailable.\");\n }\n const currentProcessNamespace = readProcessNamespaceWithRetry(process.pid);\n if (process.platform === \"linux\" && currentProcessNamespace === null) {\n throw new Error(\"Recorder lock process namespace is unavailable.\");\n }\n return { currentProcessIdentity, currentMachineIdentity, currentProcessNamespace };\n}\n\nexport function initializeProcessOwnedLockIdentity(): void {\n if ([\"linux\", \"darwin\", \"win32\"].includes(process.platform)) {\n readCurrentLockOwner({});\n }\n}\n\nexport function createProcessOwnedLockFileSystem(options: ProcessOwnedLockOptions = {}): typeof fs {\n if (\n process.platform !== \"linux\" &&\n process.platform !== \"darwin\" &&\n process.platform !== \"win32\"\n ) {\n return fs;\n }\n const { currentProcessIdentity, currentMachineIdentity, currentProcessNamespace } =\n readCurrentLockOwner(options);\n const identityReader = options.processIdentityReader ?? readProcessIdentity;\n const token = randomUUID();\n const removeLockDirectorySync = (\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n afterClaim?: (directoryPath: string) => void,\n ): void => {\n removeVerifiedLockDirectorySync(\n directoryPath,\n expectedIdentity,\n expectedMtimeMs,\n options.beforeDirectoryRemoval,\n afterClaim,\n );\n };\n const ownedDirectories = new Map<string, DirectoryIdentity>();\n const interruptedPublicationIdentities = new Map<string, DirectoryIdentity>();\n let cachedForeignIdentity:\n | {\n checkedAt: number;\n ownerGenerationKey: string;\n identity: string | null;\n pid: number;\n startedAtMs: number | null;\n }\n | undefined;\n const owner: LockOwner = {\n executionIdentity: CURRENT_EXECUTION_IDENTITY,\n machineIdentity: currentMachineIdentity,\n pid: process.pid,\n processIdentity: currentProcessIdentity,\n processNamespace: currentProcessNamespace,\n processStartedAtMs: CURRENT_PROCESS_STARTED_AT_MS,\n token,\n version: isExactProcessIdentity(currentProcessIdentity) ? 4 : 1,\n };\n\n const publishOwner = (directory: string): void => {\n const ownerPath = path.join(directory, OWNER_FILE);\n let ownerHandle: number | undefined;\n let openedIdentity: fs.BigIntStats | undefined;\n try {\n ownerHandle = fs.openSync(\n ownerPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL,\n 0o600,\n );\n openedIdentity = fs.fstatSync(ownerHandle, { bigint: true });\n const contents = Buffer.from(`${JSON.stringify(owner)}\\n`);\n let offset = 0;\n while (offset < contents.byteLength) {\n const written = fs.writeSync(\n ownerHandle,\n contents,\n offset,\n contents.byteLength - offset,\n offset,\n );\n if (written === 0) {\n throw new Error(\"Recorder lock owner publication made no progress.\");\n }\n offset += written;\n }\n fs.closeSync(ownerHandle);\n ownerHandle = undefined;\n } catch (error) {\n if (openedIdentity !== undefined) {\n try {\n const current = fs.lstatSync(ownerPath, { bigint: true });\n if (openedIdentity.dev === current.dev && openedIdentity.ino === current.ino) {\n fs.unlinkSync(ownerPath);\n }\n } catch {\n // Preserve a replacement path that cannot be proven to be ours.\n }\n }\n throw error;\n } finally {\n if (ownerHandle !== undefined) {\n try {\n fs.closeSync(ownerHandle);\n } catch {\n // Preserve the publication error already being reported.\n }\n }\n }\n };\n\n const abandonOwner = (directory: string): boolean => {\n abandonedOwnerKeys.add(abandonedOwnerKey(directory, token));\n const published = publishAbandonedOwnerMarker(directory, token);\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const ownedIdentity = ownedDirectories.get(coordinationKey);\n if (!ownedIdentity) {\n return published;\n }\n try {\n const current = fs.lstatSync(directory, { bigint: true });\n if (current.isDirectory() && directoryIdentityMatches(ownedIdentity, current)) {\n abandonedDirectoryIdentities.set(coordinationKey, {\n ...ownedIdentity,\n ownerGenerationKey: token,\n });\n }\n } catch {\n // The path no longer names the directory published by this wrapper.\n }\n return published;\n };\n\n const ownerStatus = (\n candidate: ParsedLockOwner | null | undefined,\n forceIdentityRefresh = false,\n ): OwnerStatus => {\n if (!candidate) {\n return \"unknown\";\n }\n const claim = candidate.owner;\n if (\n abandonedOwnerKeys.has(abandonedOwnerKey(candidate.lockDirectory, claim.token)) ||\n hasAbandonedOwnerMarker(candidate)\n ) {\n return \"dead\";\n }\n if (\n claim.version >= 3 &&\n claim.machineIdentity !== null &&\n claim.machineIdentity !== currentMachineIdentity\n ) {\n return \"foreign\";\n }\n if (\n process.platform === \"linux\" &&\n claim.version >= 2 &&\n (claim.processNamespace === null ||\n currentProcessNamespace === null ||\n claim.processNamespace !== currentProcessNamespace)\n ) {\n return \"foreign\";\n }\n if (claim.version === 2 && (process.platform === \"darwin\" || process.platform === \"win32\")) {\n return \"foreign\";\n }\n if (!isProcessAlive(claim.pid)) {\n if (process.platform === \"linux\" && claim.version === 1 && claim.processNamespace === null) {\n return \"unknown\";\n }\n return \"dead\";\n }\n if (isDefunctProcess(claim.pid)) {\n return \"dead\";\n }\n if (claim.pid === process.pid) {\n if (claim.processIdentity !== null && isExactProcessIdentity(claim.processIdentity)) {\n if (claim.processIdentity !== currentProcessIdentity) {\n return \"dead\";\n }\n return claim.version === 4 &&\n claim.executionIdentity !== null &&\n claim.executionIdentity !== CURRENT_EXECUTION_IDENTITY\n ? \"foreign\"\n : \"active\";\n }\n if (claim.processStartedAtMs !== CURRENT_PROCESS_STARTED_AT_MS) {\n return \"superseded\";\n }\n return claim.executionIdentity !== null &&\n claim.executionIdentity !== CURRENT_EXECUTION_IDENTITY\n ? \"superseded\"\n : \"active\";\n }\n const now = Date.now();\n if (\n forceIdentityRefresh ||\n !cachedForeignIdentity ||\n cachedForeignIdentity.pid !== claim.pid ||\n cachedForeignIdentity.ownerGenerationKey !== claim.token ||\n now - cachedForeignIdentity.checkedAt >= IDENTITY_CACHE_MS\n ) {\n const observedIdentity = identityReader(claim.pid);\n cachedForeignIdentity = {\n checkedAt: now,\n identity: observedIdentity,\n ownerGenerationKey: claim.token,\n pid: claim.pid,\n startedAtMs:\n processStartedAtMsFromIdentity(observedIdentity) ??\n readLegacyProcessStartedAtMs(claim.pid),\n };\n }\n if (\n claim.processIdentity === null ||\n isCoarseDarwinIdentity(claim.processIdentity) ||\n !isExactProcessIdentity(claim.processIdentity)\n ) {\n if (claim.version !== 1 || cachedForeignIdentity.startedAtMs === null) {\n return \"unknown\";\n }\n return legacyProcessStartMatches(claim.processStartedAtMs, cachedForeignIdentity.startedAtMs)\n ? \"active\"\n : \"superseded\";\n }\n if (cachedForeignIdentity.identity === null) {\n return \"unknown\";\n }\n if (process.platform === \"darwin\" && isCoarseDarwinIdentity(cachedForeignIdentity.identity)) {\n return cachedForeignIdentity.startedAtMs === null\n ? \"unknown\"\n : legacyProcessStartMatches(claim.processStartedAtMs, cachedForeignIdentity.startedAtMs)\n ? \"active\"\n : \"superseded\";\n }\n return cachedForeignIdentity.identity === claim.processIdentity ? \"active\" : \"dead\";\n };\n\n const createRecoveryClaim = (\n claimPath: string,\n callback: (error: NodeJS.ErrnoException | null, claim?: RecoveryClaim) => void,\n ): void => {\n fs.mkdir(claimPath, { mode: 0o700 }, (claimError) => {\n if (!claimError) {\n let createdIdentity: DirectoryIdentity | undefined;\n try {\n const created = fs.lstatSync(claimPath, { bigint: true });\n if (!created.isDirectory() || created.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery claim changed during creation.\");\n }\n createdIdentity = directoryIdentity(created);\n publishOwner(claimPath);\n const published = verifiedLockDirectoryStats(claimPath, createdIdentity);\n if (!published) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during publication.\");\n }\n callback(null, {\n activeIdentity: directoryIdentity(published),\n activePath: claimPath,\n ownerGenerationKey: token,\n supersededPaths: [],\n });\n } catch (ownerError) {\n if (createdIdentity) {\n try {\n removeLockDirectorySync(claimPath, createdIdentity);\n } catch {\n // Preserve an unverified replacement instead of deleting it by pathname.\n }\n }\n callback(ownerError as NodeJS.ErrnoException);\n }\n return;\n }\n if (claimError.code !== \"EEXIST\") {\n callback(claimError);\n return;\n }\n let existingFingerprint: string | undefined;\n let existingIdentity: SupersededRecoveryClaim[\"identity\"] | undefined;\n let existingOwnerFingerprint: string | undefined;\n try {\n const initialStats = fs.lstatSync(claimPath, { bigint: true });\n if (initialStats.isDirectory() && !initialStats.isSymbolicLink()) {\n const initialIdentity = directoryIdentity(initialStats);\n const existingClaim = parseOwner(claimPath);\n const stats = verifiedLockDirectoryStats(\n claimPath,\n initialIdentity,\n initialStats.mtimeMs,\n );\n if (!stats) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during inspection.\");\n }\n if (existingClaim) {\n const status = ownerStatus(existingClaim);\n const recoverableForeign =\n status === \"foreign\" && isRecoverableForeignOwner(existingClaim, status, stats);\n const recoverableUnverifiable = isRecoverableUnverifiableOwner(existingClaim, status);\n const recoverableUnknown =\n isRecoverableUnknownOwner(existingClaim, status, stats) &&\n isRecoverableUnknownOwner(existingClaim, ownerStatus(existingClaim, true), stats);\n if (\n status === \"dead\" ||\n recoverableForeign ||\n recoverableUnverifiable ||\n recoverableUnknown\n ) {\n existingFingerprint = `owner:${existingClaim.owner.token}`;\n existingOwnerFingerprint = existingFingerprint;\n }\n } else if (isRecoverableOwnerlessClaim(stats)) {\n existingOwnerFingerprint = existingClaim === undefined ? \"ownerless\" : \"malformed\";\n existingFingerprint = `${existingOwnerFingerprint}:${stats.dev}:${stats.ino}:${stats.mtimeMs}`;\n }\n if (existingFingerprint) {\n existingIdentity = {\n ...directoryIdentity(stats),\n mtimeMs: stats.mtimeMs,\n };\n }\n }\n } catch {\n // Treat a concurrently changing claim as active.\n }\n if (!existingFingerprint || !existingIdentity || !existingOwnerFingerprint) {\n callback(\n Object.assign(new Error(\"Recorder lock recovery is already in progress.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const takeoverPath = recoveryClaimPath(claimPath, existingFingerprint);\n createRecoveryClaim(takeoverPath, (takeoverError, takeoverClaim) => {\n if (takeoverError || !takeoverClaim) {\n callback(\n takeoverError ??\n Object.assign(new Error(\"Recorder lock recovery claim failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n } else {\n callback(null, {\n activeIdentity: takeoverClaim.activeIdentity,\n activePath: takeoverClaim.activePath,\n ownerGenerationKey: takeoverClaim.ownerGenerationKey,\n supersededPaths: [\n {\n identity: existingIdentity,\n ownerFingerprint: existingOwnerFingerprint,\n path: claimPath,\n },\n ...takeoverClaim.supersededPaths,\n ],\n });\n }\n });\n });\n };\n\n const releaseRecoveryClaim = (\n directory: string,\n claim: RecoveryClaim,\n callback: () => void,\n ): void => {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n // Retire nested takeover paths before the base claim so any failure leaves\n // the active claim discoverable through the original coordination path.\n const supersededPaths = [...claim.supersededPaths].reverse();\n let removedSupersededPath = false;\n const removeActiveClaim = (): void => {\n let activeError: NodeJS.ErrnoException | null = null;\n try {\n removeLockDirectorySync(\n claim.activePath,\n claim.activeIdentity,\n undefined,\n (claimedPath) => {\n claim.activePath = claimedPath;\n },\n );\n } catch (error) {\n activeError = error as NodeJS.ErrnoException;\n }\n if (activeError && !abandonOwner(claim.activePath)) {\n retainedCoordinationClaims.set(coordinationKey, {\n claim,\n retainedByToken: token,\n });\n }\n callback();\n };\n const preserveActiveClaim = (): void => {\n if (!abandonOwner(claim.activePath)) {\n retainedCoordinationClaims.set(coordinationKey, {\n claim,\n retainedByToken: token,\n });\n }\n callback();\n };\n const removeSuperseded = (index: number): void => {\n const superseded = supersededPaths[index];\n if (!superseded) {\n removeActiveClaim();\n return;\n }\n let current: fs.BigIntStats | undefined;\n try {\n current = verifiedLockDirectoryStats(\n superseded.path,\n superseded.identity,\n superseded.identity.mtimeMs,\n );\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n if (!current) {\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n return;\n }\n const currentOwner = parseOwner(superseded.path);\n try {\n current = verifiedLockDirectoryStats(\n superseded.path,\n superseded.identity,\n superseded.identity.mtimeMs,\n );\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n if (!current) {\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n return;\n }\n const currentFingerprint = currentOwner\n ? `owner:${currentOwner.owner.token}`\n : currentOwner === undefined\n ? \"ownerless\"\n : \"malformed\";\n if (currentFingerprint !== superseded.ownerFingerprint) {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n try {\n removeLockDirectorySync(superseded.path, superseded.identity, superseded.identity.mtimeMs);\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n };\n removeSuperseded(0);\n };\n\n const acquireCoordinationClaim = (\n directory: string,\n callback: (error: NodeJS.ErrnoException | null, claim?: RecoveryClaim) => void,\n ): void => {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const retained = retainedCoordinationClaims.get(coordinationKey);\n if (retained) {\n if (retained.retainedByToken !== token && !ownedDirectories.has(coordinationKey)) {\n callback(lockCleanupError(\"Recorder lock retained coordination claim is owned elsewhere.\"));\n return;\n }\n const { claim: retainedClaim } = retained;\n let retainedClaimIsOwned = false;\n try {\n const current = verifiedLockDirectoryStats(\n retainedClaim.activePath,\n retainedClaim.activeIdentity,\n );\n const retainedOwner = current ? parseOwner(retainedClaim.activePath) : undefined;\n retainedClaimIsOwned =\n retainedOwner !== undefined &&\n retainedOwner !== null &&\n retainedOwner.owner.token === retainedClaim.ownerGenerationKey &&\n ownerStatus(retainedOwner) === \"active\";\n } catch {\n retainedClaimIsOwned = false;\n }\n if (retainedClaimIsOwned) {\n if (retainedCoordinationClaims.get(coordinationKey) === retained) {\n retainedCoordinationClaims.delete(coordinationKey);\n }\n callback(null, retainedClaim);\n return;\n }\n if (retainedCoordinationClaims.get(coordinationKey) === retained) {\n retainedCoordinationClaims.delete(coordinationKey);\n }\n }\n createRecoveryClaim(recoveryClaimPath(directory), callback);\n };\n\n const lockFs = Object.create(fs) as typeof fs;\n lockFs.mkdir = ((\n directoryPath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n const directory = String(directoryPath);\n acquireCoordinationClaim(directory, (claimError, coordinationClaim) => {\n if (claimError || !coordinationClaim) {\n callback(\n claimError ??\n Object.assign(new Error(\"Recorder lock coordination failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n fs.mkdir(directoryPath, (error) => {\n if (error) {\n if (error.code === \"EEXIST\" && coordinationClaim.supersededPaths.length > 0) {\n try {\n const existing = fs.lstatSync(directoryPath, { bigint: true });\n const candidate = parseOwner(directoryPath);\n if (\n existing.isDirectory() &&\n !existing.isSymbolicLink() &&\n (candidate === undefined || candidate === null)\n ) {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n interruptedPublicationIdentities.set(coordinationKey, directoryIdentity(existing));\n retainedCoordinationClaims.set(coordinationKey, {\n claim: coordinationClaim,\n retainedByToken: token,\n });\n callback(error);\n return;\n }\n } catch {\n // Fall through to normal cleanup for a changing target.\n }\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(error));\n return;\n }\n let createdIdentity: DirectoryIdentity | undefined;\n let ownerPublished = false;\n let publicationError: NodeJS.ErrnoException | null = null;\n try {\n const createdDirectory = fs.lstatSync(directoryPath, { bigint: true });\n if (!createdDirectory.isDirectory() || createdDirectory.isSymbolicLink()) {\n throw new Error(\"Recorder lock directory changed during creation.\");\n }\n const candidateIdentity = directoryIdentity(createdDirectory);\n const createdEntries = fs.readdirSync(directoryPath);\n if (\n createdEntries.length > 0 ||\n !verifiedLockDirectoryStats(directoryPath, candidateIdentity)\n ) {\n throw lockCleanupError(\"Recorder lock directory changed during creation.\");\n }\n createdIdentity = candidateIdentity;\n publishOwner(directory);\n ownerPublished = true;\n const publishedDirectory = verifiedLockDirectoryStats(directory, createdIdentity);\n if (!publishedDirectory) {\n throw new Error(\"Recorder lock directory changed during owner publication.\");\n }\n const publishedIdentity = directoryIdentity(publishedDirectory);\n options.onDirectoryOwned?.(directory, { ...publishedIdentity });\n ownedDirectories.set(canonicalLockDirectoryPath(directory), publishedIdentity);\n interruptedPublicationIdentities.delete(canonicalLockDirectoryPath(directory));\n } catch (ownerError) {\n publicationError = ownerError as NodeJS.ErrnoException;\n }\n if (publicationError) {\n if (ownerPublished && createdIdentity) {\n try {\n if (verifiedLockDirectoryStats(directory, createdIdentity)) {\n abandonOwner(directory);\n }\n } catch {\n // Preserve an unverified replacement instead of mutating it by pathname.\n }\n } else if (createdIdentity) {\n try {\n removeLockDirectorySync(directoryPath, createdIdentity);\n } catch {\n // Preserve an unverified replacement instead of deleting it by pathname.\n }\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(publicationError));\n return;\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(null));\n });\n });\n }) as typeof fs.mkdir;\n lockFs.stat = ((\n filePath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null, stats?: fs.Stats) => void,\n ) => {\n fs.stat(filePath, (error, stats) => {\n if (error) {\n callback(error);\n return;\n }\n const coordinationKey = canonicalLockDirectoryPath(filePath);\n let identityStats: fs.BigIntStats | undefined;\n try {\n const current = fs.lstatSync(filePath, { bigint: true });\n if (current.isDirectory() && !current.isSymbolicLink()) {\n identityStats = current;\n }\n } catch {\n // A changing path cannot match an identity-based recovery fence.\n }\n if (\n identityStats &&\n directoryIdentityMatches(abandonedDirectoryIdentities.get(coordinationKey), identityStats)\n ) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n const candidate = parseOwner(filePath);\n const status = ownerStatus(candidate);\n if (candidate !== undefined && candidate !== null) {\n interruptedPublicationIdentities.delete(coordinationKey);\n }\n const recoverableInterruptedPublication =\n (candidate === undefined || candidate === null) &&\n identityStats !== undefined &&\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n identityStats,\n ) &&\n Date.now() - stats.mtimeMs >= OWNERLESS_LOCK_RECOVERY_MS;\n const recoverableAgedUnverifiableOwner =\n isRecoverableOwnerlessClaim(stats) &&\n (candidate === undefined || (candidate === null && hasRecoverableMalformedOwner(filePath)));\n const recoverableForeign =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableForeignOwner(candidate, status, stats);\n const recoverableUnknown =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnknownOwner(candidate, status, stats);\n if (\n candidate &&\n abandonedOwnerKeys.has(abandonedOwnerKey(candidate.lockDirectory, candidate.owner.token))\n ) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n if (candidate && hasAbandonedOwnerMarker(candidate)) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n callback(\n null,\n candidate?.owner.token === token ||\n status === \"dead\" ||\n recoverableForeign ||\n recoverableUnknown ||\n recoverableInterruptedPublication ||\n recoverableAgedUnverifiableOwner ||\n (candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnverifiableOwner(candidate, status))\n ? stats\n : syntheticFreshStat(stats),\n );\n });\n }) as typeof fs.stat;\n lockFs.rmdir = ((\n directoryPath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n const directory = String(directoryPath);\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const releaseDeadline = Date.now() + COORDINATION_RELEASE_WAIT_MS;\n const acquireForRemoval = (): void => {\n acquireCoordinationClaim(directory, (claimError, coordinationClaim) => {\n if (\n claimError?.code === \"ELOCKED\" &&\n ownedDirectories.has(coordinationKey) &&\n Date.now() < releaseDeadline\n ) {\n setTimeout(acquireForRemoval, COORDINATION_RELEASE_RETRY_MS);\n return;\n }\n if (claimError || !coordinationClaim) {\n if (ownedDirectories.has(coordinationKey)) {\n abandonOwner(directory);\n }\n callback(\n claimError ??\n Object.assign(new Error(\"Recorder lock coordination failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const finish = (error: NodeJS.ErrnoException | null): void => {\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(error));\n };\n const candidate = parseOwner(directoryPath);\n let initialStats: fs.BigIntStats;\n try {\n initialStats = fs.lstatSync(directoryPath, { bigint: true });\n if (!initialStats.isDirectory() || initialStats.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery target is not a directory.\");\n }\n } catch (error) {\n const pathError = error as NodeJS.ErrnoException;\n finish(\n pathError.code === \"ENOENT\" && ownedDirectories.has(coordinationKey)\n ? lockCleanupError(\"Recorder lock owned release target disappeared.\")\n : pathError,\n );\n return;\n }\n if (candidate !== undefined && candidate !== null) {\n interruptedPublicationIdentities.delete(coordinationKey);\n }\n const ownedIdentity = ownedDirectories.get(coordinationKey);\n const ownsPublishedDirectory = directoryIdentityMatches(ownedIdentity, initialStats);\n if (\n (candidate?.owner.token === token && ownsPublishedDirectory) ||\n ((candidate === null || candidate === undefined) && ownsPublishedDirectory)\n ) {\n const tombstonePath = `${coordinationClaim.activePath}.${token}.release`;\n fs.rename(directoryPath, tombstonePath, (renameError) => {\n if (renameError) {\n abandonOwner(directory);\n finish(renameError);\n return;\n }\n if (\n !renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(initialStats))\n ) {\n finish(lockCleanupError(\"Recorder lock release displaced a replacement directory.\"));\n return;\n }\n ownedDirectories.delete(coordinationKey);\n abandonedDirectoryIdentities.delete(coordinationKey);\n abandonedOwnerKeys.delete(abandonedOwnerKey(directory, token));\n try {\n removeLockDirectorySync(tombstonePath, directoryIdentity(initialStats));\n finish(null);\n } catch (error) {\n finish(error as NodeJS.ErrnoException);\n }\n });\n return;\n }\n if (candidate === null && ownedDirectories.has(coordinationKey)) {\n abandonOwner(directory);\n finish(\n Object.assign(\n new Error(\"Recorder lock owner metadata cannot be verified for release.\"),\n {\n code: \"ELOCKED\",\n },\n ),\n );\n return;\n }\n let ownerlessStats: fs.BigIntStats | undefined;\n let foreignStats: fs.BigIntStats | undefined;\n let recoverableAbandoned = false;\n let recoverableInterruptedPublication = false;\n let recoverableAgedUnverifiableOwner = false;\n const status = ownerStatus(candidate);\n const recoverableUnverifiable =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnverifiableOwner(candidate, status);\n const recoverableForeign =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableForeignOwner(candidate, status, initialStats);\n const recoverableUnknown =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnknownOwner(candidate, status, initialStats);\n if (recoverableForeign) {\n foreignStats = initialStats;\n }\n if (candidate === undefined || candidate === null) {\n ownerlessStats = initialStats;\n recoverableAbandoned = directoryIdentityMatches(\n abandonedDirectoryIdentities.get(coordinationKey),\n ownerlessStats,\n );\n recoverableInterruptedPublication =\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n ownerlessStats,\n ) && Date.now() - statMtimeMs(ownerlessStats) >= OWNERLESS_LOCK_RECOVERY_MS;\n recoverableAgedUnverifiableOwner =\n isRecoverableOwnerlessClaim(ownerlessStats) &&\n (candidate === undefined ||\n (candidate === null && hasRecoverableMalformedOwner(directoryPath)));\n }\n if (\n status !== \"dead\" &&\n !recoverableForeign &&\n !recoverableUnknown &&\n !recoverableUnverifiable &&\n !recoverableAbandoned &&\n !recoverableInterruptedPublication &&\n !recoverableAgedUnverifiableOwner\n ) {\n finish(\n Object.assign(new Error(\"Recorder lock owner is still active or cannot be verified.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const refreshed = parseOwner(directoryPath);\n const refreshedStatus = ownerStatus(refreshed, recoverableUnknown);\n let refreshedStats: fs.BigIntStats | undefined;\n try {\n const current = fs.lstatSync(directoryPath, { bigint: true });\n if (\n current.isDirectory() &&\n !current.isSymbolicLink() &&\n current.dev === initialStats.dev &&\n current.ino === initialStats.ino &&\n current.mtimeMs === initialStats.mtimeMs\n ) {\n refreshedStats = current;\n }\n } catch {\n // A changed recovery target fails authorization below.\n }\n let recoveryStillAuthorized =\n candidate !== undefined &&\n candidate !== null &&\n refreshedStats !== undefined &&\n lockOwnerMatches(candidate, refreshed) &&\n (refreshedStatus === \"dead\" ||\n (recoverableForeign &&\n refreshed !== undefined &&\n refreshed !== null &&\n foreignStats !== undefined &&\n refreshedStats.dev === foreignStats.dev &&\n refreshedStats.ino === foreignStats.ino &&\n refreshedStats.mtimeMs === foreignStats.mtimeMs &&\n isRecoverableForeignOwner(refreshed, refreshedStatus, refreshedStats)) ||\n (recoverableUnknown &&\n refreshed !== undefined &&\n refreshed !== null &&\n isRecoverableUnknownOwner(refreshed, refreshedStatus, refreshedStats)) ||\n (refreshed !== undefined &&\n refreshed !== null &&\n isRecoverableUnverifiableOwner(refreshed, refreshedStatus)));\n if (recoverableAbandoned && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n directoryIdentityMatches(\n abandonedDirectoryIdentities.get(coordinationKey),\n refreshedStats,\n );\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (recoverableInterruptedPublication && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n refreshed === undefined &&\n refreshedStats.dev === ownerlessStats.dev &&\n refreshedStats.ino === ownerlessStats.ino &&\n refreshedStats.mtimeMs === ownerlessStats.mtimeMs &&\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n refreshedStats,\n ) &&\n Date.now() - statMtimeMs(refreshedStats) >= OWNERLESS_LOCK_RECOVERY_MS;\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (recoverableAgedUnverifiableOwner && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n (candidate === undefined ? refreshed === undefined : refreshed === null) &&\n (candidate !== null || hasRecoverableMalformedOwner(directoryPath)) &&\n refreshedStats.dev === ownerlessStats.dev &&\n refreshedStats.ino === ownerlessStats.ino &&\n refreshedStats.mtimeMs === ownerlessStats.mtimeMs &&\n isRecoverableOwnerlessClaim(refreshedStats);\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (!recoveryStillAuthorized) {\n finish(\n Object.assign(new Error(\"Recorder lock owner changed during recovery.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const tombstonePath = `${coordinationClaim.activePath}.${token}.lock`;\n fs.rename(directoryPath, tombstonePath, (renameError) => {\n if (renameError) {\n finish(renameError);\n return;\n }\n if (!renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(initialStats))) {\n finish(lockCleanupError(\"Recorder lock recovery displaced a replacement directory.\"));\n return;\n }\n try {\n removeLockDirectorySync(tombstonePath, directoryIdentity(initialStats));\n if (candidate) {\n abandonedOwnerKeys.delete(\n abandonedOwnerKey(candidate.lockDirectory, candidate.owner.token),\n );\n }\n interruptedPublicationIdentities.delete(coordinationKey);\n const abandonedIdentity = abandonedDirectoryIdentities.get(coordinationKey);\n if (abandonedIdentity) {\n abandonedOwnerKeys.delete(\n abandonedOwnerKey(directory, abandonedIdentity.ownerGenerationKey),\n );\n abandonedDirectoryIdentities.delete(coordinationKey);\n }\n retainedCoordinationClaims.set(canonicalLockDirectoryPath(directory), {\n claim: coordinationClaim,\n retainedByToken: token,\n });\n callback(null);\n } catch (error) {\n finish(error as NodeJS.ErrnoException);\n }\n });\n });\n };\n acquireForRemoval();\n }) as typeof fs.rmdir;\n lockFs.rmdirSync = ((directoryPath: fs.PathLike) => {\n const directory = String(directoryPath);\n const claimPath = recoveryClaimPath(directory);\n fs.mkdirSync(claimPath, { mode: 0o700 });\n const createdClaim = fs.lstatSync(claimPath, { bigint: true });\n if (!createdClaim.isDirectory() || createdClaim.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery claim changed during creation.\");\n }\n const coordinationClaim: RecoveryClaim = {\n activeIdentity: directoryIdentity(createdClaim),\n activePath: claimPath,\n ownerGenerationKey: token,\n supersededPaths: [],\n };\n try {\n publishOwner(claimPath);\n if (!verifiedLockDirectoryStats(claimPath, coordinationClaim.activeIdentity)) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during publication.\");\n }\n const candidate = parseOwner(directoryPath);\n if (candidate?.owner.token !== token) {\n throw Object.assign(new Error(\"Recorder lock is not owned by this process.\"), {\n code: \"ELOCKED\",\n });\n }\n const ownedIdentity = ownedDirectories.get(canonicalLockDirectoryPath(directory));\n const ownedDirectory = fs.lstatSync(directoryPath, { bigint: true });\n if (\n !ownedDirectory.isDirectory() ||\n ownedDirectory.isSymbolicLink() ||\n !directoryIdentityMatches(ownedIdentity, ownedDirectory)\n ) {\n throw lockCleanupError(\"Recorder lock ownership changed before release.\");\n }\n const tombstonePath = `${claimPath}.${token}.release`;\n fs.renameSync(directoryPath, tombstonePath);\n if (!renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(ownedDirectory))) {\n throw lockCleanupError(\"Recorder lock release displaced a replacement directory.\");\n }\n removeLockDirectorySync(tombstonePath, directoryIdentity(ownedDirectory));\n ownedDirectories.delete(canonicalLockDirectoryPath(directory));\n } finally {\n try {\n removeLockDirectorySync(coordinationClaim.activePath, coordinationClaim.activeIdentity);\n } catch {\n // Exit cleanup is best-effort; a live coordination claim is safer than an ABA race.\n }\n }\n }) as typeof fs.rmdirSync;\n return lockFs;\n}\n"]}