@fast-china/utils 2.1.2 → 2.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.global.min.js","names":["MD5","Hex","SHA1","Pkcs7","NoPadding","ZeroPadding","CryptoCore","Iso10126","Utf8","AES","ECB","computed","computed","getCurrentInstance"],"sources":["../src/array/index.ts","../src/async/index.ts","../src/internal/text.ts","../src/number/index.ts","../src/base64/index.ts","../src/color/index.ts","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-hex.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf8.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-pkcs7.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.js","../src/crypto/index.ts","../src/date/index.ts","../src/dom/style.ts","../src/env/index.ts","../src/storage/index.ts","../src/string/index.ts","../src/identity/index.ts","../src/logger/index.ts","../src/object/index.ts","../src/vue/emits.ts","../src/vue/expose.ts","../src/vue/func.ts","../src/vue/install.ts","../src/vue/props.ts","../src/vue/render.ts","../src/vue/slots.ts","../src/vue/with.ts"],"sourcesContent":["/** 从数组项中提取可比较键的函数。 */\nexport type KeySelector<Item, Key> = (item: Item, index: number) => Key;\n\n/**\n * 将只读数组按固定大小分组。\n *\n * @typeParam Item - 数组项类型。\n * @param items - 不会被修改的输入数组。\n * @param size - 每组最多包含的项目数,必须是正安全整数。\n * @returns 新建的二维数组;最后一组可能小于 `size`。\n * @throws `RangeError` 当 `size` 不是正安全整数。\n */\nexport function chunk<Item>(items: readonly Item[], size: number): Item[][] {\n\tif (!Number.isSafeInteger(size) || size <= 0) {\n\t\tthrow new RangeError(\"`size` 必须是正安全整数。\");\n\t}\n\n\tconst result: Item[][] = [];\n\tfor (let index = 0; index < items.length; index += size) {\n\t\tresult.push(items.slice(index, index + size));\n\t}\n\treturn result;\n}\n\n/**\n * 删除数组中的 `null` 与 `undefined`,保留 `false`、`0` 和空字符串。\n *\n * @param items - 可包含空值的只读数组。\n * @returns 保持原顺序的新数组。\n */\nexport function removeNullishValues<Item>(items: readonly (Item | null | undefined)[]): Item[] {\n\treturn items.filter((item): item is Item => item !== null && item !== undefined);\n}\n\n/**\n * 使用 JavaScript `Set` 的 SameValueZero 语义去重。\n *\n * @param items - 不会被修改的输入数组。\n * @returns 保留每个值首次出现顺序的新数组;稀疏数组空位被忽略。\n */\nexport function unique<Item>(items: readonly Item[]): Item[] {\n\tconst result: Item[] = [];\n\tconst seen = new Set<Item>();\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tif (!(index in items)) continue;\n\t\tconst item = items[index] as Item;\n\t\tif (seen.has(item)) continue;\n\t\tseen.add(item);\n\t\tresult.push(item);\n\t}\n\treturn result;\n}\n\n/**\n * 按选择器返回的键去重。\n *\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 接收项目与索引并返回去重键的函数。\n * @returns 保留每个键首次出现项目的新数组;稀疏数组空位被忽略。\n */\nexport function uniqueBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Item[] {\n\tconst seen = new Set<Key>();\n\tconst result: Item[] = [];\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined && !(index in items)) continue;\n\t\tconst key = selectKey(item as Item, index);\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(item as Item);\n\t}\n\treturn result;\n}\n\n/**\n * 按选择器结果分组。\n *\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 返回任意 `Map` 键的函数。\n * @returns 按键首次出现顺序排列的 `Map`;每个分组保持输入顺序,稀疏空位被忽略。\n */\nexport function groupBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Map<Key, Item[]> {\n\tconst groups = new Map<Key, Item[]>();\n\titems.forEach((item, index) => {\n\t\tconst key = selectKey(item, index);\n\t\tconst group = groups.get(key);\n\t\tif (group === undefined) groups.set(key, [item]);\n\t\telse group.push(item);\n\t});\n\treturn groups;\n}\n\n/**\n * 按谓词把数组拆分为匹配项和非匹配项。\n *\n * @param items - 不会被修改的输入数组。\n * @param predicate - 接收项目与索引的判断函数。\n * @returns 二元组:第一项匹配谓词,第二项不匹配;两组都保持原顺序并忽略稀疏空位。\n */\nexport function partition<Item>(items: readonly Item[], predicate: (item: Item, index: number) => boolean): [matched: Item[], unmatched: Item[]] {\n\tconst matched: Item[] = [];\n\tconst unmatched: Item[] = [];\n\titems.forEach((item, index) => (predicate(item, index) ? matched : unmatched).push(item));\n\treturn [matched, unmatched];\n}\n\n/**\n * 返回只出现在左侧数组中的不同值。\n *\n * @param left - 主输入数组。\n * @param right - 需要排除的值。\n * @returns 保留左侧首次出现顺序的去重结果;两侧稀疏空位都被忽略。\n */\nexport function difference<Item>(left: readonly Item[], right: readonly Item[]): Item[] {\n\tconst excluded = new Set(unique(right));\n\treturn unique(left).filter((item) => !excluded.has(item));\n}\n\n/**\n * 返回两个数组共有的不同值。\n *\n * @param left - 决定结果顺序的数组。\n * @param right - 用于成员判断的数组。\n * @returns 保留左侧首次出现顺序的去重结果;两侧稀疏空位都被忽略。\n */\nexport function intersection<Item>(left: readonly Item[], right: readonly Item[]): Item[] {\n\tconst included = new Set(unique(right));\n\treturn unique(left).filter((item) => included.has(item));\n}\n\n/**\n * 判断选择器产生的键是否重复。\n *\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 返回比较键的函数;键使用 SameValueZero 语义比较。\n * @returns 存在至少一个重复键时返回 `true`。\n */\nexport function hasDuplicatesBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean {\n\tconst seen = new Set<Key>();\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined && !(index in items)) continue;\n\t\tconst key = selectKey(item as Item, index);\n\t\tif (seen.has(key)) return true;\n\t\tseen.add(key);\n\t}\n\treturn false;\n}\n\n/**\n * 判断所有项目是否具有相同的选择器结果。\n *\n * @remarks 空数组、只有稀疏空位的数组和单项数组按数学惯例返回 `true`;空位不会调用选择器。\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 返回比较键的函数。\n * @returns 所有键都满足 SameValueZero 相等时返回 `true`。\n */\nexport function allEqualBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean {\n\tlet first: Key | undefined;\n\tlet hasFirst = false;\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined && !(index in items)) continue;\n\t\tconst current = selectKey(item as Item, index);\n\t\tif (!hasFirst) {\n\t\t\tfirst = current;\n\t\t\thasFirst = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!(first === current || (Number.isNaN(first) && Number.isNaN(current)))) return false;\n\t}\n\treturn true;\n}\n","/** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */\ntype AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/** 记录同一防抖批次中每个调用方独立的 Promise 结算函数。 */\ninterface PromiseWaiter<Result> {\n\t/**\n\t * 使用批次失败原因拒绝当前调用方。\n\t * @param reason - `cancel` 提供的原因或共享回调抛出的原始错误。\n\t */\n\treject: (reason?: unknown) => void;\n\t/**\n\t * 使用共享回调结果完成当前调用方,并采用传入 PromiseLike 的最终状态。\n\t * @param value - 当前防抖批次唯一一次回调执行产生的共享结果。\n\t */\n\tresolve: (value: Result | PromiseLike<Result>) => void;\n}\n\n// 浏览器和 Node.js 的计时器普遍以有符号 32 位整数保存延迟;更大的值可能被\n// 静默截断为约 1 ms,因此公共 API 在进入平台计时器前统一拒绝它。\nconst maximumTimerDelay = 2_147_483_647;\n\n/** 可接收取消信号的通用选项。 */\nexport interface AbortOptions {\n\t/** 已取消时立即失败;运行期间取消时停止等待并拒绝 Promise。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link withTimeout} 的行为选项。 */\nexport interface TimeoutOptions extends AbortOptions {\n\t/** 超时时使用的开发者消息。 */\n\tmessage?: string;\n}\n\n/** 每次重试操作接收的上下文。 */\nexport interface RetryContext {\n\t/** 从 1 开始的当前尝试次数。 */\n\tattempt: number;\n\t/** 调用方提供的取消信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link retry} 的策略选项。 */\nexport interface RetryOptions extends AbortOptions {\n\t/** 最大尝试次数,包含首次调用;默认 `3`。 */\n\tattempts?: number;\n\t/** 首次重试前的等待毫秒数,最大 2,147,483,647;默认 `200`。 */\n\tdelayMs?: number;\n\t/** 每次失败后的退避倍数,必须不小于 1;默认 `2`。 */\n\tfactor?: number;\n\t/** 单次等待上限,最大 2,147,483,647;默认 `30_000` 毫秒。 */\n\tmaxDelayMs?: number;\n\t/**\n\t * 决定当前失败后是否继续下一次尝试;默认重试所有尚未到达上限的错误。\n\t * @param error - 当前操作抛出或拒绝的原始值。\n\t * @param context - 当前尝试次数和调用方取消信号。\n\t * @returns `false` 时立即原样抛出当前错误;支持同步值或 PromiseLike。\n\t */\n\tshouldRetry?: (error: unknown, context: RetryContext) => boolean | PromiseLike<boolean>;\n}\n\n/** {@link mapConcurrent} 的执行选项。 */\nexport interface ConcurrentMapOptions {\n\t/** 已取消时停止调度新任务;已经开始的映射器需要自行响应同一信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** Promise 感知的防抖函数。 */\nexport interface DebouncedFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。\n\t * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。\n\t * @returns 当前批次的独立 Promise,最终与共享回调结果保持相同状态。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/**\n\t * 取消尚未执行的批次,并拒绝该批次的所有 Promise。\n\t * @param reason - 可选拒绝原因;省略时使用内部取消错误。\n\t */\n\tcancel: (reason?: unknown) => void;\n\t/**\n\t * 立即执行待处理批次,不创建第二次回调执行。\n\t * @returns 待处理批次的共享执行 Promise;没有批次时返回 `undefined`。\n\t */\n\tflush: () => Promise<Result> | undefined;\n\t/** @returns 当前存在尚未开始的批次时返回 `true`;正在执行但没有等待批次时返回 `false`。 */\n\tpending: () => boolean;\n}\n\n/** Promise 感知的前缘节流函数。 */\nexport interface ThrottledFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 在空闲时立即调用原始回调;执行期和冷却期内的调用共享首次调用的 Promise。\n\t * @param arguments_ - 仅窗口内首次调用的参数会传给原始回调。\n\t * @returns 当前执行窗口共享的 Promise。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/** 提前结束冷却期;已经开始的操作不会被取消,结束前仍禁止并发重入。 */\n\tcancel: () => void;\n\t/** @returns 原始回调正在执行或计时器仍处于冷却期时返回 `true`。 */\n\tpending: () => boolean;\n}\n\n/**\n * 创建符合 Web Platform 约定的取消错误。\n *\n * @param signal - 已进入取消状态的信号;其 `reason` 会保存在错误的 `cause` 中。\n * @returns 名称为 `AbortError` 的新错误实例。\n */\nconst createAbortError = (signal: AbortSignal): Error => {\n\tconst error = new Error(\"操作已取消。\", { cause: signal.reason });\n\terror.name = \"AbortError\";\n\treturn error;\n};\n\n/**\n * 在启动异步工作前同步拒绝已经取消的信号。\n *\n * @param signal - 可选取消信号;省略或尚未取消时不执行操作。\n * @throws `Error` 当信号已经取消,错误名称为 `AbortError`。\n */\nconst throwIfAborted = (signal: AbortSignal | undefined): void => {\n\tif (signal?.aborted) throw createAbortError(signal);\n};\n\n/**\n * 校验宿主计时器可以稳定表示的延迟。\n *\n * @param milliseconds - 待校验的毫秒数。\n * @param name - 用于错误消息的参数名称。\n * @returns 原始延迟值,便于调用方在校验后直接使用。\n * @throws `RangeError` 当值非有限、为负数或超过 32 位计时器上限。\n */\nconst assertDelay = (milliseconds: number, name = \"milliseconds\"): number => {\n\tif (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > maximumTimerDelay) {\n\t\tthrow new RangeError(`\\`${name}\\` 必须是 0 到 ${maximumTimerDelay} 之间的有限数。`);\n\t}\n\treturn milliseconds;\n};\n\n/**\n * 等待指定时间,并支持 `AbortSignal`。\n *\n * @param milliseconds - 0 至 2,147,483,647 的有限毫秒数。\n * @param options - 可选取消信号。\n * @returns 到期后完成的 Promise。\n * @throws 取消时抛出名称为 `AbortError` 的 `Error`;参数非法时抛出 `RangeError`。\n */\nexport function sleep(milliseconds: number, options: AbortOptions = {}): Promise<void> {\n\tconst delay = assertDelay(milliseconds);\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 取消计时器并使用标准取消错误拒绝等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tclearTimeout(timer);\n\t\t\treject(createAbortError(signal));\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, delay);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/**\n * 为 Promise 增加等待上限。\n *\n * @remarks 超时或取消只停止等待,不能自动取消底层操作;需要真正取消时应同时把\n * 同一个 `AbortSignal` 传给底层 API。\n * @param promise - 需要等待的 Promise 或 PromiseLike。\n * @param timeoutMs - 0 至 2,147,483,647 的有限等待时间。\n * @param options - 取消信号与自定义消息。\n * @returns 底层 Promise 的结果。\n * @throws 超时抛出 `Error`,取消时抛出名称为 `AbortError` 的 `Error`;等待时间非法时抛出 `RangeError`。\n */\nexport function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: number, options: TimeoutOptions = {}): Promise<Result> {\n\tconst delay = assertDelay(timeoutMs, \"timeoutMs\");\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<Result>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 清理竞争结束后不再需要的计时器和监听器。 */\n\t\tfunction cleanup(): void {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t\t/**\n\t\t * 只允许 Promise、超时和取消三个竞争来源中的首个结果生效。\n\t\t *\n\t\t * @param action - 首个完成来源的结算动作。\n\t\t */\n\t\tfunction settle(action: () => void): void {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\taction();\n\t\t}\n\t\t/** 使用调用方取消原因结束当前等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tsettle(() => {\n\t\t\t\treject(createAbortError(signal));\n\t\t\t});\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsettle(() => {\n\t\t\t\treject(new Error(options.message ?? `操作超过 ${delay} 毫秒仍未完成。`));\n\t\t\t});\n\t\t}, delay);\n\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tPromise.resolve(promise).then(\n\t\t\t(value) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\tresolve(value);\n\t\t\t\t});\n\t\t\t},\n\t\t\t(error: unknown) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t});\n}\n\n/**\n * 使用有上限的指数退避重试操作。\n *\n * @typeParam Result - 操作结果类型。\n * @param operation - 每次尝试都会调用的函数;`attempt` 从 1 开始。\n * @param options - 尝试次数、退避和取消策略。\n * @returns 首次成功结果。\n * @throws 最后一次操作错误、`shouldRetry` 错误或名称为 `AbortError` 的取消错误;策略参数非法时抛出 `RangeError`。\n */\nexport async function retry<Result>(\n\toperation: (context: RetryContext) => Result | PromiseLike<Result>,\n\toptions: RetryOptions = {}\n): Promise<Awaited<Result>> {\n\tconst attempts = options.attempts ?? 3;\n\tconst initialDelay = assertDelay(options.delayMs ?? 200, \"delayMs\");\n\tconst maximumDelay = assertDelay(options.maxDelayMs ?? 30_000, \"maxDelayMs\");\n\tconst factor = options.factor ?? 2;\n\tif (!Number.isSafeInteger(attempts) || attempts <= 0) throw new RangeError(\"`attempts` 必须是正安全整数。\");\n\tif (!Number.isFinite(factor) || factor < 1) throw new RangeError(\"`factor` 必须是大于或等于 1 的有限数。\");\n\n\tfor (let attempt = 1; attempt <= attempts; attempt += 1) {\n\t\tthrowIfAborted(options.signal);\n\t\tconst context: RetryContext = options.signal === undefined ? { attempt } : { attempt, signal: options.signal };\n\t\ttry {\n\t\t\treturn await operation(context);\n\t\t} catch (error) {\n\t\t\tif (attempt === attempts || (options.shouldRetry !== undefined && !(await options.shouldRetry(error, context)))) throw error;\n\t\t\t// `0 * Infinity` is `NaN`; a zero initial delay must remain zero even when\n\t\t\t// a very large factor overflows during a later attempt.\n\t\t\tconst delay = initialDelay === 0 ? 0 : Math.min(initialDelay * factor ** (attempt - 1), maximumDelay);\n\t\t\tawait sleep(delay, options.signal === undefined ? {} : { signal: options.signal });\n\t\t}\n\t}\n\n\tthrow new Error(\"重试结束但未获得结果。\");\n}\n\n/**\n * 以固定并发度映射数组,并保持结果顺序。\n *\n * @remarks 任一映射失败后不会再调度新项目,但已经开始的映射无法自动取消;映射器\n * 应使用传入的 `signal` 取消底层工作。\n * @param items - 不会被修改的输入数组。\n * @param concurrency - 同时运行的最大任务数,必须为正安全整数。\n * @param mapper - 接收项目、索引和取消信号的映射函数。\n * @param options - 可选取消信号。\n * @returns 与输入长度和顺序一致的结果数组;稀疏空位保持为空位且不会调用映射器。\n * @throws `RangeError` 当 `concurrency` 不是正安全整数;取消时抛出名称为 `AbortError` 的 `Error`。\n */\nexport async function mapConcurrent<Item, Result>(\n\titems: readonly Item[],\n\tconcurrency: number,\n\tmapper: (item: Item, index: number, signal: AbortSignal | undefined) => Result | PromiseLike<Result>,\n\toptions: ConcurrentMapOptions = {}\n): Promise<Awaited<Result>[]> {\n\tif (!Number.isSafeInteger(concurrency) || concurrency <= 0) {\n\t\tthrow new RangeError(\"`concurrency` 必须是正安全整数。\");\n\t}\n\tthrowIfAborted(options.signal);\n\n\tconst results = new Array<Awaited<Result>>(items.length);\n\tlet nextIndex = 0;\n\tlet failed = false;\n\t/**\n\t * 从共享游标持续领取映射任务。\n\t *\n\t * @remarks JavaScript 单线程执行保证“读取索引并递增”不会被另一个 Worker 插入,因此每个索引只会领取一次。\n\t * @returns 当前 Worker 没有剩余任务时完成。\n\t * @throws 原样传播取消错误或 Mapper 错误,并阻止其他 Worker 领取新任务。\n\t */\n\tconst worker = async (): Promise<void> => {\n\t\twhile (!failed) {\n\t\t\tthrowIfAborted(options.signal);\n\t\t\tconst index = nextIndex;\n\t\t\tif (index >= items.length) return;\n\t\t\tnextIndex += 1;\n\t\t\tif (!(index in items)) continue;\n\t\t\ttry {\n\t\t\t\tresults[index] = await mapper(items[index] as Item, index, options.signal);\n\t\t\t} catch (error) {\n\t\t\t\tfailed = true;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst workerCount = Math.min(concurrency, items.length);\n\tawait Promise.all(Array.from({ length: workerCount }, () => worker()));\n\treturn results;\n}\n\n/**\n * 创建 Promise 感知的防抖函数。\n *\n * @remarks 同一窗口内的所有调用都会等待最后一组参数对应的执行结果;回调错误会原样\n * 拒绝该批次的全部调用,不会留下永久 pending 的 Promise。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限等待时间,默认 300 毫秒。\n * @returns 具有取消、立即执行和状态方法的防抖函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function debounce<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): DebouncedFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latestArguments: Arguments | undefined;\n\tlet waiters: PromiseWaiter<Awaited<Result>>[] = [];\n\n\t/**\n\t * 执行并结算当前防抖批次。\n\t *\n\t * @returns 最后一组参数对应的回调结果。\n\t * @throws 没有待处理批次时抛出 `Error`;回调错误会原样传播给批次中的全部调用方。\n\t */\n\tconst execute = async (): Promise<Awaited<Result>> => {\n\t\tconst arguments_ = latestArguments;\n\t\tif (arguments_ === undefined) {\n\t\t\tthrow new Error(\"当前没有待处理的防抖调用。\");\n\t\t}\n\t\tlatestArguments = undefined;\n\t\ttimer = undefined;\n\t\tconst currentWaiters = waiters;\n\t\twaiters = [];\n\t\ttry {\n\t\t\tconst result = await callback(...arguments_);\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.resolve(result);\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.reject(error);\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\t/**\n\t * 更新批次参数并返回当前调用方专属的等待 Promise。\n\t *\n\t * @param arguments_ - 本次调用参数;同批次中只有最后一组参数会执行。\n\t * @returns 与当前批次共享结果、但可独立结算的 Promise。\n\t */\n\tconst debounced = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tlatestArguments = arguments_;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\tvoid execute().catch(() => undefined);\n\t\t}, delay);\n\t\treturn new Promise<Awaited<Result>>((resolve, reject) => waiters.push({ reject, resolve }));\n\t};\n\n\tdebounced.cancel = (reason?: unknown): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tlatestArguments = undefined;\n\t\tconst error = reason ?? new Error(\"防抖调用已取消。\");\n\t\twaiters.forEach((waiter) => {\n\t\t\twaiter.reject(error);\n\t\t});\n\t\twaiters = [];\n\t};\n\tdebounced.flush = (): Promise<Awaited<Result>> | undefined => {\n\t\tif (timer === undefined) return undefined;\n\t\tclearTimeout(timer);\n\t\treturn execute();\n\t};\n\tdebounced.pending = (): boolean => timer !== undefined;\n\treturn debounced;\n}\n\n/**\n * 创建 Promise 感知的前缘节流函数。\n *\n * @remarks 窗口内的调用共享首次调用结果。若回调执行时间超过窗口,后续调用仍会等待\n * 当前回调,避免异步操作重入;该函数不安排尾缘调用。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限冷却时间,默认 300 毫秒。\n * @returns 具有取消和状态方法的前缘节流函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function throttle<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): ThrottledFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet current: Promise<Awaited<Result>> | undefined;\n\tlet cooling = false;\n\tlet settled = false;\n\n\t/**\n\t * 尝试释放当前节流窗口。\n\t *\n\t * @remarks 只有回调和冷却计时器都结束后才清空共享 Promise,避免长回调发生重入。\n\t */\n\tconst release = (): void => {\n\t\tif (!cooling && settled) current = undefined;\n\t};\n\t/**\n\t * 执行前缘调用或复用当前窗口的共享 Promise。\n\t *\n\t * @param arguments_ - 仅新窗口首个调用会使用的参数。\n\t * @returns 当前窗口首次调用的 Promise。\n\t */\n\tconst throttled = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tif (current !== undefined) return current;\n\t\tcooling = true;\n\t\tsettled = false;\n\t\tlet invocation: Promise<Awaited<Result>>;\n\t\ttry {\n\t\t\tinvocation = Promise.resolve(callback(...arguments_));\n\t\t} catch (error) {\n\t\t\tinvocation = Promise.reject(error);\n\t\t}\n\t\tcurrent = invocation;\n\t\tinvocation.then(\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t}\n\t\t);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tcooling = false;\n\t\t\trelease();\n\t\t}, delay);\n\t\treturn invocation;\n\t};\n\n\tthrottled.cancel = (): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tcooling = false;\n\t\trelease();\n\t};\n\tthrottled.pending = (): boolean => current !== undefined;\n\treturn throttled;\n}\n","/**\n * 延迟解析 UTF-8 TextDecoder,确保模块导入阶段不依赖 Encoding API。\n *\n * @returns 启用 Fatal 模式的新解码器,非法 UTF-8 会直接失败。\n * @throws `Error` 当当前平台没有提供 `TextDecoder`。\n */\nexport const getTextDecoder = (): TextDecoder => {\n\tconst TextDecoderConstructor = globalThis.TextDecoder;\n\tif (typeof TextDecoderConstructor !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持 TextDecoder。\");\n\t}\n\treturn new TextDecoderConstructor(\"utf-8\", { fatal: true });\n};\n\n/**\n * 延迟解析 TextEncoder,让纯字节 API 在缺少 Encoding API 的平台仍可导入。\n *\n * @returns 新建的 UTF-8 编码器。\n * @throws `Error` 当当前平台没有提供 `TextEncoder`。\n */\nexport const getTextEncoder = (): TextEncoder => {\n\tconst TextEncoderConstructor = globalThis.TextEncoder;\n\tif (typeof TextEncoderConstructor !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持 TextEncoder。\");\n\t}\n\treturn new TextEncoderConstructor();\n};\n\n/**\n * 在确认平台能力后把 JavaScript 字符串编码为 UTF-8。\n *\n * @param value - 待编码文本。\n * @returns 使用独立 ArrayBuffer 的 UTF-8 字节数组。\n * @throws `Error` 当当前平台没有提供 `TextEncoder`。\n */\nexport const encodeUtf8 = (value: string): Uint8Array<ArrayBuffer> => getTextEncoder().encode(value);\n\n/** 解码或解密后的字符串扩展。 */\ninterface DecodedTextExtension {\n\t/**\n\t * 显式把原始文本解析为 JSON 值。\n\t *\n\t * @remarks 泛型只描述调用方期望的类型,不验证实际 JSON 结构;不可信数据仍需执行运行时校验。\n\t * @returns `JSON.parse` 生成的对象、数组、标量或 `null`。\n\t * @throws `TypeError` 当原始文本不是合法 JSON。\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 未传泛型时按公共 API 约定保留 JSON.parse 的 any 返回类型。\n\tparseJson: <Value = any>() => Value;\n}\n\n/** 可直接作为原始字符串使用,并支持显式 JSON 解析的解码或解密结果。 */\nexport type DecodedText = string & DecodedTextExtension;\n\nconst parseJsonMarker = Symbol.for(\"@fast-china/utils/parse-json\");\n\n/** 把当前字符串解析为 JSON 值。 */\nconst parseJson = function <Value = ReturnType<typeof JSON.parse>>(this: string): Value {\n\ttry {\n\t\treturn JSON.parse(String(this)) as Value;\n\t} catch (cause) {\n\t\tthrow new TypeError(\"解码后的文本不是有效的 JSON。\", { cause });\n\t}\n};\n\nObject.defineProperty(parseJson, parseJsonMarker, { value: true });\n\n/** 按需安装不可枚举的字符串 JSON 解析扩展。 */\nconst ensureParseJsonExtension = (): void => {\n\tconst descriptor = Object.getOwnPropertyDescriptor(String.prototype, \"parseJson\");\n\tif (descriptor !== undefined) {\n\t\tif (typeof descriptor.value === \"function\" && Reflect.get(descriptor.value, parseJsonMarker) === true) return;\n\t\tthrow new TypeError(\"String.prototype.parseJson 已被其他实现占用。\");\n\t}\n\n\ttry {\n\t\tObject.defineProperty(String.prototype, \"parseJson\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: parseJson,\n\t\t\twritable: true,\n\t\t});\n\t} catch (cause) {\n\t\tthrow new TypeError(\"当前运行环境不允许安装 String.prototype.parseJson。\", { cause });\n\t}\n};\n\n/**\n * 创建可链式解析 JSON 的原始字符串。\n *\n * @param text - 解码或解密后的原始文本。\n * @returns 可直接作为字符串使用或显式调用 `.parseJson<Value>()` 的结果。\n */\nexport const createDecodedText = (text: string): DecodedText => {\n\tensureParseJsonExtension();\n\treturn text as DecodedText;\n};\n","const byteUnits = [\"B\", \"kB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"] as const;\nconst binaryByteUnits = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"] as const;\n\n/** {@link formatBytes} 的格式化选项。 */\nexport interface FormatBytesOptions {\n\t/** 计量基数。`1000` 生成 SI 单位,`1024` 生成 IEC 单位;默认 `1024`。 */\n\tbase?: 1000 | 1024;\n\t/** 小数位数,范围 0 至 20;默认 `2`。 */\n\tdecimals?: number;\n\t/** `Intl.NumberFormat` 使用的语言;默认固定为 `en-US` 以保证输出稳定。 */\n\tlocale?: string | readonly string[];\n}\n\n/**\n * 拒绝 NaN,同时允许具体 API 自行决定是否接受 Infinity。\n *\n * @param value - 待校验数值。\n * @param name - 用于错误消息的参数名称。\n * @throws `RangeError` 当值为 NaN。\n */\nconst assertNotNaN = (value: number, name: string): void => {\n\tif (Number.isNaN(value)) throw new RangeError(`\\`${name}\\` 不能是 NaN。`);\n};\n\n/**\n * 校验有限数值。\n *\n * @param value - 待校验数值。\n * @param name - 用于错误消息的参数名称。\n * @throws `RangeError` 当值为 NaN 或无穷大。\n */\nconst assertFinite = (value: number, name: string): void => {\n\tif (!Number.isFinite(value)) throw new RangeError(`\\`${name}\\` 必须是有限数。`);\n};\n\n/**\n * 使用科学计数法移动十进制位。\n *\n * @remarks 该方式用于 `roundTo`,可减少直接乘除十次幂造成的额外二进制舍入误差。\n * @param value - 原始数值。\n * @param exponent - 十进制移动位数;正数向右移动。\n * @returns 移动后的数值。\n */\nconst shiftDecimal = (value: number, exponent: number): number => {\n\tif (Object.is(value, -0)) return -0;\n\tconst [coefficient = \"0\", currentExponent = \"0\"] = value.toString().split(\"e\");\n\treturn Number(`${coefficient}e${Number(currentExponent) + exponent}`);\n};\n\n/**\n * 把数字限制在闭区间内。\n *\n * @param value - 需要限制的数字。\n * @param minimum - 闭区间下界。\n * @param maximum - 闭区间上界。\n * @returns `minimum <= result <= maximum` 的值。\n * @throws `RangeError` 当参数为 `NaN` 或下界大于上界。\n */\nexport function clamp(value: number, minimum: number, maximum: number): number {\n\tassertNotNaN(value, \"value\");\n\tassertNotNaN(minimum, \"minimum\");\n\tassertNotNaN(maximum, \"maximum\");\n\tif (minimum > maximum) throw new RangeError(\"`minimum` 不能大于 `maximum`。\");\n\treturn Math.min(Math.max(value, minimum), maximum);\n}\n\n/**\n * 判断数字是否位于指定区间。\n *\n * @param value - 待检查数字。\n * @param minimum - 包含的下界。\n * @param maximum - 上界。\n * @param includeMaximum - 是否包含上界;默认使用半开区间 `[minimum, maximum)`。\n * @returns 数字满足区间边界时返回 `true`。\n * @throws `RangeError` 当参数为 `NaN` 或下界大于上界。\n */\nexport function inRange(value: number, minimum: number, maximum: number, includeMaximum = false): boolean {\n\tassertNotNaN(value, \"value\");\n\tassertNotNaN(minimum, \"minimum\");\n\tassertNotNaN(maximum, \"maximum\");\n\tif (minimum > maximum) throw new RangeError(\"`minimum` 不能大于 `maximum`。\");\n\treturn value >= minimum && (includeMaximum ? value <= maximum : value < maximum);\n}\n\n/**\n * 按十进制位数四舍五入。\n *\n * @remarks IEEE-754 浮点数仍可能存在不可表示误差;财务金额应使用十进制定点方案。\n * @param value - 有限数字。\n * @param digits - 小数位数;负数表示十位、百位等,范围 -15 至 15。\n * @returns 按 `Math.round` 语义舍入后的数字。\n * @throws `RangeError` 当值非有限或位数超出范围。\n */\nexport function roundTo(value: number, digits = 0): number {\n\tassertFinite(value, \"value\");\n\tif (!Number.isSafeInteger(digits) || digits < -15 || digits > 15) {\n\t\tthrow new RangeError(\"`digits` 必须是 -15 到 15 之间的安全整数。\");\n\t}\n\tconst shifted = shiftDecimal(value, digits);\n\t// 对已经没有可表示小数的大数,乘以 10^digits 可能溢出;此时舍入不会改变值。\n\tif (!Number.isFinite(shifted)) return value;\n\treturn shiftDecimal(Math.round(shifted), -digits);\n}\n\n/**\n * 对有限数字求和。\n *\n * @param values - 不会被修改的数字数组。\n * @returns 算术和;空数组返回 `0`。\n * @throws `RangeError` 当任一值非有限或累计结果溢出。\n */\nexport function sum(values: readonly number[]): number {\n\tlet total = 0;\n\tlet compensation = 0;\n\tvalues.forEach((value) => {\n\t\tassertFinite(value, \"value\");\n\t\t// Kahan 补偿保存上一次浮点加法丢失的低位,减少大量小数累计误差。\n\t\tconst adjusted = value - compensation;\n\t\tconst next = total + adjusted;\n\t\tif (!Number.isFinite(next)) throw new RangeError(\"总和超出有限数范围。\");\n\t\tcompensation = next - total - adjusted;\n\t\ttotal = next;\n\t});\n\treturn total;\n}\n\n/**\n * 计算有限数字的算术平均值。\n *\n * @param values - 不会被修改的数字数组。\n * @returns 空数组或只有稀疏空位的数组返回 `undefined`;空位不参与分母。\n * @throws `RangeError` 当任一值非有限。\n */\nexport function average(values: readonly number[]): number | undefined {\n\tlet count = 0;\n\tlet mean = 0;\n\tvalues.forEach((value) => {\n\t\tassertFinite(value, \"value\");\n\t\tcount += 1;\n\t\t// 加权增量形式避免先求和导致 MAX_VALUE + MAX_VALUE 溢出。\n\t\tmean = mean * ((count - 1) / count) + value / count;\n\t});\n\treturn count === 0 ? undefined : mean;\n}\n\n/**\n * 在两个数字间做线性插值。\n *\n * @remarks `amount` 不限制在 0 至 1;区间外的值会执行线性外推。\n * @param start - `amount = 0` 时的起点。\n * @param end - `amount = 1` 时的终点。\n * @param amount - 插值或外推比例。\n * @returns 线性计算结果。\n * @throws `RangeError` 当任一参数非有限或结果超出有限数字范围。\n */\nexport function lerp(start: number, end: number, amount: number): number {\n\tassertFinite(start, \"start\");\n\tassertFinite(end, \"end\");\n\tassertFinite(amount, \"amount\");\n\tconst result = start * (1 - amount) + end * amount;\n\tif (!Number.isFinite(result)) throw new RangeError(\"插值结果超出有限数范围。\");\n\treturn result;\n}\n\n/**\n * 将非负字节数格式化为 SI 或 IEC 单位。\n *\n * @param bytes - 非负有限字节数。\n * @param options - 基数、小数位和语言选项。\n * @returns 例如 `1.5 KiB`。\n * @throws `RangeError` 当字节数为负或非有限、基数不是 1000/1024、小数位非法,或 Locale 无效。\n */\nexport function formatBytes(bytes: number, options: FormatBytesOptions = {}): string {\n\tassertFinite(bytes, \"bytes\");\n\tif (bytes < 0) throw new RangeError(\"`bytes` 不能为负数。\");\n\tconst requestedBase: unknown = options.base ?? 1024;\n\tif (requestedBase !== 1000 && requestedBase !== 1024) throw new RangeError(\"`base` 必须是 1000 或 1024。\");\n\tconst base = requestedBase;\n\tconst decimals = options.decimals ?? 2;\n\tif (!Number.isSafeInteger(decimals) || decimals < 0 || decimals > 20) {\n\t\tthrow new RangeError(\"`decimals` 必须是 0 到 20 之间的安全整数。\");\n\t}\n\tif (bytes === 0) return \"0 B\";\n\n\tconst units = base === 1024 ? binaryByteUnits : byteUnits;\n\tconst exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n\tconst value = bytes / base ** exponent;\n\tconst formatted = new Intl.NumberFormat(options.locale ?? \"en-US\", {\n\t\tmaximumFractionDigits: decimals,\n\t\tminimumFractionDigits: 0,\n\t\tuseGrouping: false,\n\t}).format(value);\n\treturn `${formatted} ${units[exponent] ?? units.at(-1)}`;\n}\n\n/**\n * 在半开区间内生成随机整数。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param minimum - 包含的安全整数下界。\n * @param maximumExclusive - 不包含的安全整数上界;区间宽度最大为 2^32。\n * @returns 位于 `[minimum, maximumExclusive)` 的随机整数。\n * @throws 参数非法时抛出 `RangeError`。\n */\nexport function randomInt(minimum: number, maximumExclusive: number): number {\n\tif (!Number.isSafeInteger(minimum) || !Number.isSafeInteger(maximumExclusive)) {\n\t\tthrow new RangeError(\"`minimum` 和 `maximumExclusive` 必须是安全整数。\");\n\t}\n\tconst range = maximumExclusive - minimum;\n\tconst uint32Range = 0x1_0000_0000;\n\tif (range <= 0 || range > uint32Range) {\n\t\tthrow new RangeError(\"区间不能为空且宽度不能超过 2^32。\");\n\t}\n\tconst crypto = globalThis.crypto;\n\tconst hasWebCrypto = typeof crypto?.getRandomValues === \"function\";\n\n\t// 只接受可以被区间宽度整除的最大 2^32 前缀,消除取模偏差。\n\tconst limit = Math.floor(uint32Range / range) * range;\n\tconst values = new Uint32Array(1);\n\tlet sample: number;\n\tdo {\n\t\tif (hasWebCrypto) crypto.getRandomValues(values);\n\t\telse values[0] = Math.floor(Math.random() * uint32Range);\n\t\tsample = values[0] ?? uint32Range;\n\t} while (sample >= limit);\n\treturn minimum + (sample % range);\n}\n","import { type DecodedText, createDecodedText, encodeUtf8, getTextDecoder } from \"../internal/text\";\nimport { randomInt } from \"../number/index\";\n\nexport type { DecodedText } from \"../internal/text\";\n\nconst alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/** 内部共享解码器支持的两种字符表规则。 */\ntype Base64Variant = \"standard\" | \"url\";\n\n/**\n * 创建统一的 Base64 输入错误。\n *\n * @param variant - 当前解析的标准 Base64 或 Base64URL 变体。\n * @returns 带有具体变体名称的 `TypeError`。\n */\nconst invalidBase64 = (variant: Base64Variant): TypeError => {\n\treturn new TypeError(`该值不是有效的 ${variant === \"url\" ? \"Base64URL\" : \"Base64\"}。`);\n};\n\n/**\n * 校验并规范化 Base64 文本。\n *\n * @remarks 标准 Base64 允许 ASCII 空白,Base64URL 不允许;两者最终都会转换为标准字符表和完整填充。\n * @param value - 原始编码文本。\n * @param variant - 需要应用的字符表与空白规则。\n * @returns 使用标准字符表且长度为 4 倍数的文本。\n * @throws `TypeError` 当字符、填充位置或编码长度非法。\n */\nconst normalizeBase64 = (value: string, variant: Base64Variant): string => {\n\tconst withoutWhitespace = variant === \"standard\" ? value.replace(/[\\t\\n\\f\\r ]+/gu, \"\") : value;\n\tconst pattern = variant === \"url\" ? /^[\\w-]*={0,2}$/u : /^[A-Za-z\\d+/]*={0,2}$/u;\n\tif (!pattern.test(withoutWhitespace) || withoutWhitespace.length % 4 === 1) throw invalidBase64(variant);\n\tif (withoutWhitespace.includes(\"=\") && withoutWhitespace.length % 4 !== 0) throw invalidBase64(variant);\n\n\tconst standard = (variant === \"url\" ? withoutWhitespace.replace(/-/gu, \"+\").replace(/_/gu, \"/\") : withoutWhitespace).replace(/=+$/u, \"\");\n\treturn standard.padEnd(Math.ceil(standard.length / 4) * 4, \"=\");\n};\n\n/**\n * 使用固定字符表编码任意字节。\n *\n * @param bytes - 不会被修改的源字节。\n * @returns 带标准 `=` 填充的 Base64 文本。\n */\nconst encodeBytes = (bytes: Uint8Array): string => {\n\tlet result = \"\";\n\tfor (let index = 0; index < bytes.length; index += 3) {\n\t\tconst first = bytes[index] ?? 0;\n\t\tconst second = bytes[index + 1];\n\t\tconst third = bytes[index + 2];\n\t\tconst bitmap = (first << 16) | ((second ?? 0) << 8) | (third ?? 0);\n\t\tresult += alphabet[(bitmap >> 18) & 63] ?? \"\";\n\t\tresult += alphabet[(bitmap >> 12) & 63] ?? \"\";\n\t\tresult += second === undefined ? \"=\" : (alphabet[(bitmap >> 6) & 63] ?? \"\");\n\t\tresult += third === undefined ? \"=\" : (alphabet[bitmap & 63] ?? \"\");\n\t}\n\treturn result;\n};\n\n/**\n * 把 Base64 或 Base64URL 文本解码为字节。\n *\n * @remarks 最后一组未使用位必须为零,以拒绝同一字节序列的非规范编码。\n * @param value - 待解码文本。\n * @param variant - 输入使用的编码变体。\n * @returns 新建的字节数组。\n * @throws `TypeError` 当输入格式或尾部位非法。\n */\nconst decodeBytes = (value: string, variant: Base64Variant): Uint8Array => {\n\tconst normalized = normalizeBase64(value, variant);\n\tif (normalized.length === 0) return new Uint8Array();\n\n\tconst padding = normalized.endsWith(\"==\") ? 2 : normalized.endsWith(\"=\") ? 1 : 0;\n\tconst result = new Uint8Array((normalized.length / 4) * 3 - padding);\n\tlet outputIndex = 0;\n\n\tfor (let index = 0; index < normalized.length; index += 4) {\n\t\tconst first = alphabet.indexOf(normalized[index] ?? \"\");\n\t\tconst second = alphabet.indexOf(normalized[index + 1] ?? \"\");\n\t\tconst thirdCharacter = normalized[index + 2] ?? \"=\";\n\t\tconst fourthCharacter = normalized[index + 3] ?? \"=\";\n\t\tconst third = thirdCharacter === \"=\" ? 0 : alphabet.indexOf(thirdCharacter);\n\t\tconst fourth = fourthCharacter === \"=\" ? 0 : alphabet.indexOf(fourthCharacter);\n\t\tif (first < 0 || second < 0 || third < 0 || fourth < 0) throw invalidBase64(variant);\n\n\t\tconst isLast = index + 4 === normalized.length;\n\t\t// 填充字符对应的未使用低位必须为零,否则不同文本可以解码为同一字节序列。\n\t\tif (isLast && ((padding === 2 && (second & 15) !== 0) || (padding === 1 && (third & 3) !== 0))) {\n\t\t\tthrow invalidBase64(variant);\n\t\t}\n\n\t\tconst bitmap = (first << 18) | (second << 12) | (third << 6) | fourth;\n\t\tif (outputIndex < result.length) result[outputIndex++] = (bitmap >> 16) & 255;\n\t\tif (outputIndex < result.length) result[outputIndex++] = (bitmap >> 8) & 255;\n\t\tif (outputIndex < result.length) result[outputIndex++] = bitmap & 255;\n\t}\n\treturn result;\n};\n\n/**\n * 以 Fatal 模式解码 UTF-8。\n *\n * @param bytes - 待解码字节。\n * @returns 解码后的 JavaScript 字符串。\n * @throws `TypeError` 当字节不是有效 UTF-8;原始平台异常保存在 `cause` 中。\n */\nconst decodeUtf8 = (bytes: Uint8Array): string => {\n\tconst textDecoder = getTextDecoder();\n\ttry {\n\t\treturn textDecoder.decode(bytes);\n\t} catch (cause) {\n\t\tthrow new TypeError(\"解码后的字节不是有效的 UTF-8。\", { cause });\n\t}\n};\n\n/**\n * 将任意字节编码为标准 Base64。\n *\n * @param bytes - 不会被修改的字节序列。\n * @returns 带标准 `=` 填充的 Base64 文本。\n */\nexport function encodeBase64Bytes(bytes: Uint8Array): string {\n\treturn encodeBytes(bytes);\n}\n\n/**\n * 解码标准 Base64。\n *\n * @remarks 允许省略填充和包含 ASCII 空白,但拒绝非规范尾部位。\n * @param value - Base64 文本。\n * @returns 新建的字节数组。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function decodeBase64Bytes(value: string): Uint8Array {\n\treturn decodeBytes(value, \"standard\");\n}\n\n/**\n * 将 UTF-8 文本编码为标准 Base64。\n *\n * @param value - 任意 Unicode 字符串。\n * @returns 带标准填充的 Base64 文本。\n * @throws 缺少 Encoding API 时抛出 `Error`。\n */\nexport function encodeBase64(value: string): string {\n\treturn encodeBytes(encodeUtf8(value));\n}\n\n/**\n * 将标准 Base64 解码为 UTF-8 文本。\n *\n * @param value - Base64 文本。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串。\n * @throws Base64 或 UTF-8 非法时抛出 `TypeError`;缺少 Encoding API 时抛出 `Error`。\n */\nexport function decodeBase64(value: string): DecodedText {\n\treturn createDecodedText(decodeUtf8(decodeBase64Bytes(value)));\n}\n\n/**\n * 将任意字节编码为无填充 Base64URL。\n *\n * @param bytes - 不会被修改的字节序列。\n * @returns 仅使用 URL 安全字母表的文本。\n */\nexport function encodeBase64UrlBytes(bytes: Uint8Array): string {\n\treturn encodeBytes(bytes).replace(/\\+/gu, \"-\").replace(/\\//gu, \"_\").replace(/=+$/u, \"\");\n}\n\n/**\n * 解码 Base64URL 字节。\n *\n * @remarks 接受带填充和无填充形式,不接受空白或标准 Base64 的 `+`、`/`。\n * @param value - Base64URL 文本。\n * @returns 新建的字节数组。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function decodeBase64UrlBytes(value: string): Uint8Array {\n\treturn decodeBytes(value, \"url\");\n}\n\n/**\n * 将 UTF-8 文本编码为无填充 Base64URL。\n *\n * @param value - 任意 Unicode 字符串。\n * @returns 仅使用 URL 安全字母表的文本。\n * @throws 缺少 Encoding API 时抛出 `Error`。\n */\nexport function encodeBase64Url(value: string): string {\n\treturn encodeBase64UrlBytes(encodeUtf8(value));\n}\n\n/**\n * 将 Base64URL 解码为 UTF-8 文本。\n *\n * @param value - 带填充或无填充的 Base64URL 文本。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串。\n * @throws Base64URL 或 UTF-8 非法时抛出 `TypeError`;缺少 Encoding API 时抛出 `Error`。\n */\nexport function decodeBase64Url(value: string): DecodedText {\n\treturn createDecodedText(decodeUtf8(decodeBase64UrlBytes(value)));\n}\n\n/**\n * 把 Latin-1 文本编码为标准 Base64。\n *\n * @param value - 每个 UTF-16 码元都必须位于 0–255 的文本。\n * @returns 带标准填充的 Base64 文本。\n * @throws `TypeError` 当文本包含 Latin-1 范围外的码元。\n */\nexport function encodeLatin1Base64(value: string): string {\n\tconst bytes = new Uint8Array(value.length);\n\tfor (let index = 0; index < value.length; index += 1) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (code > 255) throw new TypeError(\"待编码字符串包含超出 Latin-1 范围的字符。\");\n\t\tbytes[index] = code;\n\t}\n\treturn encodeBase64Bytes(bytes);\n}\n\n/**\n * 把标准 Base64 解码为 Latin-1 文本。\n *\n * @param value - 标准 Base64 文本;允许 ASCII 空白和省略尾部填充。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的 Latin-1 原始字符串。\n * @throws `TypeError` 当 Base64 格式或尾部位非法。\n */\nexport function decodeLatin1Base64(value: string): DecodedText {\n\tconst bytes = decodeBase64Bytes(value);\n\tlet result = \"\";\n\tfor (const byte of bytes) result += String.fromCharCode(byte);\n\treturn createDecodedText(result);\n}\n\nconst randomPrefixAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst defaultRandomPrefixLength = 6;\n\n/** SecureBase64 兼容格式中一组不可变的字符插入位置。 */\ninterface Base64PasswordDictionaryEntry {\n\t/** 原始载荷中的固定字符索引;超出短载荷长度时忽略当前条目。 */\n\tindex: number;\n\t/** 从原始载荷复制字符的固定索引;数值属于持久化协议,不能重新计算。 */\n\trandomIndex: number;\n}\n\n/** 固定 SecureBase64 字典;索引、顺序与映射属于持久化格式,禁止修改。 */\nconst base64PasswordDictionary: readonly Readonly<Base64PasswordDictionaryEntry>[] = Object.freeze([\n\t{ index: 977, randomIndex: 188 },\n\t{ index: 926, randomIndex: 201 },\n\t{ index: 851, randomIndex: 225 },\n\t{ index: 700, randomIndex: 255 },\n\t{ index: 600, randomIndex: 268 },\n\t{ index: 500, randomIndex: 277 },\n\t{ index: 400, randomIndex: 288 },\n\t{ index: 330, randomIndex: 327 },\n\t{ index: 300, randomIndex: 180 },\n\t{ index: 200, randomIndex: 178 },\n\t{ index: 100, randomIndex: 124 },\n\t{ index: 98, randomIndex: 95 },\n\t{ index: 92, randomIndex: 90 },\n\t{ index: 91, randomIndex: 87 },\n\t{ index: 88, randomIndex: 84 },\n\t{ index: 82, randomIndex: 79 },\n\t{ index: 78, randomIndex: 71 },\n\t{ index: 72, randomIndex: 69 },\n\t{ index: 68, randomIndex: 66 },\n\t{ index: 59, randomIndex: 55 },\n\t{ index: 48, randomIndex: 43 },\n\t{ index: 42, randomIndex: 37 },\n\t{ index: 36, randomIndex: 30 },\n\t{ index: 33, randomIndex: 27 },\n\t{ index: 24, randomIndex: 20 },\n\t{ index: 23, randomIndex: 18 },\n\t{ index: 21, randomIndex: 16 },\n\t{ index: 17, randomIndex: 14 },\n\t{ index: 13, randomIndex: 9 },\n\t{ index: 7, randomIndex: 4 },\n\t{ index: 5, randomIndex: 3 },\n\t{ index: 2, randomIndex: 1 },\n]);\n\n/**\n * 校验 SecureBase64 兼容格式的前缀长度。\n *\n * @param length - 待校验的前缀字符数。\n * @throws `RangeError` 当长度不是非负安全整数。\n */\nconst assertPrefixLength = (length: number): void => {\n\tif (!Number.isSafeInteger(length) || length < 0) throw new RangeError(\"`prefixStrLength` 必须是非负安全整数。\");\n};\n\n/**\n * 生成 SecureBase64 兼容格式使用的随机前缀。\n *\n * @remarks 优先使用 Web Crypto,能力缺失时回退到 `Math.random()`。前缀只用于降低相同明文\n * 产生相同载荷的概率,本身不构成加密,也不得承担安全用途。\n * @param length - 需要生成的字符数,调用前必须完成校验。\n * @returns 由历史字母表组成的文本。\n */\nconst createRandomPrefix = (length: number): string => {\n\tlet result = \"\";\n\tfor (let index = 0; index < length; index += 1) {\n\t\tresult += randomPrefixAlphabet[randomInt(0, randomPrefixAlphabet.length)] ?? \"\";\n\t}\n\treturn result;\n};\n\n/**\n * 按固定字典向 Base64 文本插入冗余字符。\n *\n * @remarks 字典按高索引到低索引排列,确保插入不会改变尚未处理的位置。\n * @param base64Value - 尚未插入兼容字典字符的 Base64 文本。\n * @returns 与旧持久化格式兼容的 SecureBase64 载荷。\n */\nconst insertDictionaryCharacters = (base64Value: string): string => {\n\tlet result = base64Value;\n\tfor (const item of base64PasswordDictionary) {\n\t\tif (item.index >= base64Value.length) continue;\n\t\t// 旧字典的 index=100 项会在 101–124 字符载荷中越界;退回末字符可保持单字符插入协议,旧解码器仍能移除。\n\t\tconst character = base64Value[item.randomIndex] ?? base64Value.at(-1) ?? \"\";\n\t\tresult = result.slice(0, item.index) + character + result.slice(item.index);\n\t}\n\treturn result;\n};\n\n/**\n * 移除历史字典插入的冗余字符。\n *\n * @param base64Value - 已移除随机前缀的 SecureBase64 载荷。\n * @returns 可交给标准 Base64 解码器的文本。\n */\nconst removeDictionaryCharacters = (base64Value: string): string => {\n\tlet result = base64Value;\n\tfor (let index = base64PasswordDictionary.length - 1; index >= 0; index -= 1) {\n\t\tconst item = base64PasswordDictionary[index];\n\t\tif (item !== undefined && item.index < base64Value.length) result = result.slice(0, item.index) + result.slice(item.index + 1);\n\t}\n\treturn result;\n};\n\n/**\n * 使用固定字典和随机前缀编码文本。\n *\n * @remarks 给定相同的 6 字符前缀时,默认输出与旧有效载荷逐字符兼容。旧字典在 101–124 字符载荷中引用越界;这里复制末字符作为单字符回退,\n * 使旧删除字典流程仍能解码。传入 `0` 会同时关闭随机前缀与字典插入。\n * 该格式只是可逆编码,不提供加密、完整性或身份认证。\n * @param value - 任意可由 `encodeURIComponent` 处理的 Unicode 文本。\n * @param prefixLength - 随机字母前缀长度;默认 `6`。\n * @returns 带随机前缀和兼容字典字符的 Base64 文本;空输入返回空字符串。\n * @throws `RangeError` 当前缀长度不是非负安全整数;输入包含孤立代理项时保留平台错误。\n */\nexport function encodeSecureBase64(value: string, prefixLength: number = defaultRandomPrefixLength): string {\n\tif (value.length === 0) return \"\";\n\tassertPrefixLength(prefixLength);\n\tconst prefix = createRandomPrefix(prefixLength);\n\tlet encoded = encodeLatin1Base64(encodeURIComponent(value));\n\tif (prefixLength !== 0) encoded = insertDictionaryCharacters(encoded);\n\treturn prefix + encoded;\n}\n\n/**\n * 解码 {@link encodeSecureBase64} 生成的 SecureBase64 兼容格式。\n *\n * @param value - SecureBase64 文本;必须使用与编码时相同的前缀长度。\n * @param prefixLength - 需要移除的前缀长度;默认 `6`,传入 `0` 时不移除字典字符。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串;空输入返回空字符串。\n * @throws `RangeError` 当前缀长度不是非负安全整数;载荷、Base64 或 URI 编码非法时抛出 `TypeError` 或 `URIError`。\n */\nexport function decodeSecureBase64(value: string, prefixLength: number = defaultRandomPrefixLength): DecodedText {\n\tif (value.length === 0) return createDecodedText(\"\");\n\tassertPrefixLength(prefixLength);\n\tif (prefixLength > value.length) throw new TypeError(\"Base64 值的长度小于配置的前缀长度。\");\n\tlet encoded = value.slice(prefixLength);\n\tif (prefixLength !== 0) encoded = removeDictionaryCharacters(encoded);\n\treturn createDecodedText(decodeURIComponent(decodeLatin1Base64(encoded)));\n}\n","/** 0 至 255 范围的 RGB 颜色。 */\nexport interface RgbColor {\n\t/** 蓝色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tblue: number;\n\t/** 绿色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tgreen: number;\n\t/** 红色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tred: number;\n}\n\n/** 带 0 至 1 Alpha 通道的 RGB 颜色。 */\nexport interface RgbaColor extends RgbColor {\n\t/** 不透明度;必须是闭区间 `[0, 1]` 内的有限数,`0` 完全透明,`1` 完全不透明。 */\n\talpha: number;\n}\n\n/**\n * 校验 RGB 颜色通道。\n *\n * @param value - 待校验通道值。\n * @param channel - 用于错误消息的通道名称。\n * @throws `RangeError` 当值非有限或超出 0 至 255。\n */\nconst assertRgbChannel = (value: number, channel: string): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 255) {\n\t\tthrow new RangeError(`\\`${channel}\\` 必须是 0 到 255 之间的有限数。`);\n\t}\n};\n\n/**\n * 校验透明度通道。\n *\n * @param value - 待校验 Alpha 值。\n * @throws `RangeError` 当值非有限或超出闭区间 `[0, 1]`。\n */\nconst assertAlpha = (value: number): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 1) {\n\t\tthrow new RangeError(\"`alpha` 必须是 0 到 1 之间的有限数。\");\n\t}\n};\n\n/**\n * 规范化十六进制颜色文本。\n *\n * @param value - 可带 `#` 的 3、4、6 或 8 位颜色文本。\n * @returns 不带 `#` 的 6 或 8 位文本。\n * @throws `TypeError` 当长度或字符不符合十六进制颜色格式。\n */\nconst normalizeHexColor = (value: string): string => {\n\tconst normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\tif (![3, 4, 6, 8].includes(normalized.length) || !/^[\\dA-F]+$/iu.test(normalized)) {\n\t\tthrow new TypeError(\"十六进制颜色必须包含 3、4、6 或 8 个十六进制字符。\");\n\t}\n\treturn normalized.length <= 4 ? Array.from(normalized, (character) => `${character}${character}`).join(\"\") : normalized;\n};\n\n/**\n * 格式化单个颜色通道。\n *\n * @param value - 已校验的 0 至 255 通道值。\n * @returns 舍入后的两位小写十六进制文本。\n */\nconst formatHexChannel = (value: number): string => Math.round(value).toString(16).padStart(2, \"0\");\n\n/**\n * 解析可带可不带 `#` 的 `rgb`、`rgba`、`rrggbb` 或 `rrggbbaa`。\n *\n * @param value - 十六进制颜色文本。\n * @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function parseHexColor(value: string): RgbaColor {\n\tconst normalized = normalizeHexColor(value);\n\treturn {\n\t\tred: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tgreen: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tblue: Number.parseInt(normalized.slice(4, 6), 16),\n\t\talpha: normalized.length === 8 ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1,\n\t};\n}\n\n/**\n * 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。\n *\n * @param color - 颜色通道;RGB 会四舍五入到最近整数。\n * @param includeAlpha - 是否输出 Alpha;默认只在传入 Alpha 且小于 1 时输出。\n * @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。\n * @throws 通道或 Alpha 非法时抛出 `RangeError`。\n */\nexport function formatHexColor(color: RgbColor | RgbaColor, includeAlpha: boolean = \"alpha\" in color && color.alpha < 1): string {\n\tassertRgbChannel(color.red, \"red\");\n\tassertRgbChannel(color.green, \"green\");\n\tassertRgbChannel(color.blue, \"blue\");\n\tconst alpha = \"alpha\" in color ? color.alpha : 1;\n\tassertAlpha(alpha);\n\tconst rgb = `${formatHexChannel(color.red)}${formatHexChannel(color.green)}${formatHexChannel(color.blue)}`;\n\treturn `#${rgb}${includeAlpha ? formatHexChannel(alpha * 255) : \"\"}`;\n}\n\n/**\n * 线性混合两种十六进制颜色,包括 Alpha 通道。\n *\n * @param first - `amount = 0` 时的颜色。\n * @param second - `amount = 1` 时的颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。\n * @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。\n */\nexport function mixHexColors(first: string, second: string, amount: number): string {\n\tif (!Number.isFinite(amount) || amount < 0 || amount > 1) {\n\t\tthrow new RangeError(\"`amount` 必须是 0 到 1 之间的有限数。\");\n\t}\n\tconst left = parseHexColor(first);\n\tconst right = parseHexColor(second);\n\t/**\n\t * 在单个 RGBA 通道上执行与外层相同权重的线性混合。\n\t *\n\t * @param start - 第一个颜色的通道值。\n\t * @param end - 第二个颜色的通道值。\n\t * @returns 按外层 `amount` 线性混合后的通道值。\n\t */\n\tconst mix = (start: number, end: number): number => start + (end - start) * amount;\n\treturn formatHexColor(\n\t\t{\n\t\t\tred: mix(left.red, right.red),\n\t\t\tgreen: mix(left.green, right.green),\n\t\t\tblue: mix(left.blue, right.blue),\n\t\t\talpha: mix(left.alpha, right.alpha),\n\t\t},\n\t\tleft.alpha < 1 || right.alpha < 1\n\t);\n}\n\n/**\n * 按比例向黑色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithBlack(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#000000\", amount);\n}\n\n/**\n * 按比例向白色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithWhite(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#ffffff\", amount);\n}\n\n/**\n * 按 WCAG sRGB 转换曲线线性化颜色通道。\n *\n * @param channel - 已校验的 0 至 255 通道值。\n * @returns 0 至 1 的线性光值。\n */\nconst linearizeSrgbChannel = (channel: number): number => {\n\tconst value = channel / 255;\n\treturn value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n};\n\n/**\n * 计算 WCAG sRGB 相对亮度。\n *\n * @remarks Alpha 通道不会参与计算;半透明颜色应先与实际背景混合。\n * @param color - 合法十六进制颜色。\n * @returns 0 至 1 的相对亮度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function relativeLuminance(color: string): number {\n\tconst { red, green, blue } = parseHexColor(color);\n\treturn 0.2126 * linearizeSrgbChannel(red) + 0.7152 * linearizeSrgbChannel(green) + 0.0722 * linearizeSrgbChannel(blue);\n}\n\n/**\n * 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。\n *\n * @remarks 返回比值本身,不代表特定字号或 WCAG 等级必然通过。\n * @param first - 第一种十六进制颜色。\n * @param second - 第二种十六进制颜色。\n * @returns 较亮颜色与较暗颜色的对比度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function contrastRatio(first: string, second: string): number {\n\tconst firstLuminance = relativeLuminance(first);\n\tconst secondLuminance = relativeLuminance(second);\n\tconst lighter = Math.max(firstLuminance, secondLuminance);\n\tconst darker = Math.min(firstLuminance, secondLuminance);\n\treturn (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * 从两个候选颜色中选择与背景对比度更高的一项。\n *\n * @param background - 实际不透明背景色。\n * @param first - 第一候选,默认黑色。\n * @param second - 第二候选,默认白色。\n * @returns 对比度较高的原始候选字符串;相同时返回 `first`。\n * @throws 任一颜色非法时抛出 `TypeError`。\n */\nexport function pickHigherContrastColor(background: string, first = \"#000000\", second = \"#ffffff\"): string {\n\treturn contrastRatio(background, first) >= contrastRatio(background, second) ? first : second;\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t var crypto;\n\n\t // Native crypto from window (Browser)\n\t if (typeof window !== 'undefined' && window.crypto) {\n\t crypto = window.crypto;\n\t }\n\n\t // Native crypto in web worker (Browser)\n\t if (typeof self !== 'undefined' && self.crypto) {\n\t crypto = self.crypto;\n\t }\n\n\t // Native crypto from worker\n\t if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t crypto = globalThis.crypto;\n\t }\n\n\t // Native (experimental IE 11) crypto from window (Browser)\n\t if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t crypto = window.msCrypto;\n\t }\n\n\t // Native crypto from global (NodeJS)\n\t if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t crypto = global.crypto;\n\t }\n\n\t // Native crypto import via require (NodeJS)\n\t if (!crypto && typeof require === 'function') {\n\t try {\n\t crypto = require('crypto');\n\t } catch (err) {}\n\t }\n\n\t /*\n\t * Cryptographically secure pseudorandom number generator\n\t *\n\t * As Math.random() is cryptographically not safe to use\n\t */\n\t var cryptoSecureRandomInt = function () {\n\t if (crypto) {\n\t // Use getRandomValues method (Browser)\n\t if (typeof crypto.getRandomValues === 'function') {\n\t try {\n\t return crypto.getRandomValues(new Uint32Array(1))[0];\n\t } catch (err) {}\n\t }\n\n\t // Use randomBytes method (NodeJS)\n\t if (typeof crypto.randomBytes === 'function') {\n\t try {\n\t return crypto.randomBytes(4).readInt32LE();\n\t } catch (err) {}\n\t }\n\t }\n\n\t throw new Error('Native crypto module could not be used to get secure random number.');\n\t };\n\n\t /*\n\t * Local polyfill of Object.create\n\n\t */\n\t var create = Object.create || (function () {\n\t function F() {}\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }());\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var j = 0; j < thatSigBytes; j += 4) {\n\t thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t for (var i = 0; i < nBytes; i += 4) {\n\t words.push(cryptoSecureRandomInt());\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t var processedWords;\n\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * Base64 encoding strategy.\n\t */\n\t var Base64 = C_enc.Base64 = {\n\t /**\n\t * Converts a word array to a Base64 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Base64 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\t var map = this._map;\n\n\t // Clamp excess bits\n\t wordArray.clamp();\n\n\t // Convert\n\t var base64Chars = [];\n\t for (var i = 0; i < sigBytes; i += 3) {\n\t var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t }\n\t }\n\n\t // Add padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t while (base64Chars.length % 4) {\n\t base64Chars.push(paddingChar);\n\t }\n\t }\n\n\t return base64Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Base64 string to a word array.\n\t *\n\t * @param {string} base64Str The Base64 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t */\n\t parse: function (base64Str) {\n\t // Shortcuts\n\t var base64StrLength = base64Str.length;\n\t var map = this._map;\n\t var reverseMap = this._reverseMap;\n\n\t if (!reverseMap) {\n\t reverseMap = this._reverseMap = [];\n\t for (var j = 0; j < map.length; j++) {\n\t reverseMap[map.charCodeAt(j)] = j;\n\t }\n\t }\n\n\t // Ignore padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t var paddingIndex = base64Str.indexOf(paddingChar);\n\t if (paddingIndex !== -1) {\n\t base64StrLength = paddingIndex;\n\t }\n\t }\n\n\t // Convert\n\t return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t },\n\n\t _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t };\n\n\t function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t var words = [];\n\t var nBytes = 0;\n\t for (var i = 0; i < base64StrLength; i++) {\n\t if (i % 4) {\n\t var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t var bitsCombined = bits1 | bits2;\n\t words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t nBytes++;\n\t }\n\t }\n\t return WordArray.create(words, nBytes);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var T = [];\n\n\t // Compute constants\n\t (function () {\n\t for (var i = 0; i < 64; i++) {\n\t T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t }\n\t }());\n\n\t /**\n\t * MD5 hash algorithm.\n\t */\n\t var MD5 = C_algo.MD5 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var M_offset_0 = M[offset + 0];\n\t var M_offset_1 = M[offset + 1];\n\t var M_offset_2 = M[offset + 2];\n\t var M_offset_3 = M[offset + 3];\n\t var M_offset_4 = M[offset + 4];\n\t var M_offset_5 = M[offset + 5];\n\t var M_offset_6 = M[offset + 6];\n\t var M_offset_7 = M[offset + 7];\n\t var M_offset_8 = M[offset + 8];\n\t var M_offset_9 = M[offset + 9];\n\t var M_offset_10 = M[offset + 10];\n\t var M_offset_11 = M[offset + 11];\n\t var M_offset_12 = M[offset + 12];\n\t var M_offset_13 = M[offset + 13];\n\t var M_offset_14 = M[offset + 14];\n\t var M_offset_15 = M[offset + 15];\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\n\t // Computation\n\t a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n\t d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n\t c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n\t b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n\t a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n\t d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n\t c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n\t b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n\t a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n\t d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n\t c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n\t d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n\t d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n\t c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n\t a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n\t d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n\t c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n\t a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n\t d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n\t c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n\t b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n\t a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n\t d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n\t c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n\t b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n\t d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n\t c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n\t d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n\t c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n\t b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n\t d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n\t c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n\t b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n\t a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n\t d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n\t a = II(a, b, c, d, M_offset_0, 6, T[48]);\n\t d = II(d, a, b, c, M_offset_7, 10, T[49]);\n\t c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t b = II(b, c, d, a, M_offset_5, 21, T[51]);\n\t a = II(a, b, c, d, M_offset_12, 6, T[52]);\n\t d = II(d, a, b, c, M_offset_3, 10, T[53]);\n\t c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t b = II(b, c, d, a, M_offset_1, 21, T[55]);\n\t a = II(a, b, c, d, M_offset_8, 6, T[56]);\n\t d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t c = II(c, d, a, b, M_offset_6, 15, T[58]);\n\t b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t a = II(a, b, c, d, M_offset_4, 6, T[60]);\n\t d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t c = II(c, d, a, b, M_offset_2, 15, T[62]);\n\t b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t var nBitsTotalL = nBitsTotal;\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n\t );\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n\t );\n\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t function FF(a, b, c, d, x, s, t) {\n\t var n = a + ((b & c) | (~b & d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function GG(a, b, c, d, x, s, t) {\n\t var n = a + ((b & d) | (c & ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function HH(a, b, c, d, x, s, t) {\n\t var n = a + (b ^ c ^ d) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function II(a, b, c, d, x, s, t) {\n\t var n = a + (c ^ (b | ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.MD5('message');\n\t * var hash = CryptoJS.MD5(wordArray);\n\t */\n\t C.MD5 = Hasher._createHelper(MD5);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacMD5(message, key);\n\t */\n\t C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\treturn CryptoJS.MD5;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-1 hash algorithm.\n\t */\n\t var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476,\n\t 0xc3d2e1f0\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\n\t // Computation\n\t for (var i = 0; i < 80; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t W[i] = (n << 1) | (n >>> 31);\n\t }\n\n\t var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t if (i < 20) {\n\t t += ((b & c) | (~b & d)) + 0x5a827999;\n\t } else if (i < 40) {\n\t t += (b ^ c ^ d) + 0x6ed9eba1;\n\t } else if (i < 60) {\n\t t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t } else /* if (i < 80) */ {\n\t t += (b ^ c ^ d) - 0x359d3e2a;\n\t }\n\n\t e = d;\n\t d = c;\n\t c = (b << 30) | (b >>> 2);\n\t b = a;\n\t a = t;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA1('message');\n\t * var hash = CryptoJS.SHA1(wordArray);\n\t */\n\t C.SHA1 = Hasher._createHelper(SHA1);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA1(message, key);\n\t */\n\t C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var MD5 = C_algo.MD5;\n\n\t /**\n\t * This key derivation function is meant to conform with EVP_BytesToKey.\n\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t */\n\t var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: MD5,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.EvpKDF.create();\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t var block;\n\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init hasher\n\t var hasher = cfg.hasher.create();\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t if (block) {\n\t hasher.update(block);\n\t }\n\t block = hasher.update(password).finalize(salt);\n\t hasher.reset();\n\n\t // Iterations\n\t for (var i = 1; i < iterations; i++) {\n\t block = hasher.finalize(block);\n\t hasher.reset();\n\t }\n\n\t derivedKey.concat(block);\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.EvpKDF(password, salt);\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.EvpKDF = function (password, salt, cfg) {\n\t return EvpKDF.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./evpkdf\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./evpkdf\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var Base64 = C_enc.Base64;\n\t var C_algo = C.algo;\n\t var EvpKDF = C_algo.EvpKDF;\n\n\t /**\n\t * Abstract base cipher template.\n\t *\n\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t */\n\t var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {WordArray} iv The IV to use for this operation.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Creates this cipher in encryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createEncryptor: function (key, cfg) {\n\t return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Creates this cipher in decryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createDecryptor: function (key, cfg) {\n\t return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Initializes a newly created cipher.\n\t *\n\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t */\n\t init: function (xformMode, key, cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Store transform mode and key\n\t this._xformMode = xformMode;\n\t this._key = key;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this cipher to its initial state.\n\t *\n\t * @example\n\t *\n\t * cipher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-cipher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Adds data to be encrypted or decrypted.\n\t *\n\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.process('data');\n\t * var encrypted = cipher.process(wordArray);\n\t */\n\t process: function (dataUpdate) {\n\t // Append\n\t this._append(dataUpdate);\n\n\t // Process available blocks\n\t return this._process();\n\t },\n\n\t /**\n\t * Finalizes the encryption or decryption process.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after final processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.finalize();\n\t * var encrypted = cipher.finalize('data');\n\t * var encrypted = cipher.finalize(wordArray);\n\t */\n\t finalize: function (dataUpdate) {\n\t // Final data update\n\t if (dataUpdate) {\n\t this._append(dataUpdate);\n\t }\n\n\t // Perform concrete-cipher logic\n\t var finalProcessedData = this._doFinalize();\n\n\t return finalProcessedData;\n\t },\n\n\t keySize: 128/32,\n\n\t ivSize: 128/32,\n\n\t _ENC_XFORM_MODE: 1,\n\n\t _DEC_XFORM_MODE: 2,\n\n\t /**\n\t * Creates shortcut functions to a cipher's object interface.\n\t *\n\t * @param {Cipher} cipher The cipher to create a helper for.\n\t *\n\t * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t */\n\t _createHelper: (function () {\n\t function selectCipherStrategy(key) {\n\t if (typeof key == 'string') {\n\t return PasswordBasedCipher;\n\t } else {\n\t return SerializableCipher;\n\t }\n\t }\n\n\t return function (cipher) {\n\t return {\n\t encrypt: function (message, key, cfg) {\n\t return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t },\n\n\t decrypt: function (ciphertext, key, cfg) {\n\t return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t }\n\t };\n\t };\n\t }())\n\t });\n\n\t /**\n\t * Abstract base stream cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t */\n\t var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t _doFinalize: function () {\n\t // Process partial blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 1\n\t });\n\n\t /**\n\t * Mode namespace.\n\t */\n\t var C_mode = C.mode = {};\n\n\t /**\n\t * Abstract base block cipher mode template.\n\t */\n\t var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t /**\n\t * Creates this mode for encryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t */\n\t createEncryptor: function (cipher, iv) {\n\t return this.Encryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Creates this mode for decryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t */\n\t createDecryptor: function (cipher, iv) {\n\t return this.Decryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Initializes a newly created mode.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t */\n\t init: function (cipher, iv) {\n\t this._cipher = cipher;\n\t this._iv = iv;\n\t }\n\t });\n\n\t /**\n\t * Cipher Block Chaining mode.\n\t */\n\t var CBC = C_mode.CBC = (function () {\n\t /**\n\t * Abstract base CBC mode.\n\t */\n\t var CBC = BlockCipherMode.extend();\n\n\t /**\n\t * CBC encryptor.\n\t */\n\t CBC.Encryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // XOR and encrypt\n\t xorBlock.call(this, words, offset, blockSize);\n\t cipher.encryptBlock(words, offset);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t /**\n\t * CBC decryptor.\n\t */\n\t CBC.Decryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t // Decrypt and XOR\n\t cipher.decryptBlock(words, offset);\n\t xorBlock.call(this, words, offset, blockSize);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function xorBlock(words, offset, blockSize) {\n\t var block;\n\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Choose mixing block\n\t if (iv) {\n\t block = iv;\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t block = this._prevBlock;\n\t }\n\n\t // XOR blocks\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= block[i];\n\t }\n\t }\n\n\t return CBC;\n\t }());\n\n\t /**\n\t * Padding namespace.\n\t */\n\t var C_pad = C.pad = {};\n\n\t /**\n\t * PKCS #5/7 padding strategy.\n\t */\n\t var Pkcs7 = C_pad.Pkcs7 = {\n\t /**\n\t * Pads data using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to pad.\n\t * @param {number} blockSize The multiple that the data should be padded to.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t */\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Create padding word\n\t var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t // Create padding\n\t var paddingWords = [];\n\t for (var i = 0; i < nPaddingBytes; i += 4) {\n\t paddingWords.push(paddingWord);\n\t }\n\t var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t // Add padding\n\t data.concat(padding);\n\t },\n\n\t /**\n\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to unpad.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t */\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t };\n\n\t /**\n\t * Abstract base block cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t */\n\t var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Mode} mode The block mode to use. Default: CBC\n\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t */\n\t cfg: Cipher.cfg.extend({\n\t mode: CBC,\n\t padding: Pkcs7\n\t }),\n\n\t reset: function () {\n\t var modeCreator;\n\n\t // Reset cipher\n\t Cipher.reset.call(this);\n\n\t // Shortcuts\n\t var cfg = this.cfg;\n\t var iv = cfg.iv;\n\t var mode = cfg.mode;\n\n\t // Reset block mode\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t modeCreator = mode.createEncryptor;\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t modeCreator = mode.createDecryptor;\n\t // Keep at least one block in the buffer for unpadding\n\t this._minBufferSize = 1;\n\t }\n\n\t if (this._mode && this._mode.__creator == modeCreator) {\n\t this._mode.init(this, iv && iv.words);\n\t } else {\n\t this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t this._mode.__creator = modeCreator;\n\t }\n\t },\n\n\t _doProcessBlock: function (words, offset) {\n\t this._mode.processBlock(words, offset);\n\t },\n\n\t _doFinalize: function () {\n\t var finalProcessedBlocks;\n\n\t // Shortcut\n\t var padding = this.cfg.padding;\n\n\t // Finalize\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t // Pad data\n\t padding.pad(this._data, this.blockSize);\n\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\n\t // Unpad data\n\t padding.unpad(finalProcessedBlocks);\n\t }\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 128/32\n\t });\n\n\t /**\n\t * A collection of cipher parameters.\n\t *\n\t * @property {WordArray} ciphertext The raw ciphertext.\n\t * @property {WordArray} key The key to this ciphertext.\n\t * @property {WordArray} iv The IV used in the ciphering operation.\n\t * @property {WordArray} salt The salt used with a key derivation function.\n\t * @property {Cipher} algorithm The cipher algorithm.\n\t * @property {Mode} mode The block mode used in the ciphering operation.\n\t * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t * @property {number} blockSize The block size of the cipher.\n\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t */\n\t var CipherParams = C_lib.CipherParams = Base.extend({\n\t /**\n\t * Initializes a newly created cipher params object.\n\t *\n\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.lib.CipherParams.create({\n\t * ciphertext: ciphertextWordArray,\n\t * key: keyWordArray,\n\t * iv: ivWordArray,\n\t * salt: saltWordArray,\n\t * algorithm: CryptoJS.algo.AES,\n\t * mode: CryptoJS.mode.CBC,\n\t * padding: CryptoJS.pad.PKCS7,\n\t * blockSize: 4,\n\t * formatter: CryptoJS.format.OpenSSL\n\t * });\n\t */\n\t init: function (cipherParams) {\n\t this.mixIn(cipherParams);\n\t },\n\n\t /**\n\t * Converts this cipher params object to a string.\n\t *\n\t * @param {Format} formatter (Optional) The formatting strategy to use.\n\t *\n\t * @return {string} The stringified cipher params.\n\t *\n\t * @throws Error If neither the formatter nor the default formatter is set.\n\t *\n\t * @example\n\t *\n\t * var string = cipherParams + '';\n\t * var string = cipherParams.toString();\n\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t */\n\t toString: function (formatter) {\n\t return (formatter || this.formatter).stringify(this);\n\t }\n\t });\n\n\t /**\n\t * Format namespace.\n\t */\n\t var C_format = C.format = {};\n\n\t /**\n\t * OpenSSL formatting strategy.\n\t */\n\t var OpenSSLFormatter = C_format.OpenSSL = {\n\t /**\n\t * Converts a cipher params object to an OpenSSL-compatible string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The OpenSSL-compatible string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t var wordArray;\n\n\t // Shortcuts\n\t var ciphertext = cipherParams.ciphertext;\n\t var salt = cipherParams.salt;\n\n\t // Format\n\t if (salt) {\n\t wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t } else {\n\t wordArray = ciphertext;\n\t }\n\n\t return wordArray.toString(Base64);\n\t },\n\n\t /**\n\t * Converts an OpenSSL-compatible string to a cipher params object.\n\t *\n\t * @param {string} openSSLStr The OpenSSL-compatible string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t */\n\t parse: function (openSSLStr) {\n\t var salt;\n\n\t // Parse base64\n\t var ciphertext = Base64.parse(openSSLStr);\n\n\t // Shortcut\n\t var ciphertextWords = ciphertext.words;\n\n\t // Test for salt\n\t if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t // Extract salt\n\t salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t // Remove salt from ciphertext\n\t ciphertextWords.splice(0, 4);\n\t ciphertext.sigBytes -= 16;\n\t }\n\n\t return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t */\n\t var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t */\n\t cfg: Base.extend({\n\t format: OpenSSLFormatter\n\t }),\n\n\t /**\n\t * Encrypts a message.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Encrypt\n\t var encryptor = cipher.createEncryptor(key, cfg);\n\t var ciphertext = encryptor.finalize(message);\n\n\t // Shortcut\n\t var cipherCfg = encryptor.cfg;\n\n\t // Create and return serializable cipher params\n\t return CipherParams.create({\n\t ciphertext: ciphertext,\n\t key: key,\n\t iv: cipherCfg.iv,\n\t algorithm: cipher,\n\t mode: cipherCfg.mode,\n\t padding: cipherCfg.padding,\n\t blockSize: cipher.blockSize,\n\t formatter: cfg.format\n\t });\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Decrypt\n\t var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t return plaintext;\n\t },\n\n\t /**\n\t * Converts serialized ciphertext to CipherParams,\n\t * else assumed CipherParams already and returns ciphertext unchanged.\n\t *\n\t * @param {CipherParams|string} ciphertext The ciphertext.\n\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t *\n\t * @return {CipherParams} The unserialized ciphertext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t */\n\t _parse: function (ciphertext, format) {\n\t if (typeof ciphertext == 'string') {\n\t return format.parse(ciphertext, this);\n\t } else {\n\t return ciphertext;\n\t }\n\t }\n\t });\n\n\t /**\n\t * Key derivation function namespace.\n\t */\n\t var C_kdf = C.kdf = {};\n\n\t /**\n\t * OpenSSL key derivation function.\n\t */\n\t var OpenSSLKdf = C_kdf.OpenSSL = {\n\t /**\n\t * Derives a key and IV from a password.\n\t *\n\t * @param {string} password The password to derive from.\n\t * @param {number} keySize The size in words of the key to generate.\n\t * @param {number} ivSize The size in words of the IV to generate.\n\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t *\n\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t */\n\t execute: function (password, keySize, ivSize, salt, hasher) {\n\t // Generate random salt\n\t if (!salt) {\n\t salt = WordArray.random(64/8);\n\t }\n\n\t // Derive key and IV\n\t if (!hasher) {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\t } else {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n\t }\n\n\n\t // Separate key and IV\n\t var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t key.sigBytes = keySize * 4;\n\n\t // Return params\n\t return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A serializable cipher wrapper that derives the key from a password,\n\t * and returns ciphertext as a serializable cipher params object.\n\t */\n\t var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t */\n\t cfg: SerializableCipher.cfg.extend({\n\t kdf: OpenSSLKdf\n\t }),\n\n\t /**\n\t * Encrypts a message using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Encrypt\n\t var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t // Mix in derived params\n\t ciphertext.mixIn(derivedParams);\n\n\t return ciphertext;\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Decrypt\n\t var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t return plaintext;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Lookup tables\n\t var SBOX = [];\n\t var INV_SBOX = [];\n\t var SUB_MIX_0 = [];\n\t var SUB_MIX_1 = [];\n\t var SUB_MIX_2 = [];\n\t var SUB_MIX_3 = [];\n\t var INV_SUB_MIX_0 = [];\n\t var INV_SUB_MIX_1 = [];\n\t var INV_SUB_MIX_2 = [];\n\t var INV_SUB_MIX_3 = [];\n\n\t // Compute lookup tables\n\t (function () {\n\t // Compute double table\n\t var d = [];\n\t for (var i = 0; i < 256; i++) {\n\t if (i < 128) {\n\t d[i] = i << 1;\n\t } else {\n\t d[i] = (i << 1) ^ 0x11b;\n\t }\n\t }\n\n\t // Walk GF(2^8)\n\t var x = 0;\n\t var xi = 0;\n\t for (var i = 0; i < 256; i++) {\n\t // Compute sbox\n\t var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t SBOX[x] = sx;\n\t INV_SBOX[sx] = x;\n\n\t // Compute multiplication\n\t var x2 = d[x];\n\t var x4 = d[x2];\n\t var x8 = d[x4];\n\n\t // Compute sub bytes, mix columns tables\n\t var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n\t SUB_MIX_3[x] = t;\n\n\t // Compute inv sub bytes, inv mix columns tables\n\t var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n\t INV_SUB_MIX_3[sx] = t;\n\n\t // Compute next counter\n\t if (!x) {\n\t x = xi = 1;\n\t } else {\n\t x = x2 ^ d[d[d[x8 ^ x2]]];\n\t xi ^= d[d[xi]];\n\t }\n\t }\n\t }());\n\n\t // Precomputed Rcon lookup\n\t var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t /**\n\t * AES block cipher algorithm.\n\t */\n\t var AES = C_algo.AES = BlockCipher.extend({\n\t _doReset: function () {\n\t var t;\n\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._nRounds && this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t // Compute number of rounds\n\t var nRounds = this._nRounds = keySize + 6;\n\n\t // Compute number of key schedule rows\n\t var ksRows = (nRounds + 1) * 4;\n\n\t // Compute key schedule\n\t var keySchedule = this._keySchedule = [];\n\t for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t if (ksRow < keySize) {\n\t keySchedule[ksRow] = keyWords[ksRow];\n\t } else {\n\t t = keySchedule[ksRow - 1];\n\n\t if (!(ksRow % keySize)) {\n\t // Rot word\n\t t = (t << 8) | (t >>> 24);\n\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t // Mix Rcon\n\t t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t } else if (keySize > 6 && ksRow % keySize == 4) {\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t }\n\n\t keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t }\n\t }\n\n\t // Compute inv key schedule\n\t var invKeySchedule = this._invKeySchedule = [];\n\t for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t var ksRow = ksRows - invKsRow;\n\n\t if (invKsRow % 4) {\n\t var t = keySchedule[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 4];\n\t }\n\n\t if (invKsRow < 4 || ksRow <= 4) {\n\t invKeySchedule[invKsRow] = t;\n\t } else {\n\t invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t }\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t // Swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\n\t this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t // Inv swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\t },\n\n\t _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t // Shortcut\n\t var nRounds = this._nRounds;\n\n\t // Get input, add round key\n\t var s0 = M[offset] ^ keySchedule[0];\n\t var s1 = M[offset + 1] ^ keySchedule[1];\n\t var s2 = M[offset + 2] ^ keySchedule[2];\n\t var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t // Key schedule row counter\n\t var ksRow = 4;\n\n\t // Rounds\n\t for (var round = 1; round < nRounds; round++) {\n\t // Shift rows, sub bytes, mix columns, add round key\n\t var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t // Update state\n\t s0 = t0;\n\t s1 = t1;\n\t s2 = t2;\n\t s3 = t3;\n\t }\n\n\t // Shift rows, sub bytes, add round key\n\t var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t // Set output\n\t M[offset] = t0;\n\t M[offset + 1] = t1;\n\t M[offset + 2] = t2;\n\t M[offset + 3] = t3;\n\t },\n\n\t keySize: 256/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Utf8;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t ECB.Encryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.encryptBlock(words, offset);\n\t }\n\t });\n\n\t ECB.Decryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.decryptBlock(words, offset);\n\t }\n\t });\n\n\t return ECB;\n\t}());\n\n\n\treturn CryptoJS.mode.ECB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t pad: function (data, blockSize) {\n\t // Shortcuts\n\t var dataSigBytes = data.sigBytes;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t // Compute last byte position\n\t var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t // Pad\n\t data.clamp();\n\t data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t data.sigBytes += nPaddingBytes;\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Ansix923;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Pad\n\t data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso10126;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t pad: function () {\n\t },\n\n\t unpad: function () {\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.NoPadding;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.pad.Pkcs7;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Pad\n\t data.clamp();\n\t data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t },\n\n\t unpad: function (data) {\n\t // Shortcut\n\t var dataWords = data.words;\n\n\t // Unpad\n\t var i = data.sigBytes - 1;\n\t for (var i = data.sigBytes - 1; i >= 0; i--) {\n\t if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t data.sigBytes = i + 1;\n\t break;\n\t }\n\t }\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.ZeroPadding;\n\n}));","import AES from \"crypto-js/aes.js\";\nimport CryptoCore from \"crypto-js/core.js\";\nimport Hex from \"crypto-js/enc-hex.js\";\nimport Utf8 from \"crypto-js/enc-utf8.js\";\nimport MD5 from \"crypto-js/md5.js\";\nimport ECB from \"crypto-js/mode-ecb.js\";\nimport \"crypto-js/pad-ansix923.js\";\nimport Iso10126 from \"crypto-js/pad-iso10126.js\";\nimport NoPadding from \"crypto-js/pad-nopadding.js\";\nimport Pkcs7 from \"crypto-js/pad-pkcs7.js\";\nimport ZeroPadding from \"crypto-js/pad-zeropadding.js\";\nimport SHA1 from \"crypto-js/sha1.js\";\nimport { decodeBase64Bytes, decodeBase64UrlBytes, encodeBase64Bytes, encodeBase64UrlBytes } from \"../base64/index\";\nimport { type DecodedText, createDecodedText, encodeUtf8, getTextDecoder } from \"../internal/text\";\n\n/** PBKDF2 默认迭代次数。 */\nconst defaultPbkdf2Iterations = 600_000;\n\n/** PBKDF2 允许的最小迭代次数。 */\nconst minimumPbkdf2Iterations = 100_000;\n\n/** PBKDF2 允许的最大迭代次数,用于限制异常输入造成的计算资源消耗。 */\nconst maximumPbkdf2Iterations = 5_000_000;\n\n/** 密码允许的最大 UTF-8 字节数。 */\nconst maximumPasswordBytes = 1024;\n\n/** 密码加密接口允许的最大明文字节数。 */\nconst maximumPlaintextBytes = 8 * 1024 * 1024;\n\n/** 密码解密接口允许的最大协议载荷字符数。 */\nconst maximumPayloadLength = 16 * 1024 * 1024;\n\n/** 密码加密载荷的协议与算法版本前缀。 */\nconst encryptedPayloadPrefix = \"FAST-AES-256-GCM-V1\";\n\n/** PBKDF2 密码哈希的协议与算法版本前缀。 */\nconst passwordHashPrefix = \"FAST-PBKDF2-SHA256-V1\";\n\n/** 直接 AES-GCM 密钥加密载荷的协议版本。 */\nconst authenticatedAesPayloadVersion = 1;\n\n/** AES 分组密码模式;与 .NET `CipherMode.CBC` 和 `CipherMode.ECB` 对应。 */\nexport type AesCipherMode = \"CBC\" | \"ECB\";\n\n/** AES 填充模式;与 .NET `PaddingMode` 中可由 CryptoJS 互操作的成员对应。 */\nexport type AesPaddingMode = \"None\" | \"PKCS7\" | \"Zeros\" | \"ANSIX923\" | \"ISO10126\";\n\n/** Web Crypto 导出的 PEM 公私钥对。 */\nexport interface PemKeyPair {\n\t/** 未加密的 PKCS#8 PEM 私钥,包含标准 `PRIVATE KEY` 头尾和 64 字符换行。 */\n\tprivateKey: string;\n\t/** SubjectPublicKeyInfo PEM 公钥,包含标准 `PUBLIC KEY` 头尾和 64 字符换行。 */\n\tpublicKey: string;\n}\n\n/** 本模块支持的 Web Crypto 椭圆曲线。 */\nexport type EcNamedCurve = \"P-256\" | \"P-384\" | \"P-521\";\n\n/**\n * 获取本模块非随机 API 所需的完整 Web Crypto 能力。\n *\n * @returns 已确认实现摘要、派生、密钥导入导出、加解密、签名和验证方法的 Crypto 对象。\n * @throws `Error` 当任一必要 SubtleCrypto 方法缺失。\n */\nconst requireWebCrypto = (): Crypto => {\n\tconst crypto = globalThis.crypto;\n\tconst subtle = crypto?.subtle;\n\tif (\n\t\ttypeof subtle?.decrypt !== \"function\" ||\n\t\ttypeof subtle.deriveBits !== \"function\" ||\n\t\ttypeof subtle.deriveKey !== \"function\" ||\n\t\ttypeof subtle.digest !== \"function\" ||\n\t\ttypeof subtle.encrypt !== \"function\" ||\n\t\ttypeof subtle.exportKey !== \"function\" ||\n\t\ttypeof subtle.generateKey !== \"function\" ||\n\t\ttypeof subtle.importKey !== \"function\" ||\n\t\ttypeof subtle.sign !== \"function\" ||\n\t\ttypeof subtle.verify !== \"function\"\n\t) {\n\t\tthrow new Error(\"当前运行环境不支持 Web Crypto SubtleCrypto。\");\n\t}\n\treturn crypto;\n};\n\n/**\n * 把 Uint8Array 复制为独立的完整 ArrayBuffer。\n *\n * @remarks 不能直接返回 `bytes.buffer`,因为输入可能只是更大 Buffer 的切片。\n * @param bytes - 源字节视图。\n * @returns 长度与视图完全一致、偏移为零的新 ArrayBuffer。\n */\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n\tconst copy = new Uint8Array(bytes.byteLength);\n\tcopy.set(bytes);\n\treturn copy.buffer;\n};\n\n/** 本模块导出的 PKCS#8 与 SPKI PEM 标签。 */\nconst pemLabels = {\n\tprivate: \"PRIVATE KEY\",\n\tpublic: \"PUBLIC KEY\",\n} as const;\n\n/**\n * 把 DER 内容封装为 PEM。\n *\n * @param label - PEM Begin/End 标签,不包含分隔线。\n * @param value - DER 二进制内容。\n * @returns 每行最多 64 个 Base64 字符的 PEM 文本。\n */\nconst toPem = (label: string, value: ArrayBuffer): string => {\n\tconst encoded = encodeBase64Bytes(new Uint8Array(value));\n\tconst lines = encoded.match(/.{1,64}/gu)?.join(\"\\n\") ?? \"\";\n\treturn `-----BEGIN ${label}-----\\n${lines}\\n-----END ${label}-----`;\n};\n\n/**\n * 校验 PEM 标签并还原 DER。\n *\n * @param value - PEM 文本。\n * @param label - 当前算法预期的标签。\n * @returns 独立的 DER ArrayBuffer。\n * @throws `TypeError` 当 Begin/End 标签不匹配或 Base64 内容非法。\n */\nconst fromPem = (value: string, label: string): ArrayBuffer => {\n\tconst header = `-----BEGIN ${label}-----`;\n\tconst footer = `-----END ${label}-----`;\n\tconst trimmed = value.trim();\n\tif (!trimmed.startsWith(header) || !trimmed.endsWith(footer)) throw new TypeError(`应提供 ${label} 格式的 PEM 值。`);\n\tconst encoded = trimmed.slice(header.length, -footer.length).replace(/\\s+/gu, \"\");\n\treturn toArrayBuffer(decodeBase64Bytes(encoded));\n};\n\n/**\n * 导出 Web Crypto 密钥对。\n *\n * @param keyPair - 可导出的公私钥对。\n * @returns PKCS#8 私钥和 SPKI 公钥组成的 PEM 对象。\n * @throws `Error` 当平台拒绝导出或密钥格式不兼容。\n */\nconst exportKeyPair = async (keyPair: CryptoKeyPair): Promise<PemKeyPair> => {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.exportKey(\"pkcs8\", keyPair.privateKey),\n\t\tcrypto.subtle.exportKey(\"spki\", keyPair.publicKey),\n\t]);\n\treturn {\n\t\tprivateKey: toPem(pemLabels.private, privateKey),\n\t\tpublicKey: toPem(pemLabels.public, publicKey),\n\t};\n};\n\n/**\n * 缩小 Web Crypto `generateKey` 的联合返回值。\n *\n * @param value - 平台返回的单密钥或密钥对。\n * @returns 同时具有公钥和私钥的密钥对。\n * @throws `Error` 当平台没有按请求生成密钥对。\n */\nconst assertKeyPair = (value: CryptoKey | CryptoKeyPair): CryptoKeyPair => {\n\tif (\"privateKey\" in value && \"publicKey\" in value) return value;\n\tthrow new Error(\"当前运行环境未生成密钥对。\");\n};\n\n/**\n * 校验并编码密码。\n *\n * @param password - 用户提供的密码文本。\n * @returns UTF-8 密码字节。\n * @throws `TypeError` 当密码为空。\n * @throws `RangeError` 当 UTF-8 长度超过 1,024 字节。\n */\nconst encodeValidatedPassword = (password: string): Uint8Array => {\n\tconst bytes = encodeUtf8(password);\n\tif (bytes.length === 0) throw new TypeError(\"加密密码不能为空。\");\n\tif (bytes.length > maximumPasswordBytes) {\n\t\tthrow new RangeError(`UTF-8 密码不能超过 ${maximumPasswordBytes} 字节。`);\n\t}\n\treturn bytes;\n};\n\n/**\n * 校验 PBKDF2 迭代次数。\n *\n * @param iterations - 待使用的迭代次数。\n * @returns 校验后的原始整数。\n * @throws `RangeError` 当值不是 100,000 至 5,000,000 的安全整数。\n */\nconst validateIterations = (iterations: number): number => {\n\tif (!Number.isSafeInteger(iterations) || iterations < minimumPbkdf2Iterations || iterations > maximumPbkdf2Iterations) {\n\t\tthrow new RangeError(`\\`iterations\\` 必须是 ${minimumPbkdf2Iterations} 到 ${maximumPbkdf2Iterations} 之间的安全整数。`);\n\t}\n\treturn iterations;\n};\n\n/** 把字节格式化为小写十六进制。 */\nconst toLowerHex = (value: Uint8Array): string => Array.from(value, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\n/** 把字节格式化为大写十六进制。 */\nconst toUpperHex = (value: Uint8Array): string => toLowerHex(value).toUpperCase();\n\n/**\n * 使用指定的 Web Crypto HMAC 算法计算原始认证标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @param hash - HMAC 使用的 SHA-2 摘要算法。\n * @returns 算法规定长度的原始认证标签。\n * @throws `TypeError` 当密钥为空。\n * @throws `Error` 当运行时缺少所需 Web Crypto 能力。\n */\nconst computeHmacBytes = async (value: string, key: string, hash: \"SHA-256\" | \"SHA-384\" | \"SHA-512\"): Promise<Uint8Array> => {\n\tconst keyBytes = encodeUtf8(key);\n\tif (keyBytes.length === 0) throw new TypeError(\"HMAC 密钥不能为空。\");\n\n\tconst crypto = requireWebCrypto();\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { hash, name: \"HMAC\" }, false, [\"sign\"]);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", cryptoKey, toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(signature);\n};\n\n/**\n * 生成随机字节。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param length - 0 至 65,536 的安全整数。\n * @returns 新建的 `Uint8Array`。\n * @throws 参数非法时抛出 `RangeError`。\n */\nexport function GenerateRandomBytes(length: number): Uint8Array {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > 65_536) {\n\t\tthrow new RangeError(\"`length` 必须是 0 到 65,536 之间的安全整数。\");\n\t}\n\tconst bytes = new Uint8Array(length);\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.getRandomValues === \"function\") return crypto.getRandomValues(bytes);\n\tfor (let index = 0; index < bytes.length; index += 1) bytes[index] = Math.floor(Math.random() * 0x100);\n\treturn bytes;\n}\n\n/**\n * 以不提前退出的方式比较两个字节数组。\n *\n * @remarks JavaScript 引擎不保证严格常量时间;该函数只避免显式短路,不能替代服务端\n * 密码学库提供的 timing-safe primitive。长度是否相同仍属于可观察信息。\n * @param left - 第一字节序列。\n * @param right - 第二字节序列。\n * @returns 长度和每个字节均相同时返回 `true`。\n */\nexport function FixedTimeEquals(left: Uint8Array, right: Uint8Array): boolean {\n\tconst length = Math.max(left.length, right.length);\n\tlet difference = left.length === right.length ? 0 : 1;\n\t// 不按长度或首个差异提前退出;缺失位置按零参与累计差异。\n\tfor (let index = 0; index < length; index += 1) difference |= (left[index] ?? 0) ^ (right[index] ?? 0);\n\treturn difference === 0;\n}\n\n/**\n * 计算 MD5 摘要并返回小写十六进制文本。\n *\n * @remarks MD5 仅用于非安全的普通校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 32 字符小写十六进制摘要。\n */\nexport function MD5Encrypt(value: string): string {\n\treturn MD5(value).toString(Hex);\n}\n\n/**\n * 计算 SHA-1 摘要并返回大写十六进制文本。\n *\n * @remarks SHA-1 仅用于非安全的普通校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 40 字符大写十六进制摘要。\n */\nexport function SHA1Encrypt(value: string): string {\n\treturn SHA1(value).toString(Hex).toUpperCase();\n}\n\n/**\n * 计算 SHA-256 摘要。\n *\n * @remarks SHA-256 是快速摘要,不适合直接存储或校验密码。\n * @param value - UTF-8 字符串或原始字节。\n * @returns 32 字节摘要。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function SHA256Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-256 并格式化为十六进制。\n *\n * @param value - UTF-8 字符串或原始字节。\n * @returns 64 字符大写十六进制文本。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function SHA256Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA256Bytes(value));\n}\n\n/**\n * 计算 SHA-384 摘要。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 48 字节摘要。\n */\nexport async function SHA384Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-384\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-384 并格式化为十六进制文本。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 96 个大写十六进制字符组成的摘要。\n */\nexport async function SHA384Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA384Bytes(value));\n}\n\n/**\n * 计算 SHA-512 摘要。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 64 字节摘要。\n */\nexport async function SHA512Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-512\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-512 并格式化为十六进制文本。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 128 个大写十六进制字符组成的摘要。\n */\nexport async function SHA512Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA512Bytes(value));\n}\n\n/**\n * 使用 HMAC-SHA-256 认证文本,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 64 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA256Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-256\"));\n}\n\n/**\n * 使用 HMAC-SHA-384 认证文本或字节,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 96 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA384Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-384\"));\n}\n\n/**\n * 使用 HMAC-SHA-512 认证文本或字节,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 128 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA512Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-512\"));\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 从密码派生密钥。\n *\n * @param password - 1 至 1,024 UTF-8 字节的密码。\n * @param salt - 至少 8 字节的盐。\n * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。\n * @param outputLength - 输出长度,范围为 1 至 1,024 字节。\n * @returns 指定长度的派生密钥。\n * @throws 参数超过协议边界时抛出 `TypeError` 或 `RangeError`。\n */\nexport async function PBKDF2SHA256(password: string, salt: Uint8Array, iterations = defaultPbkdf2Iterations, outputLength = 32): Promise<Uint8Array> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (salt.length < 8) throw new RangeError(\"PBKDF2 盐值必须至少包含 8 字节,建议不少于 16 字节。\");\n\tif (!Number.isSafeInteger(outputLength) || outputLength < 1 || outputLength > 1024) {\n\t\tthrow new RangeError(\"`outputLength` 必须是 1 到 1,024 之间的安全整数。\");\n\t}\n\n\t// 密码作为不可导出的 PBKDF2 原始材料导入,派生结果只通过 deriveBits 返回。\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveBits\"]);\n\tconst derived = await crypto.subtle.deriveBits(\n\t\t{ hash: \"SHA-256\", iterations: validateIterations(iterations), name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\toutputLength * 8\n\t);\n\treturn new Uint8Array(derived);\n}\n\n/**\n * 生成可持久化的随机盐 PBKDF2-HMAC-SHA-256 密码哈希。\n *\n * @param password - 1 至 1,024 UTF-8 字节的密码。\n * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。\n * @returns 包含版本、迭代次数、16 字节随机盐和 32 字节派生密钥的自描述字符串。\n */\nexport async function HashPasswordPBKDF2SHA256(password: string, iterations = defaultPbkdf2Iterations): Promise<string> {\n\t// 每个密码独立生成盐,避免相同密码产生相同持久化结果并提高预计算攻击成本。\n\tconst salt = GenerateRandomBytes(16);\n\tconst derivedKey = await PBKDF2SHA256(password, salt, iterations);\n\treturn [passwordHashPrefix, String(iterations), encodeBase64UrlBytes(salt), encodeBase64UrlBytes(derivedKey)].join(\":\");\n}\n\n/**\n * 验证 {@link HashPasswordPBKDF2SHA256} 生成的密码哈希。\n *\n * @param password - 要验证的密码。\n * @param passwordHash - 自描述的 PBKDF2-HMAC-SHA-256 密码哈希。\n * @returns 格式有效且密码匹配时返回 `true`;格式无效或密码错误时返回 `false`。\n */\nexport async function VerifyPasswordPBKDF2SHA256(password: string, passwordHash: string): Promise<boolean> {\n\ttry {\n\t\t// 先验证协议版本和字段边界,再执行高成本 PBKDF2,避免无效输入消耗不受控资源。\n\t\tconst parts = passwordHash.split(\":\");\n\t\tif (parts.length !== 4 || parts[0] !== passwordHashPrefix) return false;\n\t\tconst iterations = validateIterations(Number(parts[1]));\n\t\tconst salt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tconst expected = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tif (salt.length !== 16 || expected.length !== 32) return false;\n\t\tconst actual = await PBKDF2SHA256(password, salt, iterations, expected.length);\n\t\treturn FixedTimeEquals(actual, expected);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 使用 RFC 5869 HKDF-SHA-256 派生上下文隔离的密钥材料。\n *\n * @param inputKeyMaterial - 输入密钥材料,例如 ECDH 原始共享秘密。\n * @param salt - 可选盐;空值按 RFC 5869 的零盐语义处理。\n * @param info - 应用、协议和密钥用途上下文。\n * @param outputLength - 输出长度,范围为 1 至 8,160 字节。\n * @returns 与 `salt` 和 `info` 绑定的派生密钥。\n */\nexport async function HKDFSHA256(\n\tinputKeyMaterial: Uint8Array,\n\tsalt: Uint8Array = new Uint8Array(),\n\tinfo: Uint8Array = new Uint8Array(),\n\toutputLength = 32\n): Promise<Uint8Array> {\n\tif (!Number.isSafeInteger(outputLength) || outputLength < 1 || outputLength > 255 * 32) {\n\t\tthrow new RangeError(\"`outputLength` 必须是 1 到 8,160 之间的安全整数。\");\n\t}\n\n\t// Web Crypto 的 HKDF 实现内部完成 RFC 5869 Extract 和 Expand,并且不会导出中间 PRK。\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(inputKeyMaterial), \"HKDF\", false, [\"deriveBits\"]);\n\tconst derived = await crypto.subtle.deriveBits(\n\t\t{ hash: \"SHA-256\", info: toArrayBuffer(info), name: \"HKDF\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\toutputLength * 8\n\t);\n\treturn new Uint8Array(derived);\n}\n\n/**\n * 使用 AES-256 对 UTF-8 文本进行分组加密。\n *\n * @remarks 密钥和 IV 分别补字符 `f` 或截断到 32、16 个 UTF-16 Code Unit,与 .NET\n * `AESEncrypt` 保持一致。CBC/ECB 不提供完整性认证,密文可能被篡改。\n * @param dataStr - 要加密的 UTF-8 文本;空白文本返回 `null`。\n * @param key - 非空白的密钥文本。\n * @param vector - 非空白的初始化向量文本;ECB 模式仍要求传入该参数以对齐 .NET 签名。\n * @param cipherMode - AES 分组模式,默认 `CBC`。\n * @param paddingMode - AES 填充模式,默认 `PKCS7`。\n * @returns Base64 密文;输入、密钥或 IV 为空白时返回 `null`。\n * @throws 模式或填充不受支持时抛出 `RangeError`。\n */\nexport function AESEncrypt(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode: AesCipherMode = \"CBC\",\n\tpaddingMode: AesPaddingMode = \"PKCS7\"\n): string | null {\n\tif (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;\n\tif (cipherMode !== \"CBC\" && cipherMode !== \"ECB\") throw new RangeError(\"`cipherMode` 必须是 `CBC` 或 `ECB`。\");\n\n\tlet padding = Pkcs7;\n\tswitch (paddingMode) {\n\t\tcase \"None\":\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"PKCS7\":\n\t\t\tbreak;\n\t\tcase \"Zeros\":\n\t\t\tpadding = ZeroPadding;\n\t\t\tbreak;\n\t\tcase \"ANSIX923\":\n\t\t\t// crypto-js 4.2.0 的 pad-ansix923 默认导出名称拼写错误,使用其注册到核心对象的实现。\n\t\t\tpadding = CryptoCore.pad.AnsiX923;\n\t\t\tbreak;\n\t\tcase \"ISO10126\":\n\t\t\tpadding = Iso10126;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new RangeError(\"不支持当前 `paddingMode`。\");\n\t}\n\tif (paddingMode === \"None\" && encodeUtf8(dataStr).length % 16 !== 0) {\n\t\tthrow new RangeError(\"当 `paddingMode` 为 `None` 时,AES 明文长度必须是 16 字节的整数倍。\");\n\t}\n\n\t// 按 .NET 入口的字符规则处理密钥和 IV,再由 CryptoJS 统一按 UTF-8 编码。\n\tconst keyBytes = Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n\tconst vectorBytes = Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\treturn AES.encrypt(dataStr, keyBytes, cipherMode === \"CBC\" ? { iv: vectorBytes, padding } : { iv: vectorBytes, mode: ECB, padding }).toString();\n}\n\n/**\n * 使用 AES-256 解密 Base64 分组密文。\n *\n * @remarks 参数归一化规则与 {@link AESEncrypt} 以及 .NET `AESDecrypt` 相同。\n * @param dataStr - Base64 密文;空白文本返回 `null`。\n * @param key - 加密时使用的密钥文本。\n * @param vector - 加密时使用的初始化向量文本。\n * @param cipherMode - AES 分组模式,默认 `CBC`。\n * @param paddingMode - AES 填充模式,默认 `PKCS7`。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串;输入、密钥或 IV 为空白时返回 `null`。\n * @throws 模式、填充、Base64、密钥或密文无效时抛出错误。\n */\nexport function AESDecrypt(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode: AesCipherMode = \"CBC\",\n\tpaddingMode: AesPaddingMode = \"PKCS7\"\n): DecodedText | null {\n\tif (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;\n\tif (cipherMode !== \"CBC\" && cipherMode !== \"ECB\") throw new RangeError(\"`cipherMode` 必须是 `CBC` 或 `ECB`。\");\n\n\tlet padding = Pkcs7;\n\tswitch (paddingMode) {\n\t\tcase \"None\":\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"PKCS7\":\n\t\t\tbreak;\n\t\tcase \"Zeros\":\n\t\t\t// .NET 的 Zeros 解密不会移除尾部零字节,因此使用 NoPadding 保留完整明文块。\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"ANSIX923\":\n\t\t\t// crypto-js 4.2.0 的 pad-ansix923 默认导出名称拼写错误,使用其注册到核心对象的实现。\n\t\t\tpadding = CryptoCore.pad.AnsiX923;\n\t\t\tbreak;\n\t\tcase \"ISO10126\":\n\t\t\tpadding = Iso10126;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new RangeError(\"不支持当前 `paddingMode`。\");\n\t}\n\tconst ciphertextBytes = decodeBase64Bytes(dataStr);\n\tif (ciphertextBytes.length === 0 || ciphertextBytes.length % 16 !== 0) {\n\t\tthrow new RangeError(\"AES 密文必须至少包含一个完整的 16 字节块。\");\n\t}\n\n\t// 解密必须重复使用加密端相同的字符补齐和截断规则。\n\tconst keyBytes = Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n\tconst vectorBytes = Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\treturn createDecodedText(\n\t\tAES.decrypt(dataStr, keyBytes, cipherMode === \"CBC\" ? { iv: vectorBytes, padding } : { iv: vectorBytes, mode: ECB, padding }).toString(Utf8)\n\t);\n}\n\n/**\n * 使用 SHA-256 归一化文本密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 输出与 .NET `AESEncryptAuthenticated` 的 v1 Base64 二进制载荷完全一致。\n * @param plaintext - 要加密的 UTF-8 文本。\n * @param key - 非空的 UTF-8 文本密钥;内部归一化为 32 字节 SHA-256 摘要。\n * @returns Base64 编码的 v1 AES-GCM 认证载荷。\n * @throws 密钥为空或运行时缺少 Web Crypto 时抛出错误。\n */\nexport async function AESEncryptAuthenticated(plaintext: string, key: string): Promise<string> {\n\tif (key.trim().length === 0) throw new TypeError(\"加密密钥不能为空。\");\n\tconst crypto = requireWebCrypto();\n\tconst keyBytes = await SHA256Bytes(key);\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { name: \"AES-GCM\" }, false, [\"encrypt\"]);\n\t// 96 位随机 nonce 是 GCM 的标准高效长度;每次加密都生成新值,避免同一密钥下重复。\n\tconst nonce = GenerateRandomBytes(12);\n\tconst encrypted = new Uint8Array(\n\t\tawait crypto.subtle.encrypt({ iv: toArrayBuffer(nonce), name: \"AES-GCM\", tagLength: 128 }, cryptoKey, toArrayBuffer(encodeUtf8(plaintext)))\n\t);\n\tconst ciphertextLength = encrypted.length - 16;\n\t// .NET v1 协议字段顺序固定为 version || nonce || tag || ciphertext。\n\tconst payload = new Uint8Array(1 + nonce.length + 16 + ciphertextLength);\n\tpayload[0] = authenticatedAesPayloadVersion;\n\tpayload.set(nonce, 1);\n\tpayload.set(encrypted.subarray(ciphertextLength), 1 + nonce.length);\n\tpayload.set(encrypted.subarray(0, ciphertextLength), 1 + nonce.length + 16);\n\treturn encodeBase64Bytes(payload);\n}\n\n/**\n * 解密并认证 .NET `AESEncryptAuthenticated` 或 {@link AESEncryptAuthenticated} 生成的载荷。\n *\n * @param payload - Base64 编码的 v1 AES-GCM 二进制载荷。\n * @param key - 加密时使用的非空 UTF-8 文本密钥。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。\n * @throws 载荷格式无效、密钥错误或认证失败时抛出错误。\n */\nexport async function AESDecryptAuthenticated(payload: string, key: string): Promise<DecodedText> {\n\tif (key.trim().length === 0) throw new TypeError(\"加密密钥不能为空。\");\n\tconst decoded = decodeBase64Bytes(payload);\n\tif (decoded.length < 29 || decoded[0] !== authenticatedAesPayloadVersion) {\n\t\tthrow new TypeError(\"不支持该 AES-GCM 载荷格式或版本。\");\n\t}\n\n\tconst nonce = decoded.subarray(1, 13);\n\tconst tag = decoded.subarray(13, 29);\n\tconst ciphertext = decoded.subarray(29);\n\t// Web Crypto 接收 ciphertext || tag,因此把 .NET v1 的独立字段恢复为 Web Crypto 输入顺序。\n\tconst ciphertextAndTag = new Uint8Array(ciphertext.length + tag.length);\n\tciphertextAndTag.set(ciphertext);\n\tciphertextAndTag.set(tag, ciphertext.length);\n\tconst crypto = requireWebCrypto();\n\tconst keyBytes = await SHA256Bytes(key);\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n\tconst plaintext = await crypto.subtle.decrypt(\n\t\t{ iv: toArrayBuffer(nonce), name: \"AES-GCM\", tagLength: 128 },\n\t\tcryptoKey,\n\t\ttoArrayBuffer(ciphertextAndTag)\n\t);\n\treturn createDecodedText(getTextDecoder().decode(plaintext));\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 派生密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 每次调用生成独立 16 字节盐与 12 字节 IV。输出是与 .NET `AESEncryptWithPassword`\n * 一致的 v1 自描述载荷,不应由业务代码手动拆分或修改。密码加密不替代密钥管理。\n * @param plaintext - 原始文本,不进行 JSON 推断;UTF-8 编码后最大 8 MiB。\n * @param password - 1 至 1024 UTF-8 字节的秘密口令。\n * @param iterations - PBKDF2 工作因子,默认 600,000。\n * @returns 认证密文字符串;相同输入每次产生不同结果。\n * @throws 口令非法时抛出 `TypeError` 或 `RangeError`;明文过大时抛出 `RangeError`;\n * 运行时缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function AESEncryptWithPassword(plaintext: string, password: string, iterations = defaultPbkdf2Iterations): Promise<string> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tconst plaintextBytes = encodeUtf8(plaintext);\n\tif (plaintextBytes.length > maximumPlaintextBytes) {\n\t\tthrow new RangeError(`UTF-8 明文不能超过 ${maximumPlaintextBytes} 字节。`);\n\t}\n\tconst validatedIterations = validateIterations(iterations);\n\tconst crypto = requireWebCrypto();\n\tconst salt = GenerateRandomBytes(16);\n\tconst iv = GenerateRandomBytes(12);\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\t// AES-GCM 密钥只允许加密,且不允许从 Web Crypto 导出。\n\tconst key = await crypto.subtle.deriveKey(\n\t\t{ hash: \"SHA-256\", iterations: validatedIterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\t{ length: 256, name: \"AES-GCM\" },\n\t\tfalse,\n\t\t[\"encrypt\"]\n\t);\n\t// Prefix 同时作为明文版本字段和 AAD,攻击者无法在不破坏认证标签的情况下替换协议版本。\n\tconst ciphertext = await crypto.subtle.encrypt(\n\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\tkey,\n\t\tplaintextBytes\n\t);\n\t// 字段顺序属于持久化协议:版本、KDF 成本、盐、IV、带 GCM Tag 的密文。\n\treturn [\n\t\tencryptedPayloadPrefix,\n\t\tString(validatedIterations),\n\t\tencodeBase64UrlBytes(salt),\n\t\tencodeBase64UrlBytes(iv),\n\t\tencodeBase64UrlBytes(new Uint8Array(ciphertext)),\n\t].join(\":\");\n}\n\n/**\n * 解密 {@link AESEncryptWithPassword} 生成的 v1 认证载荷。\n *\n * @param payload - 未修改的 v1 载荷,最大约 16 MiB 文本。\n * @param password - 加密时使用的口令。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。\n * @throws 格式或字段非法时抛出 `TypeError`,载荷过大时抛出 `RangeError`,认证或密码\n * 失败及缺少平台能力时抛出 `Error`。\n */\nexport async function AESDecryptWithPassword(payload: string, password: string): Promise<DecodedText> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (payload.length > maximumPayloadLength) {\n\t\tthrow new RangeError(\"加密载荷超出支持的大小。\");\n\t}\n\t// 先验证固定字段数和版本,再对高成本 KDF 与解密进行任何工作。\n\tconst parts = payload.split(\":\");\n\tif (parts.length !== 5 || parts[0] !== encryptedPayloadPrefix) {\n\t\tthrow new TypeError(\"不支持该加密载荷格式。\");\n\t}\n\n\tlet iterations: number;\n\tlet salt: Uint8Array;\n\tlet iv: Uint8Array;\n\tlet ciphertext: Uint8Array;\n\ttry {\n\t\titerations = validateIterations(Number(parts[1]));\n\t\tsalt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tiv = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tciphertext = decodeBase64UrlBytes(parts[4] ?? \"\");\n\t\tif (salt.length !== 16 || iv.length !== 12 || ciphertext.length < 16) {\n\t\t\tthrow new TypeError(\"加密载荷的字段长度无效。\");\n\t\t}\n\t} catch (cause) {\n\t\tthrow new TypeError(\"加密载荷包含无效字段。\", { cause });\n\t}\n\n\tconst crypto = requireWebCrypto();\n\tconst textDecoder = getTextDecoder();\n\ttry {\n\t\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\t\t// 解密密钥不允许导出,也不能被误用于加密。\n\t\tconst key = await crypto.subtle.deriveKey(\n\t\t\t{ hash: \"SHA-256\", iterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\t\tmaterial,\n\t\t\t{ length: 256, name: \"AES-GCM\" },\n\t\t\tfalse,\n\t\t\t[\"decrypt\"]\n\t\t);\n\t\tconst plaintext = await crypto.subtle.decrypt(\n\t\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\t\tkey,\n\t\t\ttoArrayBuffer(ciphertext)\n\t\t);\n\t\treturn createDecodedText(textDecoder.decode(plaintext));\n\t} catch (cause) {\n\t\tthrow new Error(\"无法认证或解密载荷。\", { cause });\n\t}\n}\n\n/**\n * 生成可供 RSA-OAEP/SHA-256 与 RSA-PSS/SHA-256 共用的 PEM 密钥对。\n *\n * @param modulusLength - RSA 模数位数,默认 2,048;必须是不小于 2,048 的 256 倍数。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n * @throws 模数小于 2,048 或不是 256 的倍数时抛出 `RangeError`。\n */\nexport async function GenerateRSAKeyPair(modulusLength = 2048): Promise<PemKeyPair> {\n\tif (!Number.isSafeInteger(modulusLength) || modulusLength < 2048 || modulusLength % 256 !== 0) {\n\t\tthrow new RangeError(\"`modulusLength` 必须是大于或等于 2048 且能被 256 整除的安全整数。\");\n\t}\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(\n\t\tawait crypto.subtle.generateKey(\n\t\t\t{\n\t\t\t\thash: \"SHA-256\",\n\t\t\t\tmodulusLength,\n\t\t\t\tname: \"RSA-OAEP\",\n\t\t\t\tpublicExponent: Uint8Array.of(1, 0, 1),\n\t\t\t},\n\t\t\ttrue,\n\t\t\t[\"decrypt\", \"encrypt\"]\n\t\t)\n\t);\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用 RSA-OAEP/SHA-256 公钥加密 UTF-8 文本。\n *\n * @param plaintext - 要加密的 UTF-8 文本;长度必须满足 RSA-OAEP 模数限制。\n * @param publicKeyPem - SubjectPublicKeyInfo PEM 公钥。\n * @returns Base64 编码的 RSA 密文。\n * @throws 公钥格式无效或明文超过 RSA-OAEP 容量时抛出错误。\n */\nexport async function RSAEncryptOAEP(plaintext: string, publicKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"encrypt\",\n\t]);\n\tconst ciphertext = await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(encodeUtf8(plaintext)));\n\treturn encodeBase64Bytes(new Uint8Array(ciphertext));\n}\n\n/**\n * 使用 RSA-OAEP/SHA-256 私钥解密 Base64 密文。\n *\n * @param ciphertext - Base64 编码的 RSA 密文。\n * @param privateKeyPem - 未加密的 PKCS#8 PEM 私钥。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。\n * @throws 私钥、Base64 或密文无效时抛出错误。\n */\nexport async function RSADecryptOAEP(ciphertext: string, privateKeyPem: string): Promise<DecodedText> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"decrypt\",\n\t]);\n\tconst plaintext = await crypto.subtle.decrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(decodeBase64Bytes(ciphertext)));\n\treturn createDecodedText(getTextDecoder().decode(plaintext));\n}\n\n/**\n * 使用 RSA-PSS/SHA-256 私钥签名文本或字节。\n *\n * @param value - 要签名的 UTF-8 文本或原始字节。\n * @param privateKeyPem - 未加密的 PKCS#8 PEM 私钥。\n * @returns Base64 编码的 RSA-PSS 签名;盐长度固定为 32 字节。\n * @throws 私钥格式无效或签名失败时抛出错误。\n */\nexport async function RSASignPSS(value: string, privateKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-PSS\" }, false, [\n\t\t\"sign\",\n\t]);\n\t// PSS 盐长度固定为 SHA-256 摘要长度,与 .NET RSASignaturePadding.Pss 的默认行为一致。\n\tconst signature = await crypto.subtle.sign({ name: \"RSA-PSS\", saltLength: 32 }, key, toArrayBuffer(encodeUtf8(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/**\n * 使用 RSA-PSS/SHA-256 公钥验证 Base64 签名。\n *\n * @param value - 签名时使用的 UTF-8 文本或原始字节。\n * @param signature - Base64 编码的 RSA-PSS 签名。\n * @param publicKeyPem - SubjectPublicKeyInfo PEM 公钥。\n * @returns 签名与内容、公钥匹配时返回 `true`。\n * @throws 公钥或 Base64 格式无效时抛出错误。\n */\nexport async function RSAVerifyPSS(value: string, signature: string, publicKeyPem: string): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-PSS\" }, false, [\n\t\t\"verify\",\n\t]);\n\t// 验证端必须使用与签名端相同的 32 字节 PSS 盐长度。\n\treturn crypto.subtle.verify(\n\t\t{ name: \"RSA-PSS\", saltLength: 32 },\n\t\tkey,\n\t\ttoArrayBuffer(decodeBase64Bytes(signature)),\n\t\ttoArrayBuffer(encodeUtf8(value))\n\t);\n}\n\n/**\n * 生成 ECDSA PEM 签名密钥对。\n *\n * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n */\nexport async function GenerateECDSAKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDSA\", namedCurve }, true, [\"sign\", \"verify\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用 ECDSA 私钥签名文本或字节。\n *\n * @remarks Web Crypto 返回 IEEE P1363 固定字段拼接格式,与 .NET 实现一致。\n * @param value - 要签名的 UTF-8 文本或原始字节。\n * @param privateKeyPem - 未加密的 EC PKCS#8 PEM 私钥。\n * @param namedCurve - 私钥使用的 NIST 曲线。\n * @returns Base64 编码的 IEEE P1363 ECDSA 签名。\n */\nexport async function ECDSASign(value: string, privateKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDSA\", namedCurve }, false, [\"sign\"]);\n\t// NIST 曲线强度分别对应 SHA-256、SHA-384 和 SHA-512;映射只在签名入口使用,因此直接保留在调用点。\n\tconst hash = namedCurve === \"P-256\" ? \"SHA-256\" : namedCurve === \"P-384\" ? \"SHA-384\" : \"SHA-512\";\n\tconst signature = await crypto.subtle.sign({ hash, name: \"ECDSA\" }, key, toArrayBuffer(encodeUtf8(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/**\n * 使用 ECDSA 公钥验证 Base64 签名。\n *\n * @param value - 签名时使用的 UTF-8 文本或原始字节。\n * @param signature - Base64 编码的 IEEE P1363 ECDSA 签名。\n * @param publicKeyPem - EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 公钥使用的 NIST 曲线。\n * @returns 签名与内容、公钥和曲线匹配时返回 `true`。\n */\nexport async function ECDSAVerify(value: string, signature: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDSA\", namedCurve }, false, [\"verify\"]);\n\t// 与签名入口保持相同的曲线/摘要映射,避免允许调用方组合不匹配的安全强度。\n\tconst hash = namedCurve === \"P-256\" ? \"SHA-256\" : namedCurve === \"P-384\" ? \"SHA-384\" : \"SHA-512\";\n\treturn crypto.subtle.verify({ hash, name: \"ECDSA\" }, key, toArrayBuffer(decodeBase64Bytes(signature)), toArrayBuffer(encodeUtf8(value)));\n}\n\n/**\n * 生成 ECDH PEM 密钥协商密钥对。\n *\n * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n */\nexport async function GenerateECDHKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDH\", namedCurve }, true, [\"deriveBits\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用本方 ECDH 私钥与对方 ECDH 公钥派生共享秘密。\n *\n * @remarks 返回值仍需经过合适的 KDF 后才能作为对称密钥,不应直接长期存储。\n * @param privateKeyPem - 本方未加密的 EC PKCS#8 PEM 私钥。\n * @param publicKeyPem - 对方的 EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 双方密钥使用的 NIST 曲线。\n * @returns 曲线字段长度的原始 ECDH 共享秘密。\n */\nexport async function DeriveECDHSecret(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDH\", namedCurve }, false, [\"deriveBits\"]),\n\t\tcrypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDH\", namedCurve }, false, []),\n\t]);\n\t// P-521 字段需要按完整字节对齐,因此导出 66 字节(528 位),其余曲线直接使用字段位数。\n\tconst bitLength = namedCurve === \"P-256\" ? 256 : namedCurve === \"P-384\" ? 384 : 528;\n\tconst secret = await crypto.subtle.deriveBits({ name: \"ECDH\", public: publicKey }, privateKey, bitLength);\n\treturn new Uint8Array(secret);\n}\n\n/**\n * 使用 ECDH 后以 SHA-256 派生共享密钥。\n *\n * @remarks 相比直接使用原始共享秘密,此入口与 .NET `DeriveECDHKeySHA256` 一致并固定输出 32 字节。\n * @param privateKeyPem - 本方未加密的 EC PKCS#8 PEM 私钥。\n * @param publicKeyPem - 对方的 EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 双方密钥使用的 NIST 曲线。\n * @returns 32 字节共享密钥。\n */\nexport async function DeriveECDHKeySHA256(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst secret = await DeriveECDHSecret(privateKeyPem, publicKeyPem, namedCurve);\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(secret));\n\treturn new Uint8Array(digest);\n}\n","/** 可转换为日期的输入;数字始终按 Unix 毫秒时间戳处理。 */\nexport type DateInput = Date | number | string;\n\n/** {@link formatRelativeTime} 的语言与基准时间选项。 */\nexport interface RelativeTimeOptions {\n\t/** `Intl.RelativeTimeFormat` 使用的语言;默认固定为 `zh-CN`。 */\n\tlocale?: string | readonly string[];\n\t/** 比较基准,默认当前时间。 */\n\tnow?: DateInput;\n\t/** 是否允许“昨天”“明天”等文本;默认 `auto`。 */\n\tnumeric?: Intl.RelativeTimeFormatNumeric;\n\t/** 输出长度;默认 `long`。 */\n\tstyle?: Intl.RelativeTimeFormatStyle;\n}\n\n/**\n * 校验日期算术移动量。\n *\n * @param amount - 待校验的日、月或年移动量。\n * @throws `RangeError` 当值不是安全整数。\n */\nconst assertIntegerAmount = (amount: number): void => {\n\tif (!Number.isSafeInteger(amount)) throw new RangeError(\"`amount` 必须是安全整数。\");\n};\n\n/**\n * 转换并克隆有效日期。\n *\n * @remarks 数字不进行秒/毫秒猜测;字符串遵循运行时 `Date` 解析规则,跨平台代码应传带显式时区的完整 ISO 8601。\n * @param value - Date、Unix 毫秒时间戳或运行时可解析字符串。\n * @returns 与输入不共享可变状态的新 Date。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function toDate(value: DateInput): Date {\n\tconst date = value instanceof Date ? new Date(value.getTime()) : new Date(value);\n\tif (!Number.isFinite(date.getTime())) {\n\t\tthrow new TypeError(\"该值不是有效日期。\");\n\t}\n\treturn date;\n}\n\n/**\n * 判断输入能否转换为有效日期。\n *\n * @param value - 任意待检查值。\n * @returns 仅 Date、数字或字符串且时间戳有限时返回 `true`。\n */\nexport function isValidDate(value: unknown): value is DateInput {\n\tif (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) return false;\n\treturn Number.isFinite(new Date(value).getTime());\n}\n\n/**\n * 返回输入日期所在本地时区日期的 `00:00:00.000`,不修改输入。\n *\n * @param value - 有效日期输入。\n * @returns 新建的本地日开始时间。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function startOfDay(value: DateInput): Date {\n\tconst date = toDate(value);\n\tdate.setHours(0, 0, 0, 0);\n\treturn toDate(date);\n}\n\n/**\n * 返回输入日期所在本地时区日期的 `23:59:59.999`,不修改输入。\n *\n * @param value - 有效日期输入。\n * @returns 新建的本地日结束时间。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function endOfDay(value: DateInput): Date {\n\tconst date = toDate(value);\n\tdate.setHours(23, 59, 59, 999);\n\treturn toDate(date);\n}\n\n/**\n * 按本地日历增加整数天,不修改输入。\n *\n * @param value - 基准日期。\n * @param amount - 可为负数的安全整数日数。\n * @returns 本地日历运算后的新 Date;夏令时变化可能使实际毫秒差不等于 24 小时。\n * @throws 日期无效时抛出 `TypeError`;数量或结果非法时抛出 `RangeError`。\n */\nexport function addDays(value: DateInput, amount: number): Date {\n\tassertIntegerAmount(amount);\n\tconst date = toDate(value);\n\tdate.setDate(date.getDate() + amount);\n\treturn toDate(date);\n}\n\n/**\n * 按本地日历增加整数月,并把不存在的日期夹到目标月末。\n *\n * @example 1 月 31 日增加一个月会落在 2 月最后一天。\n * @param value - 基准日期。\n * @param amount - 可为负数的安全整数月数。\n * @returns 月份运算后的新 Date。\n * @throws 日期无效时抛出 `TypeError`;数量或结果非法时抛出 `RangeError`。\n */\nexport function addMonths(value: DateInput, amount: number): Date {\n\tassertIntegerAmount(amount);\n\tconst date = toDate(value);\n\tconst originalDay = date.getDate();\n\tdate.setDate(1);\n\tdate.setMonth(date.getMonth() + amount);\n\tconst targetMonthEnd = new Date(date.getTime());\n\t// 避免 `new Date(year, ...)` 把 0 至 99 年解释为 1900 至 1999 年。\n\ttargetMonthEnd.setMonth(targetMonthEnd.getMonth() + 1, 0);\n\tconst lastDay = targetMonthEnd.getDate();\n\tdate.setDate(Math.min(originalDay, lastDay));\n\treturn toDate(date);\n}\n\n/**\n * 按本地日历增加整数年,并沿用 {@link addMonths} 的月末夹取规则。\n *\n * @param value - 基准日期。\n * @param amount - 可为负数的安全整数年数。\n * @returns 年份运算后的新 Date。\n * @throws 日期无效时抛出 `TypeError`;数量或结果非法时抛出 `RangeError`。\n */\nexport function addYears(value: DateInput, amount: number): Date {\n\tassertIntegerAmount(amount);\n\treturn addMonths(value, amount * 12);\n}\n\n/**\n * 判断两个输入是否属于同一本地日历日。\n *\n * @param left - 第一日期。\n * @param right - 第二日期。\n * @returns 本地年、月、日均相同时返回 `true`。\n * @throws 任一输入无效时抛出 `TypeError`。\n */\nexport function isSameDay(left: DateInput, right: DateInput): boolean {\n\tconst first = toDate(left);\n\tconst second = toDate(right);\n\treturn first.getFullYear() === second.getFullYear() && first.getMonth() === second.getMonth() && first.getDate() === second.getDate();\n}\n\n/**\n * 判断时间是否晚于基准时间。\n *\n * @param value - 待比较时间。\n * @param now - 比较基准,默认调用时的当前时刻。\n * @returns `value` 严格晚于基准时返回 `true`。\n * @throws 任一输入无效时抛出 `TypeError`。\n */\nexport function isFuture(value: DateInput, now: DateInput = Date.now()): boolean {\n\treturn toDate(value).getTime() > toDate(now).getTime();\n}\n\n/**\n * 返回指定基准所在本地日历日的完整闭区间。\n *\n * @param value - 日期基准,默认调用时当前日期。\n * @returns 新建的本地日开始和结束时间二元组。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function getLocalDayBounds(value: DateInput = Date.now()): [start: Date, end: Date] {\n\treturn [startOfDay(value), endOfDay(value)];\n}\n\n/**\n * 判断日期是否位于包含首尾的时间区间。\n *\n * @param value - 待检查日期。\n * @param start - 包含的起点。\n * @param end - 包含的终点。\n * @returns 时间戳位于闭区间内时返回 `true`。\n * @throws 无效日期抛出 `TypeError`;首尾反向时抛出 `RangeError`。\n */\nexport function isWithinInterval(value: DateInput, start: DateInput, end: DateInput): boolean {\n\tconst timestamp = toDate(value).getTime();\n\tconst startTimestamp = toDate(start).getTime();\n\tconst endTimestamp = toDate(end).getTime();\n\tif (startTimestamp > endTimestamp) throw new RangeError(\"`start` 不能晚于 `end`。\");\n\treturn timestamp >= startTimestamp && timestamp <= endTimestamp;\n}\n\n/**\n * 使用 `Intl.RelativeTimeFormat` 生成人类可读相对时间。\n *\n * @remarks 秒、分钟、小时、天、周、月和年按固定时长阈值选择;这适合展示,不适合计费或日历运算。\n * @param value - 目标时间。\n * @param options - 语言、样式与比较基准。\n * @returns 由 `Intl.RelativeTimeFormat` 生成的本地化文本。\n * @throws 日期无效时抛出 `TypeError`;Locale 或 Intl 选项非法时抛出 `RangeError`。\n */\nexport function formatRelativeTime(value: DateInput, options: RelativeTimeOptions = {}): string {\n\tconst differenceSeconds = (toDate(value).getTime() - toDate(options.now ?? Date.now()).getTime()) / 1000;\n\tconst absolute = Math.abs(differenceSeconds);\n\tlet divisor: number;\n\tlet unit: Intl.RelativeTimeFormatUnit;\n\tif (absolute < 60) {\n\t\tdivisor = 1;\n\t\tunit = \"second\";\n\t} else if (absolute < 3_600) {\n\t\tdivisor = 60;\n\t\tunit = \"minute\";\n\t} else if (absolute < 86_400) {\n\t\tdivisor = 3_600;\n\t\tunit = \"hour\";\n\t} else if (absolute < 604_800) {\n\t\tdivisor = 86_400;\n\t\tunit = \"day\";\n\t} else if (absolute < 2_629_800) {\n\t\tdivisor = 604_800;\n\t\tunit = \"week\";\n\t} else if (absolute < 31_557_600) {\n\t\tdivisor = 2_629_800;\n\t\tunit = \"month\";\n\t} else {\n\t\tdivisor = 31_557_600;\n\t\tunit = \"year\";\n\t}\n\tconst formatter = new Intl.RelativeTimeFormat(options.locale ?? \"zh-CN\", {\n\t\tnumeric: options.numeric ?? \"auto\",\n\t\tstyle: options.style ?? \"long\",\n\t});\n\treturn formatter.format(Math.round(differenceSeconds / divisor), unit);\n}\n\n/** 日期选择器单日期快捷项。 */\nexport interface DateShortcut {\n\t/** 面向中文日期选择器的显示文本;调用方可直接用于菜单标签。 */\n\ttext: string;\n\t/**\n\t * 计算快捷项对应日期。\n\t * @returns 每次调用时基于当前本地时间创建的新 `Date`,调用方可安全修改。\n\t */\n\tvalue: () => Date;\n}\n\n/** 日期选择器范围快捷项。 */\nexport interface DateRangeShortcut {\n\t/** 面向中文日期范围选择器的显示文本;调用方可直接用于菜单标签。 */\n\ttext: string;\n\t/**\n\t * 计算快捷项对应的本地日期范围。\n\t * @returns 每次调用时创建的新元组;起点为 `00:00:00.000`,终点为 `23:59:59.999`。\n\t */\n\tvalue: () => [start: Date, end: Date];\n}\n\n/** 历史快捷项允许移动的本地日历单位。 */\ntype CalendarUnit = \"day\" | \"month\" | \"year\";\n\n/**\n * 移动本地日历字段。\n *\n * @remarks 直接使用 Date Setter,以保留历史快捷项在月底和闰年的溢出语义。\n * @param date - 会被原地修改的日期。\n * @param amount - 对目标字段增加的整数。\n * @param unit - 要移动的日历字段。\n */\nconst shiftCalendarFieldInPlace = (date: Date, amount: number, unit: CalendarUnit): void => {\n\tswitch (unit) {\n\t\tcase \"day\":\n\t\t\tdate.setDate(date.getDate() + amount);\n\t\t\tbreak;\n\t\tcase \"month\":\n\t\t\tdate.setMonth(date.getMonth() + amount);\n\t\t\tbreak;\n\t\tcase \"year\":\n\t\t\tdate.setFullYear(date.getFullYear() + amount);\n\t\t\tbreak;\n\t}\n};\n\n/**\n * 创建动态单日期快捷项。\n *\n * @param text - 日期选择器显示文本。\n * @param amount - 相对当前时间的移动量。\n * @param unit - 移动使用的日历单位。\n * @returns 每次执行 `value` 都重新读取当前时间的快捷项。\n */\nconst createDateShortcut = (text: string, amount: number, unit: CalendarUnit): DateShortcut => ({\n\ttext,\n\tvalue: (): Date => {\n\t\tconst date = new Date();\n\t\tshiftCalendarFieldInPlace(date, amount, unit);\n\t\tdate.setHours(0, 0, 0, 0);\n\t\treturn date;\n\t},\n});\n\n/**\n * 创建动态日期范围快捷项。\n *\n * @param text - 日期选择器显示文本。\n * @param amount - 范围边界相对当前时间的移动量。\n * @param unit - 移动使用的日历单位。\n * @param towardFuture - `true` 移动结束边界,`false` 移动开始边界。\n * @returns 每次求值都覆盖完整本地日边界的范围快捷项。\n */\nconst createRangeShortcut = (text: string, amount: number, unit: CalendarUnit, towardFuture: boolean): DateRangeShortcut => ({\n\ttext,\n\tvalue: (): [Date, Date] => {\n\t\tconst start = new Date();\n\t\tconst end = new Date();\n\t\tshiftCalendarFieldInPlace(towardFuture ? end : start, towardFuture ? amount : -amount, unit);\n\t\tstart.setHours(0, 0, 0, 0);\n\t\tend.setHours(23, 59, 59, 999);\n\t\treturn [start, end];\n\t},\n});\n\n/**\n * 把日期转换为固定中文相对时间文本。\n *\n * @remarks 10 位以内数字按 Unix 秒处理,其余数字按毫秒处理;月份与年份按本地日历月差计算。\n * @param value - Date、时间戳、可解析字符串或空值。\n * @returns 例如“3分钟前”“半年后”;非法或空输入返回空字符串。\n */\nexport function formatChineseRelativeTime(value: Date | number | string | null | undefined): string {\n\tif (value === null || value === undefined) return \"\";\n\tlet timestamp: number;\n\tif (typeof value === \"string\") timestamp = new Date(value).getTime();\n\telse if (typeof value === \"number\") timestamp = value.toString().length <= 10 ? value * 1000 : value;\n\telse timestamp = value.getTime();\n\tif (!Number.isFinite(timestamp)) return \"\";\n\n\tconst minute = 60_000;\n\tconst hour = minute * 60;\n\tconst day = hour * 24;\n\tconst currentTimestamp = Date.now();\n\tconst difference = currentTimestamp - timestamp;\n\tconst minuteDifference = Math.abs(difference) / minute;\n\tconst hourDifference = Math.abs(difference) / hour;\n\tconst dayDifference = Math.abs(difference) / day;\n\tconst currentDate = new Date(currentTimestamp);\n\tconst targetDate = new Date(timestamp);\n\tconst monthDifference = (currentDate.getFullYear() - targetDate.getFullYear()) * 12 + currentDate.getMonth() - targetDate.getMonth();\n\tconst suffix = difference < 0 ? \"后\" : \"前\";\n\tif (Math.abs(monthDifference) >= 12) return `${Math.floor(Math.abs(monthDifference) / 12)}年${suffix}`;\n\tif (Math.abs(monthDifference) >= 6) return `半年${suffix}`;\n\tif (Math.abs(monthDifference) >= 1) return `${Math.abs(monthDifference)}月${suffix}`;\n\tif (dayDifference >= 15) return `半月${suffix}`;\n\tif (dayDifference >= 7) return `${Math.floor(dayDifference / 7)}周${suffix}`;\n\tif (dayDifference >= 1) return `${Math.floor(dayDifference)}天${suffix}`;\n\tif (hourDifference >= 1) return `${Math.floor(hourDifference)}小时${suffix}`;\n\tif (minuteDifference >= 1) return `${Math.floor(minuteDifference)}分钟${suffix}`;\n\treturn \"刚刚\";\n}\n\n/**\n * 创建从今天到前后一个月日期的完整本地日范围。\n *\n * @param towardFuture - `true` 返回今天至一个月后,默认返回一个月前至今天。\n * @returns 每次调用新建的本地日首尾边界。\n */\nexport function createOneMonthRangeFromToday(towardFuture = false): [start: Date, end: Date] {\n\tconst start = new Date();\n\tconst end = new Date();\n\tshiftCalendarFieldInPlace(towardFuture ? end : start, towardFuture ? 1 : -1, \"month\");\n\tstart.setHours(0, 0, 0, 0);\n\tend.setHours(23, 59, 59, 999);\n\treturn [start, end];\n}\n\n/**\n * 判断日期是否晚于调用时的当前时刻。\n *\n * @param time - 待比较日期。\n * @returns 时间戳严格晚于 `Date.now()` 时返回 `true`。\n */\nexport function isDateAfterNow(time: Date): boolean {\n\treturn time.getTime() > Date.now();\n}\n\n/**\n * 根据浏览器本地小时返回固定中文问候语。\n *\n * @returns 与当前时段对应的中文欢迎文本。\n */\nexport function getLocalTimeGreeting(): string {\n\tconst hour = new Date().getHours();\n\tif (hour < 5) return \"夜深了,注意身体哦!\";\n\tif (hour < 9) return \"早上好!欢迎回来!\";\n\tif (hour < 12) return \"上午好!欢迎回来!\";\n\tif (hour < 14) return \"中午好!欢迎回来!\";\n\tif (hour < 18) return \"下午好!欢迎回来!\";\n\tif (hour < 24) return \"晚上好!欢迎回来!\";\n\treturn \"您好!欢迎回来!\";\n}\n\n/**\n * 创建面向过去或未来的常用完整日期范围快捷项。\n *\n * @param towardFuture - `true` 创建未来范围,默认创建历史范围。\n * @returns 每次求值都会重新读取当前时间的范围快捷项。\n */\nexport function createDateRangeShortcuts(towardFuture = false): DateRangeShortcut[] {\n\treturn towardFuture\n\t\t? [\n\t\t\t\tcreateRangeShortcut(\"后1天\", 1, \"day\", true),\n\t\t\t\tcreateRangeShortcut(\"后3天\", 3, \"day\", true),\n\t\t\t\tcreateRangeShortcut(\"后1周\", 7, \"day\", true),\n\t\t\t\tcreateRangeShortcut(\"后1月\", 1, \"month\", true),\n\t\t\t\tcreateRangeShortcut(\"后3月\", 3, \"month\", true),\n\t\t\t\tcreateRangeShortcut(\"后6月\", 6, \"month\", true),\n\t\t\t\tcreateRangeShortcut(\"后1年\", 1, \"year\", true),\n\t\t\t]\n\t\t: [\n\t\t\t\tcreateRangeShortcut(\"近1天\", 1, \"day\", false),\n\t\t\t\tcreateRangeShortcut(\"近3天\", 3, \"day\", false),\n\t\t\t\tcreateRangeShortcut(\"近1周\", 7, \"day\", false),\n\t\t\t\tcreateRangeShortcut(\"近1月\", 1, \"month\", false),\n\t\t\t\tcreateRangeShortcut(\"近3月\", 3, \"month\", false),\n\t\t\t\tcreateRangeShortcut(\"近6月\", 6, \"month\", false),\n\t\t\t\tcreateRangeShortcut(\"近1年\", 1, \"year\", false),\n\t\t\t];\n}\n\n/**\n * 创建面向过去或未来的常用单日期快捷项。\n *\n * @param towardFuture - `true` 创建未来日期,默认创建历史日期。\n * @returns 每次求值都会重新读取当前时间的单日期快捷项。\n */\nexport function createDateShortcuts(towardFuture = false): DateShortcut[] {\n\treturn towardFuture\n\t\t? [\n\t\t\t\tcreateDateShortcut(\"今天\", 0, \"day\"),\n\t\t\t\tcreateDateShortcut(\"明天\", 1, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一周后\", 7, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一月后\", 1, \"month\"),\n\t\t\t\tcreateDateShortcut(\"一年后\", 1, \"year\"),\n\t\t\t]\n\t\t: [\n\t\t\t\tcreateDateShortcut(\"今天\", 0, \"day\"),\n\t\t\t\tcreateDateShortcut(\"昨天\", -1, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一周前\", -7, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一月前\", -1, \"month\"),\n\t\t\t\tcreateDateShortcut(\"一年前\", -1, \"year\"),\n\t\t\t];\n}\n\n/**\n * 返回今天的本地零点。\n *\n * @returns 新建的 `00:00:00.000` Date。\n */\nexport function getStartOfToday(): Date {\n\treturn startOfDay(new Date());\n}\n","/** 可序列化为内联 CSS 的单个值。 */\nexport type StyleValue = number | string | null | undefined;\n\n/** camelCase、kebab-case 或 CSS 自定义属性组成的只读样式对象。 */\nexport type StyleObject = Readonly<Record<string, StyleValue>>;\n\n/** 字符串、样式对象、嵌套数组或空值。 */\nexport type StyleInput = string | StyleObject | readonly StyleInput[] | null | undefined;\n\n/**\n * 判断 StyleInput 是否为递归样式数组。\n *\n * @param value - 待缩小的样式输入。\n * @returns 是只读样式数组时返回 `true`。\n */\nconst isStyleArray = (value: StyleInput): value is readonly StyleInput[] => Array.isArray(value);\n\n/**\n * 判断文本是否可按十进制数值追加 CSS 单位。\n *\n * @param value - 已去除外围空白的文本。\n * @returns 有限十进制数值返回 `true`;二、八、十六进制前缀返回 `false`。\n */\nconst isNumericString = (value: string): boolean => {\n\tif (value.length === 0 || !Number.isFinite(Number(value))) return false;\n\tconst unsigned = value.startsWith(\"+\") || value.startsWith(\"-\") ? value.slice(1) : value;\n\treturn !/^0[box]/iu.test(unsigned);\n};\n\n/**\n * 把 JavaScript 样式属性名转换为 CSS 属性名。\n *\n * @param key - camelCase、kebab-case 或 CSS 自定义属性名。\n * @returns kebab-case 属性名;`--` 自定义属性保持原样。\n */\nconst toCssPropertyName = (key: string): string => {\n\tif (key.startsWith(\"--\")) return key;\n\tconst normalized = key.startsWith(\"ms\") ? `-${key}` : key;\n\treturn normalized.replace(/([A-Z])/gu, \"-$1\").toLowerCase();\n};\n\n/**\n * 为数值或纯数字字符串添加 CSS 单位。\n *\n * @param value - 数字、数字字符串或已有单位的 CSS 值;空值返回空字符串。\n * @param unit - 非零数字使用的单位,默认 `px`。\n * @returns 零统一返回 `\"0\"`;非数字字符串保持原样。\n * @throws `RangeError` 当数字非有限或单位为空。\n */\nexport function addCssUnit(value?: string | number | null, unit = \"px\"): string {\n\tif (value === null || value === undefined || value === \"\") return \"\";\n\tif (unit.length === 0) throw new RangeError(\"`unit` 不能为空。\");\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new RangeError(\"`value` 必须是有限数。\");\n\t\treturn value === 0 ? \"0\" : `${value}${unit}`;\n\t}\n\tconst trimmed = value.trim();\n\tif (!isNumericString(trimmed)) return value;\n\treturn Number(trimmed) === 0 ? \"0\" : `${trimmed}${unit}`;\n}\n\n/**\n * 将样式字符串、对象或嵌套数组序列化为内联 CSS。\n *\n * @remarks 本函数只负责结构转换,不是 CSS 安全清洗器。不可信值必须由调用方按照\n * 实际渲染上下文验证,尤其不能允许用户控制属性名、`url()` 或自定义属性内容。\n * 数字不会自动附加单位;需要长度单位时应先调用 {@link addCssUnit}。\n * @param styles - 可嵌套样式输入;后出现的声明由 CSS 层叠规则覆盖先前声明。\n * @returns 以分号结束、以空格分隔的 CSS 声明字符串。\n * @throws `RangeError` 当对象中包含 `NaN` 或无穷数字。\n */\nexport function serializeStyle(styles: StyleInput): string {\n\tif (styles === null || styles === undefined || styles === \"\") return \"\";\n\tif (isStyleArray(styles)) {\n\t\treturn styles\n\t\t\t.map((item) => serializeStyle(item))\n\t\t\t.filter((item) => item.length > 0)\n\t\t\t.join(\" \");\n\t}\n\tif (typeof styles === \"string\") {\n\t\tconst value = styles.trim();\n\t\treturn value.length === 0 ? \"\" : value.endsWith(\";\") ? value : `${value};`;\n\t}\n\n\treturn Object.entries(styles)\n\t\t.filter(([, value]) => value !== null && value !== undefined && value !== \"\")\n\t\t.map(([key, value]) => {\n\t\t\tif (typeof value === \"number\" && !Number.isFinite(value)) throw new RangeError(`样式属性“${key}”必须是有限数。`);\n\t\t\treturn `${toCssPropertyName(key)}:${String(value)};`;\n\t\t})\n\t\t.join(\" \");\n}\n","/** 可识别的主要 JavaScript 运行环境。 */\nexport type RuntimeKind = \"browser\" | \"node\" | \"unknown\" | \"worker\";\n\n/**\n * 延迟读取当前 User-Agent。\n *\n * @returns Navigator 不存在或字段类型异常时返回空字符串。\n */\nconst currentUserAgent = (): string => (typeof globalThis.navigator?.userAgent === \"string\" ? globalThis.navigator.userAgent : \"\");\n/**\n * 延迟读取当前设备报告的最大触点数。\n *\n * @returns Navigator 不存在或字段类型异常时返回 `0`。\n */\nconst currentTouchPoints = (): number => (typeof globalThis.navigator?.maxTouchPoints === \"number\" ? globalThis.navigator.maxTouchPoints : 0);\n\n/**\n * 判断当前运行时是否具有浏览器 `window` 与 `document`。\n *\n * @returns 两项能力均存在时返回 `true`;不读取 DOM 内容。\n */\nexport function isBrowser(): boolean {\n\tconst window = globalThis.window;\n\treturn window !== undefined && window !== null && window.document !== null && typeof window.document === \"object\";\n}\n\n/**\n * 判断当前运行时是否像 Web Worker 且不是 Window。\n *\n * @remarks 经典、模块、Shared 与 Service Worker 全局通常都暴露 `importScripts`;模块\n * Worker 中调用它可能抛错,本检测只检查能力存在,不会执行。\n * @returns 具有 `importScripts` 且不是浏览器 Window 时返回 `true`。\n */\nexport function isWebWorker(): boolean {\n\treturn !isBrowser() && typeof Reflect.get(globalThis, \"importScripts\") === \"function\";\n}\n\n/**\n * 判断当前运行时是否暴露 Node.js 版本标记。\n *\n * @returns `process.versions.node` 为字符串时返回 `true`。\n */\nexport function isNode(): boolean {\n\tconst process: unknown = Reflect.get(globalThis, \"process\");\n\tif ((typeof process !== \"object\" && typeof process !== \"function\") || process === null) return false;\n\tconst versions: unknown = Reflect.get(process, \"versions\");\n\treturn (typeof versions === \"object\" || typeof versions === \"function\") && versions !== null && typeof Reflect.get(versions, \"node\") === \"string\";\n}\n\n/**\n * 判断当前运行时是否暴露 uni-app 的 `uni` 全局对象。\n *\n * @returns 全局属性存在且不为 `undefined` 时返回 `true`;不调用任何平台 API。\n */\nexport function isUniApp(): boolean {\n\treturn Reflect.get(globalThis, \"uni\") !== undefined;\n}\n\n/**\n * 判断当前运行时是否具备本库完整加密 API 所需的 Web Crypto 能力。\n *\n * @remarks 普通随机数、随机字符串和 UUID 在缺少 Web Crypto 时可以回退到 `Math.random()`,但本函数\n * 仍会返回 `false`,因为摘要、PBKDF2、AES-GCM、RSA 与 ECC 需要完整的 Web Crypto 能力。\n * @returns 同时提供本库 Web Crypto 功能所需方法时返回 `true`。\n */\nexport function hasWebCrypto(): boolean {\n\tconst crypto = globalThis.crypto;\n\tconst subtle = crypto?.subtle;\n\treturn (\n\t\ttypeof crypto?.getRandomValues === \"function\" &&\n\t\ttypeof subtle?.decrypt === \"function\" &&\n\t\ttypeof subtle.deriveBits === \"function\" &&\n\t\ttypeof subtle.deriveKey === \"function\" &&\n\t\ttypeof subtle.digest === \"function\" &&\n\t\ttypeof subtle.encrypt === \"function\" &&\n\t\ttypeof subtle.exportKey === \"function\" &&\n\t\ttypeof subtle.generateKey === \"function\" &&\n\t\ttypeof subtle.importKey === \"function\" &&\n\t\ttypeof subtle.sign === \"function\" &&\n\t\ttypeof subtle.verify === \"function\"\n\t);\n}\n\n/**\n * 返回当前主要运行环境。\n *\n * @remarks 在使用 DOM 模拟器的 Node.js 进程中优先报告 `browser`,因为可观察能力比宿主进程名称更有用。\n * @returns `browser`、`worker`、`node` 或无法识别时的 `unknown`。\n */\nexport function detectRuntime(): RuntimeKind {\n\tif (isBrowser()) return \"browser\";\n\tif (isWebWorker()) return \"worker\";\n\tif (isNode()) return \"node\";\n\treturn \"unknown\";\n}\n\n/**\n * 基于 User-Agent 启发式判断手机设备。\n *\n * @param userAgent - 默认读取当前 `navigator.userAgent`;平台对象不存在时使用空字符串。\n * @remarks User-Agent 可以被伪造,不得用于鉴权、安全策略或永久功能分流。\n * @returns 命中手机特征时返回 `true`。\n */\nexport function isMobileUserAgent(userAgent: string = currentUserAgent()): boolean {\n\treturn /Mobile|iPhone|Android.*Mobile|Windows Phone/iu.test(userAgent);\n}\n\n/**\n * 基于 User-Agent 与触点数量启发式判断平板设备。\n *\n * @param userAgent - 默认读取当前 User-Agent。\n * @param maxTouchPoints - 用于识别桌面 User-Agent 模式下的 iPadOS,默认读取当前触点数。\n * @returns 命中平板特征时返回 `true`。\n */\nexport function isTabletUserAgent(userAgent: string = currentUserAgent(), maxTouchPoints: number = currentTouchPoints()): boolean {\n\treturn /iPad|Android(?!.*Mobile)|Tablet/iu.test(userAgent) || (/Macintosh/iu.test(userAgent) && maxTouchPoints > 1);\n}\n","import { decodeSecureBase64, encodeSecureBase64 } from \"../base64/index\";\n\n/** uni-app 同步存储信息中本库实际读取的字段。 */\ninterface UniStorageInfo {\n\t/** 当前平台可见的物理键快照。 */\n\tkeys: readonly string[];\n}\n\n/** 全局 `uni` 必须提供的同步存储 API 最小结构。 */\ninterface UniStorageLike {\n\t/**\n\t * 同步读取一个物理键的原始值。\n\t * @param key - 已包含全局命名空间前缀的物理键。\n\t * @returns 平台保存的值;键缺失时应返回 `undefined`、`null` 或空字符串。\n\t */\n\tgetStorageSync: (key: string) => unknown;\n\t/**\n\t * 同步读取平台当前可见的全部物理键。\n\t * @returns 至少包含只读 `keys` 数组的快照对象。\n\t */\n\tgetStorageInfoSync: () => UniStorageInfo;\n\t/**\n\t * 同步删除一个物理键;键不存在时应保持幂等。\n\t * @param key - 已包含全局命名空间前缀的物理键。\n\t */\n\tremoveStorageSync: (key: string) => void;\n\t/**\n\t * 同步写入已经序列化的包络文本。\n\t * @param key - 已包含全局命名空间前缀的物理键。\n\t * @param value - JSON 包络字符串,不是未经编码的业务值。\n\t */\n\tsetStorageSync: (key: string, value: string) => void;\n}\n\n/** Storage 业务值编码器。 */\nexport interface StorageCodec {\n\t/**\n\t * 把已编码文本恢复为业务值。\n\t * @param value - 由同一 Codec 的 `encode` 生成并持久化的文本。\n\t * @returns 解码后的业务值。\n\t * @throws 当文本损坏、格式不受支持或无法反序列化时应抛出错误。\n\t */\n\tdecode: (value: string) => unknown;\n\t/**\n\t * 把业务值编码为可持久化字符串。\n\t * @param value - 调用方传入的业务值。\n\t * @returns 可由同一 Codec 的 `decode` 无损恢复的文本。\n\t * @throws 当值不受支持或无法序列化时应抛出错误。\n\t */\n\tencode: (value: unknown) => string;\n}\n\n/** 程序入口调用 {@link configureStorage} 时使用的全局配置。 */\nexport interface StorageConfiguration {\n\t/** 自定义值编码器;默认使用严格 JSON Codec,同一应用生命周期内必须保持同一引用。 */\n\tcodec?: StorageCodec;\n\t/** 启用 Base64 可逆混淆;不提供加密、完整性或认证,不能与 `codec` 同时使用。 */\n\tcrypto?: boolean;\n\t/** 返回 Unix 毫秒时间戳的时钟;默认使用 `Date.now`,主要用于 TTL 测试与受控时间源。 */\n\tnow?: () => number;\n\t/** 所有物理键使用的非空命名空间前缀; */\n\tprefix?: string;\n}\n\n/** 单次 Storage 读取配置。 */\nexport interface StorageReadOptions {\n\t/**\n\t * 仅覆盖本次读取使用的 Codec;`true` 使用 Base64 混淆,`false` 使用 JSON,省略时使用全局配置。\n\t * 必须与写入该条目时使用的单次设置一致。\n\t */\n\tcrypto?: boolean;\n}\n\n/** 单次 Storage 写入配置。 */\nexport interface StorageWriteOptions extends StorageReadOptions {\n\t/** 从写入时刻开始的有效毫秒数;必须是大于 0 的有限数,省略时永久有效。 */\n\tttlMs?: number;\n}\n\n/** `Local` 与 `Session` 的统一操作接口。 */\nexport interface StorageArea {\n\t/** 当前全局 Storage 配置的物理键前缀;首次读取会激活默认配置。 */\n\treadonly prefix: string;\n\t/**\n\t * 删除当前命名空间内的全部键,不影响同一后端中的其他应用键。\n\t * @throws `Error` 当当前平台后端不可用。\n\t */\n\tclear: () => void;\n\t/**\n\t * 获取并解码业务值;已过期记录会在读取时删除。\n\t * @param key - 不含全局前缀的非空业务键。\n\t * @param options - 可选的单次 Base64 混淆开关;必须与写入时一致。\n\t * @returns 解码后的值;未传泛型时静态类型默认为 `string`,键缺失或过期时返回 `undefined`。\n\t * @throws 当键非法、包络损坏、Codec 解码失败或后端不可用时抛出错误。\n\t */\n\tget: <Value = string>(key: string, options?: StorageReadOptions) => Value | undefined;\n\t/**\n\t * 判断一个可成功读取且未过期的业务键是否存在。\n\t * @param key - 不含全局前缀的非空业务键。\n\t * @returns 键存在且包络有效时返回 `true`。\n\t */\n\thas: (key: string) => boolean;\n\t/**\n\t * 返回当前命名空间内的业务键快照。\n\t * @returns 已移除全局前缀并按字典序排列的新数组;不会自动清理过期项。\n\t */\n\tkeys: () => string[];\n\t/**\n\t * 扫描当前命名空间并删除全部过期记录。\n\t * @returns 本次实际删除的记录数量。\n\t * @throws 当发现损坏包络或后端不可用时抛出错误。\n\t */\n\tpruneExpired: () => number;\n\t/**\n\t * 删除单个业务键;键不存在时保持幂等。\n\t * @param key - 不含全局前缀的非空业务键。\n\t */\n\tremove: (key: string) => void;\n\t/**\n\t * 删除业务键以指定文本开头的全部条目,范围仍受全局命名空间限制。\n\t * @param keyPrefix - 不含全局前缀的非空业务键前缀。\n\t */\n\tremoveByPrefix: (keyPrefix: string) => void;\n\t/**\n\t * 编码并写入业务值,可附加惰性清理的 TTL。\n\t * @param key - 不含全局前缀的非空业务键。\n\t * @param value - 必须受当前 Codec 支持的业务值。\n\t * @param options - 可选的单次写入 TTL 与 Base64 混淆开关。\n\t * @throws 当键、TTL、业务值或后端写入无效时抛出错误。\n\t */\n\tset: <Value>(key: string, value: Value, options?: StorageWriteOptions) => void;\n}\n\n/** 浏览器 Storage 与 uni-app Storage 适配后的最小内部协议。 */\ninterface StorageBackend {\n\t/** 读取物理键原始值;缺失约定由上层统一规范为 `undefined`。 */\n\tgetItem: (key: string) => unknown;\n\t/** 枚举后端可见的全部物理键;返回值必须是不会随枚举过程变化的快照。 */\n\tkeys: () => readonly string[];\n\t/** 删除单个物理键;实现必须允许重复删除。 */\n\tremoveItem: (key: string) => void;\n\t/** 写入已经序列化的包络文本;配额和平台错误保持原样传播。 */\n\tsetItem: (key: string, value: string) => void;\n}\n\n/** 物理存储中的版本化包络;业务值始终先经 Codec 转为文本。 */\ninterface StoredEnvelope {\n\t/** Codec 编码后的业务文本;只有在包络结构校验通过后才能交给 Codec。 */\n\tdata: string;\n\t/** Unix 毫秒绝对过期时间戳;`null` 表示永久有效。 */\n\texpiresAt: number | null;\n\t/** 当前持久化协议版本;读取其他版本必须明确失败,不能猜测迁移。 */\n\tversion: 3;\n}\n\n/** 首次配置后冻结使用的解析结果和两个稳定门面。 */\ninterface ActiveStorageConfiguration {\n\t/** 首次配置后锁定的业务值 Codec 引用。 */\n\tcodec: StorageCodec;\n\t/** 已绑定 Local 后端、命名空间、Codec 与时钟的实际 Area。 */\n\tlocal: StorageArea;\n\t/** 首次配置后锁定的 TTL 时钟引用。 */\n\tnow: () => number;\n\t/** 所有 Area 共享的物理键命名空间前缀。 */\n\tprefix: string;\n\t/** 仅浏览器模式存在的 Session Area;uni-app 模式必须保持缺失。 */\n\tsession?: StorageArea;\n}\n\n/**\n * 读取并校验当前运行时的全局 uni-app 同步 Storage。\n *\n * @returns 检测到 uni-app 时返回同步 Storage;普通浏览器环境返回 `undefined`。\n * @throws `TypeError` 当全局 `uni` 存在但缺少本库需要的同步 Storage 方法。\n */\nconst getGlobalUniStorage = (): UniStorageLike | undefined => {\n\tconst value: unknown = Reflect.get(globalThis, \"uni\");\n\tif (value === undefined) return undefined;\n\tif ((typeof value !== \"object\" && typeof value !== \"function\") || value === null) {\n\t\tthrow new TypeError(\"全局 uni 对象未提供同步 Storage API。\");\n\t}\n\tconst storage = value as Partial<UniStorageLike>;\n\tif (\n\t\ttypeof storage.getStorageSync !== \"function\" ||\n\t\ttypeof storage.getStorageInfoSync !== \"function\" ||\n\t\ttypeof storage.removeStorageSync !== \"function\" ||\n\t\ttypeof storage.setStorageSync !== \"function\"\n\t) {\n\t\tthrow new TypeError(\"全局 uni 对象未提供同步 Storage API。\");\n\t}\n\treturn storage as UniStorageLike;\n};\n\n/** 默认 JSON Codec;显式拒绝会被 JSON.stringify 静默丢弃的顶层值。 */\nconst jsonCodec: StorageCodec = {\n\tdecode: (value): unknown => JSON.parse(value) as unknown,\n\tencode: (value): string => {\n\t\tconst encoded: unknown = JSON.stringify(value);\n\t\tif (typeof encoded !== \"string\") throw new TypeError(\"存储值无法序列化为 JSON。\");\n\t\treturn encoded;\n\t},\n};\n\n/** Base64 混淆 Codec;只隐藏明文外观,不提供加密、完整性或认证。 */\nexport const base64StorageCodec: StorageCodec = {\n\tdecode: (value): unknown => decodeSecureBase64(value).parseJson(),\n\tencode: (value): string => {\n\t\tconst encoded: unknown = JSON.stringify(value);\n\t\tif (typeof encoded !== \"string\") throw new TypeError(\"存储值无法序列化为 JSON。\");\n\t\treturn encodeSecureBase64(encoded);\n\t},\n};\n\n/** 页面级唯一配置;只允许幂等重复配置,避免模块加载顺序改变行为。 */\nlet activeConfiguration: ActiveStorageConfiguration | undefined;\n\n/**\n * 判断未知值是否为非数组对象记录。\n *\n * @param value - JSON.parse 返回的未知值。\n * @returns 值为非空、非数组对象时返回 `true`。\n */\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * 校验 Storage 业务键。\n *\n * @param key - 不含全局 Prefix 的业务键或业务键前缀。\n * @throws `TypeError` 当值不是非空字符串。\n */\nconst assertKey = (key: string): void => {\n\tif (typeof key !== \"string\" || key.length === 0) throw new TypeError(\"Storage 键必须是非空字符串。\");\n};\n\n/**\n * 创建浏览器 Storage 后端。\n *\n * @remarks 平台对象在调用阶段读取,因此导入模块不会访问浏览器全局对象。\n * @param kind - 选择 `localStorage` 或 `sessionStorage`。\n * @returns 统一的内部同步后端。\n * @throws `Error` 当所选 Storage 在当前环境不可用。\n */\nconst createWebStorageBackend = (kind: \"local\" | \"session\"): StorageBackend => {\n\tconst storage = kind === \"local\" ? globalThis.localStorage : globalThis.sessionStorage;\n\tif (storage === undefined) throw new Error(`当前运行环境不支持 ${kind}Storage。`);\n\treturn {\n\t\tgetItem: (key): string | null => storage.getItem(key),\n\t\tkeys: (): string[] => {\n\t\t\tconst keys: string[] = [];\n\t\t\tfor (let index = 0; index < storage.length; index += 1) {\n\t\t\t\tconst key = storage.key(index);\n\t\t\t\tif (key !== null) keys.push(key);\n\t\t\t}\n\t\t\treturn keys;\n\t\t},\n\t\tremoveItem: (key): void => {\n\t\t\tstorage.removeItem(key);\n\t\t},\n\t\tsetItem: (key, value): void => {\n\t\t\tstorage.setItem(key, value);\n\t\t},\n\t};\n};\n\n/**\n * 把 uni-app 同步 Storage 适配为内部后端。\n *\n * @remarks uni-app 以空字符串同时表示“键缺失”和“真实空值”,因此空字符串需要结合键清单消除歧义。\n * @param storage - 已从全局 `uni` 读取并校验的同步 API。\n * @returns 统一的内部同步后端。\n */\nconst createUniStorageBackend = (storage: UniStorageLike): StorageBackend => ({\n\tgetItem: (key): unknown => {\n\t\tconst value = storage.getStorageSync(key);\n\t\tif (value !== \"\") return value;\n\t\treturn storage.getStorageInfoSync().keys.includes(key) ? value : undefined;\n\t},\n\tkeys: (): readonly string[] => [...storage.getStorageInfoSync().keys],\n\tremoveItem: (key): void => {\n\t\tstorage.removeStorageSync(key);\n\t},\n\tsetItem: (key, value): void => {\n\t\tstorage.setStorageSync(key, value);\n\t},\n});\n\n/**\n * 解析并校验版本化 Storage 包络。\n *\n * @param rawValue - 后端返回的原始值。\n * @param key - 用于错误定位的完整物理键。\n * @returns 当前 v3 包络。\n * @throws `TypeError` 当原始值不是字符串、JSON 损坏、版本不支持或字段类型非法。\n */\nconst parseStoredEnvelope = (rawValue: unknown, key: string): StoredEnvelope => {\n\tif (typeof rawValue !== \"string\") throw new TypeError(`Storage 条目“${key}”不是字符串。`);\n\ttry {\n\t\tconst parsed = JSON.parse(rawValue) as unknown;\n\t\tif (\n\t\t\t!isRecord(parsed) ||\n\t\t\tparsed[\"version\"] !== 3 ||\n\t\t\ttypeof parsed[\"data\"] !== \"string\" ||\n\t\t\t!(parsed[\"expiresAt\"] === null || (typeof parsed[\"expiresAt\"] === \"number\" && Number.isFinite(parsed[\"expiresAt\"])))\n\t\t) {\n\t\t\tthrow new TypeError(\"不支持该存储包络。\");\n\t\t}\n\t\treturn { data: parsed[\"data\"], expiresAt: parsed[\"expiresAt\"], version: 3 };\n\t} catch (cause) {\n\t\tthrow new TypeError(`Storage 条目“${key}”已损坏或不受支持。`, { cause });\n\t}\n};\n\n/**\n * 创建绑定命名空间、Codec 与时钟的 Storage Area。\n *\n * @param backendFactory - 每次操作时解析平台后端的工厂,保证导入安全并反映平台可用性。\n * @param prefix - 已校验的全局物理键前缀。\n * @param codec - 业务值与包络文本之间的 Codec。\n * @param now - TTL 计算使用的可注入时钟。\n * @returns 完整的命名空间 Storage 操作集合。\n */\nconst createStorageArea = (backendFactory: () => StorageBackend, prefix: string, codec: StorageCodec, now: () => number): StorageArea => {\n\t/**\n\t * 拼接物理键。\n\t *\n\t * @param key - 已校验业务键。\n\t * @returns 带当前命名空间前缀的物理键。\n\t */\n\tconst toStorageKey = (key: string): string => `${prefix}${key}`;\n\t/**\n\t * 解析本次读写实际使用的 Codec。\n\t *\n\t * @param crypto - 单次 Base64 混淆开关;省略时沿用 Area 全局 Codec。\n\t * @returns 本次操作使用的全局、JSON 或 Base64 Codec。\n\t * @throws `TypeError` 当 JavaScript 调用方传入非布尔值。\n\t */\n\tconst resolveOperationCodec = (crypto: boolean | undefined): StorageCodec => {\n\t\tif (crypto === undefined) return codec;\n\t\tif (typeof crypto !== \"boolean\") throw new TypeError(\"Storage 单次 `crypto` 选项必须是布尔值。\");\n\t\treturn crypto ? base64StorageCodec : jsonCodec;\n\t};\n\t/**\n\t * 枚举当前命名空间中的业务键。\n\t *\n\t * @param backend - 本次操作使用的后端。\n\t * @returns 已移除物理前缀、去重并排序的业务键。\n\t * @throws `TypeError` 当后端返回非字符串键。\n\t */\n\tconst listBusinessKeys = (backend: StorageBackend): string[] => {\n\t\tconst keys = backend.keys();\n\t\tif (!Array.isArray(keys) || !keys.every((key) => typeof key === \"string\")) {\n\t\t\tthrow new TypeError(\"Storage 后端返回的键必须是字符串。\");\n\t\t}\n\t\treturn [...new Set(keys.filter((key) => key.startsWith(prefix)).map((key) => key.slice(prefix.length)))].sort();\n\t};\n\t/**\n\t * 读取并处理单个包络。\n\t *\n\t * @param backend - 本次操作使用的后端。\n\t * @param key - 业务键。\n\t * @returns 未过期包络;键缺失或已经过期时返回 `undefined`。\n\t * @throws `TypeError` 当键或包络非法。\n\t * @throws `RangeError` 当注入时钟返回非有限时间戳。\n\t */\n\tconst readStoredEnvelope = (backend: StorageBackend, key: string): StoredEnvelope | undefined => {\n\t\tassertKey(key);\n\t\tconst storageKey = toStorageKey(key);\n\t\tconst rawValue = backend.getItem(storageKey);\n\t\tif (rawValue === null || rawValue === undefined) return undefined;\n\t\tconst envelope = parseStoredEnvelope(rawValue, storageKey);\n\t\tif (envelope.expiresAt === null) return envelope;\n\t\tconst timestamp = now();\n\t\tif (!Number.isFinite(timestamp)) throw new RangeError(\"Storage 时钟必须返回有限时间戳。\");\n\t\tif (timestamp < envelope.expiresAt) return envelope;\n\t\t// 过期项在读取时立即删除,后续 has/keys/pruneExpired 观察到一致状态。\n\t\tbackend.removeItem(storageKey);\n\t\treturn undefined;\n\t};\n\n\treturn {\n\t\tprefix,\n\t\tclear(): void {\n\t\t\tconst backend = backendFactory();\n\t\t\tfor (const key of listBusinessKeys(backend)) backend.removeItem(toStorageKey(key));\n\t\t},\n\t\tget<Value>(key: string, options: StorageReadOptions = {}): Value | undefined {\n\t\t\tconst envelope = readStoredEnvelope(backendFactory(), key);\n\t\t\tif (envelope === undefined) return undefined;\n\t\t\ttry {\n\t\t\t\treturn resolveOperationCodec(options.crypto).decode(envelope.data) as Value;\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new TypeError(`无法解码 Storage 条目“${toStorageKey(key)}”。`, { cause });\n\t\t\t}\n\t\t},\n\t\thas: (key): boolean => readStoredEnvelope(backendFactory(), key) !== undefined,\n\t\tkeys: (): string[] => listBusinessKeys(backendFactory()),\n\t\tpruneExpired(): number {\n\t\t\tconst backend = backendFactory();\n\t\t\tlet removed = 0;\n\t\t\tfor (const key of listBusinessKeys(backend)) {\n\t\t\t\t// read 同时处理删除;先读取一次用于区分“原本缺失”和“本轮因过期删除”。\n\t\t\t\tconst before = backend.getItem(toStorageKey(key));\n\t\t\t\tif (before !== null && before !== undefined && readStoredEnvelope(backend, key) === undefined) removed += 1;\n\t\t\t}\n\t\t\treturn removed;\n\t\t},\n\t\tremove(key: string): void {\n\t\t\tassertKey(key);\n\t\t\tbackendFactory().removeItem(toStorageKey(key));\n\t\t},\n\t\tremoveByPrefix(keyPrefix: string): void {\n\t\t\tassertKey(keyPrefix);\n\t\t\tconst backend = backendFactory();\n\t\t\tfor (const key of listBusinessKeys(backend)) if (key.startsWith(keyPrefix)) backend.removeItem(toStorageKey(key));\n\t\t},\n\t\tset<Value>(key: string, value: Value, options: StorageWriteOptions = {}): void {\n\t\t\tassertKey(key);\n\t\t\tif (value === undefined) throw new TypeError(\"不能存储顶层 `undefined`,请改为移除对应的键。\");\n\t\t\tlet expiresAt: number | null = null;\n\t\t\tif (options.ttlMs !== undefined) {\n\t\t\t\tif (!Number.isFinite(options.ttlMs) || options.ttlMs <= 0) throw new RangeError(\"`ttlMs` 必须是大于 0 的有限数。\");\n\t\t\t\tconst timestamp = now();\n\t\t\t\tif (!Number.isFinite(timestamp) || !Number.isFinite(timestamp + options.ttlMs)) {\n\t\t\t\t\tthrow new RangeError(\"Storage 过期时间超出支持的时间戳范围。\");\n\t\t\t\t}\n\t\t\t\texpiresAt = timestamp + options.ttlMs;\n\t\t\t}\n\t\t\tlet data: string;\n\t\t\ttry {\n\t\t\t\tdata = resolveOperationCodec(options.crypto).encode(value);\n\t\t\t\tif (typeof data !== \"string\") throw new TypeError(\"Storage Codec 必须返回字符串。\");\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new TypeError(\"无法编码存储值。\", { cause });\n\t\t\t}\n\t\t\tbackendFactory().setItem(toStorageKey(key), JSON.stringify({ data, expiresAt, version: 3 } satisfies StoredEnvelope));\n\t\t},\n\t};\n};\n\n/**\n * 获取已激活的全局 Storage 配置。\n *\n * @returns 显式配置或首次 Storage 操作创建的默认配置。\n */\nconst requireStorageConfiguration = (): ActiveStorageConfiguration => {\n\tif (activeConfiguration === undefined) configureStorage();\n\tif (activeConfiguration === undefined) throw new Error(\"无法初始化 Storage 配置。\");\n\treturn activeConfiguration;\n};\n\n/**\n * 创建稳定的公开 Storage 门面。\n *\n * @param select - 从激活配置选择 Local 或 Session 的函数。\n * @param name - 用于不可用错误的公开门面名称。\n * @returns 可安全导入、并在首次调用时解析默认或显式配置的稳定对象。\n */\nconst createStorageAreaProxy = (select: (configuration: ActiveStorageConfiguration) => StorageArea | undefined, name: string): StorageArea => {\n\t/**\n\t * 解析当前实际 Area。\n\t *\n\t * @returns 配置中的 Local 或 Session Area。\n\t * @throws `Error` 当 uni-app 模式请求 Session。\n\t */\n\tconst getArea = (): StorageArea => {\n\t\tconst area = select(requireStorageConfiguration());\n\t\tif (area === undefined) throw new Error(`uni-app 中不支持 ${name}。`);\n\t\treturn area;\n\t};\n\treturn {\n\t\tget prefix(): string {\n\t\t\treturn getArea().prefix;\n\t\t},\n\t\tclear: (): void => {\n\t\t\tgetArea().clear();\n\t\t},\n\t\tget: <Value>(key: string, options?: StorageReadOptions): Value | undefined => getArea().get<Value>(key, options),\n\t\thas: (key): boolean => getArea().has(key),\n\t\tkeys: (): string[] => getArea().keys(),\n\t\tpruneExpired: (): number => getArea().pruneExpired(),\n\t\tremove: (key): void => {\n\t\t\tgetArea().remove(key);\n\t\t},\n\t\tremoveByPrefix: (keyPrefix): void => {\n\t\t\tgetArea().removeByPrefix(keyPrefix);\n\t\t},\n\t\tset: <Value>(key: string, value: Value, options?: StorageWriteOptions): void => {\n\t\t\tgetArea().set(key, value, options);\n\t\t},\n\t};\n};\n\n/** 浏览器 localStorage 或自动检测的 uni-app Storage 全局业务入口。 */\nexport const Local: StorageArea = createStorageAreaProxy((configuration) => configuration.local, \"Local\");\n\n/** 浏览器 sessionStorage 的全局业务入口;uni-app 不提供会话存储。 */\nexport const Session: StorageArea = createStorageAreaProxy((configuration) => configuration.session, \"Session\");\n\n/**\n * 在首次 Storage 操作前可选配置 `Local` 与 `Session`。\n *\n * @remarks 不调用时在首次操作上使用 `fast__`、JSON Codec 与 `Date.now`。首次激活后只允许以完全相同的值和引用重复调用。若检测到\n * 全局 `uni`,则自动使用其同步 Storage 且只启用 `Local`,否则使用浏览器 `localStorage` 与 `sessionStorage`。\n * `crypto: true` 仅恢复旧版 Base64 混淆行为,不能保护敏感数据。\n * @param options - 可选的全局键前缀、Codec、旧版混淆选项与时钟。\n * @throws 配置非法、重复配置冲突或目标平台 Storage 不可用时抛出错误。\n */\nexport function configureStorage(options: StorageConfiguration = {}): void {\n\tconst prefix = options.prefix ?? \"fast__\";\n\tif (typeof prefix !== \"string\" || prefix.length === 0) {\n\t\tthrow new TypeError(\"Storage 前缀必须是非空字符串。\");\n\t}\n\tif (options.codec !== undefined && options.crypto === true) {\n\t\tthrow new TypeError(\"Storage 的 Codec 和加密选项不能同时使用。\");\n\t}\n\tconst codec = options.codec ?? (options.crypto === true ? base64StorageCodec : jsonCodec);\n\tconst now = options.now ?? Date.now;\n\tif (activeConfiguration !== undefined) {\n\t\t// 相同配置允许多个入口模块幂等调用;任何引用或值变化都视为冲突。\n\t\tif (activeConfiguration.prefix === prefix && activeConfiguration.codec === codec && activeConfiguration.now === now) {\n\t\t\treturn;\n\t\t}\n\t\tthrow new Error(\"Storage 已使用其他选项完成配置。\");\n\t}\n\tconst uni = getGlobalUniStorage();\n\tconst localBackend =\n\t\tuni === undefined ? (): StorageBackend => createWebStorageBackend(\"local\") : (): StorageBackend => createUniStorageBackend(uni);\n\tconst local = createStorageArea(localBackend, prefix, codec, now);\n\tconst configuration: ActiveStorageConfiguration = { codec, local, now, prefix };\n\tif (uni === undefined) {\n\t\tconfiguration.session = createStorageArea(() => createWebStorageBackend(\"session\"), prefix, codec, now);\n\t}\n\tactiveConfiguration = configuration;\n}\n\n/** 返回全局 Storage 是否已经由应用入口配置。 */\nexport function isStorageConfigured(): boolean {\n\treturn activeConfiguration !== undefined;\n}\n","const defaultRandomAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst defaultStringLocale = \"en-US\";\nconst maximumRandomStringLength = 1_000_000;\nconst maximumRandomValuesPerBatch = 16_384;\nconst uint32Range = 0x1_0000_0000;\nconst uuidV4Pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;\n\n/** 查询字符串解析结果;重复键保留为数组,不存在的键读取为 `undefined`。 */\nexport type ParsedQueryParameters = Record<string, string | string[] | undefined>;\n\n/** 大小写与字素分割可接受的显式语言;省略时固定使用 `en-US` 以保持输出稳定。 */\nexport type StringLocale = string | readonly string[] | undefined;\n\n/** 使用 Web Crypto 填充随机值,能力缺失时回退到 `Math.random()`。 */\nconst fillRandomValues = (values: Uint8Array<ArrayBuffer> | Uint32Array<ArrayBuffer>): void => {\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.getRandomValues === \"function\") {\n\t\tcrypto.getRandomValues(values);\n\t\treturn;\n\t}\n\tconst range = values.BYTES_PER_ELEMENT === Uint8Array.BYTES_PER_ELEMENT ? 0x100 : uint32Range;\n\tfor (let index = 0; index < values.length; index += 1) values[index] = Math.floor(Math.random() * range);\n};\n\n/**\n * 从随机字节创建 UUID v4。\n *\n * @param bytes - 长度至少为 16 的随机字节;Version 与 Variant 位会被原地修改。\n * @returns 小写、带连字符的 RFC 4122 UUID v4。\n */\nconst createUuidV4FromBytes = (bytes: Uint8Array): string => {\n\tbytes[6] = ((bytes[6] ?? 0) & 15) | 64;\n\tbytes[8] = ((bytes[8] ?? 0) & 63) | 128;\n\tconst hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\treturn `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n};\n\n/**\n * 按用户可见字素切分文本。\n *\n * @param value - 待切分字符串。\n * @param locale - Segmenter 使用的显式语言;省略时使用固定默认值。\n * @returns 保留组合 Emoji、变音符号和连接序列的字素数组。\n * @throws `Error` 当平台缺少 `Intl.Segmenter`。\n */\nconst splitGraphemes = (value: string, locale: StringLocale): string[] => {\n\tconst Segmenter = globalThis.Intl?.Segmenter;\n\tif (typeof Segmenter !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持 Intl.Segmenter。\");\n\t}\n\tconst segmenter = new Segmenter(locale ?? defaultStringLocale, { granularity: \"grapheme\" });\n\treturn Array.from(segmenter.segment(value), ({ segment }) => segment);\n};\n\n/**\n * 重复执行 URI 组件解码,直到值稳定或达到深度上限。\n *\n * @param value - 不包含 URI 路径语义的编码组件。\n * @param maxDepth - 最大解码次数,默认 `10`。\n * @returns 解码稳定或达到上限后的组件文本。\n * @throws `URIError` 当任一层包含非法百分号序列;深度非法时抛出 `RangeError`。\n */\nexport function decodeURIComponentRepeatedly(value: string, maxDepth = 10): string {\n\tif (!Number.isSafeInteger(maxDepth) || maxDepth < 0) throw new RangeError(\"`maxDepth` 必须是非负安全整数。\");\n\tlet decoded = value;\n\tfor (let index = 0; index < maxDepth; index += 1) {\n\t\tconst next = decodeURIComponent(decoded);\n\t\tif (next === decoded) break;\n\t\tdecoded = next;\n\t}\n\treturn decoded;\n}\n\n/**\n * 解析带 `://` 的绝对 URL、`?query` 或纯查询字符串。\n *\n * @remarks 纯查询字符串值中的未编码 `?` 会作为值内容保留;片段标识及其后内容被忽略。\n * @param input - 完整 URL、带前导问号或不带前导问号的查询文本。\n * @returns 重复键对应字符串数组,空值保留为空字符串。\n */\nexport function parseQueryString(input: string): ParsedQueryParameters {\n\tconst fragmentStart = input.indexOf(\"#\");\n\tconst withoutFragment = fragmentStart < 0 ? input : input.slice(0, fragmentStart);\n\tconst isAbsoluteUrl = /^[a-z][a-z\\d+.-]*:\\/\\//iu.test(withoutFragment);\n\tconst queryStart = withoutFragment.indexOf(\"?\");\n\tif (isAbsoluteUrl && queryStart < 0) return {};\n\tconst query = isAbsoluteUrl ? withoutFragment.slice(queryStart + 1) : withoutFragment.replace(/^\\?/u, \"\");\n\tconst result: ParsedQueryParameters = {};\n\tfor (const [key, value] of new URLSearchParams(query)) {\n\t\tconst existing = Object.hasOwn(result, key) ? result[key] : undefined;\n\t\tif (existing === undefined) {\n\t\t\t// defineProperty 让 `__proto__` 成为普通自有键,不触发 Object.prototype Setter。\n\t\t\tObject.defineProperty(result, key, { configurable: true, enumerable: true, value, writable: true });\n\t\t} else if (Array.isArray(existing)) existing.push(value);\n\t\telse Object.defineProperty(result, key, { configurable: true, enumerable: true, value: [existing, value], writable: true });\n\t}\n\treturn result;\n}\n\n/**\n * 判断文本是否为任意合法 JSON 值,包括标量与 `null`。\n *\n * @param value - 待解析文本;纯空白不视为 JSON。\n * @returns `JSON.parse` 能完整解析时返回 `true`。\n */\nexport function isValidJson(value: string): boolean {\n\tif (value.trim().length === 0) return false;\n\ttry {\n\t\tJSON.parse(value);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 按大小写边界、连字符、下划线与空白切分单词。\n *\n * @example `XMLHttp_request` 返回 `[\"XML\", \"Http\", \"request\"]`。\n * @param value - 待拆分文本。\n * @returns 删除空项、保持输入顺序的单词数组。\n */\nexport function splitWords(value: string): string[] {\n\treturn value\n\t\t.trim()\n\t\t.replace(/(\\p{Ll}|\\p{N})(\\p{Lu})/gu, \"$1 $2\")\n\t\t.replace(/(\\p{Lu})(\\p{Lu}\\p{Ll})/gu, \"$1 $2\")\n\t\t.split(/[\\s_-]+/u)\n\t\t.filter((part) => part.length > 0);\n}\n\n/**\n * 将首个 Unicode 码点转为大写。\n *\n * @param value - 输入文本;空字符串保持为空。\n * @param locale - 显式语言,默认固定为 `en-US`。\n * @returns 首个 Unicode 码点转换后的文本。\n */\nexport function upperFirst(value: string, locale?: StringLocale): string {\n\tconst characters = Array.from(value);\n\tconst first = characters.shift();\n\treturn first === undefined ? \"\" : first.toLocaleUpperCase(locale ?? defaultStringLocale) + characters.join(\"\");\n}\n\n/**\n * 将首个 Unicode 码点转为小写。\n *\n * @param value - 输入文本;空字符串保持为空。\n * @param locale - 显式语言,默认固定为 `en-US`。\n * @returns 首个 Unicode 码点转换后的文本。\n */\nexport function lowerFirst(value: string, locale?: StringLocale): string {\n\tconst characters = Array.from(value);\n\tconst first = characters.shift();\n\treturn first === undefined ? \"\" : first.toLocaleLowerCase(locale ?? defaultStringLocale) + characters.join(\"\");\n}\n\n/**\n * 将文本转换为 camelCase。\n *\n * @param value - 由大小写、连字符、下划线或空白分隔的文本。\n * @param locale - 大小写转换使用的语言,默认固定为 `en-US`。\n * @returns camelCase 文本。\n */\nexport function camelCase(value: string, locale?: StringLocale): string {\n\treturn splitWords(value)\n\t\t.map((part, index) => {\n\t\t\tconst normalized = part.toLocaleLowerCase(locale ?? defaultStringLocale);\n\t\t\treturn index === 0 ? normalized : upperFirst(normalized, locale);\n\t\t})\n\t\t.join(\"\");\n}\n\n/**\n * 将文本转换为 PascalCase。\n *\n * @param value - 参数语义与 {@link camelCase} 一致。\n * @param locale - 大小写转换使用的显式语言。\n * @returns PascalCase 文本。\n */\nexport function pascalCase(value: string, locale?: StringLocale): string {\n\treturn upperFirst(camelCase(value, locale), locale);\n}\n\n/**\n * 将文本转换为 kebab-case。\n *\n * @param value - 参数语义与 {@link camelCase} 一致。\n * @param locale - 大小写转换使用的显式语言。\n * @returns kebab-case 文本。\n */\nexport function kebabCase(value: string, locale?: StringLocale): string {\n\treturn splitWords(value)\n\t\t.map((part) => part.toLocaleLowerCase(locale ?? defaultStringLocale))\n\t\t.join(\"-\");\n}\n\n/**\n * 按 Unicode 字素簇截断文本,避免拆开 emoji、组合音标或代理对。\n *\n * @param value - 输入文本。\n * @param maxLength - 保留的最大字素簇数量。\n * @param suffix - 被截断时追加的文本,默认单字符省略号 `…`;不计入上限。\n * @param locale - 字素分割语言,默认固定为 `en-US`。\n * @returns 未超限时返回原字符串,否则返回截断内容与后缀。\n * @throws `RangeError` 当 `maxLength` 不是非负安全整数或 Locale 无效;缺少\n * `Intl.Segmenter` 时抛出 `Error`。\n */\nexport function truncateGraphemes(value: string, maxLength: number, suffix = \"…\", locale?: StringLocale): string {\n\tif (!Number.isSafeInteger(maxLength) || maxLength < 0) throw new RangeError(\"`maxLength` 必须是非负安全整数。\");\n\tconst segments = splitGraphemes(value, locale);\n\treturn segments.length > maxLength ? segments.slice(0, maxLength).join(\"\") + suffix : value;\n}\n\n/**\n * 把文本复制到系统剪贴板。\n *\n * @remarks uni-app 使用 `setClipboardData`;浏览器优先使用 Clipboard API,并在该 API 不可用时\n * 回退到 `document.execCommand(\"copy\")`。平台拒绝访问剪贴板时不会静默忽略错误。\n * @param value - 要复制的文本。\n * @returns 复制完成后兑现的 Promise。\n * @throws `Error` 当运行时没有可用的剪贴板能力或复制失败。\n */\nexport async function copy(value: string): Promise<void> {\n\tconst uni: unknown = Reflect.get(globalThis, \"uni\");\n\tif (uni !== undefined) {\n\t\tif ((typeof uni !== \"object\" && typeof uni !== \"function\") || uni === null) {\n\t\t\tthrow new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\t}\n\t\tconst setClipboardData: unknown = Reflect.get(uni, \"setClipboardData\");\n\t\tif (typeof setClipboardData !== \"function\") throw new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tReflect.apply(setClipboardData, uni, [\n\t\t\t\t{\n\t\t\t\t\tdata: value,\n\t\t\t\t\tfail: (error: unknown): void => {\n\t\t\t\t\t\treject(error instanceof Error ? error : new Error(\"文本复制到剪贴板失败。\", { cause: error }));\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: resolve,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t\treturn;\n\t}\n\n\tconst clipboard = globalThis.navigator?.clipboard;\n\tif (globalThis.isSecureContext === true && typeof clipboard?.writeText === \"function\") {\n\t\tawait clipboard.writeText(value);\n\t\treturn;\n\t}\n\n\tconst document = globalThis.document;\n\tif (typeof document?.createElement !== \"function\" || document.body === null || typeof document.execCommand !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持访问剪贴板。\");\n\t}\n\tconst textarea = document.createElement(\"textarea\");\n\ttextarea.value = value;\n\ttextarea.style.left = \"-999999px\";\n\ttextarea.style.opacity = \"0\";\n\ttextarea.style.position = \"fixed\";\n\ttextarea.style.top = \"-999999px\";\n\tdocument.body.appendChild(textarea);\n\tlet copied: boolean;\n\ttry {\n\t\ttextarea.focus();\n\t\ttextarea.select();\n\t\tcopied = document.execCommand(\"copy\");\n\t} finally {\n\t\ttextarea.remove();\n\t}\n\tif (!copied) throw new Error(\"文本复制到剪贴板失败。\");\n}\n\n/**\n * 生成随机字符串。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param length - 字符数量,必须是 0 至 1,000,000 的安全整数。\n * @param alphabet - 不得为空、包含重复字符或超过 2^32 个 Unicode 码点。\n * @returns 由 `alphabet` 中 Unicode 码点组成的随机文本。\n * @throws `RangeError` 当长度或字母表非法。\n */\nexport function randomString(length: number, alphabet: string = defaultRandomAlphabet): string {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > maximumRandomStringLength) {\n\t\tthrow new RangeError(`\\`length\\` 必须是 0 到 ${maximumRandomStringLength} 之间的安全整数。`);\n\t}\n\tconst characters = Array.from(alphabet);\n\tif (characters.length === 0) throw new RangeError(\"`alphabet` 不能为空。\");\n\tif (new Set(characters).size !== characters.length) throw new RangeError(\"`alphabet` 不能包含重复字符。\");\n\tif (characters.length > 0x1_0000_0000) throw new RangeError(\"`alphabet` 不能包含超过 2^32 个字符。\");\n\tif (length === 0) return \"\";\n\n\t// 丢弃不能平均映射到字母表的尾部区间,避免 `%` 造成前部字符概率偏高。\n\tconst acceptanceLimit = Math.floor(uint32Range / characters.length) * characters.length;\n\tconst result: string[] = [];\n\twhile (result.length < length) {\n\t\tconst remaining = length - result.length;\n\t\t// 分批填充可控制临时内存,并避开 Web Crypto 单次随机数组大小限制。\n\t\tconst samples = new Uint32Array(Math.min(remaining, maximumRandomValuesPerBatch));\n\t\tfillRandomValues(samples);\n\t\tfor (const sample of samples) {\n\t\t\tif (sample >= acceptanceLimit) continue;\n\t\t\tconst character = characters[sample % characters.length];\n\t\t\tif (character === undefined) continue;\n\t\t\tresult.push(character);\n\t\t\tif (result.length === length) break;\n\t\t}\n\t}\n\treturn result.join(\"\");\n}\n\n/**\n * 生成 RFC 4122 version 4 UUID。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * 该 UUID 适合普通唯一标识,不应作为安全令牌或秘密。\n * @returns 小写、带连字符的 UUID v4。\n */\nexport function generateUuidV4(): string {\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.randomUUID === \"function\") return crypto.randomUUID();\n\tconst bytes = new Uint8Array(16);\n\tfillRandomValues(bytes);\n\treturn createUuidV4FromBytes(bytes);\n}\n\n/**\n * 判断字符串是否为 RFC 4122 version 4 UUID。\n *\n * @param value - 待验证文本;十六进制字母大小写均可。\n * @returns 版本位与 Variant 位均正确时返回 `true`。\n */\nexport function isUuidV4(value: string): boolean {\n\treturn uuidV4Pattern.test(value);\n}\n\n/**\n * 转义 HTML 文本上下文中的五个特殊字符。\n *\n * @remarks 这不是 HTML 清洗器,不能让不可信文本安全进入 URL、CSS、脚本或属性名上下文。\n * @param value - 将作为 HTML 文本节点内容的字符串。\n * @returns 转义 `&`、`<`、`>`、双引号与单引号后的文本。\n */\nexport function escapeHtml(value: string): string {\n\treturn value.replace(/[&<>\"']/gu, (character) => {\n\t\tswitch (character) {\n\t\t\tcase \"&\":\n\t\t\t\treturn \"&amp;\";\n\t\t\tcase \"<\":\n\t\t\t\treturn \"&lt;\";\n\t\t\tcase \">\":\n\t\t\t\treturn \"&gt;\";\n\t\t\tcase '\"':\n\t\t\t\treturn \"&quot;\";\n\t\t\tdefault:\n\t\t\t\treturn \"&#39;\";\n\t\t}\n\t});\n}\n\n/**\n * 把连续 Unicode 空白折叠为单个空格并删除两端空白。\n *\n * @param value - 输入文本。\n * @returns 规范化后的文本;全空白输入返回空字符串。\n */\nexport function normalizeWhitespace(value: string): string {\n\treturn value.trim().replace(/\\s+/gu, \" \");\n}\n","import { Local } from \"../storage/index\";\nimport { generateUuidV4, isUuidV4 } from \"../string/index\";\n\nconst defaultInstallationIdentityStorageKey = \"identity:installation-id\";\n\n/** {@link configureInstallationIdentity} 接收的安装标识配置。 */\nexport interface InstallationIdentityConfiguration {\n\t/**\n\t * `Local` 中使用的业务键,默认 `identity:installation-id`。\n\t *\n\t * @remarks 必须是无外围空白的非空字符串,并在首次访问 Identity API 前配置;物理键仍会叠加 Storage 全局前缀。\n\t */\n\tcacheKey?: string;\n}\n\n/** 浏览器或 uni-app 当前安装实例标识。 */\nexport interface InstallationIdentity {\n\t/**\n\t * `Local` 中使用的业务键。\n\t *\n\t * @remarks 首次读取会锁定默认配置;之后不能再切换为其他业务键。\n\t */\n\treadonly cacheKey: string;\n\t/**\n\t * 当前内存中的安装标识;尚未取得标识或调用 {@link InstallationIdentity.clear clear} 后为空字符串。\n\t *\n\t * @remarks 直接赋值只改变内存,不会校验或持久化;通常应调用 {@link InstallationIdentity.getOrCreate getOrCreate}。\n\t */\n\tdeviceId: string;\n\t/**\n\t * 删除当前 `cacheKey` 对应的持久化标识,并把 `deviceId` 重置为空字符串。\n\t *\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tclear: () => void;\n\t/**\n\t * 按“显式参数、当前内存、持久化值、随机生成值”的优先级取得安装标识。\n\t *\n\t * @param installationId - 可选 UUID v4;传入时覆盖内存值和当前持久化值。\n\t * @returns 已校验并同时写入 `deviceId` 与 `Local` 的 UUID v4。\n\t * @throws `TypeError` 当显式参数、内存值或持久化值不是 UUID v4。\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tgetOrCreate: (installationId?: string) => string;\n\t/**\n\t * 读取并校验当前 `cacheKey` 对应的持久化标识。\n\t *\n\t * @remarks 该方法不修改 `deviceId`,只负责读取;过期记录由 Storage 视为缺失。\n\t * @returns 已持久化的 UUID v4;键缺失或过期时返回 `undefined`。\n\t * @throws `TypeError` 当持久化值不是字符串或不是 UUID v4。\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tread: () => string | undefined;\n}\n\n/**\n * 校验安装标识格式。\n *\n * @param value - 外部传入或从 Storage 读取的候选值。\n * @throws `TypeError` 当值不是 RFC 4122 UUID v4。\n */\nconst assertInstallationId = (value: string): void => {\n\tif (!isUuidV4(value)) throw new TypeError(\"安装标识值必须是符合 RFC 4122 的 UUID v4。\");\n};\n\nlet activeStorageKey: string | undefined;\n\n/**\n * 取得已经锁定的安装标识业务键。\n *\n * @remarks 首次读取会锁定默认值,防止标识已经写入后再切换键而产生两个安装标识。\n * @returns 应用于后续全部 Identity 操作的业务键。\n */\nconst getInstallationIdentityStorageKey = (): string => {\n\tactiveStorageKey ??= defaultInstallationIdentityStorageKey;\n\treturn activeStorageKey;\n};\n\n/**\n * 在应用入口配置安装标识使用的 Storage 业务键。\n *\n * @remarks 必须在首次读取 `installationIdentity.cacheKey` 或调用其他安装标识 API 前执行。相同配置\n * 可以幂等重复调用;切换到不同键会抛错,避免同一页面产生分裂状态。\n * @param options - 安装标识配置;省略 `cacheKey` 时使用 `identity:installation-id`。\n * @throws `TypeError` 当 `cacheKey` 不是非空字符串或包含外围空白。\n * @throws `Error` 当安装标识已经使用另一个业务键初始化。\n */\nexport function configureInstallationIdentity(options: InstallationIdentityConfiguration = {}): void {\n\tconst cacheKey = options.cacheKey ?? defaultInstallationIdentityStorageKey;\n\tif (typeof cacheKey !== \"string\" || cacheKey.length === 0 || cacheKey.trim() !== cacheKey) {\n\t\tthrow new TypeError(\"安装标识的 `cacheKey` 必须是无外围空白的非空字符串。\");\n\t}\n\tif (activeStorageKey === undefined) {\n\t\tactiveStorageKey = cacheKey;\n\t\treturn;\n\t}\n\tif (activeStorageKey !== cacheKey) throw new Error(\"安装标识已使用其他 `cacheKey` 完成配置。\");\n}\n\n/**\n * 全局安装标识状态。\n *\n * @remarks Storage 未显式配置时会使用其默认值。生成 UUID 时优先使用 Web Crypto,能力缺失时\n * 回退到 `Math.random()`。该值不是硬件标识、认证凭证或安全边界。\n */\nexport const installationIdentity: InstallationIdentity = {\n\tget cacheKey(): string {\n\t\treturn getInstallationIdentityStorageKey();\n\t},\n\tdeviceId: \"\",\n\tclear(): void {\n\t\tLocal.remove(installationIdentity.cacheKey);\n\t\tinstallationIdentity.deviceId = \"\";\n\t},\n\tgetOrCreate(installationId?: string): string {\n\t\tconst candidate =\n\t\t\tinstallationId ??\n\t\t\t(installationIdentity.deviceId.length > 0 ? installationIdentity.deviceId : installationIdentity.read()) ??\n\t\t\tgenerateUuidV4();\n\t\tassertInstallationId(candidate);\n\t\tLocal.set(installationIdentity.cacheKey, candidate);\n\t\tinstallationIdentity.deviceId = candidate;\n\t\treturn candidate;\n\t},\n\tread(): string | undefined {\n\t\tconst stored = Local.get(installationIdentity.cacheKey);\n\t\tif (stored === undefined) return undefined;\n\t\tif (typeof stored !== \"string\") throw new TypeError(\"存储的安装标识已损坏。\");\n\t\tassertInstallationId(stored);\n\t\treturn stored;\n\t},\n};\n\n/**\n * 返回已有安装标识,否则创建并持久化一个 UUID v4。\n *\n * @param installationId - 可选的显式安装标识;传入时会校验并覆盖当前持久化值。\n * @returns 显式值、内存值、持久化值或新生成值中的最终安装标识。\n * @throws `TypeError` 当显式值或持久化值不是 UUID v4。\n * @throws `Error` 当当前平台存储不可用。\n */\nexport function getOrCreateInstallationId(installationId?: string): string {\n\treturn installationIdentity.getOrCreate(installationId);\n}\n","/** 日志严重级别,按从低到高排列。 */\nexport type LogLevel = \"debug\" | \"log\" | \"warn\" | \"error\";\n\n/** 日志输出目标需要实现的最小控制台接口。 */\nexport interface LoggerSink {\n\t/**\n\t * 接收通过级别过滤后的调试参数。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\tdebug: (...data: unknown[]) => void;\n\t/**\n\t * 接收通过级别过滤后的普通日志参数;对应 Logger 的 `log` 级别。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\tlog: (...data: unknown[]) => void;\n\t/**\n\t * 接收通过级别过滤后的警告参数。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\twarn: (...data: unknown[]) => void;\n\t/**\n\t * 接收通过级别过滤后的错误参数。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\terror: (...data: unknown[]) => void;\n}\n\n/** {@link createLogger} 的不可变配置。 */\nexport interface LoggerOptions {\n\t/** 最低输出级别,默认 `debug`;低于该优先级的消息不会传给 Sink。 */\n\tlevel?: LogLevel;\n\t/** 日志品牌前缀,默认 `Fast`;必须是无外围空白的非空字符串。 */\n\tprefix?: string;\n\t/** 可注入输出目标,默认当前运行时的 `console`;Logger 不会修改该对象。 */\n\tsink?: LoggerSink;\n\t/** uni-app App-Plus/HBuilderX 中把附加参数逐条转成单行文本输出,默认 `false`;其他平台忽略。 */\n\tuniAppPlusSplit?: boolean;\n}\n\n/** 配置隔离的轻量日志器。 */\nexport interface Logger {\n\t/**\n\t * 输出指定作用域的调试信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\tdebug: (scope: string, ...content: unknown[]) => void;\n\t/**\n\t * 输出指定作用域的普通信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\tlog: (scope: string, ...content: unknown[]) => void;\n\t/**\n\t * 输出指定作用域的警告信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\twarn: (scope: string, ...content: unknown[]) => void;\n\t/**\n\t * 输出指定作用域的错误信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\terror: (scope: string, ...content: unknown[]) => void;\n}\n\nconst levelPriority: Readonly<Record<LogLevel, number>> = {\n\tdebug: 10,\n\tlog: 20,\n\twarn: 30,\n\terror: 40,\n};\n\n/**\n * 判断未知值是否为受支持日志级别。\n *\n * @param value - 待检查配置值。\n * @returns 值是 `debug`、`log`、`warn` 或 `error` 时返回 `true`。\n */\nconst isLogLevel = (value: unknown): value is LogLevel => typeof value === \"string\" && Object.hasOwn(levelPriority, value);\n\n/**\n * 检测 uni-app App-Plus 日志环境。\n *\n * @returns 全局 `uni` 与 `plus` 同时存在时返回 `true`。\n */\nconst isUniAppPlus = (): boolean => {\n\treturn Reflect.get(globalThis, \"uni\") !== undefined && Reflect.get(globalThis, \"plus\") !== undefined;\n};\n\n/**\n * 把日志附加值转换为适合 HBuilderX 单行输出的文本。\n *\n * @remarks 循环引用会替换为 `[Circular]`,BigInt 保留 `n` 后缀,Error 优先输出堆栈。\n * @param value - 任意日志附加值。\n * @returns 不会因 JSON 序列化失败而中断日志调用的文本。\n */\nconst formatSplitValue = (value: unknown): string => {\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"bigint\") return `${value.toString()}n`;\n\tif (value instanceof Error) return value.stack ?? `${value.name}: ${value.message}`;\n\tconst visited = new WeakSet();\n\ttry {\n\t\tconst serialized: unknown = JSON.stringify(\n\t\t\tvalue,\n\t\t\t(_key, item: unknown): unknown => {\n\t\t\t\tif (typeof item === \"bigint\") return `${item.toString()}n`;\n\t\t\t\tif (typeof item !== \"object\" || item === null) return item;\n\t\t\t\tif (visited.has(item)) return \"[Circular]\";\n\t\t\t\tvisited.add(item);\n\t\t\t\treturn item;\n\t\t\t},\n\t\t\t2\n\t\t);\n\t\treturn typeof serialized === \"string\" ? serialized : String(value);\n\t} catch {\n\t\treturn String(value);\n\t}\n};\n\nconst defaultConsoleSink: LoggerSink = {\n\tdebug: (...data): void => {\n\t\tif (typeof console.debug === \"function\") console.debug(...data);\n\t\telse console.log(...data);\n\t},\n\tlog: (...data): void => {\n\t\tconsole.log(...data);\n\t},\n\twarn: (...data): void => {\n\t\tconsole.warn(...data);\n\t},\n\terror: (...data): void => {\n\t\tconsole.error(...data);\n\t},\n};\n\n/**\n * 创建独立日志器。\n *\n * @remarks 本库其他模块不会自动记录、吞掉或转换异常。日志内容可能进入持久化平台,\n * 调用方不得传入密码、令牌、密钥或完整个人数据。\n * @param options - 级别、前缀、输出目标和 uni-app App-Plus 拆分选项。\n * @returns 不会修改全局控制台或其他日志器配置的新实例。\n * @throws `RangeError` 当级别未知,或前缀、作用域不是有效的非空字符串。\n */\nexport function createLogger(options: LoggerOptions = {}): Logger {\n\tconst requestedLevel: unknown = options.level ?? \"debug\";\n\tconst requestedPrefix: unknown = options.prefix ?? \"Fast\";\n\tconst sink = options.sink ?? defaultConsoleSink;\n\tif (!isLogLevel(requestedLevel)) throw new RangeError(`未知的日志级别:${String(requestedLevel)}。`);\n\tif (typeof requestedPrefix !== \"string\" || requestedPrefix.length === 0) {\n\t\tthrow new RangeError(\"日志前缀必须是非空字符串。\");\n\t}\n\tconst level = requestedLevel;\n\tconst prefix = requestedPrefix;\n\tconst uniAppPlusSplit = options.uniAppPlusSplit ?? false;\n\n\t/**\n\t * 应用级别过滤、标题格式和平台输出策略。\n\t *\n\t * @param messageLevel - 本条消息的严重级别。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与保持原始类型的附加值。\n\t * @throws `RangeError` 当作用域不是非空字符串或包含外围空白。\n\t */\n\tconst write = (messageLevel: LogLevel, scope: string, content: readonly unknown[]): void => {\n\t\tif (typeof scope !== \"string\") throw new TypeError(\"日志作用域必须是字符串。\");\n\t\tif (scope.length === 0 || scope.trim() !== scope) {\n\t\t\tthrow new RangeError(\"日志作用域必须是无外围空白的非空字符串。\");\n\t\t}\n\t\tif (levelPriority[messageLevel] < levelPriority[level]) return;\n\t\tconst heading = `[${prefix}:${scope}]`;\n\t\tconst sinkMethod: keyof LoggerSink = messageLevel;\n\t\tif (uniAppPlusSplit && isUniAppPlus()) {\n\t\t\tconst [first, ...remaining] = content;\n\t\t\tif (typeof first === \"string\") {\n\t\t\t\tsink[sinkMethod](`${heading} ${first}`);\n\t\t\t\tfor (const item of remaining) sink[sinkMethod](formatSplitValue(item));\n\t\t\t} else {\n\t\t\t\tsink[sinkMethod](heading);\n\t\t\t\tfor (const item of content) sink[sinkMethod](formatSplitValue(item));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsink[sinkMethod](heading, ...content);\n\t};\n\n\treturn {\n\t\tdebug: (scope, ...content): void => {\n\t\t\twrite(\"debug\", scope, content);\n\t\t},\n\t\tlog: (scope, ...content): void => {\n\t\t\twrite(\"log\", scope, content);\n\t\t},\n\t\twarn: (scope, ...content): void => {\n\t\t\twrite(\"warn\", scope, content);\n\t\t},\n\t\terror: (scope, ...content): void => {\n\t\t\twrite(\"error\", scope, content);\n\t\t},\n\t};\n}\n\nlet activeDefaultLogger: Logger = createLogger();\n\n/**\n * 替换默认 {@link logger} 的完整配置。\n *\n * @remarks 已创建的独立 Logger 不受影响;默认 Logger 对象引用保持稳定,并立即转发到新配置。\n * 省略选项会恢复 `createLogger()` 的全部默认值。\n * @param options - 默认 Logger 使用的级别、前缀、输出目标和 uni-app App-Plus 拆分选项。\n */\nexport function configureLogger(options: LoggerOptions = {}): void {\n\tactiveDefaultLogger = createLogger(options);\n}\n\n/** 默认使用 `Fast` 前缀和 `debug` 级别、可通过 {@link configureLogger} 配置的便捷日志器。 */\nexport const logger: Logger = {\n\tdebug: (scope, ...content): void => {\n\t\tactiveDefaultLogger.debug(scope, ...content);\n\t},\n\tlog: (scope, ...content): void => {\n\t\tactiveDefaultLogger.log(scope, ...content);\n\t},\n\twarn: (scope, ...content): void => {\n\t\tactiveDefaultLogger.warn(scope, ...content);\n\t},\n\terror: (scope, ...content): void => {\n\t\tactiveDefaultLogger.error(scope, ...content);\n\t},\n};\n","/** URL 查询参数支持的单值类型。 */\nexport type QueryPrimitive = bigint | boolean | number | string | null | undefined;\n\n/** URL 查询参数值;数组使用重复键表示。 */\nexport type QueryValue = QueryPrimitive | readonly QueryPrimitive[];\n\n/**\n * 判断 Query Value 是否为重复参数数组。\n *\n * @param value - 单值或数组形式的 Query Value。\n * @returns 是只读原始值数组时返回 `true`。\n */\nconst isQueryPrimitiveArray = (value: QueryValue): value is readonly QueryPrimitive[] => Array.isArray(value);\n\n/** {@link toQueryString} 的序列化选项。 */\nexport interface QueryStringOptions {\n\t/** 返回非空结果时是否添加 `?`;默认 `false`。 */\n\tprefixQuestionMark?: boolean;\n\t/** 是否按键的 UTF-16 码元顺序稳定排序;默认保留对象枚举顺序。 */\n\tsort?: boolean;\n\t/** 空格编码方式;默认遵循表单编码并输出 `+`。 */\n\tspace?: \"percent\" | \"plus\";\n}\n\n/**\n * 安全写入结果对象的自有可枚举属性。\n *\n * @remarks 使用 `defineProperty` 避免 `__proto__` 触发 Setter,并显式拒绝三个原型污染键。\n * @param target - 要写入的结果对象。\n * @param key - 自有属性键。\n * @param value - 属性值。\n * @throws `TypeError` 当键为 `__proto__`、`prototype` 或 `constructor`。\n */\nconst defineEnumerableProperty = (target: object, key: PropertyKey, value: unknown): void => {\n\tObject.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true });\n};\n\n/**\n * 判断值是否是普通对象。\n *\n * @param value - 任意待检查值。\n * @returns 原型为 `Object.prototype` 或 `null` 时返回 `true`。\n */\nexport function isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst prototype = Object.getPrototypeOf(value) as object | null;\n\treturn prototype === null || prototype === Object.prototype;\n}\n\n/**\n * 安全判断对象是否拥有自己的属性。\n *\n * @remarks 不调用可能被对象覆盖的 `hasOwnProperty`。\n * @param value - 待检查对象。\n * @param key - 字符串、数字或 Symbol 属性键。\n * @returns 属性为对象自有属性时返回 `true`,并收窄键类型。\n */\nexport function hasOwn<ObjectType extends object, Key extends PropertyKey>(value: ObjectType, key: Key): key is Key & keyof ObjectType {\n\treturn Object.hasOwn(value, key);\n}\n\n/**\n * 从对象中选择指定自有可枚举属性。\n *\n * @param source - 不会被修改的源对象。\n * @param keys - 需要保留的键;不存在的键被忽略。\n * @returns 新对象,保持 `keys` 的遍历顺序。\n */\nexport function pick<Source extends object, Keys extends readonly (keyof Source)[]>(source: Source, keys: Keys): Pick<Source, Keys[number]> {\n\tconst result = {} as Pick<Source, Keys[number]>;\n\tfor (const key of keys) {\n\t\tif (Object.prototype.propertyIsEnumerable.call(source, key)) defineEnumerableProperty(result, key, source[key]);\n\t}\n\treturn result;\n}\n\n/**\n * 浅复制对象并删除指定属性。\n *\n * @param source - 不会被修改的源对象。\n * @param keys - 需要排除的键。\n * @returns 包含其余自有可枚举字符串与 Symbol 属性的新对象。\n */\nexport function omit<Source extends object, Keys extends readonly (keyof Source)[]>(source: Source, keys: Keys): Omit<Source, Keys[number]> {\n\tconst result = { ...source };\n\tfor (const key of keys) Reflect.deleteProperty(result, key);\n\treturn result;\n}\n\n/**\n * 映射对象的自有可枚举属性值。\n *\n * @param source - 不会被修改的源对象。\n * @param mapper - 接收值、键和源对象的映射函数。\n * @returns 保留原键的新对象。\n */\nexport function mapValues<Source extends object, Result>(\n\tsource: Source,\n\tmapper: (value: Source[keyof Source], key: keyof Source, source: Source) => Result\n): { [Key in keyof Source]: Result } {\n\tconst result = {} as { [Key in keyof Source]: Result };\n\tfor (const key of Reflect.ownKeys(source) as (keyof Source)[]) {\n\t\tif (Object.prototype.propertyIsEnumerable.call(source, key)) defineEnumerableProperty(result, key, mapper(source[key], key, source));\n\t}\n\treturn result;\n}\n\n/**\n * 对自有可枚举属性执行 SameValue 浅比较。\n *\n * @remarks 嵌套对象只比较引用;`NaN` 相等,`0` 与 `-0` 不相等。\n * @param left - 第一对象。\n * @param right - 第二对象。\n * @returns 自有可枚举键集合与对应值均满足 SameValue 时返回 `true`。\n */\nexport function shallowEqual(left: object, right: object): boolean {\n\tif (Object.is(left, right)) return true;\n\tconst leftKeys = Reflect.ownKeys(left).filter((key) => Object.prototype.propertyIsEnumerable.call(left, key));\n\tconst rightKeys = Reflect.ownKeys(right).filter((key) => Object.prototype.propertyIsEnumerable.call(right, key));\n\tif (leftKeys.length !== rightKeys.length) return false;\n\treturn leftKeys.every((key) => Object.hasOwn(right, key) && Object.is(Reflect.get(left, key), Reflect.get(right, key)));\n}\n\n/**\n * 把 Query 原始值规范化为文本。\n *\n * @param value - 已排除空值的字符串、数字、布尔值或 BigInt。\n * @returns 与 URLSearchParams 兼容的文本值。\n * @throws `RangeError` 当数字不是有限值。\n */\nconst serializeQueryValue = (value: Exclude<QueryPrimitive, null | undefined>): string => {\n\tif (typeof value === \"number\" && !Number.isFinite(value)) {\n\t\tthrow new RangeError(\"查询参数中的数字必须是有限数。\");\n\t}\n\treturn String(value);\n};\n\n/**\n * 将对象序列化为标准 URL 查询字符串。\n *\n * @remarks `null` 与 `undefined` 被跳过;数组使用重复键;返回值不会修改输入。\n * @param value - 查询参数对象。\n * @param options - 排序、空格和问号前缀选项。\n * @returns URL 编码后的查询字符串;没有参数时始终返回空字符串。\n * @throws `RangeError` 当参数包含 `NaN` 或无穷数字。\n */\nexport function toQueryString(value: Readonly<Record<string, QueryValue>>, options: QueryStringOptions = {}): string {\n\tconst entries = Object.entries(value);\n\tif (options.sort) entries.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));\n\tconst parameters = new URLSearchParams();\n\tfor (const [key, rawValue] of entries) {\n\t\tconst values = isQueryPrimitiveArray(rawValue) ? rawValue : [rawValue];\n\t\tfor (const item of values) {\n\t\t\tif (item !== null && item !== undefined) parameters.append(key, serializeQueryValue(item));\n\t\t}\n\t}\n\tlet result = parameters.toString();\n\tif (options.space === \"percent\") result = result.replace(/\\+/gu, \"%20\");\n\treturn result && options.prefixQuestionMark ? `?${result}` : result;\n}\n","import { computed } from \"vue\";\nimport type { ComputedRef } from \"vue\";\n\n/** Vue Emits 对象中允许的校验器形状。 */\ntype EmitValidator = ((...arguments_: never[]) => unknown) | null;\n/** 事件名到可选参数校验器的内部映射。 */\ntype EmitsOptions = Record<string, EmitValidator>;\n/** 从校验器中提取事件参数;无校验器时保留未知参数。 */\ntype EventArguments<Validator> = Validator extends (...arguments_: infer Arguments) => unknown ? Arguments : unknown[];\n/** 在类型层递归把 kebab-case 事件名转换为 PascalCase。 */\ntype PascalEventName<Value extends string> = Value extends `${infer Head}-${infer Tail}`\n\t? `${Capitalize<Head>}${PascalEventName<Tail>}`\n\t: Capitalize<Value>;\n\n/** 把事件配置映射为 Vue `onXxx` 属性。 */\nexport type EmitHandlers<Emits extends EmitsOptions> = {\n\t[Name in keyof Emits as Name extends string ? `on${PascalEventName<Name>}` : never]: (...arguments_: EventArguments<Emits[Name]>) => void;\n};\n\n/**\n * 把事件名转换为 Vue Handler Prop 名称。\n *\n * @param eventName - Emits 对象中的原始事件名,可使用 kebab-case。\n * @returns `onPascalCase` 形式的属性名。\n * @throws `TypeError` 当事件名包含空片段或无法生成有效 Handler 名称。\n */\nconst toHandlerName = (eventName: string): string => {\n\treturn `on${eventName\n\t\t.split(\"-\")\n\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t.join(\"\")}`;\n};\n\n/**\n * 构建响应式 Vue 事件处理器。\n *\n * @param emits - Vue emits 配置对象。\n * @param emit - `setup` 上下文提供的 emit 函数。\n * @param ignoredEvents - 不需要向子组件透传的事件名。\n * @returns 随配置重新计算的事件处理器对象。\n */\nexport function useEmits<Emits extends EmitsOptions>(\n\temits: Emits,\n\temit: (...arguments_: never[]) => unknown,\n\tignoredEvents: readonly (keyof Emits)[] = []\n): ComputedRef<Partial<EmitHandlers<Emits>>> {\n\tconst ignored = new Set<PropertyKey>(ignoredEvents);\n\tconst emitEvent = emit as unknown as (eventName: string, ...arguments_: unknown[]) => void;\n\treturn computed<Partial<EmitHandlers<Emits>>>(() => {\n\t\tconst handlers = {} as Partial<EmitHandlers<Emits>>;\n\t\tconst handlerNames = new Set<string>();\n\t\tfor (const eventName of Object.keys(emits)) {\n\t\t\tif (ignored.has(eventName)) continue;\n\t\t\tif (eventName.length === 0 || /\\s/u.test(eventName)) throw new TypeError(`无效的 Vue 事件名称:“${eventName}”。`);\n\t\t\tconst handlerName = toHandlerName(eventName);\n\t\t\tif (handlerNames.has(handlerName)) {\n\t\t\t\tthrow new TypeError(`多个 Vue 事件映射到同一处理器属性:“${handlerName}”。`);\n\t\t\t}\n\t\t\thandlerNames.add(handlerName);\n\t\t\tObject.defineProperty(handlers, handlerName, {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: (...arguments_: unknown[]): void => {\n\t\t\t\t\temitEvent(eventName, ...arguments_);\n\t\t\t\t},\n\t\t\t\twritable: true,\n\t\t\t});\n\t\t}\n\t\treturn handlers;\n\t});\n}\n","/**\n * 同时暴露组件实例能力并返回同一个对象,便于 `setup` 返回状态供 Vue Devtools 查看。\n *\n * @param expose - `setup` 上下文提供的 expose 函数。\n * @param exposed - 需要暴露的状态和方法。\n * @returns 原始 exposed 对象。\n */\nexport function useExpose<Exposed extends object>(expose: (exposed?: Exposed) => void, exposed: Exposed): Exposed {\n\texpose(exposed);\n\treturn exposed;\n}\n","/** 可同步或异步返回结果的函数。 */\nexport type AwaitableFunction<Arguments extends readonly unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/**\n * 统一执行同步或异步函数,异常保持原样向调用方传播。\n *\n * @param function_ - 可选的待执行函数。\n * @param arguments_ - 原样传入函数的参数。\n * @returns 函数结果;未传函数时返回 `undefined`。\n */\nexport async function callOptionalFunction<Arguments extends readonly unknown[], Result>(\n\tfunction_: AwaitableFunction<Arguments, Result> | null | undefined,\n\t...arguments_: Arguments\n): Promise<Awaited<Result> | undefined> {\n\tif (function_ === null || function_ === undefined) return undefined;\n\treturn Promise.resolve(function_(...arguments_));\n}\n","import type { App } from \"vue\";\n\n/** Vue 组件对象、函数组件或指令对象可接受的最小结构类型。 */\nexport type VueInstallValue = object | ((...arguments_: never[]) => unknown);\n\n/** 为 Vue 组件或指令附加供 Vue 3 `app.use()` 调用的安装能力。 */\nexport type Installable<Value> = Value & {\n\t/**\n\t * 把当前组件或指令安装到 Vue 3 App。\n\t * @param app - Vue 3 App 实例。\n\t */\n\tinstall: (app: App) => void;\n};\n\n/** TSX 组件安装类型;与 {@link Installable} 保持同一运行时契约。 */\nexport type TSXWithInstall<Value> = Installable<Value>;\n\n/** 组件、指令注册所需的 Vue 3 App 能力。 */\ninterface VueAppRegistrationTarget {\n\t/**\n\t * 读取或注册全局组件。\n\t *\n\t * @param name - 全局组件名。\n\t * @param component - 注册时传入的组件;省略时读取现有组件。\n\t * @returns Vue App 返回的现有组件、注册结果或 App 自身。\n\t */\n\tcomponent: (name: string, component?: unknown) => unknown;\n\t/**\n\t * 读取或注册全局指令。\n\t *\n\t * @param name - 不带 `v-` 的全局指令名。\n\t * @param directive - 注册时传入的指令;省略时读取现有指令。\n\t * @returns Vue App 返回的现有指令、注册结果或 App 自身。\n\t */\n\tdirective: (name: string, directive?: unknown) => unknown;\n}\n\n/**\n * 校验 Vue 3 插件安装目标。\n *\n * @param value - Vue 3 App 实例。\n * @returns 只包含组件和指令注册能力的 App。\n * @throws `TypeError` 当目标不是对象或缺少 `component`、`directive` 方法。\n */\nconst assertApp = (value: App): VueAppRegistrationTarget => {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 Vue 3 App 实例。\");\n\t}\n\tconst app = value as unknown as Partial<VueAppRegistrationTarget>;\n\tif (typeof app.component !== \"function\" || typeof app.directive !== \"function\") {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 `component()` 和 `directive()` 注册方法。\");\n\t}\n\treturn app as VueAppRegistrationTarget;\n};\n\n/**\n * 提取组件的全局注册名称。\n *\n * @param component - 待注册组件。\n * @returns 经过校验的显式名称。\n * @throws `TypeError` 当组件没有非空字符串名称,或名称包含空白。\n */\nconst getComponentName = (component: VueInstallValue): string => {\n\tconst name = (component as { name?: unknown }).name;\n\tif (typeof name !== \"string\" || name.length === 0 || /\\s/u.test(name)) {\n\t\tthrow new TypeError(\"可安装的 Vue 组件必须公开不含空白的非空名称。\");\n\t}\n\treturn name;\n};\n\n/** 预检完成、可以无失败注册的组件动作。 */\ninterface ComponentRegistration {\n\t/** 已校验的组件引用。 */\n\tcomponent: VueInstallValue;\n\t/** 已校验的组件名称。 */\n\tname: string;\n\t/** 目标中是否已经注册了完全相同的组件引用。 */\n\tregistered: boolean;\n}\n\n/**\n * 预检单个组件注册。\n *\n * @remarks 先读取同名组件并完成冲突判断,再返回延迟执行动作;调用方可以在所有组件预检通过后统一提交。\n * @param app - 已校验的 Vue 3 App 注册目标。\n * @param component - 待注册组件。\n * @returns 已校验的组件引用、名称和目标中是否已经存在同一引用。\n * @throws `Error` 当同名位置已由其他组件占用。\n */\nconst prepareComponentRegistration = (app: VueAppRegistrationTarget, component: VueInstallValue): ComponentRegistration => {\n\tconst name = getComponentName(component);\n\tconst existing = app.component(name);\n\tif (existing !== undefined && existing !== component) {\n\t\tthrow new Error(`Vue 组件名称“${name}”已被其他组件注册。`);\n\t}\n\treturn { component, name, registered: existing === component };\n};\n\n/**\n * 为主组件附加 Vue 3 `app.use()` 安装能力。\n *\n * @remarks 函数会直接为 `main` 定义附属组件属性和 `install`。所有组件名称、附属属性\n * 冲突会在修改 `main` 前完成校验;安装到 App 时也会先预检全部全局名称,再统一注册。\n * @param main - 具有非空 `name` 的组件。\n * @param extras - 同时注册并以可枚举属性挂到主组件的附属组件映射。\n * @returns 原始 `main` 引用,并附加类型化的 `install` 与 `extras` 属性。\n * @throws `TypeError` 当组件缺少合法名称、已有 `install`、附属键或名称发生冲突。\n * @throws `Error` 当 App 中同名位置已经注册其他组件。\n */\nexport function withInstall<Main extends VueInstallValue, Extras extends Record<string, VueInstallValue> = Record<never, never>>(\n\tmain: Main,\n\textras?: Extras\n): Installable<Main> & Extras {\n\tconst componentNames = new Set([getComponentName(main)]);\n\tif (\"install\" in Object(main)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst extraEntries = Object.entries(extras ?? {});\n\tif (extras !== undefined && Object.getOwnPropertySymbols(extras).some((key) => Object.prototype.propertyIsEnumerable.call(extras, key))) {\n\t\tthrow new TypeError(\"Vue 组件附属项必须使用字符串属性名。\");\n\t}\n\tfor (const [key, component] of extraEntries) {\n\t\tconst componentName = getComponentName(component);\n\t\tif (componentNames.has(componentName)) throw new TypeError(`Vue 组件名称“${componentName}”被重复注册。`);\n\t\tcomponentNames.add(componentName);\n\t\tif (key === \"install\" || key in Object(main)) {\n\t\t\tthrow new TypeError(`Vue 组件附属项“${key}”会覆盖主组件上的属性。`);\n\t\t}\n\t}\n\tconst installable = main as Installable<Main> & Extras;\n\tfor (const [key, component] of extraEntries) {\n\t\tObject.defineProperty(installable, key, { configurable: true, enumerable: true, value: component, writable: true });\n\t}\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\t// 先完成全部冲突检查,再统一注册,避免安装到一半留下部分全局组件。\n\t\tconst registrations = [main, ...extraEntries.map(([, component]) => component)].map((component) =>\n\t\t\tprepareComponentRegistration(app, component)\n\t\t);\n\t\tfor (const registration of registrations) {\n\t\t\tif (!registration.registered) app.component(registration.name, registration.component);\n\t\t}\n\t};\n\treturn installable;\n}\n\n/**\n * 为不需要单独注册的附属组件附加空安装函数。\n *\n * @remarks 适用于只能作为主组件附属属性使用、但仍需满足 Vue Plugin 类型的组件。\n * 函数直接修改并返回传入组件,不会向 Vue 3 App 注册内容。\n * @param component - 尚未定义或继承 `install` 属性的组件。\n * @returns 原组件引用及无副作用的 `install` 方法。\n * @throws `TypeError` 当组件自身或原型链已经存在 `install`。\n */\nexport function withNoopInstall<Value extends VueInstallValue>(component: Value): TSXWithInstall<Value> {\n\tif (\"install\" in Object(component)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst installable = component as TSXWithInstall<Value>;\n\tinstallable.install = (): void => undefined;\n\treturn installable;\n}\n\n/**\n * 为 Vue 3 指令附加插件安装能力。\n *\n * @remarks 函数直接修改并返回指令。安装时重复注册同一引用保持幂等,不会覆盖同名的\n * 其他指令。名称只传给 `directive()`,不得包含 `v-` 前缀。\n * @param directive - 尚未定义或继承 `install` 属性的 Vue 指令对象。\n * @param name - 非空、无空白且不以 `v-` 开头的全局指令名。\n * @returns 原指令引用及 Vue Plugin `install` 方法。\n * @throws `TypeError` 当名称非法、指令已有 `install`,或安装目标无效。\n * @throws `Error` 当 App 中同名位置已经注册其他指令。\n */\nexport function withInstallDirective<Value extends VueInstallValue>(directive: Value, name: string): Installable<Value> {\n\tif (name.length === 0 || /\\s/u.test(name) || name.startsWith(\"v-\")) {\n\t\tthrow new TypeError(\"可安装的 Vue 指令名称不能包含空白或 `v-` 前缀。\");\n\t}\n\tif (\"install\" in Object(directive)) throw new TypeError(\"Vue 指令已定义 `install` 属性。\");\n\tconst installable = directive as Installable<Value>;\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\tconst existing = app.directive(name);\n\t\tif (existing !== undefined && existing !== directive) {\n\t\t\tthrow new Error(`Vue 指令名称“${name}”已被其他指令注册。`);\n\t\t}\n\t\tif (existing !== directive) app.directive(name, directive);\n\t};\n\treturn installable;\n}\n","import { computed } from \"vue\";\nimport type { ComputedRef, PropType } from \"vue\";\n\n/**\n * 为 Vue 运行时 Props 构造器附加泛型类型。\n *\n * @remarks 该函数只帮助 TypeScript 建模,不验证运行时值与 `Value` 一致;调用方仍应\n * 传入 Vue 支持的构造器或构造器数组。\n * @param runtimeType - Vue 支持的运行时构造器或构造器数组。\n * @returns 同一引用,仅在类型层收窄为 `PropType<Value>`。\n */\nexport function definePropType<Value>(runtimeType: unknown): PropType<Value> {\n\treturn runtimeType as PropType<Value>;\n}\n\n/**\n * 构建需要透传给子组件的响应式 Props。\n *\n * @param props - Vue `setup` 接收的只读响应式 Props 对象。\n * @param rawProps - 子组件的运行时 Props 配置。\n * @param ignoredProps - 不需要透传的 Props 名称。\n * @returns 只包含 `rawProps` 声明键且随 Props 更新的 ComputedRef。\n */\nexport function useProps<Props extends object, RawProps extends object, IgnoredProp extends keyof RawProps = never>(\n\tprops: Props,\n\trawProps: RawProps,\n\tignoredProps: readonly IgnoredProp[] = []\n): ComputedRef<Omit<Pick<Props, Extract<keyof Props, keyof RawProps>>, Extract<IgnoredProp, keyof Props>>> {\n\tconst ignored = new Set<PropertyKey>(ignoredProps);\n\ttype Result = Omit<Pick<Props, Extract<keyof Props, keyof RawProps>>, Extract<IgnoredProp, keyof Props>>;\n\treturn computed<Result>(() => {\n\t\tconst result = {} as Result;\n\t\tfor (const key of Reflect.ownKeys(rawProps)) {\n\t\t\tif (ignored.has(key) || !Object.hasOwn(props, key)) continue;\n\t\t\tObject.defineProperty(result, key, { configurable: true, enumerable: true, value: Reflect.get(props, key), writable: true });\n\t\t}\n\t\treturn result;\n\t});\n}\n","import { getCurrentInstance } from \"vue\";\nimport type { VNode } from \"vue\";\n\n/** `useRender` 需要写入的 Vue 3 内部组件实例字段。 */\ninterface MutableVueComponentInstance {\n\trender?: () => VNode;\n}\n\n/**\n * 在当前 Vue 3 组件实例上安装 TSX 渲染函数。\n * @remarks `setup` 仍可返回状态对象,因此状态能够显示在 Vue Devtools 中。\n * @param render - 当前组件的渲染函数。\n * @throws 不在组件 `setup` 调用栈中使用时抛出 `Error`。\n */\nexport function useRender(render: () => VNode): void {\n\tconst instance = getCurrentInstance();\n\tif (instance === null) throw new Error(\"`useRender` 必须在 `setup` 函数内部调用。\");\n\t(instance as unknown as MutableVueComponentInstance).render = render;\n}\n","import type { SlotsType, VNode } from \"vue\";\n\n/** Slot 名到 Props 类型的内部声明映射。 */\ntype RawSlots = Record<string, unknown>;\n/** 根据 Slot Props 是否为 never 生成无参数或有参数的 Slot 签名。 */\ntype VueSlot<Properties> = [Properties] extends [never] ? () => VNode[] : (properties: Properties) => VNode[];\n\n/** 把 Slot 名称与作用域参数映射为 Vue 3 Slot 函数。 */\nexport type TypedSlots<Slots extends RawSlots> = {\n\t[Name in keyof Slots]: VueSlot<Slots[Name]>;\n};\n\n/** Vue 3 `slots` 选项接受的运行时声明与官方静态类型标记。 */\nexport type TypedSlotsDeclaration<Slots extends RawSlots> = SlotsType<Partial<TypedSlots<Slots>>>;\n\n/**\n * 为 Options API 的 `slots` 选项创建带作用域参数的类型声明。\n *\n * @returns 运行时 `Object` 构造器,并携带仅供 TypeScript 使用的 Slot 类型标记。\n */\nexport function makeSlots<Slots extends RawSlots>(): TypedSlotsDeclaration<Slots> {\n\treturn Object as TypedSlotsDeclaration<Slots>;\n}\n","/**\n * 保留传入值并显式指定其 TypeScript 类型。\n *\n * @remarks 未传值时运行时结果为 `undefined`,仅适合为 reactive 对象的初始字段提供类型。\n * @param data - 可选的原始值。\n * @returns 传入值本身;省略时返回类型化的 `undefined`。\n */\nexport function withDefineType<Value>(data?: Value): Value {\n\treturn data as Value;\n}\n"],"x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],"mappings":"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EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EAEzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EAEzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG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"}
1
+ {"version":3,"file":"index.global.min.js","names":["MD5","Hex","SHA1","Pkcs7","NoPadding","ZeroPadding","CryptoCore","Iso10126","Utf8","AES","ECB","computed","computed","getCurrentInstance"],"sources":["../src/array/index.ts","../src/async/index.ts","../src/internal/text.ts","../src/number/index.ts","../src/base64/index.ts","../src/color/index.ts","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-hex.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf8.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-pkcs7.js","../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.js","../src/crypto/index.ts","../src/date/index.ts","../src/dom/style.ts","../src/env/index.ts","../src/storage/index.ts","../src/string/index.ts","../src/identity/index.ts","../src/logger/index.ts","../src/object/index.ts","../src/vue/emits.ts","../src/vue/expose.ts","../src/vue/func.ts","../src/vue/install.ts","../src/vue/props.ts","../src/vue/render.ts","../src/vue/slots.ts","../src/vue/with.ts"],"sourcesContent":["/** 从数组项中提取可比较键的函数。 */\nexport type KeySelector<Item, Key> = (item: Item, index: number) => Key;\n\n/**\n * 将只读数组按固定大小分组。\n *\n * @typeParam Item - 数组项类型。\n * @param items - 不会被修改的输入数组。\n * @param size - 每组最多包含的项目数,必须是正安全整数。\n * @returns 新建的二维数组;最后一组可能小于 `size`。\n * @throws `RangeError` 当 `size` 不是正安全整数。\n */\nexport function chunk<Item>(items: readonly Item[], size: number): Item[][] {\n\tif (!Number.isSafeInteger(size) || size <= 0) {\n\t\tthrow new RangeError(\"`size` 必须是正安全整数。\");\n\t}\n\n\tconst result: Item[][] = [];\n\tfor (let index = 0; index < items.length; index += size) {\n\t\tresult.push(items.slice(index, index + size));\n\t}\n\treturn result;\n}\n\n/**\n * 删除数组中的 `null` 与 `undefined`,保留 `false`、`0` 和空字符串。\n *\n * @param items - 可包含空值的只读数组。\n * @returns 保持原顺序的新数组。\n */\nexport function removeNullishValues<Item>(items: readonly (Item | null | undefined)[]): Item[] {\n\treturn items.filter((item): item is Item => item !== null && item !== undefined);\n}\n\n/**\n * 使用 JavaScript `Set` 的 SameValueZero 语义去重。\n *\n * @param items - 不会被修改的输入数组。\n * @returns 保留每个值首次出现顺序的新数组;稀疏数组空位被忽略。\n */\nexport function unique<Item>(items: readonly Item[]): Item[] {\n\tconst result: Item[] = [];\n\tconst seen = new Set<Item>();\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tif (!(index in items)) continue;\n\t\tconst item = items[index] as Item;\n\t\tif (seen.has(item)) continue;\n\t\tseen.add(item);\n\t\tresult.push(item);\n\t}\n\treturn result;\n}\n\n/**\n * 按选择器返回的键去重。\n *\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 接收项目与索引并返回去重键的函数。\n * @returns 保留每个键首次出现项目的新数组;稀疏数组空位被忽略。\n */\nexport function uniqueBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Item[] {\n\tconst seen = new Set<Key>();\n\tconst result: Item[] = [];\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined && !(index in items)) continue;\n\t\tconst key = selectKey(item as Item, index);\n\t\tif (seen.has(key)) continue;\n\t\tseen.add(key);\n\t\tresult.push(item as Item);\n\t}\n\treturn result;\n}\n\n/**\n * 按选择器结果分组。\n *\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 返回任意 `Map` 键的函数。\n * @returns 按键首次出现顺序排列的 `Map`;每个分组保持输入顺序,稀疏空位被忽略。\n */\nexport function groupBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Map<Key, Item[]> {\n\tconst groups = new Map<Key, Item[]>();\n\titems.forEach((item, index) => {\n\t\tconst key = selectKey(item, index);\n\t\tconst group = groups.get(key);\n\t\tif (group === undefined) groups.set(key, [item]);\n\t\telse group.push(item);\n\t});\n\treturn groups;\n}\n\n/**\n * 按谓词把数组拆分为匹配项和非匹配项。\n *\n * @param items - 不会被修改的输入数组。\n * @param predicate - 接收项目与索引的判断函数。\n * @returns 二元组:第一项匹配谓词,第二项不匹配;两组都保持原顺序并忽略稀疏空位。\n */\nexport function partition<Item>(items: readonly Item[], predicate: (item: Item, index: number) => boolean): [matched: Item[], unmatched: Item[]] {\n\tconst matched: Item[] = [];\n\tconst unmatched: Item[] = [];\n\titems.forEach((item, index) => (predicate(item, index) ? matched : unmatched).push(item));\n\treturn [matched, unmatched];\n}\n\n/**\n * 返回只出现在左侧数组中的不同值。\n *\n * @param left - 主输入数组。\n * @param right - 需要排除的值。\n * @returns 保留左侧首次出现顺序的去重结果;两侧稀疏空位都被忽略。\n */\nexport function difference<Item>(left: readonly Item[], right: readonly Item[]): Item[] {\n\tconst excluded = new Set(unique(right));\n\treturn unique(left).filter((item) => !excluded.has(item));\n}\n\n/**\n * 返回两个数组共有的不同值。\n *\n * @param left - 决定结果顺序的数组。\n * @param right - 用于成员判断的数组。\n * @returns 保留左侧首次出现顺序的去重结果;两侧稀疏空位都被忽略。\n */\nexport function intersection<Item>(left: readonly Item[], right: readonly Item[]): Item[] {\n\tconst included = new Set(unique(right));\n\treturn unique(left).filter((item) => included.has(item));\n}\n\n/**\n * 判断选择器产生的键是否重复。\n *\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 返回比较键的函数;键使用 SameValueZero 语义比较。\n * @returns 存在至少一个重复键时返回 `true`。\n */\nexport function hasDuplicatesBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean {\n\tconst seen = new Set<Key>();\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined && !(index in items)) continue;\n\t\tconst key = selectKey(item as Item, index);\n\t\tif (seen.has(key)) return true;\n\t\tseen.add(key);\n\t}\n\treturn false;\n}\n\n/**\n * 判断所有项目是否具有相同的选择器结果。\n *\n * @remarks 空数组、只有稀疏空位的数组和单项数组按数学惯例返回 `true`;空位不会调用选择器。\n * @param items - 不会被修改的输入数组。\n * @param selectKey - 返回比较键的函数。\n * @returns 所有键都满足 SameValueZero 相等时返回 `true`。\n */\nexport function allEqualBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean {\n\tlet first: Key | undefined;\n\tlet hasFirst = false;\n\tfor (let index = 0; index < items.length; index += 1) {\n\t\tconst item = items[index];\n\t\tif (item === undefined && !(index in items)) continue;\n\t\tconst current = selectKey(item as Item, index);\n\t\tif (!hasFirst) {\n\t\t\tfirst = current;\n\t\t\thasFirst = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!(first === current || (Number.isNaN(first) && Number.isNaN(current)))) return false;\n\t}\n\treturn true;\n}\n","/** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */\ntype AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/** 记录同一防抖批次中每个调用方独立的 Promise 结算函数。 */\ninterface PromiseWaiter<Result> {\n\t/**\n\t * 使用批次失败原因拒绝当前调用方。\n\t * @param reason - `cancel` 提供的原因或共享回调抛出的原始错误。\n\t */\n\treject: (reason?: unknown) => void;\n\t/**\n\t * 使用共享回调结果完成当前调用方,并采用传入 PromiseLike 的最终状态。\n\t * @param value - 当前防抖批次唯一一次回调执行产生的共享结果。\n\t */\n\tresolve: (value: Result | PromiseLike<Result>) => void;\n}\n\n// 浏览器和 Node.js 的计时器普遍以有符号 32 位整数保存延迟;更大的值可能被\n// 静默截断为约 1 ms,因此公共 API 在进入平台计时器前统一拒绝它。\nconst maximumTimerDelay = 2_147_483_647;\n\n/** 可接收取消信号的通用选项。 */\nexport interface AbortOptions {\n\t/** 已取消时立即失败;运行期间取消时停止等待并拒绝 Promise。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link withTimeout} 的行为选项。 */\nexport interface TimeoutOptions extends AbortOptions {\n\t/** 超时时使用的开发者消息。 */\n\tmessage?: string;\n}\n\n/** 每次重试操作接收的上下文。 */\nexport interface RetryContext {\n\t/** 从 1 开始的当前尝试次数。 */\n\tattempt: number;\n\t/** 调用方提供的取消信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link retry} 的策略选项。 */\nexport interface RetryOptions extends AbortOptions {\n\t/** 最大尝试次数,包含首次调用;默认 `3`。 */\n\tattempts?: number;\n\t/** 首次重试前的等待毫秒数,最大 2,147,483,647;默认 `200`。 */\n\tdelayMs?: number;\n\t/** 每次失败后的退避倍数,必须不小于 1;默认 `2`。 */\n\tfactor?: number;\n\t/** 单次等待上限,最大 2,147,483,647;默认 `30_000` 毫秒。 */\n\tmaxDelayMs?: number;\n\t/**\n\t * 决定当前失败后是否继续下一次尝试;默认重试所有尚未到达上限的错误。\n\t * @param error - 当前操作抛出或拒绝的原始值。\n\t * @param context - 当前尝试次数和调用方取消信号。\n\t * @returns `false` 时立即原样抛出当前错误;支持同步值或 PromiseLike。\n\t */\n\tshouldRetry?: (error: unknown, context: RetryContext) => boolean | PromiseLike<boolean>;\n}\n\n/** {@link mapConcurrent} 的执行选项。 */\nexport interface ConcurrentMapOptions {\n\t/** 已取消时停止调度新任务;已经开始的映射器需要自行响应同一信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** Promise 感知的防抖函数。 */\nexport interface DebouncedFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。\n\t * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。\n\t * @returns 当前批次的独立 Promise,最终与共享回调结果保持相同状态。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/**\n\t * 取消尚未执行的批次,并拒绝该批次的所有 Promise。\n\t * @param reason - 可选拒绝原因;省略时使用内部取消错误。\n\t */\n\tcancel: (reason?: unknown) => void;\n\t/**\n\t * 立即执行待处理批次,不创建第二次回调执行。\n\t * @returns 待处理批次的共享执行 Promise;没有批次时返回 `undefined`。\n\t */\n\tflush: () => Promise<Result> | undefined;\n\t/** @returns 当前存在尚未开始的批次时返回 `true`;正在执行但没有等待批次时返回 `false`。 */\n\tpending: () => boolean;\n}\n\n/** Promise 感知的前缘节流函数。 */\nexport interface ThrottledFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 在空闲时立即调用原始回调;执行期和冷却期内的调用共享首次调用的 Promise。\n\t * @param arguments_ - 仅窗口内首次调用的参数会传给原始回调。\n\t * @returns 当前执行窗口共享的 Promise。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/** 提前结束冷却期;已经开始的操作不会被取消,结束前仍禁止并发重入。 */\n\tcancel: () => void;\n\t/** @returns 原始回调正在执行或计时器仍处于冷却期时返回 `true`。 */\n\tpending: () => boolean;\n}\n\n/**\n * 创建符合 Web Platform 约定的取消错误。\n *\n * @param signal - 已进入取消状态的信号;其 `reason` 会保存在错误的 `cause` 中。\n * @returns 名称为 `AbortError` 的新错误实例。\n */\nconst createAbortError = (signal: AbortSignal): Error => {\n\tconst error = new Error(\"操作已取消。\", { cause: signal.reason });\n\terror.name = \"AbortError\";\n\treturn error;\n};\n\n/**\n * 在启动异步工作前同步拒绝已经取消的信号。\n *\n * @param signal - 可选取消信号;省略或尚未取消时不执行操作。\n * @throws `Error` 当信号已经取消,错误名称为 `AbortError`。\n */\nconst throwIfAborted = (signal: AbortSignal | undefined): void => {\n\tif (signal?.aborted) throw createAbortError(signal);\n};\n\n/**\n * 校验宿主计时器可以稳定表示的延迟。\n *\n * @param milliseconds - 待校验的毫秒数。\n * @param name - 用于错误消息的参数名称。\n * @returns 原始延迟值,便于调用方在校验后直接使用。\n * @throws `RangeError` 当值非有限、为负数或超过 32 位计时器上限。\n */\nconst assertDelay = (milliseconds: number, name = \"milliseconds\"): number => {\n\tif (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > maximumTimerDelay) {\n\t\tthrow new RangeError(`\\`${name}\\` 必须是 0 到 ${maximumTimerDelay} 之间的有限数。`);\n\t}\n\treturn milliseconds;\n};\n\n/**\n * 等待指定时间,并支持 `AbortSignal`。\n *\n * @param milliseconds - 0 至 2,147,483,647 的有限毫秒数。\n * @param options - 可选取消信号。\n * @returns 到期后完成的 Promise。\n * @throws 取消时抛出名称为 `AbortError` 的 `Error`;参数非法时抛出 `RangeError`。\n */\nexport function sleep(milliseconds: number, options: AbortOptions = {}): Promise<void> {\n\tconst delay = assertDelay(milliseconds);\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 取消计时器并使用标准取消错误拒绝等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tclearTimeout(timer);\n\t\t\treject(createAbortError(signal));\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, delay);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/**\n * 为 Promise 增加等待上限。\n *\n * @remarks 超时或取消只停止等待,不能自动取消底层操作;需要真正取消时应同时把\n * 同一个 `AbortSignal` 传给底层 API。\n * @param promise - 需要等待的 Promise 或 PromiseLike。\n * @param timeoutMs - 0 至 2,147,483,647 的有限等待时间。\n * @param options - 取消信号与自定义消息。\n * @returns 底层 Promise 的结果。\n * @throws 超时抛出 `Error`,取消时抛出名称为 `AbortError` 的 `Error`;等待时间非法时抛出 `RangeError`。\n */\nexport function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: number, options: TimeoutOptions = {}): Promise<Result> {\n\tconst delay = assertDelay(timeoutMs, \"timeoutMs\");\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<Result>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 清理竞争结束后不再需要的计时器和监听器。 */\n\t\tfunction cleanup(): void {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t\t/**\n\t\t * 只允许 Promise、超时和取消三个竞争来源中的首个结果生效。\n\t\t *\n\t\t * @param action - 首个完成来源的结算动作。\n\t\t */\n\t\tfunction settle(action: () => void): void {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\taction();\n\t\t}\n\t\t/** 使用调用方取消原因结束当前等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tsettle(() => {\n\t\t\t\treject(createAbortError(signal));\n\t\t\t});\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsettle(() => {\n\t\t\t\treject(new Error(options.message ?? `操作超过 ${delay} 毫秒仍未完成。`));\n\t\t\t});\n\t\t}, delay);\n\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tPromise.resolve(promise).then(\n\t\t\t(value) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\tresolve(value);\n\t\t\t\t});\n\t\t\t},\n\t\t\t(error: unknown) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t});\n}\n\n/**\n * 使用有上限的指数退避重试操作。\n *\n * @typeParam Result - 操作结果类型。\n * @param operation - 每次尝试都会调用的函数;`attempt` 从 1 开始。\n * @param options - 尝试次数、退避和取消策略。\n * @returns 首次成功结果。\n * @throws 最后一次操作错误、`shouldRetry` 错误或名称为 `AbortError` 的取消错误;策略参数非法时抛出 `RangeError`。\n */\nexport async function retry<Result>(\n\toperation: (context: RetryContext) => Result | PromiseLike<Result>,\n\toptions: RetryOptions = {}\n): Promise<Awaited<Result>> {\n\tconst attempts = options.attempts ?? 3;\n\tconst initialDelay = assertDelay(options.delayMs ?? 200, \"delayMs\");\n\tconst maximumDelay = assertDelay(options.maxDelayMs ?? 30_000, \"maxDelayMs\");\n\tconst factor = options.factor ?? 2;\n\tif (!Number.isSafeInteger(attempts) || attempts <= 0) throw new RangeError(\"`attempts` 必须是正安全整数。\");\n\tif (!Number.isFinite(factor) || factor < 1) throw new RangeError(\"`factor` 必须是大于或等于 1 的有限数。\");\n\n\tfor (let attempt = 1; attempt <= attempts; attempt += 1) {\n\t\tthrowIfAborted(options.signal);\n\t\tconst context: RetryContext = options.signal === undefined ? { attempt } : { attempt, signal: options.signal };\n\t\ttry {\n\t\t\treturn await operation(context);\n\t\t} catch (error) {\n\t\t\tif (attempt === attempts || (options.shouldRetry !== undefined && !(await options.shouldRetry(error, context)))) throw error;\n\t\t\t// `0 * Infinity` is `NaN`; a zero initial delay must remain zero even when\n\t\t\t// a very large factor overflows during a later attempt.\n\t\t\tconst delay = initialDelay === 0 ? 0 : Math.min(initialDelay * factor ** (attempt - 1), maximumDelay);\n\t\t\tawait sleep(delay, options.signal === undefined ? {} : { signal: options.signal });\n\t\t}\n\t}\n\n\tthrow new Error(\"重试结束但未获得结果。\");\n}\n\n/**\n * 以固定并发度映射数组,并保持结果顺序。\n *\n * @remarks 任一映射失败后不会再调度新项目,但已经开始的映射无法自动取消;映射器\n * 应使用传入的 `signal` 取消底层工作。\n * @param items - 不会被修改的输入数组。\n * @param concurrency - 同时运行的最大任务数,必须为正安全整数。\n * @param mapper - 接收项目、索引和取消信号的映射函数。\n * @param options - 可选取消信号。\n * @returns 与输入长度和顺序一致的结果数组;稀疏空位保持为空位且不会调用映射器。\n * @throws `RangeError` 当 `concurrency` 不是正安全整数;取消时抛出名称为 `AbortError` 的 `Error`。\n */\nexport async function mapConcurrent<Item, Result>(\n\titems: readonly Item[],\n\tconcurrency: number,\n\tmapper: (item: Item, index: number, signal: AbortSignal | undefined) => Result | PromiseLike<Result>,\n\toptions: ConcurrentMapOptions = {}\n): Promise<Awaited<Result>[]> {\n\tif (!Number.isSafeInteger(concurrency) || concurrency <= 0) {\n\t\tthrow new RangeError(\"`concurrency` 必须是正安全整数。\");\n\t}\n\tthrowIfAborted(options.signal);\n\n\tconst results = new Array<Awaited<Result>>(items.length);\n\tlet nextIndex = 0;\n\tlet failed = false;\n\t/**\n\t * 从共享游标持续领取映射任务。\n\t *\n\t * @remarks JavaScript 单线程执行保证“读取索引并递增”不会被另一个 Worker 插入,因此每个索引只会领取一次。\n\t * @returns 当前 Worker 没有剩余任务时完成。\n\t * @throws 原样传播取消错误或 Mapper 错误,并阻止其他 Worker 领取新任务。\n\t */\n\tconst worker = async (): Promise<void> => {\n\t\twhile (!failed) {\n\t\t\tthrowIfAborted(options.signal);\n\t\t\tconst index = nextIndex;\n\t\t\tif (index >= items.length) return;\n\t\t\tnextIndex += 1;\n\t\t\tif (!(index in items)) continue;\n\t\t\ttry {\n\t\t\t\tresults[index] = await mapper(items[index] as Item, index, options.signal);\n\t\t\t} catch (error) {\n\t\t\t\tfailed = true;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst workerCount = Math.min(concurrency, items.length);\n\tawait Promise.all(Array.from({ length: workerCount }, () => worker()));\n\treturn results;\n}\n\n/**\n * 创建 Promise 感知的防抖函数。\n *\n * @remarks 同一窗口内的所有调用都会等待最后一组参数对应的执行结果;回调错误会原样\n * 拒绝该批次的全部调用,不会留下永久 pending 的 Promise。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限等待时间,默认 300 毫秒。\n * @returns 具有取消、立即执行和状态方法的防抖函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function debounce<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): DebouncedFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latestArguments: Arguments | undefined;\n\tlet waiters: PromiseWaiter<Awaited<Result>>[] = [];\n\n\t/**\n\t * 执行并结算当前防抖批次。\n\t *\n\t * @returns 最后一组参数对应的回调结果。\n\t * @throws 没有待处理批次时抛出 `Error`;回调错误会原样传播给批次中的全部调用方。\n\t */\n\tconst execute = async (): Promise<Awaited<Result>> => {\n\t\tconst arguments_ = latestArguments;\n\t\tif (arguments_ === undefined) {\n\t\t\tthrow new Error(\"当前没有待处理的防抖调用。\");\n\t\t}\n\t\tlatestArguments = undefined;\n\t\ttimer = undefined;\n\t\tconst currentWaiters = waiters;\n\t\twaiters = [];\n\t\ttry {\n\t\t\tconst result = await callback(...arguments_);\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.resolve(result);\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.reject(error);\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\t/**\n\t * 更新批次参数并返回当前调用方专属的等待 Promise。\n\t *\n\t * @param arguments_ - 本次调用参数;同批次中只有最后一组参数会执行。\n\t * @returns 与当前批次共享结果、但可独立结算的 Promise。\n\t */\n\tconst debounced = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tlatestArguments = arguments_;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\tvoid execute().catch(() => undefined);\n\t\t}, delay);\n\t\treturn new Promise<Awaited<Result>>((resolve, reject) => waiters.push({ reject, resolve }));\n\t};\n\n\tdebounced.cancel = (reason?: unknown): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tlatestArguments = undefined;\n\t\tconst error = reason ?? new Error(\"防抖调用已取消。\");\n\t\twaiters.forEach((waiter) => {\n\t\t\twaiter.reject(error);\n\t\t});\n\t\twaiters = [];\n\t};\n\tdebounced.flush = (): Promise<Awaited<Result>> | undefined => {\n\t\tif (timer === undefined) return undefined;\n\t\tclearTimeout(timer);\n\t\treturn execute();\n\t};\n\tdebounced.pending = (): boolean => timer !== undefined;\n\treturn debounced;\n}\n\n/**\n * 创建 Promise 感知的前缘节流函数。\n *\n * @remarks 窗口内的调用共享首次调用结果。若回调执行时间超过窗口,后续调用仍会等待\n * 当前回调,避免异步操作重入;该函数不安排尾缘调用。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限冷却时间,默认 300 毫秒。\n * @returns 具有取消和状态方法的前缘节流函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function throttle<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): ThrottledFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet current: Promise<Awaited<Result>> | undefined;\n\tlet cooling = false;\n\tlet settled = false;\n\n\t/**\n\t * 尝试释放当前节流窗口。\n\t *\n\t * @remarks 只有回调和冷却计时器都结束后才清空共享 Promise,避免长回调发生重入。\n\t */\n\tconst release = (): void => {\n\t\tif (!cooling && settled) current = undefined;\n\t};\n\t/**\n\t * 执行前缘调用或复用当前窗口的共享 Promise。\n\t *\n\t * @param arguments_ - 仅新窗口首个调用会使用的参数。\n\t * @returns 当前窗口首次调用的 Promise。\n\t */\n\tconst throttled = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tif (current !== undefined) return current;\n\t\tcooling = true;\n\t\tsettled = false;\n\t\tlet invocation: Promise<Awaited<Result>>;\n\t\ttry {\n\t\t\tinvocation = Promise.resolve(callback(...arguments_));\n\t\t} catch (error) {\n\t\t\tinvocation = Promise.reject(error);\n\t\t}\n\t\tcurrent = invocation;\n\t\tinvocation.then(\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t}\n\t\t);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tcooling = false;\n\t\t\trelease();\n\t\t}, delay);\n\t\treturn invocation;\n\t};\n\n\tthrottled.cancel = (): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tcooling = false;\n\t\trelease();\n\t};\n\tthrottled.pending = (): boolean => current !== undefined;\n\treturn throttled;\n}\n","/**\n * 延迟解析 UTF-8 TextDecoder,确保模块导入阶段不依赖 Encoding API。\n *\n * @returns 启用 Fatal 模式的新解码器,非法 UTF-8 会直接失败。\n * @throws `Error` 当当前平台没有提供 `TextDecoder`。\n */\nexport const getTextDecoder = (): TextDecoder => {\n\tconst TextDecoderConstructor = globalThis.TextDecoder;\n\tif (typeof TextDecoderConstructor !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持 TextDecoder。\");\n\t}\n\treturn new TextDecoderConstructor(\"utf-8\", { fatal: true });\n};\n\n/**\n * 延迟解析 TextEncoder,让纯字节 API 在缺少 Encoding API 的平台仍可导入。\n *\n * @returns 新建的 UTF-8 编码器。\n * @throws `Error` 当当前平台没有提供 `TextEncoder`。\n */\nexport const getTextEncoder = (): TextEncoder => {\n\tconst TextEncoderConstructor = globalThis.TextEncoder;\n\tif (typeof TextEncoderConstructor !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持 TextEncoder。\");\n\t}\n\treturn new TextEncoderConstructor();\n};\n\n/**\n * 在确认平台能力后把 JavaScript 字符串编码为 UTF-8。\n *\n * @param value - 待编码文本。\n * @returns 使用独立 ArrayBuffer 的 UTF-8 字节数组。\n * @throws `Error` 当当前平台没有提供 `TextEncoder`。\n */\nexport const encodeUtf8 = (value: string): Uint8Array<ArrayBuffer> => getTextEncoder().encode(value);\n\n/** 解码或解密后的字符串扩展。 */\ninterface DecodedTextExtension {\n\t/**\n\t * 显式把原始文本解析为 JSON 值。\n\t *\n\t * @remarks 泛型只描述调用方期望的类型,不验证实际 JSON 结构;不可信数据仍需执行运行时校验。\n\t * @returns `JSON.parse` 生成的对象、数组、标量或 `null`;文本不是合法 JSON 时返回原始字符串。\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any -- 未传泛型时按公共 API 约定保留 JSON.parse 的 any 返回类型。\n\tparseJson: <Value = any>() => Value;\n}\n\n/** 可直接作为原始字符串使用,并支持显式 JSON 解析的解码或解密结果。 */\nexport type DecodedText = string & DecodedTextExtension;\n\nconst parseJsonMarker = Symbol.for(\"@fast-china/utils/parse-json\");\n\n/** 把当前字符串解析为 JSON 值。 */\nconst parseJson = function <Value = ReturnType<typeof JSON.parse>>(this: string): Value {\n\tconst text = String(this);\n\ttry {\n\t\treturn JSON.parse(text) as Value;\n\t} catch {\n\t\treturn text as Value;\n\t}\n};\n\nObject.defineProperty(parseJson, parseJsonMarker, { value: true });\n\n/** 按需安装不可枚举的字符串 JSON 解析扩展。 */\nconst ensureParseJsonExtension = (): void => {\n\tconst descriptor = Object.getOwnPropertyDescriptor(String.prototype, \"parseJson\");\n\tif (descriptor !== undefined) {\n\t\tif (typeof descriptor.value === \"function\" && Reflect.get(descriptor.value, parseJsonMarker) === true) return;\n\t\tthrow new TypeError(\"String.prototype.parseJson 已被其他实现占用。\");\n\t}\n\n\ttry {\n\t\tObject.defineProperty(String.prototype, \"parseJson\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: parseJson,\n\t\t\twritable: true,\n\t\t});\n\t} catch (cause) {\n\t\tthrow new TypeError(\"当前运行环境不允许安装 String.prototype.parseJson。\", { cause });\n\t}\n};\n\n/**\n * 创建可链式解析 JSON 的原始字符串。\n *\n * @param text - 解码或解密后的原始文本。\n * @returns 可直接作为字符串使用或显式调用 `.parseJson<Value>()` 的结果。\n */\nexport const createDecodedText = (text: string): DecodedText => {\n\tensureParseJsonExtension();\n\treturn text as DecodedText;\n};\n","const byteUnits = [\"B\", \"kB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"] as const;\nconst binaryByteUnits = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"] as const;\n\n/** {@link formatBytes} 的格式化选项。 */\nexport interface FormatBytesOptions {\n\t/** 计量基数。`1000` 生成 SI 单位,`1024` 生成 IEC 单位;默认 `1024`。 */\n\tbase?: 1000 | 1024;\n\t/** 小数位数,范围 0 至 20;默认 `2`。 */\n\tdecimals?: number;\n\t/** `Intl.NumberFormat` 使用的语言;默认固定为 `en-US` 以保证输出稳定。 */\n\tlocale?: string | readonly string[];\n}\n\n/**\n * 拒绝 NaN,同时允许具体 API 自行决定是否接受 Infinity。\n *\n * @param value - 待校验数值。\n * @param name - 用于错误消息的参数名称。\n * @throws `RangeError` 当值为 NaN。\n */\nconst assertNotNaN = (value: number, name: string): void => {\n\tif (Number.isNaN(value)) throw new RangeError(`\\`${name}\\` 不能是 NaN。`);\n};\n\n/**\n * 校验有限数值。\n *\n * @param value - 待校验数值。\n * @param name - 用于错误消息的参数名称。\n * @throws `RangeError` 当值为 NaN 或无穷大。\n */\nconst assertFinite = (value: number, name: string): void => {\n\tif (!Number.isFinite(value)) throw new RangeError(`\\`${name}\\` 必须是有限数。`);\n};\n\n/**\n * 使用科学计数法移动十进制位。\n *\n * @remarks 该方式用于 `roundTo`,可减少直接乘除十次幂造成的额外二进制舍入误差。\n * @param value - 原始数值。\n * @param exponent - 十进制移动位数;正数向右移动。\n * @returns 移动后的数值。\n */\nconst shiftDecimal = (value: number, exponent: number): number => {\n\tif (Object.is(value, -0)) return -0;\n\tconst [coefficient = \"0\", currentExponent = \"0\"] = value.toString().split(\"e\");\n\treturn Number(`${coefficient}e${Number(currentExponent) + exponent}`);\n};\n\n/**\n * 把数字限制在闭区间内。\n *\n * @param value - 需要限制的数字。\n * @param minimum - 闭区间下界。\n * @param maximum - 闭区间上界。\n * @returns `minimum <= result <= maximum` 的值。\n * @throws `RangeError` 当参数为 `NaN` 或下界大于上界。\n */\nexport function clamp(value: number, minimum: number, maximum: number): number {\n\tassertNotNaN(value, \"value\");\n\tassertNotNaN(minimum, \"minimum\");\n\tassertNotNaN(maximum, \"maximum\");\n\tif (minimum > maximum) throw new RangeError(\"`minimum` 不能大于 `maximum`。\");\n\treturn Math.min(Math.max(value, minimum), maximum);\n}\n\n/**\n * 判断数字是否位于指定区间。\n *\n * @param value - 待检查数字。\n * @param minimum - 包含的下界。\n * @param maximum - 上界。\n * @param includeMaximum - 是否包含上界;默认使用半开区间 `[minimum, maximum)`。\n * @returns 数字满足区间边界时返回 `true`。\n * @throws `RangeError` 当参数为 `NaN` 或下界大于上界。\n */\nexport function inRange(value: number, minimum: number, maximum: number, includeMaximum = false): boolean {\n\tassertNotNaN(value, \"value\");\n\tassertNotNaN(minimum, \"minimum\");\n\tassertNotNaN(maximum, \"maximum\");\n\tif (minimum > maximum) throw new RangeError(\"`minimum` 不能大于 `maximum`。\");\n\treturn value >= minimum && (includeMaximum ? value <= maximum : value < maximum);\n}\n\n/**\n * 按十进制位数四舍五入。\n *\n * @remarks IEEE-754 浮点数仍可能存在不可表示误差;财务金额应使用十进制定点方案。\n * @param value - 有限数字。\n * @param digits - 小数位数;负数表示十位、百位等,范围 -15 至 15。\n * @returns 按 `Math.round` 语义舍入后的数字。\n * @throws `RangeError` 当值非有限或位数超出范围。\n */\nexport function roundTo(value: number, digits = 0): number {\n\tassertFinite(value, \"value\");\n\tif (!Number.isSafeInteger(digits) || digits < -15 || digits > 15) {\n\t\tthrow new RangeError(\"`digits` 必须是 -15 到 15 之间的安全整数。\");\n\t}\n\tconst shifted = shiftDecimal(value, digits);\n\t// 对已经没有可表示小数的大数,乘以 10^digits 可能溢出;此时舍入不会改变值。\n\tif (!Number.isFinite(shifted)) return value;\n\treturn shiftDecimal(Math.round(shifted), -digits);\n}\n\n/**\n * 对有限数字求和。\n *\n * @param values - 不会被修改的数字数组。\n * @returns 算术和;空数组返回 `0`。\n * @throws `RangeError` 当任一值非有限或累计结果溢出。\n */\nexport function sum(values: readonly number[]): number {\n\tlet total = 0;\n\tlet compensation = 0;\n\tvalues.forEach((value) => {\n\t\tassertFinite(value, \"value\");\n\t\t// Kahan 补偿保存上一次浮点加法丢失的低位,减少大量小数累计误差。\n\t\tconst adjusted = value - compensation;\n\t\tconst next = total + adjusted;\n\t\tif (!Number.isFinite(next)) throw new RangeError(\"总和超出有限数范围。\");\n\t\tcompensation = next - total - adjusted;\n\t\ttotal = next;\n\t});\n\treturn total;\n}\n\n/**\n * 计算有限数字的算术平均值。\n *\n * @param values - 不会被修改的数字数组。\n * @returns 空数组或只有稀疏空位的数组返回 `undefined`;空位不参与分母。\n * @throws `RangeError` 当任一值非有限。\n */\nexport function average(values: readonly number[]): number | undefined {\n\tlet count = 0;\n\tlet mean = 0;\n\tvalues.forEach((value) => {\n\t\tassertFinite(value, \"value\");\n\t\tcount += 1;\n\t\t// 加权增量形式避免先求和导致 MAX_VALUE + MAX_VALUE 溢出。\n\t\tmean = mean * ((count - 1) / count) + value / count;\n\t});\n\treturn count === 0 ? undefined : mean;\n}\n\n/**\n * 在两个数字间做线性插值。\n *\n * @remarks `amount` 不限制在 0 至 1;区间外的值会执行线性外推。\n * @param start - `amount = 0` 时的起点。\n * @param end - `amount = 1` 时的终点。\n * @param amount - 插值或外推比例。\n * @returns 线性计算结果。\n * @throws `RangeError` 当任一参数非有限或结果超出有限数字范围。\n */\nexport function lerp(start: number, end: number, amount: number): number {\n\tassertFinite(start, \"start\");\n\tassertFinite(end, \"end\");\n\tassertFinite(amount, \"amount\");\n\tconst result = start * (1 - amount) + end * amount;\n\tif (!Number.isFinite(result)) throw new RangeError(\"插值结果超出有限数范围。\");\n\treturn result;\n}\n\n/**\n * 将非负字节数格式化为 SI 或 IEC 单位。\n *\n * @param bytes - 非负有限字节数。\n * @param options - 基数、小数位和语言选项。\n * @returns 例如 `1.5 KiB`。\n * @throws `RangeError` 当字节数为负或非有限、基数不是 1000/1024、小数位非法,或 Locale 无效。\n */\nexport function formatBytes(bytes: number, options: FormatBytesOptions = {}): string {\n\tassertFinite(bytes, \"bytes\");\n\tif (bytes < 0) throw new RangeError(\"`bytes` 不能为负数。\");\n\tconst requestedBase: unknown = options.base ?? 1024;\n\tif (requestedBase !== 1000 && requestedBase !== 1024) throw new RangeError(\"`base` 必须是 1000 或 1024。\");\n\tconst base = requestedBase;\n\tconst decimals = options.decimals ?? 2;\n\tif (!Number.isSafeInteger(decimals) || decimals < 0 || decimals > 20) {\n\t\tthrow new RangeError(\"`decimals` 必须是 0 到 20 之间的安全整数。\");\n\t}\n\tif (bytes === 0) return \"0 B\";\n\n\tconst units = base === 1024 ? binaryByteUnits : byteUnits;\n\tconst exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n\tconst value = bytes / base ** exponent;\n\tconst formatted = new Intl.NumberFormat(options.locale ?? \"en-US\", {\n\t\tmaximumFractionDigits: decimals,\n\t\tminimumFractionDigits: 0,\n\t\tuseGrouping: false,\n\t}).format(value);\n\treturn `${formatted} ${units[exponent] ?? units.at(-1)}`;\n}\n\n/**\n * 在半开区间内生成随机整数。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param minimum - 包含的安全整数下界。\n * @param maximumExclusive - 不包含的安全整数上界;区间宽度最大为 2^32。\n * @returns 位于 `[minimum, maximumExclusive)` 的随机整数。\n * @throws 参数非法时抛出 `RangeError`。\n */\nexport function randomInt(minimum: number, maximumExclusive: number): number {\n\tif (!Number.isSafeInteger(minimum) || !Number.isSafeInteger(maximumExclusive)) {\n\t\tthrow new RangeError(\"`minimum` 和 `maximumExclusive` 必须是安全整数。\");\n\t}\n\tconst range = maximumExclusive - minimum;\n\tconst uint32Range = 0x1_0000_0000;\n\tif (range <= 0 || range > uint32Range) {\n\t\tthrow new RangeError(\"区间不能为空且宽度不能超过 2^32。\");\n\t}\n\tconst crypto = globalThis.crypto;\n\tconst hasWebCrypto = typeof crypto?.getRandomValues === \"function\";\n\n\t// 只接受可以被区间宽度整除的最大 2^32 前缀,消除取模偏差。\n\tconst limit = Math.floor(uint32Range / range) * range;\n\tconst values = new Uint32Array(1);\n\tlet sample: number;\n\tdo {\n\t\tif (hasWebCrypto) crypto.getRandomValues(values);\n\t\telse values[0] = Math.floor(Math.random() * uint32Range);\n\t\tsample = values[0] ?? uint32Range;\n\t} while (sample >= limit);\n\treturn minimum + (sample % range);\n}\n","import { type DecodedText, createDecodedText, encodeUtf8, getTextDecoder } from \"../internal/text\";\nimport { randomInt } from \"../number/index\";\n\nexport type { DecodedText } from \"../internal/text\";\n\nconst alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n/** 内部共享解码器支持的两种字符表规则。 */\ntype Base64Variant = \"standard\" | \"url\";\n\n/**\n * 创建统一的 Base64 输入错误。\n *\n * @param variant - 当前解析的标准 Base64 或 Base64URL 变体。\n * @returns 带有具体变体名称的 `TypeError`。\n */\nconst invalidBase64 = (variant: Base64Variant): TypeError => {\n\treturn new TypeError(`该值不是有效的 ${variant === \"url\" ? \"Base64URL\" : \"Base64\"}。`);\n};\n\n/**\n * 校验并规范化 Base64 文本。\n *\n * @remarks 标准 Base64 允许 ASCII 空白,Base64URL 不允许;两者最终都会转换为标准字符表和完整填充。\n * @param value - 原始编码文本。\n * @param variant - 需要应用的字符表与空白规则。\n * @returns 使用标准字符表且长度为 4 倍数的文本。\n * @throws `TypeError` 当字符、填充位置或编码长度非法。\n */\nconst normalizeBase64 = (value: string, variant: Base64Variant): string => {\n\tconst withoutWhitespace = variant === \"standard\" ? value.replace(/[\\t\\n\\f\\r ]+/gu, \"\") : value;\n\tconst pattern = variant === \"url\" ? /^[\\w-]*={0,2}$/u : /^[A-Za-z\\d+/]*={0,2}$/u;\n\tif (!pattern.test(withoutWhitespace) || withoutWhitespace.length % 4 === 1) throw invalidBase64(variant);\n\tif (withoutWhitespace.includes(\"=\") && withoutWhitespace.length % 4 !== 0) throw invalidBase64(variant);\n\n\tconst standard = (variant === \"url\" ? withoutWhitespace.replace(/-/gu, \"+\").replace(/_/gu, \"/\") : withoutWhitespace).replace(/=+$/u, \"\");\n\treturn standard.padEnd(Math.ceil(standard.length / 4) * 4, \"=\");\n};\n\n/**\n * 使用固定字符表编码任意字节。\n *\n * @param bytes - 不会被修改的源字节。\n * @returns 带标准 `=` 填充的 Base64 文本。\n */\nconst encodeBytes = (bytes: Uint8Array): string => {\n\tlet result = \"\";\n\tfor (let index = 0; index < bytes.length; index += 3) {\n\t\tconst first = bytes[index] ?? 0;\n\t\tconst second = bytes[index + 1];\n\t\tconst third = bytes[index + 2];\n\t\tconst bitmap = (first << 16) | ((second ?? 0) << 8) | (third ?? 0);\n\t\tresult += alphabet[(bitmap >> 18) & 63] ?? \"\";\n\t\tresult += alphabet[(bitmap >> 12) & 63] ?? \"\";\n\t\tresult += second === undefined ? \"=\" : (alphabet[(bitmap >> 6) & 63] ?? \"\");\n\t\tresult += third === undefined ? \"=\" : (alphabet[bitmap & 63] ?? \"\");\n\t}\n\treturn result;\n};\n\n/**\n * 把 Base64 或 Base64URL 文本解码为字节。\n *\n * @remarks 最后一组未使用位必须为零,以拒绝同一字节序列的非规范编码。\n * @param value - 待解码文本。\n * @param variant - 输入使用的编码变体。\n * @returns 新建的字节数组。\n * @throws `TypeError` 当输入格式或尾部位非法。\n */\nconst decodeBytes = (value: string, variant: Base64Variant): Uint8Array => {\n\tconst normalized = normalizeBase64(value, variant);\n\tif (normalized.length === 0) return new Uint8Array();\n\n\tconst padding = normalized.endsWith(\"==\") ? 2 : normalized.endsWith(\"=\") ? 1 : 0;\n\tconst result = new Uint8Array((normalized.length / 4) * 3 - padding);\n\tlet outputIndex = 0;\n\n\tfor (let index = 0; index < normalized.length; index += 4) {\n\t\tconst first = alphabet.indexOf(normalized[index] ?? \"\");\n\t\tconst second = alphabet.indexOf(normalized[index + 1] ?? \"\");\n\t\tconst thirdCharacter = normalized[index + 2] ?? \"=\";\n\t\tconst fourthCharacter = normalized[index + 3] ?? \"=\";\n\t\tconst third = thirdCharacter === \"=\" ? 0 : alphabet.indexOf(thirdCharacter);\n\t\tconst fourth = fourthCharacter === \"=\" ? 0 : alphabet.indexOf(fourthCharacter);\n\t\tif (first < 0 || second < 0 || third < 0 || fourth < 0) throw invalidBase64(variant);\n\n\t\tconst isLast = index + 4 === normalized.length;\n\t\t// 填充字符对应的未使用低位必须为零,否则不同文本可以解码为同一字节序列。\n\t\tif (isLast && ((padding === 2 && (second & 15) !== 0) || (padding === 1 && (third & 3) !== 0))) {\n\t\t\tthrow invalidBase64(variant);\n\t\t}\n\n\t\tconst bitmap = (first << 18) | (second << 12) | (third << 6) | fourth;\n\t\tif (outputIndex < result.length) result[outputIndex++] = (bitmap >> 16) & 255;\n\t\tif (outputIndex < result.length) result[outputIndex++] = (bitmap >> 8) & 255;\n\t\tif (outputIndex < result.length) result[outputIndex++] = bitmap & 255;\n\t}\n\treturn result;\n};\n\n/**\n * 以 Fatal 模式解码 UTF-8。\n *\n * @param bytes - 待解码字节。\n * @returns 解码后的 JavaScript 字符串。\n * @throws `TypeError` 当字节不是有效 UTF-8;原始平台异常保存在 `cause` 中。\n */\nconst decodeUtf8 = (bytes: Uint8Array): string => {\n\tconst textDecoder = getTextDecoder();\n\ttry {\n\t\treturn textDecoder.decode(bytes);\n\t} catch (cause) {\n\t\tthrow new TypeError(\"解码后的字节不是有效的 UTF-8。\", { cause });\n\t}\n};\n\n/**\n * 将任意字节编码为标准 Base64。\n *\n * @param bytes - 不会被修改的字节序列。\n * @returns 带标准 `=` 填充的 Base64 文本。\n */\nexport function encodeBase64Bytes(bytes: Uint8Array): string {\n\treturn encodeBytes(bytes);\n}\n\n/**\n * 解码标准 Base64。\n *\n * @remarks 允许省略填充和包含 ASCII 空白,但拒绝非规范尾部位。\n * @param value - Base64 文本。\n * @returns 新建的字节数组。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function decodeBase64Bytes(value: string): Uint8Array {\n\treturn decodeBytes(value, \"standard\");\n}\n\n/**\n * 将 UTF-8 文本编码为标准 Base64。\n *\n * @param value - 任意 Unicode 字符串。\n * @returns 带标准填充的 Base64 文本。\n * @throws 缺少 Encoding API 时抛出 `Error`。\n */\nexport function encodeBase64(value: string): string {\n\treturn encodeBytes(encodeUtf8(value));\n}\n\n/**\n * 将标准 Base64 解码为 UTF-8 文本。\n *\n * @param value - Base64 文本。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串。\n * @throws Base64 或 UTF-8 非法时抛出 `TypeError`;缺少 Encoding API 时抛出 `Error`。\n */\nexport function decodeBase64(value: string): DecodedText {\n\treturn createDecodedText(decodeUtf8(decodeBase64Bytes(value)));\n}\n\n/**\n * 将任意字节编码为无填充 Base64URL。\n *\n * @param bytes - 不会被修改的字节序列。\n * @returns 仅使用 URL 安全字母表的文本。\n */\nexport function encodeBase64UrlBytes(bytes: Uint8Array): string {\n\treturn encodeBytes(bytes).replace(/\\+/gu, \"-\").replace(/\\//gu, \"_\").replace(/=+$/u, \"\");\n}\n\n/**\n * 解码 Base64URL 字节。\n *\n * @remarks 接受带填充和无填充形式,不接受空白或标准 Base64 的 `+`、`/`。\n * @param value - Base64URL 文本。\n * @returns 新建的字节数组。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function decodeBase64UrlBytes(value: string): Uint8Array {\n\treturn decodeBytes(value, \"url\");\n}\n\n/**\n * 将 UTF-8 文本编码为无填充 Base64URL。\n *\n * @param value - 任意 Unicode 字符串。\n * @returns 仅使用 URL 安全字母表的文本。\n * @throws 缺少 Encoding API 时抛出 `Error`。\n */\nexport function encodeBase64Url(value: string): string {\n\treturn encodeBase64UrlBytes(encodeUtf8(value));\n}\n\n/**\n * 将 Base64URL 解码为 UTF-8 文本。\n *\n * @param value - 带填充或无填充的 Base64URL 文本。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串。\n * @throws Base64URL 或 UTF-8 非法时抛出 `TypeError`;缺少 Encoding API 时抛出 `Error`。\n */\nexport function decodeBase64Url(value: string): DecodedText {\n\treturn createDecodedText(decodeUtf8(decodeBase64UrlBytes(value)));\n}\n\n/**\n * 把 Latin-1 文本编码为标准 Base64。\n *\n * @param value - 每个 UTF-16 码元都必须位于 0–255 的文本。\n * @returns 带标准填充的 Base64 文本。\n * @throws `TypeError` 当文本包含 Latin-1 范围外的码元。\n */\nexport function encodeLatin1Base64(value: string): string {\n\tconst bytes = new Uint8Array(value.length);\n\tfor (let index = 0; index < value.length; index += 1) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (code > 255) throw new TypeError(\"待编码字符串包含超出 Latin-1 范围的字符。\");\n\t\tbytes[index] = code;\n\t}\n\treturn encodeBase64Bytes(bytes);\n}\n\n/**\n * 把标准 Base64 解码为 Latin-1 文本。\n *\n * @param value - 标准 Base64 文本;允许 ASCII 空白和省略尾部填充。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的 Latin-1 原始字符串。\n * @throws `TypeError` 当 Base64 格式或尾部位非法。\n */\nexport function decodeLatin1Base64(value: string): DecodedText {\n\tconst bytes = decodeBase64Bytes(value);\n\tlet result = \"\";\n\tfor (const byte of bytes) result += String.fromCharCode(byte);\n\treturn createDecodedText(result);\n}\n\nconst randomPrefixAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst defaultRandomPrefixLength = 6;\n\n/** SecureBase64 兼容格式中一组不可变的字符插入位置。 */\ninterface Base64PasswordDictionaryEntry {\n\t/** 原始载荷中的固定字符索引;超出短载荷长度时忽略当前条目。 */\n\tindex: number;\n\t/** 从原始载荷复制字符的固定索引;数值属于持久化协议,不能重新计算。 */\n\trandomIndex: number;\n}\n\n/** 固定 SecureBase64 字典;索引、顺序与映射属于持久化格式,禁止修改。 */\nconst base64PasswordDictionary: readonly Readonly<Base64PasswordDictionaryEntry>[] = Object.freeze([\n\t{ index: 977, randomIndex: 188 },\n\t{ index: 926, randomIndex: 201 },\n\t{ index: 851, randomIndex: 225 },\n\t{ index: 700, randomIndex: 255 },\n\t{ index: 600, randomIndex: 268 },\n\t{ index: 500, randomIndex: 277 },\n\t{ index: 400, randomIndex: 288 },\n\t{ index: 330, randomIndex: 327 },\n\t{ index: 300, randomIndex: 180 },\n\t{ index: 200, randomIndex: 178 },\n\t{ index: 100, randomIndex: 124 },\n\t{ index: 98, randomIndex: 95 },\n\t{ index: 92, randomIndex: 90 },\n\t{ index: 91, randomIndex: 87 },\n\t{ index: 88, randomIndex: 84 },\n\t{ index: 82, randomIndex: 79 },\n\t{ index: 78, randomIndex: 71 },\n\t{ index: 72, randomIndex: 69 },\n\t{ index: 68, randomIndex: 66 },\n\t{ index: 59, randomIndex: 55 },\n\t{ index: 48, randomIndex: 43 },\n\t{ index: 42, randomIndex: 37 },\n\t{ index: 36, randomIndex: 30 },\n\t{ index: 33, randomIndex: 27 },\n\t{ index: 24, randomIndex: 20 },\n\t{ index: 23, randomIndex: 18 },\n\t{ index: 21, randomIndex: 16 },\n\t{ index: 17, randomIndex: 14 },\n\t{ index: 13, randomIndex: 9 },\n\t{ index: 7, randomIndex: 4 },\n\t{ index: 5, randomIndex: 3 },\n\t{ index: 2, randomIndex: 1 },\n]);\n\n/**\n * 校验 SecureBase64 兼容格式的前缀长度。\n *\n * @param length - 待校验的前缀字符数。\n * @throws `RangeError` 当长度不是非负安全整数。\n */\nconst assertPrefixLength = (length: number): void => {\n\tif (!Number.isSafeInteger(length) || length < 0) throw new RangeError(\"`prefixStrLength` 必须是非负安全整数。\");\n};\n\n/**\n * 生成 SecureBase64 兼容格式使用的随机前缀。\n *\n * @remarks 优先使用 Web Crypto,能力缺失时回退到 `Math.random()`。前缀只用于降低相同明文\n * 产生相同载荷的概率,本身不构成加密,也不得承担安全用途。\n * @param length - 需要生成的字符数,调用前必须完成校验。\n * @returns 由历史字母表组成的文本。\n */\nconst createRandomPrefix = (length: number): string => {\n\tlet result = \"\";\n\tfor (let index = 0; index < length; index += 1) {\n\t\tresult += randomPrefixAlphabet[randomInt(0, randomPrefixAlphabet.length)] ?? \"\";\n\t}\n\treturn result;\n};\n\n/**\n * 按固定字典向 Base64 文本插入冗余字符。\n *\n * @remarks 字典按高索引到低索引排列,确保插入不会改变尚未处理的位置。\n * @param base64Value - 尚未插入兼容字典字符的 Base64 文本。\n * @returns 与旧持久化格式兼容的 SecureBase64 载荷。\n */\nconst insertDictionaryCharacters = (base64Value: string): string => {\n\tlet result = base64Value;\n\tfor (const item of base64PasswordDictionary) {\n\t\tif (item.index >= base64Value.length) continue;\n\t\t// 旧字典的 index=100 项会在 101–124 字符载荷中越界;退回末字符可保持单字符插入协议,旧解码器仍能移除。\n\t\tconst character = base64Value[item.randomIndex] ?? base64Value.at(-1) ?? \"\";\n\t\tresult = result.slice(0, item.index) + character + result.slice(item.index);\n\t}\n\treturn result;\n};\n\n/**\n * 移除历史字典插入的冗余字符。\n *\n * @param base64Value - 已移除随机前缀的 SecureBase64 载荷。\n * @returns 可交给标准 Base64 解码器的文本。\n */\nconst removeDictionaryCharacters = (base64Value: string): string => {\n\tlet result = base64Value;\n\tfor (let index = base64PasswordDictionary.length - 1; index >= 0; index -= 1) {\n\t\tconst item = base64PasswordDictionary[index];\n\t\tif (item !== undefined && item.index < base64Value.length) result = result.slice(0, item.index) + result.slice(item.index + 1);\n\t}\n\treturn result;\n};\n\n/**\n * 使用固定字典和随机前缀编码文本。\n *\n * @remarks 给定相同的 6 字符前缀时,默认输出与旧有效载荷逐字符兼容。旧字典在 101–124 字符载荷中引用越界;这里复制末字符作为单字符回退,\n * 使旧删除字典流程仍能解码。传入 `0` 会同时关闭随机前缀与字典插入。\n * 该格式只是可逆编码,不提供加密、完整性或身份认证。\n * @param value - 任意可由 `encodeURIComponent` 处理的 Unicode 文本。\n * @param prefixLength - 随机字母前缀长度;默认 `6`。\n * @returns 带随机前缀和兼容字典字符的 Base64 文本;空输入返回空字符串。\n * @throws `RangeError` 当前缀长度不是非负安全整数;输入包含孤立代理项时保留平台错误。\n */\nexport function encodeSecureBase64(value: string, prefixLength: number = defaultRandomPrefixLength): string {\n\tif (value.length === 0) return \"\";\n\tassertPrefixLength(prefixLength);\n\tconst prefix = createRandomPrefix(prefixLength);\n\tlet encoded = encodeLatin1Base64(encodeURIComponent(value));\n\tif (prefixLength !== 0) encoded = insertDictionaryCharacters(encoded);\n\treturn prefix + encoded;\n}\n\n/**\n * 解码 {@link encodeSecureBase64} 生成的 SecureBase64 兼容格式。\n *\n * @param value - SecureBase64 文本;必须使用与编码时相同的前缀长度。\n * @param prefixLength - 需要移除的前缀长度;默认 `6`,传入 `0` 时不移除字典字符。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串;空输入返回空字符串。\n * @throws `RangeError` 当前缀长度不是非负安全整数;载荷、Base64 或 URI 编码非法时抛出 `TypeError` 或 `URIError`。\n */\nexport function decodeSecureBase64(value: string, prefixLength: number = defaultRandomPrefixLength): DecodedText {\n\tif (value.length === 0) return createDecodedText(\"\");\n\tassertPrefixLength(prefixLength);\n\tif (prefixLength > value.length) throw new TypeError(\"Base64 值的长度小于配置的前缀长度。\");\n\tlet encoded = value.slice(prefixLength);\n\tif (prefixLength !== 0) encoded = removeDictionaryCharacters(encoded);\n\treturn createDecodedText(decodeURIComponent(decodeLatin1Base64(encoded)));\n}\n","/** 0 至 255 范围的 RGB 颜色。 */\nexport interface RgbColor {\n\t/** 蓝色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tblue: number;\n\t/** 绿色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tgreen: number;\n\t/** 红色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tred: number;\n}\n\n/** 带 0 至 1 Alpha 通道的 RGB 颜色。 */\nexport interface RgbaColor extends RgbColor {\n\t/** 不透明度;必须是闭区间 `[0, 1]` 内的有限数,`0` 完全透明,`1` 完全不透明。 */\n\talpha: number;\n}\n\n/**\n * 校验 RGB 颜色通道。\n *\n * @param value - 待校验通道值。\n * @param channel - 用于错误消息的通道名称。\n * @throws `RangeError` 当值非有限或超出 0 至 255。\n */\nconst assertRgbChannel = (value: number, channel: string): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 255) {\n\t\tthrow new RangeError(`\\`${channel}\\` 必须是 0 到 255 之间的有限数。`);\n\t}\n};\n\n/**\n * 校验透明度通道。\n *\n * @param value - 待校验 Alpha 值。\n * @throws `RangeError` 当值非有限或超出闭区间 `[0, 1]`。\n */\nconst assertAlpha = (value: number): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 1) {\n\t\tthrow new RangeError(\"`alpha` 必须是 0 到 1 之间的有限数。\");\n\t}\n};\n\n/**\n * 规范化十六进制颜色文本。\n *\n * @param value - 可带 `#` 的 3、4、6 或 8 位颜色文本。\n * @returns 不带 `#` 的 6 或 8 位文本。\n * @throws `TypeError` 当长度或字符不符合十六进制颜色格式。\n */\nconst normalizeHexColor = (value: string): string => {\n\tconst normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\tif (![3, 4, 6, 8].includes(normalized.length) || !/^[\\dA-F]+$/iu.test(normalized)) {\n\t\tthrow new TypeError(\"十六进制颜色必须包含 3、4、6 或 8 个十六进制字符。\");\n\t}\n\treturn normalized.length <= 4 ? Array.from(normalized, (character) => `${character}${character}`).join(\"\") : normalized;\n};\n\n/**\n * 格式化单个颜色通道。\n *\n * @param value - 已校验的 0 至 255 通道值。\n * @returns 舍入后的两位小写十六进制文本。\n */\nconst formatHexChannel = (value: number): string => Math.round(value).toString(16).padStart(2, \"0\");\n\n/**\n * 解析可带可不带 `#` 的 `rgb`、`rgba`、`rrggbb` 或 `rrggbbaa`。\n *\n * @param value - 十六进制颜色文本。\n * @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function parseHexColor(value: string): RgbaColor {\n\tconst normalized = normalizeHexColor(value);\n\treturn {\n\t\tred: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tgreen: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tblue: Number.parseInt(normalized.slice(4, 6), 16),\n\t\talpha: normalized.length === 8 ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1,\n\t};\n}\n\n/**\n * 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。\n *\n * @param color - 颜色通道;RGB 会四舍五入到最近整数。\n * @param includeAlpha - 是否输出 Alpha;默认只在传入 Alpha 且小于 1 时输出。\n * @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。\n * @throws 通道或 Alpha 非法时抛出 `RangeError`。\n */\nexport function formatHexColor(color: RgbColor | RgbaColor, includeAlpha: boolean = \"alpha\" in color && color.alpha < 1): string {\n\tassertRgbChannel(color.red, \"red\");\n\tassertRgbChannel(color.green, \"green\");\n\tassertRgbChannel(color.blue, \"blue\");\n\tconst alpha = \"alpha\" in color ? color.alpha : 1;\n\tassertAlpha(alpha);\n\tconst rgb = `${formatHexChannel(color.red)}${formatHexChannel(color.green)}${formatHexChannel(color.blue)}`;\n\treturn `#${rgb}${includeAlpha ? formatHexChannel(alpha * 255) : \"\"}`;\n}\n\n/**\n * 线性混合两种十六进制颜色,包括 Alpha 通道。\n *\n * @param first - `amount = 0` 时的颜色。\n * @param second - `amount = 1` 时的颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。\n * @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。\n */\nexport function mixHexColors(first: string, second: string, amount: number): string {\n\tif (!Number.isFinite(amount) || amount < 0 || amount > 1) {\n\t\tthrow new RangeError(\"`amount` 必须是 0 到 1 之间的有限数。\");\n\t}\n\tconst left = parseHexColor(first);\n\tconst right = parseHexColor(second);\n\t/**\n\t * 在单个 RGBA 通道上执行与外层相同权重的线性混合。\n\t *\n\t * @param start - 第一个颜色的通道值。\n\t * @param end - 第二个颜色的通道值。\n\t * @returns 按外层 `amount` 线性混合后的通道值。\n\t */\n\tconst mix = (start: number, end: number): number => start + (end - start) * amount;\n\treturn formatHexColor(\n\t\t{\n\t\t\tred: mix(left.red, right.red),\n\t\t\tgreen: mix(left.green, right.green),\n\t\t\tblue: mix(left.blue, right.blue),\n\t\t\talpha: mix(left.alpha, right.alpha),\n\t\t},\n\t\tleft.alpha < 1 || right.alpha < 1\n\t);\n}\n\n/**\n * 按比例向黑色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithBlack(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#000000\", amount);\n}\n\n/**\n * 按比例向白色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithWhite(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#ffffff\", amount);\n}\n\n/**\n * 按 WCAG sRGB 转换曲线线性化颜色通道。\n *\n * @param channel - 已校验的 0 至 255 通道值。\n * @returns 0 至 1 的线性光值。\n */\nconst linearizeSrgbChannel = (channel: number): number => {\n\tconst value = channel / 255;\n\treturn value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n};\n\n/**\n * 计算 WCAG sRGB 相对亮度。\n *\n * @remarks Alpha 通道不会参与计算;半透明颜色应先与实际背景混合。\n * @param color - 合法十六进制颜色。\n * @returns 0 至 1 的相对亮度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function relativeLuminance(color: string): number {\n\tconst { red, green, blue } = parseHexColor(color);\n\treturn 0.2126 * linearizeSrgbChannel(red) + 0.7152 * linearizeSrgbChannel(green) + 0.0722 * linearizeSrgbChannel(blue);\n}\n\n/**\n * 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。\n *\n * @remarks 返回比值本身,不代表特定字号或 WCAG 等级必然通过。\n * @param first - 第一种十六进制颜色。\n * @param second - 第二种十六进制颜色。\n * @returns 较亮颜色与较暗颜色的对比度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function contrastRatio(first: string, second: string): number {\n\tconst firstLuminance = relativeLuminance(first);\n\tconst secondLuminance = relativeLuminance(second);\n\tconst lighter = Math.max(firstLuminance, secondLuminance);\n\tconst darker = Math.min(firstLuminance, secondLuminance);\n\treturn (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * 从两个候选颜色中选择与背景对比度更高的一项。\n *\n * @param background - 实际不透明背景色。\n * @param first - 第一候选,默认黑色。\n * @param second - 第二候选,默认白色。\n * @returns 对比度较高的原始候选字符串;相同时返回 `first`。\n * @throws 任一颜色非法时抛出 `TypeError`。\n */\nexport function pickHigherContrastColor(background: string, first = \"#000000\", second = \"#ffffff\"): string {\n\treturn contrastRatio(background, first) >= contrastRatio(background, second) ? first : second;\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/*globals window, global, require*/\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\n\t var crypto;\n\n\t // Native crypto from window (Browser)\n\t if (typeof window !== 'undefined' && window.crypto) {\n\t crypto = window.crypto;\n\t }\n\n\t // Native crypto in web worker (Browser)\n\t if (typeof self !== 'undefined' && self.crypto) {\n\t crypto = self.crypto;\n\t }\n\n\t // Native crypto from worker\n\t if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n\t crypto = globalThis.crypto;\n\t }\n\n\t // Native (experimental IE 11) crypto from window (Browser)\n\t if (!crypto && typeof window !== 'undefined' && window.msCrypto) {\n\t crypto = window.msCrypto;\n\t }\n\n\t // Native crypto from global (NodeJS)\n\t if (!crypto && typeof global !== 'undefined' && global.crypto) {\n\t crypto = global.crypto;\n\t }\n\n\t // Native crypto import via require (NodeJS)\n\t if (!crypto && typeof require === 'function') {\n\t try {\n\t crypto = require('crypto');\n\t } catch (err) {}\n\t }\n\n\t /*\n\t * Cryptographically secure pseudorandom number generator\n\t *\n\t * As Math.random() is cryptographically not safe to use\n\t */\n\t var cryptoSecureRandomInt = function () {\n\t if (crypto) {\n\t // Use getRandomValues method (Browser)\n\t if (typeof crypto.getRandomValues === 'function') {\n\t try {\n\t return crypto.getRandomValues(new Uint32Array(1))[0];\n\t } catch (err) {}\n\t }\n\n\t // Use randomBytes method (NodeJS)\n\t if (typeof crypto.randomBytes === 'function') {\n\t try {\n\t return crypto.randomBytes(4).readInt32LE();\n\t } catch (err) {}\n\t }\n\t }\n\n\t throw new Error('Native crypto module could not be used to get secure random number.');\n\t };\n\n\t /*\n\t * Local polyfill of Object.create\n\n\t */\n\t var create = Object.create || (function () {\n\t function F() {}\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }());\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var j = 0; j < thatSigBytes; j += 4) {\n\t thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t for (var i = 0; i < nBytes; i += 4) {\n\t words.push(cryptoSecureRandomInt());\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t var processedWords;\n\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var C_enc = C.enc;\n\n\t /**\n\t * Base64 encoding strategy.\n\t */\n\t var Base64 = C_enc.Base64 = {\n\t /**\n\t * Converts a word array to a Base64 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Base64 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\t var map = this._map;\n\n\t // Clamp excess bits\n\t wordArray.clamp();\n\n\t // Convert\n\t var base64Chars = [];\n\t for (var i = 0; i < sigBytes; i += 3) {\n\t var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t }\n\t }\n\n\t // Add padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t while (base64Chars.length % 4) {\n\t base64Chars.push(paddingChar);\n\t }\n\t }\n\n\t return base64Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Base64 string to a word array.\n\t *\n\t * @param {string} base64Str The Base64 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t */\n\t parse: function (base64Str) {\n\t // Shortcuts\n\t var base64StrLength = base64Str.length;\n\t var map = this._map;\n\t var reverseMap = this._reverseMap;\n\n\t if (!reverseMap) {\n\t reverseMap = this._reverseMap = [];\n\t for (var j = 0; j < map.length; j++) {\n\t reverseMap[map.charCodeAt(j)] = j;\n\t }\n\t }\n\n\t // Ignore padding\n\t var paddingChar = map.charAt(64);\n\t if (paddingChar) {\n\t var paddingIndex = base64Str.indexOf(paddingChar);\n\t if (paddingIndex !== -1) {\n\t base64StrLength = paddingIndex;\n\t }\n\t }\n\n\t // Convert\n\t return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t },\n\n\t _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t };\n\n\t function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t var words = [];\n\t var nBytes = 0;\n\t for (var i = 0; i < base64StrLength; i++) {\n\t if (i % 4) {\n\t var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t var bitsCombined = bits1 | bits2;\n\t words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);\n\t nBytes++;\n\t }\n\t }\n\t return WordArray.create(words, nBytes);\n\t }\n\t}());\n\n\n\treturn CryptoJS.enc.Base64;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Constants table\n\t var T = [];\n\n\t // Compute constants\n\t (function () {\n\t for (var i = 0; i < 64; i++) {\n\t T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t }\n\t }());\n\n\t /**\n\t * MD5 hash algorithm.\n\t */\n\t var MD5 = C_algo.MD5 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Swap endian\n\t for (var i = 0; i < 16; i++) {\n\t // Shortcuts\n\t var offset_i = offset + i;\n\t var M_offset_i = M[offset_i];\n\n\t M[offset_i] = (\n\t (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)\n\t );\n\t }\n\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var M_offset_0 = M[offset + 0];\n\t var M_offset_1 = M[offset + 1];\n\t var M_offset_2 = M[offset + 2];\n\t var M_offset_3 = M[offset + 3];\n\t var M_offset_4 = M[offset + 4];\n\t var M_offset_5 = M[offset + 5];\n\t var M_offset_6 = M[offset + 6];\n\t var M_offset_7 = M[offset + 7];\n\t var M_offset_8 = M[offset + 8];\n\t var M_offset_9 = M[offset + 9];\n\t var M_offset_10 = M[offset + 10];\n\t var M_offset_11 = M[offset + 11];\n\t var M_offset_12 = M[offset + 12];\n\t var M_offset_13 = M[offset + 13];\n\t var M_offset_14 = M[offset + 14];\n\t var M_offset_15 = M[offset + 15];\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\n\t // Computation\n\t a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n\t d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n\t c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n\t b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n\t a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n\t d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n\t c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n\t b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n\t a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n\t d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n\t c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n\t d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n\t d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n\t c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n\t a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n\t d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n\t c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n\t a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n\t d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n\t c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n\t b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n\t a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n\t d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n\t c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n\t b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n\t d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n\t c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n\t d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n\t c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n\t b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n\t d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n\t c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n\t b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n\t a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n\t d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n\t a = II(a, b, c, d, M_offset_0, 6, T[48]);\n\t d = II(d, a, b, c, M_offset_7, 10, T[49]);\n\t c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t b = II(b, c, d, a, M_offset_5, 21, T[51]);\n\t a = II(a, b, c, d, M_offset_12, 6, T[52]);\n\t d = II(d, a, b, c, M_offset_3, 10, T[53]);\n\t c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t b = II(b, c, d, a, M_offset_1, 21, T[55]);\n\t a = II(a, b, c, d, M_offset_8, 6, T[56]);\n\t d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t c = II(c, d, a, b, M_offset_6, 15, T[58]);\n\t b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t a = II(a, b, c, d, M_offset_4, 6, T[60]);\n\t d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t c = II(c, d, a, b, M_offset_2, 15, T[62]);\n\t b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t var nBitsTotalL = nBitsTotal;\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)\n\t );\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)\n\t );\n\n\t data.sigBytes = (dataWords.length + 1) * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Shortcuts\n\t var hash = this._hash;\n\t var H = hash.words;\n\n\t // Swap endian\n\t for (var i = 0; i < 4; i++) {\n\t // Shortcut\n\t var H_i = H[i];\n\n\t H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |\n\t (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);\n\t }\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t function FF(a, b, c, d, x, s, t) {\n\t var n = a + ((b & c) | (~b & d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function GG(a, b, c, d, x, s, t) {\n\t var n = a + ((b & d) | (c & ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function HH(a, b, c, d, x, s, t) {\n\t var n = a + (b ^ c ^ d) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t function II(a, b, c, d, x, s, t) {\n\t var n = a + (c ^ (b | ~d)) + x + t;\n\t return ((n << s) | (n >>> (32 - s))) + b;\n\t }\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.MD5('message');\n\t * var hash = CryptoJS.MD5(wordArray);\n\t */\n\t C.MD5 = Hasher._createHelper(MD5);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacMD5(message, key);\n\t */\n\t C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\treturn CryptoJS.MD5;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var WordArray = C_lib.WordArray;\n\t var Hasher = C_lib.Hasher;\n\t var C_algo = C.algo;\n\n\t // Reusable object\n\t var W = [];\n\n\t /**\n\t * SHA-1 hash algorithm.\n\t */\n\t var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new WordArray.init([\n\t 0x67452301, 0xefcdab89,\n\t 0x98badcfe, 0x10325476,\n\t 0xc3d2e1f0\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcut\n\t var H = this._hash.words;\n\n\t // Working variables\n\t var a = H[0];\n\t var b = H[1];\n\t var c = H[2];\n\t var d = H[3];\n\t var e = H[4];\n\n\t // Computation\n\t for (var i = 0; i < 80; i++) {\n\t if (i < 16) {\n\t W[i] = M[offset + i] | 0;\n\t } else {\n\t var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t W[i] = (n << 1) | (n >>> 31);\n\t }\n\n\t var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t if (i < 20) {\n\t t += ((b & c) | (~b & d)) + 0x5a827999;\n\t } else if (i < 40) {\n\t t += (b ^ c ^ d) + 0x6ed9eba1;\n\t } else if (i < 60) {\n\t t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t } else /* if (i < 80) */ {\n\t t += (b ^ c ^ d) - 0x359d3e2a;\n\t }\n\n\t e = d;\n\t d = c;\n\t c = (b << 30) | (b >>> 2);\n\t b = a;\n\t a = t;\n\t }\n\n\t // Intermediate hash value\n\t H[0] = (H[0] + a) | 0;\n\t H[1] = (H[1] + b) | 0;\n\t H[2] = (H[2] + c) | 0;\n\t H[3] = (H[3] + d) | 0;\n\t H[4] = (H[4] + e) | 0;\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Return final computed hash\n\t return this._hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t }\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA1('message');\n\t * var hash = CryptoJS.SHA1(wordArray);\n\t */\n\t C.SHA1 = Hasher._createHelper(SHA1);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA1(message, key);\n\t */\n\t C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var C_algo = C.algo;\n\t var MD5 = C_algo.MD5;\n\n\t /**\n\t * This key derivation function is meant to conform with EVP_BytesToKey.\n\t * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t */\n\t var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t * @property {number} iterations The number of iterations to perform. Default: 1\n\t */\n\t cfg: Base.extend({\n\t keySize: 128/32,\n\t hasher: MD5,\n\t iterations: 1\n\t }),\n\n\t /**\n\t * Initializes a newly created key derivation function.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t *\n\t * @example\n\t *\n\t * var kdf = CryptoJS.algo.EvpKDF.create();\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t */\n\t init: function (cfg) {\n\t this.cfg = this.cfg.extend(cfg);\n\t },\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @example\n\t *\n\t * var key = kdf.compute(password, salt);\n\t */\n\t compute: function (password, salt) {\n\t var block;\n\n\t // Shortcut\n\t var cfg = this.cfg;\n\n\t // Init hasher\n\t var hasher = cfg.hasher.create();\n\n\t // Initial values\n\t var derivedKey = WordArray.create();\n\n\t // Shortcuts\n\t var derivedKeyWords = derivedKey.words;\n\t var keySize = cfg.keySize;\n\t var iterations = cfg.iterations;\n\n\t // Generate key\n\t while (derivedKeyWords.length < keySize) {\n\t if (block) {\n\t hasher.update(block);\n\t }\n\t block = hasher.update(password).finalize(salt);\n\t hasher.reset();\n\n\t // Iterations\n\t for (var i = 1; i < iterations; i++) {\n\t block = hasher.finalize(block);\n\t hasher.reset();\n\t }\n\n\t derivedKey.concat(block);\n\t }\n\t derivedKey.sigBytes = keySize * 4;\n\n\t return derivedKey;\n\t }\n\t });\n\n\t /**\n\t * Derives a key from a password.\n\t *\n\t * @param {WordArray|string} password The password.\n\t * @param {WordArray|string} salt A salt.\n\t * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t *\n\t * @return {WordArray} The derived key.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var key = CryptoJS.EvpKDF(password, salt);\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t */\n\t C.EvpKDF = function (password, salt, cfg) {\n\t return EvpKDF.create(cfg).compute(password, salt);\n\t };\n\t}());\n\n\n\treturn CryptoJS.EvpKDF;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./evpkdf\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./evpkdf\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var WordArray = C_lib.WordArray;\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var Base64 = C_enc.Base64;\n\t var C_algo = C.algo;\n\t var EvpKDF = C_algo.EvpKDF;\n\n\t /**\n\t * Abstract base cipher template.\n\t *\n\t * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t */\n\t var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {WordArray} iv The IV to use for this operation.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Creates this cipher in encryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createEncryptor: function (key, cfg) {\n\t return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Creates this cipher in decryption mode.\n\t *\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {Cipher} A cipher instance.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t */\n\t createDecryptor: function (key, cfg) {\n\t return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t },\n\n\t /**\n\t * Initializes a newly created cipher.\n\t *\n\t * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @example\n\t *\n\t * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t */\n\t init: function (xformMode, key, cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Store transform mode and key\n\t this._xformMode = xformMode;\n\t this._key = key;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this cipher to its initial state.\n\t *\n\t * @example\n\t *\n\t * cipher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-cipher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Adds data to be encrypted or decrypted.\n\t *\n\t * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.process('data');\n\t * var encrypted = cipher.process(wordArray);\n\t */\n\t process: function (dataUpdate) {\n\t // Append\n\t this._append(dataUpdate);\n\n\t // Process available blocks\n\t return this._process();\n\t },\n\n\t /**\n\t * Finalizes the encryption or decryption process.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t *\n\t * @return {WordArray} The data after final processing.\n\t *\n\t * @example\n\t *\n\t * var encrypted = cipher.finalize();\n\t * var encrypted = cipher.finalize('data');\n\t * var encrypted = cipher.finalize(wordArray);\n\t */\n\t finalize: function (dataUpdate) {\n\t // Final data update\n\t if (dataUpdate) {\n\t this._append(dataUpdate);\n\t }\n\n\t // Perform concrete-cipher logic\n\t var finalProcessedData = this._doFinalize();\n\n\t return finalProcessedData;\n\t },\n\n\t keySize: 128/32,\n\n\t ivSize: 128/32,\n\n\t _ENC_XFORM_MODE: 1,\n\n\t _DEC_XFORM_MODE: 2,\n\n\t /**\n\t * Creates shortcut functions to a cipher's object interface.\n\t *\n\t * @param {Cipher} cipher The cipher to create a helper for.\n\t *\n\t * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t */\n\t _createHelper: (function () {\n\t function selectCipherStrategy(key) {\n\t if (typeof key == 'string') {\n\t return PasswordBasedCipher;\n\t } else {\n\t return SerializableCipher;\n\t }\n\t }\n\n\t return function (cipher) {\n\t return {\n\t encrypt: function (message, key, cfg) {\n\t return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t },\n\n\t decrypt: function (ciphertext, key, cfg) {\n\t return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t }\n\t };\n\t };\n\t }())\n\t });\n\n\t /**\n\t * Abstract base stream cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t */\n\t var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t _doFinalize: function () {\n\t // Process partial blocks\n\t var finalProcessedBlocks = this._process(!!'flush');\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 1\n\t });\n\n\t /**\n\t * Mode namespace.\n\t */\n\t var C_mode = C.mode = {};\n\n\t /**\n\t * Abstract base block cipher mode template.\n\t */\n\t var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t /**\n\t * Creates this mode for encryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t */\n\t createEncryptor: function (cipher, iv) {\n\t return this.Encryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Creates this mode for decryption.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t */\n\t createDecryptor: function (cipher, iv) {\n\t return this.Decryptor.create(cipher, iv);\n\t },\n\n\t /**\n\t * Initializes a newly created mode.\n\t *\n\t * @param {Cipher} cipher A block cipher instance.\n\t * @param {Array} iv The IV words.\n\t *\n\t * @example\n\t *\n\t * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t */\n\t init: function (cipher, iv) {\n\t this._cipher = cipher;\n\t this._iv = iv;\n\t }\n\t });\n\n\t /**\n\t * Cipher Block Chaining mode.\n\t */\n\t var CBC = C_mode.CBC = (function () {\n\t /**\n\t * Abstract base CBC mode.\n\t */\n\t var CBC = BlockCipherMode.extend();\n\n\t /**\n\t * CBC encryptor.\n\t */\n\t CBC.Encryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // XOR and encrypt\n\t xorBlock.call(this, words, offset, blockSize);\n\t cipher.encryptBlock(words, offset);\n\n\t // Remember this block to use with next block\n\t this._prevBlock = words.slice(offset, offset + blockSize);\n\t }\n\t });\n\n\t /**\n\t * CBC decryptor.\n\t */\n\t CBC.Decryptor = CBC.extend({\n\t /**\n\t * Processes the data block at offset.\n\t *\n\t * @param {Array} words The data words to operate on.\n\t * @param {number} offset The offset where the block starts.\n\t *\n\t * @example\n\t *\n\t * mode.processBlock(data.words, offset);\n\t */\n\t processBlock: function (words, offset) {\n\t // Shortcuts\n\t var cipher = this._cipher;\n\t var blockSize = cipher.blockSize;\n\n\t // Remember this block to use with next block\n\t var thisBlock = words.slice(offset, offset + blockSize);\n\n\t // Decrypt and XOR\n\t cipher.decryptBlock(words, offset);\n\t xorBlock.call(this, words, offset, blockSize);\n\n\t // This block becomes the previous block\n\t this._prevBlock = thisBlock;\n\t }\n\t });\n\n\t function xorBlock(words, offset, blockSize) {\n\t var block;\n\n\t // Shortcut\n\t var iv = this._iv;\n\n\t // Choose mixing block\n\t if (iv) {\n\t block = iv;\n\n\t // Remove IV for subsequent blocks\n\t this._iv = undefined;\n\t } else {\n\t block = this._prevBlock;\n\t }\n\n\t // XOR blocks\n\t for (var i = 0; i < blockSize; i++) {\n\t words[offset + i] ^= block[i];\n\t }\n\t }\n\n\t return CBC;\n\t }());\n\n\t /**\n\t * Padding namespace.\n\t */\n\t var C_pad = C.pad = {};\n\n\t /**\n\t * PKCS #5/7 padding strategy.\n\t */\n\t var Pkcs7 = C_pad.Pkcs7 = {\n\t /**\n\t * Pads data using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to pad.\n\t * @param {number} blockSize The multiple that the data should be padded to.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t */\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Create padding word\n\t var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t // Create padding\n\t var paddingWords = [];\n\t for (var i = 0; i < nPaddingBytes; i += 4) {\n\t paddingWords.push(paddingWord);\n\t }\n\t var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t // Add padding\n\t data.concat(padding);\n\t },\n\n\t /**\n\t * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t *\n\t * @param {WordArray} data The data to unpad.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t */\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t };\n\n\t /**\n\t * Abstract base block cipher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t */\n\t var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Mode} mode The block mode to use. Default: CBC\n\t * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t */\n\t cfg: Cipher.cfg.extend({\n\t mode: CBC,\n\t padding: Pkcs7\n\t }),\n\n\t reset: function () {\n\t var modeCreator;\n\n\t // Reset cipher\n\t Cipher.reset.call(this);\n\n\t // Shortcuts\n\t var cfg = this.cfg;\n\t var iv = cfg.iv;\n\t var mode = cfg.mode;\n\n\t // Reset block mode\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t modeCreator = mode.createEncryptor;\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t modeCreator = mode.createDecryptor;\n\t // Keep at least one block in the buffer for unpadding\n\t this._minBufferSize = 1;\n\t }\n\n\t if (this._mode && this._mode.__creator == modeCreator) {\n\t this._mode.init(this, iv && iv.words);\n\t } else {\n\t this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t this._mode.__creator = modeCreator;\n\t }\n\t },\n\n\t _doProcessBlock: function (words, offset) {\n\t this._mode.processBlock(words, offset);\n\t },\n\n\t _doFinalize: function () {\n\t var finalProcessedBlocks;\n\n\t // Shortcut\n\t var padding = this.cfg.padding;\n\n\t // Finalize\n\t if (this._xformMode == this._ENC_XFORM_MODE) {\n\t // Pad data\n\t padding.pad(this._data, this.blockSize);\n\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\t } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t // Process final blocks\n\t finalProcessedBlocks = this._process(!!'flush');\n\n\t // Unpad data\n\t padding.unpad(finalProcessedBlocks);\n\t }\n\n\t return finalProcessedBlocks;\n\t },\n\n\t blockSize: 128/32\n\t });\n\n\t /**\n\t * A collection of cipher parameters.\n\t *\n\t * @property {WordArray} ciphertext The raw ciphertext.\n\t * @property {WordArray} key The key to this ciphertext.\n\t * @property {WordArray} iv The IV used in the ciphering operation.\n\t * @property {WordArray} salt The salt used with a key derivation function.\n\t * @property {Cipher} algorithm The cipher algorithm.\n\t * @property {Mode} mode The block mode used in the ciphering operation.\n\t * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t * @property {number} blockSize The block size of the cipher.\n\t * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t */\n\t var CipherParams = C_lib.CipherParams = Base.extend({\n\t /**\n\t * Initializes a newly created cipher params object.\n\t *\n\t * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.lib.CipherParams.create({\n\t * ciphertext: ciphertextWordArray,\n\t * key: keyWordArray,\n\t * iv: ivWordArray,\n\t * salt: saltWordArray,\n\t * algorithm: CryptoJS.algo.AES,\n\t * mode: CryptoJS.mode.CBC,\n\t * padding: CryptoJS.pad.PKCS7,\n\t * blockSize: 4,\n\t * formatter: CryptoJS.format.OpenSSL\n\t * });\n\t */\n\t init: function (cipherParams) {\n\t this.mixIn(cipherParams);\n\t },\n\n\t /**\n\t * Converts this cipher params object to a string.\n\t *\n\t * @param {Format} formatter (Optional) The formatting strategy to use.\n\t *\n\t * @return {string} The stringified cipher params.\n\t *\n\t * @throws Error If neither the formatter nor the default formatter is set.\n\t *\n\t * @example\n\t *\n\t * var string = cipherParams + '';\n\t * var string = cipherParams.toString();\n\t * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t */\n\t toString: function (formatter) {\n\t return (formatter || this.formatter).stringify(this);\n\t }\n\t });\n\n\t /**\n\t * Format namespace.\n\t */\n\t var C_format = C.format = {};\n\n\t /**\n\t * OpenSSL formatting strategy.\n\t */\n\t var OpenSSLFormatter = C_format.OpenSSL = {\n\t /**\n\t * Converts a cipher params object to an OpenSSL-compatible string.\n\t *\n\t * @param {CipherParams} cipherParams The cipher params object.\n\t *\n\t * @return {string} The OpenSSL-compatible string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t */\n\t stringify: function (cipherParams) {\n\t var wordArray;\n\n\t // Shortcuts\n\t var ciphertext = cipherParams.ciphertext;\n\t var salt = cipherParams.salt;\n\n\t // Format\n\t if (salt) {\n\t wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t } else {\n\t wordArray = ciphertext;\n\t }\n\n\t return wordArray.toString(Base64);\n\t },\n\n\t /**\n\t * Converts an OpenSSL-compatible string to a cipher params object.\n\t *\n\t * @param {string} openSSLStr The OpenSSL-compatible string.\n\t *\n\t * @return {CipherParams} The cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t */\n\t parse: function (openSSLStr) {\n\t var salt;\n\n\t // Parse base64\n\t var ciphertext = Base64.parse(openSSLStr);\n\n\t // Shortcut\n\t var ciphertextWords = ciphertext.words;\n\n\t // Test for salt\n\t if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t // Extract salt\n\t salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t // Remove salt from ciphertext\n\t ciphertextWords.splice(0, 4);\n\t ciphertext.sigBytes -= 16;\n\t }\n\n\t return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t */\n\t var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t */\n\t cfg: Base.extend({\n\t format: OpenSSLFormatter\n\t }),\n\n\t /**\n\t * Encrypts a message.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Encrypt\n\t var encryptor = cipher.createEncryptor(key, cfg);\n\t var ciphertext = encryptor.finalize(message);\n\n\t // Shortcut\n\t var cipherCfg = encryptor.cfg;\n\n\t // Create and return serializable cipher params\n\t return CipherParams.create({\n\t ciphertext: ciphertext,\n\t key: key,\n\t iv: cipherCfg.iv,\n\t algorithm: cipher,\n\t mode: cipherCfg.mode,\n\t padding: cipherCfg.padding,\n\t blockSize: cipher.blockSize,\n\t formatter: cfg.format\n\t });\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {WordArray} key The key.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, key, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Decrypt\n\t var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t return plaintext;\n\t },\n\n\t /**\n\t * Converts serialized ciphertext to CipherParams,\n\t * else assumed CipherParams already and returns ciphertext unchanged.\n\t *\n\t * @param {CipherParams|string} ciphertext The ciphertext.\n\t * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t *\n\t * @return {CipherParams} The unserialized ciphertext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t */\n\t _parse: function (ciphertext, format) {\n\t if (typeof ciphertext == 'string') {\n\t return format.parse(ciphertext, this);\n\t } else {\n\t return ciphertext;\n\t }\n\t }\n\t });\n\n\t /**\n\t * Key derivation function namespace.\n\t */\n\t var C_kdf = C.kdf = {};\n\n\t /**\n\t * OpenSSL key derivation function.\n\t */\n\t var OpenSSLKdf = C_kdf.OpenSSL = {\n\t /**\n\t * Derives a key and IV from a password.\n\t *\n\t * @param {string} password The password to derive from.\n\t * @param {number} keySize The size in words of the key to generate.\n\t * @param {number} ivSize The size in words of the IV to generate.\n\t * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t *\n\t * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t */\n\t execute: function (password, keySize, ivSize, salt, hasher) {\n\t // Generate random salt\n\t if (!salt) {\n\t salt = WordArray.random(64/8);\n\t }\n\n\t // Derive key and IV\n\t if (!hasher) {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\t } else {\n\t var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n\t }\n\n\n\t // Separate key and IV\n\t var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t key.sigBytes = keySize * 4;\n\n\t // Return params\n\t return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t }\n\t };\n\n\t /**\n\t * A serializable cipher wrapper that derives the key from a password,\n\t * and returns ciphertext as a serializable cipher params object.\n\t */\n\t var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t /**\n\t * Configuration options.\n\t *\n\t * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t */\n\t cfg: SerializableCipher.cfg.extend({\n\t kdf: OpenSSLKdf\n\t }),\n\n\t /**\n\t * Encrypts a message using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {WordArray|string} message The message to encrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {CipherParams} A cipher params object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t encrypt: function (cipher, message, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Encrypt\n\t var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t // Mix in derived params\n\t ciphertext.mixIn(derivedParams);\n\n\t return ciphertext;\n\t },\n\n\t /**\n\t * Decrypts serialized ciphertext using a password.\n\t *\n\t * @param {Cipher} cipher The cipher algorithm to use.\n\t * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t * @param {string} password The password.\n\t * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t *\n\t * @return {WordArray} The plaintext.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t */\n\t decrypt: function (cipher, ciphertext, password, cfg) {\n\t // Apply config defaults\n\t cfg = this.cfg.extend(cfg);\n\n\t // Convert string to CipherParams\n\t ciphertext = this._parse(ciphertext, cfg.format);\n\n\t // Derive key and other params\n\t var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n\t // Add IV to config\n\t cfg.iv = derivedParams.iv;\n\n\t // Decrypt\n\t var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t return plaintext;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var BlockCipher = C_lib.BlockCipher;\n\t var C_algo = C.algo;\n\n\t // Lookup tables\n\t var SBOX = [];\n\t var INV_SBOX = [];\n\t var SUB_MIX_0 = [];\n\t var SUB_MIX_1 = [];\n\t var SUB_MIX_2 = [];\n\t var SUB_MIX_3 = [];\n\t var INV_SUB_MIX_0 = [];\n\t var INV_SUB_MIX_1 = [];\n\t var INV_SUB_MIX_2 = [];\n\t var INV_SUB_MIX_3 = [];\n\n\t // Compute lookup tables\n\t (function () {\n\t // Compute double table\n\t var d = [];\n\t for (var i = 0; i < 256; i++) {\n\t if (i < 128) {\n\t d[i] = i << 1;\n\t } else {\n\t d[i] = (i << 1) ^ 0x11b;\n\t }\n\t }\n\n\t // Walk GF(2^8)\n\t var x = 0;\n\t var xi = 0;\n\t for (var i = 0; i < 256; i++) {\n\t // Compute sbox\n\t var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t SBOX[x] = sx;\n\t INV_SBOX[sx] = x;\n\n\t // Compute multiplication\n\t var x2 = d[x];\n\t var x4 = d[x2];\n\t var x8 = d[x4];\n\n\t // Compute sub bytes, mix columns tables\n\t var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t SUB_MIX_2[x] = (t << 8) | (t >>> 24);\n\t SUB_MIX_3[x] = t;\n\n\t // Compute inv sub bytes, inv mix columns tables\n\t var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\n\t INV_SUB_MIX_3[sx] = t;\n\n\t // Compute next counter\n\t if (!x) {\n\t x = xi = 1;\n\t } else {\n\t x = x2 ^ d[d[d[x8 ^ x2]]];\n\t xi ^= d[d[xi]];\n\t }\n\t }\n\t }());\n\n\t // Precomputed Rcon lookup\n\t var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t /**\n\t * AES block cipher algorithm.\n\t */\n\t var AES = C_algo.AES = BlockCipher.extend({\n\t _doReset: function () {\n\t var t;\n\n\t // Skip reset of nRounds has been set before and key did not change\n\t if (this._nRounds && this._keyPriorReset === this._key) {\n\t return;\n\t }\n\n\t // Shortcuts\n\t var key = this._keyPriorReset = this._key;\n\t var keyWords = key.words;\n\t var keySize = key.sigBytes / 4;\n\n\t // Compute number of rounds\n\t var nRounds = this._nRounds = keySize + 6;\n\n\t // Compute number of key schedule rows\n\t var ksRows = (nRounds + 1) * 4;\n\n\t // Compute key schedule\n\t var keySchedule = this._keySchedule = [];\n\t for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t if (ksRow < keySize) {\n\t keySchedule[ksRow] = keyWords[ksRow];\n\t } else {\n\t t = keySchedule[ksRow - 1];\n\n\t if (!(ksRow % keySize)) {\n\t // Rot word\n\t t = (t << 8) | (t >>> 24);\n\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t // Mix Rcon\n\t t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t } else if (keySize > 6 && ksRow % keySize == 4) {\n\t // Sub word\n\t t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t }\n\n\t keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t }\n\t }\n\n\t // Compute inv key schedule\n\t var invKeySchedule = this._invKeySchedule = [];\n\t for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t var ksRow = ksRows - invKsRow;\n\n\t if (invKsRow % 4) {\n\t var t = keySchedule[ksRow];\n\t } else {\n\t var t = keySchedule[ksRow - 4];\n\t }\n\n\t if (invKsRow < 4 || ksRow <= 4) {\n\t invKeySchedule[invKsRow] = t;\n\t } else {\n\t invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t }\n\t }\n\t },\n\n\t encryptBlock: function (M, offset) {\n\t this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t },\n\n\t decryptBlock: function (M, offset) {\n\t // Swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\n\t this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t // Inv swap 2nd and 4th rows\n\t var t = M[offset + 1];\n\t M[offset + 1] = M[offset + 3];\n\t M[offset + 3] = t;\n\t },\n\n\t _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t // Shortcut\n\t var nRounds = this._nRounds;\n\n\t // Get input, add round key\n\t var s0 = M[offset] ^ keySchedule[0];\n\t var s1 = M[offset + 1] ^ keySchedule[1];\n\t var s2 = M[offset + 2] ^ keySchedule[2];\n\t var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t // Key schedule row counter\n\t var ksRow = 4;\n\n\t // Rounds\n\t for (var round = 1; round < nRounds; round++) {\n\t // Shift rows, sub bytes, mix columns, add round key\n\t var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t // Update state\n\t s0 = t0;\n\t s1 = t1;\n\t s2 = t2;\n\t s3 = t3;\n\t }\n\n\t // Shift rows, sub bytes, add round key\n\t var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t // Set output\n\t M[offset] = t0;\n\t M[offset + 1] = t1;\n\t M[offset + 2] = t2;\n\t M[offset + 3] = t3;\n\t },\n\n\t keySize: 256/32\n\t });\n\n\t /**\n\t * Shortcut functions to the cipher's object interface.\n\t *\n\t * @example\n\t *\n\t * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t */\n\t C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\treturn CryptoJS.AES;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Utf8;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t ECB.Encryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.encryptBlock(words, offset);\n\t }\n\t });\n\n\t ECB.Decryptor = ECB.extend({\n\t processBlock: function (words, offset) {\n\t this._cipher.decryptBlock(words, offset);\n\t }\n\t });\n\n\t return ECB;\n\t}());\n\n\n\treturn CryptoJS.mode.ECB;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t pad: function (data, blockSize) {\n\t // Shortcuts\n\t var dataSigBytes = data.sigBytes;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t // Compute last byte position\n\t var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t // Pad\n\t data.clamp();\n\t data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t data.sigBytes += nPaddingBytes;\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Ansix923;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count padding bytes\n\t var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t // Pad\n\t data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t },\n\n\t unpad: function (data) {\n\t // Get number of padding bytes from last byte\n\t var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t // Remove padding\n\t data.sigBytes -= nPaddingBytes;\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.Iso10126;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t pad: function () {\n\t },\n\n\t unpad: function () {\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.NoPadding;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.pad.Pkcs7;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./cipher-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t pad: function (data, blockSize) {\n\t // Shortcut\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Pad\n\t data.clamp();\n\t data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t },\n\n\t unpad: function (data) {\n\t // Shortcut\n\t var dataWords = data.words;\n\n\t // Unpad\n\t var i = data.sigBytes - 1;\n\t for (var i = data.sigBytes - 1; i >= 0; i--) {\n\t if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t data.sigBytes = i + 1;\n\t break;\n\t }\n\t }\n\t }\n\t};\n\n\n\treturn CryptoJS.pad.ZeroPadding;\n\n}));","import AES from \"crypto-js/aes.js\";\nimport CryptoCore from \"crypto-js/core.js\";\nimport Hex from \"crypto-js/enc-hex.js\";\nimport Utf8 from \"crypto-js/enc-utf8.js\";\nimport MD5 from \"crypto-js/md5.js\";\nimport ECB from \"crypto-js/mode-ecb.js\";\nimport \"crypto-js/pad-ansix923.js\";\nimport Iso10126 from \"crypto-js/pad-iso10126.js\";\nimport NoPadding from \"crypto-js/pad-nopadding.js\";\nimport Pkcs7 from \"crypto-js/pad-pkcs7.js\";\nimport ZeroPadding from \"crypto-js/pad-zeropadding.js\";\nimport SHA1 from \"crypto-js/sha1.js\";\nimport { decodeBase64Bytes, decodeBase64UrlBytes, encodeBase64Bytes, encodeBase64UrlBytes } from \"../base64/index\";\nimport { type DecodedText, createDecodedText, encodeUtf8, getTextDecoder } from \"../internal/text\";\n\n/** PBKDF2 默认迭代次数。 */\nconst defaultPbkdf2Iterations = 600_000;\n\n/** PBKDF2 允许的最小迭代次数。 */\nconst minimumPbkdf2Iterations = 100_000;\n\n/** PBKDF2 允许的最大迭代次数,用于限制异常输入造成的计算资源消耗。 */\nconst maximumPbkdf2Iterations = 5_000_000;\n\n/** 密码允许的最大 UTF-8 字节数。 */\nconst maximumPasswordBytes = 1024;\n\n/** 密码加密接口允许的最大明文字节数。 */\nconst maximumPlaintextBytes = 8 * 1024 * 1024;\n\n/** 密码解密接口允许的最大协议载荷字符数。 */\nconst maximumPayloadLength = 16 * 1024 * 1024;\n\n/** 密码加密载荷的协议与算法版本前缀。 */\nconst encryptedPayloadPrefix = \"FAST-AES-256-GCM-V1\";\n\n/** PBKDF2 密码哈希的协议与算法版本前缀。 */\nconst passwordHashPrefix = \"FAST-PBKDF2-SHA256-V1\";\n\n/** 直接 AES-GCM 密钥加密载荷的协议版本。 */\nconst authenticatedAesPayloadVersion = 1;\n\n/** AES 分组密码模式;与 .NET `CipherMode.CBC` 和 `CipherMode.ECB` 对应。 */\nexport type AesCipherMode = \"CBC\" | \"ECB\";\n\n/** AES 填充模式;与 .NET `PaddingMode` 中可由 CryptoJS 互操作的成员对应。 */\nexport type AesPaddingMode = \"None\" | \"PKCS7\" | \"Zeros\" | \"ANSIX923\" | \"ISO10126\";\n\n/** Web Crypto 导出的 PEM 公私钥对。 */\nexport interface PemKeyPair {\n\t/** 未加密的 PKCS#8 PEM 私钥,包含标准 `PRIVATE KEY` 头尾和 64 字符换行。 */\n\tprivateKey: string;\n\t/** SubjectPublicKeyInfo PEM 公钥,包含标准 `PUBLIC KEY` 头尾和 64 字符换行。 */\n\tpublicKey: string;\n}\n\n/** 本模块支持的 Web Crypto 椭圆曲线。 */\nexport type EcNamedCurve = \"P-256\" | \"P-384\" | \"P-521\";\n\n/**\n * 获取本模块非随机 API 所需的完整 Web Crypto 能力。\n *\n * @returns 已确认实现摘要、派生、密钥导入导出、加解密、签名和验证方法的 Crypto 对象。\n * @throws `Error` 当任一必要 SubtleCrypto 方法缺失。\n */\nconst requireWebCrypto = (): Crypto => {\n\tconst crypto = globalThis.crypto;\n\tconst subtle = crypto?.subtle;\n\tif (\n\t\ttypeof subtle?.decrypt !== \"function\" ||\n\t\ttypeof subtle.deriveBits !== \"function\" ||\n\t\ttypeof subtle.deriveKey !== \"function\" ||\n\t\ttypeof subtle.digest !== \"function\" ||\n\t\ttypeof subtle.encrypt !== \"function\" ||\n\t\ttypeof subtle.exportKey !== \"function\" ||\n\t\ttypeof subtle.generateKey !== \"function\" ||\n\t\ttypeof subtle.importKey !== \"function\" ||\n\t\ttypeof subtle.sign !== \"function\" ||\n\t\ttypeof subtle.verify !== \"function\"\n\t) {\n\t\tthrow new Error(\"当前运行环境不支持 Web Crypto SubtleCrypto。\");\n\t}\n\treturn crypto;\n};\n\n/**\n * 把 Uint8Array 复制为独立的完整 ArrayBuffer。\n *\n * @remarks 不能直接返回 `bytes.buffer`,因为输入可能只是更大 Buffer 的切片。\n * @param bytes - 源字节视图。\n * @returns 长度与视图完全一致、偏移为零的新 ArrayBuffer。\n */\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n\tconst copy = new Uint8Array(bytes.byteLength);\n\tcopy.set(bytes);\n\treturn copy.buffer;\n};\n\n/** 本模块导出的 PKCS#8 与 SPKI PEM 标签。 */\nconst pemLabels = {\n\tprivate: \"PRIVATE KEY\",\n\tpublic: \"PUBLIC KEY\",\n} as const;\n\n/**\n * 把 DER 内容封装为 PEM。\n *\n * @param label - PEM Begin/End 标签,不包含分隔线。\n * @param value - DER 二进制内容。\n * @returns 每行最多 64 个 Base64 字符的 PEM 文本。\n */\nconst toPem = (label: string, value: ArrayBuffer): string => {\n\tconst encoded = encodeBase64Bytes(new Uint8Array(value));\n\tconst lines = encoded.match(/.{1,64}/gu)?.join(\"\\n\") ?? \"\";\n\treturn `-----BEGIN ${label}-----\\n${lines}\\n-----END ${label}-----`;\n};\n\n/**\n * 校验 PEM 标签并还原 DER。\n *\n * @param value - PEM 文本。\n * @param label - 当前算法预期的标签。\n * @returns 独立的 DER ArrayBuffer。\n * @throws `TypeError` 当 Begin/End 标签不匹配或 Base64 内容非法。\n */\nconst fromPem = (value: string, label: string): ArrayBuffer => {\n\tconst header = `-----BEGIN ${label}-----`;\n\tconst footer = `-----END ${label}-----`;\n\tconst trimmed = value.trim();\n\tif (!trimmed.startsWith(header) || !trimmed.endsWith(footer)) throw new TypeError(`应提供 ${label} 格式的 PEM 值。`);\n\tconst encoded = trimmed.slice(header.length, -footer.length).replace(/\\s+/gu, \"\");\n\treturn toArrayBuffer(decodeBase64Bytes(encoded));\n};\n\n/**\n * 导出 Web Crypto 密钥对。\n *\n * @param keyPair - 可导出的公私钥对。\n * @returns PKCS#8 私钥和 SPKI 公钥组成的 PEM 对象。\n * @throws `Error` 当平台拒绝导出或密钥格式不兼容。\n */\nconst exportKeyPair = async (keyPair: CryptoKeyPair): Promise<PemKeyPair> => {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.exportKey(\"pkcs8\", keyPair.privateKey),\n\t\tcrypto.subtle.exportKey(\"spki\", keyPair.publicKey),\n\t]);\n\treturn {\n\t\tprivateKey: toPem(pemLabels.private, privateKey),\n\t\tpublicKey: toPem(pemLabels.public, publicKey),\n\t};\n};\n\n/**\n * 缩小 Web Crypto `generateKey` 的联合返回值。\n *\n * @param value - 平台返回的单密钥或密钥对。\n * @returns 同时具有公钥和私钥的密钥对。\n * @throws `Error` 当平台没有按请求生成密钥对。\n */\nconst assertKeyPair = (value: CryptoKey | CryptoKeyPair): CryptoKeyPair => {\n\tif (\"privateKey\" in value && \"publicKey\" in value) return value;\n\tthrow new Error(\"当前运行环境未生成密钥对。\");\n};\n\n/**\n * 校验并编码密码。\n *\n * @param password - 用户提供的密码文本。\n * @returns UTF-8 密码字节。\n * @throws `TypeError` 当密码为空。\n * @throws `RangeError` 当 UTF-8 长度超过 1,024 字节。\n */\nconst encodeValidatedPassword = (password: string): Uint8Array => {\n\tconst bytes = encodeUtf8(password);\n\tif (bytes.length === 0) throw new TypeError(\"加密密码不能为空。\");\n\tif (bytes.length > maximumPasswordBytes) {\n\t\tthrow new RangeError(`UTF-8 密码不能超过 ${maximumPasswordBytes} 字节。`);\n\t}\n\treturn bytes;\n};\n\n/**\n * 校验 PBKDF2 迭代次数。\n *\n * @param iterations - 待使用的迭代次数。\n * @returns 校验后的原始整数。\n * @throws `RangeError` 当值不是 100,000 至 5,000,000 的安全整数。\n */\nconst validateIterations = (iterations: number): number => {\n\tif (!Number.isSafeInteger(iterations) || iterations < minimumPbkdf2Iterations || iterations > maximumPbkdf2Iterations) {\n\t\tthrow new RangeError(`\\`iterations\\` 必须是 ${minimumPbkdf2Iterations} 到 ${maximumPbkdf2Iterations} 之间的安全整数。`);\n\t}\n\treturn iterations;\n};\n\n/** 把字节格式化为小写十六进制。 */\nconst toLowerHex = (value: Uint8Array): string => Array.from(value, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\n/** 把字节格式化为大写十六进制。 */\nconst toUpperHex = (value: Uint8Array): string => toLowerHex(value).toUpperCase();\n\n/**\n * 使用指定的 Web Crypto HMAC 算法计算原始认证标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @param hash - HMAC 使用的 SHA-2 摘要算法。\n * @returns 算法规定长度的原始认证标签。\n * @throws `TypeError` 当密钥为空。\n * @throws `Error` 当运行时缺少所需 Web Crypto 能力。\n */\nconst computeHmacBytes = async (value: string, key: string, hash: \"SHA-256\" | \"SHA-384\" | \"SHA-512\"): Promise<Uint8Array> => {\n\tconst keyBytes = encodeUtf8(key);\n\tif (keyBytes.length === 0) throw new TypeError(\"HMAC 密钥不能为空。\");\n\n\tconst crypto = requireWebCrypto();\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { hash, name: \"HMAC\" }, false, [\"sign\"]);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", cryptoKey, toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(signature);\n};\n\n/**\n * 生成随机字节。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param length - 0 至 65,536 的安全整数。\n * @returns 新建的 `Uint8Array`。\n * @throws 参数非法时抛出 `RangeError`。\n */\nexport function GenerateRandomBytes(length: number): Uint8Array {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > 65_536) {\n\t\tthrow new RangeError(\"`length` 必须是 0 到 65,536 之间的安全整数。\");\n\t}\n\tconst bytes = new Uint8Array(length);\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.getRandomValues === \"function\") return crypto.getRandomValues(bytes);\n\tfor (let index = 0; index < bytes.length; index += 1) bytes[index] = Math.floor(Math.random() * 0x100);\n\treturn bytes;\n}\n\n/**\n * 以不提前退出的方式比较两个字节数组。\n *\n * @remarks JavaScript 引擎不保证严格常量时间;该函数只避免显式短路,不能替代服务端\n * 密码学库提供的 timing-safe primitive。长度是否相同仍属于可观察信息。\n * @param left - 第一字节序列。\n * @param right - 第二字节序列。\n * @returns 长度和每个字节均相同时返回 `true`。\n */\nexport function FixedTimeEquals(left: Uint8Array, right: Uint8Array): boolean {\n\tconst length = Math.max(left.length, right.length);\n\tlet difference = left.length === right.length ? 0 : 1;\n\t// 不按长度或首个差异提前退出;缺失位置按零参与累计差异。\n\tfor (let index = 0; index < length; index += 1) difference |= (left[index] ?? 0) ^ (right[index] ?? 0);\n\treturn difference === 0;\n}\n\n/**\n * 计算 MD5 摘要并返回小写十六进制文本。\n *\n * @remarks MD5 仅用于非安全的普通校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 32 字符小写十六进制摘要。\n */\nexport function MD5Encrypt(value: string): string {\n\treturn MD5(value).toString(Hex);\n}\n\n/**\n * 计算 SHA-1 摘要并返回大写十六进制文本。\n *\n * @remarks SHA-1 仅用于非安全的普通校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 40 字符大写十六进制摘要。\n */\nexport function SHA1Encrypt(value: string): string {\n\treturn SHA1(value).toString(Hex).toUpperCase();\n}\n\n/**\n * 计算 SHA-256 摘要。\n *\n * @remarks SHA-256 是快速摘要,不适合直接存储或校验密码。\n * @param value - UTF-8 字符串或原始字节。\n * @returns 32 字节摘要。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function SHA256Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-256 并格式化为十六进制。\n *\n * @param value - UTF-8 字符串或原始字节。\n * @returns 64 字符大写十六进制文本。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function SHA256Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA256Bytes(value));\n}\n\n/**\n * 计算 SHA-384 摘要。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 48 字节摘要。\n */\nexport async function SHA384Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-384\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-384 并格式化为十六进制文本。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 96 个大写十六进制字符组成的摘要。\n */\nexport async function SHA384Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA384Bytes(value));\n}\n\n/**\n * 计算 SHA-512 摘要。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 64 字节摘要。\n */\nexport async function SHA512Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-512\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-512 并格式化为十六进制文本。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 128 个大写十六进制字符组成的摘要。\n */\nexport async function SHA512Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA512Bytes(value));\n}\n\n/**\n * 使用 HMAC-SHA-256 认证文本,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 64 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA256Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-256\"));\n}\n\n/**\n * 使用 HMAC-SHA-384 认证文本或字节,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 96 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA384Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-384\"));\n}\n\n/**\n * 使用 HMAC-SHA-512 认证文本或字节,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 128 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA512Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-512\"));\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 从密码派生密钥。\n *\n * @param password - 1 至 1,024 UTF-8 字节的密码。\n * @param salt - 至少 8 字节的盐。\n * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。\n * @param outputLength - 输出长度,范围为 1 至 1,024 字节。\n * @returns 指定长度的派生密钥。\n * @throws 参数超过协议边界时抛出 `TypeError` 或 `RangeError`。\n */\nexport async function PBKDF2SHA256(password: string, salt: Uint8Array, iterations = defaultPbkdf2Iterations, outputLength = 32): Promise<Uint8Array> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (salt.length < 8) throw new RangeError(\"PBKDF2 盐值必须至少包含 8 字节,建议不少于 16 字节。\");\n\tif (!Number.isSafeInteger(outputLength) || outputLength < 1 || outputLength > 1024) {\n\t\tthrow new RangeError(\"`outputLength` 必须是 1 到 1,024 之间的安全整数。\");\n\t}\n\n\t// 密码作为不可导出的 PBKDF2 原始材料导入,派生结果只通过 deriveBits 返回。\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveBits\"]);\n\tconst derived = await crypto.subtle.deriveBits(\n\t\t{ hash: \"SHA-256\", iterations: validateIterations(iterations), name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\toutputLength * 8\n\t);\n\treturn new Uint8Array(derived);\n}\n\n/**\n * 生成可持久化的随机盐 PBKDF2-HMAC-SHA-256 密码哈希。\n *\n * @param password - 1 至 1,024 UTF-8 字节的密码。\n * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。\n * @returns 包含版本、迭代次数、16 字节随机盐和 32 字节派生密钥的自描述字符串。\n */\nexport async function HashPasswordPBKDF2SHA256(password: string, iterations = defaultPbkdf2Iterations): Promise<string> {\n\t// 每个密码独立生成盐,避免相同密码产生相同持久化结果并提高预计算攻击成本。\n\tconst salt = GenerateRandomBytes(16);\n\tconst derivedKey = await PBKDF2SHA256(password, salt, iterations);\n\treturn [passwordHashPrefix, String(iterations), encodeBase64UrlBytes(salt), encodeBase64UrlBytes(derivedKey)].join(\":\");\n}\n\n/**\n * 验证 {@link HashPasswordPBKDF2SHA256} 生成的密码哈希。\n *\n * @param password - 要验证的密码。\n * @param passwordHash - 自描述的 PBKDF2-HMAC-SHA-256 密码哈希。\n * @returns 格式有效且密码匹配时返回 `true`;格式无效或密码错误时返回 `false`。\n */\nexport async function VerifyPasswordPBKDF2SHA256(password: string, passwordHash: string): Promise<boolean> {\n\ttry {\n\t\t// 先验证协议版本和字段边界,再执行高成本 PBKDF2,避免无效输入消耗不受控资源。\n\t\tconst parts = passwordHash.split(\":\");\n\t\tif (parts.length !== 4 || parts[0] !== passwordHashPrefix) return false;\n\t\tconst iterations = validateIterations(Number(parts[1]));\n\t\tconst salt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tconst expected = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tif (salt.length !== 16 || expected.length !== 32) return false;\n\t\tconst actual = await PBKDF2SHA256(password, salt, iterations, expected.length);\n\t\treturn FixedTimeEquals(actual, expected);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 使用 RFC 5869 HKDF-SHA-256 派生上下文隔离的密钥材料。\n *\n * @param inputKeyMaterial - 输入密钥材料,例如 ECDH 原始共享秘密。\n * @param salt - 可选盐;空值按 RFC 5869 的零盐语义处理。\n * @param info - 应用、协议和密钥用途上下文。\n * @param outputLength - 输出长度,范围为 1 至 8,160 字节。\n * @returns 与 `salt` 和 `info` 绑定的派生密钥。\n */\nexport async function HKDFSHA256(\n\tinputKeyMaterial: Uint8Array,\n\tsalt: Uint8Array = new Uint8Array(),\n\tinfo: Uint8Array = new Uint8Array(),\n\toutputLength = 32\n): Promise<Uint8Array> {\n\tif (!Number.isSafeInteger(outputLength) || outputLength < 1 || outputLength > 255 * 32) {\n\t\tthrow new RangeError(\"`outputLength` 必须是 1 到 8,160 之间的安全整数。\");\n\t}\n\n\t// Web Crypto 的 HKDF 实现内部完成 RFC 5869 Extract 和 Expand,并且不会导出中间 PRK。\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(inputKeyMaterial), \"HKDF\", false, [\"deriveBits\"]);\n\tconst derived = await crypto.subtle.deriveBits(\n\t\t{ hash: \"SHA-256\", info: toArrayBuffer(info), name: \"HKDF\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\toutputLength * 8\n\t);\n\treturn new Uint8Array(derived);\n}\n\n/**\n * 使用 AES-256 对 UTF-8 文本进行分组加密。\n *\n * @remarks 密钥和 IV 分别补字符 `f` 或截断到 32、16 个 UTF-16 Code Unit,与 .NET\n * `AESEncrypt` 保持一致。CBC/ECB 不提供完整性认证,密文可能被篡改。\n * @param dataStr - 要加密的 UTF-8 文本;空白文本返回 `null`。\n * @param key - 非空白的密钥文本。\n * @param vector - 非空白的初始化向量文本;ECB 模式仍要求传入该参数以对齐 .NET 签名。\n * @param cipherMode - AES 分组模式,默认 `CBC`。\n * @param paddingMode - AES 填充模式,默认 `PKCS7`。\n * @returns Base64 密文;输入、密钥或 IV 为空白时返回 `null`。\n * @throws 模式或填充不受支持时抛出 `RangeError`。\n */\nexport function AESEncrypt(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode: AesCipherMode = \"CBC\",\n\tpaddingMode: AesPaddingMode = \"PKCS7\"\n): string | null {\n\tif (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;\n\tif (cipherMode !== \"CBC\" && cipherMode !== \"ECB\") throw new RangeError(\"`cipherMode` 必须是 `CBC` 或 `ECB`。\");\n\n\tlet padding = Pkcs7;\n\tswitch (paddingMode) {\n\t\tcase \"None\":\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"PKCS7\":\n\t\t\tbreak;\n\t\tcase \"Zeros\":\n\t\t\tpadding = ZeroPadding;\n\t\t\tbreak;\n\t\tcase \"ANSIX923\":\n\t\t\t// crypto-js 4.2.0 的 pad-ansix923 默认导出名称拼写错误,使用其注册到核心对象的实现。\n\t\t\tpadding = CryptoCore.pad.AnsiX923;\n\t\t\tbreak;\n\t\tcase \"ISO10126\":\n\t\t\tpadding = Iso10126;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new RangeError(\"不支持当前 `paddingMode`。\");\n\t}\n\tif (paddingMode === \"None\" && encodeUtf8(dataStr).length % 16 !== 0) {\n\t\tthrow new RangeError(\"当 `paddingMode` 为 `None` 时,AES 明文长度必须是 16 字节的整数倍。\");\n\t}\n\n\t// 按 .NET 入口的字符规则处理密钥和 IV,再由 CryptoJS 统一按 UTF-8 编码。\n\tconst keyBytes = Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n\tconst vectorBytes = Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\treturn AES.encrypt(dataStr, keyBytes, cipherMode === \"CBC\" ? { iv: vectorBytes, padding } : { iv: vectorBytes, mode: ECB, padding }).toString();\n}\n\n/**\n * 使用 AES-256 解密 Base64 分组密文。\n *\n * @remarks 参数归一化规则与 {@link AESEncrypt} 以及 .NET `AESDecrypt` 相同。\n * @param dataStr - Base64 密文;空白文本返回 `null`。\n * @param key - 加密时使用的密钥文本。\n * @param vector - 加密时使用的初始化向量文本。\n * @param cipherMode - AES 分组模式,默认 `CBC`。\n * @param paddingMode - AES 填充模式,默认 `PKCS7`。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串;输入、密钥或 IV 为空白时返回 `null`。\n * @throws 模式、填充、Base64、密钥或密文无效时抛出错误。\n */\nexport function AESDecrypt(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode: AesCipherMode = \"CBC\",\n\tpaddingMode: AesPaddingMode = \"PKCS7\"\n): DecodedText | null {\n\tif (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;\n\tif (cipherMode !== \"CBC\" && cipherMode !== \"ECB\") throw new RangeError(\"`cipherMode` 必须是 `CBC` 或 `ECB`。\");\n\n\tlet padding = Pkcs7;\n\tswitch (paddingMode) {\n\t\tcase \"None\":\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"PKCS7\":\n\t\t\tbreak;\n\t\tcase \"Zeros\":\n\t\t\t// .NET 的 Zeros 解密不会移除尾部零字节,因此使用 NoPadding 保留完整明文块。\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"ANSIX923\":\n\t\t\t// crypto-js 4.2.0 的 pad-ansix923 默认导出名称拼写错误,使用其注册到核心对象的实现。\n\t\t\tpadding = CryptoCore.pad.AnsiX923;\n\t\t\tbreak;\n\t\tcase \"ISO10126\":\n\t\t\tpadding = Iso10126;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new RangeError(\"不支持当前 `paddingMode`。\");\n\t}\n\tconst ciphertextBytes = decodeBase64Bytes(dataStr);\n\tif (ciphertextBytes.length === 0 || ciphertextBytes.length % 16 !== 0) {\n\t\tthrow new RangeError(\"AES 密文必须至少包含一个完整的 16 字节块。\");\n\t}\n\n\t// 解密必须重复使用加密端相同的字符补齐和截断规则。\n\tconst keyBytes = Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n\tconst vectorBytes = Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\treturn createDecodedText(\n\t\tAES.decrypt(dataStr, keyBytes, cipherMode === \"CBC\" ? { iv: vectorBytes, padding } : { iv: vectorBytes, mode: ECB, padding }).toString(Utf8)\n\t);\n}\n\n/**\n * 使用 SHA-256 归一化文本密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 输出与 .NET `AESEncryptAuthenticated` 的 v1 Base64 二进制载荷完全一致。\n * @param plaintext - 要加密的 UTF-8 文本。\n * @param key - 非空的 UTF-8 文本密钥;内部归一化为 32 字节 SHA-256 摘要。\n * @returns Base64 编码的 v1 AES-GCM 认证载荷。\n * @throws 密钥为空或运行时缺少 Web Crypto 时抛出错误。\n */\nexport async function AESEncryptAuthenticated(plaintext: string, key: string): Promise<string> {\n\tif (key.trim().length === 0) throw new TypeError(\"加密密钥不能为空。\");\n\tconst crypto = requireWebCrypto();\n\tconst keyBytes = await SHA256Bytes(key);\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { name: \"AES-GCM\" }, false, [\"encrypt\"]);\n\t// 96 位随机 nonce 是 GCM 的标准高效长度;每次加密都生成新值,避免同一密钥下重复。\n\tconst nonce = GenerateRandomBytes(12);\n\tconst encrypted = new Uint8Array(\n\t\tawait crypto.subtle.encrypt({ iv: toArrayBuffer(nonce), name: \"AES-GCM\", tagLength: 128 }, cryptoKey, toArrayBuffer(encodeUtf8(plaintext)))\n\t);\n\tconst ciphertextLength = encrypted.length - 16;\n\t// .NET v1 协议字段顺序固定为 version || nonce || tag || ciphertext。\n\tconst payload = new Uint8Array(1 + nonce.length + 16 + ciphertextLength);\n\tpayload[0] = authenticatedAesPayloadVersion;\n\tpayload.set(nonce, 1);\n\tpayload.set(encrypted.subarray(ciphertextLength), 1 + nonce.length);\n\tpayload.set(encrypted.subarray(0, ciphertextLength), 1 + nonce.length + 16);\n\treturn encodeBase64Bytes(payload);\n}\n\n/**\n * 解密并认证 .NET `AESEncryptAuthenticated` 或 {@link AESEncryptAuthenticated} 生成的载荷。\n *\n * @param payload - Base64 编码的 v1 AES-GCM 二进制载荷。\n * @param key - 加密时使用的非空 UTF-8 文本密钥。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。\n * @throws 载荷格式无效、密钥错误或认证失败时抛出错误。\n */\nexport async function AESDecryptAuthenticated(payload: string, key: string): Promise<DecodedText> {\n\tif (key.trim().length === 0) throw new TypeError(\"加密密钥不能为空。\");\n\tconst decoded = decodeBase64Bytes(payload);\n\tif (decoded.length < 29 || decoded[0] !== authenticatedAesPayloadVersion) {\n\t\tthrow new TypeError(\"不支持该 AES-GCM 载荷格式或版本。\");\n\t}\n\n\tconst nonce = decoded.subarray(1, 13);\n\tconst tag = decoded.subarray(13, 29);\n\tconst ciphertext = decoded.subarray(29);\n\t// Web Crypto 接收 ciphertext || tag,因此把 .NET v1 的独立字段恢复为 Web Crypto 输入顺序。\n\tconst ciphertextAndTag = new Uint8Array(ciphertext.length + tag.length);\n\tciphertextAndTag.set(ciphertext);\n\tciphertextAndTag.set(tag, ciphertext.length);\n\tconst crypto = requireWebCrypto();\n\tconst keyBytes = await SHA256Bytes(key);\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n\tconst plaintext = await crypto.subtle.decrypt(\n\t\t{ iv: toArrayBuffer(nonce), name: \"AES-GCM\", tagLength: 128 },\n\t\tcryptoKey,\n\t\ttoArrayBuffer(ciphertextAndTag)\n\t);\n\treturn createDecodedText(getTextDecoder().decode(plaintext));\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 派生密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 每次调用生成独立 16 字节盐与 12 字节 IV。输出是与 .NET `AESEncryptWithPassword`\n * 一致的 v1 自描述载荷,不应由业务代码手动拆分或修改。密码加密不替代密钥管理。\n * @param plaintext - 原始文本,不进行 JSON 推断;UTF-8 编码后最大 8 MiB。\n * @param password - 1 至 1024 UTF-8 字节的秘密口令。\n * @param iterations - PBKDF2 工作因子,默认 600,000。\n * @returns 认证密文字符串;相同输入每次产生不同结果。\n * @throws 口令非法时抛出 `TypeError` 或 `RangeError`;明文过大时抛出 `RangeError`;\n * 运行时缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function AESEncryptWithPassword(plaintext: string, password: string, iterations = defaultPbkdf2Iterations): Promise<string> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tconst plaintextBytes = encodeUtf8(plaintext);\n\tif (plaintextBytes.length > maximumPlaintextBytes) {\n\t\tthrow new RangeError(`UTF-8 明文不能超过 ${maximumPlaintextBytes} 字节。`);\n\t}\n\tconst validatedIterations = validateIterations(iterations);\n\tconst crypto = requireWebCrypto();\n\tconst salt = GenerateRandomBytes(16);\n\tconst iv = GenerateRandomBytes(12);\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\t// AES-GCM 密钥只允许加密,且不允许从 Web Crypto 导出。\n\tconst key = await crypto.subtle.deriveKey(\n\t\t{ hash: \"SHA-256\", iterations: validatedIterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\t{ length: 256, name: \"AES-GCM\" },\n\t\tfalse,\n\t\t[\"encrypt\"]\n\t);\n\t// Prefix 同时作为明文版本字段和 AAD,攻击者无法在不破坏认证标签的情况下替换协议版本。\n\tconst ciphertext = await crypto.subtle.encrypt(\n\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\tkey,\n\t\tplaintextBytes\n\t);\n\t// 字段顺序属于持久化协议:版本、KDF 成本、盐、IV、带 GCM Tag 的密文。\n\treturn [\n\t\tencryptedPayloadPrefix,\n\t\tString(validatedIterations),\n\t\tencodeBase64UrlBytes(salt),\n\t\tencodeBase64UrlBytes(iv),\n\t\tencodeBase64UrlBytes(new Uint8Array(ciphertext)),\n\t].join(\":\");\n}\n\n/**\n * 解密 {@link AESEncryptWithPassword} 生成的 v1 认证载荷。\n *\n * @param payload - 未修改的 v1 载荷,最大约 16 MiB 文本。\n * @param password - 加密时使用的口令。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。\n * @throws 格式或字段非法时抛出 `TypeError`,载荷过大时抛出 `RangeError`,认证或密码\n * 失败及缺少平台能力时抛出 `Error`。\n */\nexport async function AESDecryptWithPassword(payload: string, password: string): Promise<DecodedText> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (payload.length > maximumPayloadLength) {\n\t\tthrow new RangeError(\"加密载荷超出支持的大小。\");\n\t}\n\t// 先验证固定字段数和版本,再对高成本 KDF 与解密进行任何工作。\n\tconst parts = payload.split(\":\");\n\tif (parts.length !== 5 || parts[0] !== encryptedPayloadPrefix) {\n\t\tthrow new TypeError(\"不支持该加密载荷格式。\");\n\t}\n\n\tlet iterations: number;\n\tlet salt: Uint8Array;\n\tlet iv: Uint8Array;\n\tlet ciphertext: Uint8Array;\n\ttry {\n\t\titerations = validateIterations(Number(parts[1]));\n\t\tsalt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tiv = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tciphertext = decodeBase64UrlBytes(parts[4] ?? \"\");\n\t\tif (salt.length !== 16 || iv.length !== 12 || ciphertext.length < 16) {\n\t\t\tthrow new TypeError(\"加密载荷的字段长度无效。\");\n\t\t}\n\t} catch (cause) {\n\t\tthrow new TypeError(\"加密载荷包含无效字段。\", { cause });\n\t}\n\n\tconst crypto = requireWebCrypto();\n\tconst textDecoder = getTextDecoder();\n\ttry {\n\t\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\t\t// 解密密钥不允许导出,也不能被误用于加密。\n\t\tconst key = await crypto.subtle.deriveKey(\n\t\t\t{ hash: \"SHA-256\", iterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\t\tmaterial,\n\t\t\t{ length: 256, name: \"AES-GCM\" },\n\t\t\tfalse,\n\t\t\t[\"decrypt\"]\n\t\t);\n\t\tconst plaintext = await crypto.subtle.decrypt(\n\t\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\t\tkey,\n\t\t\ttoArrayBuffer(ciphertext)\n\t\t);\n\t\treturn createDecodedText(textDecoder.decode(plaintext));\n\t} catch (cause) {\n\t\tthrow new Error(\"无法认证或解密载荷。\", { cause });\n\t}\n}\n\n/**\n * 生成可供 RSA-OAEP/SHA-256 与 RSA-PSS/SHA-256 共用的 PEM 密钥对。\n *\n * @param modulusLength - RSA 模数位数,默认 2,048;必须是不小于 2,048 的 256 倍数。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n * @throws 模数小于 2,048 或不是 256 的倍数时抛出 `RangeError`。\n */\nexport async function GenerateRSAKeyPair(modulusLength = 2048): Promise<PemKeyPair> {\n\tif (!Number.isSafeInteger(modulusLength) || modulusLength < 2048 || modulusLength % 256 !== 0) {\n\t\tthrow new RangeError(\"`modulusLength` 必须是大于或等于 2048 且能被 256 整除的安全整数。\");\n\t}\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(\n\t\tawait crypto.subtle.generateKey(\n\t\t\t{\n\t\t\t\thash: \"SHA-256\",\n\t\t\t\tmodulusLength,\n\t\t\t\tname: \"RSA-OAEP\",\n\t\t\t\tpublicExponent: Uint8Array.of(1, 0, 1),\n\t\t\t},\n\t\t\ttrue,\n\t\t\t[\"decrypt\", \"encrypt\"]\n\t\t)\n\t);\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用 RSA-OAEP/SHA-256 公钥加密 UTF-8 文本。\n *\n * @param plaintext - 要加密的 UTF-8 文本;长度必须满足 RSA-OAEP 模数限制。\n * @param publicKeyPem - SubjectPublicKeyInfo PEM 公钥。\n * @returns Base64 编码的 RSA 密文。\n * @throws 公钥格式无效或明文超过 RSA-OAEP 容量时抛出错误。\n */\nexport async function RSAEncryptOAEP(plaintext: string, publicKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"encrypt\",\n\t]);\n\tconst ciphertext = await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(encodeUtf8(plaintext)));\n\treturn encodeBase64Bytes(new Uint8Array(ciphertext));\n}\n\n/**\n * 使用 RSA-OAEP/SHA-256 私钥解密 Base64 密文。\n *\n * @param ciphertext - Base64 编码的 RSA 密文。\n * @param privateKeyPem - 未加密的 PKCS#8 PEM 私钥。\n * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。\n * @throws 私钥、Base64 或密文无效时抛出错误。\n */\nexport async function RSADecryptOAEP(ciphertext: string, privateKeyPem: string): Promise<DecodedText> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"decrypt\",\n\t]);\n\tconst plaintext = await crypto.subtle.decrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(decodeBase64Bytes(ciphertext)));\n\treturn createDecodedText(getTextDecoder().decode(plaintext));\n}\n\n/**\n * 使用 RSA-PSS/SHA-256 私钥签名文本或字节。\n *\n * @param value - 要签名的 UTF-8 文本或原始字节。\n * @param privateKeyPem - 未加密的 PKCS#8 PEM 私钥。\n * @returns Base64 编码的 RSA-PSS 签名;盐长度固定为 32 字节。\n * @throws 私钥格式无效或签名失败时抛出错误。\n */\nexport async function RSASignPSS(value: string, privateKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-PSS\" }, false, [\n\t\t\"sign\",\n\t]);\n\t// PSS 盐长度固定为 SHA-256 摘要长度,与 .NET RSASignaturePadding.Pss 的默认行为一致。\n\tconst signature = await crypto.subtle.sign({ name: \"RSA-PSS\", saltLength: 32 }, key, toArrayBuffer(encodeUtf8(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/**\n * 使用 RSA-PSS/SHA-256 公钥验证 Base64 签名。\n *\n * @param value - 签名时使用的 UTF-8 文本或原始字节。\n * @param signature - Base64 编码的 RSA-PSS 签名。\n * @param publicKeyPem - SubjectPublicKeyInfo PEM 公钥。\n * @returns 签名与内容、公钥匹配时返回 `true`。\n * @throws 公钥或 Base64 格式无效时抛出错误。\n */\nexport async function RSAVerifyPSS(value: string, signature: string, publicKeyPem: string): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-PSS\" }, false, [\n\t\t\"verify\",\n\t]);\n\t// 验证端必须使用与签名端相同的 32 字节 PSS 盐长度。\n\treturn crypto.subtle.verify(\n\t\t{ name: \"RSA-PSS\", saltLength: 32 },\n\t\tkey,\n\t\ttoArrayBuffer(decodeBase64Bytes(signature)),\n\t\ttoArrayBuffer(encodeUtf8(value))\n\t);\n}\n\n/**\n * 生成 ECDSA PEM 签名密钥对。\n *\n * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n */\nexport async function GenerateECDSAKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDSA\", namedCurve }, true, [\"sign\", \"verify\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用 ECDSA 私钥签名文本或字节。\n *\n * @remarks Web Crypto 返回 IEEE P1363 固定字段拼接格式,与 .NET 实现一致。\n * @param value - 要签名的 UTF-8 文本或原始字节。\n * @param privateKeyPem - 未加密的 EC PKCS#8 PEM 私钥。\n * @param namedCurve - 私钥使用的 NIST 曲线。\n * @returns Base64 编码的 IEEE P1363 ECDSA 签名。\n */\nexport async function ECDSASign(value: string, privateKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDSA\", namedCurve }, false, [\"sign\"]);\n\t// NIST 曲线强度分别对应 SHA-256、SHA-384 和 SHA-512;映射只在签名入口使用,因此直接保留在调用点。\n\tconst hash = namedCurve === \"P-256\" ? \"SHA-256\" : namedCurve === \"P-384\" ? \"SHA-384\" : \"SHA-512\";\n\tconst signature = await crypto.subtle.sign({ hash, name: \"ECDSA\" }, key, toArrayBuffer(encodeUtf8(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/**\n * 使用 ECDSA 公钥验证 Base64 签名。\n *\n * @param value - 签名时使用的 UTF-8 文本或原始字节。\n * @param signature - Base64 编码的 IEEE P1363 ECDSA 签名。\n * @param publicKeyPem - EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 公钥使用的 NIST 曲线。\n * @returns 签名与内容、公钥和曲线匹配时返回 `true`。\n */\nexport async function ECDSAVerify(value: string, signature: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDSA\", namedCurve }, false, [\"verify\"]);\n\t// 与签名入口保持相同的曲线/摘要映射,避免允许调用方组合不匹配的安全强度。\n\tconst hash = namedCurve === \"P-256\" ? \"SHA-256\" : namedCurve === \"P-384\" ? \"SHA-384\" : \"SHA-512\";\n\treturn crypto.subtle.verify({ hash, name: \"ECDSA\" }, key, toArrayBuffer(decodeBase64Bytes(signature)), toArrayBuffer(encodeUtf8(value)));\n}\n\n/**\n * 生成 ECDH PEM 密钥协商密钥对。\n *\n * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n */\nexport async function GenerateECDHKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDH\", namedCurve }, true, [\"deriveBits\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用本方 ECDH 私钥与对方 ECDH 公钥派生共享秘密。\n *\n * @remarks 返回值仍需经过合适的 KDF 后才能作为对称密钥,不应直接长期存储。\n * @param privateKeyPem - 本方未加密的 EC PKCS#8 PEM 私钥。\n * @param publicKeyPem - 对方的 EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 双方密钥使用的 NIST 曲线。\n * @returns 曲线字段长度的原始 ECDH 共享秘密。\n */\nexport async function DeriveECDHSecret(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDH\", namedCurve }, false, [\"deriveBits\"]),\n\t\tcrypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDH\", namedCurve }, false, []),\n\t]);\n\t// P-521 字段需要按完整字节对齐,因此导出 66 字节(528 位),其余曲线直接使用字段位数。\n\tconst bitLength = namedCurve === \"P-256\" ? 256 : namedCurve === \"P-384\" ? 384 : 528;\n\tconst secret = await crypto.subtle.deriveBits({ name: \"ECDH\", public: publicKey }, privateKey, bitLength);\n\treturn new Uint8Array(secret);\n}\n\n/**\n * 使用 ECDH 后以 SHA-256 派生共享密钥。\n *\n * @remarks 相比直接使用原始共享秘密,此入口与 .NET `DeriveECDHKeySHA256` 一致并固定输出 32 字节。\n * @param privateKeyPem - 本方未加密的 EC PKCS#8 PEM 私钥。\n * @param publicKeyPem - 对方的 EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 双方密钥使用的 NIST 曲线。\n * @returns 32 字节共享密钥。\n */\nexport async function DeriveECDHKeySHA256(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst secret = await DeriveECDHSecret(privateKeyPem, publicKeyPem, namedCurve);\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(secret));\n\treturn new Uint8Array(digest);\n}\n","/** 可转换为日期的输入;数字始终按 Unix 毫秒时间戳处理。 */\nexport type DateInput = Date | number | string;\n\n/** {@link formatRelativeTime} 的语言与基准时间选项。 */\nexport interface RelativeTimeOptions {\n\t/** `Intl.RelativeTimeFormat` 使用的语言;默认固定为 `zh-CN`。 */\n\tlocale?: string | readonly string[];\n\t/** 比较基准,默认当前时间。 */\n\tnow?: DateInput;\n\t/** 是否允许“昨天”“明天”等文本;默认 `auto`。 */\n\tnumeric?: Intl.RelativeTimeFormatNumeric;\n\t/** 输出长度;默认 `long`。 */\n\tstyle?: Intl.RelativeTimeFormatStyle;\n}\n\n/**\n * 校验日期算术移动量。\n *\n * @param amount - 待校验的日、月或年移动量。\n * @throws `RangeError` 当值不是安全整数。\n */\nconst assertIntegerAmount = (amount: number): void => {\n\tif (!Number.isSafeInteger(amount)) throw new RangeError(\"`amount` 必须是安全整数。\");\n};\n\n/**\n * 转换并克隆有效日期。\n *\n * @remarks 数字不进行秒/毫秒猜测;字符串遵循运行时 `Date` 解析规则,跨平台代码应传带显式时区的完整 ISO 8601。\n * @param value - Date、Unix 毫秒时间戳或运行时可解析字符串。\n * @returns 与输入不共享可变状态的新 Date。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function toDate(value: DateInput): Date {\n\tconst date = value instanceof Date ? new Date(value.getTime()) : new Date(value);\n\tif (!Number.isFinite(date.getTime())) {\n\t\tthrow new TypeError(\"该值不是有效日期。\");\n\t}\n\treturn date;\n}\n\n/**\n * 判断输入能否转换为有效日期。\n *\n * @param value - 任意待检查值。\n * @returns 仅 Date、数字或字符串且时间戳有限时返回 `true`。\n */\nexport function isValidDate(value: unknown): value is DateInput {\n\tif (!(value instanceof Date || typeof value === \"number\" || typeof value === \"string\")) return false;\n\treturn Number.isFinite(new Date(value).getTime());\n}\n\n/**\n * 返回输入日期所在本地时区日期的 `00:00:00.000`,不修改输入。\n *\n * @param value - 有效日期输入。\n * @returns 新建的本地日开始时间。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function startOfDay(value: DateInput): Date {\n\tconst date = toDate(value);\n\tdate.setHours(0, 0, 0, 0);\n\treturn toDate(date);\n}\n\n/**\n * 返回输入日期所在本地时区日期的 `23:59:59.999`,不修改输入。\n *\n * @param value - 有效日期输入。\n * @returns 新建的本地日结束时间。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function endOfDay(value: DateInput): Date {\n\tconst date = toDate(value);\n\tdate.setHours(23, 59, 59, 999);\n\treturn toDate(date);\n}\n\n/**\n * 按本地日历增加整数天,不修改输入。\n *\n * @param value - 基准日期。\n * @param amount - 可为负数的安全整数日数。\n * @returns 本地日历运算后的新 Date;夏令时变化可能使实际毫秒差不等于 24 小时。\n * @throws 日期无效时抛出 `TypeError`;数量或结果非法时抛出 `RangeError`。\n */\nexport function addDays(value: DateInput, amount: number): Date {\n\tassertIntegerAmount(amount);\n\tconst date = toDate(value);\n\tdate.setDate(date.getDate() + amount);\n\treturn toDate(date);\n}\n\n/**\n * 按本地日历增加整数月,并把不存在的日期夹到目标月末。\n *\n * @example 1 月 31 日增加一个月会落在 2 月最后一天。\n * @param value - 基准日期。\n * @param amount - 可为负数的安全整数月数。\n * @returns 月份运算后的新 Date。\n * @throws 日期无效时抛出 `TypeError`;数量或结果非法时抛出 `RangeError`。\n */\nexport function addMonths(value: DateInput, amount: number): Date {\n\tassertIntegerAmount(amount);\n\tconst date = toDate(value);\n\tconst originalDay = date.getDate();\n\tdate.setDate(1);\n\tdate.setMonth(date.getMonth() + amount);\n\tconst targetMonthEnd = new Date(date.getTime());\n\t// 避免 `new Date(year, ...)` 把 0 至 99 年解释为 1900 至 1999 年。\n\ttargetMonthEnd.setMonth(targetMonthEnd.getMonth() + 1, 0);\n\tconst lastDay = targetMonthEnd.getDate();\n\tdate.setDate(Math.min(originalDay, lastDay));\n\treturn toDate(date);\n}\n\n/**\n * 按本地日历增加整数年,并沿用 {@link addMonths} 的月末夹取规则。\n *\n * @param value - 基准日期。\n * @param amount - 可为负数的安全整数年数。\n * @returns 年份运算后的新 Date。\n * @throws 日期无效时抛出 `TypeError`;数量或结果非法时抛出 `RangeError`。\n */\nexport function addYears(value: DateInput, amount: number): Date {\n\tassertIntegerAmount(amount);\n\treturn addMonths(value, amount * 12);\n}\n\n/**\n * 判断两个输入是否属于同一本地日历日。\n *\n * @param left - 第一日期。\n * @param right - 第二日期。\n * @returns 本地年、月、日均相同时返回 `true`。\n * @throws 任一输入无效时抛出 `TypeError`。\n */\nexport function isSameDay(left: DateInput, right: DateInput): boolean {\n\tconst first = toDate(left);\n\tconst second = toDate(right);\n\treturn first.getFullYear() === second.getFullYear() && first.getMonth() === second.getMonth() && first.getDate() === second.getDate();\n}\n\n/**\n * 判断时间是否晚于基准时间。\n *\n * @param value - 待比较时间。\n * @param now - 比较基准,默认调用时的当前时刻。\n * @returns `value` 严格晚于基准时返回 `true`。\n * @throws 任一输入无效时抛出 `TypeError`。\n */\nexport function isFuture(value: DateInput, now: DateInput = Date.now()): boolean {\n\treturn toDate(value).getTime() > toDate(now).getTime();\n}\n\n/**\n * 返回指定基准所在本地日历日的完整闭区间。\n *\n * @param value - 日期基准,默认调用时当前日期。\n * @returns 新建的本地日开始和结束时间二元组。\n * @throws 输入无效时抛出 `TypeError`。\n */\nexport function getLocalDayBounds(value: DateInput = Date.now()): [start: Date, end: Date] {\n\treturn [startOfDay(value), endOfDay(value)];\n}\n\n/**\n * 判断日期是否位于包含首尾的时间区间。\n *\n * @param value - 待检查日期。\n * @param start - 包含的起点。\n * @param end - 包含的终点。\n * @returns 时间戳位于闭区间内时返回 `true`。\n * @throws 无效日期抛出 `TypeError`;首尾反向时抛出 `RangeError`。\n */\nexport function isWithinInterval(value: DateInput, start: DateInput, end: DateInput): boolean {\n\tconst timestamp = toDate(value).getTime();\n\tconst startTimestamp = toDate(start).getTime();\n\tconst endTimestamp = toDate(end).getTime();\n\tif (startTimestamp > endTimestamp) throw new RangeError(\"`start` 不能晚于 `end`。\");\n\treturn timestamp >= startTimestamp && timestamp <= endTimestamp;\n}\n\n/**\n * 使用 `Intl.RelativeTimeFormat` 生成人类可读相对时间。\n *\n * @remarks 秒、分钟、小时、天、周、月和年按固定时长阈值选择;这适合展示,不适合计费或日历运算。\n * @param value - 目标时间。\n * @param options - 语言、样式与比较基准。\n * @returns 由 `Intl.RelativeTimeFormat` 生成的本地化文本。\n * @throws 日期无效时抛出 `TypeError`;Locale 或 Intl 选项非法时抛出 `RangeError`。\n */\nexport function formatRelativeTime(value: DateInput, options: RelativeTimeOptions = {}): string {\n\tconst differenceSeconds = (toDate(value).getTime() - toDate(options.now ?? Date.now()).getTime()) / 1000;\n\tconst absolute = Math.abs(differenceSeconds);\n\tlet divisor: number;\n\tlet unit: Intl.RelativeTimeFormatUnit;\n\tif (absolute < 60) {\n\t\tdivisor = 1;\n\t\tunit = \"second\";\n\t} else if (absolute < 3_600) {\n\t\tdivisor = 60;\n\t\tunit = \"minute\";\n\t} else if (absolute < 86_400) {\n\t\tdivisor = 3_600;\n\t\tunit = \"hour\";\n\t} else if (absolute < 604_800) {\n\t\tdivisor = 86_400;\n\t\tunit = \"day\";\n\t} else if (absolute < 2_629_800) {\n\t\tdivisor = 604_800;\n\t\tunit = \"week\";\n\t} else if (absolute < 31_557_600) {\n\t\tdivisor = 2_629_800;\n\t\tunit = \"month\";\n\t} else {\n\t\tdivisor = 31_557_600;\n\t\tunit = \"year\";\n\t}\n\tconst formatter = new Intl.RelativeTimeFormat(options.locale ?? \"zh-CN\", {\n\t\tnumeric: options.numeric ?? \"auto\",\n\t\tstyle: options.style ?? \"long\",\n\t});\n\treturn formatter.format(Math.round(differenceSeconds / divisor), unit);\n}\n\n/** 日期选择器单日期快捷项。 */\nexport interface DateShortcut {\n\t/** 面向中文日期选择器的显示文本;调用方可直接用于菜单标签。 */\n\ttext: string;\n\t/**\n\t * 计算快捷项对应日期。\n\t * @returns 每次调用时基于当前本地时间创建的新 `Date`,调用方可安全修改。\n\t */\n\tvalue: () => Date;\n}\n\n/** 日期选择器范围快捷项。 */\nexport interface DateRangeShortcut {\n\t/** 面向中文日期范围选择器的显示文本;调用方可直接用于菜单标签。 */\n\ttext: string;\n\t/**\n\t * 计算快捷项对应的本地日期范围。\n\t * @returns 每次调用时创建的新元组;起点为 `00:00:00.000`,终点为 `23:59:59.999`。\n\t */\n\tvalue: () => [start: Date, end: Date];\n}\n\n/** 历史快捷项允许移动的本地日历单位。 */\ntype CalendarUnit = \"day\" | \"month\" | \"year\";\n\n/**\n * 移动本地日历字段。\n *\n * @remarks 直接使用 Date Setter,以保留历史快捷项在月底和闰年的溢出语义。\n * @param date - 会被原地修改的日期。\n * @param amount - 对目标字段增加的整数。\n * @param unit - 要移动的日历字段。\n */\nconst shiftCalendarFieldInPlace = (date: Date, amount: number, unit: CalendarUnit): void => {\n\tswitch (unit) {\n\t\tcase \"day\":\n\t\t\tdate.setDate(date.getDate() + amount);\n\t\t\tbreak;\n\t\tcase \"month\":\n\t\t\tdate.setMonth(date.getMonth() + amount);\n\t\t\tbreak;\n\t\tcase \"year\":\n\t\t\tdate.setFullYear(date.getFullYear() + amount);\n\t\t\tbreak;\n\t}\n};\n\n/**\n * 创建动态单日期快捷项。\n *\n * @param text - 日期选择器显示文本。\n * @param amount - 相对当前时间的移动量。\n * @param unit - 移动使用的日历单位。\n * @returns 每次执行 `value` 都重新读取当前时间的快捷项。\n */\nconst createDateShortcut = (text: string, amount: number, unit: CalendarUnit): DateShortcut => ({\n\ttext,\n\tvalue: (): Date => {\n\t\tconst date = new Date();\n\t\tshiftCalendarFieldInPlace(date, amount, unit);\n\t\tdate.setHours(0, 0, 0, 0);\n\t\treturn date;\n\t},\n});\n\n/**\n * 创建动态日期范围快捷项。\n *\n * @param text - 日期选择器显示文本。\n * @param amount - 范围边界相对当前时间的移动量。\n * @param unit - 移动使用的日历单位。\n * @param towardFuture - `true` 移动结束边界,`false` 移动开始边界。\n * @returns 每次求值都覆盖完整本地日边界的范围快捷项。\n */\nconst createRangeShortcut = (text: string, amount: number, unit: CalendarUnit, towardFuture: boolean): DateRangeShortcut => ({\n\ttext,\n\tvalue: (): [Date, Date] => {\n\t\tconst start = new Date();\n\t\tconst end = new Date();\n\t\tshiftCalendarFieldInPlace(towardFuture ? end : start, towardFuture ? amount : -amount, unit);\n\t\tstart.setHours(0, 0, 0, 0);\n\t\tend.setHours(23, 59, 59, 999);\n\t\treturn [start, end];\n\t},\n});\n\n/**\n * 把日期转换为固定中文相对时间文本。\n *\n * @remarks 10 位以内数字按 Unix 秒处理,其余数字按毫秒处理;月份与年份按本地日历月差计算。\n * @param value - Date、时间戳、可解析字符串或空值。\n * @returns 例如“3分钟前”“半年后”;非法或空输入返回空字符串。\n */\nexport function formatChineseRelativeTime(value: Date | number | string | null | undefined): string {\n\tif (value === null || value === undefined) return \"\";\n\tlet timestamp: number;\n\tif (typeof value === \"string\") timestamp = new Date(value).getTime();\n\telse if (typeof value === \"number\") timestamp = value.toString().length <= 10 ? value * 1000 : value;\n\telse timestamp = value.getTime();\n\tif (!Number.isFinite(timestamp)) return \"\";\n\n\tconst minute = 60_000;\n\tconst hour = minute * 60;\n\tconst day = hour * 24;\n\tconst currentTimestamp = Date.now();\n\tconst difference = currentTimestamp - timestamp;\n\tconst minuteDifference = Math.abs(difference) / minute;\n\tconst hourDifference = Math.abs(difference) / hour;\n\tconst dayDifference = Math.abs(difference) / day;\n\tconst currentDate = new Date(currentTimestamp);\n\tconst targetDate = new Date(timestamp);\n\tconst monthDifference = (currentDate.getFullYear() - targetDate.getFullYear()) * 12 + currentDate.getMonth() - targetDate.getMonth();\n\tconst suffix = difference < 0 ? \"后\" : \"前\";\n\tif (Math.abs(monthDifference) >= 12) return `${Math.floor(Math.abs(monthDifference) / 12)}年${suffix}`;\n\tif (Math.abs(monthDifference) >= 6) return `半年${suffix}`;\n\tif (Math.abs(monthDifference) >= 1) return `${Math.abs(monthDifference)}月${suffix}`;\n\tif (dayDifference >= 15) return `半月${suffix}`;\n\tif (dayDifference >= 7) return `${Math.floor(dayDifference / 7)}周${suffix}`;\n\tif (dayDifference >= 1) return `${Math.floor(dayDifference)}天${suffix}`;\n\tif (hourDifference >= 1) return `${Math.floor(hourDifference)}小时${suffix}`;\n\tif (minuteDifference >= 1) return `${Math.floor(minuteDifference)}分钟${suffix}`;\n\treturn \"刚刚\";\n}\n\n/**\n * 创建从今天到前后一个月日期的完整本地日范围。\n *\n * @param towardFuture - `true` 返回今天至一个月后,默认返回一个月前至今天。\n * @returns 每次调用新建的本地日首尾边界。\n */\nexport function createOneMonthRangeFromToday(towardFuture = false): [start: Date, end: Date] {\n\tconst start = new Date();\n\tconst end = new Date();\n\tshiftCalendarFieldInPlace(towardFuture ? end : start, towardFuture ? 1 : -1, \"month\");\n\tstart.setHours(0, 0, 0, 0);\n\tend.setHours(23, 59, 59, 999);\n\treturn [start, end];\n}\n\n/**\n * 判断日期是否晚于调用时的当前时刻。\n *\n * @param time - 待比较日期。\n * @returns 时间戳严格晚于 `Date.now()` 时返回 `true`。\n */\nexport function isDateAfterNow(time: Date): boolean {\n\treturn time.getTime() > Date.now();\n}\n\n/**\n * 根据浏览器本地小时返回固定中文问候语。\n *\n * @returns 与当前时段对应的中文欢迎文本。\n */\nexport function getLocalTimeGreeting(): string {\n\tconst hour = new Date().getHours();\n\tif (hour < 5) return \"夜深了,注意身体哦!\";\n\tif (hour < 9) return \"早上好!欢迎回来!\";\n\tif (hour < 12) return \"上午好!欢迎回来!\";\n\tif (hour < 14) return \"中午好!欢迎回来!\";\n\tif (hour < 18) return \"下午好!欢迎回来!\";\n\tif (hour < 24) return \"晚上好!欢迎回来!\";\n\treturn \"您好!欢迎回来!\";\n}\n\n/**\n * 创建面向过去或未来的常用完整日期范围快捷项。\n *\n * @param towardFuture - `true` 创建未来范围,默认创建历史范围。\n * @returns 每次求值都会重新读取当前时间的范围快捷项。\n */\nexport function createDateRangeShortcuts(towardFuture = false): DateRangeShortcut[] {\n\treturn towardFuture\n\t\t? [\n\t\t\t\tcreateRangeShortcut(\"后1天\", 1, \"day\", true),\n\t\t\t\tcreateRangeShortcut(\"后3天\", 3, \"day\", true),\n\t\t\t\tcreateRangeShortcut(\"后1周\", 7, \"day\", true),\n\t\t\t\tcreateRangeShortcut(\"后1月\", 1, \"month\", true),\n\t\t\t\tcreateRangeShortcut(\"后3月\", 3, \"month\", true),\n\t\t\t\tcreateRangeShortcut(\"后6月\", 6, \"month\", true),\n\t\t\t\tcreateRangeShortcut(\"后1年\", 1, \"year\", true),\n\t\t\t]\n\t\t: [\n\t\t\t\tcreateRangeShortcut(\"近1天\", 1, \"day\", false),\n\t\t\t\tcreateRangeShortcut(\"近3天\", 3, \"day\", false),\n\t\t\t\tcreateRangeShortcut(\"近1周\", 7, \"day\", false),\n\t\t\t\tcreateRangeShortcut(\"近1月\", 1, \"month\", false),\n\t\t\t\tcreateRangeShortcut(\"近3月\", 3, \"month\", false),\n\t\t\t\tcreateRangeShortcut(\"近6月\", 6, \"month\", false),\n\t\t\t\tcreateRangeShortcut(\"近1年\", 1, \"year\", false),\n\t\t\t];\n}\n\n/**\n * 创建面向过去或未来的常用单日期快捷项。\n *\n * @param towardFuture - `true` 创建未来日期,默认创建历史日期。\n * @returns 每次求值都会重新读取当前时间的单日期快捷项。\n */\nexport function createDateShortcuts(towardFuture = false): DateShortcut[] {\n\treturn towardFuture\n\t\t? [\n\t\t\t\tcreateDateShortcut(\"今天\", 0, \"day\"),\n\t\t\t\tcreateDateShortcut(\"明天\", 1, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一周后\", 7, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一月后\", 1, \"month\"),\n\t\t\t\tcreateDateShortcut(\"一年后\", 1, \"year\"),\n\t\t\t]\n\t\t: [\n\t\t\t\tcreateDateShortcut(\"今天\", 0, \"day\"),\n\t\t\t\tcreateDateShortcut(\"昨天\", -1, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一周前\", -7, \"day\"),\n\t\t\t\tcreateDateShortcut(\"一月前\", -1, \"month\"),\n\t\t\t\tcreateDateShortcut(\"一年前\", -1, \"year\"),\n\t\t\t];\n}\n\n/**\n * 返回今天的本地零点。\n *\n * @returns 新建的 `00:00:00.000` Date。\n */\nexport function getStartOfToday(): Date {\n\treturn startOfDay(new Date());\n}\n","/** 可序列化为内联 CSS 的单个值。 */\nexport type StyleValue = number | string | null | undefined;\n\n/** camelCase、kebab-case 或 CSS 自定义属性组成的只读样式对象。 */\nexport type StyleObject = Readonly<Record<string, StyleValue>>;\n\n/** 字符串、样式对象、嵌套数组或空值。 */\nexport type StyleInput = string | StyleObject | readonly StyleInput[] | null | undefined;\n\n/**\n * 判断 StyleInput 是否为递归样式数组。\n *\n * @param value - 待缩小的样式输入。\n * @returns 是只读样式数组时返回 `true`。\n */\nconst isStyleArray = (value: StyleInput): value is readonly StyleInput[] => Array.isArray(value);\n\n/**\n * 判断文本是否可按十进制数值追加 CSS 单位。\n *\n * @param value - 已去除外围空白的文本。\n * @returns 有限十进制数值返回 `true`;二、八、十六进制前缀返回 `false`。\n */\nconst isNumericString = (value: string): boolean => {\n\tif (value.length === 0 || !Number.isFinite(Number(value))) return false;\n\tconst unsigned = value.startsWith(\"+\") || value.startsWith(\"-\") ? value.slice(1) : value;\n\treturn !/^0[box]/iu.test(unsigned);\n};\n\n/**\n * 把 JavaScript 样式属性名转换为 CSS 属性名。\n *\n * @param key - camelCase、kebab-case 或 CSS 自定义属性名。\n * @returns kebab-case 属性名;`--` 自定义属性保持原样。\n */\nconst toCssPropertyName = (key: string): string => {\n\tif (key.startsWith(\"--\")) return key;\n\tconst normalized = key.startsWith(\"ms\") ? `-${key}` : key;\n\treturn normalized.replace(/([A-Z])/gu, \"-$1\").toLowerCase();\n};\n\n/**\n * 为数值或纯数字字符串添加 CSS 单位。\n *\n * @param value - 数字、数字字符串或已有单位的 CSS 值;空值返回空字符串。\n * @param unit - 非零数字使用的单位,默认 `px`。\n * @returns 零统一返回 `\"0\"`;非数字字符串保持原样。\n * @throws `RangeError` 当数字非有限或单位为空。\n */\nexport function addCssUnit(value?: string | number | null, unit = \"px\"): string {\n\tif (value === null || value === undefined || value === \"\") return \"\";\n\tif (unit.length === 0) throw new RangeError(\"`unit` 不能为空。\");\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) throw new RangeError(\"`value` 必须是有限数。\");\n\t\treturn value === 0 ? \"0\" : `${value}${unit}`;\n\t}\n\tconst trimmed = value.trim();\n\tif (!isNumericString(trimmed)) return value;\n\treturn Number(trimmed) === 0 ? \"0\" : `${trimmed}${unit}`;\n}\n\n/**\n * 将样式字符串、对象或嵌套数组序列化为内联 CSS。\n *\n * @remarks 本函数只负责结构转换,不是 CSS 安全清洗器。不可信值必须由调用方按照\n * 实际渲染上下文验证,尤其不能允许用户控制属性名、`url()` 或自定义属性内容。\n * 数字不会自动附加单位;需要长度单位时应先调用 {@link addCssUnit}。\n * @param styles - 可嵌套样式输入;后出现的声明由 CSS 层叠规则覆盖先前声明。\n * @returns 以分号结束、以空格分隔的 CSS 声明字符串。\n * @throws `RangeError` 当对象中包含 `NaN` 或无穷数字。\n */\nexport function serializeStyle(styles: StyleInput): string {\n\tif (styles === null || styles === undefined || styles === \"\") return \"\";\n\tif (isStyleArray(styles)) {\n\t\treturn styles\n\t\t\t.map((item) => serializeStyle(item))\n\t\t\t.filter((item) => item.length > 0)\n\t\t\t.join(\" \");\n\t}\n\tif (typeof styles === \"string\") {\n\t\tconst value = styles.trim();\n\t\treturn value.length === 0 ? \"\" : value.endsWith(\";\") ? value : `${value};`;\n\t}\n\n\treturn Object.entries(styles)\n\t\t.filter(([, value]) => value !== null && value !== undefined && value !== \"\")\n\t\t.map(([key, value]) => {\n\t\t\tif (typeof value === \"number\" && !Number.isFinite(value)) throw new RangeError(`样式属性“${key}”必须是有限数。`);\n\t\t\treturn `${toCssPropertyName(key)}:${String(value)};`;\n\t\t})\n\t\t.join(\" \");\n}\n","/** 可识别的主要 JavaScript 运行环境。 */\nexport type RuntimeKind = \"browser\" | \"node\" | \"unknown\" | \"worker\";\n\n/**\n * 延迟读取当前 User-Agent。\n *\n * @returns Navigator 不存在或字段类型异常时返回空字符串。\n */\nconst currentUserAgent = (): string => (typeof globalThis.navigator?.userAgent === \"string\" ? globalThis.navigator.userAgent : \"\");\n/**\n * 延迟读取当前设备报告的最大触点数。\n *\n * @returns Navigator 不存在或字段类型异常时返回 `0`。\n */\nconst currentTouchPoints = (): number => (typeof globalThis.navigator?.maxTouchPoints === \"number\" ? globalThis.navigator.maxTouchPoints : 0);\n\n/**\n * 判断当前运行时是否具有浏览器 `window` 与 `document`。\n *\n * @returns 两项能力均存在时返回 `true`;不读取 DOM 内容。\n */\nexport function isBrowser(): boolean {\n\tconst window = globalThis.window;\n\treturn window !== undefined && window !== null && window.document !== null && typeof window.document === \"object\";\n}\n\n/**\n * 判断当前运行时是否像 Web Worker 且不是 Window。\n *\n * @remarks 经典、模块、Shared 与 Service Worker 全局通常都暴露 `importScripts`;模块\n * Worker 中调用它可能抛错,本检测只检查能力存在,不会执行。\n * @returns 具有 `importScripts` 且不是浏览器 Window 时返回 `true`。\n */\nexport function isWebWorker(): boolean {\n\treturn !isBrowser() && typeof Reflect.get(globalThis, \"importScripts\") === \"function\";\n}\n\n/**\n * 判断当前运行时是否暴露 Node.js 版本标记。\n *\n * @returns `process.versions.node` 为字符串时返回 `true`。\n */\nexport function isNode(): boolean {\n\tconst process: unknown = Reflect.get(globalThis, \"process\");\n\tif ((typeof process !== \"object\" && typeof process !== \"function\") || process === null) return false;\n\tconst versions: unknown = Reflect.get(process, \"versions\");\n\treturn (typeof versions === \"object\" || typeof versions === \"function\") && versions !== null && typeof Reflect.get(versions, \"node\") === \"string\";\n}\n\n/**\n * 判断当前运行时是否暴露 uni-app 的 `uni` 全局对象。\n *\n * @returns 全局属性存在且不为 `undefined` 时返回 `true`;不调用任何平台 API。\n */\nexport function isUniApp(): boolean {\n\treturn Reflect.get(globalThis, \"uni\") !== undefined;\n}\n\n/**\n * 判断当前运行时是否具备本库完整加密 API 所需的 Web Crypto 能力。\n *\n * @remarks 普通随机数、随机字符串和 UUID 在缺少 Web Crypto 时可以回退到 `Math.random()`,但本函数\n * 仍会返回 `false`,因为摘要、PBKDF2、AES-GCM、RSA 与 ECC 需要完整的 Web Crypto 能力。\n * @returns 同时提供本库 Web Crypto 功能所需方法时返回 `true`。\n */\nexport function hasWebCrypto(): boolean {\n\tconst crypto = globalThis.crypto;\n\tconst subtle = crypto?.subtle;\n\treturn (\n\t\ttypeof crypto?.getRandomValues === \"function\" &&\n\t\ttypeof subtle?.decrypt === \"function\" &&\n\t\ttypeof subtle.deriveBits === \"function\" &&\n\t\ttypeof subtle.deriveKey === \"function\" &&\n\t\ttypeof subtle.digest === \"function\" &&\n\t\ttypeof subtle.encrypt === \"function\" &&\n\t\ttypeof subtle.exportKey === \"function\" &&\n\t\ttypeof subtle.generateKey === \"function\" &&\n\t\ttypeof subtle.importKey === \"function\" &&\n\t\ttypeof subtle.sign === \"function\" &&\n\t\ttypeof subtle.verify === \"function\"\n\t);\n}\n\n/**\n * 返回当前主要运行环境。\n *\n * @remarks 在使用 DOM 模拟器的 Node.js 进程中优先报告 `browser`,因为可观察能力比宿主进程名称更有用。\n * @returns `browser`、`worker`、`node` 或无法识别时的 `unknown`。\n */\nexport function detectRuntime(): RuntimeKind {\n\tif (isBrowser()) return \"browser\";\n\tif (isWebWorker()) return \"worker\";\n\tif (isNode()) return \"node\";\n\treturn \"unknown\";\n}\n\n/**\n * 基于 User-Agent 启发式判断手机设备。\n *\n * @param userAgent - 默认读取当前 `navigator.userAgent`;平台对象不存在时使用空字符串。\n * @remarks User-Agent 可以被伪造,不得用于鉴权、安全策略或永久功能分流。\n * @returns 命中手机特征时返回 `true`。\n */\nexport function isMobileUserAgent(userAgent: string = currentUserAgent()): boolean {\n\treturn /Mobile|iPhone|Android.*Mobile|Windows Phone/iu.test(userAgent);\n}\n\n/**\n * 基于 User-Agent 与触点数量启发式判断平板设备。\n *\n * @param userAgent - 默认读取当前 User-Agent。\n * @param maxTouchPoints - 用于识别桌面 User-Agent 模式下的 iPadOS,默认读取当前触点数。\n * @returns 命中平板特征时返回 `true`。\n */\nexport function isTabletUserAgent(userAgent: string = currentUserAgent(), maxTouchPoints: number = currentTouchPoints()): boolean {\n\treturn /iPad|Android(?!.*Mobile)|Tablet/iu.test(userAgent) || (/Macintosh/iu.test(userAgent) && maxTouchPoints > 1);\n}\n","import { decodeSecureBase64, encodeSecureBase64 } from \"../base64/index\";\n\n/** uni-app 同步存储信息中本库实际读取的字段。 */\ninterface UniStorageInfo {\n\t/** 当前平台可见的物理键快照。 */\n\tkeys: readonly string[];\n}\n\n/** 全局 `uni` 必须提供的同步存储 API 最小结构。 */\ninterface UniStorageLike {\n\t/**\n\t * 同步读取一个物理键的原始值。\n\t * @param key - 已包含全局命名空间前缀的物理键。\n\t * @returns 平台保存的值;键缺失时应返回 `undefined`、`null` 或空字符串。\n\t */\n\tgetStorageSync: (key: string) => unknown;\n\t/**\n\t * 同步读取平台当前可见的全部物理键。\n\t * @returns 至少包含只读 `keys` 数组的快照对象。\n\t */\n\tgetStorageInfoSync: () => UniStorageInfo;\n\t/**\n\t * 同步删除一个物理键;键不存在时应保持幂等。\n\t * @param key - 已包含全局命名空间前缀的物理键。\n\t */\n\tremoveStorageSync: (key: string) => void;\n\t/**\n\t * 同步写入已经序列化的包络文本。\n\t * @param key - 已包含全局命名空间前缀的物理键。\n\t * @param value - JSON 包络字符串,不是未经编码的业务值。\n\t */\n\tsetStorageSync: (key: string, value: string) => void;\n}\n\n/** Storage 业务值编码器。 */\nexport interface StorageCodec {\n\t/**\n\t * 把已编码文本恢复为业务值。\n\t * @param value - 由同一 Codec 的 `encode` 生成并持久化的文本。\n\t * @returns 解码后的业务值。\n\t * @throws 当文本损坏、格式不受支持或无法反序列化时应抛出错误。\n\t */\n\tdecode: (value: string) => unknown;\n\t/**\n\t * 把业务值编码为可持久化字符串。\n\t * @param value - 调用方传入的业务值。\n\t * @returns 可由同一 Codec 的 `decode` 无损恢复的文本。\n\t * @throws 当值不受支持或无法序列化时应抛出错误。\n\t */\n\tencode: (value: unknown) => string;\n}\n\n/** 程序入口调用 {@link configureStorage} 时使用的全局配置。 */\nexport interface StorageConfiguration {\n\t/** 自定义值编码器;默认使用严格 JSON Codec,同一应用生命周期内必须保持同一引用。 */\n\tcodec?: StorageCodec;\n\t/** 启用 Base64 可逆混淆;不提供加密、完整性或认证,不能与 `codec` 同时使用。 */\n\tcrypto?: boolean;\n\t/** 返回 Unix 毫秒时间戳的时钟;默认使用 `Date.now`,主要用于 TTL 测试与受控时间源。 */\n\tnow?: () => number;\n\t/** 所有物理键使用的非空命名空间前缀; */\n\tprefix?: string;\n}\n\n/** 单次 Storage 读取配置。 */\nexport interface StorageReadOptions {\n\t/**\n\t * 仅覆盖本次读取使用的 Codec;`true` 使用 Base64 混淆,`false` 使用 JSON,省略时使用全局配置。\n\t * 必须与写入该条目时使用的单次设置一致。\n\t */\n\tcrypto?: boolean;\n}\n\n/** 单次 Storage 写入配置。 */\nexport interface StorageWriteOptions extends StorageReadOptions {\n\t/** 从写入时刻开始的有效毫秒数;必须是大于 0 的有限数,省略时永久有效。 */\n\tttlMs?: number;\n}\n\n/** `Local` 与 `Session` 的统一操作接口。 */\nexport interface StorageArea {\n\t/** 当前全局 Storage 配置的物理键前缀;首次读取会激活默认配置。 */\n\treadonly prefix: string;\n\t/**\n\t * 删除当前命名空间内的全部键,不影响同一后端中的其他应用键。\n\t * @throws `Error` 当当前平台后端不可用。\n\t */\n\tclear: () => void;\n\t/**\n\t * 获取并解码业务值;已过期记录会在读取时删除。\n\t * @param key - 不含全局前缀的非空业务键。\n\t * @param options - 可选的单次 Base64 混淆开关;必须与写入时一致。\n\t * @returns 解码后的值;未传泛型时静态类型默认为 `string`,键缺失或过期时返回 `undefined`。\n\t * @throws 当键非法、包络损坏、Codec 解码失败或后端不可用时抛出错误。\n\t */\n\tget: <Value = string>(key: string, options?: StorageReadOptions) => Value | undefined;\n\t/**\n\t * 判断一个可成功读取且未过期的业务键是否存在。\n\t * @param key - 不含全局前缀的非空业务键。\n\t * @returns 键存在且包络有效时返回 `true`。\n\t */\n\thas: (key: string) => boolean;\n\t/**\n\t * 返回当前命名空间内的业务键快照。\n\t * @returns 已移除全局前缀并按字典序排列的新数组;不会自动清理过期项。\n\t */\n\tkeys: () => string[];\n\t/**\n\t * 扫描当前命名空间并删除全部过期记录。\n\t * @returns 本次实际删除的记录数量。\n\t * @throws 当发现损坏包络或后端不可用时抛出错误。\n\t */\n\tpruneExpired: () => number;\n\t/**\n\t * 删除单个业务键;键不存在时保持幂等。\n\t * @param key - 不含全局前缀的非空业务键。\n\t */\n\tremove: (key: string) => void;\n\t/**\n\t * 删除业务键以指定文本开头的全部条目,范围仍受全局命名空间限制。\n\t * @param keyPrefix - 不含全局前缀的非空业务键前缀。\n\t */\n\tremoveByPrefix: (keyPrefix: string) => void;\n\t/**\n\t * 编码并写入业务值,可附加惰性清理的 TTL。\n\t * @param key - 不含全局前缀的非空业务键。\n\t * @param value - 必须受当前 Codec 支持的业务值。\n\t * @param options - 可选的单次写入 TTL 与 Base64 混淆开关。\n\t * @throws 当键、TTL、业务值或后端写入无效时抛出错误。\n\t */\n\tset: <Value>(key: string, value: Value, options?: StorageWriteOptions) => void;\n}\n\n/** 浏览器 Storage 与 uni-app Storage 适配后的最小内部协议。 */\ninterface StorageBackend {\n\t/** 读取物理键原始值;缺失约定由上层统一规范为 `undefined`。 */\n\tgetItem: (key: string) => unknown;\n\t/** 枚举后端可见的全部物理键;返回值必须是不会随枚举过程变化的快照。 */\n\tkeys: () => readonly string[];\n\t/** 删除单个物理键;实现必须允许重复删除。 */\n\tremoveItem: (key: string) => void;\n\t/** 写入已经序列化的包络文本;配额和平台错误保持原样传播。 */\n\tsetItem: (key: string, value: string) => void;\n}\n\n/** 物理存储中的版本化包络;业务值始终先经 Codec 转为文本。 */\ninterface StoredEnvelope {\n\t/** Codec 编码后的业务文本;只有在包络结构校验通过后才能交给 Codec。 */\n\tdata: string;\n\t/** Unix 毫秒绝对过期时间戳;`null` 表示永久有效。 */\n\texpiresAt: number | null;\n\t/** 当前持久化协议版本;读取其他版本必须明确失败,不能猜测迁移。 */\n\tversion: 3;\n}\n\n/** 首次配置后冻结使用的解析结果和两个稳定门面。 */\ninterface ActiveStorageConfiguration {\n\t/** 首次配置后锁定的业务值 Codec 引用。 */\n\tcodec: StorageCodec;\n\t/** 已绑定 Local 后端、命名空间、Codec 与时钟的实际 Area。 */\n\tlocal: StorageArea;\n\t/** 首次配置后锁定的 TTL 时钟引用。 */\n\tnow: () => number;\n\t/** 所有 Area 共享的物理键命名空间前缀。 */\n\tprefix: string;\n\t/** 仅浏览器模式存在的 Session Area;uni-app 模式必须保持缺失。 */\n\tsession?: StorageArea;\n}\n\n/**\n * 读取并校验当前运行时的全局 uni-app 同步 Storage。\n *\n * @returns 检测到 uni-app 时返回同步 Storage;普通浏览器环境返回 `undefined`。\n * @throws `TypeError` 当全局 `uni` 存在但缺少本库需要的同步 Storage 方法。\n */\nconst getGlobalUniStorage = (): UniStorageLike | undefined => {\n\tconst value: unknown = Reflect.get(globalThis, \"uni\");\n\tif (value === undefined) return undefined;\n\tif ((typeof value !== \"object\" && typeof value !== \"function\") || value === null) {\n\t\tthrow new TypeError(\"全局 uni 对象未提供同步 Storage API。\");\n\t}\n\tconst storage = value as Partial<UniStorageLike>;\n\tif (\n\t\ttypeof storage.getStorageSync !== \"function\" ||\n\t\ttypeof storage.getStorageInfoSync !== \"function\" ||\n\t\ttypeof storage.removeStorageSync !== \"function\" ||\n\t\ttypeof storage.setStorageSync !== \"function\"\n\t) {\n\t\tthrow new TypeError(\"全局 uni 对象未提供同步 Storage API。\");\n\t}\n\treturn storage as UniStorageLike;\n};\n\n/** 默认 JSON Codec;显式拒绝会被 JSON.stringify 静默丢弃的顶层值。 */\nconst jsonCodec: StorageCodec = {\n\tdecode: (value): unknown => JSON.parse(value) as unknown,\n\tencode: (value): string => {\n\t\tconst encoded: unknown = JSON.stringify(value);\n\t\tif (typeof encoded !== \"string\") throw new TypeError(\"存储值无法序列化为 JSON。\");\n\t\treturn encoded;\n\t},\n};\n\n/** Base64 混淆 Codec;只隐藏明文外观,不提供加密、完整性或认证。 */\nexport const base64StorageCodec: StorageCodec = {\n\tdecode: (value): unknown => JSON.parse(decodeSecureBase64(value)) as unknown,\n\tencode: (value): string => {\n\t\tconst encoded: unknown = JSON.stringify(value);\n\t\tif (typeof encoded !== \"string\") throw new TypeError(\"存储值无法序列化为 JSON。\");\n\t\treturn encodeSecureBase64(encoded);\n\t},\n};\n\n/** 页面级唯一配置;只允许幂等重复配置,避免模块加载顺序改变行为。 */\nlet activeConfiguration: ActiveStorageConfiguration | undefined;\n\n/**\n * 判断未知值是否为非数组对象记录。\n *\n * @param value - JSON.parse 返回的未知值。\n * @returns 值为非空、非数组对象时返回 `true`。\n */\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * 校验 Storage 业务键。\n *\n * @param key - 不含全局 Prefix 的业务键或业务键前缀。\n * @throws `TypeError` 当值不是非空字符串。\n */\nconst assertKey = (key: string): void => {\n\tif (typeof key !== \"string\" || key.length === 0) throw new TypeError(\"Storage 键必须是非空字符串。\");\n};\n\n/**\n * 创建浏览器 Storage 后端。\n *\n * @remarks 平台对象在调用阶段读取,因此导入模块不会访问浏览器全局对象。\n * @param kind - 选择 `localStorage` 或 `sessionStorage`。\n * @returns 统一的内部同步后端。\n * @throws `Error` 当所选 Storage 在当前环境不可用。\n */\nconst createWebStorageBackend = (kind: \"local\" | \"session\"): StorageBackend => {\n\tconst storage = kind === \"local\" ? globalThis.localStorage : globalThis.sessionStorage;\n\tif (storage === undefined) throw new Error(`当前运行环境不支持 ${kind}Storage。`);\n\treturn {\n\t\tgetItem: (key): string | null => storage.getItem(key),\n\t\tkeys: (): string[] => {\n\t\t\tconst keys: string[] = [];\n\t\t\tfor (let index = 0; index < storage.length; index += 1) {\n\t\t\t\tconst key = storage.key(index);\n\t\t\t\tif (key !== null) keys.push(key);\n\t\t\t}\n\t\t\treturn keys;\n\t\t},\n\t\tremoveItem: (key): void => {\n\t\t\tstorage.removeItem(key);\n\t\t},\n\t\tsetItem: (key, value): void => {\n\t\t\tstorage.setItem(key, value);\n\t\t},\n\t};\n};\n\n/**\n * 把 uni-app 同步 Storage 适配为内部后端。\n *\n * @remarks uni-app 以空字符串同时表示“键缺失”和“真实空值”,因此空字符串需要结合键清单消除歧义。\n * @param storage - 已从全局 `uni` 读取并校验的同步 API。\n * @returns 统一的内部同步后端。\n */\nconst createUniStorageBackend = (storage: UniStorageLike): StorageBackend => ({\n\tgetItem: (key): unknown => {\n\t\tconst value = storage.getStorageSync(key);\n\t\tif (value !== \"\") return value;\n\t\treturn storage.getStorageInfoSync().keys.includes(key) ? value : undefined;\n\t},\n\tkeys: (): readonly string[] => [...storage.getStorageInfoSync().keys],\n\tremoveItem: (key): void => {\n\t\tstorage.removeStorageSync(key);\n\t},\n\tsetItem: (key, value): void => {\n\t\tstorage.setStorageSync(key, value);\n\t},\n});\n\n/**\n * 解析并校验版本化 Storage 包络。\n *\n * @param rawValue - 后端返回的原始值。\n * @param key - 用于错误定位的完整物理键。\n * @returns 当前 v3 包络。\n * @throws `TypeError` 当原始值不是字符串、JSON 损坏、版本不支持或字段类型非法。\n */\nconst parseStoredEnvelope = (rawValue: unknown, key: string): StoredEnvelope => {\n\tif (typeof rawValue !== \"string\") throw new TypeError(`Storage 条目“${key}”不是字符串。`);\n\ttry {\n\t\tconst parsed = JSON.parse(rawValue) as unknown;\n\t\tif (\n\t\t\t!isRecord(parsed) ||\n\t\t\tparsed[\"version\"] !== 3 ||\n\t\t\ttypeof parsed[\"data\"] !== \"string\" ||\n\t\t\t!(parsed[\"expiresAt\"] === null || (typeof parsed[\"expiresAt\"] === \"number\" && Number.isFinite(parsed[\"expiresAt\"])))\n\t\t) {\n\t\t\tthrow new TypeError(\"不支持该存储包络。\");\n\t\t}\n\t\treturn { data: parsed[\"data\"], expiresAt: parsed[\"expiresAt\"], version: 3 };\n\t} catch (cause) {\n\t\tthrow new TypeError(`Storage 条目“${key}”已损坏或不受支持。`, { cause });\n\t}\n};\n\n/**\n * 创建绑定命名空间、Codec 与时钟的 Storage Area。\n *\n * @param backendFactory - 每次操作时解析平台后端的工厂,保证导入安全并反映平台可用性。\n * @param prefix - 已校验的全局物理键前缀。\n * @param codec - 业务值与包络文本之间的 Codec。\n * @param now - TTL 计算使用的可注入时钟。\n * @returns 完整的命名空间 Storage 操作集合。\n */\nconst createStorageArea = (backendFactory: () => StorageBackend, prefix: string, codec: StorageCodec, now: () => number): StorageArea => {\n\t/**\n\t * 拼接物理键。\n\t *\n\t * @param key - 已校验业务键。\n\t * @returns 带当前命名空间前缀的物理键。\n\t */\n\tconst toStorageKey = (key: string): string => `${prefix}${key}`;\n\t/**\n\t * 解析本次读写实际使用的 Codec。\n\t *\n\t * @param crypto - 单次 Base64 混淆开关;省略时沿用 Area 全局 Codec。\n\t * @returns 本次操作使用的全局、JSON 或 Base64 Codec。\n\t * @throws `TypeError` 当 JavaScript 调用方传入非布尔值。\n\t */\n\tconst resolveOperationCodec = (crypto: boolean | undefined): StorageCodec => {\n\t\tif (crypto === undefined) return codec;\n\t\tif (typeof crypto !== \"boolean\") throw new TypeError(\"Storage 单次 `crypto` 选项必须是布尔值。\");\n\t\treturn crypto ? base64StorageCodec : jsonCodec;\n\t};\n\t/**\n\t * 枚举当前命名空间中的业务键。\n\t *\n\t * @param backend - 本次操作使用的后端。\n\t * @returns 已移除物理前缀、去重并排序的业务键。\n\t * @throws `TypeError` 当后端返回非字符串键。\n\t */\n\tconst listBusinessKeys = (backend: StorageBackend): string[] => {\n\t\tconst keys = backend.keys();\n\t\tif (!Array.isArray(keys) || !keys.every((key) => typeof key === \"string\")) {\n\t\t\tthrow new TypeError(\"Storage 后端返回的键必须是字符串。\");\n\t\t}\n\t\treturn [...new Set(keys.filter((key) => key.startsWith(prefix)).map((key) => key.slice(prefix.length)))].sort();\n\t};\n\t/**\n\t * 读取并处理单个包络。\n\t *\n\t * @param backend - 本次操作使用的后端。\n\t * @param key - 业务键。\n\t * @returns 未过期包络;键缺失或已经过期时返回 `undefined`。\n\t * @throws `TypeError` 当键或包络非法。\n\t * @throws `RangeError` 当注入时钟返回非有限时间戳。\n\t */\n\tconst readStoredEnvelope = (backend: StorageBackend, key: string): StoredEnvelope | undefined => {\n\t\tassertKey(key);\n\t\tconst storageKey = toStorageKey(key);\n\t\tconst rawValue = backend.getItem(storageKey);\n\t\tif (rawValue === null || rawValue === undefined) return undefined;\n\t\tconst envelope = parseStoredEnvelope(rawValue, storageKey);\n\t\tif (envelope.expiresAt === null) return envelope;\n\t\tconst timestamp = now();\n\t\tif (!Number.isFinite(timestamp)) throw new RangeError(\"Storage 时钟必须返回有限时间戳。\");\n\t\tif (timestamp < envelope.expiresAt) return envelope;\n\t\t// 过期项在读取时立即删除,后续 has/keys/pruneExpired 观察到一致状态。\n\t\tbackend.removeItem(storageKey);\n\t\treturn undefined;\n\t};\n\n\treturn {\n\t\tprefix,\n\t\tclear(): void {\n\t\t\tconst backend = backendFactory();\n\t\t\tfor (const key of listBusinessKeys(backend)) backend.removeItem(toStorageKey(key));\n\t\t},\n\t\tget<Value>(key: string, options: StorageReadOptions = {}): Value | undefined {\n\t\t\tconst envelope = readStoredEnvelope(backendFactory(), key);\n\t\t\tif (envelope === undefined) return undefined;\n\t\t\ttry {\n\t\t\t\treturn resolveOperationCodec(options.crypto).decode(envelope.data) as Value;\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new TypeError(`无法解码 Storage 条目“${toStorageKey(key)}”。`, { cause });\n\t\t\t}\n\t\t},\n\t\thas: (key): boolean => readStoredEnvelope(backendFactory(), key) !== undefined,\n\t\tkeys: (): string[] => listBusinessKeys(backendFactory()),\n\t\tpruneExpired(): number {\n\t\t\tconst backend = backendFactory();\n\t\t\tlet removed = 0;\n\t\t\tfor (const key of listBusinessKeys(backend)) {\n\t\t\t\t// read 同时处理删除;先读取一次用于区分“原本缺失”和“本轮因过期删除”。\n\t\t\t\tconst before = backend.getItem(toStorageKey(key));\n\t\t\t\tif (before !== null && before !== undefined && readStoredEnvelope(backend, key) === undefined) removed += 1;\n\t\t\t}\n\t\t\treturn removed;\n\t\t},\n\t\tremove(key: string): void {\n\t\t\tassertKey(key);\n\t\t\tbackendFactory().removeItem(toStorageKey(key));\n\t\t},\n\t\tremoveByPrefix(keyPrefix: string): void {\n\t\t\tassertKey(keyPrefix);\n\t\t\tconst backend = backendFactory();\n\t\t\tfor (const key of listBusinessKeys(backend)) if (key.startsWith(keyPrefix)) backend.removeItem(toStorageKey(key));\n\t\t},\n\t\tset<Value>(key: string, value: Value, options: StorageWriteOptions = {}): void {\n\t\t\tassertKey(key);\n\t\t\tif (value === undefined) throw new TypeError(\"不能存储顶层 `undefined`,请改为移除对应的键。\");\n\t\t\tlet expiresAt: number | null = null;\n\t\t\tif (options.ttlMs !== undefined) {\n\t\t\t\tif (!Number.isFinite(options.ttlMs) || options.ttlMs <= 0) throw new RangeError(\"`ttlMs` 必须是大于 0 的有限数。\");\n\t\t\t\tconst timestamp = now();\n\t\t\t\tif (!Number.isFinite(timestamp) || !Number.isFinite(timestamp + options.ttlMs)) {\n\t\t\t\t\tthrow new RangeError(\"Storage 过期时间超出支持的时间戳范围。\");\n\t\t\t\t}\n\t\t\t\texpiresAt = timestamp + options.ttlMs;\n\t\t\t}\n\t\t\tlet data: string;\n\t\t\ttry {\n\t\t\t\tdata = resolveOperationCodec(options.crypto).encode(value);\n\t\t\t\tif (typeof data !== \"string\") throw new TypeError(\"Storage Codec 必须返回字符串。\");\n\t\t\t} catch (cause) {\n\t\t\t\tthrow new TypeError(\"无法编码存储值。\", { cause });\n\t\t\t}\n\t\t\tbackendFactory().setItem(toStorageKey(key), JSON.stringify({ data, expiresAt, version: 3 } satisfies StoredEnvelope));\n\t\t},\n\t};\n};\n\n/**\n * 获取已激活的全局 Storage 配置。\n *\n * @returns 显式配置或首次 Storage 操作创建的默认配置。\n */\nconst requireStorageConfiguration = (): ActiveStorageConfiguration => {\n\tif (activeConfiguration === undefined) configureStorage();\n\tif (activeConfiguration === undefined) throw new Error(\"无法初始化 Storage 配置。\");\n\treturn activeConfiguration;\n};\n\n/**\n * 创建稳定的公开 Storage 门面。\n *\n * @param select - 从激活配置选择 Local 或 Session 的函数。\n * @param name - 用于不可用错误的公开门面名称。\n * @returns 可安全导入、并在首次调用时解析默认或显式配置的稳定对象。\n */\nconst createStorageAreaProxy = (select: (configuration: ActiveStorageConfiguration) => StorageArea | undefined, name: string): StorageArea => {\n\t/**\n\t * 解析当前实际 Area。\n\t *\n\t * @returns 配置中的 Local 或 Session Area。\n\t * @throws `Error` 当 uni-app 模式请求 Session。\n\t */\n\tconst getArea = (): StorageArea => {\n\t\tconst area = select(requireStorageConfiguration());\n\t\tif (area === undefined) throw new Error(`uni-app 中不支持 ${name}。`);\n\t\treturn area;\n\t};\n\treturn {\n\t\tget prefix(): string {\n\t\t\treturn getArea().prefix;\n\t\t},\n\t\tclear: (): void => {\n\t\t\tgetArea().clear();\n\t\t},\n\t\tget: <Value>(key: string, options?: StorageReadOptions): Value | undefined => getArea().get<Value>(key, options),\n\t\thas: (key): boolean => getArea().has(key),\n\t\tkeys: (): string[] => getArea().keys(),\n\t\tpruneExpired: (): number => getArea().pruneExpired(),\n\t\tremove: (key): void => {\n\t\t\tgetArea().remove(key);\n\t\t},\n\t\tremoveByPrefix: (keyPrefix): void => {\n\t\t\tgetArea().removeByPrefix(keyPrefix);\n\t\t},\n\t\tset: <Value>(key: string, value: Value, options?: StorageWriteOptions): void => {\n\t\t\tgetArea().set(key, value, options);\n\t\t},\n\t};\n};\n\n/** 浏览器 localStorage 或自动检测的 uni-app Storage 全局业务入口。 */\nexport const Local: StorageArea = createStorageAreaProxy((configuration) => configuration.local, \"Local\");\n\n/** 浏览器 sessionStorage 的全局业务入口;uni-app 不提供会话存储。 */\nexport const Session: StorageArea = createStorageAreaProxy((configuration) => configuration.session, \"Session\");\n\n/**\n * 在首次 Storage 操作前可选配置 `Local` 与 `Session`。\n *\n * @remarks 不调用时在首次操作上使用 `fast__`、JSON Codec 与 `Date.now`。首次激活后只允许以完全相同的值和引用重复调用。若检测到\n * 全局 `uni`,则自动使用其同步 Storage 且只启用 `Local`,否则使用浏览器 `localStorage` 与 `sessionStorage`。\n * `crypto: true` 仅恢复旧版 Base64 混淆行为,不能保护敏感数据。\n * @param options - 可选的全局键前缀、Codec、旧版混淆选项与时钟。\n * @throws 配置非法、重复配置冲突或目标平台 Storage 不可用时抛出错误。\n */\nexport function configureStorage(options: StorageConfiguration = {}): void {\n\tconst prefix = options.prefix ?? \"fast__\";\n\tif (typeof prefix !== \"string\" || prefix.length === 0) {\n\t\tthrow new TypeError(\"Storage 前缀必须是非空字符串。\");\n\t}\n\tif (options.codec !== undefined && options.crypto === true) {\n\t\tthrow new TypeError(\"Storage 的 Codec 和加密选项不能同时使用。\");\n\t}\n\tconst codec = options.codec ?? (options.crypto === true ? base64StorageCodec : jsonCodec);\n\tconst now = options.now ?? Date.now;\n\tif (activeConfiguration !== undefined) {\n\t\t// 相同配置允许多个入口模块幂等调用;任何引用或值变化都视为冲突。\n\t\tif (activeConfiguration.prefix === prefix && activeConfiguration.codec === codec && activeConfiguration.now === now) {\n\t\t\treturn;\n\t\t}\n\t\tthrow new Error(\"Storage 已使用其他选项完成配置。\");\n\t}\n\tconst uni = getGlobalUniStorage();\n\tconst localBackend =\n\t\tuni === undefined ? (): StorageBackend => createWebStorageBackend(\"local\") : (): StorageBackend => createUniStorageBackend(uni);\n\tconst local = createStorageArea(localBackend, prefix, codec, now);\n\tconst configuration: ActiveStorageConfiguration = { codec, local, now, prefix };\n\tif (uni === undefined) {\n\t\tconfiguration.session = createStorageArea(() => createWebStorageBackend(\"session\"), prefix, codec, now);\n\t}\n\tactiveConfiguration = configuration;\n}\n\n/** 返回全局 Storage 是否已经由应用入口配置。 */\nexport function isStorageConfigured(): boolean {\n\treturn activeConfiguration !== undefined;\n}\n","const defaultRandomAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst defaultStringLocale = \"en-US\";\nconst maximumRandomStringLength = 1_000_000;\nconst maximumRandomValuesPerBatch = 16_384;\nconst uint32Range = 0x1_0000_0000;\nconst uuidV4Pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;\n\n/** 查询字符串解析结果;重复键保留为数组,不存在的键读取为 `undefined`。 */\nexport type ParsedQueryParameters = Record<string, string | string[] | undefined>;\n\n/** 大小写与字素分割可接受的显式语言;省略时固定使用 `en-US` 以保持输出稳定。 */\nexport type StringLocale = string | readonly string[] | undefined;\n\n/** 使用 Web Crypto 填充随机值,能力缺失时回退到 `Math.random()`。 */\nconst fillRandomValues = (values: Uint8Array<ArrayBuffer> | Uint32Array<ArrayBuffer>): void => {\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.getRandomValues === \"function\") {\n\t\tcrypto.getRandomValues(values);\n\t\treturn;\n\t}\n\tconst range = values.BYTES_PER_ELEMENT === Uint8Array.BYTES_PER_ELEMENT ? 0x100 : uint32Range;\n\tfor (let index = 0; index < values.length; index += 1) values[index] = Math.floor(Math.random() * range);\n};\n\n/**\n * 从随机字节创建 UUID v4。\n *\n * @param bytes - 长度至少为 16 的随机字节;Version 与 Variant 位会被原地修改。\n * @returns 小写、带连字符的 RFC 4122 UUID v4。\n */\nconst createUuidV4FromBytes = (bytes: Uint8Array): string => {\n\tbytes[6] = ((bytes[6] ?? 0) & 15) | 64;\n\tbytes[8] = ((bytes[8] ?? 0) & 63) | 128;\n\tconst hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\treturn `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n};\n\n/**\n * 按用户可见字素切分文本。\n *\n * @param value - 待切分字符串。\n * @param locale - Segmenter 使用的显式语言;省略时使用固定默认值。\n * @returns 保留组合 Emoji、变音符号和连接序列的字素数组。\n * @throws `Error` 当平台缺少 `Intl.Segmenter`。\n */\nconst splitGraphemes = (value: string, locale: StringLocale): string[] => {\n\tconst Segmenter = globalThis.Intl?.Segmenter;\n\tif (typeof Segmenter !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持 Intl.Segmenter。\");\n\t}\n\tconst segmenter = new Segmenter(locale ?? defaultStringLocale, { granularity: \"grapheme\" });\n\treturn Array.from(segmenter.segment(value), ({ segment }) => segment);\n};\n\n/**\n * 重复执行 URI 组件解码,直到值稳定或达到深度上限。\n *\n * @param value - 不包含 URI 路径语义的编码组件。\n * @param maxDepth - 最大解码次数,默认 `10`。\n * @returns 解码稳定或达到上限后的组件文本。\n * @throws `URIError` 当任一层包含非法百分号序列;深度非法时抛出 `RangeError`。\n */\nexport function decodeURIComponentRepeatedly(value: string, maxDepth = 10): string {\n\tif (!Number.isSafeInteger(maxDepth) || maxDepth < 0) throw new RangeError(\"`maxDepth` 必须是非负安全整数。\");\n\tlet decoded = value;\n\tfor (let index = 0; index < maxDepth; index += 1) {\n\t\tconst next = decodeURIComponent(decoded);\n\t\tif (next === decoded) break;\n\t\tdecoded = next;\n\t}\n\treturn decoded;\n}\n\n/**\n * 解析带 `://` 的绝对 URL、`?query` 或纯查询字符串。\n *\n * @remarks 纯查询字符串值中的未编码 `?` 会作为值内容保留;片段标识及其后内容被忽略。\n * @param input - 完整 URL、带前导问号或不带前导问号的查询文本。\n * @returns 重复键对应字符串数组,空值保留为空字符串。\n */\nexport function parseQueryString(input: string): ParsedQueryParameters {\n\tconst fragmentStart = input.indexOf(\"#\");\n\tconst withoutFragment = fragmentStart < 0 ? input : input.slice(0, fragmentStart);\n\tconst isAbsoluteUrl = /^[a-z][a-z\\d+.-]*:\\/\\//iu.test(withoutFragment);\n\tconst queryStart = withoutFragment.indexOf(\"?\");\n\tif (isAbsoluteUrl && queryStart < 0) return {};\n\tconst query = isAbsoluteUrl ? withoutFragment.slice(queryStart + 1) : withoutFragment.replace(/^\\?/u, \"\");\n\tconst result: ParsedQueryParameters = {};\n\tfor (const [key, value] of new URLSearchParams(query)) {\n\t\tconst existing = Object.hasOwn(result, key) ? result[key] : undefined;\n\t\tif (existing === undefined) {\n\t\t\t// defineProperty 让 `__proto__` 成为普通自有键,不触发 Object.prototype Setter。\n\t\t\tObject.defineProperty(result, key, { configurable: true, enumerable: true, value, writable: true });\n\t\t} else if (Array.isArray(existing)) existing.push(value);\n\t\telse Object.defineProperty(result, key, { configurable: true, enumerable: true, value: [existing, value], writable: true });\n\t}\n\treturn result;\n}\n\n/**\n * 判断文本是否为任意合法 JSON 值,包括标量与 `null`。\n *\n * @param value - 待解析文本;纯空白不视为 JSON。\n * @returns `JSON.parse` 能完整解析时返回 `true`。\n */\nexport function isValidJson(value: string): boolean {\n\tif (value.trim().length === 0) return false;\n\ttry {\n\t\tJSON.parse(value);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 按大小写边界、连字符、下划线与空白切分单词。\n *\n * @example `XMLHttp_request` 返回 `[\"XML\", \"Http\", \"request\"]`。\n * @param value - 待拆分文本。\n * @returns 删除空项、保持输入顺序的单词数组。\n */\nexport function splitWords(value: string): string[] {\n\treturn value\n\t\t.trim()\n\t\t.replace(/(\\p{Ll}|\\p{N})(\\p{Lu})/gu, \"$1 $2\")\n\t\t.replace(/(\\p{Lu})(\\p{Lu}\\p{Ll})/gu, \"$1 $2\")\n\t\t.split(/[\\s_-]+/u)\n\t\t.filter((part) => part.length > 0);\n}\n\n/**\n * 将首个 Unicode 码点转为大写。\n *\n * @param value - 输入文本;空字符串保持为空。\n * @param locale - 显式语言,默认固定为 `en-US`。\n * @returns 首个 Unicode 码点转换后的文本。\n */\nexport function upperFirst(value: string, locale?: StringLocale): string {\n\tconst characters = Array.from(value);\n\tconst first = characters.shift();\n\treturn first === undefined ? \"\" : first.toLocaleUpperCase(locale ?? defaultStringLocale) + characters.join(\"\");\n}\n\n/**\n * 将首个 Unicode 码点转为小写。\n *\n * @param value - 输入文本;空字符串保持为空。\n * @param locale - 显式语言,默认固定为 `en-US`。\n * @returns 首个 Unicode 码点转换后的文本。\n */\nexport function lowerFirst(value: string, locale?: StringLocale): string {\n\tconst characters = Array.from(value);\n\tconst first = characters.shift();\n\treturn first === undefined ? \"\" : first.toLocaleLowerCase(locale ?? defaultStringLocale) + characters.join(\"\");\n}\n\n/**\n * 将文本转换为 camelCase。\n *\n * @param value - 由大小写、连字符、下划线或空白分隔的文本。\n * @param locale - 大小写转换使用的语言,默认固定为 `en-US`。\n * @returns camelCase 文本。\n */\nexport function camelCase(value: string, locale?: StringLocale): string {\n\treturn splitWords(value)\n\t\t.map((part, index) => {\n\t\t\tconst normalized = part.toLocaleLowerCase(locale ?? defaultStringLocale);\n\t\t\treturn index === 0 ? normalized : upperFirst(normalized, locale);\n\t\t})\n\t\t.join(\"\");\n}\n\n/**\n * 将文本转换为 PascalCase。\n *\n * @param value - 参数语义与 {@link camelCase} 一致。\n * @param locale - 大小写转换使用的显式语言。\n * @returns PascalCase 文本。\n */\nexport function pascalCase(value: string, locale?: StringLocale): string {\n\treturn upperFirst(camelCase(value, locale), locale);\n}\n\n/**\n * 将文本转换为 kebab-case。\n *\n * @param value - 参数语义与 {@link camelCase} 一致。\n * @param locale - 大小写转换使用的显式语言。\n * @returns kebab-case 文本。\n */\nexport function kebabCase(value: string, locale?: StringLocale): string {\n\treturn splitWords(value)\n\t\t.map((part) => part.toLocaleLowerCase(locale ?? defaultStringLocale))\n\t\t.join(\"-\");\n}\n\n/**\n * 按 Unicode 字素簇截断文本,避免拆开 emoji、组合音标或代理对。\n *\n * @param value - 输入文本。\n * @param maxLength - 保留的最大字素簇数量。\n * @param suffix - 被截断时追加的文本,默认单字符省略号 `…`;不计入上限。\n * @param locale - 字素分割语言,默认固定为 `en-US`。\n * @returns 未超限时返回原字符串,否则返回截断内容与后缀。\n * @throws `RangeError` 当 `maxLength` 不是非负安全整数或 Locale 无效;缺少\n * `Intl.Segmenter` 时抛出 `Error`。\n */\nexport function truncateGraphemes(value: string, maxLength: number, suffix = \"…\", locale?: StringLocale): string {\n\tif (!Number.isSafeInteger(maxLength) || maxLength < 0) throw new RangeError(\"`maxLength` 必须是非负安全整数。\");\n\tconst segments = splitGraphemes(value, locale);\n\treturn segments.length > maxLength ? segments.slice(0, maxLength).join(\"\") + suffix : value;\n}\n\n/**\n * 把文本复制到系统剪贴板。\n *\n * @remarks uni-app 使用 `setClipboardData`;浏览器优先使用 Clipboard API,并在该 API 不可用时\n * 回退到 `document.execCommand(\"copy\")`。平台拒绝访问剪贴板时不会静默忽略错误。\n * @param value - 要复制的文本。\n * @returns 复制完成后兑现的 Promise。\n * @throws `Error` 当运行时没有可用的剪贴板能力或复制失败。\n */\nexport async function copy(value: string): Promise<void> {\n\tconst uni: unknown = Reflect.get(globalThis, \"uni\");\n\tif (uni !== undefined) {\n\t\tif ((typeof uni !== \"object\" && typeof uni !== \"function\") || uni === null) {\n\t\t\tthrow new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\t}\n\t\tconst setClipboardData: unknown = Reflect.get(uni, \"setClipboardData\");\n\t\tif (typeof setClipboardData !== \"function\") throw new TypeError(\"全局 uni 对象未提供 `setClipboardData`。\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tReflect.apply(setClipboardData, uni, [\n\t\t\t\t{\n\t\t\t\t\tdata: value,\n\t\t\t\t\tfail: (error: unknown): void => {\n\t\t\t\t\t\treject(error instanceof Error ? error : new Error(\"文本复制到剪贴板失败。\", { cause: error }));\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: resolve,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t\treturn;\n\t}\n\n\tconst clipboard = globalThis.navigator?.clipboard;\n\tif (globalThis.isSecureContext === true && typeof clipboard?.writeText === \"function\") {\n\t\tawait clipboard.writeText(value);\n\t\treturn;\n\t}\n\n\tconst document = globalThis.document;\n\tif (typeof document?.createElement !== \"function\" || document.body === null || typeof document.execCommand !== \"function\") {\n\t\tthrow new Error(\"当前运行环境不支持访问剪贴板。\");\n\t}\n\tconst textarea = document.createElement(\"textarea\");\n\ttextarea.value = value;\n\ttextarea.style.left = \"-999999px\";\n\ttextarea.style.opacity = \"0\";\n\ttextarea.style.position = \"fixed\";\n\ttextarea.style.top = \"-999999px\";\n\tdocument.body.appendChild(textarea);\n\tlet copied: boolean;\n\ttry {\n\t\ttextarea.focus();\n\t\ttextarea.select();\n\t\tcopied = document.execCommand(\"copy\");\n\t} finally {\n\t\ttextarea.remove();\n\t}\n\tif (!copied) throw new Error(\"文本复制到剪贴板失败。\");\n}\n\n/**\n * 生成随机字符串。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * @param length - 字符数量,必须是 0 至 1,000,000 的安全整数。\n * @param alphabet - 不得为空、包含重复字符或超过 2^32 个 Unicode 码点。\n * @returns 由 `alphabet` 中 Unicode 码点组成的随机文本。\n * @throws `RangeError` 当长度或字母表非法。\n */\nexport function randomString(length: number, alphabet: string = defaultRandomAlphabet): string {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > maximumRandomStringLength) {\n\t\tthrow new RangeError(`\\`length\\` 必须是 0 到 ${maximumRandomStringLength} 之间的安全整数。`);\n\t}\n\tconst characters = Array.from(alphabet);\n\tif (characters.length === 0) throw new RangeError(\"`alphabet` 不能为空。\");\n\tif (new Set(characters).size !== characters.length) throw new RangeError(\"`alphabet` 不能包含重复字符。\");\n\tif (characters.length > 0x1_0000_0000) throw new RangeError(\"`alphabet` 不能包含超过 2^32 个字符。\");\n\tif (length === 0) return \"\";\n\n\t// 丢弃不能平均映射到字母表的尾部区间,避免 `%` 造成前部字符概率偏高。\n\tconst acceptanceLimit = Math.floor(uint32Range / characters.length) * characters.length;\n\tconst result: string[] = [];\n\twhile (result.length < length) {\n\t\tconst remaining = length - result.length;\n\t\t// 分批填充可控制临时内存,并避开 Web Crypto 单次随机数组大小限制。\n\t\tconst samples = new Uint32Array(Math.min(remaining, maximumRandomValuesPerBatch));\n\t\tfillRandomValues(samples);\n\t\tfor (const sample of samples) {\n\t\t\tif (sample >= acceptanceLimit) continue;\n\t\t\tconst character = characters[sample % characters.length];\n\t\t\tif (character === undefined) continue;\n\t\t\tresult.push(character);\n\t\t\tif (result.length === length) break;\n\t\t}\n\t}\n\treturn result.join(\"\");\n}\n\n/**\n * 生成 RFC 4122 version 4 UUID。\n *\n * @remarks 优先使用 Web Crypto;平台缺少安全随机能力时回退到 `Math.random()`。\n * 该 UUID 适合普通唯一标识,不应作为安全令牌或秘密。\n * @returns 小写、带连字符的 UUID v4。\n */\nexport function generateUuidV4(): string {\n\tconst crypto = globalThis.crypto;\n\tif (typeof crypto?.randomUUID === \"function\") return crypto.randomUUID();\n\tconst bytes = new Uint8Array(16);\n\tfillRandomValues(bytes);\n\treturn createUuidV4FromBytes(bytes);\n}\n\n/**\n * 判断字符串是否为 RFC 4122 version 4 UUID。\n *\n * @param value - 待验证文本;十六进制字母大小写均可。\n * @returns 版本位与 Variant 位均正确时返回 `true`。\n */\nexport function isUuidV4(value: string): boolean {\n\treturn uuidV4Pattern.test(value);\n}\n\n/**\n * 转义 HTML 文本上下文中的五个特殊字符。\n *\n * @remarks 这不是 HTML 清洗器,不能让不可信文本安全进入 URL、CSS、脚本或属性名上下文。\n * @param value - 将作为 HTML 文本节点内容的字符串。\n * @returns 转义 `&`、`<`、`>`、双引号与单引号后的文本。\n */\nexport function escapeHtml(value: string): string {\n\treturn value.replace(/[&<>\"']/gu, (character) => {\n\t\tswitch (character) {\n\t\t\tcase \"&\":\n\t\t\t\treturn \"&amp;\";\n\t\t\tcase \"<\":\n\t\t\t\treturn \"&lt;\";\n\t\t\tcase \">\":\n\t\t\t\treturn \"&gt;\";\n\t\t\tcase '\"':\n\t\t\t\treturn \"&quot;\";\n\t\t\tdefault:\n\t\t\t\treturn \"&#39;\";\n\t\t}\n\t});\n}\n\n/**\n * 把连续 Unicode 空白折叠为单个空格并删除两端空白。\n *\n * @param value - 输入文本。\n * @returns 规范化后的文本;全空白输入返回空字符串。\n */\nexport function normalizeWhitespace(value: string): string {\n\treturn value.trim().replace(/\\s+/gu, \" \");\n}\n","import { Local } from \"../storage/index\";\nimport { generateUuidV4, isUuidV4 } from \"../string/index\";\n\nconst defaultInstallationIdentityStorageKey = \"identity:installation-id\";\n\n/** {@link configureInstallationIdentity} 接收的安装标识配置。 */\nexport interface InstallationIdentityConfiguration {\n\t/**\n\t * `Local` 中使用的业务键,默认 `identity:installation-id`。\n\t *\n\t * @remarks 必须是无外围空白的非空字符串,并在首次访问 Identity API 前配置;物理键仍会叠加 Storage 全局前缀。\n\t */\n\tcacheKey?: string;\n}\n\n/** 浏览器或 uni-app 当前安装实例标识。 */\nexport interface InstallationIdentity {\n\t/**\n\t * `Local` 中使用的业务键。\n\t *\n\t * @remarks 首次读取会锁定默认配置;之后不能再切换为其他业务键。\n\t */\n\treadonly cacheKey: string;\n\t/**\n\t * 当前内存中的安装标识;尚未取得标识或调用 {@link InstallationIdentity.clear clear} 后为空字符串。\n\t *\n\t * @remarks 直接赋值只改变内存,不会校验或持久化;通常应调用 {@link InstallationIdentity.getOrCreate getOrCreate}。\n\t */\n\tdeviceId: string;\n\t/**\n\t * 删除当前 `cacheKey` 对应的持久化标识,并把 `deviceId` 重置为空字符串。\n\t *\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tclear: () => void;\n\t/**\n\t * 按“显式参数、当前内存、持久化值、随机生成值”的优先级取得安装标识。\n\t *\n\t * @param installationId - 可选 UUID v4;传入时覆盖内存值和当前持久化值。\n\t * @returns 已校验并同时写入 `deviceId` 与 `Local` 的 UUID v4。\n\t * @throws `TypeError` 当显式参数、内存值或持久化值不是 UUID v4。\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tgetOrCreate: (installationId?: string) => string;\n\t/**\n\t * 读取并校验当前 `cacheKey` 对应的持久化标识。\n\t *\n\t * @remarks 该方法不修改 `deviceId`,只负责读取;过期记录由 Storage 视为缺失。\n\t * @returns 已持久化的 UUID v4;键缺失或过期时返回 `undefined`。\n\t * @throws `TypeError` 当持久化值不是字符串或不是 UUID v4。\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tread: () => string | undefined;\n}\n\n/**\n * 校验安装标识格式。\n *\n * @param value - 外部传入或从 Storage 读取的候选值。\n * @throws `TypeError` 当值不是 RFC 4122 UUID v4。\n */\nconst assertInstallationId = (value: string): void => {\n\tif (!isUuidV4(value)) throw new TypeError(\"安装标识值必须是符合 RFC 4122 的 UUID v4。\");\n};\n\nlet activeStorageKey: string | undefined;\n\n/**\n * 取得已经锁定的安装标识业务键。\n *\n * @remarks 首次读取会锁定默认值,防止标识已经写入后再切换键而产生两个安装标识。\n * @returns 应用于后续全部 Identity 操作的业务键。\n */\nconst getInstallationIdentityStorageKey = (): string => {\n\tactiveStorageKey ??= defaultInstallationIdentityStorageKey;\n\treturn activeStorageKey;\n};\n\n/**\n * 在应用入口配置安装标识使用的 Storage 业务键。\n *\n * @remarks 必须在首次读取 `installationIdentity.cacheKey` 或调用其他安装标识 API 前执行。相同配置\n * 可以幂等重复调用;切换到不同键会抛错,避免同一页面产生分裂状态。\n * @param options - 安装标识配置;省略 `cacheKey` 时使用 `identity:installation-id`。\n * @throws `TypeError` 当 `cacheKey` 不是非空字符串或包含外围空白。\n * @throws `Error` 当安装标识已经使用另一个业务键初始化。\n */\nexport function configureInstallationIdentity(options: InstallationIdentityConfiguration = {}): void {\n\tconst cacheKey = options.cacheKey ?? defaultInstallationIdentityStorageKey;\n\tif (typeof cacheKey !== \"string\" || cacheKey.length === 0 || cacheKey.trim() !== cacheKey) {\n\t\tthrow new TypeError(\"安装标识的 `cacheKey` 必须是无外围空白的非空字符串。\");\n\t}\n\tif (activeStorageKey === undefined) {\n\t\tactiveStorageKey = cacheKey;\n\t\treturn;\n\t}\n\tif (activeStorageKey !== cacheKey) throw new Error(\"安装标识已使用其他 `cacheKey` 完成配置。\");\n}\n\n/**\n * 全局安装标识状态。\n *\n * @remarks Storage 未显式配置时会使用其默认值。生成 UUID 时优先使用 Web Crypto,能力缺失时\n * 回退到 `Math.random()`。该值不是硬件标识、认证凭证或安全边界。\n */\nexport const installationIdentity: InstallationIdentity = {\n\tget cacheKey(): string {\n\t\treturn getInstallationIdentityStorageKey();\n\t},\n\tdeviceId: \"\",\n\tclear(): void {\n\t\tLocal.remove(installationIdentity.cacheKey);\n\t\tinstallationIdentity.deviceId = \"\";\n\t},\n\tgetOrCreate(installationId?: string): string {\n\t\tconst candidate =\n\t\t\tinstallationId ??\n\t\t\t(installationIdentity.deviceId.length > 0 ? installationIdentity.deviceId : installationIdentity.read()) ??\n\t\t\tgenerateUuidV4();\n\t\tassertInstallationId(candidate);\n\t\tLocal.set(installationIdentity.cacheKey, candidate);\n\t\tinstallationIdentity.deviceId = candidate;\n\t\treturn candidate;\n\t},\n\tread(): string | undefined {\n\t\tconst stored = Local.get(installationIdentity.cacheKey);\n\t\tif (stored === undefined) return undefined;\n\t\tif (typeof stored !== \"string\") throw new TypeError(\"存储的安装标识已损坏。\");\n\t\tassertInstallationId(stored);\n\t\treturn stored;\n\t},\n};\n\n/**\n * 返回已有安装标识,否则创建并持久化一个 UUID v4。\n *\n * @param installationId - 可选的显式安装标识;传入时会校验并覆盖当前持久化值。\n * @returns 显式值、内存值、持久化值或新生成值中的最终安装标识。\n * @throws `TypeError` 当显式值或持久化值不是 UUID v4。\n * @throws `Error` 当当前平台存储不可用。\n */\nexport function getOrCreateInstallationId(installationId?: string): string {\n\treturn installationIdentity.getOrCreate(installationId);\n}\n","/** 日志严重级别,按从低到高排列。 */\nexport type LogLevel = \"debug\" | \"log\" | \"warn\" | \"error\";\n\n/** 日志输出目标需要实现的最小控制台接口。 */\nexport interface LoggerSink {\n\t/**\n\t * 接收通过级别过滤后的调试参数。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\tdebug: (...data: unknown[]) => void;\n\t/**\n\t * 接收通过级别过滤后的普通日志参数;对应 Logger 的 `log` 级别。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\tlog: (...data: unknown[]) => void;\n\t/**\n\t * 接收通过级别过滤后的警告参数。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\twarn: (...data: unknown[]) => void;\n\t/**\n\t * 接收通过级别过滤后的错误参数。\n\t * @param data - 已格式化的品牌、作用域、消息以及保持原始类型的附加值。\n\t */\n\terror: (...data: unknown[]) => void;\n}\n\n/** {@link createLogger} 的不可变配置。 */\nexport interface LoggerOptions {\n\t/** 最低输出级别,默认 `debug`;低于该优先级的消息不会传给 Sink。 */\n\tlevel?: LogLevel;\n\t/** 日志品牌前缀,默认 `Fast`;必须是无外围空白的非空字符串。 */\n\tprefix?: string;\n\t/** 可注入输出目标,默认当前运行时的 `console`;Logger 不会修改该对象。 */\n\tsink?: LoggerSink;\n\t/** uni-app App-Plus/HBuilderX 中把附加参数逐条转成单行文本输出,默认 `false`;其他平台忽略。 */\n\tuniAppPlusSplit?: boolean;\n}\n\n/** 配置隔离的轻量日志器。 */\nexport interface Logger {\n\t/**\n\t * 输出指定作用域的调试信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\tdebug: (scope: string, ...content: unknown[]) => void;\n\t/**\n\t * 输出指定作用域的普通信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\tlog: (scope: string, ...content: unknown[]) => void;\n\t/**\n\t * 输出指定作用域的警告信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\twarn: (scope: string, ...content: unknown[]) => void;\n\t/**\n\t * 输出指定作用域的错误信息或数据。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与附加值;非字符串值保持原始类型。\n\t * @throws `TypeError` 或 `RangeError` 当作用域不是无外围空白的非空字符串。\n\t */\n\terror: (scope: string, ...content: unknown[]) => void;\n}\n\nconst levelPriority: Readonly<Record<LogLevel, number>> = {\n\tdebug: 10,\n\tlog: 20,\n\twarn: 30,\n\terror: 40,\n};\n\n/**\n * 判断未知值是否为受支持日志级别。\n *\n * @param value - 待检查配置值。\n * @returns 值是 `debug`、`log`、`warn` 或 `error` 时返回 `true`。\n */\nconst isLogLevel = (value: unknown): value is LogLevel => typeof value === \"string\" && Object.hasOwn(levelPriority, value);\n\n/**\n * 检测 uni-app App-Plus 日志环境。\n *\n * @returns 全局 `uni` 与 `plus` 同时存在时返回 `true`。\n */\nconst isUniAppPlus = (): boolean => {\n\treturn Reflect.get(globalThis, \"uni\") !== undefined && Reflect.get(globalThis, \"plus\") !== undefined;\n};\n\n/**\n * 把日志附加值转换为适合 HBuilderX 单行输出的文本。\n *\n * @remarks 循环引用会替换为 `[Circular]`,BigInt 保留 `n` 后缀,Error 优先输出堆栈。\n * @param value - 任意日志附加值。\n * @returns 不会因 JSON 序列化失败而中断日志调用的文本。\n */\nconst formatSplitValue = (value: unknown): string => {\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"bigint\") return `${value.toString()}n`;\n\tif (value instanceof Error) return value.stack ?? `${value.name}: ${value.message}`;\n\tconst visited = new WeakSet();\n\ttry {\n\t\tconst serialized: unknown = JSON.stringify(\n\t\t\tvalue,\n\t\t\t(_key, item: unknown): unknown => {\n\t\t\t\tif (typeof item === \"bigint\") return `${item.toString()}n`;\n\t\t\t\tif (typeof item !== \"object\" || item === null) return item;\n\t\t\t\tif (visited.has(item)) return \"[Circular]\";\n\t\t\t\tvisited.add(item);\n\t\t\t\treturn item;\n\t\t\t},\n\t\t\t2\n\t\t);\n\t\treturn typeof serialized === \"string\" ? serialized : String(value);\n\t} catch {\n\t\treturn String(value);\n\t}\n};\n\nconst defaultConsoleSink: LoggerSink = {\n\tdebug: (...data): void => {\n\t\tif (typeof console.debug === \"function\") console.debug(...data);\n\t\telse console.log(...data);\n\t},\n\tlog: (...data): void => {\n\t\tconsole.log(...data);\n\t},\n\twarn: (...data): void => {\n\t\tconsole.warn(...data);\n\t},\n\terror: (...data): void => {\n\t\tconsole.error(...data);\n\t},\n};\n\n/**\n * 创建独立日志器。\n *\n * @remarks 本库其他模块不会自动记录、吞掉或转换异常。日志内容可能进入持久化平台,\n * 调用方不得传入密码、令牌、密钥或完整个人数据。\n * @param options - 级别、前缀、输出目标和 uni-app App-Plus 拆分选项。\n * @returns 不会修改全局控制台或其他日志器配置的新实例。\n * @throws `RangeError` 当级别未知,或前缀、作用域不是有效的非空字符串。\n */\nexport function createLogger(options: LoggerOptions = {}): Logger {\n\tconst requestedLevel: unknown = options.level ?? \"debug\";\n\tconst requestedPrefix: unknown = options.prefix ?? \"Fast\";\n\tconst sink = options.sink ?? defaultConsoleSink;\n\tif (!isLogLevel(requestedLevel)) throw new RangeError(`未知的日志级别:${String(requestedLevel)}。`);\n\tif (typeof requestedPrefix !== \"string\" || requestedPrefix.length === 0) {\n\t\tthrow new RangeError(\"日志前缀必须是非空字符串。\");\n\t}\n\tconst level = requestedLevel;\n\tconst prefix = requestedPrefix;\n\tconst uniAppPlusSplit = options.uniAppPlusSplit ?? false;\n\n\t/**\n\t * 应用级别过滤、标题格式和平台输出策略。\n\t *\n\t * @param messageLevel - 本条消息的严重级别。\n\t * @param scope - 模块、组件或业务来源名称。\n\t * @param content - 可选的消息与保持原始类型的附加值。\n\t * @throws `RangeError` 当作用域不是非空字符串或包含外围空白。\n\t */\n\tconst write = (messageLevel: LogLevel, scope: string, content: readonly unknown[]): void => {\n\t\tif (typeof scope !== \"string\") throw new TypeError(\"日志作用域必须是字符串。\");\n\t\tif (scope.length === 0 || scope.trim() !== scope) {\n\t\t\tthrow new RangeError(\"日志作用域必须是无外围空白的非空字符串。\");\n\t\t}\n\t\tif (levelPriority[messageLevel] < levelPriority[level]) return;\n\t\tconst heading = `[${prefix}:${scope}]`;\n\t\tconst sinkMethod: keyof LoggerSink = messageLevel;\n\t\tif (uniAppPlusSplit && isUniAppPlus()) {\n\t\t\tconst [first, ...remaining] = content;\n\t\t\tif (typeof first === \"string\") {\n\t\t\t\tsink[sinkMethod](`${heading} ${first}`);\n\t\t\t\tfor (const item of remaining) sink[sinkMethod](formatSplitValue(item));\n\t\t\t} else {\n\t\t\t\tsink[sinkMethod](heading);\n\t\t\t\tfor (const item of content) sink[sinkMethod](formatSplitValue(item));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsink[sinkMethod](heading, ...content);\n\t};\n\n\treturn {\n\t\tdebug: (scope, ...content): void => {\n\t\t\twrite(\"debug\", scope, content);\n\t\t},\n\t\tlog: (scope, ...content): void => {\n\t\t\twrite(\"log\", scope, content);\n\t\t},\n\t\twarn: (scope, ...content): void => {\n\t\t\twrite(\"warn\", scope, content);\n\t\t},\n\t\terror: (scope, ...content): void => {\n\t\t\twrite(\"error\", scope, content);\n\t\t},\n\t};\n}\n\nlet activeDefaultLogger: Logger = createLogger();\n\n/**\n * 替换默认 {@link logger} 的完整配置。\n *\n * @remarks 已创建的独立 Logger 不受影响;默认 Logger 对象引用保持稳定,并立即转发到新配置。\n * 省略选项会恢复 `createLogger()` 的全部默认值。\n * @param options - 默认 Logger 使用的级别、前缀、输出目标和 uni-app App-Plus 拆分选项。\n */\nexport function configureLogger(options: LoggerOptions = {}): void {\n\tactiveDefaultLogger = createLogger(options);\n}\n\n/** 默认使用 `Fast` 前缀和 `debug` 级别、可通过 {@link configureLogger} 配置的便捷日志器。 */\nexport const logger: Logger = {\n\tdebug: (scope, ...content): void => {\n\t\tactiveDefaultLogger.debug(scope, ...content);\n\t},\n\tlog: (scope, ...content): void => {\n\t\tactiveDefaultLogger.log(scope, ...content);\n\t},\n\twarn: (scope, ...content): void => {\n\t\tactiveDefaultLogger.warn(scope, ...content);\n\t},\n\terror: (scope, ...content): void => {\n\t\tactiveDefaultLogger.error(scope, ...content);\n\t},\n};\n","/** URL 查询参数支持的单值类型。 */\nexport type QueryPrimitive = bigint | boolean | number | string | null | undefined;\n\n/** URL 查询参数值;数组使用重复键表示。 */\nexport type QueryValue = QueryPrimitive | readonly QueryPrimitive[];\n\n/**\n * 判断 Query Value 是否为重复参数数组。\n *\n * @param value - 单值或数组形式的 Query Value。\n * @returns 是只读原始值数组时返回 `true`。\n */\nconst isQueryPrimitiveArray = (value: QueryValue): value is readonly QueryPrimitive[] => Array.isArray(value);\n\n/** {@link toQueryString} 的序列化选项。 */\nexport interface QueryStringOptions {\n\t/** 返回非空结果时是否添加 `?`;默认 `false`。 */\n\tprefixQuestionMark?: boolean;\n\t/** 是否按键的 UTF-16 码元顺序稳定排序;默认保留对象枚举顺序。 */\n\tsort?: boolean;\n\t/** 空格编码方式;默认遵循表单编码并输出 `+`。 */\n\tspace?: \"percent\" | \"plus\";\n}\n\n/**\n * 安全写入结果对象的自有可枚举属性。\n *\n * @remarks 使用 `defineProperty` 避免 `__proto__` 触发 Setter,并显式拒绝三个原型污染键。\n * @param target - 要写入的结果对象。\n * @param key - 自有属性键。\n * @param value - 属性值。\n * @throws `TypeError` 当键为 `__proto__`、`prototype` 或 `constructor`。\n */\nconst defineEnumerableProperty = (target: object, key: PropertyKey, value: unknown): void => {\n\tObject.defineProperty(target, key, { configurable: true, enumerable: true, value, writable: true });\n};\n\n/**\n * 判断值是否是普通对象。\n *\n * @param value - 任意待检查值。\n * @returns 原型为 `Object.prototype` 或 `null` 时返回 `true`。\n */\nexport function isPlainObject(value: unknown): value is Record<PropertyKey, unknown> {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst prototype = Object.getPrototypeOf(value) as object | null;\n\treturn prototype === null || prototype === Object.prototype;\n}\n\n/**\n * 安全判断对象是否拥有自己的属性。\n *\n * @remarks 不调用可能被对象覆盖的 `hasOwnProperty`。\n * @param value - 待检查对象。\n * @param key - 字符串、数字或 Symbol 属性键。\n * @returns 属性为对象自有属性时返回 `true`,并收窄键类型。\n */\nexport function hasOwn<ObjectType extends object, Key extends PropertyKey>(value: ObjectType, key: Key): key is Key & keyof ObjectType {\n\treturn Object.hasOwn(value, key);\n}\n\n/**\n * 从对象中选择指定自有可枚举属性。\n *\n * @param source - 不会被修改的源对象。\n * @param keys - 需要保留的键;不存在的键被忽略。\n * @returns 新对象,保持 `keys` 的遍历顺序。\n */\nexport function pick<Source extends object, Keys extends readonly (keyof Source)[]>(source: Source, keys: Keys): Pick<Source, Keys[number]> {\n\tconst result = {} as Pick<Source, Keys[number]>;\n\tfor (const key of keys) {\n\t\tif (Object.prototype.propertyIsEnumerable.call(source, key)) defineEnumerableProperty(result, key, source[key]);\n\t}\n\treturn result;\n}\n\n/**\n * 浅复制对象并删除指定属性。\n *\n * @param source - 不会被修改的源对象。\n * @param keys - 需要排除的键。\n * @returns 包含其余自有可枚举字符串与 Symbol 属性的新对象。\n */\nexport function omit<Source extends object, Keys extends readonly (keyof Source)[]>(source: Source, keys: Keys): Omit<Source, Keys[number]> {\n\tconst result = { ...source };\n\tfor (const key of keys) Reflect.deleteProperty(result, key);\n\treturn result;\n}\n\n/**\n * 映射对象的自有可枚举属性值。\n *\n * @param source - 不会被修改的源对象。\n * @param mapper - 接收值、键和源对象的映射函数。\n * @returns 保留原键的新对象。\n */\nexport function mapValues<Source extends object, Result>(\n\tsource: Source,\n\tmapper: (value: Source[keyof Source], key: keyof Source, source: Source) => Result\n): { [Key in keyof Source]: Result } {\n\tconst result = {} as { [Key in keyof Source]: Result };\n\tfor (const key of Reflect.ownKeys(source) as (keyof Source)[]) {\n\t\tif (Object.prototype.propertyIsEnumerable.call(source, key)) defineEnumerableProperty(result, key, mapper(source[key], key, source));\n\t}\n\treturn result;\n}\n\n/**\n * 对自有可枚举属性执行 SameValue 浅比较。\n *\n * @remarks 嵌套对象只比较引用;`NaN` 相等,`0` 与 `-0` 不相等。\n * @param left - 第一对象。\n * @param right - 第二对象。\n * @returns 自有可枚举键集合与对应值均满足 SameValue 时返回 `true`。\n */\nexport function shallowEqual(left: object, right: object): boolean {\n\tif (Object.is(left, right)) return true;\n\tconst leftKeys = Reflect.ownKeys(left).filter((key) => Object.prototype.propertyIsEnumerable.call(left, key));\n\tconst rightKeys = Reflect.ownKeys(right).filter((key) => Object.prototype.propertyIsEnumerable.call(right, key));\n\tif (leftKeys.length !== rightKeys.length) return false;\n\treturn leftKeys.every((key) => Object.hasOwn(right, key) && Object.is(Reflect.get(left, key), Reflect.get(right, key)));\n}\n\n/**\n * 把 Query 原始值规范化为文本。\n *\n * @param value - 已排除空值的字符串、数字、布尔值或 BigInt。\n * @returns 与 URLSearchParams 兼容的文本值。\n * @throws `RangeError` 当数字不是有限值。\n */\nconst serializeQueryValue = (value: Exclude<QueryPrimitive, null | undefined>): string => {\n\tif (typeof value === \"number\" && !Number.isFinite(value)) {\n\t\tthrow new RangeError(\"查询参数中的数字必须是有限数。\");\n\t}\n\treturn String(value);\n};\n\n/**\n * 将对象序列化为标准 URL 查询字符串。\n *\n * @remarks `null` 与 `undefined` 被跳过;数组使用重复键;返回值不会修改输入。\n * @param value - 查询参数对象。\n * @param options - 排序、空格和问号前缀选项。\n * @returns URL 编码后的查询字符串;没有参数时始终返回空字符串。\n * @throws `RangeError` 当参数包含 `NaN` 或无穷数字。\n */\nexport function toQueryString(value: Readonly<Record<string, QueryValue>>, options: QueryStringOptions = {}): string {\n\tconst entries = Object.entries(value);\n\tif (options.sort) entries.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));\n\tconst parameters = new URLSearchParams();\n\tfor (const [key, rawValue] of entries) {\n\t\tconst values = isQueryPrimitiveArray(rawValue) ? rawValue : [rawValue];\n\t\tfor (const item of values) {\n\t\t\tif (item !== null && item !== undefined) parameters.append(key, serializeQueryValue(item));\n\t\t}\n\t}\n\tlet result = parameters.toString();\n\tif (options.space === \"percent\") result = result.replace(/\\+/gu, \"%20\");\n\treturn result && options.prefixQuestionMark ? `?${result}` : result;\n}\n","import { computed } from \"vue\";\nimport type { ComputedRef } from \"vue\";\n\n/** Vue Emits 对象中允许的校验器形状。 */\ntype EmitValidator = ((...arguments_: never[]) => unknown) | null;\n/** 事件名到可选参数校验器的内部映射。 */\ntype EmitsOptions = Record<string, EmitValidator>;\n/** 从校验器中提取事件参数;无校验器时保留未知参数。 */\ntype EventArguments<Validator> = Validator extends (...arguments_: infer Arguments) => unknown ? Arguments : unknown[];\n/** 在类型层递归把 kebab-case 事件名转换为 PascalCase。 */\ntype PascalEventName<Value extends string> = Value extends `${infer Head}-${infer Tail}`\n\t? `${Capitalize<Head>}${PascalEventName<Tail>}`\n\t: Capitalize<Value>;\n\n/** 把事件配置映射为 Vue `onXxx` 属性。 */\nexport type EmitHandlers<Emits extends EmitsOptions> = {\n\t[Name in keyof Emits as Name extends string ? `on${PascalEventName<Name>}` : never]: (...arguments_: EventArguments<Emits[Name]>) => void;\n};\n\n/**\n * 把事件名转换为 Vue Handler Prop 名称。\n *\n * @param eventName - Emits 对象中的原始事件名,可使用 kebab-case。\n * @returns `onPascalCase` 形式的属性名。\n * @throws `TypeError` 当事件名包含空片段或无法生成有效 Handler 名称。\n */\nconst toHandlerName = (eventName: string): string => {\n\treturn `on${eventName\n\t\t.split(\"-\")\n\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t.join(\"\")}`;\n};\n\n/**\n * 构建响应式 Vue 事件处理器。\n *\n * @param emits - Vue emits 配置对象。\n * @param emit - `setup` 上下文提供的 emit 函数。\n * @param ignoredEvents - 不需要向子组件透传的事件名。\n * @returns 随配置重新计算的事件处理器对象。\n */\nexport function useEmits<Emits extends EmitsOptions>(\n\temits: Emits,\n\temit: (...arguments_: never[]) => unknown,\n\tignoredEvents: readonly (keyof Emits)[] = []\n): ComputedRef<Partial<EmitHandlers<Emits>>> {\n\tconst ignored = new Set<PropertyKey>(ignoredEvents);\n\tconst emitEvent = emit as unknown as (eventName: string, ...arguments_: unknown[]) => void;\n\treturn computed<Partial<EmitHandlers<Emits>>>(() => {\n\t\tconst handlers = {} as Partial<EmitHandlers<Emits>>;\n\t\tconst handlerNames = new Set<string>();\n\t\tfor (const eventName of Object.keys(emits)) {\n\t\t\tif (ignored.has(eventName)) continue;\n\t\t\tif (eventName.length === 0 || /\\s/u.test(eventName)) throw new TypeError(`无效的 Vue 事件名称:“${eventName}”。`);\n\t\t\tconst handlerName = toHandlerName(eventName);\n\t\t\tif (handlerNames.has(handlerName)) {\n\t\t\t\tthrow new TypeError(`多个 Vue 事件映射到同一处理器属性:“${handlerName}”。`);\n\t\t\t}\n\t\t\thandlerNames.add(handlerName);\n\t\t\tObject.defineProperty(handlers, handlerName, {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: (...arguments_: unknown[]): void => {\n\t\t\t\t\temitEvent(eventName, ...arguments_);\n\t\t\t\t},\n\t\t\t\twritable: true,\n\t\t\t});\n\t\t}\n\t\treturn handlers;\n\t});\n}\n","/**\n * 同时暴露组件实例能力并返回同一个对象,便于 `setup` 返回状态供 Vue Devtools 查看。\n *\n * @param expose - `setup` 上下文提供的 expose 函数。\n * @param exposed - 需要暴露的状态和方法。\n * @returns 原始 exposed 对象。\n */\nexport function useExpose<Exposed extends object>(expose: (exposed?: Exposed) => void, exposed: Exposed): Exposed {\n\texpose(exposed);\n\treturn exposed;\n}\n","/** 可同步或异步返回结果的函数。 */\nexport type AwaitableFunction<Arguments extends readonly unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/**\n * 统一执行同步或异步函数,异常保持原样向调用方传播。\n *\n * @param function_ - 可选的待执行函数。\n * @param arguments_ - 原样传入函数的参数。\n * @returns 函数结果;未传函数时返回 `undefined`。\n */\nexport async function callOptionalFunction<Arguments extends readonly unknown[], Result>(\n\tfunction_: AwaitableFunction<Arguments, Result> | null | undefined,\n\t...arguments_: Arguments\n): Promise<Awaited<Result> | undefined> {\n\tif (function_ === null || function_ === undefined) return undefined;\n\treturn Promise.resolve(function_(...arguments_));\n}\n","import type { App } from \"vue\";\n\n/** Vue 组件对象、函数组件或指令对象可接受的最小结构类型。 */\nexport type VueInstallValue = object | ((...arguments_: never[]) => unknown);\n\n/** 为 Vue 组件或指令附加供 Vue 3 `app.use()` 调用的安装能力。 */\nexport type Installable<Value> = Value & {\n\t/**\n\t * 把当前组件或指令安装到 Vue 3 App。\n\t * @param app - Vue 3 App 实例。\n\t */\n\tinstall: (app: App) => void;\n};\n\n/** TSX 组件安装类型;与 {@link Installable} 保持同一运行时契约。 */\nexport type TSXWithInstall<Value> = Installable<Value>;\n\n/** 组件、指令注册所需的 Vue 3 App 能力。 */\ninterface VueAppRegistrationTarget {\n\t/**\n\t * 读取或注册全局组件。\n\t *\n\t * @param name - 全局组件名。\n\t * @param component - 注册时传入的组件;省略时读取现有组件。\n\t * @returns Vue App 返回的现有组件、注册结果或 App 自身。\n\t */\n\tcomponent: (name: string, component?: unknown) => unknown;\n\t/**\n\t * 读取或注册全局指令。\n\t *\n\t * @param name - 不带 `v-` 的全局指令名。\n\t * @param directive - 注册时传入的指令;省略时读取现有指令。\n\t * @returns Vue App 返回的现有指令、注册结果或 App 自身。\n\t */\n\tdirective: (name: string, directive?: unknown) => unknown;\n}\n\n/**\n * 校验 Vue 3 插件安装目标。\n *\n * @param value - Vue 3 App 实例。\n * @returns 只包含组件和指令注册能力的 App。\n * @throws `TypeError` 当目标不是对象或缺少 `component`、`directive` 方法。\n */\nconst assertApp = (value: App): VueAppRegistrationTarget => {\n\tif (typeof value !== \"object\" || value === null) {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 Vue 3 App 实例。\");\n\t}\n\tconst app = value as unknown as Partial<VueAppRegistrationTarget>;\n\tif (typeof app.component !== \"function\" || typeof app.directive !== \"function\") {\n\t\tthrow new TypeError(\"安装 Vue 插件需要 `component()` 和 `directive()` 注册方法。\");\n\t}\n\treturn app as VueAppRegistrationTarget;\n};\n\n/**\n * 提取组件的全局注册名称。\n *\n * @param component - 待注册组件。\n * @returns 经过校验的显式名称。\n * @throws `TypeError` 当组件没有非空字符串名称,或名称包含空白。\n */\nconst getComponentName = (component: VueInstallValue): string => {\n\tconst name = (component as { name?: unknown }).name;\n\tif (typeof name !== \"string\" || name.length === 0 || /\\s/u.test(name)) {\n\t\tthrow new TypeError(\"可安装的 Vue 组件必须公开不含空白的非空名称。\");\n\t}\n\treturn name;\n};\n\n/** 预检完成、可以无失败注册的组件动作。 */\ninterface ComponentRegistration {\n\t/** 已校验的组件引用。 */\n\tcomponent: VueInstallValue;\n\t/** 已校验的组件名称。 */\n\tname: string;\n\t/** 目标中是否已经注册了完全相同的组件引用。 */\n\tregistered: boolean;\n}\n\n/**\n * 预检单个组件注册。\n *\n * @remarks 先读取同名组件并完成冲突判断,再返回延迟执行动作;调用方可以在所有组件预检通过后统一提交。\n * @param app - 已校验的 Vue 3 App 注册目标。\n * @param component - 待注册组件。\n * @returns 已校验的组件引用、名称和目标中是否已经存在同一引用。\n * @throws `Error` 当同名位置已由其他组件占用。\n */\nconst prepareComponentRegistration = (app: VueAppRegistrationTarget, component: VueInstallValue): ComponentRegistration => {\n\tconst name = getComponentName(component);\n\tconst existing = app.component(name);\n\tif (existing !== undefined && existing !== component) {\n\t\tthrow new Error(`Vue 组件名称“${name}”已被其他组件注册。`);\n\t}\n\treturn { component, name, registered: existing === component };\n};\n\n/**\n * 为主组件附加 Vue 3 `app.use()` 安装能力。\n *\n * @remarks 函数会直接为 `main` 定义附属组件属性和 `install`。所有组件名称、附属属性\n * 冲突会在修改 `main` 前完成校验;安装到 App 时也会先预检全部全局名称,再统一注册。\n * @param main - 具有非空 `name` 的组件。\n * @param extras - 同时注册并以可枚举属性挂到主组件的附属组件映射。\n * @returns 原始 `main` 引用,并附加类型化的 `install` 与 `extras` 属性。\n * @throws `TypeError` 当组件缺少合法名称、已有 `install`、附属键或名称发生冲突。\n * @throws `Error` 当 App 中同名位置已经注册其他组件。\n */\nexport function withInstall<Main extends VueInstallValue, Extras extends Record<string, VueInstallValue> = Record<never, never>>(\n\tmain: Main,\n\textras?: Extras\n): Installable<Main> & Extras {\n\tconst componentNames = new Set([getComponentName(main)]);\n\tif (\"install\" in Object(main)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst extraEntries = Object.entries(extras ?? {});\n\tif (extras !== undefined && Object.getOwnPropertySymbols(extras).some((key) => Object.prototype.propertyIsEnumerable.call(extras, key))) {\n\t\tthrow new TypeError(\"Vue 组件附属项必须使用字符串属性名。\");\n\t}\n\tfor (const [key, component] of extraEntries) {\n\t\tconst componentName = getComponentName(component);\n\t\tif (componentNames.has(componentName)) throw new TypeError(`Vue 组件名称“${componentName}”被重复注册。`);\n\t\tcomponentNames.add(componentName);\n\t\tif (key === \"install\" || key in Object(main)) {\n\t\t\tthrow new TypeError(`Vue 组件附属项“${key}”会覆盖主组件上的属性。`);\n\t\t}\n\t}\n\tconst installable = main as Installable<Main> & Extras;\n\tfor (const [key, component] of extraEntries) {\n\t\tObject.defineProperty(installable, key, { configurable: true, enumerable: true, value: component, writable: true });\n\t}\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\t// 先完成全部冲突检查,再统一注册,避免安装到一半留下部分全局组件。\n\t\tconst registrations = [main, ...extraEntries.map(([, component]) => component)].map((component) =>\n\t\t\tprepareComponentRegistration(app, component)\n\t\t);\n\t\tfor (const registration of registrations) {\n\t\t\tif (!registration.registered) app.component(registration.name, registration.component);\n\t\t}\n\t};\n\treturn installable;\n}\n\n/**\n * 为不需要单独注册的附属组件附加空安装函数。\n *\n * @remarks 适用于只能作为主组件附属属性使用、但仍需满足 Vue Plugin 类型的组件。\n * 函数直接修改并返回传入组件,不会向 Vue 3 App 注册内容。\n * @param component - 尚未定义或继承 `install` 属性的组件。\n * @returns 原组件引用及无副作用的 `install` 方法。\n * @throws `TypeError` 当组件自身或原型链已经存在 `install`。\n */\nexport function withNoopInstall<Value extends VueInstallValue>(component: Value): TSXWithInstall<Value> {\n\tif (\"install\" in Object(component)) throw new TypeError(\"Vue 组件已定义 `install` 属性。\");\n\tconst installable = component as TSXWithInstall<Value>;\n\tinstallable.install = (): void => undefined;\n\treturn installable;\n}\n\n/**\n * 为 Vue 3 指令附加插件安装能力。\n *\n * @remarks 函数直接修改并返回指令。安装时重复注册同一引用保持幂等,不会覆盖同名的\n * 其他指令。名称只传给 `directive()`,不得包含 `v-` 前缀。\n * @param directive - 尚未定义或继承 `install` 属性的 Vue 指令对象。\n * @param name - 非空、无空白且不以 `v-` 开头的全局指令名。\n * @returns 原指令引用及 Vue Plugin `install` 方法。\n * @throws `TypeError` 当名称非法、指令已有 `install`,或安装目标无效。\n * @throws `Error` 当 App 中同名位置已经注册其他指令。\n */\nexport function withInstallDirective<Value extends VueInstallValue>(directive: Value, name: string): Installable<Value> {\n\tif (name.length === 0 || /\\s/u.test(name) || name.startsWith(\"v-\")) {\n\t\tthrow new TypeError(\"可安装的 Vue 指令名称不能包含空白或 `v-` 前缀。\");\n\t}\n\tif (\"install\" in Object(directive)) throw new TypeError(\"Vue 指令已定义 `install` 属性。\");\n\tconst installable = directive as Installable<Value>;\n\tinstallable.install = (value: App): void => {\n\t\tconst app = assertApp(value);\n\t\tconst existing = app.directive(name);\n\t\tif (existing !== undefined && existing !== directive) {\n\t\t\tthrow new Error(`Vue 指令名称“${name}”已被其他指令注册。`);\n\t\t}\n\t\tif (existing !== directive) app.directive(name, directive);\n\t};\n\treturn installable;\n}\n","import { computed } from \"vue\";\nimport type { ComputedRef, PropType } from \"vue\";\n\n/**\n * 为 Vue 运行时 Props 构造器附加泛型类型。\n *\n * @remarks 该函数只帮助 TypeScript 建模,不验证运行时值与 `Value` 一致;调用方仍应\n * 传入 Vue 支持的构造器或构造器数组。\n * @param runtimeType - Vue 支持的运行时构造器或构造器数组。\n * @returns 同一引用,仅在类型层收窄为 `PropType<Value>`。\n */\nexport function definePropType<Value>(runtimeType: unknown): PropType<Value> {\n\treturn runtimeType as PropType<Value>;\n}\n\n/**\n * 构建需要透传给子组件的响应式 Props。\n *\n * @param props - Vue `setup` 接收的只读响应式 Props 对象。\n * @param rawProps - 子组件的运行时 Props 配置。\n * @param ignoredProps - 不需要透传的 Props 名称。\n * @returns 只包含 `rawProps` 声明键且随 Props 更新的 ComputedRef。\n */\nexport function useProps<Props extends object, RawProps extends object, IgnoredProp extends keyof RawProps = never>(\n\tprops: Props,\n\trawProps: RawProps,\n\tignoredProps: readonly IgnoredProp[] = []\n): ComputedRef<Omit<Pick<Props, Extract<keyof Props, keyof RawProps>>, Extract<IgnoredProp, keyof Props>>> {\n\tconst ignored = new Set<PropertyKey>(ignoredProps);\n\ttype Result = Omit<Pick<Props, Extract<keyof Props, keyof RawProps>>, Extract<IgnoredProp, keyof Props>>;\n\treturn computed<Result>(() => {\n\t\tconst result = {} as Result;\n\t\tfor (const key of Reflect.ownKeys(rawProps)) {\n\t\t\tif (ignored.has(key) || !Object.hasOwn(props, key)) continue;\n\t\t\tObject.defineProperty(result, key, { configurable: true, enumerable: true, value: Reflect.get(props, key), writable: true });\n\t\t}\n\t\treturn result;\n\t});\n}\n","import { getCurrentInstance } from \"vue\";\nimport type { VNode } from \"vue\";\n\n/** `useRender` 需要写入的 Vue 3 内部组件实例字段。 */\ninterface MutableVueComponentInstance {\n\trender?: () => VNode;\n}\n\n/**\n * 在当前 Vue 3 组件实例上安装 TSX 渲染函数。\n * @remarks `setup` 仍可返回状态对象,因此状态能够显示在 Vue Devtools 中。\n * @param render - 当前组件的渲染函数。\n * @throws 不在组件 `setup` 调用栈中使用时抛出 `Error`。\n */\nexport function useRender(render: () => VNode): void {\n\tconst instance = getCurrentInstance();\n\tif (instance === null) throw new Error(\"`useRender` 必须在 `setup` 函数内部调用。\");\n\t(instance as unknown as MutableVueComponentInstance).render = render;\n}\n","import type { SlotsType, VNode } from \"vue\";\n\n/** Slot 名到 Props 类型的内部声明映射。 */\ntype RawSlots = Record<string, unknown>;\n/** 根据 Slot Props 是否为 never 生成无参数或有参数的 Slot 签名。 */\ntype VueSlot<Properties> = [Properties] extends [never] ? () => VNode[] : (properties: Properties) => VNode[];\n\n/** 把 Slot 名称与作用域参数映射为 Vue 3 Slot 函数。 */\nexport type TypedSlots<Slots extends RawSlots> = {\n\t[Name in keyof Slots]: VueSlot<Slots[Name]>;\n};\n\n/** Vue 3 `slots` 选项接受的运行时声明与官方静态类型标记。 */\nexport type TypedSlotsDeclaration<Slots extends RawSlots> = SlotsType<Partial<TypedSlots<Slots>>>;\n\n/**\n * 为 Options API 的 `slots` 选项创建带作用域参数的类型声明。\n *\n * @returns 运行时 `Object` 构造器,并携带仅供 TypeScript 使用的 Slot 类型标记。\n */\nexport function makeSlots<Slots extends RawSlots>(): TypedSlotsDeclaration<Slots> {\n\treturn Object as TypedSlotsDeclaration<Slots>;\n}\n","/**\n * 保留传入值并显式指定其 TypeScript 类型。\n *\n * @remarks 未传值时运行时结果为 `undefined`,仅适合为 reactive 对象的初始字段提供类型。\n * @param data - 可选的原始值。\n * @returns 传入值本身;省略时返回类型化的 `undefined`。\n */\nexport function withDefineType<Value>(data?: Value): Value {\n\treturn data as Value;\n}\n"],"x_google_ignoreList":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],"mappings":"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AG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EAEzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EAEzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,EAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,EAAE,GAAG,EACzC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAa,GAAI,E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"}