aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author0t4u <61939142+0t4u@users.noreply.github.com>2022-12-05 20:33:28 +0000
committerGitHub <noreply@github.com>2022-12-05 20:33:28 +0000
commitc6aa70a64731b608fade3acab48c1d1d2df280b6 (patch)
treea92d130d6b927e520ab40692bc504db7606f2092
Add files via upload
-rw-r--r--README.md3
-rw-r--r--modules/ChatReplay/ChatMessageRender.tsx171
-rw-r--r--modules/ChatReplay/ChatReplay.tsx74
-rw-r--r--modules/ChatReplay/ChatReplayPanel.tsx170
-rw-r--r--modules/ChatReplay/parser/default.ts21
-rw-r--r--modules/ChatReplay/parser/index.ts32
-rw-r--r--modules/ChatReplay/parser/yt-dlp.ts169
-rw-r--r--modules/NextImage.tsx7
-rw-r--r--modules/PageBase.tsx48
-rw-r--r--modules/VideoActionButtons.tsx144
-rw-r--r--modules/VideoPlayer/MediaSync.tsx194
-rw-r--r--modules/VideoPlayer/SeekBar.tsx88
-rw-r--r--modules/VideoPlayer/VideoPlayer2.tsx558
-rw-r--r--modules/VideoPlayer/components/LoaderRing.tsx10
-rw-r--r--modules/database.d.ts170
-rw-r--r--modules/format.ts24
-rw-r--r--modules/hooks/useAnimationFrame.tsx30
-rw-r--r--modules/hooks/useDebounce.tsx25
-rw-r--r--modules/hooks/useLocalStorage.tsx48
-rw-r--r--modules/hooks/useThrottle.tsx24
-rw-r--r--modules/hooks/useWindowSize.tsx19
-rw-r--r--modules/icons.tsx219
-rw-r--r--modules/shared/DefaultHead.tsx39
-rw-r--r--modules/util.ts25
-rw-r--r--next-env.d.ts6
-rw-r--r--next.config.js6
-rw-r--r--package.json31
-rw-r--r--pages/404.tsx21
-rw-r--r--pages/_app.tsx10
-rw-r--r--pages/index.tsx185
-rw-r--r--postcss.config.js3
-rw-r--r--public/favicon.icobin0 -> 120117 bytes
-rw-r--r--public/favicon.pngbin0 -> 145920 bytes
-rw-r--r--styles/player.css137
-rw-r--r--styles/tailwind.css34
-rw-r--r--tailwind.config.js48
-rw-r--r--tsconfig.json30
-rw-r--r--yarn.lock4778
38 files changed, 7601 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..731dac8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# arvhive-player
+
+very very stripped back archive.ragtag.moe that only allows local playback... idk why people want this but here it is. \ No newline at end of file
diff --git a/modules/ChatReplay/ChatMessageRender.tsx b/modules/ChatReplay/ChatMessageRender.tsx
new file mode 100644
index 0000000..1207457
--- /dev/null
+++ b/modules/ChatReplay/ChatMessageRender.tsx
@@ -0,0 +1,171 @@
+import React from "react";
+import { ChatMessage } from "../database.d";
+import { formatSeconds } from "../format";
+import { proxyYT3 as proxyURL } from "../util";
+
+export type ChatMessageRenderProps = {
+ message: ChatMessage;
+};
+
+const regexEmoji = /(:[^:]+:)/g;
+
+const ChatMessageRender = React.memo((props: ChatMessageRenderProps) => {
+ const msg = props.message;
+
+ const generateMessageContent = (msg: ChatMessage) => {
+ if (!msg.emotes) return msg.message;
+
+ // Process emotes
+ const tokens = msg.message.split(regexEmoji);
+ return tokens.map((token) => {
+ if (!token.startsWith(":")) return token;
+
+ let images = msg.emotes.find((emote) => emote.name === token)?.images;
+ if (!images)
+ images = msg.emotes.find((emote) => emote.shortcuts.includes(token))
+ ?.images;
+ if (!images) return token;
+
+ const emoteURL =
+ images.find((image) => image.id === "source")?.url || images[0]?.url;
+
+ if (!emoteURL) return token;
+ return (
+ <img
+ src={proxyURL(emoteURL)}
+ alt={token}
+ title={token}
+ className="inline-block w-6 h-6"
+ />
+ );
+ });
+ };
+
+ switch (msg.message_type) {
+ case "paid_message":
+ return (
+ <div
+ key={msg.message_id}
+ className="my-4 rounded overflow-hidden"
+ style={{
+ color: msg.body_text_colour,
+ background: msg.body_background_colour,
+ }}
+ >
+ <div
+ style={{
+ color: msg.header_text_colour,
+ background: msg.header_background_colour,
+ }}
+ className="flex flex-row justify-between px-4 py-2"
+ >
+ <div>
+ <div style={{ color: msg.author.name_text_colour }}>
+ {msg.author.name}
+ {msg.author.badges && msg.author.badges[0].icons ? (
+ <img
+ src={proxyURL(msg.author.badges[0].icons[1].url)}
+ alt={msg.author.badges[0].title}
+ title={msg.author.badges[0].title}
+ className="inline-block ml-2 w-4 h-4"
+ />
+ ) : null}
+ </div>
+ <div className="font-bold">{msg.money.text}</div>
+ </div>
+ <div
+ className="text-sm"
+ style={{ color: msg.author.name_text_colour }}
+ >
+ [{formatSeconds(msg.time_in_seconds)}]
+ </div>
+ </div>
+ <div className="px-4 py-2">{generateMessageContent(msg)}</div>
+ </div>
+ );
+ case "membership_item":
+ return (
+ <div
+ key={msg.message_id}
+ className="px-4 py-2 my-4 rounded bg-green-600 text-white"
+ >
+ <div className="flex flex-row justify-between pb-2">
+ <div className="font-bold">
+ <div className="inline-block">{msg.author.name}</div>
+ {msg.author.badges && msg.author.badges[0].icons ? (
+ <img
+ src={proxyURL(msg.author.badges[0].icons[1].url)}
+ alt={msg.author.badges[0].title}
+ title={msg.author.badges[0].title}
+ className="inline-block ml-2 w-4 h-4"
+ />
+ ) : null}
+ </div>
+ <div className="text-sm">
+ [{formatSeconds(msg.time_in_seconds)}]
+ </div>
+ </div>
+ {generateMessageContent(msg)}
+ </div>
+ );
+ case "text_message":
+ const authorType =
+ msg.author.badges?.map(({ title }) =>
+ title === "Owner"
+ ? "owner"
+ : title === "Moderator"
+ ? "moderator"
+ : title.toLowerCase().includes("member")
+ ? "member"
+ : ""
+ ) || [];
+ return (
+ <div key={msg.message_id} className="px-2 mb-2">
+ <div className="text-gray-400 text-xs flex justify-between">
+ <span
+ className={[
+ "mr-2",
+ authorType.includes("owner")
+ ? "bg-blue-600 text-white font-bold px-2 rounded"
+ : authorType.includes("moderator")
+ ? "text-blue-600 font-bold"
+ : authorType.includes("member")
+ ? "text-green-500"
+ : "",
+ ].join(" ")}
+ >
+ {msg.author.name}
+ {authorType.includes("moderator") && (
+ <svg
+ viewBox="0 0 16 16"
+ className="text-blue-600 w-4 h-4 inline-block ml-2"
+ >
+ <path
+ fill="currentColor"
+ d="M9.64589146,7.05569719 C9.83346524,6.562372 9.93617022,6.02722257 9.93617022,5.46808511 C9.93617022,3.00042984 7.93574038,1 5.46808511,1 C4.90894765,1 4.37379823,1.10270499 3.88047304,1.29027875 L6.95744681,4.36725249 L4.36725255,6.95744681 L1.29027875,3.88047305 C1.10270498,4.37379824 1,4.90894766 1,5.46808511 C1,7.93574038 3.00042984,9.93617022 5.46808511,9.93617022 C6.02722256,9.93617022 6.56237198,9.83346524 7.05569716,9.64589147 L12.4098057,15 L15,12.4098057 L9.64589146,7.05569719 Z"
+ />
+ </svg>
+ )}
+ {msg.author.badges?.map((badge) =>
+ Array.isArray(badge.icons) ? (
+ <img
+ key={badge.title}
+ alt={badge.title}
+ title={badge.title}
+ src={proxyURL(badge.icons?.[1]?.url)}
+ className="inline-block ml-2 w-4 h-4"
+ />
+ ) : null
+ )}
+ </span>
+ <span>[{formatSeconds(msg.time_in_seconds)}]</span>
+ </div>
+ {generateMessageContent(msg)}
+ </div>
+ );
+ }
+
+ return null;
+});
+
+export default ChatMessageRender;
diff --git a/modules/ChatReplay/ChatReplay.tsx b/modules/ChatReplay/ChatReplay.tsx
new file mode 100644
index 0000000..b18b68b
--- /dev/null
+++ b/modules/ChatReplay/ChatReplay.tsx
@@ -0,0 +1,74 @@
+import React from "react";
+import { ChatMessage } from "../database.d";
+import ChatMessageRender from "./ChatMessageRender";
+
+export type ChatReplayProps = {
+ replayData: ChatMessage[];
+ currentTimeSeconds: number;
+};
+
+function bsearch<T>(
+ arr: T[],
+ search: number,
+ transform: (item: T) => number
+): number {
+ let iL = 0,
+ iR = arr.length - 1,
+ iM = Math.floor(arr.length / 2);
+
+ while (iR - iL > 1) {
+ iM = Math.floor((iL + iR) / 2);
+ const m = transform(arr[iM]);
+
+ if (m < search) iL = iM;
+ else if (m > search) iR = iM;
+ else if (m === search || iL === iM) return iM;
+ }
+ return iM;
+}
+
+const ChatReplay = (props: ChatReplayProps) => {
+ const { replayData, currentTimeSeconds } = props;
+ const [messages, setMessages] = React.useState<ChatMessage[]>([]);
+
+ React.useEffect(() => {
+ /**
+ * Find the current replayData index where
+ * time_in_seconds <= currentTimeSeconds
+ * using binary search
+ */
+ const index = bsearch(
+ replayData,
+ currentTimeSeconds,
+ (message) => message.time_in_seconds
+ );
+
+ /**
+ * Once index is acquired, slice the array
+ * to get the previous `maxMessages` items
+ */
+ const maxMessages = 50;
+ const messages = replayData.slice(Math.max(0, index - maxMessages), index);
+
+ // Make sure there are no duplicate messages
+ const filtered = [];
+ const messageIds = [];
+
+ for (const message of messages) {
+ if (messageIds.includes(message.message_id)) continue;
+ messageIds.push(message.message_id);
+ filtered.push(message);
+ }
+
+ setMessages(filtered);
+ }, [replayData, currentTimeSeconds]);
+ return (
+ <div className="w-full break-words">
+ {messages.map((msg) => (
+ <ChatMessageRender key={msg.message_id} message={msg} />
+ ))}
+ </div>
+ );
+};
+
+export default ChatReplay;
diff --git a/modules/ChatReplay/ChatReplayPanel.tsx b/modules/ChatReplay/ChatReplayPanel.tsx
new file mode 100644
index 0000000..b5cfa7c
--- /dev/null
+++ b/modules/ChatReplay/ChatReplayPanel.tsx
@@ -0,0 +1,170 @@
+import React from "react";
+import axios from "axios";
+import { ChatMessage } from "../database.d";
+import ChatReplay from "./ChatReplay";
+import { IconChevronDown, IconFilter } from "../icons";
+import { useDebounce } from "../hooks/useDebounce";
+import { parseChatReplay } from "./parser";
+
+export type ChatReplayPanelProps = {
+ src: string;
+ currentTimeSeconds: number;
+ onChatToggle?: (isVisible: boolean) => any;
+};
+
+const ChatReplayPanel = (props: ChatReplayPanelProps) => {
+ const [replayData, setReplayData] = React.useState<ChatMessage[]>(null);
+ const [filteredReplayData, setFilteredReplayData] = React.useState<
+ ChatMessage[]
+ >(null);
+ const [downloadProgress, setDownloadProgress] = React.useState(-1);
+ const [isFilterVisible, setIsFilterVisible] = React.useState(false);
+ const [chatFilter, setChatFilter] = React.useState("");
+ const [isChatVisible, setIsChatVisible] = React.useState(false);
+ const [isErrored, setIsErrored] = React.useState(false);
+ const refChatScrollDiv = React.useRef<HTMLDivElement>(null);
+
+ const activeChatFilter = useDebounce(chatFilter, 250);
+
+ const downloadChatData = async () => {
+ setDownloadProgress(0);
+ setReplayData(null);
+ setIsErrored(false);
+ try {
+ const data = await axios.get(props.src, {
+ onDownloadProgress: ({ loaded }) => setDownloadProgress(loaded),
+ transformResponse: (res) => res,
+ });
+
+ setReplayData(parseChatReplay(data.data));
+ setIsChatVisible(true);
+ } catch (ex) {
+ console.log("[chat] error parsing chat:", ex);
+ setIsErrored(true);
+ }
+ };
+
+ React.useEffect(() => {
+ if (!replayData) return;
+ if (!activeChatFilter) return setFilteredReplayData(replayData);
+
+ setFilteredReplayData(
+ replayData.filter(
+ (message) =>
+ !!message.message &&
+ message.message.toLowerCase().includes(activeChatFilter.toLowerCase())
+ )
+ );
+ }, [activeChatFilter, replayData]);
+
+ /**
+ * Automatically download chat replay
+ */
+ React.useEffect(() => {
+ downloadChatData();
+ }, [props.src]);
+
+ React.useEffect(() => {
+ if (refChatScrollDiv.current)
+ refChatScrollDiv.current.scrollTo({
+ top: refChatScrollDiv.current.scrollHeight,
+ behavior: "smooth",
+ });
+ }, [props.currentTimeSeconds]);
+
+ React.useEffect(() => {
+ props.onChatToggle?.(isChatVisible);
+ }, [isChatVisible]);
+
+ if (replayData === null)
+ return (
+ <div
+ className="border border-gray-800 rounded p-4 text-center cursor-pointer"
+ onClick={() => {
+ if (isErrored || downloadProgress < 0) downloadChatData();
+ }}
+ >
+ {isErrored ? (
+ <p>Error loading chat, click to retry</p>
+ ) : downloadProgress < 0 ? (
+ <>
+ <p>Chat replay available!</p>
+ <p>Click to Enable</p>
+ </>
+ ) : downloadProgress === 0 ? (
+ <p>Loading chat replay...</p>
+ ) : (
+ <p>Loaded {(downloadProgress / 1024 / 1024).toFixed(2)}MB</p>
+ )}
+ </div>
+ );
+
+ return (
+ <div className="h-full flex flex-col">
+ <div className="flex flex-col text-white bg-gray-900">
+ <div className="flex">
+ <div className="flex-1 flex items-center px-4">Chat replay</div>
+ <div>
+ <button
+ type="button"
+ onClick={() => setIsFilterVisible((now) => !now)}
+ className="px-4 py-2"
+ >
+ <IconFilter width="1em" height="1em" />
+ </button>
+ <button
+ type="button"
+ onClick={() => setIsChatVisible((now) => !now)}
+ className="text-lg px-4 py-2"
+ >
+ <IconChevronDown
+ width="1em"
+ height="1em"
+ style={{ transform: isChatVisible ? "rotate(180deg)" : "" }}
+ />
+ </button>
+ </div>
+ </div>
+ {isFilterVisible && (
+ <div className="flex flex-col">
+ <div className="flex">
+ <input
+ type="text"
+ placeholder="Filter text"
+ className="
+ w-full rounded px-4 py-1 md:mx-2
+ bg-gray-800 hover:bg-gray-700 focus:outline-none focus:ring
+ transition duration-100 z-20
+ "
+ value={chatFilter}
+ onChange={(e) => setChatFilter(e.target.value)}
+ />
+ </div>
+ </div>
+ )}
+ </div>
+ {isChatVisible && (
+ <div className="relative flex-1">
+ <div
+ className={[
+ "px-2 border border-gray-800 rounded",
+ "overflow-y-scroll absolute inset-0",
+ "transition-all duration-200",
+ ].join(" ")}
+ style={{
+ overscrollBehavior: "contain",
+ }}
+ ref={refChatScrollDiv}
+ >
+ <ChatReplay
+ currentTimeSeconds={props.currentTimeSeconds}
+ replayData={filteredReplayData}
+ />
+ </div>
+ </div>
+ )}
+ </div>
+ );
+};
+
+export default ChatReplayPanel;
diff --git a/modules/ChatReplay/parser/default.ts b/modules/ChatReplay/parser/default.ts
new file mode 100644
index 0000000..acf1aef
--- /dev/null
+++ b/modules/ChatReplay/parser/default.ts
@@ -0,0 +1,21 @@
+import { ChatReplayParser } from ".";
+import { ChatMessage } from "../../database.d";
+
+export default class DefaultChatParser implements ChatReplayParser {
+ name: "DefaultChatParser";
+ chatData: string = "";
+
+ constructor(chatData: string) {
+ this.chatData = chatData.trim();
+ }
+
+ canParse(): boolean {
+ return this.chatData.startsWith("[") && this.chatData.endsWith("]");
+ }
+
+ parse(): ChatMessage[] {
+ return (JSON.parse(this.chatData) as ChatMessage[]).sort(
+ (a, b) => a.time_in_seconds - b.time_in_seconds
+ );
+ }
+}
diff --git a/modules/ChatReplay/parser/index.ts b/modules/ChatReplay/parser/index.ts
new file mode 100644
index 0000000..d921603
--- /dev/null
+++ b/modules/ChatReplay/parser/index.ts
@@ -0,0 +1,32 @@
+import { ChatMessage } from "../../database.d";
+import DefaultChatParser from "./default";
+import YtDlpChatParser from "./yt-dlp";
+
+export abstract class ChatReplayParser {
+ name: string = "";
+
+ constructor(chatData: string) {
+ if (this.constructor === ChatReplayParser)
+ throw new Error("Abstract classes can't be instantiated.");
+ }
+
+ canParse(): boolean {
+ return false;
+ }
+
+ parse(): ChatMessage[] {
+ return [];
+ }
+}
+
+export const parseChatReplay = (input: string) => {
+ console.log("[chat] parsing chat data");
+ const parser = [DefaultChatParser, YtDlpChatParser]
+ .map((Parser) => new Parser(input))
+ .find((parser) => parser.canParse());
+ if (!parser) throw new Error("No suitable chat parser found");
+ console.log("[chat] using", parser.name);
+ const parsed = parser.parse();
+ console.log("[chat] found", parsed.length, "messages");
+ return parsed;
+};
diff --git a/modules/ChatReplay/parser/yt-dlp.ts b/modules/ChatReplay/parser/yt-dlp.ts
new file mode 100644
index 0000000..0647961
--- /dev/null
+++ b/modules/ChatReplay/parser/yt-dlp.ts
@@ -0,0 +1,169 @@
+import { ChatReplayParser } from ".";
+import {
+ ChatMessage,
+ ChatMessageAuthor,
+ ChatMessageImage,
+} from "../../database.d";
+
+export default class YtDlpChatParser implements ChatReplayParser {
+ name = "YtDlpChatParser";
+ chatData: string = "";
+
+ constructor(chatData: string) {
+ this.chatData = chatData.trim();
+ }
+
+ canParse(): boolean {
+ return (
+ this.chatData.startsWith("{") &&
+ this.chatData.endsWith("}") &&
+ this.chatData.includes("\n") &&
+ this.chatData.includes("clickTrackingParams")
+ );
+ }
+
+ _formatMsec(ms: number): string {
+ const secs = Math.abs(Math.floor(ms / 1000)),
+ ss = secs % 60,
+ mm = Math.floor(secs / 60),
+ hh = Math.floor(secs / 3600);
+ return (
+ (ms < 0 ? "-" : "") +
+ (hh > 0 ? [hh, mm, ss] : [mm, ss])
+ .map((x) => x.toString().padStart(2, "0"))
+ .join(":")
+ );
+ }
+
+ parse(): ChatMessage[] {
+ return this.chatData
+ .split("\n")
+ .map((line) => {
+ try {
+ return JSON.parse(line);
+ } catch (ex) {
+ return null;
+ }
+ })
+ .filter(Boolean)
+ .map((event) => {
+ try {
+ const actionBase = event.replayChatItemAction.actions[0];
+ const action_type =
+ "addChatItemAction" in actionBase
+ ? "add_chat_item"
+ : "addLiveChatTickerItemAction" in actionBase
+ ? "add_live_chat_ticker_item"
+ : "unknown";
+
+ // Skip handling tickers for now
+ if (action_type !== "add_chat_item") return null;
+
+ const actionItem = actionBase.addChatItemAction.item;
+ const message_type =
+ "liveChatMembershipItemRenderer" in actionItem
+ ? "membership_item"
+ : "liveChatTextMessageRenderer" in actionItem
+ ? "text_message"
+ : "liveChatPaidMessageRenderer" in actionItem
+ ? "paid_message"
+ : "unknown";
+
+ if (message_type === "unknown") return null;
+
+ const messageItem =
+ actionItem.liveChatMembershipItemRenderer ||
+ actionItem.liveChatTextMessageRenderer ||
+ actionItem.liveChatPaidMessageRenderer;
+
+ if (!messageItem) return null;
+
+ const author: ChatMessageAuthor & {
+ name_text_colour?: string;
+ } = {
+ name: messageItem.authorName?.simpleText || "",
+ id: messageItem.authorExternalChannelId,
+ images: messageItem.authorPhoto?.thumbnails.map(
+ (thumb: Partial<ChatMessageImage>) => ({
+ id: String(thumb.height),
+ ...thumb,
+ })
+ ),
+ badges: messageItem.authorBadges?.map(
+ ({ liveChatAuthorBadgeRenderer: badge }: any) => ({
+ title: badge.tooltip,
+ icons: badge.customThumbnail?.thumbnails,
+ })
+ ),
+ name_text_colour:
+ "#" + messageItem.authorNameTextColor?.toString(16).substr(2),
+ };
+
+ const timeMsec = Number(
+ event.replayChatItemAction.videoOffsetTimeMsec ||
+ event.videoOffsetTimeMsec
+ );
+
+ return {
+ time_in_seconds: timeMsec / 1000,
+ action_type,
+ message_type,
+ author,
+ message_id: messageItem.id,
+ timestamp: Number(messageItem.timestampUsec),
+ time_text:
+ messageItem.timestampText?.simpleText ||
+ this._formatMsec(timeMsec),
+ message:
+ messageItem.message || messageItem.headerSubtext
+ ? (messageItem.message || messageItem.headerSubtext).runs
+ .map((run: any) => run?.emoji?.shortcuts?.[0] ?? run.text)
+ .join("")
+ : "",
+ emotes: messageItem.message?.runs
+ .map((run: any) => run.emoji)
+ .filter((e: any) => Boolean(e?.shortcuts))
+ .map((e: any) => ({
+ id: e.emojiId,
+ name: e.shortcuts[0],
+ shortcuts: e.shortcuts,
+ search_terms: e.searchTerms,
+ is_custom_emoji: e.isCustomEmoji,
+ images: e.image?.thumbnails.map(
+ (thumb: Partial<ChatMessageImage>) => ({
+ id: String(thumb.height),
+ ...thumb,
+ })
+ ),
+ })),
+ ...(message_type === "paid_message"
+ ? {
+ money: {
+ text: messageItem.purchaseAmountText.simpleText,
+ amount: 0,
+ currency: "-",
+ currency_symbol: "-",
+ },
+ timestamp_colour:
+ "#" + messageItem.timestampColor?.toString(16).substr(2),
+ body_background_colour:
+ "#" +
+ messageItem.bodyBackgroundColor?.toString(16).substr(2),
+ header_text_colour:
+ "#" + messageItem.headerTextColor?.toString(16).substr(2),
+ header_background_colour:
+ "#" +
+ messageItem.headerBackgroundColor?.toString(16).substr(2),
+ body_text_colour:
+ "#" + messageItem.bodyTextColor?.toString(16).substr(2),
+ }
+ : {}),
+ };
+ } catch (ex) {
+ return null;
+ }
+ })
+ .filter(Boolean)
+ .sort((a, b) => a.time_in_seconds - b.time_in_seconds) as ChatMessage[];
+ }
+}
diff --git a/modules/NextImage.tsx b/modules/NextImage.tsx
new file mode 100644
index 0000000..e27c0f3
--- /dev/null
+++ b/modules/NextImage.tsx
@@ -0,0 +1,7 @@
+import Image from "next/image";
+
+type NextImageProps = React.ComponentPropsWithoutRef<typeof Image>;
+
+export const NextImage = (props: NextImageProps) => (
+ <Image unoptimized={false} {...props} />
+);
diff --git a/modules/PageBase.tsx b/modules/PageBase.tsx
new file mode 100644
index 0000000..f6290c3
--- /dev/null
+++ b/modules/PageBase.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import Head from 'next/head';
+
+export type PageBaseProps = {
+ children?: React.ReactNode;
+ flex?: boolean;
+};
+
+const PageBase = (props: PageBaseProps) => {
+ return (
+ <div className="bg-black text-white flex flex-col flex-1">
+ <Head>
+ <link rel="shortcut icon" href="/favicon.png" type="image/png" />
+ </Head> <div
+ className={[
+ 'container mx-auto mt-4 flex-1',
+ props.flex ? 'flex flex-col' : '',
+ ].join(' ')}
+ >
+ {props.children}
+ </div>
+ {/* <div className="mt-6 text-gray-500 text-center">
+ Made with 🍝 by{' '}
+ <a
+ href="https://twitter.com/kitsune_cw"
+ className="hover:underline"
+ target="_blank"
+ rel="noreferrer noopener nofollow"
+ >
+ kitsune
+ </a>
+ .
+ </div>
+ <div className="mb-6 text-center">
+ <a
+ href="https://gitlab.com/aonahara/archive-browser"
+ className="text-gray-500 hover:underline"
+ target="_blank"
+ rel="noreferrer noopener nofollow"
+ >
+ Source code
+ </a>
+ </div> */}
+ </div>
+ );
+};
+
+export default PageBase;
diff --git a/modules/VideoActionButtons.tsx b/modules/VideoActionButtons.tsx
new file mode 100644
index 0000000..572ded2
--- /dev/null
+++ b/modules/VideoActionButtons.tsx
@@ -0,0 +1,144 @@
+import Link from "next/link";
+import React from "react";
+import { VideoMetadata } from "./database.d";
+import { formatBytes } from "./format";
+import {
+ IconChartBar,
+ IconChevronDown,
+ IconDownload,
+ IconYouTube,
+} from "./icons";
+
+type VideoActionButtonsProps = {
+ video: VideoMetadata;
+ full?: boolean;
+};
+
+export const buttonStyle = `
+ bg-gray-800
+ hover:bg-gray-700
+ focus:bg-gray-900 focus:outline-none
+ px-4 py-2 mb-2 md:mb-0 rounded
+ transition duration-200
+ flex flex-row items-center`.replace(/\s+/, " ");
+
+const getFile = (videoInfo: VideoMetadata, suffix: string) =>
+ videoInfo.files.find((file) => file.name.endsWith(suffix));
+
+const VideoActionButtons = React.memo(
+ ({ video, full }: VideoActionButtonsProps) => {
+ const [isMenuOpen, setIsMenuOpen] = React.useState(false);
+
+ const mkv = getFile(video, ".mkv");
+ const mkvURL = mkv?.url;
+ const mkvSize = mkv?.size || -1;
+
+ const [fmtVideo, fmtAudio] = video.format_id.split("+");
+
+ const handleToggleMenu = (
+ e: React.MouseEvent<HTMLAnchorElement, MouseEvent>
+ ) => {
+ e.preventDefault();
+ setIsMenuOpen((now) => !now);
+ };
+
+ const fileURLs = video.files
+ ?.filter(({ name }) => !name.endsWith(".mkv"))
+ .map(({ name, size, url }) => ({
+ label: name.includes(".f" + fmtVideo + ".")
+ ? "Video only"
+ : name.includes(".f" + fmtAudio + ".")
+ ? "Audio only"
+ : name.endsWith(".vtt")
+ ? "Captions (vtt, " + name.split(".")[1] + ")"
+ : name.endsWith(".ytt")
+ ? "Captions (srv3, " + name.split(".")[1] + ")"
+ : name.endsWith(".chat.json")
+ ? "Chat logs (json)"
+ : name.endsWith(".info.json")
+ ? "Metadata (json)"
+ : name.endsWith(".webp")
+ ? "Thumbnail (webp)"
+ : name.endsWith(".jpg")
+ ? "Thumbnail (jpeg)"
+ : name,
+ name,
+ size,
+ url,
+ }))
+ .sort((a, b) => (a.label > b.label ? 1 : -1));
+
+ // Account for aspect ratio wider than 16:9
+ const videoHeight = Math.max(video.height, 0.5625 * video.width);
+
+ return (
+ <>
+ {isMenuOpen && (
+ <div
+ className="fixed inset-0 opacity-0"
+ onClick={() => setIsMenuOpen(false)}
+ />
+ )}
+ <div className="relative flex md:flex-row flex-col w-full mt-2">
+ <a
+ href={mkvURL}
+ className={buttonStyle}
+ >
+ <IconDownload className="w-4 h-4 mr-3" />
+ Download ({videoHeight}p{video.fps}, {formatBytes(mkvSize)})
+ </a>
+ <a
+ href="#"
+ className={[buttonStyle, "md:mr-2"].join(" ")}
+ onClick={handleToggleMenu}
+ aria-label="More download options"
+ >
+ <IconChevronDown className="w-4 h-4" />
+ <span className="md:hidden ml-3">More download options</span>
+ </a>
+ {isMenuOpen && (
+ <div className="absolute z-10 left-0 top-10 bg-gray-800 rounded overflow-hidden">
+ {fileURLs.map((file) => (
+ <a
+ key={file.name}
+ href={file.url}
+ target="_blank"
+ rel="noreferrer noopener nofollow"
+ className="hover:bg-gray-700 focus:bg-gray-900 focus:outline-none block px-4 py-2 transition duration-200"
+ >
+ {file.label}
+ </a>
+ ))}
+ </div>
+ )}
+ <a
+ href={"https://youtu.be/" + video.video_id}
+ target="_blank"
+ rel="noreferrer noopener"
+ className={[buttonStyle, "md:mr-2"].join(" ")}
+ >
+ <IconYouTube className="w-4 h-4 mr-3" />
+ Watch on YouTube
+ </a>
+ {full && (
+ <>
+ <div className="flex-1" />
+ {video.files.findIndex((file) =>
+ file.name.endsWith(".chat.json")
+ ) > -1 && (
+ <Link href={"/tools/chat-explorer?v=" + video.video_id}>
+ <a className={buttonStyle}>
+ <IconChartBar className="w-4 h-4" />
+ <span className="ml-3">Chat explorer</span>
+ </a>
+ </Link>
+ )}
+ </>
+ )}
+ </div>
+ </>
+ );
+ }
+);
+
+export default VideoActionButtons;
diff --git a/modules/VideoPlayer/MediaSync.tsx b/modules/VideoPlayer/MediaSync.tsx
new file mode 100644
index 0000000..7c3d811
--- /dev/null
+++ b/modules/VideoPlayer/MediaSync.tsx
@@ -0,0 +1,194 @@
+import React, { forwardRef, Ref, useImperativeHandle } from "react";
+import { useAnimationFrame } from "../hooks/useAnimationFrame";
+
+export type MediaSyncState = {
+ duration: number;
+ timeSeconds: number;
+ isPlaying: boolean;
+ isSynced: boolean;
+ isStalled: boolean;
+};
+
+export type MediaSyncProps = {
+ children?: React.ReactNode;
+
+ // Events
+ onStateUpdate?: (state: MediaSyncState) => any;
+ onPlay?: () => any;
+ onPause?: () => any;
+};
+
+export type MediaSyncRef = {
+ play: () => void;
+ pause: () => void;
+ seek: (timeSeconds: number) => void;
+};
+
+const MediaSync = forwardRef<MediaSyncRef, MediaSyncProps>((props, ref) => {
+ // Create refs for all media elements
+ const childCount = React.Children.count(props.children);
+ const childRefs = Array(childCount)
+ .fill(null)
+ .map(() => React.useRef<HTMLMediaElement>(null));
+
+ // Playback state
+ const isPlaying = React.useRef(false);
+ const syncStates = React.useRef(Array(childCount).fill(false));
+ const lastVisibilityState = React.useRef<"visible" | "hidden">("visible");
+ const lastTime = React.useRef(0);
+ const lastTimeUpdate = React.useRef(Date.now());
+
+ // Settings
+ // Trigger sync at 15fps
+ // i.e. media is considered out of sync if time difference > 1/15 second
+ const syncThreshold = React.useRef(1 / 15);
+ // Release sync at 60fps
+ // i.e. media is considered in sync if time difference < 1/60 second
+ const syncedThreshold = React.useRef(1 / 60);
+ // If time difference is > jumpThreshold, seek instead of wait to sync
+ const jumpThreshold = React.useRef(1);
+ // If media isn't playing after stallThreshold milliseconds,
+ // consider the playback to be stalled (e.g. from buffering)
+ const stallThreshold = React.useRef(1000);
+
+ // Media event handlers
+ const handlePlayState = (event: "play" | "pause", index: number) => {
+ // Ignore event if no state change
+ // e.g. isPlaying is true, and event is play
+ if (isPlaying.current === (event === "play")) return;
+
+ // Ignore event if media is syncing
+ if (syncStates.current[index]) return;
+
+ // Ignore event if visibilityState is hidden
+ // and event comes from a video element. This is
+ // because browsers like Chrome will pause a video
+ // when the current tab is not visible.
+ lastVisibilityState.current = document.visibilityState;
+ if (
+ // lastVisibilityState.current === "hidden" &&
+ childRefs[index].current instanceof HTMLVideoElement
+ )
+ return;
+
+ // Otherwise, update playback state
+ isPlaying.current = event === "play";
+ console.log("[MediaSync]", event, "from", index);
+
+ // Also notify parent
+ if (event === "play") props.onPlay?.();
+ else props.onPause?.();
+ };
+
+ // Supply functions for this component's refs
+ useImperativeHandle(ref, () => ({
+ play: () => {
+ isPlaying.current = true;
+ props.onPlay?.();
+ },
+ pause: () => {
+ isPlaying.current = false;
+ props.onPause?.();
+ },
+ seek: (timeSeconds: number) => {
+ childRefs.forEach(({ current }) => (current.currentTime = timeSeconds));
+ },
+ }));
+
+ useAnimationFrame(() => {
+ // Skip if refs aren't ready yet
+ if (childRefs.findIndex((ref) => !ref.current) > -1) return;
+
+ // Get timestamps for each media element
+ const timestamps = childRefs.map(
+ ({ current }) => current?.currentTime || 0
+ );
+
+ // Assume the earliest time is the actual time
+ // e.g. video buffers and audio is playing, take the video time
+ // Except when the last visibility state is 'hidden', in which case
+ // take the latest time (usually comes from the audio)
+ const actualTime =
+ lastVisibilityState.current === "visible"
+ ? Math.min(...timestamps)
+ : Math.max(...timestamps);
+
+ // Check if media is stalled
+ const now = Date.now();
+ if (actualTime !== lastTime.current) lastTimeUpdate.current = now;
+ lastTime.current = actualTime;
+ const isStalled =
+ now - lastTimeUpdate.current > stallThreshold.current &&
+ isPlaying.current;
+
+ // Update sync states
+ // true -> out of sync, need to be paused if ahead or seeked if behind
+ // false -> in sync
+ // Flip to true when media is ahead by syncThreshold
+ // Only flip back to false when the timestamp === actualTime
+ syncStates.current = timestamps.map(
+ (ts, i) =>
+ Math.abs(ts - actualTime) > syncedThreshold.current &&
+ (syncStates[i] || Math.abs(ts - actualTime) > syncThreshold.current)
+ );
+
+ // Update media playback state
+ childRefs.forEach(({ current }, index) => {
+ if (isPlaying.current && syncStates.current[index]) {
+ // Media is ahead, pause if not yet paused
+ if (current.currentTime > actualTime && !current.paused)
+ current.pause();
+
+ // Seek media if time difference is greater than the jump threshold,
+ // or if the media is behind actualTime
+ if (
+ current.currentTime - actualTime > jumpThreshold.current ||
+ current.currentTime < actualTime
+ ) {
+ current.currentTime = actualTime;
+ syncStates.current[index] = false;
+ }
+ } else {
+ // Media is in sync, update playback state to reflect isPlaying
+ if (isPlaying.current && current.paused) current.play();
+ else if (!isPlaying.current && !current.paused) current.pause();
+
+ // Update visibility state
+ lastVisibilityState.current = document.visibilityState;
+ }
+ });
+
+ // Update parent with new state
+ props.onStateUpdate?.({
+ duration: childRefs[0].current?.duration,
+ timeSeconds: actualTime,
+ isPlaying: isPlaying.current,
+ isSynced: !syncStates.current.includes(true),
+ isStalled,
+ });
+ }, [childRefs]);
+
+ return (
+ <>
+ {React.Children.map(
+ props.children,
+ (child: React.ReactElement, idx: number) => {
+ // If child element has an existing ref, link it
+ // with the one from this component.
+ // @ts-ignore
+ if (child.ref) {
+ // @ts-ignore
+ child.ref.current = childRefs[idx].current;
+ }
+ return React.cloneElement(child, {
+ ref: childRefs[idx],
+ onPlay: () => handlePlayState("play", idx),
+ onPause: () => handlePlayState("pause", idx),
+ });
+ }
+ )}
+ </>
+ );
+});
+
+export default MediaSync;
diff --git a/modules/VideoPlayer/SeekBar.tsx b/modules/VideoPlayer/SeekBar.tsx
new file mode 100644
index 0000000..4109994
--- /dev/null
+++ b/modules/VideoPlayer/SeekBar.tsx
@@ -0,0 +1,88 @@
+import React from "react";
+import { formatSeconds } from "../format";
+
+export type SeekBarProps = {
+ value: number;
+ max: number;
+ buffer?: number;
+ onChange: (value: number) => void;
+ onMouseMove?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
+
+ videoId?: string;
+};
+
+const SeekBar = (props: SeekBarProps) => {
+ const { value, max, onChange } = props;
+ const buffer = props.buffer || 0;
+ const [isScrubbing, setIsScrubbing] = React.useState(false);
+ const [hoverPercentX, setHoverPercentX] = React.useState(0);
+ const [isMouseOver, setIsMouseOver] = React.useState(false);
+
+ const handleMouseMove = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
+ const rect = e.currentTarget.getBoundingClientRect();
+ const percent = Math.min(1, Math.max(0, (e.clientX - rect.x) / rect.width));
+ setHoverPercentX(percent);
+ if (isScrubbing) onChange(percent * max);
+
+ props.onMouseMove?.(e);
+ };
+
+ return (
+ <>
+ <div
+ className="w-full h-4 relative group cursor-pointer"
+ onMouseDown={() => {
+ setIsScrubbing(true);
+ onChange(hoverPercentX * max);
+ }}
+ onMouseUp={() => setIsScrubbing(false)}
+ onMouseMove={handleMouseMove}
+ onMouseEnter={() => setIsMouseOver(true)}
+ onMouseLeave={() => setIsMouseOver(false)}
+ aria-label="Seekbar"
+ aria-valuenow={value}
+ >
+ <div className="absolute bottom-1 w-full pt-4 pb-2 -mb-2">
+ <div className="relative w-full h-0.5 group-hover:h-1 transition-all duration-200">
+ <div className="absolute bg-white opacity-50 h-full w-full" />
+ <div
+ className="absolute bg-white opacity-50 h-full"
+ style={{
+ width: 100 * (buffer / max) + "%",
+ }}
+ />
+ <div
+ className="absolute bg-white opacity-50 h-full"
+ style={{
+ width: 100 * (isMouseOver ? hoverPercentX : 0) + "%",
+ }}
+ />
+ <div
+ className="absolute bg-blue-500 h-full"
+ style={{
+ width: (100 * value) / max + "%",
+ }}
+ />
+ </div>
+ </div>
+ <div
+ className={[
+ "absolute bottom-4 pointer-events-none",
+ "text-center rounded overflow-hidden",
+ ].join(" ")}
+ style={{
+ opacity: isMouseOver ? 1 : 0,
+ left: Math.min(90, Math.max(10, hoverPercentX * 100)) + "%",
+ transform: "translateX(-50%)",
+ }}
+ >
+ <div className="bg-black bg-opacity-75 px-2 py-1 text-center">
+ {formatSeconds(hoverPercentX * max)}
+ </div>
+ </div>
+ </div>
+ </>
+ );
+};
+
+export default SeekBar;
diff --git a/modules/VideoPlayer/VideoPlayer2.tsx b/modules/VideoPlayer/VideoPlayer2.tsx
new file mode 100644
index 0000000..bbc2c68
--- /dev/null
+++ b/modules/VideoPlayer/VideoPlayer2.tsx
@@ -0,0 +1,558 @@
+import React from "react";
+import { formatSeconds } from "../format";
+import { useLocalStorage } from "../hooks/useLocalStorage";
+import {
+ IconCamera,
+ IconClosedCaptioningRegular,
+ IconClosedCaptioningSolid,
+ IconCompress,
+ IconExpand,
+ IconPause,
+ IconPlay,
+ IconVolume,
+ IconVolumeMute,
+} from "../icons";
+import { checkAutoplay } from "../util";
+import LoaderRing from "./components/LoaderRing";
+import SeekBar from "./SeekBar";
+import { CaptionsRenderer } from "react-srv3";
+import MediaSync, { MediaSyncRef, MediaSyncState } from "./MediaSync";
+import { NextImage } from "../NextImage";
+
+type CaptionsTrack = {
+ lang: string;
+ src: string;
+};
+
+export type VideoPlayerProps = {
+ srcVideo: string;
+ srcAudio: string;
+ srcPoster?: string;
+ captions?: CaptionsTrack[];
+ onPlaybackProgress?: (progress: number) => any;
+ autoplay?: boolean;
+ showWatermark?: boolean;
+ videoId?: string;
+};
+
+const VideoPlayer2 = (props: VideoPlayerProps) => {
+ const { srcVideo, srcAudio, srcPoster, videoId, showWatermark } = props;
+ const captions = props.captions || [];
+ const hasCaptions = captions.length > 0;
+ const enCaptionIndex = captions.findIndex(
+ (cap) => cap.lang === "en" || cap.lang.startsWith("en-")
+ );
+
+ const refSelf = React.useRef<HTMLDivElement>(null);
+ const refAudio = React.useRef<HTMLAudioElement>(null);
+ const refVideo = React.useRef<HTMLVideoElement>(null);
+ const refMedia = React.useRef<MediaSyncRef>(null);
+
+ const lastMediaState = React.useRef<MediaSyncState>(null);
+
+ const [bufferProgress, setBufferProgress] = React.useState(0);
+ const [lastActive, setLastActive] = React.useState(Date.now());
+ const [isVideoErrored, setIsVideoErrored] = React.useState(false);
+ const [videoErrorMessage, setVideoErrorMessage] = React.useState("");
+ const [srv3CaptionXMLs, setSrv3CaptionXMLs] = React.useState([]);
+
+ const [audioVolume, setAudioVolume] = useLocalStorage("player:volume", 1);
+ const [isFullscreen, setIsFullscreen] = React.useState(false);
+ const [activeCaption, setActiveCaption] = React.useState(enCaptionIndex);
+
+ const [isDebugVisible, setIsDebugVisible] = React.useState(false);
+ const [isContextVisible, setIsContextVisible] = React.useState(false);
+ const [contextX, setContextX] = React.useState(0);
+ const [contextY, setContextY] = React.useState(0);
+
+ const handleCaptionsButton = () =>
+ setActiveCaption((now) => ((now + 2) % (captions.length + 1)) - 1);
+
+ const handleMuteUnmute = () => setAudioVolume((now) => (now === 0 ? 0.5 : 0));
+
+ const pingActivity = () => {
+ setLastActive(new Date().getTime());
+ };
+
+ const updateBufferLength = () => {
+ if (!refVideo.current || !lastMediaState.current) return;
+
+ let maxVideo = 0;
+ for (let i = 0; i < refVideo.current.buffered.length; i++)
+ maxVideo =
+ refVideo.current.buffered.start(i) <= lastMediaState.current.timeSeconds
+ ? Math.max(maxVideo, refVideo.current.buffered.end(i))
+ : maxVideo;
+
+ setBufferProgress(maxVideo);
+ };
+
+ const [_redraw, _setRedraw] = React.useState(0);
+ const redraw = () => _setRedraw((x) => ++x);
+
+ const handleVideoTimeUpdate = () => {
+ updateBufferLength();
+ props.onPlaybackProgress?.(lastMediaState.current.timeSeconds);
+ redraw();
+ };
+
+ const handlePlayPause = () => {
+ if (!refVideo.current) return;
+ pingActivity();
+
+ if (lastMediaState.current.isPlaying) refMedia.current.pause();
+ else refMedia.current.play();
+ };
+
+ const handleMediaError = (
+ e:
+ | React.SyntheticEvent<HTMLVideoElement, Event>
+ | React.SyntheticEvent<HTMLAudioElement, Event>
+ ) => {
+ const error =
+ // @ts-ignore
+ e.nativeEvent.path?.[0]?.error ||
+ // @ts-ignore
+ e.nativeEvent.originalTarget?.error ||
+ new Error("Unknown error");
+
+ refMedia.current.pause();
+ setIsVideoErrored(true);
+ console.error("Error playing video: ", error.message);
+ console.error(e);
+
+ // Try to find out the error
+ fetch(srcVideo)
+ .then((res) => res.text())
+ .then((text) => {
+ if (text.startsWith("{")) {
+ const json = JSON.parse(text);
+ setVideoErrorMessage(
+ String(
+ json.message || json.error.message || json.error.code || text
+ )
+ );
+ } else setVideoErrorMessage(text);
+ })
+ .catch((e) => console.error(e));
+ };
+
+ const nudgeTime = (delta: number) => {
+ const newTime = Math.max(
+ 0,
+ Math.min(refVideo.current.currentTime + delta, refVideo.current.duration)
+ );
+ refVideo.current.currentTime = newTime;
+ return newTime;
+ };
+
+ /**
+ * Screenshot current video frame and download it
+ */
+ const captureFrame = () => {
+ if (!refVideo.current) return;
+
+ // Create canvas
+ const canvas = document.createElement("canvas");
+ canvas.width = refVideo.current.videoWidth;
+ canvas.height = refVideo.current.videoHeight;
+ const ctx = canvas.getContext("2d");
+
+ // Draw video frame to canvas
+ ctx.drawImage(refVideo.current, 0, 0, canvas.width, canvas.height);
+
+ // Generate URI and download
+ const uri = canvas.toDataURL("image/png");
+ const a = document.createElement("a");
+ a.href = uri;
+ a.download =
+ "Screenshot " +
+ videoId +
+ " " +
+ Math.floor(refVideo.current.currentTime * 1000) +
+ "ms.png";
+ a.click();
+
+ // Clean up
+ canvas.remove();
+ a.remove();
+ };
+
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
+ let handled = true;
+
+ if (e.ctrlKey || e.altKey || e.shiftKey) return false;
+
+ if (e.key === " " || e.key === "k") {
+ handlePlayPause();
+ } else if (e.key === "ArrowRight") {
+ nudgeTime(5);
+ } else if (e.key === "ArrowLeft") {
+ nudgeTime(-5);
+ } else if (e.key === "l") {
+ nudgeTime(10);
+ } else if (e.key === "j") {
+ nudgeTime(-10);
+ } else if (e.key === "ArrowDown") {
+ setAudioVolume((now) => Math.max(now - 0.1, 0));
+ } else if (e.key === "ArrowUp") {
+ setAudioVolume((now) => Math.min(now + 0.1, 1));
+ } else if (e.key === "m") {
+ handleMuteUnmute();
+ } else if (e.key === "f") {
+ handleFullscreen();
+ } else if (e.key === "c") {
+ handleCaptionsButton();
+ } else handled = false;
+
+ if (handled) {
+ pingActivity();
+ e.preventDefault();
+ }
+ };
+
+ const handleContextMenu = (e: React.MouseEvent<HTMLDivElement>) => {
+ e.preventDefault();
+ const playerRect = e.currentTarget.getBoundingClientRect();
+ setContextX(e.clientX - playerRect.left);
+ setContextY(e.clientY - playerRect.top);
+ setIsContextVisible((now) => !now);
+ };
+
+ const handleFullscreen = () => {
+ if (!document.fullscreenElement) {
+ refSelf.current?.requestFullscreen();
+ setIsFullscreen(true);
+ } else {
+ document.exitFullscreen();
+ setIsFullscreen(false);
+ }
+ };
+
+ const handleSeek = (val: number) => {
+ pingActivity();
+ if (refMedia.current) refMedia.current.seek(val);
+ };
+
+ React.useEffect(() => {
+ if (!refVideo.current) return;
+ refAudio.current.volume = audioVolume;
+ }, [audioVolume]);
+
+ React.useEffect(() => {
+ if (props.autoplay) {
+ checkAutoplay().then((can) => {
+ if (can) refMedia.current?.play?.();
+ });
+ }
+ }, []);
+
+ const loadCaptions = async (url: string) => {
+ await fetch(url)
+ .then((res) => res.text())
+ .then((text) =>
+ setSrv3CaptionXMLs((now) => ({ ...now, [activeCaption]: text }))
+ );
+ };
+
+ React.useEffect(() => {
+ if (activeCaption >= 0) loadCaptions(captions[activeCaption].src);
+ }, [activeCaption]);
+
+ const controlsVisible = Date.now() - lastActive < 5000;
+
+ return (
+ <div
+ className={[
+ "video-player bg-black",
+ "focus:outline-none",
+ "w-full h-full",
+ isFullscreen ? "absolute inset-0 flex flex-col justify-center" : "",
+ ].join(" ")}
+ style={{
+ cursor: controlsVisible ? "auto" : "none",
+ }}
+ ref={refSelf}
+ onMouseLeave={() => setLastActive(0)}
+ onMouseMove={pingActivity}
+ onKeyDown={handleKeyDown}
+ onContextMenu={handleContextMenu}
+ onBlur={() => setIsContextVisible(false)}
+ tabIndex={0}
+ >
+ {isDebugVisible && (
+ <div
+ data-debug-window
+ className="bg-black bg-opacity-50 text-white absolute left-2 top-2 z-40 p-4 whitespace-pre font-mono text-sm"
+ >
+ <div className="float-right">
+ <a
+ href="#"
+ onClick={(e) => {
+ e.preventDefault();
+ setIsDebugVisible(false);
+ }}
+ >
+ [x]
+ </a>
+ </div>
+ {JSON.stringify(
+ { ...(lastMediaState.current || {}), activeCaption },
+ null,
+ 2
+ )}
+ </div>
+ )}
+ {isContextVisible && (
+ <>
+ <div
+ className="fixed inset-0 w-full h-full z-40"
+ onClick={() => setIsContextVisible(false)}
+ />
+ <div
+ data-context-menu
+ className="bg-black bg-opacity-50 rounded-lg absolute z-50 overflow-hidden"
+ style={{
+ left: contextX + "px",
+ top: contextY + "px",
+ }}
+ >
+ <div
+ className="cursor-pointer px-6 py-4 hover:bg-black bg-opacity-25"
+ onClick={() => {
+ setIsDebugVisible(true);
+ setIsContextVisible(false);
+ }}
+ >
+ Show debug info
+ </div>
+ </div>
+ </>
+ )}
+ <div className="w-full h-full relative overflow-hidden">
+ {srcPoster && (
+ <NextImage
+ className={
+ bufferProgress > 0 && lastMediaState.current?.timeSeconds > 0
+ ? "opacity-0"
+ : "z-10"
+ }
+ onClick={handlePlayPause}
+ aria-hidden
+ src={srcPoster}
+ layout="fill"
+ />
+ )}
+ <div
+ className={[
+ "absolute inset-0 pointer-events-none z-20 flex flex-col justify-center bg-black",
+ "transition duration-200",
+ isVideoErrored ? "bg-opacity-75" : "bg-opacity-25",
+ lastMediaState.current?.isStalled || isVideoErrored
+ ? "opacity-100"
+ : "opacity-0",
+ ].join(" ")}
+ >
+ {isVideoErrored ? (
+ <div className="text-center">
+ <p>Error playing video</p>
+ <p>{videoErrorMessage}</p>
+ </div>
+ ) : (
+ <LoaderRing />
+ )}
+ </div>
+ <div
+ className="absolute inset-x-0 bottom-0 z-30 px-6 pt-2 transition duration-200"
+ style={{
+ background:
+ "linear-gradient(0deg, rgba(0,0,0,0.7) 0%, transparent 100%)",
+ opacity: controlsVisible ? 1 : 0,
+ }}
+ >
+ {showWatermark && (
+ <div className="text-sm">
+ <a
+ target="_blank"
+ href={"https://archive.ragtag.moe/watch?v=" + videoId}
+ >
+ Hosted on <span className="font-bold">Ragtag Archive</span>
+ </a>
+ </div>
+ )}
+ <SeekBar
+ value={lastMediaState.current?.timeSeconds || 0}
+ max={lastMediaState.current?.duration || 0}
+ buffer={bufferProgress}
+ onChange={handleSeek}
+ onMouseMove={pingActivity}
+ videoId={videoId}
+ />
+ <div className="flex justify-between">
+ <div className="flex items-center">
+ <button
+ type="button"
+ onMouseUp={(e) => {
+ e.preventDefault();
+ handlePlayPause();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ handlePlayPause();
+ }}
+ className="py-3 px-4 focus:outline-none focus:bg-white focus:bg-opacity-25 rounded transition duration-200"
+ aria-label="Play/Pause button"
+ >
+ {lastMediaState.current?.isPlaying ? (
+ <IconPlay width="1em" height="1em" />
+ ) : (
+ <IconPause width="1em" height="1em" />
+ )}
+ </button>
+
+ <div className="hidden md:flex group">
+ <button
+ type="button"
+ onClick={handleMuteUnmute}
+ className="py-3 px-4 focus:outline-none focus:bg-white focus:bg-opacity-25 rounded transition duration-200"
+ aria-label="Mute/Unmute button"
+ >
+ {audioVolume === 0 ? (
+ <IconVolumeMute width="1em" height="1em" />
+ ) : (
+ <IconVolume width="1em" height="1em" />
+ )}
+ </button>
+
+ <div
+ className="
+ flex
+ h-12 w-0 group-hover:w-16
+ overflow-hidden
+ transition-all duration-200
+ "
+ >
+ <input
+ type="range"
+ className="slider w-16"
+ aria-label="Volume slider"
+ value={audioVolume}
+ min={0}
+ max={1}
+ step={0.01}
+ onChange={(e) => {
+ setAudioVolume(Number(e.target.value));
+ pingActivity();
+ }}
+ />
+ </div>
+ </div>
+
+ <p className="ml-4">
+ {formatSeconds(lastMediaState.current?.timeSeconds || 0)} /{" "}
+ {formatSeconds(lastMediaState.current?.duration || 0)}
+ </p>
+ </div>
+ <div>
+ {hasCaptions && (
+ <button
+ type="button"
+ aria-label="Toggle captions button"
+ onClick={handleCaptionsButton}
+ className="py-3 px-4 focus:outline-none focus:bg-white focus:bg-opacity-25 rounded transition duration-200"
+ >
+ {activeCaption === -1 ? (
+ <IconClosedCaptioningRegular
+ width="1em"
+ height="1em"
+ className="inline-block mr-2"
+ />
+ ) : (
+ <IconClosedCaptioningSolid
+ width="1em"
+ height="1em"
+ className="inline-block mr-2"
+ />
+ )}
+ <span className="leading-none">
+ {captions?.[activeCaption]?.lang || "off"}
+ </span>
+ </button>
+ )}
+ <button
+ type="button"
+ aria-label="Screenshot current video frame"
+ onClick={captureFrame}
+ className="hidden md:inline-block py-3 px-4 focus:outline-none focus:bg-white focus:bg-opacity-25 rounded transition duration-200"
+ >
+ <IconCamera width="1em" height="1em" />
+ </button>
+ <button
+ type="button"
+ aria-label="Toggle fullscreen button"
+ onClick={handleFullscreen}
+ className="py-3 px-4 focus:outline-none focus:bg-white focus:bg-opacity-25 rounded transition duration-200"
+ >
+ {isFullscreen ? (
+ <IconCompress width="1em" height="1em" />
+ ) : (
+ <IconExpand width="1em" height="1em" />
+ )}
+ </button>
+ </div>
+ </div>
+ </div>
+ {activeCaption > -1 && srv3CaptionXMLs[activeCaption] && (
+ <div
+ className={
+ "w-full h-full absolute z-10 pointer-events-none " +
+ (controlsVisible ? "controls-visible" : "")
+ }
+ >
+ <CaptionsRenderer
+ srv3={srv3CaptionXMLs[activeCaption]}
+ currentTime={lastMediaState.current?.timeSeconds || 0}
+ />
+ </div>
+ )}
+ <MediaSync
+ ref={refMedia}
+ onStateUpdate={(newState) => {
+ lastMediaState.current = newState;
+ if (activeCaption > -1) redraw();
+ }}
+ >
+ <video
+ ref={refVideo}
+ src={srcVideo}
+ className="w-full h-full absolute"
+ preload="auto"
+ crossOrigin="anonymous"
+ onMouseUp={(e) => {
+ e.preventDefault();
+ if (e.button === 0) handlePlayPause();
+ }}
+ onTouchEnd={(e) => {
+ e.preventDefault();
+ if (controlsVisible) handlePlayPause();
+ else pingActivity();
+ }}
+ onError={handleMediaError}
+ onTimeUpdate={handleVideoTimeUpdate}
+ playsInline
+ muted
+ />
+ <audio
+ preload="auto"
+ crossOrigin="anonymous"
+ ref={refAudio}
+ src={srcAudio}
+ onError={handleMediaError}
+ />
+ </MediaSync>
+ </div>
+ </div>
+ );
+};
+
+export default VideoPlayer2;
diff --git a/modules/VideoPlayer/components/LoaderRing.tsx b/modules/VideoPlayer/components/LoaderRing.tsx
new file mode 100644
index 0000000..6393166
--- /dev/null
+++ b/modules/VideoPlayer/components/LoaderRing.tsx
@@ -0,0 +1,10 @@
+const LoaderRing = (props: any) => (
+ <div className="lds-ring mx-auto" {...props}>
+ <div />
+ <div />
+ <div />
+ <div />
+ </div>
+);
+
+export default LoaderRing;
diff --git a/modules/database.d.ts b/modules/database.d.ts
new file mode 100644
index 0000000..fb19a39
--- /dev/null
+++ b/modules/database.d.ts
@@ -0,0 +1,170 @@
+/**
+ * Video data
+ */
+
+export type VideoFile = {
+ name: string;
+ size: number;
+ url?: string;
+};
+
+export type VideoMetadata = {
+ video_id: string;
+ channel_name: string;
+ channel_id: string;
+ upload_date: string;
+ title: string;
+ description: string;
+ duration: number;
+ width: number;
+ height: number;
+ fps: number;
+ format_id: string;
+ view_count: number;
+ like_count: number;
+ dislike_count: number;
+ archived_timestamp: string;
+ files: VideoFile[];
+ drive_base: string;
+ timestamps?: {
+ actualStartTime?: string;
+ publishedAt?: string;
+ scheduledStartTime?: string;
+ actualEndTime?: string;
+ discoveredUnavailable?: string;
+ };
+};
+
+export type ElasticSearchDocument<T> = {
+ _index: string;
+ _type: string;
+ _id: string;
+ _score: string;
+ _source: T;
+};
+
+export type ElasticSearchResult<T> = {
+ took: number;
+ timed_out: boolean;
+ _shards: {
+ total: number;
+ successful: number;
+ skipped: number;
+ failed: number;
+ };
+ hits: {
+ total: {
+ value: number;
+ relation: "eq" | "gt" | "lt";
+ };
+ max_score: number;
+ hits: Array<ElasticSearchDocument<T>>;
+ };
+};
+
+/**
+ * Chat replay
+ */
+
+type ChatMessageEmoteImage = {
+ url: string;
+ id: string;
+ width?: number;
+ height?: number;
+};
+
+type ChatMessageEmote = {
+ id: string;
+ name: string;
+ shortcuts: string[];
+ search_terms: string[];
+ images: ChatMessageEmoteImage[];
+ is_custom_emoji: boolean;
+};
+
+type ChatMessageBase = {
+ time_in_seconds: number;
+ action_type: "add_chat_item" | "add_live_chat_ticker_item" | string;
+ message_id: string;
+ timestamp: number;
+ time_text: string;
+ message: string;
+ emotes?: ChatMessageEmote[];
+};
+
+type ChatMessageImage = {
+ url: string;
+ id: string;
+ width?: number;
+ height?: number;
+};
+
+type ChatMessageAuthorBadge = {
+ title: string;
+ icons: ChatMessageImage[];
+};
+
+type ChatMessageAuthor = {
+ name: string;
+ id: string;
+ images: ChatMessageImage[];
+ badges?: ChatMessageAuthorBadge[];
+};
+
+type ChatMessageMoney = {
+ text: string;
+ amount: number;
+ currency: string;
+ currency_symbol: string;
+};
+
+type ChatViewerEngagementMessage = ChatMessageBase & {
+ icon: "YOUTUBE_ROUND";
+ message_type: "viewer_engagement_message";
+};
+
+type ChatTextMessage = ChatMessageBase & {
+ message_type: "text_message";
+ author: ChatMessageAuthor;
+};
+
+type ChatMembershipItem = ChatMessageBase & {
+ message_type: "membership_item";
+ author: ChatMessageAuthor;
+};
+
+type ChatPaidMessage = ChatMessageBase & {
+ message_type: "paid_message";
+ author: ChatMessageAuthor & {
+ name_text_colour?: string;
+ };
+ money: ChatMessageMoney;
+ timestamp_colour: string;
+ body_background_colour: string;
+ header_text_colour: string;
+ header_background_colour: string;
+ body_text_colour: string;
+};
+
+export type ChatMessage =
+ | ChatViewerEngagementMessage
+ | ChatTextMessage
+ | ChatMembershipItem
+ | ChatPaidMessage;
+
+export const ChatMessageTypes = [
+ "paid_message",
+ "membership_item",
+ "text_message",
+ "viewer_engagement_message",
+] as const;
+export type ChatMessageType = typeof ChatMessageTypes[number];
+
+/**
+ * Search logs
+ */
+
+export type ElasticSearchLog = {
+ timestamp: string;
+ query: string;
+};
diff --git a/modules/format.ts b/modules/format.ts
new file mode 100644
index 0000000..47feee1
--- /dev/null
+++ b/modules/format.ts
@@ -0,0 +1,24 @@
+import prettyBytes from "pretty-bytes";
+
+export const formatSeconds = (seconds: number) => {
+ const h = Math.floor(seconds / 3600);
+ const m = Math.floor((seconds % 3600) / 60);
+ const s = Math.floor((seconds % 3600) % 60);
+
+ const mmss =
+ m.toString().padStart(2, "0") + ":" + s.toString().padStart(2, "0");
+ if (h > 0) return h + ":" + mmss;
+ return mmss;
+};
+
+export const formatNumber = (num: number) =>
+ Intl.NumberFormat("en-US").format(num);
+
+export const formatDate = (date: Date) =>
+ Intl.DateTimeFormat("en", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ }).format(date);
+
+export const formatBytes = (bytes: number) => prettyBytes(bytes);
diff --git a/modules/hooks/useAnimationFrame.tsx b/modules/hooks/useAnimationFrame.tsx
new file mode 100644
index 0000000..ce7f8f6
--- /dev/null
+++ b/modules/hooks/useAnimationFrame.tsx
@@ -0,0 +1,30 @@
+import React from "react";
+
+/**
+ * React hook to request animation frame
+ *
+ * Taken from https://css-tricks.com/using-requestanimationframe-with-react-hooks/
+ */
+export const useAnimationFrame = (
+ callback: (deltaTime: number) => void,
+ dependencies: any[] = []
+) => {
+ // Use useRef for mutable variables that we want to persist
+ // without triggering a re-render on their change
+ const requestRef = React.useRef(0);
+ const previousTimeRef = React.useRef(0);
+
+ const animate = (time: number) => {
+ if (previousTimeRef.current != undefined) {
+ const deltaTime = time - previousTimeRef.current;
+ callback(deltaTime);
+ }
+ previousTimeRef.current = time;
+ requestRef.current = requestAnimationFrame(animate);
+ };
+
+ React.useEffect(() => {
+ requestRef.current = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(requestRef.current);
+ }, dependencies);
+};
diff --git a/modules/hooks/useDebounce.tsx b/modules/hooks/useDebounce.tsx
new file mode 100644
index 0000000..6864217
--- /dev/null
+++ b/modules/hooks/useDebounce.tsx
@@ -0,0 +1,25 @@
+import React from "react";
+
+export function useDebounce(value: any, delay: number) {
+ // State and setters for debounced value
+ const [debouncedValue, setDebouncedValue] = React.useState(value);
+
+ React.useEffect(
+ () => {
+ // Update debounced value after delay
+ const handler = setTimeout(() => {
+ setDebouncedValue(value);
+ }, delay);
+
+ // Cancel the timeout if value changes (also on delay change or unmount)
+ // This is how we prevent debounced value from updating if value is changed ...
+ // .. within the delay period. Timeout gets cleared and restarted.
+ return () => {
+ clearTimeout(handler);
+ };
+ },
+ [value, delay] // Only re-call effect if value or delay changes
+ );
+
+ return debouncedValue;
+}
diff --git a/modules/hooks/useLocalStorage.tsx b/modules/hooks/useLocalStorage.tsx
new file mode 100644
index 0000000..60bd037
--- /dev/null
+++ b/modules/hooks/useLocalStorage.tsx
@@ -0,0 +1,48 @@
+import React from "react";
+
+/**
+ * https://usehooks.com/useLocalStorage/
+ */
+export function useLocalStorage<T>(
+ key: string,
+ initialValue: T
+): [T, (value: T | ((val: T) => T)) => void] {
+ // State to store our value
+ // Pass initial state function to useState so logic is only executed once
+ const [storedValue, setStoredValue] = React.useState<T>(() => {
+ // try {
+ // // Get from local storage by key
+ // const item = window.localStorage.getItem(key);
+ // // Parse stored json or if none return initialValue
+ // return item ? JSON.parse(item) : initialValue;
+ // } catch (error) {
+ // If error also return initialValue
+ return initialValue;
+ // }
+ });
+
+ React.useEffect(() => {
+ // Get from local storage by key
+ const item = window.localStorage.getItem(key);
+ // Parse stored json or if none return initialValue
+ if (item) setStoredValue(JSON.parse(item));
+ }, []);
+
+ // Return a wrapped version of useState's setter function that ...
+ // ... persists the new value to localStorage.
+ const setValue = (value: T | ((val: T) => T)) => {
+ try {
+ // Allow value to be a function so we have same API as useState
+ const valueToStore =
+ value instanceof Function ? value(storedValue) : value;
+
+ // Save state
+ setStoredValue(valueToStore);
+
+ // Save to local storage
+ window.localStorage.setItem(key, JSON.stringify(valueToStore));
+ } catch (error) {}
+ };
+
+ return [storedValue, setValue];
+}
diff --git a/modules/hooks/useThrottle.tsx b/modules/hooks/useThrottle.tsx
new file mode 100644
index 0000000..77c9731
--- /dev/null
+++ b/modules/hooks/useThrottle.tsx
@@ -0,0 +1,24 @@
+/**
+ * https://github.com/bhaskarGyan/use-throttle/blob/master/src/index.js
+ */
+import { useState, useEffect, useRef } from "react";
+
+export const useThrottle = (value, limit) => {
+ const [throttledValue, setThrottledValue] = useState(value);
+ const lastRan = useRef(Date.now());
+
+ useEffect(() => {
+ const handler = setTimeout(function () {
+ if (Date.now() - lastRan.current >= limit) {
+ setThrottledValue(value);
+ lastRan.current = Date.now();
+ }
+ }, limit - (Date.now() - lastRan.current));
+
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [value, limit]);
+
+ return throttledValue;
+};
diff --git a/modules/hooks/useWindowSize.tsx b/modules/hooks/useWindowSize.tsx
new file mode 100644
index 0000000..0b72c9e
--- /dev/null
+++ b/modules/hooks/useWindowSize.tsx
@@ -0,0 +1,19 @@
+import React from "react";
+
+export const useWindowSize = () => {
+ const [innerWidth, setInnerWidth] = React.useState(null);
+ const [innerHeight, setInnerHeight] = React.useState(null);
+
+ const handleResize = () => {
+ setInnerWidth(window.innerWidth);
+ setInnerHeight(window.innerHeight);
+ };
+
+ React.useEffect(() => {
+ handleResize();
+ window.addEventListener("resize", handleResize);
+ return () => window.removeEventListener("resize", handleResize);
+ }, []);
+
+ return { innerWidth, innerHeight };
+};
diff --git a/modules/icons.tsx b/modules/icons.tsx
new file mode 100644
index 0000000..7f6ff1d
--- /dev/null
+++ b/modules/icons.tsx
@@ -0,0 +1,219 @@
+export const IconBars = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"
+ />
+ </svg>
+);
+
+export const IconDownload = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"
+ />
+ </svg>
+);
+
+export const IconYouTube = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"
+ />
+ </svg>
+);
+
+export const IconTV = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M592 0H48A48 48 0 0 0 0 48v320a48 48 0 0 0 48 48h240v32H112a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H352v-32h240a48 48 0 0 0 48-48V48a48 48 0 0 0-48-48zm-16 352H64V64h512z"
+ />
+ </svg>
+);
+
+export const IconFileImport = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M16 288c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h112v-64zm489-183L407.1 7c-4.5-4.5-10.6-7-17-7H384v128h128v-6.1c0-6.3-2.5-12.4-7-16.9zm-153 31V0H152c-13.3 0-24 10.7-24 24v264h128v-65.2c0-14.3 17.3-21.4 27.4-11.3L379 308c6.6 6.7 6.6 17.4 0 24l-95.7 96.4c-10.1 10.1-27.4 3-27.4-11.3V352H128v136c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H376c-13.2 0-24-10.8-24-24z"
+ />
+ </svg>
+);
+
+export const IconInfoCircle = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"
+ />
+ </svg>
+);
+
+export const IconFileCode = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zM123.206 400.505a5.4 5.4 0 0 1-7.633.246l-64.866-60.812a5.4 5.4 0 0 1 0-7.879l64.866-60.812a5.4 5.4 0 0 1 7.633.246l19.579 20.885a5.4 5.4 0 0 1-.372 7.747L101.65 336l40.763 35.874a5.4 5.4 0 0 1 .372 7.747l-19.579 20.884zm51.295 50.479l-27.453-7.97a5.402 5.402 0 0 1-3.681-6.692l61.44-211.626a5.402 5.402 0 0 1 6.692-3.681l27.452 7.97a5.4 5.4 0 0 1 3.68 6.692l-61.44 211.626a5.397 5.397 0 0 1-6.69 3.681zm160.792-111.045l-64.866 60.812a5.4 5.4 0 0 1-7.633-.246l-19.58-20.885a5.4 5.4 0 0 1 .372-7.747L284.35 336l-40.763-35.874a5.4 5.4 0 0 1-.372-7.747l19.58-20.885a5.4 5.4 0 0 1 7.633-.246l64.866 60.812a5.4 5.4 0 0 1-.001 7.879z"
+ />
+ </svg>
+);
+
+export const IconPlay = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M144 479H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h96c26.5 0 48 21.5 48 48v352c0 26.5-21.5 48-48 48zm304-48V79c0-26.5-21.5-48-48-48h-96c-26.5 0-48 21.5-48 48v352c0 26.5 21.5 48 48 48h96c26.5 0 48-21.5 48-48z"
+ />
+ </svg>
+);
+
+export const IconPause = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z"
+ />
+ </svg>
+);
+
+export const IconVolume = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zM480 256c0-63.53-32.06-121.94-85.77-156.24-11.19-7.14-26.03-3.82-33.12 7.46s-3.78 26.21 7.41 33.36C408.27 165.97 432 209.11 432 256s-23.73 90.03-63.48 115.42c-11.19 7.14-14.5 22.07-7.41 33.36 6.51 10.36 21.12 15.14 33.12 7.46C447.94 377.94 480 319.53 480 256zm-141.77-76.87c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 228.28 336 241.63 336 256c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.86z"
+ />
+ </svg>
+);
+
+export const IconVolumeMute = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zM461.64 256l45.64-45.64c6.3-6.3 6.3-16.52 0-22.82l-22.82-22.82c-6.3-6.3-16.52-6.3-22.82 0L416 210.36l-45.64-45.64c-6.3-6.3-16.52-6.3-22.82 0l-22.82 22.82c-6.3 6.3-6.3 16.52 0 22.82L370.36 256l-45.63 45.63c-6.3 6.3-6.3 16.52 0 22.82l22.82 22.82c6.3 6.3 16.52 6.3 22.82 0L416 301.64l45.64 45.64c6.3 6.3 16.52 6.3 22.82 0l22.82-22.82c6.3-6.3 6.3-16.52 0-22.82L461.64 256z"
+ />
+ </svg>
+);
+
+export const IconClosedCaptioningSolid = (
+ props: React.SVGProps<SVGSVGElement>
+) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM218.1 287.7c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2.1 48 51.1 70.5 92.3 32.6zm190.4 0c2.8-2.5 7.1-2.1 9.2.9l19.5 27.7c1.7 2.4 1.5 5.6-.5 7.7-53.5 56.9-172.7 32.1-172.7-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 222.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6z"
+ />
+ </svg>
+);
+
+export const IconClosedCaptioningRegular = (
+ props: React.SVGProps<SVGSVGElement>
+) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z"
+ />
+ </svg>
+);
+
+export const IconExpand = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z"
+ />
+ </svg>
+);
+
+export const IconCompress = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24zm0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z"
+ />
+ </svg>
+);
+
+export const IconTachometerAlt = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M288 32C128.94 32 0 160.94 0 320c0 52.8 14.25 102.26 39.06 144.8 5.61 9.62 16.3 15.2 27.44 15.2h443c11.14 0 21.83-5.58 27.44-15.2C561.75 422.26 576 372.8 576 320c0-159.06-128.94-288-288-288zm0 64c14.71 0 26.58 10.13 30.32 23.65-1.11 2.26-2.64 4.23-3.45 6.67l-9.22 27.67c-5.13 3.49-10.97 6.01-17.64 6.01-17.67 0-32-14.33-32-32S270.33 96 288 96zM96 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm48-160c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm246.77-72.41l-61.33 184C343.13 347.33 352 364.54 352 384c0 11.72-3.38 22.55-8.88 32H232.88c-5.5-9.45-8.88-20.28-8.88-32 0-33.94 26.5-61.43 59.9-63.59l61.34-184.01c4.17-12.56 17.73-19.45 30.36-15.17 12.57 4.19 19.35 17.79 15.17 30.36zm14.66 57.2l15.52-46.55c3.47-1.29 7.13-2.23 11.05-2.23 17.67 0 32 14.33 32 32s-14.33 32-32 32c-11.38-.01-20.89-6.28-26.57-15.22zM480 384c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z"
+ />
+ </svg>
+);
+
+export const IconExclamationCirlce = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"
+ />
+ </svg>
+);
+
+export const IconEllipsisV = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M96 184c39.8 0 72 32.2 72 72s-32.2 72-72 72-72-32.2-72-72 32.2-72 72-72zM24 80c0 39.8 32.2 72 72 72s72-32.2 72-72S135.8 8 96 8 24 40.2 24 80zm0 352c0 39.8 32.2 72 72 72s72-32.2 72-72-32.2-72-72-72-72 32.2-72 72z"
+ />
+ </svg>
+);
+
+export const IconPlayCircle = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z"
+ />
+ </svg>
+);
+
+export const IconCheck = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"
+ />
+ </svg>
+);
+
+export const IconChevronDown = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z"
+ />
+ </svg>
+);
+
+export const IconChartBar = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M332.8 320h38.4c6.4 0 12.8-6.4 12.8-12.8V172.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V76.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-288 0h38.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h38.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-38.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zM496 384H64V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z"
+ />
+ </svg>
+);
+
+export const IconCamera = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M512 144v288c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V144c0-26.5 21.5-48 48-48h88l12.3-32.9c7-18.7 24.9-31.1 44.9-31.1h125.5c20 0 37.9 12.4 44.9 31.1L376 96h88c26.5 0 48 21.5 48 48zM376 288c0-66.2-53.8-120-120-120s-120 53.8-120 120 53.8 120 120 120 120-53.8 120-120zm-32 0c0 48.5-39.5 88-88 88s-88-39.5-88-88 39.5-88 88-88 88 39.5 88 88z"
+ />
+ </svg>
+);
+
+export const IconFilter = (props: React.SVGProps<SVGSVGElement>) => (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" {...props}>
+ <path
+ fill="currentColor"
+ d="M487.976 0H24.028C2.71 0-8.047 25.866 7.058 40.971L192 225.941V432c0 7.831 3.821 15.17 10.237 19.662l80 55.98C298.02 518.69 320 507.493 320 487.98V225.941l184.947-184.97C520.021 25.896 509.338 0 487.976 0z"
+ />
+ </svg>
+);
diff --git a/modules/shared/DefaultHead.tsx b/modules/shared/DefaultHead.tsx
new file mode 100644
index 0000000..55744d9
--- /dev/null
+++ b/modules/shared/DefaultHead.tsx
@@ -0,0 +1,39 @@
+import React from "react";
+import Head from "next/head";
+
+const K_SITE_NAME = "Ragtag Archive";
+const K_SITE_DESCRIPTION = "Preserving culture, one stream at a time";
+
+type DefaultHeadProps = {
+ title?: string;
+};
+
+const DefaultHead = (props: DefaultHeadProps) => (
+ <Head>
+ <title>
+ {props.title ? props.title + " - " : ""}
+ {K_SITE_NAME}
+ </title>
+ <meta name="title" content={K_SITE_NAME} />
+ <meta name="description" content={K_SITE_DESCRIPTION} />
+ <meta property="og:type" content="website" />
+ <meta property="og:url" content="https://archive.ragtag.moe/" />
+ <meta property="og:title" content={K_SITE_NAME} />
+ <meta
+ property="og:image"
+ content="https://archive.ragtag.moe/favicon.png"
+ />
+ <meta property="og:description" content={K_SITE_DESCRIPTION} />
+ <meta property="twitter:card" content="summary" />
+ <meta property="twitter:url" content="https://archive.ragtag.moe/" />
+ <meta property="twitter:title" content={K_SITE_NAME} />
+ <meta
+ property="twitter:image"
+ content="https://archive.ragtag.moe/favicon.png"
+ />
+ <meta property="twitter:description" content={K_SITE_DESCRIPTION} />
+ <meta property="twitter:creator" content="@kitsune_cw" />
+ </Head>
+);
+
+export default DefaultHead;
diff --git a/modules/util.ts b/modules/util.ts
new file mode 100644
index 0000000..90fff88
--- /dev/null
+++ b/modules/util.ts
@@ -0,0 +1,25 @@
+export const checkAutoplay = (): Promise<boolean> =>
+ new Promise((resolve) => {
+ try {
+ const audio = new Audio();
+ audio.autoplay = true;
+ audio.addEventListener("play", () => resolve(true));
+ audio.addEventListener("error", () => resolve(false));
+ audio.src =
+ "data:audio/mpeg;base64,/+MYxAAAAANIAUAAAASEEB/jwOFM/0MM/90b/+RhST//w4NFwOjf///PZu////9lns5GFDv//l9GlUIEEIAAAgIg8Ir/JGq3/+MYxDsLIj5QMYcoAP0dv9HIjUcH//yYSg+CIbkGP//8w0bLVjUP///3Z0x5QCAv/yLjwtGKTEFNRTMuOTeqqqqqqqqqqqqq/+MYxEkNmdJkUYc4AKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
+ setTimeout(() => resolve(false), 5000);
+ } catch (e) {
+ resolve(false);
+ }
+ });
+
+export const proxyYT3 = (url: string): string => {
+ try {
+ const u = new URL(url);
+ if (u.hostname !== "yt3.ggpht.com") return url;
+ u.hostname = "archive-yt3-ggpht-proxy.ragtag.moe";
+ return u.toString();
+ } catch (ex) {
+ return "";
+ }
+};
diff --git a/next-env.d.ts b/next-env.d.ts
new file mode 100644
index 0000000..9bc3dd4
--- /dev/null
+++ b/next-env.d.ts
@@ -0,0 +1,6 @@
+/// <reference types="next" />
+/// <reference types="next/types/global" />
+/// <reference types="next/image-types/global" />
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 0000000..6bbd486
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ images: {
+ domains: [],
+ deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+ },
+};
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..eff6ede
--- /dev/null
+++ b/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "archive-browser",
+ "version": "0.1.0",
+ "license": "",
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "@tailwindcss/typography": "^0.4.1",
+ "axios": "^1.2.1",
+ "next": "12.0.3",
+ "pretty-bytes": "^6.0.0",
+ "react": "17.0.2",
+ "react-dom": "17.0.2",
+ "react-srv3": "^1.0.3",
+ "timeago.js": "^4.0.2"
+ },
+ "devDependencies": {
+ "@tailwindcss/ui": "^0.7.2",
+ "@types/node": "^16.11.7",
+ "@types/react": "^17.0.34",
+ "@types/react-dom": "^17.0.11",
+ "postcss": "^8.3.11",
+ "postcss-preset-env": "^6.7.0",
+ "prettier": "^2.4.1",
+ "tailwindcss": "^2.2.19",
+ "typescript": "^4.4.4"
+ }
+}
diff --git a/pages/404.tsx b/pages/404.tsx
new file mode 100644
index 0000000..93eabab
--- /dev/null
+++ b/pages/404.tsx
@@ -0,0 +1,21 @@
+import React from "react";
+import Head from "next/head";
+import PageBase from "../modules/PageBase";
+
+const NotFoundPage = () => {
+ return (
+ <PageBase>
+ <Head>
+ <title>404 - Ragtag Archive</title>
+ </Head>
+ <div>
+ <div className="px-4">
+ <h1 className="text-3xl mt-16 text-center">404</h1>
+ <p className="text-lg text-center mb-16">Page not found</p>
+ </div>
+ </div>
+ </PageBase>
+ );
+};
+
+export default NotFoundPage;
diff --git a/pages/_app.tsx b/pages/_app.tsx
new file mode 100644
index 0000000..27c48fc
--- /dev/null
+++ b/pages/_app.tsx
@@ -0,0 +1,10 @@
+import "../styles/tailwind.css";
+import "../styles/player.css";
+
+function MyApp({ Component, pageProps }) {
+ return (
+ <Component {...pageProps} />
+ );
+}
+
+export default MyApp;
diff --git a/pages/index.tsx b/pages/index.tsx
new file mode 100644
index 0000000..316e16a
--- /dev/null
+++ b/pages/index.tsx
@@ -0,0 +1,185 @@
+import React from "react";
+import Head from "next/head";
+import ChatReplayPanel from "../modules/ChatReplay/ChatReplayPanel";
+import { useWindowSize } from "../modules/hooks/useWindowSize";
+import PageBase from "../modules/PageBase";
+import VideoPlayer2 from "../modules/VideoPlayer/VideoPlayer2";
+import { buttonStyle } from "../modules/VideoActionButtons";
+import { IconCheck } from "../modules/icons";
+
+const CustomPlayerPage = () => {
+ const [isChatVisible, setIsChatVisible] = React.useState(false);
+ const { innerWidth, innerHeight } = useWindowSize();
+ const [playbackProgress, setPlaybackProgress] = React.useState(0);
+ const [urlVideo, setUrlVideo] = React.useState("");
+ const [urlChat, setUrlChat] = React.useState("");
+ const [urlYtt, setUrlYtt] = React.useState("");
+ const [showPlayer, setShowPlayer] = React.useState(false);
+
+ const handleFile = (
+ e: React.ChangeEvent<HTMLInputElement>,
+ setter: (newValue: string) => any
+ ) => {
+ const file = e.target.files?.[0];
+ if (!file) {
+ console.error("No file selected");
+ return false;
+ }
+ const url = URL.createObjectURL(file).toString();
+ console.log(url);
+ setter(url);
+ };
+
+ return (
+ <PageBase>
+ <Head>
+ <title>Custom Player - Ragtag Archive</title>
+ </Head>
+ {showPlayer ? (
+ <div>
+ <div
+ className={["flex lg:flex-row flex-col lg:h-auto"].join(" ")}
+ style={{
+ height: isChatVisible && innerWidth < 640 ? innerHeight : "auto",
+ }}
+ >
+ <div className="w-full lg:w-3/4">
+ <div
+ className="relative bg-gray-400 w-full h-0"
+ style={{ paddingBottom: "56.25%" }}
+ >
+ <div className="absolute inset-0 w-full h-full">
+ <VideoPlayer2
+ key={urlVideo}
+ videoId="custom"
+ srcVideo={urlVideo}
+ srcAudio={urlVideo}
+ captions={
+ urlYtt
+ ? [
+ {
+ lang: "en",
+ src: urlYtt,
+ },
+ ]
+ : undefined
+ }
+ onPlaybackProgress={setPlaybackProgress}
+ />
+ </div>
+ </div>
+ </div>
+ <div
+ className={[
+ "w-full lg:w-1/4 lg:pl-4",
+ isChatVisible ? "flex-1" : "",
+ ].join(" ")}
+ >
+ {!urlChat ? (
+ <div className="border border-gray-800 rounded p-4 text-center">
+ <p>Chat replay unavailable</p>
+ </div>
+ ) : (
+ <ChatReplayPanel
+ src={urlChat}
+ currentTimeSeconds={playbackProgress}
+ onChatToggle={setIsChatVisible}
+ />
+ )}
+ </div>
+ </div>
+ <button
+ type="button"
+ className={[buttonStyle, "mt-4"].join(" ")}
+ onClick={() => setShowPlayer(false)}
+ >
+ Go back
+ </button>
+ </div>
+ ) : (
+ <div>
+ <div className="px-4 pb-8">
+ <h1 className="text-3xl mt-16 text-center">Custom Video Player</h1>
+ <p className="text-lg text-center">
+ You can play locally-saved video files and chat replay JSON
+ </p>
+ <p className="text-center">
+ Chat replay compatible with output from{" "}
+ <a
+ className="underline"
+ href="https://github.com/yt-dlp/yt-dlp"
+ target="_blank"
+ rel="noreferrer noopener nofollow"
+ >
+ yt-dlp
+ </a>
+ {" and "}
+ <a
+ className="underline"
+ href="https://pypi.org/project/chat-downloader/"
+ target="_blank"
+ rel="noreferrer noopener nofollow"
+ >
+ chat-downloader
+ </a>
+ .
+ </p>
+ </div>
+ <div className="mx-auto max-w-md">
+ <form>
+ <label
+ className={[buttonStyle, "relative cursor-pointer"].join(" ")}
+ >
+ <span>Select video</span>
+ <span className="ml-auto">
+ {urlVideo ? <IconCheck width="1em" height="1em" /> : null}
+ </span>
+ <input
+ type="file"
+ className="hidden"
+ onChange={(e) => handleFile(e, setUrlVideo)}
+ />
+ </label>
+ <label
+ className={[buttonStyle, "relative cursor-pointer"].join(" ")}
+ >
+ <span>Select chat json</span>
+ <span className="ml-auto">
+ {urlChat ? <IconCheck width="1em" height="1em" /> : null}
+ </span>
+ <input
+ type="file"
+ className="hidden"
+ onChange={(e) => handleFile(e, setUrlChat)}
+ />
+ </label>
+ <label
+ className={[buttonStyle, "relative cursor-pointer"].join(" ")}
+ >
+ <span>Select captions (srv3)</span>
+ <span className="ml-auto">
+ {urlYtt ? <IconCheck width="1em" height="1em" /> : null}
+ </span>
+ <input
+ type="file"
+ className="hidden"
+ onChange={(e) => handleFile(e, setUrlYtt)}
+ />
+ </label>
+
+ <button
+ type="button"
+ className={[buttonStyle, "mt-8 ml-auto"].join(" ")}
+ onClick={() => setShowPlayer(true)}
+ >
+ Launch player
+ </button>
+ </form>
+ </div>
+ </div>
+ )}
+ </PageBase>
+ );
+};
+
+export default CustomPlayerPage;
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..fe2b021
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ plugins: ['tailwindcss', 'postcss-preset-env'],
+} \ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..2d9f690
--- /dev/null
+++ b/public/favicon.ico
Binary files differ
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 0000000..45f99cf
--- /dev/null
+++ b/public/favicon.png
Binary files differ
diff --git a/styles/player.css b/styles/player.css
new file mode 100644
index 0000000..88c1957
--- /dev/null
+++ b/styles/player.css
@@ -0,0 +1,137 @@
+.seekbar {
+ -webkit-appearance: none;
+ appearance: none;
+ outline: none;
+ transition: 0.2s;
+ background: transparent;
+}
+
+.seekbar:hover {
+ cursor: pointer;
+}
+
+/*
+ * The styles have to be separated
+ * https://stackoverflow.com/a/42130838
+ */
+.seekbar::-webkit-slider-thumb {
+ opacity: 0;
+}
+.seekbar::-moz-range-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ opacity: 0;
+}
+
+.seekbar::-webkit-slider-runnable-track {
+ background: transparent;
+ height: 15px;
+ cursor: pointer;
+}
+
+.slider {
+ -webkit-appearance: none;
+ appearance: none;
+ background: transparent;
+ cursor: pointer;
+ position: relative;
+}
+.slider:focus {
+ outline: none;
+}
+.slider::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ background: #fff;
+ width: 10px;
+ height: 10px;
+ margin-top: -5px;
+ border-radius: 10px;
+}
+.slider::-moz-range-thumb {
+ -webkit-appearance: none;
+ appearance: none;
+ background: #fff;
+ width: 10px;
+ height: 10px;
+ margin-top: -2.5px;
+ border-radius: 10px;
+ border: 0;
+}
+.slider::-webkit-slider-runnable-track {
+ background: transparent;
+ height: 0;
+ padding: 12px 0;
+}
+.slider::-moz-range-track {
+ background: transparent;
+ height: 0;
+ padding: 12px 0;
+}
+.slider::after {
+ content: " ";
+ position: absolute;
+ width: 100%;
+ height: 3px;
+ top: 50%;
+ margin-top: -1.5px;
+ background: rgba(255, 255, 255, 0.5);
+}
+
+.video-player:-webkit-full-screen {
+ width: 100%;
+ height: 100%;
+}
+
+/*
+ * CSS Loader
+ * loading.io
+ */
+
+.lds-ring {
+ display: inline-block;
+ position: relative;
+ width: 80px;
+ height: 80px;
+}
+.lds-ring div {
+ box-sizing: border-box;
+ display: block;
+ position: absolute;
+ width: 64px;
+ height: 64px;
+ margin: 8px;
+ border: 8px solid #fff;
+ border-radius: 50%;
+ animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
+ border-color: #fff transparent transparent transparent;
+}
+.lds-ring div:nth-child(1) {
+ animation-delay: -0.45s;
+}
+.lds-ring div:nth-child(2) {
+ animation-delay: -0.3s;
+}
+.lds-ring div:nth-child(3) {
+ animation-delay: -0.15s;
+}
+@keyframes lds-ring {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/**
+ * react-srv3 caption offset
+ */
+.react-srv3-caption-window {
+ transition: margin-bottom 0.2s;
+}
+.controls-visible .react-srv3-caption-window[data-ap="6"],
+.controls-visible .react-srv3-caption-window[data-ap="7"],
+.controls-visible .react-srv3-caption-window[data-ap="8"] {
+ margin-bottom: 72px;
+}
diff --git a/styles/tailwind.css b/styles/tailwind.css
new file mode 100644
index 0000000..c4a3ba1
--- /dev/null
+++ b/styles/tailwind.css
@@ -0,0 +1,34 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+body,
+html {
+ @apply bg-black text-white;
+ scroll-behavior: smooth;
+}
+
+html {
+ height: 100%;
+}
+body {
+ min-height: 100%;
+ @apply flex flex-col;
+}
+#__next {
+ @apply flex flex-1 flex-col;
+}
+
+*::-webkit-scrollbar-track {
+ @apply bg-gray-900;
+}
+
+*::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+ @apply bg-gray-900;
+}
+
+*::-webkit-scrollbar-thumb {
+ @apply bg-gray-600;
+}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..9c53581
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,48 @@
+module.exports = {
+ purge: ["./modules/**/*.tsx", "./pages/**/*.tsx"],
+ darkMode: false,
+ theme: {
+ extend: {
+ typography: (theme) => ({
+ dark: {
+ css: {
+ color: theme("colors.gray.300"),
+ '[class~="lead"]': { color: theme("colors.gray.400") },
+ a: { color: theme("colors.gray.100") },
+ strong: { color: theme("colors.gray.100") },
+ "ul > li::before": { backgroundColor: theme("colors.gray.700") },
+ hr: { borderColor: theme("colors.gray.800") },
+ blockquote: {
+ color: theme("colors.gray.100"),
+ borderLeftColor: theme("colors.gray.800"),
+ },
+ h1: { color: theme("colors.gray.100") },
+ h2: { color: theme("colors.gray.100") },
+ h3: { color: theme("colors.gray.100") },
+ h4: { color: theme("colors.gray.100") },
+ code: { color: theme("colors.gray.100") },
+ "a code": { color: theme("colors.gray.100") },
+ pre: {
+ color: theme("colors.gray.200"),
+ backgroundColor: theme("colors.gray.800"),
+ },
+ thead: {
+ color: theme("colors.gray.100"),
+ borderBottomColor: theme("colors.gray.700"),
+ },
+ "tbody tr": { borderBottomColor: theme("colors.gray.800") },
+ },
+ },
+ }),
+ },
+ },
+ variants: {
+ extend: {
+ height: ["group-hover"],
+ width: ["group-hover"],
+ typography: ["dark"],
+ display: ["group-focus"],
+ },
+ },
+ plugins: [require("@tailwindcss/typography")],
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..5bee8c4
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,30 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..e162065
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,4778 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 6
+ cacheKey: 8
+
+"@babel/code-frame@npm:7.12.11":
+ version: 7.12.11
+ resolution: "@babel/code-frame@npm:7.12.11"
+ dependencies:
+ "@babel/highlight": ^7.10.4
+ checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3
+ languageName: node
+ linkType: hard
+
+"@babel/code-frame@npm:^7.0.0":
+ version: 7.16.0
+ resolution: "@babel/code-frame@npm:7.16.0"
+ dependencies:
+ "@babel/highlight": ^7.16.0
+ checksum: 8961d0302ec6b8c2e9751a11e06a17617425359fd1645e4dae56a90a03464c68a0916115100fbcd030961870313f21865d0b85858360a2c68aabdda744393607
+ languageName: node
+ linkType: hard
+
+"@babel/helper-plugin-utils@npm:^7.14.5":
+ version: 7.14.5
+ resolution: "@babel/helper-plugin-utils@npm:7.14.5"
+ checksum: fe20e90a24d02770a60ebe80ab9f0dfd7258503cea8006c71709ac9af1aa3e47b0de569499673f11ea6c99597f8c0e4880ae1d505986e61101b69716820972fe
+ languageName: node
+ linkType: hard
+
+"@babel/helper-validator-identifier@npm:^7.14.9, @babel/helper-validator-identifier@npm:^7.15.7":
+ version: 7.15.7
+ resolution: "@babel/helper-validator-identifier@npm:7.15.7"
+ checksum: f041c28c531d1add5cc345b25d5df3c29c62bce3205b4d4a93dcd164ccf630350acba252d374fad8f5d8ea526995a215829f27183ba7ce7ce141843bf23068a6
+ languageName: node
+ linkType: hard
+
+"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.16.0":
+ version: 7.16.0
+ resolution: "@babel/highlight@npm:7.16.0"
+ dependencies:
+ "@babel/helper-validator-identifier": ^7.15.7
+ chalk: ^2.0.0
+ js-tokens: ^4.0.0
+ checksum: abf244c48fcff20ec87830e8b99c776f4dcdd9138e63decc195719a94148da35339639e0d8045eb9d1f3e67a39ab90a9c3f5ce2d579fb1a0368d911ddf29b4e5
+ languageName: node
+ linkType: hard
+
+"@babel/plugin-syntax-jsx@npm:7.14.5":
+ version: 7.14.5
+ resolution: "@babel/plugin-syntax-jsx@npm:7.14.5"
+ dependencies:
+ "@babel/helper-plugin-utils": ^7.14.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 3a2ba87534b0f9ee70eba0754d2ae544825c25afd98efb8e42b41399e02de4cc5b1f70fc5ce444fb7a7e5b09972c289eed2f00917be5b88d67407f4cbde8e960
+ languageName: node
+ linkType: hard
+
+"@babel/runtime@npm:7.15.4":
+ version: 7.15.4
+ resolution: "@babel/runtime@npm:7.15.4"
+ dependencies:
+ regenerator-runtime: ^0.13.4
+ checksum: c40825430400e47c19b97e4142d5315d2910305b9714d44a711472587ee2fd4521fdba5f02ddd9df3902f5e988d9854fa83f4da1e0c091f70f6983fa52480606
+ languageName: node
+ linkType: hard
+
+"@babel/types@npm:7.15.0":
+ version: 7.15.0
+ resolution: "@babel/types@npm:7.15.0"
+ dependencies:
+ "@babel/helper-validator-identifier": ^7.14.9
+ to-fast-properties: ^2.0.0
+ checksum: 6d6bcdfce94b5446520a24087c6dede453e28425af092965b304d4028e9bca79712fd691cdad031e3570c7667bf3206e5f642bcccbfccb33d42ca4a8203587f9
+ languageName: node
+ linkType: hard
+
+"@csstools/convert-colors@npm:^1.4.0":
+ version: 1.4.0
+ resolution: "@csstools/convert-colors@npm:1.4.0"
+ checksum: 26069eeb845a506934c821c203feb97f5de634c5fbeb9978505a2271d6cfdb0ce400240fca9620a4ef2e68953928ea25aab92ea8454e0edf5cd074066d9ad57b
+ languageName: node
+ linkType: hard
+
+"@gar/promisify@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "@gar/promisify@npm:1.1.3"
+ checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1
+ languageName: node
+ linkType: hard
+
+"@hapi/accept@npm:5.0.2":
+ version: 5.0.2
+ resolution: "@hapi/accept@npm:5.0.2"
+ dependencies:
+ "@hapi/boom": 9.x.x
+ "@hapi/hoek": 9.x.x
+ checksum: 8088cbc245287f52722b2f6c42ae1f21f1f40001453582876b7de0329104427f88a277cd7857458bfc8ade4b9c872c9e5571b94de3c38440e40dbd3d25387954
+ languageName: node
+ linkType: hard
+
+"@hapi/boom@npm:9.x.x":
+ version: 9.1.4
+ resolution: "@hapi/boom@npm:9.1.4"
+ dependencies:
+ "@hapi/hoek": 9.x.x
+ checksum: b1cdde1e82fae8222d893ac74e13e9a784f0398ffcb7ece32f6eb69bad990ca62f3c40cca19673e74cc676628ff121ee5576d6b0f1add92dcfa182ff9b90b937
+ languageName: node
+ linkType: hard
+
+"@hapi/hoek@npm:9.x.x":
+ version: 9.2.1
+ resolution: "@hapi/hoek@npm:9.2.1"
+ checksum: 6a439f672df5f12f1d08d56967b4cb364ce05d81e95e3c3c1b88c5a98b917ca91c70e78cc0b2b4219a760cceec1f22d6658bfc93a83670cecc1ce9ca2247ebd8
+ languageName: node
+ linkType: hard
+
+"@napi-rs/triples@npm:1.0.3":
+ version: 1.0.3
+ resolution: "@napi-rs/triples@npm:1.0.3"
+ checksum: c83a4cc55f69115bf4ce1d5924efce7f5faf2dc79fd52257385559f668ce91a03c5d7d004df01ebba56028a9b663955eb97f31b65ac0acff7a93c143f0d809af
+ languageName: node
+ linkType: hard
+
+"@next/env@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/env@npm:12.0.3"
+ checksum: 45fde5f6695b9c227ae7e8bfcccbf0c6cb1985cbd41a7298614050542dd8b5cd4c417879d94586deaed2a213cea31b02111d6c1491cc52ce33f5a9ffcc758031
+ languageName: node
+ linkType: hard
+
+"@next/polyfill-module@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/polyfill-module@npm:12.0.3"
+ checksum: 828e0323a32faaa30545971a1339819a2389956a740915b6e32d911f86e9389b86d36b80da288a2077836bae68eb2ca0765f9aaead0a6ecd8a53b6281372833c
+ languageName: node
+ linkType: hard
+
+"@next/react-dev-overlay@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/react-dev-overlay@npm:12.0.3"
+ dependencies:
+ "@babel/code-frame": 7.12.11
+ anser: 1.4.9
+ chalk: 4.0.0
+ classnames: 2.2.6
+ css.escape: 1.5.1
+ data-uri-to-buffer: 3.0.1
+ platform: 1.3.6
+ shell-quote: 1.7.3
+ source-map: 0.8.0-beta.0
+ stacktrace-parser: 0.1.10
+ strip-ansi: 6.0.1
+ peerDependencies:
+ react: ^17.0.2
+ react-dom: ^17.0.2
+ webpack: ^4 || ^5
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+ checksum: c5433992c190027a614a364f565469194c9a5e8c2587054a1ce169bb47e22e2c8f3e6f54c8b435898ceb29fd003c0a8eb383160e6424ead63a404300d331d706
+ languageName: node
+ linkType: hard
+
+"@next/react-refresh-utils@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/react-refresh-utils@npm:12.0.3"
+ peerDependencies:
+ react-refresh: 0.8.3
+ webpack: ^4 || ^5
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+ checksum: 7e9c6ea48011cb97adf9e789adee580be1171c6db35835780e576ad11104afa5ed78caef9f479179ab769c77fbe96926bc3806bfa52ebc75ee188c89aa178386
+ languageName: node
+ linkType: hard
+
+"@next/swc-android-arm64@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-android-arm64@npm:12.0.3"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-darwin-arm64@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-darwin-arm64@npm:12.0.3"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-darwin-x64@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-darwin-x64@npm:12.0.3"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm-gnueabihf@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-linux-arm-gnueabihf@npm:12.0.3"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm64-gnu@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-linux-arm64-gnu@npm:12.0.3"
+ conditions: os=linux & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm64-musl@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-linux-arm64-musl@npm:12.0.3"
+ conditions: os=linux & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-x64-gnu@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-linux-x64-gnu@npm:12.0.3"
+ conditions: os=linux & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-x64-musl@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-linux-x64-musl@npm:12.0.3"
+ conditions: os=linux & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-arm64-msvc@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-win32-arm64-msvc@npm:12.0.3"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-ia32-msvc@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-win32-ia32-msvc@npm:12.0.3"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-x64-msvc@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@next/swc-win32-x64-msvc@npm:12.0.3"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.scandir@npm:2.1.5":
+ version: 2.1.5
+ resolution: "@nodelib/fs.scandir@npm:2.1.5"
+ dependencies:
+ "@nodelib/fs.stat": 2.0.5
+ run-parallel: ^1.1.9
+ checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2":
+ version: 2.0.5
+ resolution: "@nodelib/fs.stat@npm:2.0.5"
+ checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.walk@npm:^1.2.3":
+ version: 1.2.8
+ resolution: "@nodelib/fs.walk@npm:1.2.8"
+ dependencies:
+ "@nodelib/fs.scandir": 2.1.5
+ fastq: ^1.6.0
+ checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53
+ languageName: node
+ linkType: hard
+
+"@npmcli/fs@npm:^2.1.0":
+ version: 2.1.2
+ resolution: "@npmcli/fs@npm:2.1.2"
+ dependencies:
+ "@gar/promisify": ^1.1.3
+ semver: ^7.3.5
+ checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225
+ languageName: node
+ linkType: hard
+
+"@npmcli/move-file@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "@npmcli/move-file@npm:2.0.1"
+ dependencies:
+ mkdirp: ^1.0.4
+ rimraf: ^3.0.2
+ checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/custom-forms@npm:^0.2.1":
+ version: 0.2.1
+ resolution: "@tailwindcss/custom-forms@npm:0.2.1"
+ dependencies:
+ lodash: ^4.17.11
+ mini-svg-data-uri: ^1.0.3
+ traverse: ^0.6.6
+ peerDependencies:
+ tailwindcss: ^1.0
+ checksum: 875906d2014a169242ee51fb21b0736d330539a23a8980e416d1ccc3f192c5a8d6d964c220e1ed9462092180739206d1538e79d684c5088f8f59035f0b552772
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/typography@npm:^0.2.0":
+ version: 0.2.0
+ resolution: "@tailwindcss/typography@npm:0.2.0"
+ peerDependencies:
+ tailwindcss: ^1.5.0
+ checksum: 0f38d799cb4fc3d10f8a003c2934b8e0a3c78d2c8db3bba1b39f85da74a6b56a9833dbff80d2227fd3450bebc2ad59f0ecdfb0e69270cf4475ae6810da531dbd
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/typography@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "@tailwindcss/typography@npm:0.4.1"
+ dependencies:
+ lodash.castarray: ^4.4.0
+ lodash.isplainobject: ^4.0.6
+ lodash.merge: ^4.6.2
+ lodash.uniq: ^4.5.0
+ peerDependencies:
+ tailwindcss: ">=2.0.0"
+ checksum: d234509964f59389d00ccc0529b033a5aa670a93149a48520cd2088d102b894cc746146052ea844a926bbea4b16904f5f6b2874399511bf78d55631bdb88ac68
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/ui@npm:^0.7.2":
+ version: 0.7.2
+ resolution: "@tailwindcss/ui@npm:0.7.2"
+ dependencies:
+ "@tailwindcss/custom-forms": ^0.2.1
+ "@tailwindcss/typography": ^0.2.0
+ hex-rgb: ^4.1.0
+ postcss-selector-parser: ^6.0.2
+ peerDependencies:
+ tailwindcss: ^1.8.3
+ checksum: 375966b7ae0e32047a6c1cf35fb3d71a53a5f49fb2410e049ba1adac7393574051d2fddc5ee19bff6892371c1ab1ca18a3cfa6f000372593fc20eb74a8198c04
+ languageName: node
+ linkType: hard
+
+"@tootallnate/once@npm:2":
+ version: 2.0.0
+ resolution: "@tootallnate/once@npm:2.0.0"
+ checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8
+ languageName: node
+ linkType: hard
+
+"@types/node@npm:*, @types/node@npm:^16.11.7":
+ version: 16.11.7
+ resolution: "@types/node@npm:16.11.7"
+ checksum: 2706403e6efc4aa40fdce8f0b5d9884d5600c3c8610aedc7fa5e7e298d30366f7e8b7296028d52898dca3edef4c3e827b03bf20952c4780f13fa4e79864f7a86
+ languageName: node
+ linkType: hard
+
+"@types/parse-json@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@types/parse-json@npm:4.0.0"
+ checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b
+ languageName: node
+ linkType: hard
+
+"@types/prop-types@npm:*":
+ version: 15.7.4
+ resolution: "@types/prop-types@npm:15.7.4"
+ checksum: ef6e1899e59b876c273811b1bd845022fc66d5a3d11cb38a25b6c566b30514ae38fe20a40f67622f362a4f4f7f9224e22d8da101cff3d6e97e11d7b4c307cfc1
+ languageName: node
+ linkType: hard
+
+"@types/react-dom@npm:^17.0.11":
+ version: 17.0.11
+ resolution: "@types/react-dom@npm:17.0.11"
+ dependencies:
+ "@types/react": "*"
+ checksum: 4d5730dffbef86c887cecad7e3cecda424ce6a64d0b5441c63b5b015d48219868660a2bb1aa15e897e565ad8867fa6b885d4358b04e1c4e589ba4c07c3fda55c
+ languageName: node
+ linkType: hard
+
+"@types/react@npm:*, @types/react@npm:^17.0.34":
+ version: 17.0.34
+ resolution: "@types/react@npm:17.0.34"
+ dependencies:
+ "@types/prop-types": "*"
+ "@types/scheduler": "*"
+ csstype: ^3.0.2
+ checksum: 16729ad7d50922ccbf8eb93874d7781dc2f1c64edc78134b5edc7154839d41e9fe320eb1c11ad2d1c9bf28b99cb1febda344509c1fda025955a5c2b43c688c8f
+ languageName: node
+ linkType: hard
+
+"@types/scheduler@npm:*":
+ version: 0.16.2
+ resolution: "@types/scheduler@npm:0.16.2"
+ checksum: b6b4dcfeae6deba2e06a70941860fb1435730576d3689225a421280b7742318d1548b3d22c1f66ab68e414f346a9542f29240bc955b6332c5b11e561077583bc
+ languageName: node
+ linkType: hard
+
+"abbrev@npm:^1.0.0":
+ version: 1.1.1
+ resolution: "abbrev@npm:1.1.1"
+ checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17
+ languageName: node
+ linkType: hard
+
+"acorn-node@npm:^1.6.1":
+ version: 1.8.2
+ resolution: "acorn-node@npm:1.8.2"
+ dependencies:
+ acorn: ^7.0.0
+ acorn-walk: ^7.0.0
+ xtend: ^4.0.2
+ checksum: 02e1564a1ccf8bd1fcefcd01235398af4a9effaf032c5397994ddd275590a72894cb3e26e4b82579ccdda1e48ade7486aef61e771ddae3563ca452b927f443d8
+ languageName: node
+ linkType: hard
+
+"acorn-walk@npm:^7.0.0":
+ version: 7.2.0
+ resolution: "acorn-walk@npm:7.2.0"
+ checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f
+ languageName: node
+ linkType: hard
+
+"acorn@npm:8.5.0":
+ version: 8.5.0
+ resolution: "acorn@npm:8.5.0"
+ bin:
+ acorn: bin/acorn
+ checksum: 2e4c1dbed3da327684863debf31d341bf8882c6893c506653872c00977eee45675feb9129255d6c74c88424d2b20d889ca6de5b39776e5e3cccfc756b3ca1da8
+ languageName: node
+ linkType: hard
+
+"acorn@npm:^7.0.0":
+ version: 7.4.1
+ resolution: "acorn@npm:7.4.1"
+ bin:
+ acorn: bin/acorn
+ checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407
+ languageName: node
+ linkType: hard
+
+"agent-base@npm:6, agent-base@npm:^6.0.2":
+ version: 6.0.2
+ resolution: "agent-base@npm:6.0.2"
+ dependencies:
+ debug: 4
+ checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d
+ languageName: node
+ linkType: hard
+
+"agentkeepalive@npm:^4.2.1":
+ version: 4.2.1
+ resolution: "agentkeepalive@npm:4.2.1"
+ dependencies:
+ debug: ^4.1.0
+ depd: ^1.1.2
+ humanize-ms: ^1.2.1
+ checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18
+ languageName: node
+ linkType: hard
+
+"aggregate-error@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "aggregate-error@npm:3.1.0"
+ dependencies:
+ clean-stack: ^2.0.0
+ indent-string: ^4.0.0
+ checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79
+ languageName: node
+ linkType: hard
+
+"anser@npm:1.4.9":
+ version: 1.4.9
+ resolution: "anser@npm:1.4.9"
+ checksum: 1f77042dee6083bfacda4cf56cc2b02fe1490cb7d928aca2c9372b1b21acd8bc3360e4fcb4bc59991e3617aae3ae685c1c668641279ca0e1591f7923804ed5d8
+ languageName: node
+ linkType: hard
+
+"ansi-regex@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "ansi-regex@npm:5.0.1"
+ checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^3.2.1":
+ version: 3.2.1
+ resolution: "ansi-styles@npm:3.2.1"
+ dependencies:
+ color-convert: ^1.9.0
+ checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^4.1.0":
+ version: 4.3.0
+ resolution: "ansi-styles@npm:4.3.0"
+ dependencies:
+ color-convert: ^2.0.1
+ checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4
+ languageName: node
+ linkType: hard
+
+"anymatch@npm:~3.1.1, anymatch@npm:~3.1.2":
+ version: 3.1.2
+ resolution: "anymatch@npm:3.1.2"
+ dependencies:
+ normalize-path: ^3.0.0
+ picomatch: ^2.0.4
+ checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9
+ languageName: node
+ linkType: hard
+
+"aproba@npm:^1.0.3 || ^2.0.0":
+ version: 2.0.0
+ resolution: "aproba@npm:2.0.0"
+ checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24
+ languageName: node
+ linkType: hard
+
+"archive-browser@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "archive-browser@workspace:."
+ dependencies:
+ "@tailwindcss/typography": ^0.4.1
+ "@tailwindcss/ui": ^0.7.2
+ "@types/node": ^16.11.7
+ "@types/react": ^17.0.34
+ "@types/react-dom": ^17.0.11
+ axios: ^1.2.1
+ next: 12.0.3
+ postcss: ^8.3.11
+ postcss-preset-env: ^6.7.0
+ prettier: ^2.4.1
+ pretty-bytes: ^6.0.0
+ react: 17.0.2
+ react-dom: 17.0.2
+ react-srv3: ^1.0.3
+ tailwindcss: ^2.2.19
+ timeago.js: ^4.0.2
+ typescript: ^4.4.4
+ languageName: unknown
+ linkType: soft
+
+"are-we-there-yet@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "are-we-there-yet@npm:3.0.1"
+ dependencies:
+ delegates: ^1.0.0
+ readable-stream: ^3.6.0
+ checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83
+ languageName: node
+ linkType: hard
+
+"arg@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "arg@npm:5.0.1"
+ checksum: 9aefbcb1204f8dbd541a045bfe99b6515b4dc697c2f704ef2bb5e9fe5464575d97571e91e673a6f23ad72dd1cc24d7d8cf2d1d828e72c08e4d4f6f9237adc761
+ languageName: node
+ linkType: hard
+
+"asn1.js@npm:^5.2.0":
+ version: 5.4.1
+ resolution: "asn1.js@npm:5.4.1"
+ dependencies:
+ bn.js: ^4.0.0
+ inherits: ^2.0.1
+ minimalistic-assert: ^1.0.0
+ safer-buffer: ^2.1.0
+ checksum: 3786a101ac6f304bd4e9a7df79549a7561950a13d4bcaec0c7790d44c80d147c1a94ba3d4e663673406064642a40b23fcd6c82a9952468e386c1a1376d747f9a
+ languageName: node
+ linkType: hard
+
+"assert@npm:2.0.0":
+ version: 2.0.0
+ resolution: "assert@npm:2.0.0"
+ dependencies:
+ es6-object-assign: ^1.1.0
+ is-nan: ^1.2.1
+ object-is: ^1.0.1
+ util: ^0.12.0
+ checksum: bb91f181a86d10588ee16c5e09c280f9811373974c29974cbe401987ea34e966699d7989a812b0e19377b511ea0bc627f5905647ce569311824848ede382cae8
+ languageName: node
+ linkType: hard
+
+"asynckit@npm:^0.4.0":
+ version: 0.4.0
+ resolution: "asynckit@npm:0.4.0"
+ checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be
+ languageName: node
+ linkType: hard
+
+"autoprefixer@npm:^9.6.1":
+ version: 9.8.8
+ resolution: "autoprefixer@npm:9.8.8"
+ dependencies:
+ browserslist: ^4.12.0
+ caniuse-lite: ^1.0.30001109
+ normalize-range: ^0.1.2
+ num2fraction: ^1.2.2
+ picocolors: ^0.2.1
+ postcss: ^7.0.32
+ postcss-value-parser: ^4.1.0
+ bin:
+ autoprefixer: bin/autoprefixer
+ checksum: 8f017672fbac248db0cf4e86aa707d8b148d9abadb842b5cf4c6be306d80fa6a654fadefd17e46213234c1f0947612acce2864f93e903f3e736b183fc1aedc45
+ languageName: node
+ linkType: hard
+
+"available-typed-arrays@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "available-typed-arrays@npm:1.0.5"
+ checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a
+ languageName: node
+ linkType: hard
+
+"axios@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "axios@npm:1.2.1"
+ dependencies:
+ follow-redirects: ^1.15.0
+ form-data: ^4.0.0
+ proxy-from-env: ^1.1.0
+ checksum: c4dc4e119064c9aed09a3de309bedb797a139a6fb372223aafe3e0c10a7d4a14e4d3e9c9d309467fadb9d2b490b891ee3df96ef5b55716bb971910466ff9f0c5
+ languageName: node
+ linkType: hard
+
+"balanced-match@npm:^1.0.0":
+ version: 1.0.2
+ resolution: "balanced-match@npm:1.0.2"
+ checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65
+ languageName: node
+ linkType: hard
+
+"base64-js@npm:^1.0.2":
+ version: 1.5.1
+ resolution: "base64-js@npm:1.5.1"
+ checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005
+ languageName: node
+ linkType: hard
+
+"big.js@npm:^5.2.2":
+ version: 5.2.2
+ resolution: "big.js@npm:5.2.2"
+ checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e
+ languageName: node
+ linkType: hard
+
+"binary-extensions@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "binary-extensions@npm:2.2.0"
+ checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8
+ languageName: node
+ linkType: hard
+
+"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9":
+ version: 4.12.0
+ resolution: "bn.js@npm:4.12.0"
+ checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12
+ languageName: node
+ linkType: hard
+
+"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1":
+ version: 5.2.0
+ resolution: "bn.js@npm:5.2.0"
+ checksum: 6117170393200f68b35a061ecbf55d01dd989302e7b3c798a3012354fa638d124f0b2f79e63f77be5556be80322a09c40339eda6413ba7468524c0b6d4b4cb7a
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^1.1.7":
+ version: 1.1.11
+ resolution: "brace-expansion@npm:1.1.11"
+ dependencies:
+ balanced-match: ^1.0.0
+ concat-map: 0.0.1
+ checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "brace-expansion@npm:2.0.1"
+ dependencies:
+ balanced-match: ^1.0.0
+ checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1
+ languageName: node
+ linkType: hard
+
+"braces@npm:^3.0.1, braces@npm:~3.0.2":
+ version: 3.0.2
+ resolution: "braces@npm:3.0.2"
+ dependencies:
+ fill-range: ^7.0.1
+ checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459
+ languageName: node
+ linkType: hard
+
+"brorand@npm:^1.0.1, brorand@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "brorand@npm:1.1.0"
+ checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be
+ languageName: node
+ linkType: hard
+
+"browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4":
+ version: 1.2.0
+ resolution: "browserify-aes@npm:1.2.0"
+ dependencies:
+ buffer-xor: ^1.0.3
+ cipher-base: ^1.0.0
+ create-hash: ^1.1.0
+ evp_bytestokey: ^1.0.3
+ inherits: ^2.0.1
+ safe-buffer: ^5.0.1
+ checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104
+ languageName: node
+ linkType: hard
+
+"browserify-cipher@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "browserify-cipher@npm:1.0.1"
+ dependencies:
+ browserify-aes: ^1.0.4
+ browserify-des: ^1.0.0
+ evp_bytestokey: ^1.0.0
+ checksum: 2d8500acf1ee535e6bebe808f7a20e4c3a9e2ed1a6885fff1facbfd201ac013ef030422bec65ca9ece8ffe82b03ca580421463f9c45af6c8415fd629f4118c13
+ languageName: node
+ linkType: hard
+
+"browserify-des@npm:^1.0.0":
+ version: 1.0.2
+ resolution: "browserify-des@npm:1.0.2"
+ dependencies:
+ cipher-base: ^1.0.1
+ des.js: ^1.0.0
+ inherits: ^2.0.1
+ safe-buffer: ^5.1.2
+ checksum: b15a3e358a1d78a3b62ddc06c845d02afde6fc826dab23f1b9c016e643e7b1fda41de628d2110b712f6a44fb10cbc1800bc6872a03ddd363fb50768e010395b7
+ languageName: node
+ linkType: hard
+
+"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1":
+ version: 4.1.0
+ resolution: "browserify-rsa@npm:4.1.0"
+ dependencies:
+ bn.js: ^5.0.0
+ randombytes: ^2.0.1
+ checksum: 155f0c135873efc85620571a33d884aa8810e40176125ad424ec9d85016ff105a07f6231650914a760cca66f29af0494087947b7be34880dd4599a0cd3c38e54
+ languageName: node
+ linkType: hard
+
+"browserify-sign@npm:^4.0.0":
+ version: 4.2.1
+ resolution: "browserify-sign@npm:4.2.1"
+ dependencies:
+ bn.js: ^5.1.1
+ browserify-rsa: ^4.0.1
+ create-hash: ^1.2.0
+ create-hmac: ^1.1.7
+ elliptic: ^6.5.3
+ inherits: ^2.0.4
+ parse-asn1: ^5.1.5
+ readable-stream: ^3.6.0
+ safe-buffer: ^5.2.0
+ checksum: 0221f190e3f5b2d40183fa51621be7e838d9caa329fe1ba773406b7637855f37b30f5d83e52ff8f244ed12ffe6278dd9983638609ed88c841ce547e603855707
+ languageName: node
+ linkType: hard
+
+"browserify-zlib@npm:0.2.0":
+ version: 0.2.0
+ resolution: "browserify-zlib@npm:0.2.0"
+ dependencies:
+ pako: ~1.0.5
+ checksum: 5cd9d6a665190fedb4a97dfbad8dabc8698d8a507298a03f42c734e96d58ca35d3c7d4085e283440bbca1cd1938cff85031728079bedb3345310c58ab1ec92d6
+ languageName: node
+ linkType: hard
+
+"browserslist@npm:4.16.6":
+ version: 4.16.6
+ resolution: "browserslist@npm:4.16.6"
+ dependencies:
+ caniuse-lite: ^1.0.30001219
+ colorette: ^1.2.2
+ electron-to-chromium: ^1.3.723
+ escalade: ^3.1.1
+ node-releases: ^1.1.71
+ bin:
+ browserslist: cli.js
+ checksum: 3dffc86892d2dcfcfc66b52519b7e5698ae070b4fc92ab047e760efc4cae0474e9e70bbe10d769c8d3491b655ef3a2a885b88e7196c83cc5dc0a46dfdba8b70c
+ languageName: node
+ linkType: hard
+
+"browserslist@npm:^4.12.0, browserslist@npm:^4.6.4":
+ version: 4.17.6
+ resolution: "browserslist@npm:4.17.6"
+ dependencies:
+ caniuse-lite: ^1.0.30001274
+ electron-to-chromium: ^1.3.886
+ escalade: ^3.1.1
+ node-releases: ^2.0.1
+ picocolors: ^1.0.0
+ bin:
+ browserslist: cli.js
+ checksum: 7191280a30621dcb9b285f7f22c462aacbd366a94fcacdac109b8fa1a2fdab826b6545ccb308ad40f5d80f4fc488ae1212af8b16342286b97a1418476a98f77c
+ languageName: node
+ linkType: hard
+
+"buffer-xor@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "buffer-xor@npm:1.0.3"
+ checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a
+ languageName: node
+ linkType: hard
+
+"buffer@npm:5.6.0":
+ version: 5.6.0
+ resolution: "buffer@npm:5.6.0"
+ dependencies:
+ base64-js: ^1.0.2
+ ieee754: ^1.1.4
+ checksum: d659494c5032dd39d03d2912e64179cc44c6340e7e9d1f68d3840e7ab4559989fbce92b4950174593c38d05268224235ba404f0878775cab2a616b6dcad9c23e
+ languageName: node
+ linkType: hard
+
+"builtin-status-codes@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "builtin-status-codes@npm:3.0.0"
+ checksum: 1119429cf4b0d57bf76b248ad6f529167d343156ebbcc4d4e4ad600484f6bc63002595cbb61b67ad03ce55cd1d3c4711c03bbf198bf24653b8392420482f3773
+ languageName: node
+ linkType: hard
+
+"bytes@npm:3.1.0, bytes@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "bytes@npm:3.1.0"
+ checksum: 7c3b21c5d9d44ed455460d5d36a31abc6fa2ce3807964ba60a4b03fd44454c8cf07bb0585af83bfde1c5cc2ea4bbe5897bc3d18cd15e0acf25a3615a35aba2df
+ languageName: node
+ linkType: hard
+
+"cacache@npm:^16.1.0":
+ version: 16.1.3
+ resolution: "cacache@npm:16.1.3"
+ dependencies:
+ "@npmcli/fs": ^2.1.0
+ "@npmcli/move-file": ^2.0.0
+ chownr: ^2.0.0
+ fs-minipass: ^2.1.0
+ glob: ^8.0.1
+ infer-owner: ^1.0.4
+ lru-cache: ^7.7.1
+ minipass: ^3.1.6
+ minipass-collect: ^1.0.2
+ minipass-flush: ^1.0.5
+ minipass-pipeline: ^1.2.4
+ mkdirp: ^1.0.4
+ p-map: ^4.0.0
+ promise-inflight: ^1.0.1
+ rimraf: ^3.0.2
+ ssri: ^9.0.0
+ tar: ^6.1.11
+ unique-filename: ^2.0.0
+ checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6
+ languageName: node
+ linkType: hard
+
+"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "call-bind@npm:1.0.2"
+ dependencies:
+ function-bind: ^1.1.1
+ get-intrinsic: ^1.0.2
+ checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0
+ languageName: node
+ linkType: hard
+
+"callsites@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "callsites@npm:3.1.0"
+ checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3
+ languageName: node
+ linkType: hard
+
+"camelcase-css@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "camelcase-css@npm:2.0.1"
+ checksum: 1cec2b3b3dcb5026688a470b00299a8db7d904c4802845c353dbd12d9d248d3346949a814d83bfd988d4d2e5b9904c07efe76fecd195a1d4f05b543e7c0b56b1
+ languageName: node
+ linkType: hard
+
+"caniuse-lite@npm:^1.0.30000981, caniuse-lite@npm:^1.0.30001109, caniuse-lite@npm:^1.0.30001202, caniuse-lite@npm:^1.0.30001219, caniuse-lite@npm:^1.0.30001228, caniuse-lite@npm:^1.0.30001274":
+ version: 1.0.30001280
+ resolution: "caniuse-lite@npm:1.0.30001280"
+ checksum: 5794b22f4254927f095e83c65e89ddfc63065c7ed16e6544555a3252ee3d16e48f8a7846713dc64869c52e1abe9a2a93161804b40c2097d1abc9aaa0155a0b65
+ languageName: node
+ linkType: hard
+
+"chalk@npm:2.4.2, chalk@npm:^2.0.0":
+ version: 2.4.2
+ resolution: "chalk@npm:2.4.2"
+ dependencies:
+ ansi-styles: ^3.2.1
+ escape-string-regexp: ^1.0.5
+ supports-color: ^5.3.0
+ checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2
+ languageName: node
+ linkType: hard
+
+"chalk@npm:4.0.0":
+ version: 4.0.0
+ resolution: "chalk@npm:4.0.0"
+ dependencies:
+ ansi-styles: ^4.1.0
+ supports-color: ^7.1.0
+ checksum: a9580afd4af8ffa8add8edb565d1b3f77efb880c5d887d3bb72a948d1bfb2bc764db2ceb6d62a60103aa384f3da71eb1969c7f68e886055e0a3438550e809cde
+ languageName: node
+ linkType: hard
+
+"chalk@npm:^4.1.2":
+ version: 4.1.2
+ resolution: "chalk@npm:4.1.2"
+ dependencies:
+ ansi-styles: ^4.1.0
+ supports-color: ^7.1.0
+ checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc
+ languageName: node
+ linkType: hard
+
+"chokidar@npm:3.5.1":
+ version: 3.5.1
+ resolution: "chokidar@npm:3.5.1"
+ dependencies:
+ anymatch: ~3.1.1
+ braces: ~3.0.2
+ fsevents: ~2.3.1
+ glob-parent: ~5.1.0
+ is-binary-path: ~2.1.0
+ is-glob: ~4.0.1
+ normalize-path: ~3.0.0
+ readdirp: ~3.5.0
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ checksum: b7774e6e3aeca084d39e8542041555a11452414c744122436101243f89580fad97154ae11525e46bfa816313ae32533e2a88e8587e4d50b14ea716a9e6538978
+ languageName: node
+ linkType: hard
+
+"chokidar@npm:^3.5.2":
+ version: 3.5.2
+ resolution: "chokidar@npm:3.5.2"
+ dependencies:
+ anymatch: ~3.1.2
+ braces: ~3.0.2
+ fsevents: ~2.3.2
+ glob-parent: ~5.1.2
+ is-binary-path: ~2.1.0
+ is-glob: ~4.0.1
+ normalize-path: ~3.0.0
+ readdirp: ~3.6.0
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ checksum: d1fda32fcd67d9f6170a8468ad2630a3c6194949c9db3f6a91b16478c328b2800f433fb5d2592511b6cb145a47c013ea1cce60b432b1a001ae3ee978a8bffc2d
+ languageName: node
+ linkType: hard
+
+"chownr@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "chownr@npm:2.0.0"
+ checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f
+ languageName: node
+ linkType: hard
+
+"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "cipher-base@npm:1.0.4"
+ dependencies:
+ inherits: ^2.0.1
+ safe-buffer: ^5.0.1
+ checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e
+ languageName: node
+ linkType: hard
+
+"classnames@npm:2.2.6":
+ version: 2.2.6
+ resolution: "classnames@npm:2.2.6"
+ checksum: 09a4fda780158aa8399079898eabeeca0c48c28641d9e4de140db7412e5e346843039ded1af0152f755afc2cc246ff8c3d6f227bf0dcb004e070b7fa14ec54cc
+ languageName: node
+ linkType: hard
+
+"clean-stack@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "clean-stack@npm:2.2.0"
+ checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^1.9.0":
+ version: 1.9.3
+ resolution: "color-convert@npm:1.9.3"
+ dependencies:
+ color-name: 1.1.3
+ checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "color-convert@npm:2.0.1"
+ dependencies:
+ color-name: ~1.1.4
+ checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336
+ languageName: node
+ linkType: hard
+
+"color-name@npm:1.1.3":
+ version: 1.1.3
+ resolution: "color-name@npm:1.1.3"
+ checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d
+ languageName: node
+ linkType: hard
+
+"color-name@npm:^1.0.0, color-name@npm:~1.1.4":
+ version: 1.1.4
+ resolution: "color-name@npm:1.1.4"
+ checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610
+ languageName: node
+ linkType: hard
+
+"color-string@npm:^1.6.0":
+ version: 1.6.0
+ resolution: "color-string@npm:1.6.0"
+ dependencies:
+ color-name: ^1.0.0
+ simple-swizzle: ^0.2.2
+ checksum: 33466a65277dd3d4ce24ef1991b47069292f75d1a43b0d2e7ea43076ba793728e965d50deed2b523f35519f4995a908253fcbcc774baceae8e439bc78c02e850
+ languageName: node
+ linkType: hard
+
+"color-support@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "color-support@npm:1.1.3"
+ bin:
+ color-support: bin.js
+ checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b
+ languageName: node
+ linkType: hard
+
+"color@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "color@npm:4.0.1"
+ dependencies:
+ color-convert: ^2.0.1
+ color-string: ^1.6.0
+ checksum: 46b1e7c6a5d5b1db5e0a8f1f32eea015a1923c9a591cbef67e20b439d67fe8043a7c3beb96c602f0055068909c3ee73bc8ee1817e76a25861a92f64430d6118f
+ languageName: node
+ linkType: hard
+
+"colorette@npm:^1.2.2":
+ version: 1.4.0
+ resolution: "colorette@npm:1.4.0"
+ checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3
+ languageName: node
+ linkType: hard
+
+"combined-stream@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "combined-stream@npm:1.0.8"
+ dependencies:
+ delayed-stream: ~1.0.0
+ checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c
+ languageName: node
+ linkType: hard
+
+"commander@npm:^6.0.0":
+ version: 6.2.1
+ resolution: "commander@npm:6.2.1"
+ checksum: d7090410c0de6bc5c67d3ca41c41760d6d268f3c799e530aafb73b7437d1826bbf0d2a3edac33f8b57cc9887b4a986dce307fa5557e109be40eadb7c43b21742
+ languageName: node
+ linkType: hard
+
+"commondir@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "commondir@npm:1.0.1"
+ checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb
+ languageName: node
+ linkType: hard
+
+"concat-map@npm:0.0.1":
+ version: 0.0.1
+ resolution: "concat-map@npm:0.0.1"
+ checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af
+ languageName: node
+ linkType: hard
+
+"console-control-strings@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "console-control-strings@npm:1.1.0"
+ checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed
+ languageName: node
+ linkType: hard
+
+"constants-browserify@npm:1.0.0":
+ version: 1.0.0
+ resolution: "constants-browserify@npm:1.0.0"
+ checksum: f7ac8c6d0b6e4e0c77340a1d47a3574e25abd580bfd99ad707b26ff7618596cf1a5e5ce9caf44715e9e01d4a5d12cb3b4edaf1176f34c19adb2874815a56e64f
+ languageName: node
+ linkType: hard
+
+"convert-source-map@npm:1.7.0":
+ version: 1.7.0
+ resolution: "convert-source-map@npm:1.7.0"
+ dependencies:
+ safe-buffer: ~5.1.1
+ checksum: bcd2e3ea7d37f96b85a6e362c8a89402ccc73757256e3ee53aa2c22fe915adb854c66b1f81111be815a3a6a6ce3c58e8001858e883c9d5b4fe08a853fa865967
+ languageName: node
+ linkType: hard
+
+"cosmiconfig@npm:^7.0.1":
+ version: 7.0.1
+ resolution: "cosmiconfig@npm:7.0.1"
+ dependencies:
+ "@types/parse-json": ^4.0.0
+ import-fresh: ^3.2.1
+ parse-json: ^5.0.0
+ path-type: ^4.0.0
+ yaml: ^1.10.0
+ checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b
+ languageName: node
+ linkType: hard
+
+"create-ecdh@npm:^4.0.0":
+ version: 4.0.4
+ resolution: "create-ecdh@npm:4.0.4"
+ dependencies:
+ bn.js: ^4.1.0
+ elliptic: ^6.5.3
+ checksum: 0dd7fca9711d09e152375b79acf1e3f306d1a25ba87b8ff14c2fd8e68b83aafe0a7dd6c4e540c9ffbdd227a5fa1ad9b81eca1f233c38bb47770597ba247e614b
+ languageName: node
+ linkType: hard
+
+"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "create-hash@npm:1.2.0"
+ dependencies:
+ cipher-base: ^1.0.1
+ inherits: ^2.0.1
+ md5.js: ^1.3.4
+ ripemd160: ^2.0.1
+ sha.js: ^2.4.0
+ checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9
+ languageName: node
+ linkType: hard
+
+"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7":
+ version: 1.1.7
+ resolution: "create-hmac@npm:1.1.7"
+ dependencies:
+ cipher-base: ^1.0.3
+ create-hash: ^1.1.0
+ inherits: ^2.0.1
+ ripemd160: ^2.0.0
+ safe-buffer: ^5.0.1
+ sha.js: ^2.4.8
+ checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed
+ languageName: node
+ linkType: hard
+
+"crypto-browserify@npm:3.12.0":
+ version: 3.12.0
+ resolution: "crypto-browserify@npm:3.12.0"
+ dependencies:
+ browserify-cipher: ^1.0.0
+ browserify-sign: ^4.0.0
+ create-ecdh: ^4.0.0
+ create-hash: ^1.1.0
+ create-hmac: ^1.1.0
+ diffie-hellman: ^5.0.0
+ inherits: ^2.0.1
+ pbkdf2: ^3.0.3
+ public-encrypt: ^4.0.0
+ randombytes: ^2.0.0
+ randomfill: ^1.0.3
+ checksum: c1609af82605474262f3eaa07daa0b2140026bd264ab316d4bf1170272570dbe02f0c49e29407fe0d3634f96c507c27a19a6765fb856fed854a625f9d15618e2
+ languageName: node
+ linkType: hard
+
+"css-blank-pseudo@npm:^0.1.4":
+ version: 0.1.4
+ resolution: "css-blank-pseudo@npm:0.1.4"
+ dependencies:
+ postcss: ^7.0.5
+ bin:
+ css-blank-pseudo: cli.js
+ checksum: f995a6ca5dbb867af4b30c3dc872a8f0b27ad120442c34796eef7f9c4dcf014249522aaa0a2da3c101c4afa5d7d376436bb978ae1b2c02deddec283fad30c998
+ languageName: node
+ linkType: hard
+
+"css-color-names@npm:^0.0.4":
+ version: 0.0.4
+ resolution: "css-color-names@npm:0.0.4"
+ checksum: 9c6106320430a9da3a13daab8d8b4def39113edbfb68042444585d9a214af5fd5cb384b9be45124bc75f88261d461b517e00e278f4d2e0ab5a619b182f9f0e2d
+ languageName: node
+ linkType: hard
+
+"css-has-pseudo@npm:^0.10.0":
+ version: 0.10.0
+ resolution: "css-has-pseudo@npm:0.10.0"
+ dependencies:
+ postcss: ^7.0.6
+ postcss-selector-parser: ^5.0.0-rc.4
+ bin:
+ css-has-pseudo: cli.js
+ checksum: 88d891ba18f821e8a94d821ecdd723c606019462664c7d86e7d8731622bd26f9d55582e494bcc2a62f9399cc7b89049ddc8a9d1e8f1bf1a133c2427739d2d334
+ languageName: node
+ linkType: hard
+
+"css-prefers-color-scheme@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "css-prefers-color-scheme@npm:3.1.1"
+ dependencies:
+ postcss: ^7.0.5
+ bin:
+ css-prefers-color-scheme: cli.js
+ checksum: ba69a86b006818ffe3548bcbeb5e4e8139b8b6cf45815a3b3dddd12cd9acf3d8ac3b94e63fe0abd34e0683cf43ed8c2344e3bd472bbf02a6eb40c7bbf565d587
+ languageName: node
+ linkType: hard
+
+"css-unit-converter@npm:^1.1.1":
+ version: 1.1.2
+ resolution: "css-unit-converter@npm:1.1.2"
+ checksum: 07888033346a5128f34dbe2f72884c966d24e9f29db24416dcde92860242490617ef9a178ac193a92f730834bbeea026cdc7027701d92ba9bbbe59db7a37eb2a
+ languageName: node
+ linkType: hard
+
+"css.escape@npm:1.5.1":
+ version: 1.5.1
+ resolution: "css.escape@npm:1.5.1"
+ checksum: f6d38088d870a961794a2580b2b2af1027731bb43261cfdce14f19238a88664b351cc8978abc20f06cc6bbde725699dec8deb6fe9816b139fc3f2af28719e774
+ languageName: node
+ linkType: hard
+
+"cssdb@npm:^4.4.0":
+ version: 4.4.0
+ resolution: "cssdb@npm:4.4.0"
+ checksum: 521dd2135da1ab93612a4161eb1024cfc7b155a35d95f9867d328cc88ad57fdd959aa88ea8f4e6cea3a82bca91b76570dc1abb18bfd902c6889973956a03e497
+ languageName: node
+ linkType: hard
+
+"cssesc@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "cssesc@npm:2.0.0"
+ bin:
+ cssesc: bin/cssesc
+ checksum: 5e50886c2aca3f492fe808dbd146d30eb1c6f31fbe6093979a8376e39d171d989279199f6f3f1a42464109e082e0e42bc33eeff9467fb69bf346f5ba5853c3c6
+ languageName: node
+ linkType: hard
+
+"cssesc@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "cssesc@npm:3.0.0"
+ bin:
+ cssesc: bin/cssesc
+ checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2
+ languageName: node
+ linkType: hard
+
+"cssnano-preset-simple@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "cssnano-preset-simple@npm:3.0.0"
+ dependencies:
+ caniuse-lite: ^1.0.30001202
+ peerDependencies:
+ postcss: ^8.2.15
+ checksum: 03ad717960abdf8786092609c57278632633cab2b4374cbbb7dfc7ced194339a429d01f61f29264f2da268c6aa6015be7a5cc397725902d20fac1c081cce7315
+ languageName: node
+ linkType: hard
+
+"cssnano-simple@npm:3.0.0":
+ version: 3.0.0
+ resolution: "cssnano-simple@npm:3.0.0"
+ dependencies:
+ cssnano-preset-simple: ^3.0.0
+ peerDependencies:
+ postcss: ^8.2.15
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ checksum: 6d2410f91202aa0edd6a74363d34fcf9dada5b7f9d2127950785e50b1de4ff2144f2c81b72be87a93e7700c251858750df3128542ca44d0d505e430dfdf84b19
+ languageName: node
+ linkType: hard
+
+"csstype@npm:^3.0.2":
+ version: 3.0.9
+ resolution: "csstype@npm:3.0.9"
+ checksum: 199f9af7e673f9f188525c3102a329d637ff46c52f6385a4427ff5cb17adcb736189150170a7af7c5701d18d7704bdad130273f4aa7e44c6c4f9967e6115dc93
+ languageName: node
+ linkType: hard
+
+"data-uri-to-buffer@npm:3.0.1":
+ version: 3.0.1
+ resolution: "data-uri-to-buffer@npm:3.0.1"
+ checksum: c59c3009686a78c071806b72f4810856ec28222f0f4e252aa495ec027ed9732298ceea99c50328cf59b151dd34cbc3ad6150bbb43e41fc56fa19f48c99e9fc30
+ languageName: node
+ linkType: hard
+
+"debug@npm:2":
+ version: 2.6.9
+ resolution: "debug@npm:2.6.9"
+ dependencies:
+ ms: 2.0.0
+ checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6
+ languageName: node
+ linkType: hard
+
+"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.3":
+ version: 4.3.4
+ resolution: "debug@npm:4.3.4"
+ dependencies:
+ ms: 2.1.2
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
+ languageName: node
+ linkType: hard
+
+"define-properties@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "define-properties@npm:1.1.3"
+ dependencies:
+ object-keys: ^1.0.12
+ checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317
+ languageName: node
+ linkType: hard
+
+"defined@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "defined@npm:1.0.0"
+ checksum: 77672997c5001773371c4dbcce98da0b3dc43089d6da2ad87c4b800adb727633cea8723ea3889fe0c2112a2404e2fd07e3bfd0e55f7426aa6441d8992045dbd5
+ languageName: node
+ linkType: hard
+
+"delayed-stream@npm:~1.0.0":
+ version: 1.0.0
+ resolution: "delayed-stream@npm:1.0.0"
+ checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020
+ languageName: node
+ linkType: hard
+
+"delegates@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "delegates@npm:1.0.0"
+ checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd
+ languageName: node
+ linkType: hard
+
+"depd@npm:^1.1.2, depd@npm:~1.1.2":
+ version: 1.1.2
+ resolution: "depd@npm:1.1.2"
+ checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9
+ languageName: node
+ linkType: hard
+
+"des.js@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "des.js@npm:1.0.1"
+ dependencies:
+ inherits: ^2.0.1
+ minimalistic-assert: ^1.0.0
+ checksum: 1ec2eedd7ed6bd61dd5e0519fd4c96124e93bb22de8a9d211b02d63e5dd152824853d919bb2090f965cc0e3eb9c515950a9836b332020d810f9c71feb0fd7df4
+ languageName: node
+ linkType: hard
+
+"detective@npm:^5.2.0":
+ version: 5.2.0
+ resolution: "detective@npm:5.2.0"
+ dependencies:
+ acorn-node: ^1.6.1
+ defined: ^1.0.0
+ minimist: ^1.1.1
+ bin:
+ detective: bin/detective.js
+ checksum: 2ab266aecbd695b42e4703cfa560178ceac4308a74baece58185775426e65573d563d84f33e6a3b28ef3a544aa0c039c0730ada939c6458862e6643f66044f32
+ languageName: node
+ linkType: hard
+
+"didyoumean@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "didyoumean@npm:1.2.2"
+ checksum: d5d98719d58b3c2fa59663c4c42ba9716f1fd01245c31d5fce31915bd3aa26e6aac149788e007358f778ebbd68a2256eb5973e8ca6f221df221ba060115acf2e
+ languageName: node
+ linkType: hard
+
+"diffie-hellman@npm:^5.0.0":
+ version: 5.0.3
+ resolution: "diffie-hellman@npm:5.0.3"
+ dependencies:
+ bn.js: ^4.1.0
+ miller-rabin: ^4.0.0
+ randombytes: ^2.0.0
+ checksum: 0e620f322170c41076e70181dd1c24e23b08b47dbb92a22a644f3b89b6d3834b0f8ee19e37916164e5eb1ee26d2aa836d6129f92723995267250a0b541811065
+ languageName: node
+ linkType: hard
+
+"dlv@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "dlv@npm:1.1.3"
+ checksum: d7381bca22ed11933a1ccf376db7a94bee2c57aa61e490f680124fa2d1cd27e94eba641d9f45be57caab4f9a6579de0983466f620a2cd6230d7ec93312105ae7
+ languageName: node
+ linkType: hard
+
+"domain-browser@npm:4.19.0":
+ version: 4.19.0
+ resolution: "domain-browser@npm:4.19.0"
+ checksum: 1b77fa2a85f1531b8bdfcc42c2a2706016aeaddeed12ce4851f9d6a17135588e05120e380c6b5b645290522684f9311a6e0a3e68b46f864f864ed89620d4bdd7
+ languageName: node
+ linkType: hard
+
+"electron-to-chromium@npm:^1.3.723, electron-to-chromium@npm:^1.3.886":
+ version: 1.3.895
+ resolution: "electron-to-chromium@npm:1.3.895"
+ checksum: 8280c14eb79bf202ecb34714757df6d551553db45b27e36a33cb4652b7c04a9e95ab6a2f1d3097cae5039b99282ab4ccb99f7a4990fcee45d8eea757fb398cb2
+ languageName: node
+ linkType: hard
+
+"elliptic@npm:^6.5.3":
+ version: 6.5.4
+ resolution: "elliptic@npm:6.5.4"
+ dependencies:
+ bn.js: ^4.11.9
+ brorand: ^1.1.0
+ hash.js: ^1.0.0
+ hmac-drbg: ^1.0.1
+ inherits: ^2.0.4
+ minimalistic-assert: ^1.0.1
+ minimalistic-crypto-utils: ^1.0.1
+ checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4
+ languageName: node
+ linkType: hard
+
+"emoji-regex@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "emoji-regex@npm:8.0.0"
+ checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192
+ languageName: node
+ linkType: hard
+
+"emojis-list@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "emojis-list@npm:2.1.0"
+ checksum: fb61fa6356dfcc9fbe6db8e334c29da365a34d3d82a915cb59621883d3023d804fd5edad5acd42b8eec016936e81d3b38e2faf921b32e073758374253afe1272
+ languageName: node
+ linkType: hard
+
+"encoding@npm:0.1.13, encoding@npm:^0.1.13":
+ version: 0.1.13
+ resolution: "encoding@npm:0.1.13"
+ dependencies:
+ iconv-lite: ^0.6.2
+ checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f
+ languageName: node
+ linkType: hard
+
+"env-paths@npm:^2.2.0":
+ version: 2.2.1
+ resolution: "env-paths@npm:2.2.1"
+ checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e
+ languageName: node
+ linkType: hard
+
+"err-code@npm:^2.0.2":
+ version: 2.0.3
+ resolution: "err-code@npm:2.0.3"
+ checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54
+ languageName: node
+ linkType: hard
+
+"error-ex@npm:^1.3.1":
+ version: 1.3.2
+ resolution: "error-ex@npm:1.3.2"
+ dependencies:
+ is-arrayish: ^0.2.1
+ checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001
+ languageName: node
+ linkType: hard
+
+"es-abstract@npm:^1.18.5":
+ version: 1.19.1
+ resolution: "es-abstract@npm:1.19.1"
+ dependencies:
+ call-bind: ^1.0.2
+ es-to-primitive: ^1.2.1
+ function-bind: ^1.1.1
+ get-intrinsic: ^1.1.1
+ get-symbol-description: ^1.0.0
+ has: ^1.0.3
+ has-symbols: ^1.0.2
+ internal-slot: ^1.0.3
+ is-callable: ^1.2.4
+ is-negative-zero: ^2.0.1
+ is-regex: ^1.1.4
+ is-shared-array-buffer: ^1.0.1
+ is-string: ^1.0.7
+ is-weakref: ^1.0.1
+ object-inspect: ^1.11.0
+ object-keys: ^1.1.1
+ object.assign: ^4.1.2
+ string.prototype.trimend: ^1.0.4
+ string.prototype.trimstart: ^1.0.4
+ unbox-primitive: ^1.0.1
+ checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949
+ languageName: node
+ linkType: hard
+
+"es-to-primitive@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "es-to-primitive@npm:1.2.1"
+ dependencies:
+ is-callable: ^1.1.4
+ is-date-object: ^1.0.1
+ is-symbol: ^1.0.2
+ checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed
+ languageName: node
+ linkType: hard
+
+"es6-object-assign@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "es6-object-assign@npm:1.1.0"
+ checksum: 8d4fdf63484d78b5c64cacc2c2e1165bc7b6a64b739d2a9db6a4dc8641d99cc9efb433cdd4dc3d3d6b00bfa6ce959694e4665e3255190339945c5f33b692b5d8
+ languageName: node
+ linkType: hard
+
+"escalade@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "escalade@npm:3.1.1"
+ checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133
+ languageName: node
+ linkType: hard
+
+"escape-string-regexp@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "escape-string-regexp@npm:1.0.5"
+ checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410
+ languageName: node
+ linkType: hard
+
+"etag@npm:1.8.1":
+ version: 1.8.1
+ resolution: "etag@npm:1.8.1"
+ checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff
+ languageName: node
+ linkType: hard
+
+"events@npm:3.3.0":
+ version: 3.3.0
+ resolution: "events@npm:3.3.0"
+ checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780
+ languageName: node
+ linkType: hard
+
+"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "evp_bytestokey@npm:1.0.3"
+ dependencies:
+ md5.js: ^1.3.4
+ node-gyp: latest
+ safe-buffer: ^5.1.1
+ checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45
+ languageName: node
+ linkType: hard
+
+"fast-glob@npm:^3.2.7":
+ version: 3.2.7
+ resolution: "fast-glob@npm:3.2.7"
+ dependencies:
+ "@nodelib/fs.stat": ^2.0.2
+ "@nodelib/fs.walk": ^1.2.3
+ glob-parent: ^5.1.2
+ merge2: ^1.3.0
+ micromatch: ^4.0.4
+ checksum: 2f4708ff112d2b451888129fdd9a0938db88b105b0ddfd043c064e3c4d3e20eed8d7c7615f7565fee660db34ddcf08a2db1bf0ab3c00b87608e4719694642d78
+ languageName: node
+ linkType: hard
+
+"fast-xml-parser@npm:^3.19.0":
+ version: 3.21.1
+ resolution: "fast-xml-parser@npm:3.21.1"
+ dependencies:
+ strnum: ^1.0.4
+ bin:
+ xml2js: cli.js
+ checksum: 73b9c907a424cc2f9b11a8a2f1b7448d936f1db6fa574b85cbe4be9739c2f77d99a827bb27d738a0db0047b20c71a5d663f64937fbdb9c38977fc6cd145221d2
+ languageName: node
+ linkType: hard
+
+"fastq@npm:^1.6.0":
+ version: 1.13.0
+ resolution: "fastq@npm:1.13.0"
+ dependencies:
+ reusify: ^1.0.4
+ checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b
+ languageName: node
+ linkType: hard
+
+"fill-range@npm:^7.0.1":
+ version: 7.0.1
+ resolution: "fill-range@npm:7.0.1"
+ dependencies:
+ to-regex-range: ^5.0.1
+ checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917
+ languageName: node
+ linkType: hard
+
+"find-cache-dir@npm:3.3.1":
+ version: 3.3.1
+ resolution: "find-cache-dir@npm:3.3.1"
+ dependencies:
+ commondir: ^1.0.1
+ make-dir: ^3.0.2
+ pkg-dir: ^4.1.0
+ checksum: 0f7c22b65e07f9b486b4560227d014fab1e79ffbbfbafb87d113a2e878510bd620ef6fdff090e5248bb2846d28851d19e42bfdc7c50687966acc106328e7abf1
+ languageName: node
+ linkType: hard
+
+"find-up@npm:^4.0.0":
+ version: 4.1.0
+ resolution: "find-up@npm:4.1.0"
+ dependencies:
+ locate-path: ^5.0.0
+ path-exists: ^4.0.0
+ checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844
+ languageName: node
+ linkType: hard
+
+"flatten@npm:^1.0.2":
+ version: 1.0.3
+ resolution: "flatten@npm:1.0.3"
+ checksum: 5c57379816f1692aaa79fbc6390e0a0644e5e8442c5783ed57c6d315468eddbc53a659eaa03c9bb1e771b0f4a9bd8dd8a2620286bf21fd6538a7857321fdfb20
+ languageName: node
+ linkType: hard
+
+"follow-redirects@npm:^1.15.0":
+ version: 1.15.2
+ resolution: "follow-redirects@npm:1.15.2"
+ peerDependenciesMeta:
+ debug:
+ optional: true
+ checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190
+ languageName: node
+ linkType: hard
+
+"foreach@npm:^2.0.5":
+ version: 2.0.5
+ resolution: "foreach@npm:2.0.5"
+ checksum: dab4fbfef0b40b69ee5eab81bcb9626b8fa8b3469c8cfa26480f3e5e1ee08c40eae07048c9a967c65aeda26e774511ccc70b3f10a604c01753c6ef24361f0fc8
+ languageName: node
+ linkType: hard
+
+"form-data@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "form-data@npm:4.0.0"
+ dependencies:
+ asynckit: ^0.4.0
+ combined-stream: ^1.0.8
+ mime-types: ^2.1.12
+ checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c
+ languageName: node
+ linkType: hard
+
+"fs-extra@npm:^10.0.0":
+ version: 10.0.0
+ resolution: "fs-extra@npm:10.0.0"
+ dependencies:
+ graceful-fs: ^4.2.0
+ jsonfile: ^6.0.1
+ universalify: ^2.0.0
+ checksum: 5285a3d8f34b917cf2b66af8c231a40c1623626e9d701a20051d3337be16c6d7cac94441c8b3732d47a92a2a027886ca93c69b6a4ae6aee3c89650d2a8880c0a
+ languageName: node
+ linkType: hard
+
+"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "fs-minipass@npm:2.1.0"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1
+ languageName: node
+ linkType: hard
+
+"fs.realpath@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "fs.realpath@npm:1.0.0"
+ checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0
+ languageName: node
+ linkType: hard
+
+"fsevents@npm:~2.3.1, fsevents@npm:~2.3.2":
+ version: 2.3.2
+ resolution: "fsevents@npm:2.3.2"
+ dependencies:
+ node-gyp: latest
+ checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"fsevents@patch:fsevents@~2.3.1#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>":
+ version: 2.3.2
+ resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=df0bf1"
+ dependencies:
+ node-gyp: latest
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"function-bind@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "function-bind@npm:1.1.1"
+ checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a
+ languageName: node
+ linkType: hard
+
+"gauge@npm:^4.0.3":
+ version: 4.0.4
+ resolution: "gauge@npm:4.0.4"
+ dependencies:
+ aproba: ^1.0.3 || ^2.0.0
+ color-support: ^1.1.3
+ console-control-strings: ^1.1.0
+ has-unicode: ^2.0.1
+ signal-exit: ^3.0.7
+ string-width: ^4.2.3
+ strip-ansi: ^6.0.1
+ wide-align: ^1.1.5
+ checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d
+ languageName: node
+ linkType: hard
+
+"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "get-intrinsic@npm:1.1.1"
+ dependencies:
+ function-bind: ^1.1.1
+ has: ^1.0.3
+ has-symbols: ^1.0.1
+ checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17
+ languageName: node
+ linkType: hard
+
+"get-orientation@npm:1.1.2":
+ version: 1.1.2
+ resolution: "get-orientation@npm:1.1.2"
+ dependencies:
+ stream-parser: ^0.3.1
+ checksum: 4b6b9ca03b74a3aeebc56a78898fe1598a188d5026ce77fae7c41b49bccc9993b0e15d694fbe9eda4735c0e1cf2fae119f819faacba64c1b68254f47b3d04612
+ languageName: node
+ linkType: hard
+
+"get-symbol-description@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "get-symbol-description@npm:1.0.0"
+ dependencies:
+ call-bind: ^1.0.2
+ get-intrinsic: ^1.1.1
+ checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2":
+ version: 5.1.2
+ resolution: "glob-parent@npm:5.1.2"
+ dependencies:
+ is-glob: ^4.0.1
+ checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:^6.0.1":
+ version: 6.0.2
+ resolution: "glob-parent@npm:6.0.2"
+ dependencies:
+ is-glob: ^4.0.3
+ checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8
+ languageName: node
+ linkType: hard
+
+"glob-to-regexp@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "glob-to-regexp@npm:0.4.1"
+ checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167
+ languageName: node
+ linkType: hard
+
+"glob@npm:^7.0.0, glob@npm:^7.1.3":
+ version: 7.2.0
+ resolution: "glob@npm:7.2.0"
+ dependencies:
+ fs.realpath: ^1.0.0
+ inflight: ^1.0.4
+ inherits: 2
+ minimatch: ^3.0.4
+ once: ^1.3.0
+ path-is-absolute: ^1.0.0
+ checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134
+ languageName: node
+ linkType: hard
+
+"glob@npm:^7.1.4":
+ version: 7.2.3
+ resolution: "glob@npm:7.2.3"
+ dependencies:
+ fs.realpath: ^1.0.0
+ inflight: ^1.0.4
+ inherits: 2
+ minimatch: ^3.1.1
+ once: ^1.3.0
+ path-is-absolute: ^1.0.0
+ checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133
+ languageName: node
+ linkType: hard
+
+"glob@npm:^8.0.1":
+ version: 8.0.3
+ resolution: "glob@npm:8.0.3"
+ dependencies:
+ fs.realpath: ^1.0.0
+ inflight: ^1.0.4
+ inherits: 2
+ minimatch: ^5.0.1
+ once: ^1.3.0
+ checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5
+ languageName: node
+ linkType: hard
+
+"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0":
+ version: 4.2.8
+ resolution: "graceful-fs@npm:4.2.8"
+ checksum: 5d224c8969ad0581d551dfabdb06882706b31af2561bd5e2034b4097e67cc27d05232849b8643866585fd0a41c7af152950f8776f4dd5579e9853733f31461c6
+ languageName: node
+ linkType: hard
+
+"graceful-fs@npm:^4.2.6":
+ version: 4.2.10
+ resolution: "graceful-fs@npm:4.2.10"
+ checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da
+ languageName: node
+ linkType: hard
+
+"has-bigints@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "has-bigints@npm:1.0.1"
+ checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183
+ languageName: node
+ linkType: hard
+
+"has-flag@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "has-flag@npm:3.0.0"
+ checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b
+ languageName: node
+ linkType: hard
+
+"has-flag@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "has-flag@npm:4.0.0"
+ checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad
+ languageName: node
+ linkType: hard
+
+"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "has-symbols@npm:1.0.2"
+ checksum: 2309c426071731be792b5be43b3da6fb4ed7cbe8a9a6bcfca1862587709f01b33d575ce8f5c264c1eaad09fca2f9a8208c0a2be156232629daa2dd0c0740976b
+ languageName: node
+ linkType: hard
+
+"has-tostringtag@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "has-tostringtag@npm:1.0.0"
+ dependencies:
+ has-symbols: ^1.0.2
+ checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c
+ languageName: node
+ linkType: hard
+
+"has-unicode@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "has-unicode@npm:2.0.1"
+ checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400
+ languageName: node
+ linkType: hard
+
+"has@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "has@npm:1.0.3"
+ dependencies:
+ function-bind: ^1.1.1
+ checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792
+ languageName: node
+ linkType: hard
+
+"hash-base@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "hash-base@npm:3.1.0"
+ dependencies:
+ inherits: ^2.0.4
+ readable-stream: ^3.6.0
+ safe-buffer: ^5.2.0
+ checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc
+ languageName: node
+ linkType: hard
+
+"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3":
+ version: 1.1.7
+ resolution: "hash.js@npm:1.1.7"
+ dependencies:
+ inherits: ^2.0.3
+ minimalistic-assert: ^1.0.1
+ checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f
+ languageName: node
+ linkType: hard
+
+"he@npm:1.2.0, he@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "he@npm:1.2.0"
+ bin:
+ he: bin/he
+ checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7
+ languageName: node
+ linkType: hard
+
+"hex-color-regex@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "hex-color-regex@npm:1.1.0"
+ checksum: 44fa1b7a26d745012f3bfeeab8015f60514f72d2fcf10dce33068352456b8d71a2e6bc5a17f933ab470da2c5ab1e3e04b05caf3fefe3c1cabd7e02e516fc8784
+ languageName: node
+ linkType: hard
+
+"hex-rgb@npm:^4.1.0":
+ version: 4.3.0
+ resolution: "hex-rgb@npm:4.3.0"
+ checksum: e654648db8647446f0111c68690d9b340eb192a93c8b2c6789a2b8deb5c20e757515ae209c5ae67074acfddf8575f9fc645d4ffaa0596d859457b08e180d791d
+ languageName: node
+ linkType: hard
+
+"hmac-drbg@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "hmac-drbg@npm:1.0.1"
+ dependencies:
+ hash.js: ^1.0.3
+ minimalistic-assert: ^1.0.0
+ minimalistic-crypto-utils: ^1.0.1
+ checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0
+ languageName: node
+ linkType: hard
+
+"hsl-regex@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "hsl-regex@npm:1.0.0"
+ checksum: de9ee1bf39de1b83cc3fa0fa1cc337f29f14911e79411d66347365c54fab6b109eea2dd741eaa02486e24de31627ad7bf4453f22224fb55a2fe2b58166fa63b8
+ languageName: node
+ linkType: hard
+
+"hsla-regex@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "hsla-regex@npm:1.0.0"
+ checksum: 9aa6eb9ff6c102d2395435aa5d1d91eae20043c4b1497c543d8db501c05f3edacd9a07fb34a987059d7902dba415af4cb4e610f751859ae8e7525df4ffcd085f
+ languageName: node
+ linkType: hard
+
+"html-tags@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "html-tags@npm:3.1.0"
+ checksum: 67587f2d4022390d7bc34b1313773ecb0b0e0c79fb331aa3e20023eb4c862c7188a1ff775d126fcd75f4e4f08f956666a1c57688c4d24d85a77f9d4b1a42f345
+ languageName: node
+ linkType: hard
+
+"http-cache-semantics@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "http-cache-semantics@npm:4.1.0"
+ checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42
+ languageName: node
+ linkType: hard
+
+"http-errors@npm:1.7.3":
+ version: 1.7.3
+ resolution: "http-errors@npm:1.7.3"
+ dependencies:
+ depd: ~1.1.2
+ inherits: 2.0.4
+ setprototypeof: 1.1.1
+ statuses: ">= 1.5.0 < 2"
+ toidentifier: 1.0.0
+ checksum: a59f359473f4b3ea78305beee90d186268d6075432622a46fb7483059068a2dd4c854a20ac8cd438883127e06afb78c1309168bde6cdfeed1e3700eb42487d99
+ languageName: node
+ linkType: hard
+
+"http-proxy-agent@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "http-proxy-agent@npm:5.0.0"
+ dependencies:
+ "@tootallnate/once": 2
+ agent-base: 6
+ debug: 4
+ checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786
+ languageName: node
+ linkType: hard
+
+"https-browserify@npm:1.0.0":
+ version: 1.0.0
+ resolution: "https-browserify@npm:1.0.0"
+ checksum: 09b35353e42069fde2435760d13f8a3fb7dd9105e358270e2e225b8a94f811b461edd17cb57594e5f36ec1218f121c160ddceeec6e8be2d55e01dcbbbed8cbae
+ languageName: node
+ linkType: hard
+
+"https-proxy-agent@npm:^5.0.0":
+ version: 5.0.1
+ resolution: "https-proxy-agent@npm:5.0.1"
+ dependencies:
+ agent-base: 6
+ debug: 4
+ checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765
+ languageName: node
+ linkType: hard
+
+"humanize-ms@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "humanize-ms@npm:1.2.1"
+ dependencies:
+ ms: ^2.0.0
+ checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16
+ languageName: node
+ linkType: hard
+
+"iconv-lite@npm:0.4.24":
+ version: 0.4.24
+ resolution: "iconv-lite@npm:0.4.24"
+ dependencies:
+ safer-buffer: ">= 2.1.2 < 3"
+ checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6
+ languageName: node
+ linkType: hard
+
+"iconv-lite@npm:^0.6.2":
+ version: 0.6.3
+ resolution: "iconv-lite@npm:0.6.3"
+ dependencies:
+ safer-buffer: ">= 2.1.2 < 3.0.0"
+ checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf
+ languageName: node
+ linkType: hard
+
+"ieee754@npm:^1.1.4":
+ version: 1.2.1
+ resolution: "ieee754@npm:1.2.1"
+ checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e
+ languageName: node
+ linkType: hard
+
+"image-size@npm:1.0.0":
+ version: 1.0.0
+ resolution: "image-size@npm:1.0.0"
+ dependencies:
+ queue: 6.0.2
+ bin:
+ image-size: bin/image-size.js
+ checksum: 2d9d1edc43c0fa8effd27c44cd2d1b02ecc963219e78a76ac80b9d363f69c5aa19990cc23a323959ea510742ff07667e231f0852fd57eba5dc5b55432b58106d
+ languageName: node
+ linkType: hard
+
+"import-cwd@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "import-cwd@npm:3.0.0"
+ dependencies:
+ import-from: ^3.0.0
+ checksum: f2c4230e8389605154a390124381f9136811306ae4ba1c8017398c3c6926bc5cf75cf89350372b4938f79792ea373776b4efabd27506440ec301ce34c4e867eb
+ languageName: node
+ linkType: hard
+
+"import-fresh@npm:^3.2.1":
+ version: 3.3.0
+ resolution: "import-fresh@npm:3.3.0"
+ dependencies:
+ parent-module: ^1.0.0
+ resolve-from: ^4.0.0
+ checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa
+ languageName: node
+ linkType: hard
+
+"import-from@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "import-from@npm:3.0.0"
+ dependencies:
+ resolve-from: ^5.0.0
+ checksum: 5040a7400e77e41e2c3bb6b1b123b52a15a284de1ffc03d605879942c00e3a87428499d8d031d554646108a0f77652549411167f6a7788e4fc7027eefccf3356
+ languageName: node
+ linkType: hard
+
+"imurmurhash@npm:^0.1.4":
+ version: 0.1.4
+ resolution: "imurmurhash@npm:0.1.4"
+ checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7
+ languageName: node
+ linkType: hard
+
+"indent-string@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "indent-string@npm:4.0.0"
+ checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612
+ languageName: node
+ linkType: hard
+
+"indexes-of@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "indexes-of@npm:1.0.1"
+ checksum: 4f9799b1739a62f3e02d09f6f4162cf9673025282af7fa36e790146e7f4e216dad3e776a25b08536c093209c9fcb5ea7bd04b082d42686a45f58ff401d6da32e
+ languageName: node
+ linkType: hard
+
+"infer-owner@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "infer-owner@npm:1.0.4"
+ checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89
+ languageName: node
+ linkType: hard
+
+"inflight@npm:^1.0.4":
+ version: 1.0.6
+ resolution: "inflight@npm:1.0.6"
+ dependencies:
+ once: ^1.3.0
+ wrappy: 1
+ checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd
+ languageName: node
+ linkType: hard
+
+"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4":
+ version: 2.0.4
+ resolution: "inherits@npm:2.0.4"
+ checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
+ languageName: node
+ linkType: hard
+
+"internal-slot@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "internal-slot@npm:1.0.3"
+ dependencies:
+ get-intrinsic: ^1.1.0
+ has: ^1.0.3
+ side-channel: ^1.0.4
+ checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf
+ languageName: node
+ linkType: hard
+
+"ip@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "ip@npm:2.0.0"
+ checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349
+ languageName: node
+ linkType: hard
+
+"is-arguments@npm:^1.0.4":
+ version: 1.1.1
+ resolution: "is-arguments@npm:1.1.1"
+ dependencies:
+ call-bind: ^1.0.2
+ has-tostringtag: ^1.0.0
+ checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27
+ languageName: node
+ linkType: hard
+
+"is-arrayish@npm:^0.2.1":
+ version: 0.2.1
+ resolution: "is-arrayish@npm:0.2.1"
+ checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f
+ languageName: node
+ linkType: hard
+
+"is-arrayish@npm:^0.3.1":
+ version: 0.3.2
+ resolution: "is-arrayish@npm:0.3.2"
+ checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f
+ languageName: node
+ linkType: hard
+
+"is-bigint@npm:^1.0.1":
+ version: 1.0.4
+ resolution: "is-bigint@npm:1.0.4"
+ dependencies:
+ has-bigints: ^1.0.1
+ checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666
+ languageName: node
+ linkType: hard
+
+"is-binary-path@npm:~2.1.0":
+ version: 2.1.0
+ resolution: "is-binary-path@npm:2.1.0"
+ dependencies:
+ binary-extensions: ^2.0.0
+ checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c
+ languageName: node
+ linkType: hard
+
+"is-boolean-object@npm:^1.1.0":
+ version: 1.1.2
+ resolution: "is-boolean-object@npm:1.1.2"
+ dependencies:
+ call-bind: ^1.0.2
+ has-tostringtag: ^1.0.0
+ checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222
+ languageName: node
+ linkType: hard
+
+"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4":
+ version: 1.2.4
+ resolution: "is-callable@npm:1.2.4"
+ checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f
+ languageName: node
+ linkType: hard
+
+"is-color-stop@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "is-color-stop@npm:1.1.0"
+ dependencies:
+ css-color-names: ^0.0.4
+ hex-color-regex: ^1.1.0
+ hsl-regex: ^1.0.0
+ hsla-regex: ^1.0.0
+ rgb-regex: ^1.0.1
+ rgba-regex: ^1.0.0
+ checksum: 778dd52a603ab8da827925aa4200fe6733b667b216495a04110f038b925dc5ef58babe759b94ffc4e44fcf439328695770873937f59d6045f676322b97f3f92d
+ languageName: node
+ linkType: hard
+
+"is-core-module@npm:^2.2.0":
+ version: 2.8.0
+ resolution: "is-core-module@npm:2.8.0"
+ dependencies:
+ has: ^1.0.3
+ checksum: f8b52714891e1a6c6577fcb8d5e057bab064a7a30954aab6beb5092e311473eb8da57afd334de4981dc32409ffca998412efc3a2edceb9e397cef6098d21dd91
+ languageName: node
+ linkType: hard
+
+"is-date-object@npm:^1.0.1":
+ version: 1.0.5
+ resolution: "is-date-object@npm:1.0.5"
+ dependencies:
+ has-tostringtag: ^1.0.0
+ checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc
+ languageName: node
+ linkType: hard
+
+"is-extglob@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "is-extglob@npm:2.1.1"
+ checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85
+ languageName: node
+ linkType: hard
+
+"is-fullwidth-code-point@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "is-fullwidth-code-point@npm:3.0.0"
+ checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348
+ languageName: node
+ linkType: hard
+
+"is-generator-function@npm:^1.0.7":
+ version: 1.0.10
+ resolution: "is-generator-function@npm:1.0.10"
+ dependencies:
+ has-tostringtag: ^1.0.0
+ checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b
+ languageName: node
+ linkType: hard
+
+"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
+ version: 4.0.3
+ resolution: "is-glob@npm:4.0.3"
+ dependencies:
+ is-extglob: ^2.1.1
+ checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4
+ languageName: node
+ linkType: hard
+
+"is-lambda@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "is-lambda@npm:1.0.1"
+ checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35
+ languageName: node
+ linkType: hard
+
+"is-nan@npm:^1.2.1":
+ version: 1.3.2
+ resolution: "is-nan@npm:1.3.2"
+ dependencies:
+ call-bind: ^1.0.0
+ define-properties: ^1.1.3
+ checksum: 5dfadcef6ad12d3029d43643d9800adbba21cf3ce2ec849f734b0e14ee8da4070d82b15fdb35138716d02587c6578225b9a22779cab34888a139cc43e4e3610a
+ languageName: node
+ linkType: hard
+
+"is-negative-zero@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "is-negative-zero@npm:2.0.1"
+ checksum: a46f2e0cb5e16fdb8f2011ed488979386d7e68d381966682e3f4c98fc126efe47f26827912baca2d06a02a644aee458b9cba307fb389f6b161e759125db7a3b8
+ languageName: node
+ linkType: hard
+
+"is-number-object@npm:^1.0.4":
+ version: 1.0.6
+ resolution: "is-number-object@npm:1.0.6"
+ dependencies:
+ has-tostringtag: ^1.0.0
+ checksum: c697704e8fc2027fc41cb81d29805de4e8b6dc9c3efee93741dbf126a8ecc8443fef85adbc581415ae7e55d325e51d0a942324ae35c829131748cce39cba55f3
+ languageName: node
+ linkType: hard
+
+"is-number@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "is-number@npm:7.0.0"
+ checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a
+ languageName: node
+ linkType: hard
+
+"is-regex@npm:^1.1.4":
+ version: 1.1.4
+ resolution: "is-regex@npm:1.1.4"
+ dependencies:
+ call-bind: ^1.0.2
+ has-tostringtag: ^1.0.0
+ checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652
+ languageName: node
+ linkType: hard
+
+"is-shared-array-buffer@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "is-shared-array-buffer@npm:1.0.1"
+ checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90
+ languageName: node
+ linkType: hard
+
+"is-string@npm:^1.0.5, is-string@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "is-string@npm:1.0.7"
+ dependencies:
+ has-tostringtag: ^1.0.0
+ checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989
+ languageName: node
+ linkType: hard
+
+"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "is-symbol@npm:1.0.4"
+ dependencies:
+ has-symbols: ^1.0.2
+ checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510
+ languageName: node
+ linkType: hard
+
+"is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.7":
+ version: 1.1.8
+ resolution: "is-typed-array@npm:1.1.8"
+ dependencies:
+ available-typed-arrays: ^1.0.5
+ call-bind: ^1.0.2
+ es-abstract: ^1.18.5
+ foreach: ^2.0.5
+ has-tostringtag: ^1.0.0
+ checksum: aa0f9f0716e19e2fb8aef69e69e4205479d25ace778e2339fc910948115cde4b0d9aff9d5d1e8b80f09a5664998278e05e54ad3dc9cb12cefcf86db71084ed00
+ languageName: node
+ linkType: hard
+
+"is-weakref@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "is-weakref@npm:1.0.1"
+ dependencies:
+ call-bind: ^1.0.0
+ checksum: fdafb7b955671dd2f9658ff47c86e4025c0650fc68a3542a40e5a75898a763b1abd6b1e1f9f13207eed49541cdd76af67d73c44989ea358b201b70274cf8f6c1
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "isexe@npm:2.0.0"
+ checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62
+ languageName: node
+ linkType: hard
+
+"jest-worker@npm:27.0.0-next.5":
+ version: 27.0.0-next.5
+ resolution: "jest-worker@npm:27.0.0-next.5"
+ dependencies:
+ "@types/node": "*"
+ merge-stream: ^2.0.0
+ supports-color: ^8.0.0
+ checksum: d56bfe67cdb32472d5ffe120bf4956a158155f8d7083c2ef258dc6b498a77d80cbee9aa029bbfb7e72f49e2de0c0dfbf5f76b48d39573f7d020578739ac5ea0d
+ languageName: node
+ linkType: hard
+
+"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "js-tokens@npm:4.0.0"
+ checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78
+ languageName: node
+ linkType: hard
+
+"json-parse-even-better-errors@npm:^2.3.0":
+ version: 2.3.1
+ resolution: "json-parse-even-better-errors@npm:2.3.1"
+ checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f
+ languageName: node
+ linkType: hard
+
+"json5@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "json5@npm:1.0.1"
+ dependencies:
+ minimist: ^1.2.0
+ bin:
+ json5: lib/cli.js
+ checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3
+ languageName: node
+ linkType: hard
+
+"jsonfile@npm:^6.0.1":
+ version: 6.1.0
+ resolution: "jsonfile@npm:6.1.0"
+ dependencies:
+ graceful-fs: ^4.1.6
+ universalify: ^2.0.0
+ dependenciesMeta:
+ graceful-fs:
+ optional: true
+ checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354
+ languageName: node
+ linkType: hard
+
+"lilconfig@npm:^2.0.3":
+ version: 2.0.4
+ resolution: "lilconfig@npm:2.0.4"
+ checksum: 02ae530aa49218d782eb79e92c600ea5220828987f85aa3403fa512cadc7efe38c0ac7d0cd2edf600ad3fae1f6c1752f5b4bb78c0d9950435b044d53d507c9e1
+ languageName: node
+ linkType: hard
+
+"lines-and-columns@npm:^1.1.6":
+ version: 1.1.6
+ resolution: "lines-and-columns@npm:1.1.6"
+ checksum: 198a5436b1fa5cf703bae719c01c686b076f0ad7e1aafd95a58d626cabff302dc0414822126f2f80b58a8c3d66cda8a7b6da064f27130f87e1d3506d6dfd0d68
+ languageName: node
+ linkType: hard
+
+"loader-utils@npm:1.2.3":
+ version: 1.2.3
+ resolution: "loader-utils@npm:1.2.3"
+ dependencies:
+ big.js: ^5.2.2
+ emojis-list: ^2.0.0
+ json5: ^1.0.1
+ checksum: 385407fc2683b6d664276fd41df962296de4a15030bb24389de77b175570c3b56bd896869376ba14cf8b33a9e257e17a91d395739ba7e23b5b68a8749a41df7e
+ languageName: node
+ linkType: hard
+
+"locate-path@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "locate-path@npm:5.0.0"
+ dependencies:
+ p-locate: ^4.1.0
+ checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30
+ languageName: node
+ linkType: hard
+
+"lodash.castarray@npm:^4.4.0":
+ version: 4.4.0
+ resolution: "lodash.castarray@npm:4.4.0"
+ checksum: fca8c7047e0ae2738b0b2503fb00157ae0ff6d8a1b716f87ed715b22560e09de438c75b65e01a7e44ceb41c5b31dce2eb576e46db04beb9c699c498e03cbd00f
+ languageName: node
+ linkType: hard
+
+"lodash.isplainobject@npm:^4.0.6":
+ version: 4.0.6
+ resolution: "lodash.isplainobject@npm:4.0.6"
+ checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337
+ languageName: node
+ linkType: hard
+
+"lodash.merge@npm:^4.6.2":
+ version: 4.6.2
+ resolution: "lodash.merge@npm:4.6.2"
+ checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005
+ languageName: node
+ linkType: hard
+
+"lodash.sortby@npm:^4.7.0":
+ version: 4.7.0
+ resolution: "lodash.sortby@npm:4.7.0"
+ checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c
+ languageName: node
+ linkType: hard
+
+"lodash.topath@npm:^4.5.2":
+ version: 4.5.2
+ resolution: "lodash.topath@npm:4.5.2"
+ checksum: 04583e220f4bb1c4ac0008ff8f46d9cb4ddce0ea1090085790da30a41f4cb1b904d885cb73257fca619fa825cd96f9bb97c67d039635cb76056e18f5e08bfdee
+ languageName: node
+ linkType: hard
+
+"lodash.uniq@npm:^4.5.0":
+ version: 4.5.0
+ resolution: "lodash.uniq@npm:4.5.0"
+ checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d
+ languageName: node
+ linkType: hard
+
+"lodash@npm:^4.17.11, lodash@npm:^4.17.21":
+ version: 4.17.21
+ resolution: "lodash@npm:4.17.21"
+ checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7
+ languageName: node
+ linkType: hard
+
+"loose-envify@npm:^1.1.0":
+ version: 1.4.0
+ resolution: "loose-envify@npm:1.4.0"
+ dependencies:
+ js-tokens: ^3.0.0 || ^4.0.0
+ bin:
+ loose-envify: cli.js
+ checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4
+ languageName: node
+ linkType: hard
+
+"lru-cache@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "lru-cache@npm:6.0.0"
+ dependencies:
+ yallist: ^4.0.0
+ checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297
+ languageName: node
+ linkType: hard
+
+"lru-cache@npm:^7.7.1":
+ version: 7.14.1
+ resolution: "lru-cache@npm:7.14.1"
+ checksum: d72c6713c6a6d86836a7a6523b3f1ac6764768cca47ec99341c3e76db06aacd4764620e5e2cda719a36848785a52a70e531822dc2b33fb071fa709683746c104
+ languageName: node
+ linkType: hard
+
+"make-dir@npm:^3.0.2":
+ version: 3.1.0
+ resolution: "make-dir@npm:3.1.0"
+ dependencies:
+ semver: ^6.0.0
+ checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78
+ languageName: node
+ linkType: hard
+
+"make-fetch-happen@npm:^10.0.3":
+ version: 10.2.1
+ resolution: "make-fetch-happen@npm:10.2.1"
+ dependencies:
+ agentkeepalive: ^4.2.1
+ cacache: ^16.1.0
+ http-cache-semantics: ^4.1.0
+ http-proxy-agent: ^5.0.0
+ https-proxy-agent: ^5.0.0
+ is-lambda: ^1.0.1
+ lru-cache: ^7.7.1
+ minipass: ^3.1.6
+ minipass-collect: ^1.0.2
+ minipass-fetch: ^2.0.3
+ minipass-flush: ^1.0.5
+ minipass-pipeline: ^1.2.4
+ negotiator: ^0.6.3
+ promise-retry: ^2.0.1
+ socks-proxy-agent: ^7.0.0
+ ssri: ^9.0.0
+ checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c
+ languageName: node
+ linkType: hard
+
+"md5.js@npm:^1.3.4":
+ version: 1.3.5
+ resolution: "md5.js@npm:1.3.5"
+ dependencies:
+ hash-base: ^3.0.0
+ inherits: ^2.0.1
+ safe-buffer: ^5.1.2
+ checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c
+ languageName: node
+ linkType: hard
+
+"merge-stream@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "merge-stream@npm:2.0.0"
+ checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4
+ languageName: node
+ linkType: hard
+
+"merge2@npm:^1.3.0":
+ version: 1.4.1
+ resolution: "merge2@npm:1.4.1"
+ checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2
+ languageName: node
+ linkType: hard
+
+"micromatch@npm:^4.0.4":
+ version: 4.0.4
+ resolution: "micromatch@npm:4.0.4"
+ dependencies:
+ braces: ^3.0.1
+ picomatch: ^2.2.3
+ checksum: ef3d1c88e79e0a68b0e94a03137676f3324ac18a908c245a9e5936f838079fcc108ac7170a5fadc265a9c2596963462e402841406bda1a4bb7b68805601d631c
+ languageName: node
+ linkType: hard
+
+"miller-rabin@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "miller-rabin@npm:4.0.1"
+ dependencies:
+ bn.js: ^4.0.0
+ brorand: ^1.0.1
+ bin:
+ miller-rabin: bin/miller-rabin
+ checksum: 00cd1ab838ac49b03f236cc32a14d29d7d28637a53096bf5c6246a032a37749c9bd9ce7360cbf55b41b89b7d649824949ff12bc8eee29ac77c6b38eada619ece
+ languageName: node
+ linkType: hard
+
+"mime-db@npm:1.52.0":
+ version: 1.52.0
+ resolution: "mime-db@npm:1.52.0"
+ checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f
+ languageName: node
+ linkType: hard
+
+"mime-types@npm:^2.1.12":
+ version: 2.1.35
+ resolution: "mime-types@npm:2.1.35"
+ dependencies:
+ mime-db: 1.52.0
+ checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836
+ languageName: node
+ linkType: hard
+
+"mini-svg-data-uri@npm:^1.0.3":
+ version: 1.4.3
+ resolution: "mini-svg-data-uri@npm:1.4.3"
+ bin:
+ mini-svg-data-uri: cli.js
+ checksum: bd1789c34907a36ae9157897b7c7f6ad700e71c8cb6d725bb2810ce6211abcaa3717333ca17408f6f8b2a44055e571cd5b78d478688e1864513cb7f8e023ae3f
+ languageName: node
+ linkType: hard
+
+"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "minimalistic-assert@npm:1.0.1"
+ checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7
+ languageName: node
+ linkType: hard
+
+"minimalistic-crypto-utils@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "minimalistic-crypto-utils@npm:1.0.1"
+ checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^3.0.4":
+ version: 3.0.4
+ resolution: "minimatch@npm:3.0.4"
+ dependencies:
+ brace-expansion: ^1.1.7
+ checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^3.1.1":
+ version: 3.1.2
+ resolution: "minimatch@npm:3.1.2"
+ dependencies:
+ brace-expansion: ^1.1.7
+ checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^5.0.1":
+ version: 5.1.1
+ resolution: "minimatch@npm:5.1.1"
+ dependencies:
+ brace-expansion: ^2.0.1
+ checksum: 215edd0978320a3354188f84a537d45841f2449af4df4379f79b9b777e71aa4f5722cc9d1717eabd2a70d38ef76ab7b708d24d83ea6a6c909dfd8833de98b437
+ languageName: node
+ linkType: hard
+
+"minimist@npm:^1.1.1, minimist@npm:^1.2.0":
+ version: 1.2.5
+ resolution: "minimist@npm:1.2.5"
+ checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52
+ languageName: node
+ linkType: hard
+
+"minipass-collect@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "minipass-collect@npm:1.0.2"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10
+ languageName: node
+ linkType: hard
+
+"minipass-fetch@npm:^2.0.3":
+ version: 2.1.2
+ resolution: "minipass-fetch@npm:2.1.2"
+ dependencies:
+ encoding: ^0.1.13
+ minipass: ^3.1.6
+ minipass-sized: ^1.0.3
+ minizlib: ^2.1.2
+ dependenciesMeta:
+ encoding:
+ optional: true
+ checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91
+ languageName: node
+ linkType: hard
+
+"minipass-flush@npm:^1.0.5":
+ version: 1.0.5
+ resolution: "minipass-flush@npm:1.0.5"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf
+ languageName: node
+ linkType: hard
+
+"minipass-pipeline@npm:^1.2.4":
+ version: 1.2.4
+ resolution: "minipass-pipeline@npm:1.2.4"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b
+ languageName: node
+ linkType: hard
+
+"minipass-sized@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "minipass-sized@npm:1.0.3"
+ dependencies:
+ minipass: ^3.0.0
+ checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6":
+ version: 3.3.6
+ resolution: "minipass@npm:3.3.6"
+ dependencies:
+ yallist: ^4.0.0
+ checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48
+ languageName: node
+ linkType: hard
+
+"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "minizlib@npm:2.1.2"
+ dependencies:
+ minipass: ^3.0.0
+ yallist: ^4.0.0
+ checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3
+ languageName: node
+ linkType: hard
+
+"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "mkdirp@npm:1.0.4"
+ bin:
+ mkdirp: bin/cmd.js
+ checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f
+ languageName: node
+ linkType: hard
+
+"modern-normalize@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "modern-normalize@npm:1.1.0"
+ checksum: edfd40650bd7250eb4761651886a02ca3c524effca41b9832932eab9ccf9f2cfa7e5da8491c7c8bc2d58e1696e5e765adebeaf90cd9d3376444bd6bc0b0f2c99
+ languageName: node
+ linkType: hard
+
+"ms@npm:2.0.0":
+ version: 2.0.0
+ resolution: "ms@npm:2.0.0"
+ checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4
+ languageName: node
+ linkType: hard
+
+"ms@npm:2.1.2":
+ version: 2.1.2
+ resolution: "ms@npm:2.1.2"
+ checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f
+ languageName: node
+ linkType: hard
+
+"ms@npm:^2.0.0":
+ version: 2.1.3
+ resolution: "ms@npm:2.1.3"
+ checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
+ languageName: node
+ linkType: hard
+
+"nanoid@npm:^3.1.23, nanoid@npm:^3.1.30":
+ version: 3.1.30
+ resolution: "nanoid@npm:3.1.30"
+ bin:
+ nanoid: bin/nanoid.cjs
+ checksum: 276d0d4b0c41c46aeefec5f09f093e4085a2352d06881c845db22b84f8ef72cc8defae6d76bfb1d8a2a128eb2dec42ab148d16582be4e7754c97905806ef57b6
+ languageName: node
+ linkType: hard
+
+"negotiator@npm:^0.6.3":
+ version: 0.6.3
+ resolution: "negotiator@npm:0.6.3"
+ checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
+ languageName: node
+ linkType: hard
+
+"next@npm:12.0.3":
+ version: 12.0.3
+ resolution: "next@npm:12.0.3"
+ dependencies:
+ "@babel/runtime": 7.15.4
+ "@hapi/accept": 5.0.2
+ "@napi-rs/triples": 1.0.3
+ "@next/env": 12.0.3
+ "@next/polyfill-module": 12.0.3
+ "@next/react-dev-overlay": 12.0.3
+ "@next/react-refresh-utils": 12.0.3
+ "@next/swc-android-arm64": 12.0.3
+ "@next/swc-darwin-arm64": 12.0.3
+ "@next/swc-darwin-x64": 12.0.3
+ "@next/swc-linux-arm-gnueabihf": 12.0.3
+ "@next/swc-linux-arm64-gnu": 12.0.3
+ "@next/swc-linux-arm64-musl": 12.0.3
+ "@next/swc-linux-x64-gnu": 12.0.3
+ "@next/swc-linux-x64-musl": 12.0.3
+ "@next/swc-win32-arm64-msvc": 12.0.3
+ "@next/swc-win32-ia32-msvc": 12.0.3
+ "@next/swc-win32-x64-msvc": 12.0.3
+ acorn: 8.5.0
+ assert: 2.0.0
+ browserify-zlib: 0.2.0
+ browserslist: 4.16.6
+ buffer: 5.6.0
+ caniuse-lite: ^1.0.30001228
+ chalk: 2.4.2
+ chokidar: 3.5.1
+ constants-browserify: 1.0.0
+ crypto-browserify: 3.12.0
+ cssnano-simple: 3.0.0
+ domain-browser: 4.19.0
+ encoding: 0.1.13
+ etag: 1.8.1
+ events: 3.3.0
+ find-cache-dir: 3.3.1
+ get-orientation: 1.1.2
+ https-browserify: 1.0.0
+ image-size: 1.0.0
+ jest-worker: 27.0.0-next.5
+ node-fetch: 2.6.1
+ node-html-parser: 1.4.9
+ os-browserify: 0.3.0
+ p-limit: 3.1.0
+ path-browserify: 1.0.1
+ postcss: 8.2.15
+ process: 0.11.10
+ querystring-es3: 0.2.1
+ raw-body: 2.4.1
+ react-is: 17.0.2
+ react-refresh: 0.8.3
+ regenerator-runtime: 0.13.4
+ stream-browserify: 3.0.0
+ stream-http: 3.1.1
+ string_decoder: 1.3.0
+ styled-jsx: 5.0.0-beta.3
+ timers-browserify: 2.0.12
+ tty-browserify: 0.0.1
+ use-subscription: 1.5.1
+ util: 0.12.4
+ vm-browserify: 1.1.2
+ watchpack: 2.1.1
+ peerDependencies:
+ fibers: ">= 3.1.0"
+ node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0
+ react: ^17.0.2 || ^18.0.0
+ react-dom: ^17.0.2 || ^18.0.0
+ sass: ^1.3.0
+ dependenciesMeta:
+ "@next/swc-android-arm64":
+ optional: true
+ "@next/swc-darwin-arm64":
+ optional: true
+ "@next/swc-darwin-x64":
+ optional: true
+ "@next/swc-linux-arm-gnueabihf":
+ optional: true
+ "@next/swc-linux-arm64-gnu":
+ optional: true
+ "@next/swc-linux-arm64-musl":
+ optional: true
+ "@next/swc-linux-x64-gnu":
+ optional: true
+ "@next/swc-linux-x64-musl":
+ optional: true
+ "@next/swc-win32-arm64-msvc":
+ optional: true
+ "@next/swc-win32-ia32-msvc":
+ optional: true
+ "@next/swc-win32-x64-msvc":
+ optional: true
+ peerDependenciesMeta:
+ fibers:
+ optional: true
+ node-sass:
+ optional: true
+ sass:
+ optional: true
+ bin:
+ next: dist/bin/next
+ checksum: 68be20fdc9a681ad3d705666b500bbac9fdec9700272810e1eb3733cb77fe4ac01879aca15859ed217c123629cec3798bec3245e5e07b9011bc8b0ab8a6853a6
+ languageName: node
+ linkType: hard
+
+"node-emoji@npm:^1.11.0":
+ version: 1.11.0
+ resolution: "node-emoji@npm:1.11.0"
+ dependencies:
+ lodash: ^4.17.21
+ checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b
+ languageName: node
+ linkType: hard
+
+"node-fetch@npm:2.6.1":
+ version: 2.6.1
+ resolution: "node-fetch@npm:2.6.1"
+ checksum: 91075bedd57879117e310fbcc36983ad5d699e522edb1ebcdc4ee5294c982843982652925c3532729fdc86b2d64a8a827797a745f332040d91823c8752ee4d7c
+ languageName: node
+ linkType: hard
+
+"node-gyp@npm:latest":
+ version: 9.3.0
+ resolution: "node-gyp@npm:9.3.0"
+ dependencies:
+ env-paths: ^2.2.0
+ glob: ^7.1.4
+ graceful-fs: ^4.2.6
+ make-fetch-happen: ^10.0.3
+ nopt: ^6.0.0
+ npmlog: ^6.0.0
+ rimraf: ^3.0.2
+ semver: ^7.3.5
+ tar: ^6.1.2
+ which: ^2.0.2
+ bin:
+ node-gyp: bin/node-gyp.js
+ checksum: 589ddd3ed967724ef425f9624bfa47cf73022640ab3eba6d556e92cdc4ddef33b63fce3a467c93b995a3f61df92eafd3c3d1e8dbe4a2c00c383334487dea99c3
+ languageName: node
+ linkType: hard
+
+"node-html-parser@npm:1.4.9":
+ version: 1.4.9
+ resolution: "node-html-parser@npm:1.4.9"
+ dependencies:
+ he: 1.2.0
+ checksum: fbcf5ea22f266b36a4761d448d3db7bcee6d7570e3a8ec38cbde223fe3d705cda1df8c287907520ae2d6bac8f68ef4dacdb5fd76c375c13c50bc746e980f4a91
+ languageName: node
+ linkType: hard
+
+"node-releases@npm:^1.1.71":
+ version: 1.1.77
+ resolution: "node-releases@npm:1.1.77"
+ checksum: eb2fcb45310e7d77f82bfdadeca546a698d258e011f15d88ad9a452a5e838a672ec532906581096ca19c66284a788330c3b09227ffc540e67228730f41b9c2e2
+ languageName: node
+ linkType: hard
+
+"node-releases@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "node-releases@npm:2.0.1"
+ checksum: b20dd8d4bced11f75060f0387e05e76b9dc4a0451f7bb3516eade6f50499ea7768ba95d8a60d520c193402df1e58cb3fe301510cc1c1ad68949c3d57b5149866
+ languageName: node
+ linkType: hard
+
+"nopt@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "nopt@npm:6.0.0"
+ dependencies:
+ abbrev: ^1.0.0
+ bin:
+ nopt: bin/nopt.js
+ checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac
+ languageName: node
+ linkType: hard
+
+"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0":
+ version: 3.0.0
+ resolution: "normalize-path@npm:3.0.0"
+ checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20
+ languageName: node
+ linkType: hard
+
+"normalize-range@npm:^0.1.2":
+ version: 0.1.2
+ resolution: "normalize-range@npm:0.1.2"
+ checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184
+ languageName: node
+ linkType: hard
+
+"npmlog@npm:^6.0.0":
+ version: 6.0.2
+ resolution: "npmlog@npm:6.0.2"
+ dependencies:
+ are-we-there-yet: ^3.0.0
+ console-control-strings: ^1.1.0
+ gauge: ^4.0.3
+ set-blocking: ^2.0.0
+ checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a
+ languageName: node
+ linkType: hard
+
+"num2fraction@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "num2fraction@npm:1.2.2"
+ checksum: 1da9c6797b505d3f5b17c7f694c4fa31565bdd5c0e5d669553253aed848a580804cd285280e8a73148bd9628839267daee4967f24b53d4e893e44b563e412635
+ languageName: node
+ linkType: hard
+
+"object-assign@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "object-assign@npm:4.1.1"
+ checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
+ languageName: node
+ linkType: hard
+
+"object-hash@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "object-hash@npm:2.2.0"
+ checksum: 55ba841e3adce9c4f1b9b46b41983eda40f854e0d01af2802d3ae18a7085a17168d6b81731d43fdf1d6bcbb3c9f9c56d22c8fea992203ad90a38d7d919bc28f1
+ languageName: node
+ linkType: hard
+
+"object-inspect@npm:^1.11.0, object-inspect@npm:^1.9.0":
+ version: 1.11.0
+ resolution: "object-inspect@npm:1.11.0"
+ checksum: 8c64f89ce3a7b96b6925879ad5f6af71d498abc217e136660efecd97452991216f375a7eb47cb1cb50643df939bf0c7cc391567b7abc6a924d04679705e58e27
+ languageName: node
+ linkType: hard
+
+"object-is@npm:^1.0.1":
+ version: 1.1.5
+ resolution: "object-is@npm:1.1.5"
+ dependencies:
+ call-bind: ^1.0.2
+ define-properties: ^1.1.3
+ checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe
+ languageName: node
+ linkType: hard
+
+"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "object-keys@npm:1.1.1"
+ checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a
+ languageName: node
+ linkType: hard
+
+"object.assign@npm:^4.1.2":
+ version: 4.1.2
+ resolution: "object.assign@npm:4.1.2"
+ dependencies:
+ call-bind: ^1.0.0
+ define-properties: ^1.1.3
+ has-symbols: ^1.0.1
+ object-keys: ^1.1.1
+ checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814
+ languageName: node
+ linkType: hard
+
+"once@npm:^1.3.0":
+ version: 1.4.0
+ resolution: "once@npm:1.4.0"
+ dependencies:
+ wrappy: 1
+ checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68
+ languageName: node
+ linkType: hard
+
+"os-browserify@npm:0.3.0":
+ version: 0.3.0
+ resolution: "os-browserify@npm:0.3.0"
+ checksum: 16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf
+ languageName: node
+ linkType: hard
+
+"p-limit@npm:3.1.0":
+ version: 3.1.0
+ resolution: "p-limit@npm:3.1.0"
+ dependencies:
+ yocto-queue: ^0.1.0
+ checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360
+ languageName: node
+ linkType: hard
+
+"p-limit@npm:^2.2.0":
+ version: 2.3.0
+ resolution: "p-limit@npm:2.3.0"
+ dependencies:
+ p-try: ^2.0.0
+ checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1
+ languageName: node
+ linkType: hard
+
+"p-locate@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "p-locate@npm:4.1.0"
+ dependencies:
+ p-limit: ^2.2.0
+ checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870
+ languageName: node
+ linkType: hard
+
+"p-map@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "p-map@npm:4.0.0"
+ dependencies:
+ aggregate-error: ^3.0.0
+ checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c
+ languageName: node
+ linkType: hard
+
+"p-try@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "p-try@npm:2.2.0"
+ checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae
+ languageName: node
+ linkType: hard
+
+"pako@npm:~1.0.5":
+ version: 1.0.11
+ resolution: "pako@npm:1.0.11"
+ checksum: 1be2bfa1f807608c7538afa15d6f25baa523c30ec870a3228a89579e474a4d992f4293859524e46d5d87fd30fa17c5edf34dbef0671251d9749820b488660b16
+ languageName: node
+ linkType: hard
+
+"parent-module@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "parent-module@npm:1.0.1"
+ dependencies:
+ callsites: ^3.0.0
+ checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff
+ languageName: node
+ linkType: hard
+
+"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5":
+ version: 5.1.6
+ resolution: "parse-asn1@npm:5.1.6"
+ dependencies:
+ asn1.js: ^5.2.0
+ browserify-aes: ^1.0.0
+ evp_bytestokey: ^1.0.0
+ pbkdf2: ^3.0.3
+ safe-buffer: ^5.1.1
+ checksum: 9243311d1f88089bc9f2158972aa38d1abd5452f7b7cabf84954ed766048fe574d434d82c6f5a39b988683e96fb84cd933071dda38927e03469dc8c8d14463c7
+ languageName: node
+ linkType: hard
+
+"parse-json@npm:^5.0.0":
+ version: 5.2.0
+ resolution: "parse-json@npm:5.2.0"
+ dependencies:
+ "@babel/code-frame": ^7.0.0
+ error-ex: ^1.3.1
+ json-parse-even-better-errors: ^2.3.0
+ lines-and-columns: ^1.1.6
+ checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2
+ languageName: node
+ linkType: hard
+
+"path-browserify@npm:1.0.1":
+ version: 1.0.1
+ resolution: "path-browserify@npm:1.0.1"
+ checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699
+ languageName: node
+ linkType: hard
+
+"path-exists@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "path-exists@npm:4.0.0"
+ checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1
+ languageName: node
+ linkType: hard
+
+"path-is-absolute@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "path-is-absolute@npm:1.0.1"
+ checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8
+ languageName: node
+ linkType: hard
+
+"path-parse@npm:^1.0.6":
+ version: 1.0.7
+ resolution: "path-parse@npm:1.0.7"
+ checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a
+ languageName: node
+ linkType: hard
+
+"path-type@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "path-type@npm:4.0.0"
+ checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45
+ languageName: node
+ linkType: hard
+
+"pbkdf2@npm:^3.0.3":
+ version: 3.1.2
+ resolution: "pbkdf2@npm:3.1.2"
+ dependencies:
+ create-hash: ^1.1.2
+ create-hmac: ^1.1.4
+ ripemd160: ^2.0.1
+ safe-buffer: ^5.0.1
+ sha.js: ^2.4.8
+ checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92
+ languageName: node
+ linkType: hard
+
+"picocolors@npm:^0.2.1":
+ version: 0.2.1
+ resolution: "picocolors@npm:0.2.1"
+ checksum: 3b0f441f0062def0c0f39e87b898ae7461c3a16ffc9f974f320b44c799418cabff17780ee647fda42b856a1dc45897e2c62047e1b546d94d6d5c6962f45427b2
+ languageName: node
+ linkType: hard
+
+"picocolors@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "picocolors@npm:1.0.0"
+ checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3":
+ version: 2.3.0
+ resolution: "picomatch@npm:2.3.0"
+ checksum: 16818720ea7c5872b6af110760dee856c8e4cd79aed1c7a006d076b1cc09eff3ae41ca5019966694c33fbd2e1cc6ea617ab10e4adac6df06556168f13be3fca2
+ languageName: node
+ linkType: hard
+
+"pkg-dir@npm:^4.1.0":
+ version: 4.2.0
+ resolution: "pkg-dir@npm:4.2.0"
+ dependencies:
+ find-up: ^4.0.0
+ checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6
+ languageName: node
+ linkType: hard
+
+"platform@npm:1.3.6":
+ version: 1.3.6
+ resolution: "platform@npm:1.3.6"
+ checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e
+ languageName: node
+ linkType: hard
+
+"postcss-attribute-case-insensitive@npm:^4.0.1":
+ version: 4.0.2
+ resolution: "postcss-attribute-case-insensitive@npm:4.0.2"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-selector-parser: ^6.0.2
+ checksum: e9cf4b61f443bf302dcd1110ef38d6a808fa38ae5d85bfd0aaaa6d35bef3825e0434f1aed8eb9596a5d88f21580ce8b9cd0098414d8490293ef71149695cae9a
+ languageName: node
+ linkType: hard
+
+"postcss-color-functional-notation@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "postcss-color-functional-notation@npm:2.0.1"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: 0bfd1fa93bc54a07240d821d091093256511f70f0df5349e27e4d8b034ee3345f0ae58674ce425be6a91cc934325b2ce36ecddbf958fa8805fed6647cf671348
+ languageName: node
+ linkType: hard
+
+"postcss-color-gray@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "postcss-color-gray@npm:5.0.0"
+ dependencies:
+ "@csstools/convert-colors": ^1.4.0
+ postcss: ^7.0.5
+ postcss-values-parser: ^2.0.0
+ checksum: 81a62b3e2c170ffadc085c1643a7b5f1c153837d7ca228b07df88b9aeb0ec9088a92f8d919a748137ead3936e8dac2606e32b14b5166a59143642c8573949db5
+ languageName: node
+ linkType: hard
+
+"postcss-color-hex-alpha@npm:^5.0.3":
+ version: 5.0.3
+ resolution: "postcss-color-hex-alpha@npm:5.0.3"
+ dependencies:
+ postcss: ^7.0.14
+ postcss-values-parser: ^2.0.1
+ checksum: 0a0ccb42c7c6a271ffd3c8b123b9c67744827d4b810b759731bc702fea1e00f05f08479ec7cbd8dfa47bc20510830a69f1e316a5724b9e53d5fdc6fabf90afc4
+ languageName: node
+ linkType: hard
+
+"postcss-color-mod-function@npm:^3.0.3":
+ version: 3.0.3
+ resolution: "postcss-color-mod-function@npm:3.0.3"
+ dependencies:
+ "@csstools/convert-colors": ^1.4.0
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: ecbf74e9395527aaf3e83b90b1a6c9bba0a1904038d8acef1f530d50a68d912d6b1af8df690342f942be8b89fa7dfaa35ae67cb5fb48013cb389ecb8c74deadb
+ languageName: node
+ linkType: hard
+
+"postcss-color-rebeccapurple@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "postcss-color-rebeccapurple@npm:4.0.1"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: a7b1a204dfc5163ac4195cc3cb0c7b1bba9561feab49d24be8a17d695d6b69fd92f3da23d638260fe7e9d5076cf81bb798b25134fa2a2fbf7f74b0dda2829a96
+ languageName: node
+ linkType: hard
+
+"postcss-custom-media@npm:^7.0.8":
+ version: 7.0.8
+ resolution: "postcss-custom-media@npm:7.0.8"
+ dependencies:
+ postcss: ^7.0.14
+ checksum: 3786eb10f238b22dc620cfcc9257779e27d8cee4510b3209d0ab67310e07dc68b69f3359db7a911f5e76df466f73d078fc80100943fe2e8fa9bcacf226705a2d
+ languageName: node
+ linkType: hard
+
+"postcss-custom-properties@npm:^8.0.11":
+ version: 8.0.11
+ resolution: "postcss-custom-properties@npm:8.0.11"
+ dependencies:
+ postcss: ^7.0.17
+ postcss-values-parser: ^2.0.1
+ checksum: cb1b47459a23ff2e48714c5d48d50070d573ef829dc7e57189d1b38c6fba0de7084f1acefbd84c61dd67e30bd9a7d154b22f195547728a9dc5f76f7d3f03ffea
+ languageName: node
+ linkType: hard
+
+"postcss-custom-selectors@npm:^5.1.2":
+ version: 5.1.2
+ resolution: "postcss-custom-selectors@npm:5.1.2"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-selector-parser: ^5.0.0-rc.3
+ checksum: 26c83d348448f4ab5931cc1621606b09a6b1171e25fac2404073f3e298e77494ac87d4a21009679503b4895452810e93e618b5af26b4c7180a9013f283bb8088
+ languageName: node
+ linkType: hard
+
+"postcss-dir-pseudo-class@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "postcss-dir-pseudo-class@npm:5.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-selector-parser: ^5.0.0-rc.3
+ checksum: 703156fc65f259ec2e86ba51d18370a6d3b71f2e6473c7d65694676a8f0152137b1997bc0a53f7f373c8c3e4d63c72f7b5e2049f2ef3a7276b49409395722044
+ languageName: node
+ linkType: hard
+
+"postcss-double-position-gradients@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "postcss-double-position-gradients@npm:1.0.0"
+ dependencies:
+ postcss: ^7.0.5
+ postcss-values-parser: ^2.0.0
+ checksum: d2c4515b38a131ece44dba331aea2b3f9de646e30873b49f03fa8906179a3c43ddc43183bc4df609d8af0834e7c266ec3a63eaa4b3e96aa445d98ecdc12d2544
+ languageName: node
+ linkType: hard
+
+"postcss-env-function@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "postcss-env-function@npm:2.0.2"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: 0cfa2e6cad5123cce39dcf5af332ec3b0e3e09b54d5142225f255914079d2afda3f1052e60f4b6d3bccf7eb9d592325b7421f1ecc6674ccb13c267a721fc3128
+ languageName: node
+ linkType: hard
+
+"postcss-focus-visible@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "postcss-focus-visible@npm:4.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: a3c93fbb578608f60c5256d0989ae32fd9100f76fa053880e82bfeb43751e81a3a9e69bd8338e06579b7f56b230a80fb2cc671eff134f2682dcbec9bbb8658ae
+ languageName: node
+ linkType: hard
+
+"postcss-focus-within@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "postcss-focus-within@npm:3.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 2a31292cd9b929a2dd3171fc4ed287ea4a93c6ec8df1d634503fb97b8b30b33a2970b5e0df60634c60ff887923ab28641b624d566533096950e0a384705e9b90
+ languageName: node
+ linkType: hard
+
+"postcss-font-variant@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "postcss-font-variant@npm:4.0.1"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: d09836cd848e8c24d144484b6b9b175df26dca59e1a1579e790c7f3dcaea00944a8d0b6ac543f4c128de7b30fab9a0aef544d54789b3b55fd850770b172d980d
+ languageName: node
+ linkType: hard
+
+"postcss-gap-properties@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "postcss-gap-properties@npm:2.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: c842d105c9403e34a8fac7bdef33a63fcb6bde038b04b20cae1e719e1966632887545576af99a4a6f302c98ca029c6f0d746419f498ef7f6821177ba676e6c25
+ languageName: node
+ linkType: hard
+
+"postcss-image-set-function@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "postcss-image-set-function@npm:3.0.1"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: 43958d7c1f80077e60e066bdf61bc326bcac64c272f17fd7a0585a6934fb1ffc7ba7f560a39849f597e4d28b8ae3addd9279c7145b9478d2d91a7c54c2fefd8b
+ languageName: node
+ linkType: hard
+
+"postcss-initial@npm:^3.0.0":
+ version: 3.0.4
+ resolution: "postcss-initial@npm:3.0.4"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 710ab6cabc5970912c04314099f5334e7d901235014bb1462657e29f8dc97b6e51caa35f0beba7e5dbe440589ef9c1df13a89bc53d6e6aa664573b945f1630bb
+ languageName: node
+ linkType: hard
+
+"postcss-js@npm:^3.0.3":
+ version: 3.0.3
+ resolution: "postcss-js@npm:3.0.3"
+ dependencies:
+ camelcase-css: ^2.0.1
+ postcss: ^8.1.6
+ checksum: cc17f59f2b9bb22ed1cf9daab1f9944635b0713dce923ff7d9fd10b89393fc9aa1fab43a97f9a71295827fa32c9676d52661d7d6a693ecc0c41541ee928c781e
+ languageName: node
+ linkType: hard
+
+"postcss-lab-function@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "postcss-lab-function@npm:2.0.1"
+ dependencies:
+ "@csstools/convert-colors": ^1.4.0
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: 598229a7a05803b18cccde28114833e910367c5954341bea03c7d7b7b5a667dfb6a77ef9dd4a16d80fdff8b10dd44c478602a7d56e43687c8687af3710b4706f
+ languageName: node
+ linkType: hard
+
+"postcss-load-config@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "postcss-load-config@npm:3.1.0"
+ dependencies:
+ import-cwd: ^3.0.0
+ lilconfig: ^2.0.3
+ yaml: ^1.10.2
+ peerDependencies:
+ ts-node: ">=9.0.0"
+ peerDependenciesMeta:
+ ts-node:
+ optional: true
+ checksum: 7fd62064eab1e0e77ba315d9a782f09f4c62e1025630b53d38a936d5a2730bb632a3f259143115fc639e70d22f14744a75c7a6f471343ebdb03f6a3ef72d2f08
+ languageName: node
+ linkType: hard
+
+"postcss-logical@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "postcss-logical@npm:3.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 5278661b78a093661c9cac8c04666d457734bf156f83d8c67f6034c00e8d4b3a26fce32a8a4a251feae3c7587f42556412dca980e100d0c920ee55e878f7b8ee
+ languageName: node
+ linkType: hard
+
+"postcss-media-minmax@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "postcss-media-minmax@npm:4.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 8a4d94e25089bb5a66c6742bcdd263fce2fea391438151a85b442b7f8b66323bbca552b59a93efd6bcabcfd41845ddd4149bd56d156b008f8d7d04bc84d9fb11
+ languageName: node
+ linkType: hard
+
+"postcss-nested@npm:5.0.6":
+ version: 5.0.6
+ resolution: "postcss-nested@npm:5.0.6"
+ dependencies:
+ postcss-selector-parser: ^6.0.6
+ peerDependencies:
+ postcss: ^8.2.14
+ checksum: dbcbfd11e514f485ac0d2b649b32bcbd855665a88a76f697f8be6c5017aa0260954ecccd2475bbd5865a5d248eae9a4e6e10d2d51927621d05430381aa37e43b
+ languageName: node
+ linkType: hard
+
+"postcss-nesting@npm:^7.0.0":
+ version: 7.0.1
+ resolution: "postcss-nesting@npm:7.0.1"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 4056be95759e8b25477f19aff7202b57dd27eeef41d31f7ca14e4c87d16ffb40e4db3f518fc85bd28b20e183f5e5399b56b52fcc79affd556e13a98bbc678169
+ languageName: node
+ linkType: hard
+
+"postcss-overflow-shorthand@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "postcss-overflow-shorthand@npm:2.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 553be1b7f9645017d33b654f9a436ce4f4406066c3056ca4c7ee06c21c2964fbe3437a9a3f998137efb6a17c1a79ee7e8baa39332c7dd9874aac8b69a3ad08b0
+ languageName: node
+ linkType: hard
+
+"postcss-page-break@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "postcss-page-break@npm:2.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 65a4453883e904ca0f337d3a988a1b5a090e2e8bc2855913cb0b4b741158e6ea2e4eed9b33f5989e7ae55faa0f7b83cdc09693d600ac4c86ce804ae381ec48a4
+ languageName: node
+ linkType: hard
+
+"postcss-place@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "postcss-place@npm:4.0.1"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-values-parser: ^2.0.0
+ checksum: 26b2a443b0a8fcb6774d00036fa351633798a655ccd609da2d561fbd6561b0ba6f6b6d89e15fb074389fadb7da4cbc59c48ba75f1f5fdc478c020febb4e2b557
+ languageName: node
+ linkType: hard
+
+"postcss-preset-env@npm:^6.7.0":
+ version: 6.7.0
+ resolution: "postcss-preset-env@npm:6.7.0"
+ dependencies:
+ autoprefixer: ^9.6.1
+ browserslist: ^4.6.4
+ caniuse-lite: ^1.0.30000981
+ css-blank-pseudo: ^0.1.4
+ css-has-pseudo: ^0.10.0
+ css-prefers-color-scheme: ^3.1.1
+ cssdb: ^4.4.0
+ postcss: ^7.0.17
+ postcss-attribute-case-insensitive: ^4.0.1
+ postcss-color-functional-notation: ^2.0.1
+ postcss-color-gray: ^5.0.0
+ postcss-color-hex-alpha: ^5.0.3
+ postcss-color-mod-function: ^3.0.3
+ postcss-color-rebeccapurple: ^4.0.1
+ postcss-custom-media: ^7.0.8
+ postcss-custom-properties: ^8.0.11
+ postcss-custom-selectors: ^5.1.2
+ postcss-dir-pseudo-class: ^5.0.0
+ postcss-double-position-gradients: ^1.0.0
+ postcss-env-function: ^2.0.2
+ postcss-focus-visible: ^4.0.0
+ postcss-focus-within: ^3.0.0
+ postcss-font-variant: ^4.0.0
+ postcss-gap-properties: ^2.0.0
+ postcss-image-set-function: ^3.0.1
+ postcss-initial: ^3.0.0
+ postcss-lab-function: ^2.0.1
+ postcss-logical: ^3.0.0
+ postcss-media-minmax: ^4.0.0
+ postcss-nesting: ^7.0.0
+ postcss-overflow-shorthand: ^2.0.0
+ postcss-page-break: ^2.0.0
+ postcss-place: ^4.0.1
+ postcss-pseudo-class-any-link: ^6.0.0
+ postcss-replace-overflow-wrap: ^3.0.0
+ postcss-selector-matches: ^4.0.0
+ postcss-selector-not: ^4.0.0
+ checksum: 209cbb63443a1631aa97ccfc3b95b1ff519ddaeb672f84d6af501bd9e9ad6727680b5b1bffb8209322e47d93029a69df6064f75cd0b7633b6df943cbef33f22e
+ languageName: node
+ linkType: hard
+
+"postcss-pseudo-class-any-link@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "postcss-pseudo-class-any-link@npm:6.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ postcss-selector-parser: ^5.0.0-rc.3
+ checksum: d7dc3bba45df2966f8512c082a9cc341e63edac14d915ad9f41c62c452cd306d82da6baeee757dd4e7deafe3fa33b26c16e5236c670916bbb7ff4b4723453541
+ languageName: node
+ linkType: hard
+
+"postcss-replace-overflow-wrap@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "postcss-replace-overflow-wrap@npm:3.0.0"
+ dependencies:
+ postcss: ^7.0.2
+ checksum: 8c5b512a1172dd3d7b4a06d56d3b64c76dea01ca0950b546f83ae993f83aa95f933239e18deed0a5f3d2ef47840de55fa73498c4a46bfbe7bd892eb0dd8b606c
+ languageName: node
+ linkType: hard
+
+"postcss-selector-matches@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "postcss-selector-matches@npm:4.0.0"
+ dependencies:
+ balanced-match: ^1.0.0
+ postcss: ^7.0.2
+ checksum: 724f6cb345477691909468268a456f978ad3bae9ecd9908b2bb55c55c5f3c6d54a1fe50ce3956d93b122d05fc36677a8e4a34eed07bccda969c3f8baa43669a6
+ languageName: node
+ linkType: hard
+
+"postcss-selector-not@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "postcss-selector-not@npm:4.0.1"
+ dependencies:
+ balanced-match: ^1.0.0
+ postcss: ^7.0.2
+ checksum: 08fbd3e5ca273f3b767bd35d6bd033647a68f59b596d8aec19a9089b750539bdf85121ed7fd00a7763174a55c75c22a309d75d306127e23dc396069781efbaa4
+ languageName: node
+ linkType: hard
+
+"postcss-selector-parser@npm:^5.0.0-rc.3, postcss-selector-parser@npm:^5.0.0-rc.4":
+ version: 5.0.0
+ resolution: "postcss-selector-parser@npm:5.0.0"
+ dependencies:
+ cssesc: ^2.0.0
+ indexes-of: ^1.0.1
+ uniq: ^1.0.1
+ checksum: e49d21455e06d2cb9bf2a615bf3e605e0603c2c430a84c37a34f8baedaf3e8f9d0059a085d3e0483cbfa04c0d4153c7da28e7ac0ada319efdefe407df11dc1d4
+ languageName: node
+ linkType: hard
+
+"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.6":
+ version: 6.0.6
+ resolution: "postcss-selector-parser@npm:6.0.6"
+ dependencies:
+ cssesc: ^3.0.0
+ util-deprecate: ^1.0.2
+ checksum: 3602758798048bffbd6a97d6f009b32a993d6fd2cc70775bb59593e803d7fa8738822ecffb2fafc745edf7fad297dad53c30d2cfe78446a7d3f4a4a258cb15b2
+ languageName: node
+ linkType: hard
+
+"postcss-value-parser@npm:^3.3.0":
+ version: 3.3.1
+ resolution: "postcss-value-parser@npm:3.3.1"
+ checksum: 62cd26e1cdbcf2dcc6bcedf3d9b409c9027bc57a367ae20d31dd99da4e206f730689471fd70a2abe866332af83f54dc1fa444c589e2381bf7f8054c46209ce16
+ languageName: node
+ linkType: hard
+
+"postcss-value-parser@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "postcss-value-parser@npm:4.1.0"
+ checksum: 68a9ea27c780fa3cc350be37b47cc46385c61dd9627990909230e0e9c3debf6d5beb49006bd743a2e506cdd6fa7d07637f2d9504a394f67cc3011d1ff0134886
+ languageName: node
+ linkType: hard
+
+"postcss-values-parser@npm:^2.0.0, postcss-values-parser@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "postcss-values-parser@npm:2.0.1"
+ dependencies:
+ flatten: ^1.0.2
+ indexes-of: ^1.0.1
+ uniq: ^1.0.1
+ checksum: 050877880937e15af8d18bf48902e547e2123d7cc32c1f215b392642bc5e2598a87a341995d62f38e450aab4186b8afeb2c9541934806d458ad8b117020b2ebf
+ languageName: node
+ linkType: hard
+
+"postcss@npm:8.2.15":
+ version: 8.2.15
+ resolution: "postcss@npm:8.2.15"
+ dependencies:
+ colorette: ^1.2.2
+ nanoid: ^3.1.23
+ source-map: ^0.6.1
+ checksum: 07c309e5318843cdbb240b19101c8c679e19cb88544811de921dd9125118d6c0603afe925da7f2ac928dd7d4c0c6380ccdedf032400af5013210a3f145baca5d
+ languageName: node
+ linkType: hard
+
+"postcss@npm:^7.0.14, postcss@npm:^7.0.17, postcss@npm:^7.0.2, postcss@npm:^7.0.32, postcss@npm:^7.0.5, postcss@npm:^7.0.6":
+ version: 7.0.39
+ resolution: "postcss@npm:7.0.39"
+ dependencies:
+ picocolors: ^0.2.1
+ source-map: ^0.6.1
+ checksum: 4ac793f506c23259189064bdc921260d869a115a82b5e713973c5af8e94fbb5721a5cc3e1e26840500d7e1f1fa42a209747c5b1a151918a9bc11f0d7ed9048e3
+ languageName: node
+ linkType: hard
+
+"postcss@npm:^8.1.6, postcss@npm:^8.2.1, postcss@npm:^8.3.11":
+ version: 8.3.11
+ resolution: "postcss@npm:8.3.11"
+ dependencies:
+ nanoid: ^3.1.30
+ picocolors: ^1.0.0
+ source-map-js: ^0.6.2
+ checksum: 1a230553d74c66aa9585c90781ed8ea75f19cefea405d2117b67fbeb24b5b5e0e17be2e0c5a07db31dd085643a13394127ab2222e940771b70498331bf20f35e
+ languageName: node
+ linkType: hard
+
+"prettier@npm:^2.4.1":
+ version: 2.4.1
+ resolution: "prettier@npm:2.4.1"
+ bin:
+ prettier: bin-prettier.js
+ checksum: cc6830588b401b0d742862fe9c46bc9118204fb307c3abe0e49e95b35ed23629573807ffdf9cdd65289c252a0bb51fc0171437f6626ee36378dea80f0ee80b91
+ languageName: node
+ linkType: hard
+
+"pretty-bytes@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "pretty-bytes@npm:6.0.0"
+ checksum: 0bb9f95e617236404b29a8392c6efd82d65805f622f5e809ecd70068102be857d4e3276c86d2a32fa2ef851cc29472e380945dab7bec83ec79bd57a19a10faf7
+ languageName: node
+ linkType: hard
+
+"pretty-hrtime@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "pretty-hrtime@npm:1.0.3"
+ checksum: bae0e6832fe13c3de43d1a3d43df52bf6090499d74dc65a17f5552cb1a94f1f8019a23284ddf988c3c408a09678d743901e1d8f5b7a71bec31eeeac445bef371
+ languageName: node
+ linkType: hard
+
+"process@npm:0.11.10":
+ version: 0.11.10
+ resolution: "process@npm:0.11.10"
+ checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3
+ languageName: node
+ linkType: hard
+
+"promise-inflight@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "promise-inflight@npm:1.0.1"
+ checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981
+ languageName: node
+ linkType: hard
+
+"promise-retry@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "promise-retry@npm:2.0.1"
+ dependencies:
+ err-code: ^2.0.2
+ retry: ^0.12.0
+ checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
+ languageName: node
+ linkType: hard
+
+"proxy-from-env@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "proxy-from-env@npm:1.1.0"
+ checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4
+ languageName: node
+ linkType: hard
+
+"public-encrypt@npm:^4.0.0":
+ version: 4.0.3
+ resolution: "public-encrypt@npm:4.0.3"
+ dependencies:
+ bn.js: ^4.1.0
+ browserify-rsa: ^4.0.0
+ create-hash: ^1.1.0
+ parse-asn1: ^5.0.0
+ randombytes: ^2.0.1
+ safe-buffer: ^5.1.2
+ checksum: 215d446e43cef021a20b67c1df455e5eea134af0b1f9b8a35f9e850abf32991b0c307327bc5b9bc07162c288d5cdb3d4a783ea6c6640979ed7b5017e3e0c9935
+ languageName: node
+ linkType: hard
+
+"punycode@npm:^2.1.0":
+ version: 2.1.1
+ resolution: "punycode@npm:2.1.1"
+ checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8
+ languageName: node
+ linkType: hard
+
+"purgecss@npm:^4.0.3":
+ version: 4.0.3
+ resolution: "purgecss@npm:4.0.3"
+ dependencies:
+ commander: ^6.0.0
+ glob: ^7.0.0
+ postcss: ^8.2.1
+ postcss-selector-parser: ^6.0.2
+ bin:
+ purgecss: bin/purgecss.js
+ checksum: 232bfc898f87087678780e5d59cccd23f4b6e6e7a00addc49fa76e06075790dccf9fa52f5283d3285c3a932cd6e4111b7096f25e34886b422d8a6f12389e9516
+ languageName: node
+ linkType: hard
+
+"querystring-es3@npm:0.2.1":
+ version: 0.2.1
+ resolution: "querystring-es3@npm:0.2.1"
+ checksum: 691e8d6b8b157e7cd49ae8e83fcf86de39ab3ba948c25abaa94fba84c0986c641aa2f597770848c64abce290ed17a39c9df6df737dfa7e87c3b63acc7d225d61
+ languageName: node
+ linkType: hard
+
+"queue-microtask@npm:^1.2.2":
+ version: 1.2.3
+ resolution: "queue-microtask@npm:1.2.3"
+ checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4
+ languageName: node
+ linkType: hard
+
+"queue@npm:6.0.2":
+ version: 6.0.2
+ resolution: "queue@npm:6.0.2"
+ dependencies:
+ inherits: ~2.0.3
+ checksum: ebc23639248e4fe40a789f713c20548e513e053b3dc4924b6cb0ad741e3f264dcff948225c8737834dd4f9ec286dbc06a1a7c13858ea382d9379f4303bcc0916
+ languageName: node
+ linkType: hard
+
+"quick-lru@npm:^5.1.1":
+ version: 5.1.1
+ resolution: "quick-lru@npm:5.1.1"
+ checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed
+ languageName: node
+ linkType: hard
+
+"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5":
+ version: 2.1.0
+ resolution: "randombytes@npm:2.1.0"
+ dependencies:
+ safe-buffer: ^5.1.0
+ checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6
+ languageName: node
+ linkType: hard
+
+"randomfill@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "randomfill@npm:1.0.4"
+ dependencies:
+ randombytes: ^2.0.5
+ safe-buffer: ^5.1.0
+ checksum: 33734bb578a868d29ee1b8555e21a36711db084065d94e019a6d03caa67debef8d6a1bfd06a2b597e32901ddc761ab483a85393f0d9a75838f1912461d4dbfc7
+ languageName: node
+ linkType: hard
+
+"raw-body@npm:2.4.1":
+ version: 2.4.1
+ resolution: "raw-body@npm:2.4.1"
+ dependencies:
+ bytes: 3.1.0
+ http-errors: 1.7.3
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ checksum: d5e9179d2f1f0a652cd107c080f25d165c724f546124d620c8df7fb80322df42bff547a8b310e55e1f7952556d013716a21b30162192eb0b3332d7efcba75883
+ languageName: node
+ linkType: hard
+
+"react-dom@npm:17.0.2":
+ version: 17.0.2
+ resolution: "react-dom@npm:17.0.2"
+ dependencies:
+ loose-envify: ^1.1.0
+ object-assign: ^4.1.1
+ scheduler: ^0.20.2
+ peerDependencies:
+ react: 17.0.2
+ checksum: 1c1eaa3bca7c7228d24b70932e3d7c99e70d1d04e13bb0843bbf321582bc25d7961d6b8a6978a58a598af2af496d1cedcfb1bf65f6b0960a0a8161cb8dab743c
+ languageName: node
+ linkType: hard
+
+"react-is@npm:17.0.2":
+ version: 17.0.2
+ resolution: "react-is@npm:17.0.2"
+ checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8
+ languageName: node
+ linkType: hard
+
+"react-refresh@npm:0.8.3":
+ version: 0.8.3
+ resolution: "react-refresh@npm:0.8.3"
+ checksum: 3cffe5a9cbac1c5d59bf74bf9fff43c987d87ef32098b9092ea94b6637377d86c08565b9374d9397f446b3fbcd95de986ec77220a16f979687cb39b7b89e2f91
+ languageName: node
+ linkType: hard
+
+"react-srv3@npm:^1.0.3":
+ version: 1.0.4
+ resolution: "react-srv3@npm:1.0.4"
+ dependencies:
+ fast-xml-parser: ^3.19.0
+ he: ^1.2.0
+ peerDependencies:
+ react: ^16.0.0
+ checksum: 412ded7542d257dacba1ae481c523f2857db7eee13a6cf995821d6e5b4940f343d899bf451ae33b715bcd388de78d9a4266b0fd92de3243e43fe49069801ba71
+ languageName: node
+ linkType: hard
+
+"react@npm:17.0.2":
+ version: 17.0.2
+ resolution: "react@npm:17.0.2"
+ dependencies:
+ loose-envify: ^1.1.0
+ object-assign: ^4.1.1
+ checksum: b254cc17ce3011788330f7bbf383ab653c6848902d7936a87b09d835d091e3f295f7e9dd1597c6daac5dc80f90e778c8230218ba8ad599f74adcc11e33b9d61b
+ languageName: node
+ linkType: hard
+
+"readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0":
+ version: 3.6.0
+ resolution: "readable-stream@npm:3.6.0"
+ dependencies:
+ inherits: ^2.0.3
+ string_decoder: ^1.1.1
+ util-deprecate: ^1.0.1
+ checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8
+ languageName: node
+ linkType: hard
+
+"readdirp@npm:~3.5.0":
+ version: 3.5.0
+ resolution: "readdirp@npm:3.5.0"
+ dependencies:
+ picomatch: ^2.2.1
+ checksum: 6b1a9341e295e15d4fb40c010216cbcb6266587cd0b3ce7defabd66fa1b4e35f9fba3d64c2187fd38fadd01ccbfc5f1b33fdfb1da63b3cbf66224b7c6d75ce5a
+ languageName: node
+ linkType: hard
+
+"readdirp@npm:~3.6.0":
+ version: 3.6.0
+ resolution: "readdirp@npm:3.6.0"
+ dependencies:
+ picomatch: ^2.2.1
+ checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320
+ languageName: node
+ linkType: hard
+
+"reduce-css-calc@npm:^2.1.8":
+ version: 2.1.8
+ resolution: "reduce-css-calc@npm:2.1.8"
+ dependencies:
+ css-unit-converter: ^1.1.1
+ postcss-value-parser: ^3.3.0
+ checksum: 8fd27c06c4b443b84749a69a8b97d10e6ec7d142b625b41923a8807abb22b9e37e44df14e26cc606a802957be07bdce5e8ee2976a6952a7b438a7727007101e9
+ languageName: node
+ linkType: hard
+
+"regenerator-runtime@npm:0.13.4":
+ version: 0.13.4
+ resolution: "regenerator-runtime@npm:0.13.4"
+ checksum: ba49669ddbb56a12f8acf3e09427dfb89d83c4db466c387e8d7df8c13285695c6622a0112e12bdae492a97fdad3e68b2ef3f171bcc44d30a00adb1c9e121eaaa
+ languageName: node
+ linkType: hard
+
+"regenerator-runtime@npm:^0.13.4":
+ version: 0.13.9
+ resolution: "regenerator-runtime@npm:0.13.9"
+ checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e
+ languageName: node
+ linkType: hard
+
+"resolve-from@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "resolve-from@npm:4.0.0"
+ checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f
+ languageName: node
+ linkType: hard
+
+"resolve-from@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "resolve-from@npm:5.0.0"
+ checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf
+ languageName: node
+ linkType: hard
+
+"resolve@npm:^1.20.0":
+ version: 1.20.0
+ resolution: "resolve@npm:1.20.0"
+ dependencies:
+ is-core-module: ^2.2.0
+ path-parse: ^1.0.6
+ checksum: 40cf70b2cde00ef57f99daf2dc63c6a56d6c14a1b7fc51735d06a6f0a3b97cb67b4fb7ef6c747b4e13a7baba83b0ef625d7c4ce92a483cd5af923c3b65fd16fe
+ languageName: node
+ linkType: hard
+
+"resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>":
+ version: 1.20.0
+ resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin<compat/resolve>::version=1.20.0&hash=c3c19d"
+ dependencies:
+ is-core-module: ^2.2.0
+ path-parse: ^1.0.6
+ checksum: a0dd7d16a8e47af23afa9386df2dff10e3e0debb2c7299a42e581d9d9b04d7ad5d2c53f24f1e043f7b3c250cbdc71150063e53d0b6559683d37f790b7c8c3cd5
+ languageName: node
+ linkType: hard
+
+"retry@npm:^0.12.0":
+ version: 0.12.0
+ resolution: "retry@npm:0.12.0"
+ checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c
+ languageName: node
+ linkType: hard
+
+"reusify@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "reusify@npm:1.0.4"
+ checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc
+ languageName: node
+ linkType: hard
+
+"rgb-regex@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "rgb-regex@npm:1.0.1"
+ checksum: b270ce8bc14782d2d21d3184c1e6c65b465476d8f03e72b93ef57c95710a452b2fe280e1d516c88873aec06efd7f71373e673f114b9d99f3a4f9a0393eb00126
+ languageName: node
+ linkType: hard
+
+"rgba-regex@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "rgba-regex@npm:1.0.0"
+ checksum: 7f2cd271572700faea50753d82524cb2b98f17a5b9722965c7076f6cd674fe545f28145b7ef2cccabc9eca2475c793db16862cd5e7b3784a9f4b8d6496431057
+ languageName: node
+ linkType: hard
+
+"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2":
+ version: 3.0.2
+ resolution: "rimraf@npm:3.0.2"
+ dependencies:
+ glob: ^7.1.3
+ bin:
+ rimraf: bin.js
+ checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0
+ languageName: node
+ linkType: hard
+
+"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1":
+ version: 2.0.2
+ resolution: "ripemd160@npm:2.0.2"
+ dependencies:
+ hash-base: ^3.0.0
+ inherits: ^2.0.1
+ checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393
+ languageName: node
+ linkType: hard
+
+"run-parallel@npm:^1.1.9":
+ version: 1.2.0
+ resolution: "run-parallel@npm:1.2.0"
+ dependencies:
+ queue-microtask: ^1.2.2
+ checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d
+ languageName: node
+ linkType: hard
+
+"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0":
+ version: 5.2.1
+ resolution: "safe-buffer@npm:5.2.1"
+ checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
+ languageName: node
+ linkType: hard
+
+"safe-buffer@npm:~5.1.1":
+ version: 5.1.2
+ resolution: "safe-buffer@npm:5.1.2"
+ checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c
+ languageName: node
+ linkType: hard
+
+"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.0":
+ version: 2.1.2
+ resolution: "safer-buffer@npm:2.1.2"
+ checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0
+ languageName: node
+ linkType: hard
+
+"scheduler@npm:^0.20.2":
+ version: 0.20.2
+ resolution: "scheduler@npm:0.20.2"
+ dependencies:
+ loose-envify: ^1.1.0
+ object-assign: ^4.1.1
+ checksum: c4b35cf967c8f0d3e65753252d0f260271f81a81e427241295c5a7b783abf4ea9e905f22f815ab66676f5313be0a25f47be582254db8f9241b259213e999b8fc
+ languageName: node
+ linkType: hard
+
+"semver@npm:^6.0.0":
+ version: 6.3.0
+ resolution: "semver@npm:6.3.0"
+ bin:
+ semver: ./bin/semver.js
+ checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.3.5":
+ version: 7.3.5
+ resolution: "semver@npm:7.3.5"
+ dependencies:
+ lru-cache: ^6.0.0
+ bin:
+ semver: bin/semver.js
+ checksum: 5eafe6102bea2a7439897c1856362e31cc348ccf96efd455c8b5bc2c61e6f7e7b8250dc26b8828c1d76a56f818a7ee907a36ae9fb37a599d3d24609207001d60
+ languageName: node
+ linkType: hard
+
+"set-blocking@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "set-blocking@npm:2.0.0"
+ checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02
+ languageName: node
+ linkType: hard
+
+"setimmediate@npm:^1.0.4":
+ version: 1.0.5
+ resolution: "setimmediate@npm:1.0.5"
+ checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd
+ languageName: node
+ linkType: hard
+
+"setprototypeof@npm:1.1.1":
+ version: 1.1.1
+ resolution: "setprototypeof@npm:1.1.1"
+ checksum: a8bee29c1c64c245d460ce53f7460af8cbd0aceac68d66e5215153992cc8b3a7a123416353e0c642060e85cc5fd4241c92d1190eec97eda0dcb97436e8fcca3b
+ languageName: node
+ linkType: hard
+
+"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8":
+ version: 2.4.11
+ resolution: "sha.js@npm:2.4.11"
+ dependencies:
+ inherits: ^2.0.1
+ safe-buffer: ^5.0.1
+ bin:
+ sha.js: ./bin.js
+ checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07
+ languageName: node
+ linkType: hard
+
+"shell-quote@npm:1.7.3":
+ version: 1.7.3
+ resolution: "shell-quote@npm:1.7.3"
+ checksum: aca58e73a3a5d933d02e0bdddedc53ee14f7c2ec264f97ac915b9d4482d077a38e422aa664631d60a672cd3cdb4054eb2e6c0303f54882453dacb6483e482d34
+ languageName: node
+ linkType: hard
+
+"side-channel@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "side-channel@npm:1.0.4"
+ dependencies:
+ call-bind: ^1.0.0
+ get-intrinsic: ^1.0.2
+ object-inspect: ^1.9.0
+ checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245
+ languageName: node
+ linkType: hard
+
+"signal-exit@npm:^3.0.7":
+ version: 3.0.7
+ resolution: "signal-exit@npm:3.0.7"
+ checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318
+ languageName: node
+ linkType: hard
+
+"simple-swizzle@npm:^0.2.2":
+ version: 0.2.2
+ resolution: "simple-swizzle@npm:0.2.2"
+ dependencies:
+ is-arrayish: ^0.3.1
+ checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0
+ languageName: node
+ linkType: hard
+
+"smart-buffer@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "smart-buffer@npm:4.2.0"
+ checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b
+ languageName: node
+ linkType: hard
+
+"socks-proxy-agent@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "socks-proxy-agent@npm:7.0.0"
+ dependencies:
+ agent-base: ^6.0.2
+ debug: ^4.3.3
+ socks: ^2.6.2
+ checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846
+ languageName: node
+ linkType: hard
+
+"socks@npm:^2.6.2":
+ version: 2.7.1
+ resolution: "socks@npm:2.7.1"
+ dependencies:
+ ip: ^2.0.0
+ smart-buffer: ^4.2.0
+ checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748
+ languageName: node
+ linkType: hard
+
+"source-map-js@npm:^0.6.2":
+ version: 0.6.2
+ resolution: "source-map-js@npm:0.6.2"
+ checksum: 9c8151a29e00fd8d3ba87709fdf9a9ce48313d653f4a29a39b4ae53d346ac79e005de624796ff42eff55cbaf26d2e87f4466001ca87831d400d818c5cf146a0e
+ languageName: node
+ linkType: hard
+
+"source-map@npm:0.7.3":
+ version: 0.7.3
+ resolution: "source-map@npm:0.7.3"
+ checksum: cd24efb3b8fa69b64bf28e3c1b1a500de77e84260c5b7f2b873f88284df17974157cc88d386ee9b6d081f08fdd8242f3fc05c953685a6ad81aad94c7393dedea
+ languageName: node
+ linkType: hard
+
+"source-map@npm:0.8.0-beta.0":
+ version: 0.8.0-beta.0
+ resolution: "source-map@npm:0.8.0-beta.0"
+ dependencies:
+ whatwg-url: ^7.0.0
+ checksum: e94169be6461ab0ac0913313ad1719a14c60d402bd22b0ad96f4a6cffd79130d91ab5df0a5336a326b04d2df131c1409f563c9dc0d21a6ca6239a44b6c8dbd92
+ languageName: node
+ linkType: hard
+
+"source-map@npm:^0.6.1":
+ version: 0.6.1
+ resolution: "source-map@npm:0.6.1"
+ checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2
+ languageName: node
+ linkType: hard
+
+"ssri@npm:^9.0.0":
+ version: 9.0.1
+ resolution: "ssri@npm:9.0.1"
+ dependencies:
+ minipass: ^3.1.1
+ checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb
+ languageName: node
+ linkType: hard
+
+"stacktrace-parser@npm:0.1.10":
+ version: 0.1.10
+ resolution: "stacktrace-parser@npm:0.1.10"
+ dependencies:
+ type-fest: ^0.7.1
+ checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee
+ languageName: node
+ linkType: hard
+
+"statuses@npm:>= 1.5.0 < 2":
+ version: 1.5.0
+ resolution: "statuses@npm:1.5.0"
+ checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c
+ languageName: node
+ linkType: hard
+
+"stream-browserify@npm:3.0.0":
+ version: 3.0.0
+ resolution: "stream-browserify@npm:3.0.0"
+ dependencies:
+ inherits: ~2.0.4
+ readable-stream: ^3.5.0
+ checksum: 4c47ef64d6f03815a9ca3874e2319805e8e8a85f3550776c47ce523b6f4c6cd57f40e46ec6a9ab8ad260fde61863c2718f250d3bedb3fe9052444eb9abfd9921
+ languageName: node
+ linkType: hard
+
+"stream-http@npm:3.1.1":
+ version: 3.1.1
+ resolution: "stream-http@npm:3.1.1"
+ dependencies:
+ builtin-status-codes: ^3.0.0
+ inherits: ^2.0.4
+ readable-stream: ^3.6.0
+ xtend: ^4.0.2
+ checksum: 17d10d1357bc2ee45cd7a65e6525cf9ac09b79e75bc058ecfdbd91cd576f2d914a6cf026ce9f5904790c8cfe7b158065d411884e9996126a0c13fe9acbecf6b0
+ languageName: node
+ linkType: hard
+
+"stream-parser@npm:^0.3.1":
+ version: 0.3.1
+ resolution: "stream-parser@npm:0.3.1"
+ dependencies:
+ debug: 2
+ checksum: 4d86ff8cffe7c7587dc91433fff9dce38a93ea7e9f47560055addc81eae6b6befab22b75643ce539faf325fe2b17d371778242566bed086e75f6cffb1e76c06c
+ languageName: node
+ linkType: hard
+
+"string-hash@npm:1.1.3":
+ version: 1.1.3
+ resolution: "string-hash@npm:1.1.3"
+ checksum: 104b8667a5e0dc71bfcd29fee09cb88c6102e27bfb07c55f95535d90587d016731d52299380052e514266f4028a7a5172e0d9ac58e2f8f5001be61dc77c0754d
+ languageName: node
+ linkType: hard
+
+"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.2.3":
+ version: 4.2.3
+ resolution: "string-width@npm:4.2.3"
+ dependencies:
+ emoji-regex: ^8.0.0
+ is-fullwidth-code-point: ^3.0.0
+ strip-ansi: ^6.0.1
+ checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb
+ languageName: node
+ linkType: hard
+
+"string.prototype.trimend@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "string.prototype.trimend@npm:1.0.4"
+ dependencies:
+ call-bind: ^1.0.2
+ define-properties: ^1.1.3
+ checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac
+ languageName: node
+ linkType: hard
+
+"string.prototype.trimstart@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "string.prototype.trimstart@npm:1.0.4"
+ dependencies:
+ call-bind: ^1.0.2
+ define-properties: ^1.1.3
+ checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f
+ languageName: node
+ linkType: hard
+
+"string_decoder@npm:1.3.0, string_decoder@npm:^1.1.1":
+ version: 1.3.0
+ resolution: "string_decoder@npm:1.3.0"
+ dependencies:
+ safe-buffer: ~5.2.0
+ checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56
+ languageName: node
+ linkType: hard
+
+"strip-ansi@npm:6.0.1, strip-ansi@npm:^6.0.1":
+ version: 6.0.1
+ resolution: "strip-ansi@npm:6.0.1"
+ dependencies:
+ ansi-regex: ^5.0.1
+ checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c
+ languageName: node
+ linkType: hard
+
+"strnum@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "strnum@npm:1.0.4"
+ checksum: 91432c37fef1c4df4eb32e5ff9ae7962a4627f81001fee3f86c3f279226a54157b2a14d074d85265c6c36e5e93bdb45f4339e46bdba0f1325c5c27fae78007b1
+ languageName: node
+ linkType: hard
+
+"styled-jsx@npm:5.0.0-beta.3":
+ version: 5.0.0-beta.3
+ resolution: "styled-jsx@npm:5.0.0-beta.3"
+ dependencies:
+ "@babel/plugin-syntax-jsx": 7.14.5
+ "@babel/types": 7.15.0
+ convert-source-map: 1.7.0
+ loader-utils: 1.2.3
+ source-map: 0.7.3
+ string-hash: 1.1.3
+ stylis: 3.5.4
+ stylis-rule-sheet: 0.0.10
+ peerDependencies:
+ react: ">= 16.8.0 || 17.x.x || 18.x.x"
+ peerDependenciesMeta:
+ "@babel/core":
+ optional: true
+ checksum: cc328a92b56fe4aadcb29031be1b006279f1194592f66677079abc7d4294d388962f9634ef67dccdc592ef3d8ceaa8af9603c60198cbd371444e46074a6b1747
+ languageName: node
+ linkType: hard
+
+"stylis-rule-sheet@npm:0.0.10":
+ version: 0.0.10
+ resolution: "stylis-rule-sheet@npm:0.0.10"
+ peerDependencies:
+ stylis: ^3.5.0
+ checksum: 97ad016c64ecce8d4b2c2c1c3cf3260de3c0e2b151e78f90ded6cc1bfcca536625a77277af16a9c8a241236a9e4fd5b70d88dfa32e9b48afaddb8f102a95582d
+ languageName: node
+ linkType: hard
+
+"stylis@npm:3.5.4":
+ version: 3.5.4
+ resolution: "stylis@npm:3.5.4"
+ checksum: 3673a748ad236219bd77ca9c0a8730b8726812e612cbc844aa6f029f13666a10cf2825a5f8d41f05e8af02b5987d31b7d3ebe995e4b42e0255366fec23489b77
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^5.3.0":
+ version: 5.5.0
+ resolution: "supports-color@npm:5.5.0"
+ dependencies:
+ has-flag: ^3.0.0
+ checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^7.1.0":
+ version: 7.2.0
+ resolution: "supports-color@npm:7.2.0"
+ dependencies:
+ has-flag: ^4.0.0
+ checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^8.0.0":
+ version: 8.1.1
+ resolution: "supports-color@npm:8.1.1"
+ dependencies:
+ has-flag: ^4.0.0
+ checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406
+ languageName: node
+ linkType: hard
+
+"tailwindcss@npm:^2.2.19":
+ version: 2.2.19
+ resolution: "tailwindcss@npm:2.2.19"
+ dependencies:
+ arg: ^5.0.1
+ bytes: ^3.0.0
+ chalk: ^4.1.2
+ chokidar: ^3.5.2
+ color: ^4.0.1
+ cosmiconfig: ^7.0.1
+ detective: ^5.2.0
+ didyoumean: ^1.2.2
+ dlv: ^1.1.3
+ fast-glob: ^3.2.7
+ fs-extra: ^10.0.0
+ glob-parent: ^6.0.1
+ html-tags: ^3.1.0
+ is-color-stop: ^1.1.0
+ is-glob: ^4.0.1
+ lodash: ^4.17.21
+ lodash.topath: ^4.5.2
+ modern-normalize: ^1.1.0
+ node-emoji: ^1.11.0
+ normalize-path: ^3.0.0
+ object-hash: ^2.2.0
+ postcss-js: ^3.0.3
+ postcss-load-config: ^3.1.0
+ postcss-nested: 5.0.6
+ postcss-selector-parser: ^6.0.6
+ postcss-value-parser: ^4.1.0
+ pretty-hrtime: ^1.0.3
+ purgecss: ^4.0.3
+ quick-lru: ^5.1.1
+ reduce-css-calc: ^2.1.8
+ resolve: ^1.20.0
+ tmp: ^0.2.1
+ peerDependencies:
+ autoprefixer: ^10.0.2
+ postcss: ^8.0.9
+ bin:
+ tailwind: lib/cli.js
+ tailwindcss: lib/cli.js
+ checksum: 660e8086fa2758f273b7ec87067c041185454374c5c916c236f9691b1c60c48166b2556b6327b3d912f018f48712105fa979b7f717b2db3111ea0850059a2b62
+ languageName: node
+ linkType: hard
+
+"tar@npm:^6.1.11, tar@npm:^6.1.2":
+ version: 6.1.12
+ resolution: "tar@npm:6.1.12"
+ dependencies:
+ chownr: ^2.0.0
+ fs-minipass: ^2.0.0
+ minipass: ^3.0.0
+ minizlib: ^2.1.1
+ mkdirp: ^1.0.3
+ yallist: ^4.0.0
+ checksum: 49d72e4420944e7ede2782d6b0826a6ede6cdab23c7de63470917e7a78166bc4d5b1a96279d3d79a85f1ba5a17cd37c0acbb3cbff19a07447691445b8b051c55
+ languageName: node
+ linkType: hard
+
+"timeago.js@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "timeago.js@npm:4.0.2"
+ checksum: c785a06988717cb5a00bb96b00ebaa56e83f4b5ed5d87c4c3931fb1bb2591a0e13a7ddc4b6c12c6ee7de64b440ed903c7bd4e0edddb37aade9bfc9ceab5d0db3
+ languageName: node
+ linkType: hard
+
+"timers-browserify@npm:2.0.12":
+ version: 2.0.12
+ resolution: "timers-browserify@npm:2.0.12"
+ dependencies:
+ setimmediate: ^1.0.4
+ checksum: ec37ae299066bef6c464dcac29c7adafba1999e7227a9bdc4e105a459bee0f0b27234a46bfd7ab4041da79619e06a58433472867a913d01c26f8a203f87cee70
+ languageName: node
+ linkType: hard
+
+"tmp@npm:^0.2.1":
+ version: 0.2.1
+ resolution: "tmp@npm:0.2.1"
+ dependencies:
+ rimraf: ^3.0.0
+ checksum: 8b1214654182575124498c87ca986ac53dc76ff36e8f0e0b67139a8d221eaecfdec108c0e6ec54d76f49f1f72ab9325500b246f562b926f85bcdfca8bf35df9e
+ languageName: node
+ linkType: hard
+
+"to-fast-properties@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "to-fast-properties@npm:2.0.0"
+ checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168
+ languageName: node
+ linkType: hard
+
+"to-regex-range@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "to-regex-range@npm:5.0.1"
+ dependencies:
+ is-number: ^7.0.0
+ checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed
+ languageName: node
+ linkType: hard
+
+"toidentifier@npm:1.0.0":
+ version: 1.0.0
+ resolution: "toidentifier@npm:1.0.0"
+ checksum: 199e6bfca1531d49b3506cff02353d53ec987c9ee10ee272ca6484ed97f1fc10fb77c6c009079ca16d5c5be4a10378178c3cacdb41ce9ec954c3297c74c6053e
+ languageName: node
+ linkType: hard
+
+"tr46@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "tr46@npm:1.0.1"
+ dependencies:
+ punycode: ^2.1.0
+ checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a
+ languageName: node
+ linkType: hard
+
+"traverse@npm:^0.6.6":
+ version: 0.6.6
+ resolution: "traverse@npm:0.6.6"
+ checksum: e2afa72f11efa9ba31ed763d2d9d2aa244612f22015d16c0ea3ba5f6ca8bf071de87f8108b721885cce06ea4a36ef4605d9228c67e431d9015ea4685cb364420
+ languageName: node
+ linkType: hard
+
+"tty-browserify@npm:0.0.1":
+ version: 0.0.1
+ resolution: "tty-browserify@npm:0.0.1"
+ checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5
+ languageName: node
+ linkType: hard
+
+"type-fest@npm:^0.7.1":
+ version: 0.7.1
+ resolution: "type-fest@npm:0.7.1"
+ checksum: 5b1b113529d59949d97b76977d545989ddc11b81bb0c766b6d2ccc65473cb4b4a5c7d24f5be2c2bb2de302a5d7a13c1732ea1d34c8c59b7e0ec1f890cf7fc424
+ languageName: node
+ linkType: hard
+
+"typescript@npm:^4.4.4":
+ version: 4.4.4
+ resolution: "typescript@npm:4.4.4"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 89ecb8436bb48ef5594d49289f5f89103071716b6e4844278f4fb3362856e31203e187a9c76d205c3f0b674d221a058fd28310dbcbcf5d95e9a57229bb5203f1
+ languageName: node
+ linkType: hard
+
+"typescript@patch:typescript@^4.4.4#~builtin<compat/typescript>":
+ version: 4.4.4
+ resolution: "typescript@patch:typescript@npm%3A4.4.4#~builtin<compat/typescript>::version=4.4.4&hash=bbeadb"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 3d1b04449662193544b81d055479d03b4c5dca95f1a82f8922596f089d894c9fefbe16639d1d9dfe26a7054419645530cef44001bc17aed1fe1eb3c237e9b3c7
+ languageName: node
+ linkType: hard
+
+"unbox-primitive@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "unbox-primitive@npm:1.0.1"
+ dependencies:
+ function-bind: ^1.1.1
+ has-bigints: ^1.0.1
+ has-symbols: ^1.0.2
+ which-boxed-primitive: ^1.0.2
+ checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba
+ languageName: node
+ linkType: hard
+
+"uniq@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "uniq@npm:1.0.1"
+ checksum: 8206535f83745ea83f9da7035f3b983fd6ed5e35b8ed7745441944e4065b616bc67cf0d0a23a86b40ee0074426f0607f0a138f9b78e124eb6a7a6a6966055709
+ languageName: node
+ linkType: hard
+
+"unique-filename@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "unique-filename@npm:2.0.1"
+ dependencies:
+ unique-slug: ^3.0.0
+ checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f
+ languageName: node
+ linkType: hard
+
+"unique-slug@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "unique-slug@npm:3.0.0"
+ dependencies:
+ imurmurhash: ^0.1.4
+ checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c
+ languageName: node
+ linkType: hard
+
+"universalify@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "universalify@npm:2.0.0"
+ checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44
+ languageName: node
+ linkType: hard
+
+"unpipe@npm:1.0.0":
+ version: 1.0.0
+ resolution: "unpipe@npm:1.0.0"
+ checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2
+ languageName: node
+ linkType: hard
+
+"use-subscription@npm:1.5.1":
+ version: 1.5.1
+ resolution: "use-subscription@npm:1.5.1"
+ dependencies:
+ object-assign: ^4.1.1
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0
+ checksum: 96e64977a573244fd11350a3141b2cf57fb72dd9dd902f387c8a0a565d0a948bc81588bd7378c6ef6defc0d1119f37f73aac4a7a287c8443abd444bd4e7bbea8
+ languageName: node
+ linkType: hard
+
+"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "util-deprecate@npm:1.0.2"
+ checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2
+ languageName: node
+ linkType: hard
+
+"util@npm:0.12.4, util@npm:^0.12.0":
+ version: 0.12.4
+ resolution: "util@npm:0.12.4"
+ dependencies:
+ inherits: ^2.0.3
+ is-arguments: ^1.0.4
+ is-generator-function: ^1.0.7
+ is-typed-array: ^1.1.3
+ safe-buffer: ^5.1.2
+ which-typed-array: ^1.1.2
+ checksum: 8eac7a6e6b341c0f1b3eb73bbe5dfcae31a7e9699c8fc3266789f3e95f7637946a7700dcf1904dbd3749a58a36760ebf7acf4bb5b717f7468532a8a79f44eff0
+ languageName: node
+ linkType: hard
+
+"vm-browserify@npm:1.1.2":
+ version: 1.1.2
+ resolution: "vm-browserify@npm:1.1.2"
+ checksum: 10a1c50aab54ff8b4c9042c15fc64aefccce8d2fb90c0640403242db0ee7fb269f9b102bdb69cfb435d7ef3180d61fd4fb004a043a12709abaf9056cfd7e039d
+ languageName: node
+ linkType: hard
+
+"watchpack@npm:2.1.1":
+ version: 2.1.1
+ resolution: "watchpack@npm:2.1.1"
+ dependencies:
+ glob-to-regexp: ^0.4.1
+ graceful-fs: ^4.1.2
+ checksum: 4a2d7ed1b441814b232db9c065beaee40ad0e37f77279331d663fa950b6b1926210a8dfa6009dc806b248f15d48826c9c6ce1a7fd6e6c94178d13c6c0a33f32c
+ languageName: node
+ linkType: hard
+
+"webidl-conversions@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "webidl-conversions@npm:4.0.2"
+ checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374
+ languageName: node
+ linkType: hard
+
+"whatwg-url@npm:^7.0.0":
+ version: 7.1.0
+ resolution: "whatwg-url@npm:7.1.0"
+ dependencies:
+ lodash.sortby: ^4.7.0
+ tr46: ^1.0.1
+ webidl-conversions: ^4.0.2
+ checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd
+ languageName: node
+ linkType: hard
+
+"which-boxed-primitive@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "which-boxed-primitive@npm:1.0.2"
+ dependencies:
+ is-bigint: ^1.0.1
+ is-boolean-object: ^1.1.0
+ is-number-object: ^1.0.4
+ is-string: ^1.0.5
+ is-symbol: ^1.0.3
+ checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e
+ languageName: node
+ linkType: hard
+
+"which-typed-array@npm:^1.1.2":
+ version: 1.1.7
+ resolution: "which-typed-array@npm:1.1.7"
+ dependencies:
+ available-typed-arrays: ^1.0.5
+ call-bind: ^1.0.2
+ es-abstract: ^1.18.5
+ foreach: ^2.0.5
+ has-tostringtag: ^1.0.0
+ is-typed-array: ^1.1.7
+ checksum: 147837cf5866e36b6b2e427731709e02f79f1578477cbde68ed773a5307520a6cb6836c73c79c30690a473266ee59010b83b6d9b25d8d677a40ff77fb37a8a84
+ languageName: node
+ linkType: hard
+
+"which@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "which@npm:2.0.2"
+ dependencies:
+ isexe: ^2.0.0
+ bin:
+ node-which: ./bin/node-which
+ checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1
+ languageName: node
+ linkType: hard
+
+"wide-align@npm:^1.1.5":
+ version: 1.1.5
+ resolution: "wide-align@npm:1.1.5"
+ dependencies:
+ string-width: ^1.0.2 || 2 || 3 || 4
+ checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3
+ languageName: node
+ linkType: hard
+
+"wrappy@npm:1":
+ version: 1.0.2
+ resolution: "wrappy@npm:1.0.2"
+ checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5
+ languageName: node
+ linkType: hard
+
+"xtend@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "xtend@npm:4.0.2"
+ checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a
+ languageName: node
+ linkType: hard
+
+"yallist@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "yallist@npm:4.0.0"
+ checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
+ languageName: node
+ linkType: hard
+
+"yaml@npm:^1.10.0, yaml@npm:^1.10.2":
+ version: 1.10.2
+ resolution: "yaml@npm:1.10.2"
+ checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f
+ languageName: node
+ linkType: hard
+
+"yocto-queue@npm:^0.1.0":
+ version: 0.1.0
+ resolution: "yocto-queue@npm:0.1.0"
+ checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700
+ languageName: node
+ linkType: hard
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage