Extract RJ codes on South Plus forums, automatically fetch and display DLSite work information, and provide ASMR ONE links.
// ==UserScript==
// @name RJ Warp Gate
// @name:zh RJ号折跃门
// @name:zh-CN RJ号折跃门
// @name:zh-TW RJ號折躍門
// @namespace Leovikii
// @version 1.0.0
// @author Leovikii
// @description Extract RJ codes on South Plus forums, automatically fetch and display DLSite work information, and provide ASMR ONE links.
// @description:zh 在南+论坛提取并高亮RJ号,自动获取并显示DLsite元数据,并提供ASMR ONE在线试听资源链接。
// @description:zh-CN 在南+论坛提取并高亮RJ号,自动获取并显示DLsite元数据,并提供ASMR ONE在线试听资源链接。
// @description:zh-TW 在南+論壇提取並高亮RJ號,自動獲取並顯示DLsite元數據,並提供ASMR ONE在線試聽資源連結。
// @license MIT
// @icon data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='64' y2='64' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0%25' stop-color='%23f472b6'/%3E%3Cstop offset='100%25' stop-color='%233b82f6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='64' height='64' rx='16' fill='url(%23g)'/%3E%3Ctext x='32' y='44' font-family='Arial,sans-serif' font-weight='900' font-size='32' fill='%23fff' text-anchor='middle' letter-spacing='1'%3ERJ%3C/text%3E%3C/svg%3E
// @match *://*.south-plus.net/*
// @match *://*.spring-plus.net/*
// @match *://*.level-plus.net/*
// @connect dlsite.com
// @connect media.ci-en.jp
// @connect *
// @grant GM.xmlHttpRequest
// @grant GM_addElement
// @grant GM_addStyle
// @grant GM_deleteValue
// @grant GM_getValue
// @grant GM_openInTab
// @grant GM_registerMenuCommand
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_unregisterMenuCommand
// @grant GM_xmlhttpRequest
// @run-at document-start
// ==/UserScript==
(function() {
"use strict";
var s = new Set();
var _css = async (t) => {
if (s.has(t)) return;
s.add(t);
((c) => {
if (typeof GM_addStyle === "function") GM_addStyle(c);
else (document.head || document.documentElement).appendChild(document.createElement("style")).append(c);
})(t);
};
_css(" .rj-warp-gate-img-container[data-v-fbfcd6f7]{background-color:#0003;border-radius:8px;justify-content:center;align-items:center;width:100%;height:100%;min-height:150px;display:flex;overflow:hidden}.rj-warp-gate-img-container img[data-v-fbfcd6f7]{object-fit:contain;border-radius:8px;max-width:100%;max-height:350px;transition:transform .3s}.rj-warp-gate-img-container img.is-hovered[data-v-fbfcd6f7]{transform:scale(1.05)}.rj-warp-gate-img-placeholder[data-v-fbfcd6f7]{justify-content:center;align-items:center;width:100%;height:100%;min-height:200px;display:flex}.rj-warp-gate-img-skeleton[data-v-fbfcd6f7]{background:linear-gradient(90deg,#ffffff1a 25%,#fff3 50%,#ffffff1a 75%) 0 0/200% 100%;border-radius:50%;width:50px;height:50px;animation:1.5s infinite skeleton-loading-fbfcd6f7}@keyframes skeleton-loading-fbfcd6f7{0%{background-position:200% 0}to{background-position:-200% 0}}.rj-warp-gate-link-btn[data-v-6425d715]{box-sizing:border-box;border-radius:14px;justify-content:space-between;align-items:center;width:100%;padding:10px 16px;text-decoration:none;transition:all .25s cubic-bezier(.2,.8,.2,1);display:flex;box-shadow:0 4px 10px #0003,inset 0 1px #ffffff40}.rj-warp-gate-link-btn[data-v-6425d715]:not(.is-disabled):hover{filter:brightness(1.1);transform:translateY(-1px)scale(1.01);box-shadow:0 6px 14px #0000004d,inset 0 1px #ffffff59}.rj-warp-gate-link-btn[data-v-6425d715]:not(.is-disabled):active{filter:brightness(.95);transform:scale(.96);box-shadow:0 2px 4px #0003,inset 0 1px #ffffff1a}.icon-wrapper[data-v-6425d715]{background:#00000026;border-radius:50%;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.action-icon[data-v-6425d715]{color:#fff;width:14px;height:14px}.site-logo[data-v-6425d715]{width:auto;height:18px}.rj-warp-gate-link-btn.is-disabled[data-v-6425d715]{box-shadow:none;cursor:not-allowed;background-color:#ffffff0d}.rj-warp-gate-link-btn.is-disabled .logo-dot[data-v-6425d715],.rj-warp-gate-link-btn.is-disabled .logo-text[data-v-6425d715]{fill:#fff3}.rj-warp-gate-link-btn.is-disabled .icon-wrapper[data-v-6425d715]{background:0 0}.rj-warp-gate-link-btn.is-disabled .action-icon[data-v-6425d715]{color:#fff3}.theme-dlsite[data-v-6425d715]{background:linear-gradient(#1a75ff 0%,#04c 100%)}.theme-dlsite .logo-dot[data-v-6425d715]{fill:#facc15}.theme-dlsite .logo-text[data-v-6425d715]{fill:#fff}.theme-asmrone[data-v-6425d715]{background:linear-gradient(#51d8cf 0%,#29b8ac 100%)}.theme-asmrone .logo-dot[data-v-6425d715],.theme-asmrone .logo-text[data-v-6425d715]{fill:#fff}.rj-warp-gate-capsule[data-v-69e83641]{white-space:nowrap;border-radius:6px;padding:4px 10px;font-size:.92em;font-weight:500;display:inline-block;box-shadow:0 2px 4px #0003}.theme-genre[data-v-69e83641]{color:#f8fafc;background-color:#334155;border:1px solid #64748b}.theme-cv[data-v-69e83641]{color:#e9d5ff;background-color:#581c87;border:1px solid #9333ea}.theme-basic[data-v-69e83641]{color:#ccfbf1;background-color:#134e4a;border:1px solid #0f766e}.theme-r18[data-v-69e83641],.theme-sales[data-v-69e83641]{color:#fecaca;background-color:#7f1d1d;border:1px solid #dc2626}.theme-rating[data-v-69e83641]{color:#fef08a;background-color:#713f12;border:1px solid #eab308}.theme-type-0[data-v-69e83641]{color:#fde68a;background-color:#78350f;border:1px solid #b45309}.theme-type-1[data-v-69e83641]{color:#fecdd3;background-color:#881337;border:1px solid #e11d48}.theme-type-2[data-v-69e83641]{color:#a7f3d0;background-color:#064e3b;border:1px solid #059669}.theme-type-3[data-v-69e83641]{color:#bfdbfe;background-color:#1e3a8a;border:1px solid #2563eb}.theme-type-4[data-v-69e83641]{color:#c7d2fe;background-color:#312e81;border:1px solid #4f46e5}.theme-type-5[data-v-69e83641]{color:#cffafe;background-color:#164e63;border:1px solid #0891b2}.theme-type-6[data-v-69e83641]{color:#ddd6fe;background-color:#4c1d95;border:1px solid #7c3aed}.theme-type-7[data-v-69e83641]{color:#cbd5e1;background-color:#1e293b;border:1px solid #475569}.theme-type-8[data-v-69e83641]{color:#ccfbf1;background-color:#134e4a;border:1px solid #0d9488}.theme-type-9[data-v-69e83641]{color:#e4e4e7;background-color:#3f3f46;border:1px solid #71717a}.theme-default[data-v-69e83641]{color:#ffffffe6;background-color:#ffffff1a;border:1px solid #fff3}.rj-warp-gate-popup[data-v-439ad9b8]{z-index:2147483646;color:#f1f5f9;-webkit-backdrop-filter:blur(12px)saturate(120%);box-sizing:border-box;pointer-events:auto;-webkit-user-select:text;user-select:text;background-color:#1e1e1ed9;border:1px solid #ffffff26;border-radius:16px;flex-direction:column;width:650px;max-width:90vw;min-height:250px;max-height:85vh;padding:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;transition:height .35s cubic-bezier(.25,1,.5,1);display:flex;position:fixed;overflow:hidden;box-shadow:0 20px 40px #0006,0 8px 10px #0003}.popup-inner-wrapper[data-v-439ad9b8]{flex-direction:column;width:100%;display:flex}.theme-maniax[data-v-439ad9b8]{border-top:2px solid #ec489966}.theme-girls[data-v-439ad9b8]{border-top:2px solid #f9731666}.popup-close-btn[data-v-439ad9b8]{color:#fff;cursor:pointer;z-index:10;background:#ffffff1a;border-radius:50%;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;transition:all .2s;display:flex;position:absolute;top:12px;right:12px}.popup-close-btn[data-v-439ad9b8]:hover{background:#fff3;transform:scale(1.1)}.popup-content[data-v-439ad9b8]{flex-direction:column;gap:12px;height:100%;display:flex}.popup-header[data-v-439ad9b8]{justify-content:space-between;align-items:flex-start;padding-right:24px;display:flex}.header-main[data-v-439ad9b8]{flex-direction:column;gap:6px;display:flex}.rj-eyebrow[data-v-439ad9b8]{color:#f472b6;cursor:pointer;background-color:#ec489926;border:1px solid #ec48994d;border-radius:6px;align-self:flex-start;padding:2px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.95em;font-weight:700;transition:all .2s}.rj-eyebrow[data-v-439ad9b8]:hover{background-color:#ec489940;transform:scale(.96);box-shadow:0 1px 2px #0000001a}.work-title[data-v-439ad9b8]{cursor:pointer;flex:1;padding-right:20px;font-size:1.4em;font-weight:700;line-height:1.3;transition:color .2s}.panel-container[data-v-439ad9b8]{flex-direction:row;flex:1;gap:20px;min-height:0;display:flex}.panel-left[data-v-439ad9b8]{flex-direction:column;flex:0 0 240px;gap:12px;display:flex}.buttons-container[data-v-439ad9b8]{flex-direction:column;gap:10px;min-height:86px;display:flex}.dlsite-cover-container[data-v-439ad9b8]{margin-bottom:12px;display:block}.panel-right[data-v-439ad9b8]{flex-direction:column;flex:1;padding-right:8px;display:flex;overflow-y:auto}.panel-right[data-v-439ad9b8]::-webkit-scrollbar{width:6px}.panel-right[data-v-439ad9b8]::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.panel-right[data-v-439ad9b8]::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px}.work-title[data-v-439ad9b8]:hover{color:#93c5fd}.circle-name-text[data-v-439ad9b8]{color:#fffffff2;margin-top:1px;font-size:1.05em;font-weight:600;line-height:1.5}.tags-section[data-v-439ad9b8]{margin-bottom:12px;display:flex}.section-title[data-v-439ad9b8]{color:#ffffff80;letter-spacing:1px;flex-shrink:0;width:65px;margin-top:4px;margin-bottom:0;font-size:.9em;font-weight:600}.tags-flow[data-v-439ad9b8]{flex-wrap:wrap;flex:1;gap:6px;display:flex}.popup-skeleton[data-v-439ad9b8]{flex-direction:column;padding:4px;display:flex}.skeleton-header[data-v-439ad9b8]{margin-bottom:16px}.skeleton-eyebrow[data-v-439ad9b8]{background:#ffffff1a;border-radius:4px;width:80px;height:22px;margin-bottom:12px}.skeleton-title[data-v-439ad9b8]{background:#ffffff1a;border-radius:6px;width:90%;height:21px;margin-bottom:8px}.skeleton-title.short[data-v-439ad9b8]{width:60%}.skeleton-panels[data-v-439ad9b8]{flex:1;gap:20px;display:flex}.skeleton-left[data-v-439ad9b8]{flex-direction:column;flex:0 0 240px;gap:12px;width:240px;display:flex}.skeleton-cover[data-v-439ad9b8]{aspect-ratio:1;background:#ffffff1a;border-radius:8px;width:100%}.skeleton-btn[data-v-439ad9b8]{background:#ffffff26;border-radius:6px;width:100%;height:38px}.skeleton-right[data-v-439ad9b8]{flex-direction:column;flex:1;gap:16px;display:flex}.skeleton-row[data-v-439ad9b8]{display:flex}.skeleton-label[data-v-439ad9b8]{background:#ffffff14;border-radius:4px;flex-shrink:0;width:60px;height:20px;margin-top:5px;margin-right:12px}.skeleton-text[data-v-439ad9b8]{background:#ffffff14;border-radius:4px;width:150px;height:20px;margin-top:5px}.skeleton-tags[data-v-439ad9b8]{flex-wrap:wrap;flex:1;gap:6px;display:flex}.skeleton-tag[data-v-439ad9b8]{background:#ffffff14;border-radius:6px;height:26px}.shimmer[data-v-439ad9b8]{position:relative;overflow:hidden}.shimmer[data-v-439ad9b8]:after{content:\"\";background:linear-gradient(90deg,#fff0 0%,#ffffff0d 20%,#ffffff40 50%,#ffffff0d 80%,#fff0 100%);width:200%;height:100%;animation:1.5s linear infinite sweep-439ad9b8;position:absolute;top:0;left:-100%}@keyframes sweep-439ad9b8{0%{transform:translate(-50%)}to{transform:translate(50%)}}.popup-not-found[data-v-439ad9b8]{color:#fff9;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.error-icon[data-v-439ad9b8]{color:#fff3;margin-bottom:16px;font-size:48px;font-weight:700}.error-sub[data-v-439ad9b8]{background:#0003;border-radius:4px;margin-top:8px;padding:4px 8px;font-family:monospace}.fade-enter-active[data-v-439ad9b8],.fade-leave-active[data-v-439ad9b8]{transform-origin:0 0;transition:opacity .25s,transform .25s}.fade-enter-from[data-v-439ad9b8],.fade-leave-to[data-v-439ad9b8]{opacity:0;transform:scale(.95)}@media screen and (width<=600px){.popup-content[data-v-439ad9b8]{flex-direction:column}.panel-left[data-v-439ad9b8]{flex:none;width:100%;margin-bottom:16px}.rj-warp-gate-popup[data-v-439ad9b8]{width:95vw;left:2.5vw!important}}\n/*$vite$:1*/ ");
var localizationMap = {
age_rating: {
zh_CN: "年龄指定",
zh_TW: "年齡指定",
en_US: "Age Rating"
},
circle_name: {
zh_CN: "社团名",
zh_TW: "社團名",
en_US: "Circle Name"
},
click_to_copy: {
zh_CN: "点击复制",
zh_TW: "點擊複製",
en_US: "Click to copy"
},
click_to_copy_title: {
zh_CN: "点击复制标题",
zh_TW: "點擊複製標題",
en_US: "Click to copy title"
},
dl_count: {
zh_CN: "销量",
zh_TW: "銷量",
en_US: "Sales"
},
file_size: {
zh_CN: "文件容量",
zh_TW: "檔案容量",
en_US: "File Size"
},
genre: {
zh_CN: "分类",
zh_TW: "分類",
en_US: "Genre"
},
illustration: {
zh_CN: "插画",
zh_TW: "插圖",
en_US: "Illustration"
},
language_arabic: {
zh_CN: "阿拉伯语",
zh_TW: "阿拉伯語",
en_US: "Arabic"
},
language_english: {
zh_CN: "英文",
zh_TW: "英文",
en_US: "English"
},
language_english_abbr: {
zh_CN: "英",
zh_TW: "英",
en_US: "EN"
},
language_finnish: {
zh_CN: "芬兰语",
zh_TW: "芬蘭語",
en_US: "Finnish"
},
language_french: {
zh_CN: "法语",
zh_TW: "法語",
en_US: "French"
},
language_french_abbr: {
zh_CN: "法",
zh_TW: "法",
en_US: "FR"
},
language_german: {
zh_CN: "德语",
zh_TW: "德語",
en_US: "German"
},
language_german_abbr: {
zh_CN: "德",
zh_TW: "德",
en_US: "DE"
},
language_italian: {
zh_CN: "意大利语",
zh_TW: "義大利語",
en_US: "Italian"
},
language_italian_abbr: {
zh_CN: "意",
zh_TW: "意",
en_US: "IT"
},
language_japanese: {
zh_CN: "日文",
zh_TW: "日文",
en_US: "Japanese"
},
language_japanese_abbr: {
zh_CN: "日",
zh_TW: "日",
en_US: "JP"
},
language_korean: {
zh_CN: "韩语",
zh_TW: "韓語",
en_US: "Korean"
},
language_korean_abbr: {
zh_CN: "韩",
zh_TW: "韩",
en_US: "KO"
},
language_polish: {
zh_CN: "波兰语",
zh_TW: "波蘭語",
en_US: "Polish"
},
language_portuguese: {
zh_CN: "葡萄牙语",
zh_TW: "葡萄牙語",
en_US: "Portuguese"
},
language_portuguese_abbr: {
zh_CN: "葡",
zh_TW: "葡",
en_US: "PT"
},
language_russian: {
zh_CN: "俄语",
zh_TW: "俄語",
en_US: "Russian"
},
language_simplified_chinese: {
zh_CN: "简体中文",
zh_TW: "簡體中文",
en_US: "Simplified Chinese"
},
language_simplified_chinese_abbr: {
zh_CN: "简中",
zh_TW: "簡中",
en_US: "ZH"
},
language_spanish: {
zh_CN: "西班牙语",
zh_TW: "西班牙語",
en_US: "Spanish"
},
language_spanish_abbr: {
zh_CN: "西",
zh_TW: "西",
en_US: "ES"
},
language_thai: {
zh_CN: "泰语",
zh_TW: "泰語",
en_US: "Thai"
},
language_thai_abbr: {
zh_CN: "泰",
zh_TW: "泰",
en_US: "TH"
},
language_traditional_chinese: {
zh_CN: "繁体中文",
zh_TW: "繁體中文",
en_US: "Traditional Chinese"
},
language_traditional_chinese_abbr: {
zh_CN: "繁中",
zh_TW: "繁中",
en_US: "TW"
},
language_vietnamese: {
zh_CN: "越南语",
zh_TW: "越南語",
en_US: "Vietnamese"
},
language_vietnamese_abbr: {
zh_CN: "越",
zh_TW: "越",
en_US: "VN"
},
release_date: {
zh_CN: "发售日",
zh_TW: "發售日",
en_US: "Release Date"
},
scenario: {
zh_CN: "剧情",
zh_TW: "劇情",
en_US: "Scenario"
},
tag_aig: {
zh_CN: "AI生成",
zh_TW: "AI生成",
en_US: "AI Gen"
},
tag_aip: {
zh_CN: "AI部分使用",
zh_TW: "AI部分使用",
en_US: "AI Partial"
},
voice_actor: {
zh_CN: "声优",
zh_TW: "聲優",
en_US: "Voice Actor"
},
work_type_comic: {
zh_CN: "漫画",
zh_TW: "漫畫",
en_US: "Manga"
},
work_type_game: {
zh_CN: "游戏",
zh_TW: "遊戲",
en_US: "Game"
},
work_type_illustration: {
zh_CN: "CG・插画",
zh_TW: "CG・插畫",
en_US: "CG + Illustrations"
},
work_type_music: {
zh_CN: "音乐",
zh_TW: "音樂",
en_US: "Music"
},
work_type_novel: {
zh_CN: "小说",
zh_TW: "小說",
en_US: "Novel"
},
work_type_other: {
zh_CN: "其他",
zh_TW: "其他",
en_US: "Miscellaneous"
},
work_type_tool: {
zh_CN: "工具/装饰",
zh_TW: "工具/配件",
en_US: "Tools / Accessories"
},
work_type_video: {
zh_CN: "视频",
zh_TW: "影片",
en_US: "Video"
},
work_type_voice: {
zh_CN: "音声・ASMR",
zh_TW: "聲音作品・ASMR",
en_US: "Voice / ASMR"
},
work_type_voice_comic: {
zh_CN: "音声漫画",
zh_TW: "有聲漫畫",
en_US: "Voiced Comics"
},
switch_to_light_mode: {
zh_CN: "☀️ 切换至白天模式",
zh_TW: "☀️ 切換至白天模式",
en_US: "☀️ Switch to Light Mode"
},
switch_to_dark_mode: {
zh_CN: "🌙 切换至夜间模式",
zh_TW: "🌙 切換至夜間模式",
en_US: "🌙 Switch to Dark Mode"
},
get: function(key) {
let lang = navigator.language.toLowerCase();
let langKey = "en_US";
if (lang.includes("zh")) if (lang.includes("cn") || lang.includes("sg") || lang === "zh") langKey = "zh_CN";
else langKey = "zh_TW";
return typeof key === "string" ? localizationMap[key]?.[langKey] : key[langKey];
}
};
function localize(key) {
return localizationMap.get(key);
}
function localizePopup(key) {
return localizationMap.get(key);
}
var RJ_REGEX = new RegExp("(R[JE][0-9]{8})|(R[JE][0-9]{6})|([VB]J[0-9]{8})|([VB]J[0-9]{6})", "gi");
var URL_REGEX = new RegExp("dlsite.com/.*/product_id/((R[JE][0-9]{8})|(R[JE][0-9]{6})|([VB]J[0-9]{8})|([VB]J[0-9]{6}))", "g");
var VOICELINK_CLASS = "voicelink-" + Math.random().toString(36).slice(2);
var VOICELINK_IGNORED_CLASS = `${VOICELINK_CLASS}_ignored`;
var RJCODE_ATTRIBUTE = "rjcode";
var LANG_MAP = {
JPN: localizePopup(localizationMap.language_japanese),
ENG: localizePopup(localizationMap.language_english),
CHI_HANS: localizePopup(localizationMap.language_simplified_chinese),
CHI_HANT: localizePopup(localizationMap.language_traditional_chinese),
KO_KR: localizePopup(localizationMap.language_korean),
SPA: localizePopup(localizationMap.language_spanish),
FRE: localizePopup(localizationMap.language_french),
RUS: localizePopup(localizationMap.language_russian),
THA: localizePopup(localizationMap.language_thai),
GER: localizePopup(localizationMap.language_german),
FIN: localizePopup(localizationMap.language_finnish),
POR: localizePopup(localizationMap.language_portuguese),
VIE: localizePopup(localizationMap.language_vietnamese),
ITA: localizePopup(localizationMap.language_italian),
ARA: localizePopup(localizationMap.language_arabic),
POL: localizePopup(localizationMap.language_polish)
};
localizePopup(localizationMap.language_japanese_abbr), localizePopup(localizationMap.language_english_abbr), localizePopup(localizationMap.language_simplified_chinese_abbr), localizePopup(localizationMap.language_traditional_chinese_abbr), localizePopup(localizationMap.language_korean_abbr), localizePopup(localizationMap.language_spanish_abbr), localizePopup(localizationMap.language_french_abbr), localizePopup(localizationMap.language_thai_abbr), localizePopup(localizationMap.language_german_abbr), localizePopup(localizationMap.language_portuguese_abbr), localizePopup(localizationMap.language_vietnamese_abbr), localizePopup(localizationMap.language_italian_abbr);
function makeMap(str) {
const map = Object.create(null);
for (const key of str.split(",")) map[key] = 1;
return (val) => val in map;
}
var EMPTY_OBJ = {};
var EMPTY_ARR = [];
var NOOP = () => {};
var NO = () => false;
var isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && (key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);
var isModelListener = (key) => key.startsWith("onUpdate:");
var extend = Object.assign;
var remove = (arr, el) => {
const i = arr.indexOf(el);
if (i > -1) arr.splice(i, 1);
};
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
var hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
var isArray = Array.isArray;
var isMap = (val) => toTypeString(val) === "[object Map]";
var isSet = (val) => toTypeString(val) === "[object Set]";
var isDate = (val) => toTypeString(val) === "[object Date]";
var isFunction = (val) => typeof val === "function";
var isString = (val) => typeof val === "string";
var isSymbol = (val) => typeof val === "symbol";
var isObject = (val) => val !== null && typeof val === "object";
var isPromise = (val) => {
return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);
};
var objectToString = Object.prototype.toString;
var toTypeString = (value) => objectToString.call(value);
var toRawType = (value) => {
return toTypeString(value).slice(8, -1);
};
var isPlainObject = (val) => toTypeString(val) === "[object Object]";
var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key;
var isReservedProp = makeMap(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted");
var cacheStringFunction = (fn) => {
const cache = Object.create(null);
return ((str) => {
return cache[str] || (cache[str] = fn(str));
});
};
var camelizeRE = /-\w/g;
var camelize = cacheStringFunction((str) => {
return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());
});
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, "-$1").toLowerCase());
var capitalize = cacheStringFunction((str) => {
return str.charAt(0).toUpperCase() + str.slice(1);
});
var toHandlerKey = cacheStringFunction((str) => {
return str ? `on${capitalize(str)}` : ``;
});
var hasChanged = (value, oldValue) => !Object.is(value, oldValue);
var invokeArrayFns = (fns, ...arg) => {
for (let i = 0; i < fns.length; i++) fns[i](...arg);
};
var def = (obj, key, value, writable = false) => {
Object.defineProperty(obj, key, {
configurable: true,
enumerable: false,
writable,
value
});
};
var looseToNumber = (val) => {
const n = parseFloat(val);
return isNaN(n) ? val : n;
};
var toNumber = (val) => {
const n = isString(val) ? Number(val) : NaN;
return isNaN(n) ? val : n;
};
var _globalThis;
var getGlobalThis = () => {
return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {});
};
function normalizeStyle(value) {
if (isArray(value)) {
const res = {};
for (let i = 0; i < value.length; i++) {
const item = value[i];
const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
if (normalized) for (const key in normalized) res[key] = normalized[key];
}
return res;
} else if (isString(value) || isObject(value)) return value;
}
var listDelimiterRE = /;(?![^(]*\))/g;
var propertyDelimiterRE = /:([^]+)/;
var styleCommentRE = /\/\*[^]*?\*\//g;
function parseStringStyle(cssText) {
const ret = {};
cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => {
if (item) {
const tmp = item.split(propertyDelimiterRE);
tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
}
});
return ret;
}
function normalizeClass(value) {
let res = "";
if (isString(value)) res = value;
else if (isArray(value)) for (let i = 0; i < value.length; i++) {
const normalized = normalizeClass(value[i]);
if (normalized) res += normalized + " ";
}
else if (isObject(value)) {
for (const name in value) if (value[name]) res += name + " ";
}
return res.trim();
}
var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;
var isSpecialBooleanAttr = makeMap(specialBooleanAttrs);
specialBooleanAttrs + "";
function includeBooleanAttr(value) {
return !!value || value === "";
}
function looseCompareArrays(a, b) {
if (a.length !== b.length) return false;
let equal = true;
for (let i = 0; equal && i < a.length; i++) equal = looseEqual(a[i], b[i]);
return equal;
}
function looseEqual(a, b) {
if (a === b) return true;
let aValidType = isDate(a);
let bValidType = isDate(b);
if (aValidType || bValidType) return aValidType && bValidType ? a.getTime() === b.getTime() : false;
aValidType = isSymbol(a);
bValidType = isSymbol(b);
if (aValidType || bValidType) return a === b;
aValidType = isArray(a);
bValidType = isArray(b);
if (aValidType || bValidType) return aValidType && bValidType ? looseCompareArrays(a, b) : false;
aValidType = isObject(a);
bValidType = isObject(b);
if (aValidType || bValidType) {
if (!aValidType || !bValidType) return false;
if (Object.keys(a).length !== Object.keys(b).length) return false;
for (const key in a) {
const aHasKey = a.hasOwnProperty(key);
const bHasKey = b.hasOwnProperty(key);
if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) return false;
}
}
return String(a) === String(b);
}
var isRef$1 = (val) => {
return !!(val && val["__v_isRef"] === true);
};
var toDisplayString = (val) => {
return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef$1(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);
};
var replacer = (_key, val) => {
if (isRef$1(val)) return replacer(_key, val.value);
else if (isMap(val)) return { [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2], i) => {
entries[stringifySymbol(key, i) + " =>"] = val2;
return entries;
}, {}) };
else if (isSet(val)) return { [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) };
else if (isSymbol(val)) return stringifySymbol(val);
else if (isObject(val) && !isArray(val) && !isPlainObject(val)) return String(val);
return val;
};
var stringifySymbol = (v, i = "") => {
var _a;
return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;
};
var activeEffectScope;
var EffectScope = class {
constructor(detached = false) {
this.detached = detached;
this._active = true;
this._on = 0;
this.effects = [];
this.cleanups = [];
this._isPaused = false;
this._warnOnRun = true;
this.__v_skip = true;
if (!detached && activeEffectScope) if (activeEffectScope.active) {
this.parent = activeEffectScope;
this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(this) - 1;
} else {
this._active = false;
this._warnOnRun = false;
}
}
get active() {
return this._active;
}
pause() {
if (this._active) {
this._isPaused = true;
let i, l;
if (this.scopes) for (i = 0, l = this.scopes.length; i < l; i++) this.scopes[i].pause();
for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].pause();
}
}
resume() {
if (this._active) {
if (this._isPaused) {
this._isPaused = false;
let i, l;
if (this.scopes) for (i = 0, l = this.scopes.length; i < l; i++) this.scopes[i].resume();
for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].resume();
}
}
}
run(fn) {
if (this._active) {
const currentEffectScope = activeEffectScope;
try {
activeEffectScope = this;
return fn();
} finally {
activeEffectScope = currentEffectScope;
}
}
}
on() {
if (++this._on === 1) {
this.prevScope = activeEffectScope;
activeEffectScope = this;
}
}
off() {
if (this._on > 0 && --this._on === 0) {
if (activeEffectScope === this) activeEffectScope = this.prevScope;
else {
let current = activeEffectScope;
while (current) {
if (current.prevScope === this) {
current.prevScope = this.prevScope;
break;
}
current = current.prevScope;
}
}
this.prevScope = void 0;
}
}
stop(fromParent) {
if (this._active) {
this._active = false;
let i, l;
for (i = 0, l = this.effects.length; i < l; i++) this.effects[i].stop();
this.effects.length = 0;
for (i = 0, l = this.cleanups.length; i < l; i++) this.cleanups[i]();
this.cleanups.length = 0;
if (this.scopes) {
for (i = 0, l = this.scopes.length; i < l; i++) this.scopes[i].stop(true);
this.scopes.length = 0;
}
if (!this.detached && this.parent && !fromParent) {
const last = this.parent.scopes.pop();
if (last && last !== this) {
this.parent.scopes[this.index] = last;
last.index = this.index;
}
}
this.parent = void 0;
}
}
};
function getCurrentScope() {
return activeEffectScope;
}
var activeSub;
var pausedQueueEffects = new WeakSet();
var ReactiveEffect = class {
constructor(fn) {
this.fn = fn;
this.deps = void 0;
this.depsTail = void 0;
this.flags = 5;
this.next = void 0;
this.cleanup = void 0;
this.scheduler = void 0;
if (activeEffectScope) if (activeEffectScope.active) activeEffectScope.effects.push(this);
else this.flags &= -2;
}
pause() {
this.flags |= 64;
}
resume() {
if (this.flags & 64) {
this.flags &= -65;
if (pausedQueueEffects.has(this)) {
pausedQueueEffects.delete(this);
this.trigger();
}
}
}
notify() {
if (this.flags & 2 && !(this.flags & 32)) return;
if (!(this.flags & 8)) batch(this);
}
run() {
if (!(this.flags & 1)) return this.fn();
this.flags |= 2;
cleanupEffect(this);
prepareDeps(this);
const prevEffect = activeSub;
const prevShouldTrack = shouldTrack;
activeSub = this;
shouldTrack = true;
try {
return this.fn();
} finally {
cleanupDeps(this);
activeSub = prevEffect;
shouldTrack = prevShouldTrack;
this.flags &= -3;
}
}
stop() {
if (this.flags & 1) {
for (let link = this.deps; link; link = link.nextDep) removeSub(link);
this.deps = this.depsTail = void 0;
cleanupEffect(this);
this.onStop && this.onStop();
this.flags &= -2;
}
}
trigger() {
if (this.flags & 64) pausedQueueEffects.add(this);
else if (this.scheduler) this.scheduler();
else this.runIfDirty();
}
runIfDirty() {
if (isDirty(this)) this.run();
}
get dirty() {
return isDirty(this);
}
};
var batchDepth = 0;
var batchedSub;
var batchedComputed;
function batch(sub, isComputed = false) {
sub.flags |= 8;
if (isComputed) {
sub.next = batchedComputed;
batchedComputed = sub;
return;
}
sub.next = batchedSub;
batchedSub = sub;
}
function startBatch() {
batchDepth++;
}
function endBatch() {
if (--batchDepth > 0) return;
if (batchedComputed) {
let e = batchedComputed;
batchedComputed = void 0;
while (e) {
const next = e.next;
e.next = void 0;
e.flags &= -9;
e = next;
}
}
let error;
while (batchedSub) {
let e = batchedSub;
batchedSub = void 0;
while (e) {
const next = e.next;
e.next = void 0;
e.flags &= -9;
if (e.flags & 1) try {
e.trigger();
} catch (err) {
if (!error) error = err;
}
e = next;
}
}
if (error) throw error;
}
function prepareDeps(sub) {
for (let link = sub.deps; link; link = link.nextDep) {
link.version = -1;
link.prevActiveLink = link.dep.activeLink;
link.dep.activeLink = link;
}
}
function cleanupDeps(sub) {
let head;
let tail = sub.depsTail;
let link = tail;
while (link) {
const prev = link.prevDep;
if (link.version === -1) {
if (link === tail) tail = prev;
removeSub(link);
removeDep(link);
} else head = link;
link.dep.activeLink = link.prevActiveLink;
link.prevActiveLink = void 0;
link = prev;
}
sub.deps = head;
sub.depsTail = tail;
}
function isDirty(sub) {
for (let link = sub.deps; link; link = link.nextDep) if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) return true;
if (sub._dirty) return true;
return false;
}
function refreshComputed(computed) {
if (computed.flags & 4 && !(computed.flags & 16)) return;
computed.flags &= -17;
if (computed.globalVersion === globalVersion) return;
computed.globalVersion = globalVersion;
if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) return;
computed.flags |= 2;
const dep = computed.dep;
const prevSub = activeSub;
const prevShouldTrack = shouldTrack;
activeSub = computed;
shouldTrack = true;
try {
prepareDeps(computed);
const value = computed.fn(computed._value);
if (dep.version === 0 || hasChanged(value, computed._value)) {
computed.flags |= 128;
computed._value = value;
dep.version++;
}
} catch (err) {
dep.version++;
throw err;
} finally {
activeSub = prevSub;
shouldTrack = prevShouldTrack;
cleanupDeps(computed);
computed.flags &= -3;
}
}
function removeSub(link, soft = false) {
const { dep, prevSub, nextSub } = link;
if (prevSub) {
prevSub.nextSub = nextSub;
link.prevSub = void 0;
}
if (nextSub) {
nextSub.prevSub = prevSub;
link.nextSub = void 0;
}
if (dep.subs === link) {
dep.subs = prevSub;
if (!prevSub && dep.computed) {
dep.computed.flags &= -5;
for (let l = dep.computed.deps; l; l = l.nextDep) removeSub(l, true);
}
}
if (!soft && !--dep.sc && dep.map) dep.map.delete(dep.key);
}
function removeDep(link) {
const { prevDep, nextDep } = link;
if (prevDep) {
prevDep.nextDep = nextDep;
link.prevDep = void 0;
}
if (nextDep) {
nextDep.prevDep = prevDep;
link.nextDep = void 0;
}
}
var shouldTrack = true;
var trackStack = [];
function pauseTracking() {
trackStack.push(shouldTrack);
shouldTrack = false;
}
function resetTracking() {
const last = trackStack.pop();
shouldTrack = last === void 0 ? true : last;
}
function cleanupEffect(e) {
const { cleanup } = e;
e.cleanup = void 0;
if (cleanup) {
const prevSub = activeSub;
activeSub = void 0;
try {
cleanup();
} finally {
activeSub = prevSub;
}
}
}
var globalVersion = 0;
var Link = class {
constructor(sub, dep) {
this.sub = sub;
this.dep = dep;
this.version = dep.version;
this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;
}
};
var Dep = class {
constructor(computed) {
this.computed = computed;
this.version = 0;
this.activeLink = void 0;
this.subs = void 0;
this.map = void 0;
this.key = void 0;
this.sc = 0;
this.__v_skip = true;
}
track(debugInfo) {
if (!activeSub || !shouldTrack || activeSub === this.computed) return;
let link = this.activeLink;
if (link === void 0 || link.sub !== activeSub) {
link = this.activeLink = new Link(activeSub, this);
if (!activeSub.deps) activeSub.deps = activeSub.depsTail = link;
else {
link.prevDep = activeSub.depsTail;
activeSub.depsTail.nextDep = link;
activeSub.depsTail = link;
}
addSub(link);
} else if (link.version === -1) {
link.version = this.version;
if (link.nextDep) {
const next = link.nextDep;
next.prevDep = link.prevDep;
if (link.prevDep) link.prevDep.nextDep = next;
link.prevDep = activeSub.depsTail;
link.nextDep = void 0;
activeSub.depsTail.nextDep = link;
activeSub.depsTail = link;
if (activeSub.deps === link) activeSub.deps = next;
}
}
return link;
}
trigger(debugInfo) {
this.version++;
globalVersion++;
this.notify(debugInfo);
}
notify(debugInfo) {
startBatch();
try {
for (let link = this.subs; link; link = link.prevSub) if (link.sub.notify()) link.sub.dep.notify();
} finally {
endBatch();
}
}
};
function addSub(link) {
link.dep.sc++;
if (link.sub.flags & 4) {
const computed = link.dep.computed;
if (computed && !link.dep.subs) {
computed.flags |= 20;
for (let l = computed.deps; l; l = l.nextDep) addSub(l);
}
const currentTail = link.dep.subs;
if (currentTail !== link) {
link.prevSub = currentTail;
if (currentTail) currentTail.nextSub = link;
}
link.dep.subs = link;
}
}
var targetMap = new WeakMap();
var ITERATE_KEY = Symbol("");
var MAP_KEY_ITERATE_KEY = Symbol("");
var ARRAY_ITERATE_KEY = Symbol("");
function track(target, type, key) {
if (shouldTrack && activeSub) {
let depsMap = targetMap.get(target);
if (!depsMap) targetMap.set(target, depsMap = new Map());
let dep = depsMap.get(key);
if (!dep) {
depsMap.set(key, dep = new Dep());
dep.map = depsMap;
dep.key = key;
}
dep.track();
}
}
function trigger(target, type, key, newValue, oldValue, oldTarget) {
const depsMap = targetMap.get(target);
if (!depsMap) {
globalVersion++;
return;
}
const run = (dep) => {
if (dep) dep.trigger();
};
startBatch();
if (type === "clear") depsMap.forEach(run);
else {
const targetIsArray = isArray(target);
const isArrayIndex = targetIsArray && isIntegerKey(key);
if (targetIsArray && key === "length") {
const newLength = Number(newValue);
depsMap.forEach((dep, key2) => {
if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) run(dep);
});
} else {
if (key !== void 0 || depsMap.has(void 0)) run(depsMap.get(key));
if (isArrayIndex) run(depsMap.get(ARRAY_ITERATE_KEY));
switch (type) {
case "add":
if (!targetIsArray) {
run(depsMap.get(ITERATE_KEY));
if (isMap(target)) run(depsMap.get(MAP_KEY_ITERATE_KEY));
} else if (isArrayIndex) run(depsMap.get("length"));
break;
case "delete":
if (!targetIsArray) {
run(depsMap.get(ITERATE_KEY));
if (isMap(target)) run(depsMap.get(MAP_KEY_ITERATE_KEY));
}
break;
case "set":
if (isMap(target)) run(depsMap.get(ITERATE_KEY));
break;
}
}
}
endBatch();
}
function reactiveReadArray(array) {
const raw = toRaw(array);
if (raw === array) return raw;
track(raw, "iterate", ARRAY_ITERATE_KEY);
return isShallow(array) ? raw : raw.map(toReactive);
}
function shallowReadArray(arr) {
track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY);
return arr;
}
function toWrapped(target, item) {
if (isReadonly(target)) return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);
return toReactive(item);
}
var arrayInstrumentations = {
__proto__: null,
[Symbol.iterator]() {
return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));
},
concat(...args) {
return reactiveReadArray(this).concat(...args.map((x) => isArray(x) ? reactiveReadArray(x) : x));
},
entries() {
return iterator(this, "entries", (value) => {
value[1] = toWrapped(this, value[1]);
return value;
});
},
every(fn, thisArg) {
return apply(this, "every", fn, thisArg, void 0, arguments);
},
filter(fn, thisArg) {
return apply(this, "filter", fn, thisArg, (v) => v.map((item) => toWrapped(this, item)), arguments);
},
find(fn, thisArg) {
return apply(this, "find", fn, thisArg, (item) => toWrapped(this, item), arguments);
},
findIndex(fn, thisArg) {
return apply(this, "findIndex", fn, thisArg, void 0, arguments);
},
findLast(fn, thisArg) {
return apply(this, "findLast", fn, thisArg, (item) => toWrapped(this, item), arguments);
},
findLastIndex(fn, thisArg) {
return apply(this, "findLastIndex", fn, thisArg, void 0, arguments);
},
forEach(fn, thisArg) {
return apply(this, "forEach", fn, thisArg, void 0, arguments);
},
includes(...args) {
return searchProxy(this, "includes", args);
},
indexOf(...args) {
return searchProxy(this, "indexOf", args);
},
join(separator) {
return reactiveReadArray(this).join(separator);
},
lastIndexOf(...args) {
return searchProxy(this, "lastIndexOf", args);
},
map(fn, thisArg) {
return apply(this, "map", fn, thisArg, void 0, arguments);
},
pop() {
return noTracking(this, "pop");
},
push(...args) {
return noTracking(this, "push", args);
},
reduce(fn, ...args) {
return reduce(this, "reduce", fn, args);
},
reduceRight(fn, ...args) {
return reduce(this, "reduceRight", fn, args);
},
shift() {
return noTracking(this, "shift");
},
some(fn, thisArg) {
return apply(this, "some", fn, thisArg, void 0, arguments);
},
splice(...args) {
return noTracking(this, "splice", args);
},
toReversed() {
return reactiveReadArray(this).toReversed();
},
toSorted(comparer) {
return reactiveReadArray(this).toSorted(comparer);
},
toSpliced(...args) {
return reactiveReadArray(this).toSpliced(...args);
},
unshift(...args) {
return noTracking(this, "unshift", args);
},
values() {
return iterator(this, "values", (item) => toWrapped(this, item));
}
};
function iterator(self, method, wrapValue) {
const arr = shallowReadArray(self);
const iter = arr[method]();
if (arr !== self && !isShallow(self)) {
iter._next = iter.next;
iter.next = () => {
const result = iter._next();
if (!result.done) result.value = wrapValue(result.value);
return result;
};
}
return iter;
}
var arrayProto = Array.prototype;
function apply(self, method, fn, thisArg, wrappedRetFn, args) {
const arr = shallowReadArray(self);
const needsWrap = arr !== self && !isShallow(self);
const methodFn = arr[method];
if (methodFn !== arrayProto[method]) {
const result2 = methodFn.apply(self, args);
return needsWrap ? toReactive(result2) : result2;
}
let wrappedFn = fn;
if (arr !== self) {
if (needsWrap) wrappedFn = function(item, index) {
return fn.call(this, toWrapped(self, item), index, self);
};
else if (fn.length > 2) wrappedFn = function(item, index) {
return fn.call(this, item, index, self);
};
}
const result = methodFn.call(arr, wrappedFn, thisArg);
return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;
}
function reduce(self, method, fn, args) {
const arr = shallowReadArray(self);
const needsWrap = arr !== self && !isShallow(self);
let wrappedFn = fn;
let wrapInitialAccumulator = false;
if (arr !== self) {
if (needsWrap) {
wrapInitialAccumulator = args.length === 0;
wrappedFn = function(acc, item, index) {
if (wrapInitialAccumulator) {
wrapInitialAccumulator = false;
acc = toWrapped(self, acc);
}
return fn.call(this, acc, toWrapped(self, item), index, self);
};
} else if (fn.length > 3) wrappedFn = function(acc, item, index) {
return fn.call(this, acc, item, index, self);
};
}
const result = arr[method](wrappedFn, ...args);
return wrapInitialAccumulator ? toWrapped(self, result) : result;
}
function searchProxy(self, method, args) {
const arr = toRaw(self);
track(arr, "iterate", ARRAY_ITERATE_KEY);
const res = arr[method](...args);
if ((res === -1 || res === false) && isProxy(args[0])) {
args[0] = toRaw(args[0]);
return arr[method](...args);
}
return res;
}
function noTracking(self, method, args = []) {
pauseTracking();
startBatch();
const res = toRaw(self)[method].apply(self, args);
endBatch();
resetTracking();
return res;
}
var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`);
var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol));
function hasOwnProperty(key) {
if (!isSymbol(key)) key = String(key);
const obj = toRaw(this);
track(obj, "has", key);
return obj.hasOwnProperty(key);
}
var BaseReactiveHandler = class {
constructor(_isReadonly = false, _isShallow = false) {
this._isReadonly = _isReadonly;
this._isShallow = _isShallow;
}
get(target, key, receiver) {
if (key === "__v_skip") return target["__v_skip"];
const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;
if (key === "__v_isReactive") return !isReadonly2;
else if (key === "__v_isReadonly") return isReadonly2;
else if (key === "__v_isShallow") return isShallow2;
else if (key === "__v_raw") {
if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) return target;
return;
}
const targetIsArray = isArray(target);
if (!isReadonly2) {
let fn;
if (targetIsArray && (fn = arrayInstrumentations[key])) return fn;
if (key === "hasOwnProperty") return hasOwnProperty;
}
const res = Reflect.get(target, key, isRef(target) ? target : receiver);
if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) return res;
if (!isReadonly2) track(target, "get", key);
if (isShallow2) return res;
if (isRef(res)) {
const value = targetIsArray && isIntegerKey(key) ? res : res.value;
return isReadonly2 && isObject(value) ? readonly(value) : value;
}
if (isObject(res)) return isReadonly2 ? readonly(res) : reactive(res);
return res;
}
};
var MutableReactiveHandler = class extends BaseReactiveHandler {
constructor(isShallow2 = false) {
super(false, isShallow2);
}
set(target, key, value, receiver) {
let oldValue = target[key];
const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);
if (!this._isShallow) {
const isOldValueReadonly = isReadonly(oldValue);
if (!isShallow(value) && !isReadonly(value)) {
oldValue = toRaw(oldValue);
value = toRaw(value);
}
if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) if (isOldValueReadonly) return true;
else {
oldValue.value = value;
return true;
}
}
const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);
const result = Reflect.set(target, key, value, isRef(target) ? target : receiver);
if (target === toRaw(receiver)) {
if (!hadKey) trigger(target, "add", key, value);
else if (hasChanged(value, oldValue)) trigger(target, "set", key, value, oldValue);
}
return result;
}
deleteProperty(target, key) {
const hadKey = hasOwn(target, key);
const oldValue = target[key];
const result = Reflect.deleteProperty(target, key);
if (result && hadKey) trigger(target, "delete", key, void 0, oldValue);
return result;
}
has(target, key) {
const result = Reflect.has(target, key);
if (!isSymbol(key) || !builtInSymbols.has(key)) track(target, "has", key);
return result;
}
ownKeys(target) {
track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY);
return Reflect.ownKeys(target);
}
};
var ReadonlyReactiveHandler = class extends BaseReactiveHandler {
constructor(isShallow2 = false) {
super(true, isShallow2);
}
set(target, key) {
return true;
}
deleteProperty(target, key) {
return true;
}
};
var mutableHandlers = new MutableReactiveHandler();
var readonlyHandlers = new ReadonlyReactiveHandler();
var shallowReactiveHandlers = new MutableReactiveHandler(true);
var toShallow = (value) => value;
var getProto = (v) => Reflect.getPrototypeOf(v);
function createIterableMethod(method, isReadonly2, isShallow2) {
return function(...args) {
const target = this["__v_raw"];
const rawTarget = toRaw(target);
const targetIsMap = isMap(rawTarget);
const isPair = method === "entries" || method === Symbol.iterator && targetIsMap;
const isKeyOnly = method === "keys" && targetIsMap;
const innerIterator = target[method](...args);
const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;
!isReadonly2 && track(rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);
return extend(Object.create(innerIterator), { next() {
const { value, done } = innerIterator.next();
return done ? {
value,
done
} : {
value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
done
};
} });
};
}
function createReadonlyMethod(type) {
return function(...args) {
return type === "delete" ? false : type === "clear" ? void 0 : this;
};
}
function createInstrumentations(readonly, shallow) {
const instrumentations = {
get(key) {
const target = this["__v_raw"];
const rawTarget = toRaw(target);
const rawKey = toRaw(key);
if (!readonly) {
if (hasChanged(key, rawKey)) track(rawTarget, "get", key);
track(rawTarget, "get", rawKey);
}
const { has } = getProto(rawTarget);
const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;
if (has.call(rawTarget, key)) return wrap(target.get(key));
else if (has.call(rawTarget, rawKey)) return wrap(target.get(rawKey));
else if (target !== rawTarget) target.get(key);
},
get size() {
const target = this["__v_raw"];
!readonly && track(toRaw(target), "iterate", ITERATE_KEY);
return target.size;
},
has(key) {
const target = this["__v_raw"];
const rawTarget = toRaw(target);
const rawKey = toRaw(key);
if (!readonly) {
if (hasChanged(key, rawKey)) track(rawTarget, "has", key);
track(rawTarget, "has", rawKey);
}
return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
},
forEach(callback, thisArg) {
const observed = this;
const target = observed["__v_raw"];
const rawTarget = toRaw(target);
const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;
!readonly && track(rawTarget, "iterate", ITERATE_KEY);
return target.forEach((value, key) => {
return callback.call(thisArg, wrap(value), wrap(key), observed);
});
}
};
extend(instrumentations, readonly ? {
add: createReadonlyMethod("add"),
set: createReadonlyMethod("set"),
delete: createReadonlyMethod("delete"),
clear: createReadonlyMethod("clear")
} : {
add(value) {
const target = toRaw(this);
const proto = getProto(target);
const rawValue = toRaw(value);
const valueToAdd = !shallow && !isShallow(value) && !isReadonly(value) ? rawValue : value;
if (!(proto.has.call(target, valueToAdd) || hasChanged(value, valueToAdd) && proto.has.call(target, value) || hasChanged(rawValue, valueToAdd) && proto.has.call(target, rawValue))) {
target.add(valueToAdd);
trigger(target, "add", valueToAdd, valueToAdd);
}
return this;
},
set(key, value) {
if (!shallow && !isShallow(value) && !isReadonly(value)) value = toRaw(value);
const target = toRaw(this);
const { has, get } = getProto(target);
let hadKey = has.call(target, key);
if (!hadKey) {
key = toRaw(key);
hadKey = has.call(target, key);
}
const oldValue = get.call(target, key);
target.set(key, value);
if (!hadKey) trigger(target, "add", key, value);
else if (hasChanged(value, oldValue)) trigger(target, "set", key, value, oldValue);
return this;
},
delete(key) {
const target = toRaw(this);
const { has, get } = getProto(target);
let hadKey = has.call(target, key);
if (!hadKey) {
key = toRaw(key);
hadKey = has.call(target, key);
}
const oldValue = get ? get.call(target, key) : void 0;
const result = target.delete(key);
if (hadKey) trigger(target, "delete", key, void 0, oldValue);
return result;
},
clear() {
const target = toRaw(this);
const hadItems = target.size !== 0;
const oldTarget = void 0;
const result = target.clear();
if (hadItems) trigger(target, "clear", void 0, void 0, oldTarget);
return result;
}
});
[
"keys",
"values",
"entries",
Symbol.iterator
].forEach((method) => {
instrumentations[method] = createIterableMethod(method, readonly, shallow);
});
return instrumentations;
}
function createInstrumentationGetter(isReadonly2, shallow) {
const instrumentations = createInstrumentations(isReadonly2, shallow);
return (target, key, receiver) => {
if (key === "__v_isReactive") return !isReadonly2;
else if (key === "__v_isReadonly") return isReadonly2;
else if (key === "__v_raw") return target;
return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
};
}
var mutableCollectionHandlers = { get: createInstrumentationGetter(false, false) };
var shallowCollectionHandlers = { get: createInstrumentationGetter(false, true) };
var readonlyCollectionHandlers = { get: createInstrumentationGetter(true, false) };
var reactiveMap = new WeakMap();
var shallowReactiveMap = new WeakMap();
var readonlyMap = new WeakMap();
var shallowReadonlyMap = new WeakMap();
function targetTypeMap(rawType) {
switch (rawType) {
case "Object":
case "Array": return 1;
case "Map":
case "Set":
case "WeakMap":
case "WeakSet": return 2;
default: return 0;
}
}
function reactive(target) {
if (isReadonly(target)) return target;
return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
}
function shallowReactive(target) {
return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);
}
function readonly(target) {
return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
}
function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {
if (!isObject(target)) return target;
if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) return target;
if (target["__v_skip"] || !Object.isExtensible(target)) return target;
const existingProxy = proxyMap.get(target);
if (existingProxy) return existingProxy;
const targetType = targetTypeMap(toRawType(target));
if (targetType === 0) return target;
const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);
proxyMap.set(target, proxy);
return proxy;
}
function isReactive(value) {
if (isReadonly(value)) return isReactive(value["__v_raw"]);
return !!(value && value["__v_isReactive"]);
}
function isReadonly(value) {
return !!(value && value["__v_isReadonly"]);
}
function isShallow(value) {
return !!(value && value["__v_isShallow"]);
}
function isProxy(value) {
return value ? !!value["__v_raw"] : false;
}
function toRaw(observed) {
const raw = observed && observed["__v_raw"];
return raw ? toRaw(raw) : observed;
}
function markRaw(value) {
if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) def(value, "__v_skip", true);
return value;
}
var toReactive = (value) => isObject(value) ? reactive(value) : value;
var toReadonly = (value) => isObject(value) ? readonly(value) : value;
function isRef(r) {
return r ? r["__v_isRef"] === true : false;
}
function ref(value) {
return createRef(value, false);
}
function createRef(rawValue, shallow) {
if (isRef(rawValue)) return rawValue;
return new RefImpl(rawValue, shallow);
}
var RefImpl = class {
constructor(value, isShallow2) {
this.dep = new Dep();
this["__v_isRef"] = true;
this["__v_isShallow"] = false;
this._rawValue = isShallow2 ? value : toRaw(value);
this._value = isShallow2 ? value : toReactive(value);
this["__v_isShallow"] = isShallow2;
}
get value() {
this.dep.track();
return this._value;
}
set value(newValue) {
const oldValue = this._rawValue;
const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue);
newValue = useDirectValue ? newValue : toRaw(newValue);
if (hasChanged(newValue, oldValue)) {
this._rawValue = newValue;
this._value = useDirectValue ? newValue : toReactive(newValue);
this.dep.trigger();
}
}
};
function unref(ref2) {
return isRef(ref2) ? ref2.value : ref2;
}
var shallowUnwrapHandlers = {
get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)),
set: (target, key, value, receiver) => {
const oldValue = target[key];
if (isRef(oldValue) && !isRef(value)) {
oldValue.value = value;
return true;
} else return Reflect.set(target, key, value, receiver);
}
};
function proxyRefs(objectWithRefs) {
return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);
}
var ComputedRefImpl = class {
constructor(fn, setter, isSSR) {
this.fn = fn;
this.setter = setter;
this._value = void 0;
this.dep = new Dep(this);
this.__v_isRef = true;
this.deps = void 0;
this.depsTail = void 0;
this.flags = 16;
this.globalVersion = globalVersion - 1;
this.next = void 0;
this.effect = this;
this["__v_isReadonly"] = !setter;
this.isSSR = isSSR;
}
notify() {
this.flags |= 16;
if (!(this.flags & 8) && activeSub !== this) {
batch(this, true);
return true;
}
}
get value() {
const link = this.dep.track();
refreshComputed(this);
if (link) link.version = this.dep.version;
return this._value;
}
set value(newValue) {
if (this.setter) this.setter(newValue);
}
};
function computed$1(getterOrOptions, debugOptions, isSSR = false) {
let getter;
let setter;
if (isFunction(getterOrOptions)) getter = getterOrOptions;
else {
getter = getterOrOptions.get;
setter = getterOrOptions.set;
}
return new ComputedRefImpl(getter, setter, isSSR);
}
var INITIAL_WATCHER_VALUE = {};
var cleanupMap = new WeakMap();
var activeWatcher = void 0;
function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {
if (owner) {
let cleanups = cleanupMap.get(owner);
if (!cleanups) cleanupMap.set(owner, cleanups = []);
cleanups.push(cleanupFn);
}
}
function watch$1(source, cb, options = EMPTY_OBJ) {
const { immediate, deep, once, scheduler, augmentJob, call } = options;
const reactiveGetter = (source2) => {
if (deep) return source2;
if (isShallow(source2) || deep === false || deep === 0) return traverse(source2, 1);
return traverse(source2);
};
let effect;
let getter;
let cleanup;
let boundCleanup;
let forceTrigger = false;
let isMultiSource = false;
if (isRef(source)) {
getter = () => source.value;
forceTrigger = isShallow(source);
} else if (isReactive(source)) {
getter = () => reactiveGetter(source);
forceTrigger = true;
} else if (isArray(source)) {
isMultiSource = true;
forceTrigger = source.some((s) => isReactive(s) || isShallow(s));
getter = () => source.map((s) => {
if (isRef(s)) return s.value;
else if (isReactive(s)) return reactiveGetter(s);
else if (isFunction(s)) return call ? call(s, 2) : s();
});
} else if (isFunction(source)) if (cb) getter = call ? () => call(source, 2) : source;
else getter = () => {
if (cleanup) {
pauseTracking();
try {
cleanup();
} finally {
resetTracking();
}
}
const currentEffect = activeWatcher;
activeWatcher = effect;
try {
return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);
} finally {
activeWatcher = currentEffect;
}
};
else getter = NOOP;
if (cb && deep) {
const baseGetter = getter;
const depth = deep === true ? Infinity : deep;
getter = () => traverse(baseGetter(), depth);
}
const scope = getCurrentScope();
const watchHandle = () => {
effect.stop();
if (scope && scope.active) remove(scope.effects, effect);
};
if (once && cb) {
const _cb = cb;
cb = (...args) => {
const res = _cb(...args);
watchHandle();
return res;
};
}
let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;
const job = (immediateFirstRun) => {
if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) return;
if (cb) {
const newValue = effect.run();
if (immediateFirstRun || deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {
if (cleanup) cleanup();
const currentWatcher = activeWatcher;
activeWatcher = effect;
try {
const args = [
newValue,
oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,
boundCleanup
];
oldValue = newValue;
call ? call(cb, 3, args) : cb(...args);
} finally {
activeWatcher = currentWatcher;
}
}
} else effect.run();
};
if (augmentJob) augmentJob(job);
effect = new ReactiveEffect(getter);
effect.scheduler = scheduler ? () => scheduler(job, false) : job;
boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);
cleanup = effect.onStop = () => {
const cleanups = cleanupMap.get(effect);
if (cleanups) {
if (call) call(cleanups, 4);
else for (const cleanup2 of cleanups) cleanup2();
cleanupMap.delete(effect);
}
};
if (cb) if (immediate) job(true);
else oldValue = effect.run();
else if (scheduler) scheduler(job.bind(null, true), true);
else effect.run();
watchHandle.pause = effect.pause.bind(effect);
watchHandle.resume = effect.resume.bind(effect);
watchHandle.stop = watchHandle;
return watchHandle;
}
function traverse(value, depth = Infinity, seen) {
if (depth <= 0 || !isObject(value) || value["__v_skip"]) return value;
seen = seen || new Map();
if ((seen.get(value) || 0) >= depth) return value;
seen.set(value, depth);
depth--;
if (isRef(value)) traverse(value.value, depth, seen);
else if (isArray(value)) for (let i = 0; i < value.length; i++) traverse(value[i], depth, seen);
else if (isSet(value) || isMap(value)) value.forEach((v) => {
traverse(v, depth, seen);
});
else if (isPlainObject(value)) {
for (const key in value) traverse(value[key], depth, seen);
for (const key of Object.getOwnPropertySymbols(value)) if (Object.prototype.propertyIsEnumerable.call(value, key)) traverse(value[key], depth, seen);
}
return value;
}
function callWithErrorHandling(fn, instance, type, args) {
try {
return args ? fn(...args) : fn();
} catch (err) {
handleError(err, instance, type);
}
}
function callWithAsyncErrorHandling(fn, instance, type, args) {
if (isFunction(fn)) {
const res = callWithErrorHandling(fn, instance, type, args);
if (res && isPromise(res)) res.catch((err) => {
handleError(err, instance, type);
});
return res;
}
if (isArray(fn)) {
const values = [];
for (let i = 0; i < fn.length; i++) values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));
return values;
}
}
function handleError(err, instance, type, throwInDev = true) {
const contextVNode = instance ? instance.vnode : null;
const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;
if (instance) {
let cur = instance.parent;
const exposedInstance = instance.proxy;
const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`;
while (cur) {
const errorCapturedHooks = cur.ec;
if (errorCapturedHooks) {
for (let i = 0; i < errorCapturedHooks.length; i++) if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) return;
}
cur = cur.parent;
}
if (errorHandler) {
pauseTracking();
callWithErrorHandling(errorHandler, null, 10, [
err,
exposedInstance,
errorInfo
]);
resetTracking();
return;
}
}
logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);
}
function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {
if (throwInProd) throw err;
else console.error(err);
}
var queue = [];
var flushIndex = -1;
var pendingPostFlushCbs = [];
var activePostFlushCbs = null;
var postFlushIndex = 0;
var resolvedPromise = Promise.resolve();
var currentFlushPromise = null;
function nextTick(fn) {
const p = currentFlushPromise || resolvedPromise;
return fn ? p.then(this ? fn.bind(this) : fn) : p;
}
function findInsertionIndex(id) {
let start = flushIndex + 1;
let end = queue.length;
while (start < end) {
const middle = start + end >>> 1;
const middleJob = queue[middle];
const middleJobId = getId(middleJob);
if (middleJobId < id || middleJobId === id && middleJob.flags & 2) start = middle + 1;
else end = middle;
}
return start;
}
function queueJob(job) {
if (!(job.flags & 1)) {
const jobId = getId(job);
const lastJob = queue[queue.length - 1];
if (!lastJob || !(job.flags & 2) && jobId >= getId(lastJob)) queue.push(job);
else queue.splice(findInsertionIndex(jobId), 0, job);
job.flags |= 1;
queueFlush();
}
}
function queueFlush() {
if (!currentFlushPromise) currentFlushPromise = resolvedPromise.then(flushJobs);
}
function queuePostFlushCb(cb) {
if (!isArray(cb)) {
if (activePostFlushCbs && cb.id === -1) activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);
else if (!(cb.flags & 1)) {
pendingPostFlushCbs.push(cb);
cb.flags |= 1;
}
} else pendingPostFlushCbs.push(...cb);
queueFlush();
}
function flushPreFlushCbs(instance, seen, i = flushIndex + 1) {
for (; i < queue.length; i++) {
const cb = queue[i];
if (cb && cb.flags & 2) {
if (instance && cb.id !== instance.uid) continue;
queue.splice(i, 1);
i--;
if (cb.flags & 4) cb.flags &= -2;
cb();
if (!(cb.flags & 4)) cb.flags &= -2;
}
}
}
function flushPostFlushCbs(seen) {
if (pendingPostFlushCbs.length) {
const deduped = [...new Set(pendingPostFlushCbs)].sort((a, b) => getId(a) - getId(b));
pendingPostFlushCbs.length = 0;
if (activePostFlushCbs) {
activePostFlushCbs.push(...deduped);
return;
}
activePostFlushCbs = deduped;
for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {
const cb = activePostFlushCbs[postFlushIndex];
if (cb.flags & 4) cb.flags &= -2;
if (!(cb.flags & 8)) cb();
cb.flags &= -2;
}
activePostFlushCbs = null;
postFlushIndex = 0;
}
}
var getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;
function flushJobs(seen) {
try {
for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {
const job = queue[flushIndex];
if (job && !(job.flags & 8)) {
if (job.flags & 4) job.flags &= -2;
callWithErrorHandling(job, job.i, job.i ? 15 : 14);
if (!(job.flags & 4)) job.flags &= -2;
}
}
} finally {
for (; flushIndex < queue.length; flushIndex++) {
const job = queue[flushIndex];
if (job) job.flags &= -2;
}
flushIndex = -1;
queue.length = 0;
flushPostFlushCbs(seen);
currentFlushPromise = null;
if (queue.length || pendingPostFlushCbs.length) flushJobs(seen);
}
}
var currentRenderingInstance = null;
var currentScopeId = null;
function setCurrentRenderingInstance(instance) {
const prev = currentRenderingInstance;
currentRenderingInstance = instance;
currentScopeId = instance && instance.type.__scopeId || null;
return prev;
}
function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {
if (!ctx) return fn;
if (fn._n) return fn;
const renderFnWithContext = (...args) => {
if (renderFnWithContext._d) setBlockTracking(-1);
const prevInstance = setCurrentRenderingInstance(ctx);
let res;
try {
res = fn(...args);
} finally {
setCurrentRenderingInstance(prevInstance);
if (renderFnWithContext._d) setBlockTracking(1);
}
return res;
};
renderFnWithContext._n = true;
renderFnWithContext._c = true;
renderFnWithContext._d = true;
return renderFnWithContext;
}
function invokeDirectiveHook(vnode, prevVNode, instance, name) {
const bindings = vnode.dirs;
const oldBindings = prevVNode && prevVNode.dirs;
for (let i = 0; i < bindings.length; i++) {
const binding = bindings[i];
if (oldBindings) binding.oldValue = oldBindings[i].value;
let hook = binding.dir[name];
if (hook) {
pauseTracking();
callWithAsyncErrorHandling(hook, instance, 8, [
vnode.el,
binding,
vnode,
prevVNode
]);
resetTracking();
}
}
}
function provide(key, value) {
if (currentInstance) {
let provides = currentInstance.provides;
const parentProvides = currentInstance.parent && currentInstance.parent.provides;
if (parentProvides === provides) provides = currentInstance.provides = Object.create(parentProvides);
provides[key] = value;
}
}
function inject(key, defaultValue, treatDefaultAsFactory = false) {
const instance = getCurrentInstance();
if (instance || currentApp) {
let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;
if (provides && key in provides) return provides[key];
else if (arguments.length > 1) return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;
}
}
var ssrContextKey = Symbol.for("v-scx");
var useSSRContext = () => {
{
const ctx = inject(ssrContextKey);
if (!ctx) {}
return ctx;
}
};
function watch(source, cb, options) {
return doWatch(source, cb, options);
}
function doWatch(source, cb, options = EMPTY_OBJ) {
const { immediate, deep, flush, once } = options;
const baseWatchOptions = extend({}, options);
const runsImmediately = cb && immediate || !cb && flush !== "post";
let ssrCleanup;
if (isInSSRComponentSetup) {
if (flush === "sync") {
const ctx = useSSRContext();
ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);
} else if (!runsImmediately) {
const watchStopHandle = () => {};
watchStopHandle.stop = NOOP;
watchStopHandle.resume = NOOP;
watchStopHandle.pause = NOOP;
return watchStopHandle;
}
}
const instance = currentInstance;
baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);
let isPre = false;
if (flush === "post") baseWatchOptions.scheduler = (job) => {
queuePostRenderEffect(job, instance && instance.suspense);
};
else if (flush !== "sync") {
isPre = true;
baseWatchOptions.scheduler = (job, isFirstRun) => {
if (isFirstRun) job();
else queueJob(job);
};
}
baseWatchOptions.augmentJob = (job) => {
if (cb) job.flags |= 4;
if (isPre) {
job.flags |= 2;
if (instance) {
job.id = instance.uid;
job.i = instance;
}
}
};
const watchHandle = watch$1(source, cb, baseWatchOptions);
if (isInSSRComponentSetup) {
if (ssrCleanup) ssrCleanup.push(watchHandle);
else if (runsImmediately) watchHandle();
}
return watchHandle;
}
function instanceWatch(source, value, options) {
const publicThis = this.proxy;
const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);
let cb;
if (isFunction(value)) cb = value;
else {
cb = value.handler;
options = value;
}
const reset = setCurrentInstance(this);
const res = doWatch(getter, cb.bind(publicThis), options);
reset();
return res;
}
function createPathGetter(ctx, path) {
const segments = path.split(".");
return () => {
let cur = ctx;
for (let i = 0; i < segments.length && cur; i++) cur = cur[segments[i]];
return cur;
};
}
var TeleportEndKey = Symbol("_vte");
var isTeleport = (type) => type.__isTeleport;
var leaveCbKey = Symbol("_leaveCb");
var enterCbKey = Symbol("_enterCb");
function useTransitionState() {
const state = {
isMounted: false,
isLeaving: false,
isUnmounting: false,
leavingVNodes: new Map()
};
onMounted(() => {
state.isMounted = true;
});
onBeforeUnmount(() => {
state.isUnmounting = true;
});
return state;
}
var TransitionHookValidator = [Function, Array];
var BaseTransitionPropsValidators = {
mode: String,
appear: Boolean,
persisted: Boolean,
onBeforeEnter: TransitionHookValidator,
onEnter: TransitionHookValidator,
onAfterEnter: TransitionHookValidator,
onEnterCancelled: TransitionHookValidator,
onBeforeLeave: TransitionHookValidator,
onLeave: TransitionHookValidator,
onAfterLeave: TransitionHookValidator,
onLeaveCancelled: TransitionHookValidator,
onBeforeAppear: TransitionHookValidator,
onAppear: TransitionHookValidator,
onAfterAppear: TransitionHookValidator,
onAppearCancelled: TransitionHookValidator
};
var recursiveGetSubtree = (instance) => {
const subTree = instance.subTree;
return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;
};
var BaseTransitionImpl = {
name: `BaseTransition`,
props: BaseTransitionPropsValidators,
setup(props, { slots }) {
const instance = getCurrentInstance();
const state = useTransitionState();
return () => {
const children = slots.default && getTransitionRawChildren(slots.default(), true);
const child = children && children.length ? findNonCommentChild(children) : instance.subTree ? createCommentVNode() : void 0;
if (!child) return;
const rawProps = toRaw(props);
const { mode } = rawProps;
if (state.isLeaving) return emptyPlaceholder(child);
const innerChild = getInnerChild$1(child);
if (!innerChild) return emptyPlaceholder(child);
let enterHooks = resolveTransitionHooks(innerChild, rawProps, state, instance, (hooks) => enterHooks = hooks);
if (innerChild.type !== Comment) setTransitionHooks(innerChild, enterHooks);
let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);
if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {
let leavingHooks = resolveTransitionHooks(oldInnerChild, rawProps, state, instance);
setTransitionHooks(oldInnerChild, leavingHooks);
if (mode === "out-in" && innerChild.type !== Comment) {
state.isLeaving = true;
leavingHooks.afterLeave = () => {
state.isLeaving = false;
if (!(instance.job.flags & 8)) instance.update();
delete leavingHooks.afterLeave;
oldInnerChild = void 0;
};
return emptyPlaceholder(child);
} else if (mode === "in-out" && innerChild.type !== Comment) leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {
const leavingVNodesCache = getLeavingNodesForType(state, oldInnerChild);
leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;
el[leaveCbKey] = () => {
earlyRemove();
el[leaveCbKey] = void 0;
delete enterHooks.delayedLeave;
oldInnerChild = void 0;
};
enterHooks.delayedLeave = () => {
delayedLeave();
delete enterHooks.delayedLeave;
oldInnerChild = void 0;
};
};
else oldInnerChild = void 0;
} else if (oldInnerChild) oldInnerChild = void 0;
return child;
};
}
};
function findNonCommentChild(children) {
let child = children[0];
if (children.length > 1) {
for (const c of children) if (c.type !== Comment) {
child = c;
break;
}
}
return child;
}
var BaseTransition = BaseTransitionImpl;
function getLeavingNodesForType(state, vnode) {
const { leavingVNodes } = state;
let leavingVNodesCache = leavingVNodes.get(vnode.type);
if (!leavingVNodesCache) {
leavingVNodesCache = Object.create(null);
leavingVNodes.set(vnode.type, leavingVNodesCache);
}
return leavingVNodesCache;
}
function resolveTransitionHooks(vnode, props, state, instance, postClone) {
const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props;
const key = String(vnode.key);
const leavingVNodesCache = getLeavingNodesForType(state, vnode);
const callHook = (hook, args) => {
hook && callWithAsyncErrorHandling(hook, instance, 9, args);
};
const callAsyncHook = (hook, args) => {
const done = args[1];
callHook(hook, args);
if (isArray(hook)) {
if (hook.every((hook2) => hook2.length <= 1)) done();
} else if (hook.length <= 1) done();
};
const hooks = {
mode,
persisted,
beforeEnter(el) {
let hook = onBeforeEnter;
if (!state.isMounted) if (appear) hook = onBeforeAppear || onBeforeEnter;
else return;
if (el[leaveCbKey]) el[leaveCbKey](true);
const leavingVNode = leavingVNodesCache[key];
if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) leavingVNode.el[leaveCbKey]();
callHook(hook, [el]);
},
enter(el) {
if (leavingVNodesCache[key] === vnode) return;
let hook = onEnter;
let afterHook = onAfterEnter;
let cancelHook = onEnterCancelled;
if (!state.isMounted) if (appear) {
hook = onAppear || onEnter;
afterHook = onAfterAppear || onAfterEnter;
cancelHook = onAppearCancelled || onEnterCancelled;
} else return;
let called = false;
el[enterCbKey] = (cancelled) => {
if (called) return;
called = true;
if (cancelled) callHook(cancelHook, [el]);
else callHook(afterHook, [el]);
if (hooks.delayedLeave) hooks.delayedLeave();
el[enterCbKey] = void 0;
};
const done = el[enterCbKey].bind(null, false);
if (hook) callAsyncHook(hook, [el, done]);
else done();
},
leave(el, remove) {
const key2 = String(vnode.key);
if (el[enterCbKey]) el[enterCbKey](true);
if (state.isUnmounting) return remove();
callHook(onBeforeLeave, [el]);
let called = false;
el[leaveCbKey] = (cancelled) => {
if (called) return;
called = true;
remove();
if (cancelled) callHook(onLeaveCancelled, [el]);
else callHook(onAfterLeave, [el]);
el[leaveCbKey] = void 0;
if (leavingVNodesCache[key2] === vnode) delete leavingVNodesCache[key2];
};
const done = el[leaveCbKey].bind(null, false);
leavingVNodesCache[key2] = vnode;
if (onLeave) callAsyncHook(onLeave, [el, done]);
else done();
},
clone(vnode2) {
const hooks2 = resolveTransitionHooks(vnode2, props, state, instance, postClone);
if (postClone) postClone(hooks2);
return hooks2;
}
};
return hooks;
}
function emptyPlaceholder(vnode) {
if (isKeepAlive(vnode)) {
vnode = cloneVNode(vnode);
vnode.children = null;
return vnode;
}
}
function getInnerChild$1(vnode) {
if (!isKeepAlive(vnode)) {
if (isTeleport(vnode.type) && vnode.children) return findNonCommentChild(vnode.children);
return vnode;
}
if (vnode.component) return vnode.component.subTree;
const { shapeFlag, children } = vnode;
if (children) {
if (shapeFlag & 16) return children[0];
if (shapeFlag & 32 && isFunction(children.default)) return children.default();
}
}
function setTransitionHooks(vnode, hooks) {
if (vnode.shapeFlag & 6 && vnode.component) {
vnode.transition = hooks;
setTransitionHooks(vnode.component.subTree, hooks);
} else if (vnode.shapeFlag & 128) {
vnode.ssContent.transition = hooks.clone(vnode.ssContent);
vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);
} else vnode.transition = hooks;
}
function getTransitionRawChildren(children, keepComment = false, parentKey) {
let ret = [];
let keyedFragmentCount = 0;
for (let i = 0; i < children.length; i++) {
let child = children[i];
const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);
if (child.type === Fragment) {
if (child.patchFlag & 128) keyedFragmentCount++;
ret = ret.concat(getTransitionRawChildren(child.children, keepComment, key));
} else if (keepComment || child.type !== Comment) ret.push(key != null ? cloneVNode(child, { key }) : child);
}
if (keyedFragmentCount > 1) for (let i = 0; i < ret.length; i++) ret[i].patchFlag = -2;
return ret;
}
function defineComponent(options, extraOptions) {
return isFunction(options) ? (() => extend({ name: options.name }, extraOptions, { setup: options }))() : options;
}
function markAsyncBoundary(instance) {
instance.ids = [
instance.ids[0] + instance.ids[2]++ + "-",
0,
0
];
}
function isTemplateRefKey(refs, key) {
let desc;
return !!((desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable);
}
var pendingSetRefMap = new WeakMap();
function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {
if (isArray(rawRef)) {
rawRef.forEach((r, i) => setRef(r, oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode, isUnmount));
return;
}
if (isAsyncWrapper(vnode) && !isUnmount) {
if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);
return;
}
const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;
const value = isUnmount ? null : refValue;
const { i: owner, r: ref } = rawRef;
const oldRef = oldRawRef && oldRawRef.r;
const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;
const setupState = owner.setupState;
const rawSetupState = toRaw(setupState);
const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {
if (isTemplateRefKey(refs, key)) return false;
return hasOwn(rawSetupState, key);
};
const canSetRef = (ref2, key) => {
if (key && isTemplateRefKey(refs, key)) return false;
return true;
};
if (oldRef != null && oldRef !== ref) {
invalidatePendingSetRef(oldRawRef);
if (isString(oldRef)) {
refs[oldRef] = null;
if (canSetSetupRef(oldRef)) setupState[oldRef] = null;
} else if (isRef(oldRef)) {
const oldRawRefAtom = oldRawRef;
if (canSetRef(oldRef, oldRawRefAtom.k)) oldRef.value = null;
if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;
}
}
if (isFunction(ref)) callWithErrorHandling(ref, owner, 12, [value, refs]);
else {
const _isString = isString(ref);
const _isRef = isRef(ref);
if (_isString || _isRef) {
const doSet = () => {
if (rawRef.f) {
const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];
if (isUnmount) isArray(existing) && remove(existing, refValue);
else if (!isArray(existing)) if (_isString) {
refs[ref] = [refValue];
if (canSetSetupRef(ref)) setupState[ref] = refs[ref];
} else {
const newVal = [refValue];
if (canSetRef(ref, rawRef.k)) ref.value = newVal;
if (rawRef.k) refs[rawRef.k] = newVal;
}
else if (!existing.includes(refValue)) existing.push(refValue);
} else if (_isString) {
refs[ref] = value;
if (canSetSetupRef(ref)) setupState[ref] = value;
} else if (_isRef) {
if (canSetRef(ref, rawRef.k)) ref.value = value;
if (rawRef.k) refs[rawRef.k] = value;
}
};
if (value) {
const job = () => {
doSet();
pendingSetRefMap.delete(rawRef);
};
job.id = -1;
pendingSetRefMap.set(rawRef, job);
queuePostRenderEffect(job, parentSuspense);
} else {
invalidatePendingSetRef(rawRef);
doSet();
}
}
}
}
function invalidatePendingSetRef(rawRef) {
const pendingSetRef = pendingSetRefMap.get(rawRef);
if (pendingSetRef) {
pendingSetRef.flags |= 8;
pendingSetRefMap.delete(rawRef);
}
}
getGlobalThis().requestIdleCallback;
getGlobalThis().cancelIdleCallback;
var isAsyncWrapper = (i) => !!i.type.__asyncLoader;
var isKeepAlive = (vnode) => vnode.type.__isKeepAlive;
function onActivated(hook, target) {
registerKeepAliveHook(hook, "a", target);
}
function onDeactivated(hook, target) {
registerKeepAliveHook(hook, "da", target);
}
function registerKeepAliveHook(hook, type, target = currentInstance) {
const wrappedHook = hook.__wdc || (hook.__wdc = () => {
let current = target;
while (current) {
if (current.isDeactivated) return;
current = current.parent;
}
return hook();
});
injectHook(type, wrappedHook, target);
if (target) {
let current = target.parent;
while (current && current.parent) {
if (isKeepAlive(current.parent.vnode)) injectToKeepAliveRoot(wrappedHook, type, target, current);
current = current.parent;
}
}
}
function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {
const injected = injectHook(type, hook, keepAliveRoot, true);
onUnmounted(() => {
remove(keepAliveRoot[type], injected);
}, target);
}
function injectHook(type, hook, target = currentInstance, prepend = false) {
if (target) {
const hooks = target[type] || (target[type] = []);
const wrappedHook = hook.__weh || (hook.__weh = (...args) => {
pauseTracking();
const reset = setCurrentInstance(target);
const res = callWithAsyncErrorHandling(hook, target, type, args);
reset();
resetTracking();
return res;
});
if (prepend) hooks.unshift(wrappedHook);
else hooks.push(wrappedHook);
return wrappedHook;
}
}
var createHook = (lifecycle) => (hook, target = currentInstance) => {
if (!isInSSRComponentSetup || lifecycle === "sp") injectHook(lifecycle, (...args) => hook(...args), target);
};
var onBeforeMount = createHook("bm");
var onMounted = createHook("m");
var onBeforeUpdate = createHook("bu");
var onUpdated = createHook("u");
var onBeforeUnmount = createHook("bum");
var onUnmounted = createHook("um");
var onServerPrefetch = createHook("sp");
var onRenderTriggered = createHook("rtg");
var onRenderTracked = createHook("rtc");
function onErrorCaptured(hook, target = currentInstance) {
injectHook("ec", hook, target);
}
var NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc");
function renderList(source, renderItem, cache, index) {
let ret;
const cached = cache && cache[index];
const sourceIsArray = isArray(source);
if (sourceIsArray || isString(source)) {
const sourceIsReactiveArray = sourceIsArray && isReactive(source);
let needsWrap = false;
let isReadonlySource = false;
if (sourceIsReactiveArray) {
needsWrap = !isShallow(source);
isReadonlySource = isReadonly(source);
source = shallowReadArray(source);
}
ret = new Array(source.length);
for (let i = 0, l = source.length; i < l; i++) ret[i] = renderItem(needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i], i, void 0, cached && cached[i]);
} else if (typeof source === "number") {
ret = new Array(source);
for (let i = 0; i < source; i++) ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);
} else if (isObject(source)) if (source[Symbol.iterator]) ret = Array.from(source, (item, i) => renderItem(item, i, void 0, cached && cached[i]));
else {
const keys = Object.keys(source);
ret = new Array(keys.length);
for (let i = 0, l = keys.length; i < l; i++) {
const key = keys[i];
ret[i] = renderItem(source[key], key, i, cached && cached[i]);
}
}
else ret = [];
if (cache) cache[index] = ret;
return ret;
}
var getPublicInstance = (i) => {
if (!i) return null;
if (isStatefulComponent(i)) return getComponentPublicInstance(i);
return getPublicInstance(i.parent);
};
var publicPropertiesMap = extend(Object.create(null), {
$: (i) => i,
$el: (i) => i.vnode.el,
$data: (i) => i.data,
$props: (i) => i.props,
$attrs: (i) => i.attrs,
$slots: (i) => i.slots,
$refs: (i) => i.refs,
$parent: (i) => getPublicInstance(i.parent),
$root: (i) => getPublicInstance(i.root),
$host: (i) => i.ce,
$emit: (i) => i.emit,
$options: (i) => resolveMergedOptions(i),
$forceUpdate: (i) => i.f || (i.f = () => {
queueJob(i.update);
}),
$nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),
$watch: (i) => instanceWatch.bind(i)
});
var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);
var PublicInstanceProxyHandlers = {
get({ _: instance }, key) {
if (key === "__v_skip") return true;
const { ctx, setupState, data, props, accessCache, type, appContext } = instance;
if (key[0] !== "$") {
const n = accessCache[key];
if (n !== void 0) switch (n) {
case 1: return setupState[key];
case 2: return data[key];
case 4: return ctx[key];
case 3: return props[key];
}
else if (hasSetupBinding(setupState, key)) {
accessCache[key] = 1;
return setupState[key];
} else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
accessCache[key] = 2;
return data[key];
} else if (hasOwn(props, key)) {
accessCache[key] = 3;
return props[key];
} else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
accessCache[key] = 4;
return ctx[key];
} else if (shouldCacheAccess) accessCache[key] = 0;
}
const publicGetter = publicPropertiesMap[key];
let cssModule, globalProperties;
if (publicGetter) {
if (key === "$attrs") track(instance.attrs, "get", "");
return publicGetter(instance);
} else if ((cssModule = type.__cssModules) && (cssModule = cssModule[key])) return cssModule;
else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
accessCache[key] = 4;
return ctx[key];
} else if (globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)) return globalProperties[key];
},
set({ _: instance }, key, value) {
const { data, setupState, ctx } = instance;
if (hasSetupBinding(setupState, key)) {
setupState[key] = value;
return true;
} else if (data !== EMPTY_OBJ && hasOwn(data, key)) {
data[key] = value;
return true;
} else if (hasOwn(instance.props, key)) return false;
if (key[0] === "$" && key.slice(1) in instance) return false;
else ctx[key] = value;
return true;
},
has({ _: { data, setupState, accessCache, ctx, appContext, props, type } }, key) {
let cssModules;
return !!(accessCache[key] || data !== EMPTY_OBJ && key[0] !== "$" && hasOwn(data, key) || hasSetupBinding(setupState, key) || hasOwn(props, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]);
},
defineProperty(target, key, descriptor) {
if (descriptor.get != null) target._.accessCache[key] = 0;
else if (hasOwn(descriptor, "value")) this.set(target, key, descriptor.value, null);
return Reflect.defineProperty(target, key, descriptor);
}
};
function normalizePropsOrEmits(props) {
return isArray(props) ? props.reduce((normalized, p) => (normalized[p] = null, normalized), {}) : props;
}
var shouldCacheAccess = true;
function applyOptions(instance) {
const options = resolveMergedOptions(instance);
const publicThis = instance.proxy;
const ctx = instance.ctx;
shouldCacheAccess = false;
if (options.beforeCreate) callHook$1(options.beforeCreate, instance, "bc");
const { data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions, created, beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured, serverPrefetch, expose, inheritAttrs, components, directives, filters } = options;
const checkDuplicateProperties = null;
if (injectOptions) resolveInjections(injectOptions, ctx, checkDuplicateProperties);
if (methods) for (const key in methods) {
const methodHandler = methods[key];
if (isFunction(methodHandler)) ctx[key] = methodHandler.bind(publicThis);
}
if (dataOptions) {
const data = dataOptions.call(publicThis, publicThis);
if (!isObject(data)) {} else instance.data = reactive(data);
}
shouldCacheAccess = true;
if (computedOptions) for (const key in computedOptions) {
const opt = computedOptions[key];
const c = computed({
get: isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP,
set: !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : NOOP
});
Object.defineProperty(ctx, key, {
enumerable: true,
configurable: true,
get: () => c.value,
set: (v) => c.value = v
});
}
if (watchOptions) for (const key in watchOptions) createWatcher(watchOptions[key], ctx, publicThis, key);
if (provideOptions) {
const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;
Reflect.ownKeys(provides).forEach((key) => {
provide(key, provides[key]);
});
}
if (created) callHook$1(created, instance, "c");
function registerLifecycleHook(register, hook) {
if (isArray(hook)) hook.forEach((_hook) => register(_hook.bind(publicThis)));
else if (hook) register(hook.bind(publicThis));
}
registerLifecycleHook(onBeforeMount, beforeMount);
registerLifecycleHook(onMounted, mounted);
registerLifecycleHook(onBeforeUpdate, beforeUpdate);
registerLifecycleHook(onUpdated, updated);
registerLifecycleHook(onActivated, activated);
registerLifecycleHook(onDeactivated, deactivated);
registerLifecycleHook(onErrorCaptured, errorCaptured);
registerLifecycleHook(onRenderTracked, renderTracked);
registerLifecycleHook(onRenderTriggered, renderTriggered);
registerLifecycleHook(onBeforeUnmount, beforeUnmount);
registerLifecycleHook(onUnmounted, unmounted);
registerLifecycleHook(onServerPrefetch, serverPrefetch);
if (isArray(expose)) {
if (expose.length) {
const exposed = instance.exposed || (instance.exposed = {});
expose.forEach((key) => {
Object.defineProperty(exposed, key, {
get: () => publicThis[key],
set: (val) => publicThis[key] = val,
enumerable: true
});
});
} else if (!instance.exposed) instance.exposed = {};
}
if (render && instance.render === NOOP) instance.render = render;
if (inheritAttrs != null) instance.inheritAttrs = inheritAttrs;
if (components) instance.components = components;
if (directives) instance.directives = directives;
if (serverPrefetch) markAsyncBoundary(instance);
}
function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {
if (isArray(injectOptions)) injectOptions = normalizeInject(injectOptions);
for (const key in injectOptions) {
const opt = injectOptions[key];
let injected;
if (isObject(opt)) if ("default" in opt) injected = inject(opt.from || key, opt.default, true);
else injected = inject(opt.from || key);
else injected = inject(opt);
if (isRef(injected)) Object.defineProperty(ctx, key, {
enumerable: true,
configurable: true,
get: () => injected.value,
set: (v) => injected.value = v
});
else ctx[key] = injected;
}
}
function callHook$1(hook, instance, type) {
callWithAsyncErrorHandling(isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy), instance, type);
}
function createWatcher(raw, ctx, publicThis, key) {
let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key];
if (isString(raw)) {
const handler = ctx[raw];
if (isFunction(handler)) watch(getter, handler);
} else if (isFunction(raw)) watch(getter, raw.bind(publicThis));
else if (isObject(raw)) if (isArray(raw)) raw.forEach((r) => createWatcher(r, ctx, publicThis, key));
else {
const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];
if (isFunction(handler)) watch(getter, handler, raw);
}
}
function resolveMergedOptions(instance) {
const base = instance.type;
const { mixins, extends: extendsOptions } = base;
const { mixins: globalMixins, optionsCache: cache, config: { optionMergeStrategies } } = instance.appContext;
const cached = cache.get(base);
let resolved;
if (cached) resolved = cached;
else if (!globalMixins.length && !mixins && !extendsOptions) resolved = base;
else {
resolved = {};
if (globalMixins.length) globalMixins.forEach((m) => mergeOptions(resolved, m, optionMergeStrategies, true));
mergeOptions(resolved, base, optionMergeStrategies);
}
if (isObject(base)) cache.set(base, resolved);
return resolved;
}
function mergeOptions(to, from, strats, asMixin = false) {
const { mixins, extends: extendsOptions } = from;
if (extendsOptions) mergeOptions(to, extendsOptions, strats, true);
if (mixins) mixins.forEach((m) => mergeOptions(to, m, strats, true));
for (const key in from) if (asMixin && key === "expose") {} else {
const strat = internalOptionMergeStrats[key] || strats && strats[key];
to[key] = strat ? strat(to[key], from[key]) : from[key];
}
return to;
}
var internalOptionMergeStrats = {
data: mergeDataFn,
props: mergeEmitsOrPropsOptions,
emits: mergeEmitsOrPropsOptions,
methods: mergeObjectOptions,
computed: mergeObjectOptions,
beforeCreate: mergeAsArray,
created: mergeAsArray,
beforeMount: mergeAsArray,
mounted: mergeAsArray,
beforeUpdate: mergeAsArray,
updated: mergeAsArray,
beforeDestroy: mergeAsArray,
beforeUnmount: mergeAsArray,
destroyed: mergeAsArray,
unmounted: mergeAsArray,
activated: mergeAsArray,
deactivated: mergeAsArray,
errorCaptured: mergeAsArray,
serverPrefetch: mergeAsArray,
components: mergeObjectOptions,
directives: mergeObjectOptions,
watch: mergeWatchOptions,
provide: mergeDataFn,
inject: mergeInject
};
function mergeDataFn(to, from) {
if (!from) return to;
if (!to) return from;
return function mergedDataFn() {
return extend(isFunction(to) ? to.call(this, this) : to, isFunction(from) ? from.call(this, this) : from);
};
}
function mergeInject(to, from) {
return mergeObjectOptions(normalizeInject(to), normalizeInject(from));
}
function normalizeInject(raw) {
if (isArray(raw)) {
const res = {};
for (let i = 0; i < raw.length; i++) res[raw[i]] = raw[i];
return res;
}
return raw;
}
function mergeAsArray(to, from) {
return to ? [...new Set([].concat(to, from))] : from;
}
function mergeObjectOptions(to, from) {
return to ? extend(Object.create(null), to, from) : from;
}
function mergeEmitsOrPropsOptions(to, from) {
if (to) {
if (isArray(to) && isArray(from)) return [...new Set([...to, ...from])];
return extend(Object.create(null), normalizePropsOrEmits(to), normalizePropsOrEmits(from != null ? from : {}));
} else return from;
}
function mergeWatchOptions(to, from) {
if (!to) return from;
if (!from) return to;
const merged = extend(Object.create(null), to);
for (const key in from) merged[key] = mergeAsArray(to[key], from[key]);
return merged;
}
function createAppContext() {
return {
app: null,
config: {
isNativeTag: NO,
performance: false,
globalProperties: {},
optionMergeStrategies: {},
errorHandler: void 0,
warnHandler: void 0,
compilerOptions: {}
},
mixins: [],
components: {},
directives: {},
provides: Object.create(null),
optionsCache: new WeakMap(),
propsCache: new WeakMap(),
emitsCache: new WeakMap()
};
}
var uid$1 = 0;
function createAppAPI(render, hydrate) {
return function createApp(rootComponent, rootProps = null) {
if (!isFunction(rootComponent)) rootComponent = extend({}, rootComponent);
if (rootProps != null && !isObject(rootProps)) rootProps = null;
const context = createAppContext();
const installedPlugins = new WeakSet();
const pluginCleanupFns = [];
let isMounted = false;
const app = context.app = {
_uid: uid$1++,
_component: rootComponent,
_props: rootProps,
_container: null,
_context: context,
_instance: null,
version,
get config() {
return context.config;
},
set config(v) {},
use(plugin, ...options) {
if (installedPlugins.has(plugin)) {} else if (plugin && isFunction(plugin.install)) {
installedPlugins.add(plugin);
plugin.install(app, ...options);
} else if (isFunction(plugin)) {
installedPlugins.add(plugin);
plugin(app, ...options);
}
return app;
},
mixin(mixin) {
if (!context.mixins.includes(mixin)) context.mixins.push(mixin);
return app;
},
component(name, component) {
if (!component) return context.components[name];
context.components[name] = component;
return app;
},
directive(name, directive) {
if (!directive) return context.directives[name];
context.directives[name] = directive;
return app;
},
mount(rootContainer, isHydrate, namespace) {
if (!isMounted) {
const vnode = app._ceVNode || createVNode(rootComponent, rootProps);
vnode.appContext = context;
if (namespace === true) namespace = "svg";
else if (namespace === false) namespace = void 0;
if (isHydrate && hydrate) hydrate(vnode, rootContainer);
else render(vnode, rootContainer, namespace);
isMounted = true;
app._container = rootContainer;
rootContainer.__vue_app__ = app;
return getComponentPublicInstance(vnode.component);
}
},
onUnmount(cleanupFn) {
pluginCleanupFns.push(cleanupFn);
},
unmount() {
if (isMounted) {
callWithAsyncErrorHandling(pluginCleanupFns, app._instance, 16);
render(null, app._container);
delete app._container.__vue_app__;
}
},
provide(key, value) {
context.provides[key] = value;
return app;
},
runWithContext(fn) {
const lastApp = currentApp;
currentApp = app;
try {
return fn();
} finally {
currentApp = lastApp;
}
}
};
return app;
};
}
var currentApp = null;
var getModelModifiers = (props, modelName) => {
return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];
};
function emit(instance, event, ...rawArgs) {
if (instance.isUnmounted) return;
const props = instance.vnode.props || EMPTY_OBJ;
let args = rawArgs;
const isModelListener = event.startsWith("update:");
const modifiers = isModelListener && getModelModifiers(props, event.slice(7));
if (modifiers) {
if (modifiers.trim) args = rawArgs.map((a) => isString(a) ? a.trim() : a);
if (modifiers.number) args = rawArgs.map(looseToNumber);
}
let handlerName;
let handler = props[handlerName = toHandlerKey(event)] || props[handlerName = toHandlerKey(camelize(event))];
if (!handler && isModelListener) handler = props[handlerName = toHandlerKey(hyphenate(event))];
if (handler) callWithAsyncErrorHandling(handler, instance, 6, args);
const onceHandler = props[handlerName + `Once`];
if (onceHandler) {
if (!instance.emitted) instance.emitted = {};
else if (instance.emitted[handlerName]) return;
instance.emitted[handlerName] = true;
callWithAsyncErrorHandling(onceHandler, instance, 6, args);
}
}
var mixinEmitsCache = new WeakMap();
function normalizeEmitsOptions(comp, appContext, asMixin = false) {
const cache = asMixin ? mixinEmitsCache : appContext.emitsCache;
const cached = cache.get(comp);
if (cached !== void 0) return cached;
const raw = comp.emits;
let normalized = {};
let hasExtends = false;
if (!isFunction(comp)) {
const extendEmits = (raw2) => {
const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);
if (normalizedFromExtend) {
hasExtends = true;
extend(normalized, normalizedFromExtend);
}
};
if (!asMixin && appContext.mixins.length) appContext.mixins.forEach(extendEmits);
if (comp.extends) extendEmits(comp.extends);
if (comp.mixins) comp.mixins.forEach(extendEmits);
}
if (!raw && !hasExtends) {
if (isObject(comp)) cache.set(comp, null);
return null;
}
if (isArray(raw)) raw.forEach((key) => normalized[key] = null);
else extend(normalized, raw);
if (isObject(comp)) cache.set(comp, normalized);
return normalized;
}
function isEmitListener(options, key) {
if (!options || !isOn(key)) return false;
key = key.slice(2).replace(/Once$/, "");
return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);
}
function renderComponentRoot(instance) {
const { type: Component, vnode, proxy, withProxy, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, props, data, setupState, ctx, inheritAttrs } = instance;
const prev = setCurrentRenderingInstance(instance);
let result;
let fallthroughAttrs;
try {
if (vnode.shapeFlag & 4) {
const proxyToUse = withProxy || proxy;
const thisProxy = proxyToUse;
result = normalizeVNode(render.call(thisProxy, proxyToUse, renderCache, props, setupState, data, ctx));
fallthroughAttrs = attrs;
} else {
const render2 = Component;
result = normalizeVNode(render2.length > 1 ? render2(props, {
attrs,
slots,
emit
}) : render2(props, null));
fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);
}
} catch (err) {
blockStack.length = 0;
handleError(err, instance, 1);
result = createVNode(Comment);
}
let root = result;
if (fallthroughAttrs && inheritAttrs !== false) {
const keys = Object.keys(fallthroughAttrs);
const { shapeFlag } = root;
if (keys.length) {
if (shapeFlag & 7) {
if (propsOptions && keys.some(isModelListener)) fallthroughAttrs = filterModelListeners(fallthroughAttrs, propsOptions);
root = cloneVNode(root, fallthroughAttrs, false, true);
}
}
}
if (vnode.dirs) {
root = cloneVNode(root, null, false, true);
root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;
}
if (vnode.transition) setTransitionHooks(root, vnode.transition);
result = root;
setCurrentRenderingInstance(prev);
return result;
}
var getFunctionalFallthrough = (attrs) => {
let res;
for (const key in attrs) if (key === "class" || key === "style" || isOn(key)) (res || (res = {}))[key] = attrs[key];
return res;
};
var filterModelListeners = (attrs, props) => {
const res = {};
for (const key in attrs) if (!isModelListener(key) || !(key.slice(9) in props)) res[key] = attrs[key];
return res;
};
function shouldUpdateComponent(prevVNode, nextVNode, optimized) {
const { props: prevProps, children: prevChildren, component } = prevVNode;
const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;
const emits = component.emitsOptions;
if (nextVNode.dirs || nextVNode.transition) return true;
if (optimized && patchFlag >= 0) {
if (patchFlag & 1024) return true;
if (patchFlag & 16) {
if (!prevProps) return !!nextProps;
return hasPropsChanged(prevProps, nextProps, emits);
} else if (patchFlag & 8) {
const dynamicProps = nextVNode.dynamicProps;
for (let i = 0; i < dynamicProps.length; i++) {
const key = dynamicProps[i];
if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emits, key)) return true;
}
}
} else {
if (prevChildren || nextChildren) {
if (!nextChildren || !nextChildren.$stable) return true;
}
if (prevProps === nextProps) return false;
if (!prevProps) return !!nextProps;
if (!nextProps) return true;
return hasPropsChanged(prevProps, nextProps, emits);
}
return false;
}
function hasPropsChanged(prevProps, nextProps, emitsOptions) {
const nextKeys = Object.keys(nextProps);
if (nextKeys.length !== Object.keys(prevProps).length) return true;
for (let i = 0; i < nextKeys.length; i++) {
const key = nextKeys[i];
if (hasPropValueChanged(nextProps, prevProps, key) && !isEmitListener(emitsOptions, key)) return true;
}
return false;
}
function hasPropValueChanged(nextProps, prevProps, key) {
const nextProp = nextProps[key];
const prevProp = prevProps[key];
if (key === "style" && isObject(nextProp) && isObject(prevProp)) return !looseEqual(nextProp, prevProp);
return nextProp !== prevProp;
}
function updateHOCHostEl({ vnode, parent, suspense }, el) {
while (parent) {
const root = parent.subTree;
if (root.suspense && root.suspense.activeBranch === vnode) {
root.suspense.vnode.el = root.el = el;
vnode = root;
}
if (root === vnode) {
(vnode = parent.vnode).el = el;
parent = parent.parent;
} else break;
}
if (suspense && suspense.activeBranch === vnode) suspense.vnode.el = el;
}
var internalObjectProto = {};
var createInternalObject = () => Object.create(internalObjectProto);
var isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;
function initProps(instance, rawProps, isStateful, isSSR = false) {
const props = {};
const attrs = createInternalObject();
instance.propsDefaults = Object.create(null);
setFullProps(instance, rawProps, props, attrs);
for (const key in instance.propsOptions[0]) if (!(key in props)) props[key] = void 0;
if (isStateful) instance.props = isSSR ? props : shallowReactive(props);
else if (!instance.type.props) instance.props = attrs;
else instance.props = props;
instance.attrs = attrs;
}
function updateProps(instance, rawProps, rawPrevProps, optimized) {
const { props, attrs, vnode: { patchFlag } } = instance;
const rawCurrentProps = toRaw(props);
const [options] = instance.propsOptions;
let hasAttrsChanged = false;
if ((optimized || patchFlag > 0) && !(patchFlag & 16)) {
if (patchFlag & 8) {
const propsToUpdate = instance.vnode.dynamicProps;
for (let i = 0; i < propsToUpdate.length; i++) {
let key = propsToUpdate[i];
if (isEmitListener(instance.emitsOptions, key)) continue;
const value = rawProps[key];
if (options) if (hasOwn(attrs, key)) {
if (value !== attrs[key]) {
attrs[key] = value;
hasAttrsChanged = true;
}
} else {
const camelizedKey = camelize(key);
props[camelizedKey] = resolvePropValue(options, rawCurrentProps, camelizedKey, value, instance, false);
}
else if (value !== attrs[key]) {
attrs[key] = value;
hasAttrsChanged = true;
}
}
}
} else {
if (setFullProps(instance, rawProps, props, attrs)) hasAttrsChanged = true;
let kebabKey;
for (const key in rawCurrentProps) if (!rawProps || !hasOwn(rawProps, key) && ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) if (options) {
if (rawPrevProps && (rawPrevProps[key] !== void 0 || rawPrevProps[kebabKey] !== void 0)) props[key] = resolvePropValue(options, rawCurrentProps, key, void 0, instance, true);
} else delete props[key];
if (attrs !== rawCurrentProps) {
for (const key in attrs) if (!rawProps || !hasOwn(rawProps, key) && true) {
delete attrs[key];
hasAttrsChanged = true;
}
}
}
if (hasAttrsChanged) trigger(instance.attrs, "set", "");
}
function setFullProps(instance, rawProps, props, attrs) {
const [options, needCastKeys] = instance.propsOptions;
let hasAttrsChanged = false;
let rawCastValues;
if (rawProps) for (let key in rawProps) {
if (isReservedProp(key)) continue;
const value = rawProps[key];
let camelKey;
if (options && hasOwn(options, camelKey = camelize(key))) if (!needCastKeys || !needCastKeys.includes(camelKey)) props[camelKey] = value;
else (rawCastValues || (rawCastValues = {}))[camelKey] = value;
else if (!isEmitListener(instance.emitsOptions, key)) {
if (!(key in attrs) || value !== attrs[key]) {
attrs[key] = value;
hasAttrsChanged = true;
}
}
}
if (needCastKeys) {
const rawCurrentProps = toRaw(props);
const castValues = rawCastValues || EMPTY_OBJ;
for (let i = 0; i < needCastKeys.length; i++) {
const key = needCastKeys[i];
props[key] = resolvePropValue(options, rawCurrentProps, key, castValues[key], instance, !hasOwn(castValues, key));
}
}
return hasAttrsChanged;
}
function resolvePropValue(options, props, key, value, instance, isAbsent) {
const opt = options[key];
if (opt != null) {
const hasDefault = hasOwn(opt, "default");
if (hasDefault && value === void 0) {
const defaultValue = opt.default;
if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {
const { propsDefaults } = instance;
if (key in propsDefaults) value = propsDefaults[key];
else {
const reset = setCurrentInstance(instance);
value = propsDefaults[key] = defaultValue.call(null, props);
reset();
}
} else value = defaultValue;
if (instance.ce) instance.ce._setProp(key, value);
}
if (opt[0]) {
if (isAbsent && !hasDefault) value = false;
else if (opt[1] && (value === "" || value === hyphenate(key))) value = true;
}
}
return value;
}
var mixinPropsCache = new WeakMap();
function normalizePropsOptions(comp, appContext, asMixin = false) {
const cache = asMixin ? mixinPropsCache : appContext.propsCache;
const cached = cache.get(comp);
if (cached) return cached;
const raw = comp.props;
const normalized = {};
const needCastKeys = [];
let hasExtends = false;
if (!isFunction(comp)) {
const extendProps = (raw2) => {
hasExtends = true;
const [props, keys] = normalizePropsOptions(raw2, appContext, true);
extend(normalized, props);
if (keys) needCastKeys.push(...keys);
};
if (!asMixin && appContext.mixins.length) appContext.mixins.forEach(extendProps);
if (comp.extends) extendProps(comp.extends);
if (comp.mixins) comp.mixins.forEach(extendProps);
}
if (!raw && !hasExtends) {
if (isObject(comp)) cache.set(comp, EMPTY_ARR);
return EMPTY_ARR;
}
if (isArray(raw)) for (let i = 0; i < raw.length; i++) {
const normalizedKey = camelize(raw[i]);
if (validatePropName(normalizedKey)) normalized[normalizedKey] = EMPTY_OBJ;
}
else if (raw) for (const key in raw) {
const normalizedKey = camelize(key);
if (validatePropName(normalizedKey)) {
const opt = raw[key];
const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);
const propType = prop.type;
let shouldCast = false;
let shouldCastTrue = true;
if (isArray(propType)) for (let index = 0; index < propType.length; ++index) {
const type = propType[index];
const typeName = isFunction(type) && type.name;
if (typeName === "Boolean") {
shouldCast = true;
break;
} else if (typeName === "String") shouldCastTrue = false;
}
else shouldCast = isFunction(propType) && propType.name === "Boolean";
prop[0] = shouldCast;
prop[1] = shouldCastTrue;
if (shouldCast || hasOwn(prop, "default")) needCastKeys.push(normalizedKey);
}
}
const res = [normalized, needCastKeys];
if (isObject(comp)) cache.set(comp, res);
return res;
}
function validatePropName(key) {
if (key[0] !== "$" && !isReservedProp(key)) return true;
return false;
}
var isInternalKey = (key) => key === "_" || key === "_ctx" || key === "$stable";
var normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];
var normalizeSlot = (key, rawSlot, ctx) => {
if (rawSlot._n) return rawSlot;
const normalized = withCtx((...args) => {
return normalizeSlotValue(rawSlot(...args));
}, ctx);
normalized._c = false;
return normalized;
};
var normalizeObjectSlots = (rawSlots, slots, instance) => {
const ctx = rawSlots._ctx;
for (const key in rawSlots) {
if (isInternalKey(key)) continue;
const value = rawSlots[key];
if (isFunction(value)) slots[key] = normalizeSlot(key, value, ctx);
else if (value != null) {
const normalized = normalizeSlotValue(value);
slots[key] = () => normalized;
}
}
};
var normalizeVNodeSlots = (instance, children) => {
const normalized = normalizeSlotValue(children);
instance.slots.default = () => normalized;
};
var assignSlots = (slots, children, optimized) => {
for (const key in children) if (optimized || !isInternalKey(key)) slots[key] = children[key];
};
var initSlots = (instance, children, optimized) => {
const slots = instance.slots = createInternalObject();
if (instance.vnode.shapeFlag & 32) {
const type = children._;
if (type) {
assignSlots(slots, children, optimized);
if (optimized) def(slots, "_", type, true);
} else normalizeObjectSlots(children, slots);
} else if (children) normalizeVNodeSlots(instance, children);
};
var updateSlots = (instance, children, optimized) => {
const { vnode, slots } = instance;
let needDeletionCheck = true;
let deletionComparisonTarget = EMPTY_OBJ;
if (vnode.shapeFlag & 32) {
const type = children._;
if (type) if (optimized && type === 1) needDeletionCheck = false;
else assignSlots(slots, children, optimized);
else {
needDeletionCheck = !children.$stable;
normalizeObjectSlots(children, slots);
}
deletionComparisonTarget = children;
} else if (children) {
normalizeVNodeSlots(instance, children);
deletionComparisonTarget = { default: 1 };
}
if (needDeletionCheck) {
for (const key in slots) if (!isInternalKey(key) && deletionComparisonTarget[key] == null) delete slots[key];
}
};
var queuePostRenderEffect = queueEffectWithSuspense;
function createRenderer(options) {
return baseCreateRenderer(options);
}
function baseCreateRenderer(options, createHydrationFns) {
const target = getGlobalThis();
target.__VUE__ = true;
const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, insertStaticContent: hostInsertStaticContent } = options;
const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => {
if (n1 === n2) return;
if (n1 && !isSameVNodeType(n1, n2)) {
anchor = getNextHostNode(n1);
unmount(n1, parentComponent, parentSuspense, true);
n1 = null;
}
if (n2.patchFlag === -2) {
optimized = false;
n2.dynamicChildren = null;
}
const { type, ref, shapeFlag } = n2;
switch (type) {
case Text:
processText(n1, n2, container, anchor);
break;
case Comment:
processCommentNode(n1, n2, container, anchor);
break;
case Static:
if (n1 == null) mountStaticNode(n2, container, anchor, namespace);
break;
case Fragment:
processFragment(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
break;
default: if (shapeFlag & 1) processElement(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else if (shapeFlag & 6) processComponent(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else if (shapeFlag & 64) type.process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals);
else if (shapeFlag & 128) type.process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals);
}
if (ref != null && parentComponent) setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);
else if (ref == null && n1 && n1.ref != null) setRef(n1.ref, null, parentSuspense, n1, true);
};
const processText = (n1, n2, container, anchor) => {
if (n1 == null) hostInsert(n2.el = hostCreateText(n2.children), container, anchor);
else {
const el = n2.el = n1.el;
if (n2.children !== n1.children) hostSetText(el, n2.children);
}
};
const processCommentNode = (n1, n2, container, anchor) => {
if (n1 == null) hostInsert(n2.el = hostCreateComment(n2.children || ""), container, anchor);
else n2.el = n1.el;
};
const mountStaticNode = (n2, container, anchor, namespace) => {
[n2.el, n2.anchor] = hostInsertStaticContent(n2.children, container, anchor, namespace, n2.el, n2.anchor);
};
const moveStaticNode = ({ el, anchor }, container, nextSibling) => {
let next;
while (el && el !== anchor) {
next = hostNextSibling(el);
hostInsert(el, container, nextSibling);
el = next;
}
hostInsert(anchor, container, nextSibling);
};
const removeStaticNode = ({ el, anchor }) => {
let next;
while (el && el !== anchor) {
next = hostNextSibling(el);
hostRemove(el);
el = next;
}
hostRemove(anchor);
};
const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
if (n2.type === "svg") namespace = "svg";
else if (n2.type === "math") namespace = "mathml";
if (n1 == null) mountElement(n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else {
const customElement = n1.el && n1.el._isVueCE ? n1.el : null;
try {
if (customElement) customElement._beginPatch();
patchElement(n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
} finally {
if (customElement) customElement._endPatch();
}
}
};
const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
let el;
let vnodeHook;
const { props, shapeFlag, transition, dirs } = vnode;
el = vnode.el = hostCreateElement(vnode.type, namespace, props && props.is, props);
if (shapeFlag & 8) hostSetElementText(el, vnode.children);
else if (shapeFlag & 16) mountChildren(vnode.children, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(vnode, namespace), slotScopeIds, optimized);
if (dirs) invokeDirectiveHook(vnode, null, parentComponent, "created");
setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
if (props) {
for (const key in props) if (key !== "value" && !isReservedProp(key)) hostPatchProp(el, key, null, props[key], namespace, parentComponent);
if ("value" in props) hostPatchProp(el, "value", null, props.value, namespace);
if (vnodeHook = props.onVnodeBeforeMount) invokeVNodeHook(vnodeHook, parentComponent, vnode);
}
if (dirs) invokeDirectiveHook(vnode, null, parentComponent, "beforeMount");
const needCallTransitionHooks = needTransition(parentSuspense, transition);
if (needCallTransitionHooks) transition.beforeEnter(el);
hostInsert(el, container, anchor);
if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) queuePostRenderEffect(() => {
try {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
needCallTransitionHooks && transition.enter(el);
dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted");
} finally {}
}, parentSuspense);
};
const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {
if (scopeId) hostSetScopeId(el, scopeId);
if (slotScopeIds) for (let i = 0; i < slotScopeIds.length; i++) hostSetScopeId(el, slotScopeIds[i]);
if (parentComponent) {
let subTree = parentComponent.subTree;
if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) {
const parentVNode = parentComponent.vnode;
setScopeId(el, parentVNode, parentVNode.scopeId, parentVNode.slotScopeIds, parentComponent.parent);
}
}
};
const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {
for (let i = start; i < children.length; i++) patch(null, children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]), container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
};
const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
const el = n2.el = n1.el;
let { patchFlag, dynamicChildren, dirs } = n2;
patchFlag |= n1.patchFlag & 16;
const oldProps = n1.props || EMPTY_OBJ;
const newProps = n2.props || EMPTY_OBJ;
let vnodeHook;
parentComponent && toggleRecurse(parentComponent, false);
if (vnodeHook = newProps.onVnodeBeforeUpdate) invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
if (dirs) invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate");
parentComponent && toggleRecurse(parentComponent, true);
if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) hostSetElementText(el, "");
if (dynamicChildren) patchBlockChildren(n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds);
else if (!optimized) patchChildren(n1, n2, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds, false);
if (patchFlag > 0) {
if (patchFlag & 16) patchProps(el, oldProps, newProps, parentComponent, namespace);
else {
if (patchFlag & 2) {
if (oldProps.class !== newProps.class) hostPatchProp(el, "class", null, newProps.class, namespace);
}
if (patchFlag & 4) hostPatchProp(el, "style", oldProps.style, newProps.style, namespace);
if (patchFlag & 8) {
const propsToUpdate = n2.dynamicProps;
for (let i = 0; i < propsToUpdate.length; i++) {
const key = propsToUpdate[i];
const prev = oldProps[key];
const next = newProps[key];
if (next !== prev || key === "value") hostPatchProp(el, key, prev, next, namespace, parentComponent);
}
}
}
if (patchFlag & 1) {
if (n1.children !== n2.children) hostSetElementText(el, n2.children);
}
} else if (!optimized && dynamicChildren == null) patchProps(el, oldProps, newProps, parentComponent, namespace);
if ((vnodeHook = newProps.onVnodeUpdated) || dirs) queuePostRenderEffect(() => {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);
dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated");
}, parentSuspense);
};
const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {
for (let i = 0; i < newChildren.length; i++) {
const oldVNode = oldChildren[i];
const newVNode = newChildren[i];
patch(oldVNode, newVNode, oldVNode.el && (oldVNode.type === Fragment || !isSameVNodeType(oldVNode, newVNode) || oldVNode.shapeFlag & 198) ? hostParentNode(oldVNode.el) : fallbackContainer, null, parentComponent, parentSuspense, namespace, slotScopeIds, true);
}
};
const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {
if (oldProps !== newProps) {
if (oldProps !== EMPTY_OBJ) {
for (const key in oldProps) if (!isReservedProp(key) && !(key in newProps)) hostPatchProp(el, key, oldProps[key], null, namespace, parentComponent);
}
for (const key in newProps) {
if (isReservedProp(key)) continue;
const next = newProps[key];
const prev = oldProps[key];
if (next !== prev && key !== "value") hostPatchProp(el, key, prev, next, namespace, parentComponent);
}
if ("value" in newProps) hostPatchProp(el, "value", oldProps.value, newProps.value, namespace);
}
};
const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText("");
const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText("");
let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;
if (fragmentSlotScopeIds) slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;
if (n1 == null) {
hostInsert(fragmentStartAnchor, container, anchor);
hostInsert(fragmentEndAnchor, container, anchor);
mountChildren(n2.children || [], container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
} else if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && n1.dynamicChildren && n1.dynamicChildren.length === dynamicChildren.length) {
patchBlockChildren(n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, namespace, slotScopeIds);
if (n2.key != null || parentComponent && n2 === parentComponent.subTree) traverseStaticChildren(n1, n2, true);
} else patchChildren(n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
};
const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
n2.slotScopeIds = slotScopeIds;
if (n1 == null) if (n2.shapeFlag & 512) parentComponent.ctx.activate(n2, container, anchor, namespace, optimized);
else mountComponent(n2, container, anchor, parentComponent, parentSuspense, namespace, optimized);
else updateComponent(n1, n2, optimized);
};
const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {
const instance = initialVNode.component = createComponentInstance(initialVNode, parentComponent, parentSuspense);
if (isKeepAlive(initialVNode)) instance.ctx.renderer = internals;
setupComponent(instance, false, optimized);
if (instance.asyncDep) {
parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);
if (!initialVNode.el) {
const placeholder = instance.subTree = createVNode(Comment);
processCommentNode(null, placeholder, container, anchor);
initialVNode.placeholder = placeholder.el;
}
} else setupRenderEffect(instance, initialVNode, container, anchor, parentSuspense, namespace, optimized);
};
const updateComponent = (n1, n2, optimized) => {
const instance = n2.component = n1.component;
if (shouldUpdateComponent(n1, n2, optimized)) if (instance.asyncDep && !instance.asyncResolved) {
updateComponentPreRender(instance, n2, optimized);
return;
} else {
instance.next = n2;
instance.update();
}
else {
n2.el = n1.el;
instance.vnode = n2;
}
};
const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {
const componentUpdateFn = () => {
if (!instance.isMounted) {
let vnodeHook;
const { el, props } = initialVNode;
const { bm, m, parent, root, type } = instance;
const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);
toggleRecurse(instance, false);
if (bm) invokeArrayFns(bm);
if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) invokeVNodeHook(vnodeHook, parent, initialVNode);
toggleRecurse(instance, true);
if (el && hydrateNode) {
const hydrateSubTree = () => {
instance.subTree = renderComponentRoot(instance);
hydrateNode(el, instance.subTree, instance, parentSuspense, null);
};
if (isAsyncWrapperVNode && type.__asyncHydrate) type.__asyncHydrate(el, instance, hydrateSubTree);
else hydrateSubTree();
} else {
if (root.ce && root.ce._hasShadowRoot()) root.ce._injectChildStyle(type, instance.parent ? instance.parent.type : void 0);
const subTree = instance.subTree = renderComponentRoot(instance);
patch(null, subTree, container, anchor, instance, parentSuspense, namespace);
initialVNode.el = subTree.el;
}
if (m) queuePostRenderEffect(m, parentSuspense);
if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {
const scopedInitialVNode = initialVNode;
queuePostRenderEffect(() => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), parentSuspense);
}
if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) instance.a && queuePostRenderEffect(instance.a, parentSuspense);
instance.isMounted = true;
initialVNode = container = anchor = null;
} else {
let { next, bu, u, parent, vnode } = instance;
{
const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);
if (nonHydratedAsyncRoot) {
if (next) {
next.el = vnode.el;
updateComponentPreRender(instance, next, optimized);
}
nonHydratedAsyncRoot.asyncDep.then(() => {
queuePostRenderEffect(() => {
if (!instance.isUnmounted) update();
}, parentSuspense);
});
return;
}
}
let originNext = next;
let vnodeHook;
toggleRecurse(instance, false);
if (next) {
next.el = vnode.el;
updateComponentPreRender(instance, next, optimized);
} else next = vnode;
if (bu) invokeArrayFns(bu);
if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) invokeVNodeHook(vnodeHook, parent, next, vnode);
toggleRecurse(instance, true);
const nextTree = renderComponentRoot(instance);
const prevTree = instance.subTree;
instance.subTree = nextTree;
patch(prevTree, nextTree, hostParentNode(prevTree.el), getNextHostNode(prevTree), instance, parentSuspense, namespace);
next.el = nextTree.el;
if (originNext === null) updateHOCHostEl(instance, nextTree.el);
if (u) queuePostRenderEffect(u, parentSuspense);
if (vnodeHook = next.props && next.props.onVnodeUpdated) queuePostRenderEffect(() => invokeVNodeHook(vnodeHook, parent, next, vnode), parentSuspense);
}
};
instance.scope.on();
const effect = instance.effect = new ReactiveEffect(componentUpdateFn);
instance.scope.off();
const update = instance.update = effect.run.bind(effect);
const job = instance.job = effect.runIfDirty.bind(effect);
job.i = instance;
job.id = instance.uid;
effect.scheduler = () => queueJob(job);
toggleRecurse(instance, true);
update();
};
const updateComponentPreRender = (instance, nextVNode, optimized) => {
nextVNode.component = instance;
const prevProps = instance.vnode.props;
instance.vnode = nextVNode;
instance.next = null;
updateProps(instance, nextVNode.props, prevProps, optimized);
updateSlots(instance, nextVNode.children, optimized);
pauseTracking();
flushPreFlushCbs(instance);
resetTracking();
};
const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {
const c1 = n1 && n1.children;
const prevShapeFlag = n1 ? n1.shapeFlag : 0;
const c2 = n2.children;
const { patchFlag, shapeFlag } = n2;
if (patchFlag > 0) {
if (patchFlag & 128) {
patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
return;
} else if (patchFlag & 256) {
patchUnkeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
return;
}
}
if (shapeFlag & 8) {
if (prevShapeFlag & 16) unmountChildren(c1, parentComponent, parentSuspense);
if (c2 !== c1) hostSetElementText(container, c2);
} else if (prevShapeFlag & 16) if (shapeFlag & 16) patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else unmountChildren(c1, parentComponent, parentSuspense, true);
else {
if (prevShapeFlag & 8) hostSetElementText(container, "");
if (shapeFlag & 16) mountChildren(c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
}
};
const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
c1 = c1 || EMPTY_ARR;
c2 = c2 || EMPTY_ARR;
const oldLength = c1.length;
const newLength = c2.length;
const commonLength = Math.min(oldLength, newLength);
let i;
for (i = 0; i < commonLength; i++) {
const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
patch(c1[i], nextChild, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
}
if (oldLength > newLength) unmountChildren(c1, parentComponent, parentSuspense, true, false, commonLength);
else mountChildren(c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, commonLength);
};
const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {
let i = 0;
const l2 = c2.length;
let e1 = c1.length - 1;
let e2 = l2 - 1;
while (i <= e1 && i <= e2) {
const n1 = c1[i];
const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
if (isSameVNodeType(n1, n2)) patch(n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else break;
i++;
}
while (i <= e1 && i <= e2) {
const n1 = c1[e1];
const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);
if (isSameVNodeType(n1, n2)) patch(n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else break;
e1--;
e2--;
}
if (i > e1) {
if (i <= e2) {
const nextPos = e2 + 1;
const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;
while (i <= e2) {
patch(null, c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]), container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
i++;
}
}
} else if (i > e2) while (i <= e1) {
unmount(c1[i], parentComponent, parentSuspense, true);
i++;
}
else {
const s1 = i;
const s2 = i;
const keyToNewIndexMap = new Map();
for (i = s2; i <= e2; i++) {
const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);
if (nextChild.key != null) keyToNewIndexMap.set(nextChild.key, i);
}
let j;
let patched = 0;
const toBePatched = e2 - s2 + 1;
let moved = false;
let maxNewIndexSoFar = 0;
const newIndexToOldIndexMap = new Array(toBePatched);
for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;
for (i = s1; i <= e1; i++) {
const prevChild = c1[i];
if (patched >= toBePatched) {
unmount(prevChild, parentComponent, parentSuspense, true);
continue;
}
let newIndex;
if (prevChild.key != null) newIndex = keyToNewIndexMap.get(prevChild.key);
else for (j = s2; j <= e2; j++) if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {
newIndex = j;
break;
}
if (newIndex === void 0) unmount(prevChild, parentComponent, parentSuspense, true);
else {
newIndexToOldIndexMap[newIndex - s2] = i + 1;
if (newIndex >= maxNewIndexSoFar) maxNewIndexSoFar = newIndex;
else moved = true;
patch(prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
patched++;
}
}
const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;
j = increasingNewIndexSequence.length - 1;
for (i = toBePatched - 1; i >= 0; i--) {
const nextIndex = s2 + i;
const nextChild = c2[nextIndex];
const anchorVNode = c2[nextIndex + 1];
const anchor = nextIndex + 1 < l2 ? anchorVNode.el || resolveAsyncComponentPlaceholder(anchorVNode) : parentAnchor;
if (newIndexToOldIndexMap[i] === 0) patch(null, nextChild, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized);
else if (moved) if (j < 0 || i !== increasingNewIndexSequence[j]) move(nextChild, container, anchor, 2);
else j--;
}
}
};
const move = (vnode, container, anchor, moveType, parentSuspense = null) => {
const { el, type, transition, children, shapeFlag } = vnode;
if (shapeFlag & 6) {
move(vnode.component.subTree, container, anchor, moveType);
return;
}
if (shapeFlag & 128) {
vnode.suspense.move(container, anchor, moveType);
return;
}
if (shapeFlag & 64) {
type.move(vnode, container, anchor, internals);
return;
}
if (type === Fragment) {
hostInsert(el, container, anchor);
for (let i = 0; i < children.length; i++) move(children[i], container, anchor, moveType);
hostInsert(vnode.anchor, container, anchor);
return;
}
if (type === Static) {
moveStaticNode(vnode, container, anchor);
return;
}
if (moveType !== 2 && shapeFlag & 1 && transition) if (moveType === 0) if (transition.persisted && !el[leaveCbKey]) hostInsert(el, container, anchor);
else {
transition.beforeEnter(el);
hostInsert(el, container, anchor);
queuePostRenderEffect(() => transition.enter(el), parentSuspense);
}
else {
const { leave, delayLeave, afterLeave } = transition;
const remove2 = () => {
if (vnode.ctx.isUnmounted) hostRemove(el);
else hostInsert(el, container, anchor);
};
const performLeave = () => {
const wasLeaving = el._isLeaving || !!el[leaveCbKey];
if (el._isLeaving) el[leaveCbKey](true);
if (transition.persisted && !wasLeaving) remove2();
else leave(el, () => {
remove2();
afterLeave && afterLeave();
});
};
if (delayLeave) delayLeave(el, remove2, performLeave);
else performLeave();
}
else hostInsert(el, container, anchor);
};
const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {
const { type, props, ref, children, dynamicChildren, shapeFlag, patchFlag, dirs, cacheIndex, memo } = vnode;
if (patchFlag === -2) optimized = false;
if (ref != null) {
pauseTracking();
setRef(ref, null, parentSuspense, vnode, true);
resetTracking();
}
if (cacheIndex != null) parentComponent.renderCache[cacheIndex] = void 0;
if (shapeFlag & 256) {
parentComponent.ctx.deactivate(vnode);
return;
}
const shouldInvokeDirs = shapeFlag & 1 && dirs;
const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);
let vnodeHook;
if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) invokeVNodeHook(vnodeHook, parentComponent, vnode);
if (shapeFlag & 6) unmountComponent(vnode.component, parentSuspense, doRemove);
else {
if (shapeFlag & 128) {
vnode.suspense.unmount(parentSuspense, doRemove);
return;
}
if (shouldInvokeDirs) invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount");
if (shapeFlag & 64) vnode.type.remove(vnode, parentComponent, parentSuspense, internals, doRemove);
else if (dynamicChildren && !dynamicChildren.hasOnce && (type !== Fragment || patchFlag > 0 && patchFlag & 64)) unmountChildren(dynamicChildren, parentComponent, parentSuspense, false, true);
else if (type === Fragment && patchFlag & 384 || !optimized && shapeFlag & 16) unmountChildren(children, parentComponent, parentSuspense);
if (doRemove) remove(vnode);
}
const shouldInvalidateMemo = memo != null && cacheIndex == null;
if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs || shouldInvalidateMemo) queuePostRenderEffect(() => {
vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);
shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted");
if (shouldInvalidateMemo) vnode.el = null;
}, parentSuspense);
};
const remove = (vnode) => {
const { type, el, anchor, transition } = vnode;
if (type === Fragment) {
removeFragment(el, anchor);
return;
}
if (type === Static) {
removeStaticNode(vnode);
return;
}
const performRemove = () => {
hostRemove(el);
if (transition && !transition.persisted && transition.afterLeave) transition.afterLeave();
};
if (vnode.shapeFlag & 1 && transition && !transition.persisted) {
const { leave, delayLeave } = transition;
const performLeave = () => leave(el, performRemove);
if (delayLeave) delayLeave(vnode.el, performRemove, performLeave);
else performLeave();
} else performRemove();
};
const removeFragment = (cur, end) => {
let next;
while (cur !== end) {
next = hostNextSibling(cur);
hostRemove(cur);
cur = next;
}
hostRemove(end);
};
const unmountComponent = (instance, parentSuspense, doRemove) => {
const { bum, scope, job, subTree, um, m, a } = instance;
invalidateMount(m);
invalidateMount(a);
if (bum) invokeArrayFns(bum);
scope.stop();
if (job) {
job.flags |= 8;
unmount(subTree, instance, parentSuspense, doRemove);
}
if (um) queuePostRenderEffect(um, parentSuspense);
queuePostRenderEffect(() => {
instance.isUnmounted = true;
}, parentSuspense);
};
const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {
for (let i = start; i < children.length; i++) unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);
};
const getNextHostNode = (vnode) => {
if (vnode.shapeFlag & 6) return getNextHostNode(vnode.component.subTree);
if (vnode.shapeFlag & 128) return vnode.suspense.next();
const el = hostNextSibling(vnode.anchor || vnode.el);
const teleportEnd = el && el[TeleportEndKey];
return teleportEnd ? hostNextSibling(teleportEnd) : el;
};
let isFlushing = false;
const render = (vnode, container, namespace) => {
let instance;
if (vnode == null) {
if (container._vnode) {
unmount(container._vnode, null, null, true);
instance = container._vnode.component;
}
} else patch(container._vnode || null, vnode, container, null, null, null, namespace);
container._vnode = vnode;
if (!isFlushing) {
isFlushing = true;
flushPreFlushCbs(instance);
flushPostFlushCbs();
isFlushing = false;
}
};
const internals = {
p: patch,
um: unmount,
m: move,
r: remove,
mt: mountComponent,
mc: mountChildren,
pc: patchChildren,
pbc: patchBlockChildren,
n: getNextHostNode,
o: options
};
let hydrate;
let hydrateNode;
if (createHydrationFns) [hydrate, hydrateNode] = createHydrationFns(internals);
return {
render,
hydrate,
createApp: createAppAPI(render, hydrate)
};
}
function resolveChildrenNamespace({ type, props }, currentNamespace) {
return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace;
}
function toggleRecurse({ effect, job }, allowed) {
if (allowed) {
effect.flags |= 32;
job.flags |= 4;
} else {
effect.flags &= -33;
job.flags &= -5;
}
}
function needTransition(parentSuspense, transition) {
return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;
}
function traverseStaticChildren(n1, n2, shallow = false) {
const ch1 = n1.children;
const ch2 = n2.children;
if (isArray(ch1) && isArray(ch2)) for (let i = 0; i < ch1.length; i++) {
const c1 = ch1[i];
let c2 = ch2[i];
if (c2.shapeFlag & 1 && !c2.dynamicChildren) {
if (c2.patchFlag <= 0 || c2.patchFlag === 32) {
c2 = ch2[i] = cloneIfMounted(ch2[i]);
c2.el = c1.el;
}
if (!shallow && c2.patchFlag !== -2) traverseStaticChildren(c1, c2);
}
if (c2.type === Text) {
if (c2.patchFlag === -1) c2 = ch2[i] = cloneIfMounted(c2);
c2.el = c1.el;
}
if (c2.type === Comment && !c2.el) c2.el = c1.el;
}
}
function getSequence(arr) {
const p = arr.slice();
const result = [0];
let i, j, u, v, c;
const len = arr.length;
for (i = 0; i < len; i++) {
const arrI = arr[i];
if (arrI !== 0) {
j = result[result.length - 1];
if (arr[j] < arrI) {
p[i] = j;
result.push(i);
continue;
}
u = 0;
v = result.length - 1;
while (u < v) {
c = u + v >> 1;
if (arr[result[c]] < arrI) u = c + 1;
else v = c;
}
if (arrI < arr[result[u]]) {
if (u > 0) p[i] = result[u - 1];
result[u] = i;
}
}
}
u = result.length;
v = result[u - 1];
while (u-- > 0) {
result[u] = v;
v = p[v];
}
return result;
}
function locateNonHydratedAsyncRoot(instance) {
const subComponent = instance.subTree.component;
if (subComponent) if (subComponent.asyncDep && !subComponent.asyncResolved) return subComponent;
else return locateNonHydratedAsyncRoot(subComponent);
}
function invalidateMount(hooks) {
if (hooks) for (let i = 0; i < hooks.length; i++) hooks[i].flags |= 8;
}
function resolveAsyncComponentPlaceholder(anchorVnode) {
if (anchorVnode.placeholder) return anchorVnode.placeholder;
const instance = anchorVnode.component;
if (instance) return resolveAsyncComponentPlaceholder(instance.subTree);
return null;
}
var isSuspense = (type) => type.__isSuspense;
function queueEffectWithSuspense(fn, suspense) {
if (suspense && suspense.pendingBranch) if (isArray(fn)) suspense.effects.push(...fn);
else suspense.effects.push(fn);
else queuePostFlushCb(fn);
}
var Fragment = Symbol.for("v-fgt");
var Text = Symbol.for("v-txt");
var Comment = Symbol.for("v-cmt");
var Static = Symbol.for("v-stc");
var blockStack = [];
var currentBlock = null;
function openBlock(disableTracking = false) {
blockStack.push(currentBlock = disableTracking ? null : []);
}
function closeBlock() {
blockStack.pop();
currentBlock = blockStack[blockStack.length - 1] || null;
}
var isBlockTreeEnabled = 1;
function setBlockTracking(value, inVOnce = false) {
isBlockTreeEnabled += value;
if (value < 0 && currentBlock && inVOnce) currentBlock.hasOnce = true;
}
function setupBlock(vnode) {
vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;
closeBlock();
if (isBlockTreeEnabled > 0 && currentBlock) currentBlock.push(vnode);
return vnode;
}
function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {
return setupBlock(createBaseVNode(type, props, children, patchFlag, dynamicProps, shapeFlag, true));
}
function createBlock(type, props, children, patchFlag, dynamicProps) {
return setupBlock(createVNode(type, props, children, patchFlag, dynamicProps, true));
}
function isVNode(value) {
return value ? value.__v_isVNode === true : false;
}
function isSameVNodeType(n1, n2) {
return n1.type === n2.type && n1.key === n2.key;
}
var normalizeKey = ({ key }) => key != null ? key : null;
var normalizeRef = ({ ref, ref_key, ref_for }) => {
if (typeof ref === "number") ref = "" + ref;
return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? {
i: currentRenderingInstance,
r: ref,
k: ref_key,
f: !!ref_for
} : ref : null;
};
function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {
const vnode = {
__v_isVNode: true,
__v_skip: true,
type,
props,
key: props && normalizeKey(props),
ref: props && normalizeRef(props),
scopeId: currentScopeId,
slotScopeIds: null,
children,
component: null,
suspense: null,
ssContent: null,
ssFallback: null,
dirs: null,
transition: null,
el: null,
anchor: null,
target: null,
targetStart: null,
targetAnchor: null,
staticCount: 0,
shapeFlag,
patchFlag,
dynamicProps,
dynamicChildren: null,
appContext: null,
ctx: currentRenderingInstance
};
if (needFullChildrenNormalization) {
normalizeChildren(vnode, children);
if (shapeFlag & 128) type.normalize(vnode);
} else if (children) vnode.shapeFlag |= isString(children) ? 8 : 16;
if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock && (vnode.patchFlag > 0 || shapeFlag & 6) && vnode.patchFlag !== 32) currentBlock.push(vnode);
return vnode;
}
var createVNode = _createVNode;
function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {
if (!type || type === NULL_DYNAMIC_COMPONENT) type = Comment;
if (isVNode(type)) {
const cloned = cloneVNode(type, props, true);
if (children) normalizeChildren(cloned, children);
if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) if (cloned.shapeFlag & 6) currentBlock[currentBlock.indexOf(type)] = cloned;
else currentBlock.push(cloned);
cloned.patchFlag = -2;
return cloned;
}
if (isClassComponent(type)) type = type.__vccOpts;
if (props) {
props = guardReactiveProps(props);
let { class: klass, style } = props;
if (klass && !isString(klass)) props.class = normalizeClass(klass);
if (isObject(style)) {
if (isProxy(style) && !isArray(style)) style = extend({}, style);
props.style = normalizeStyle(style);
}
}
const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;
return createBaseVNode(type, props, children, patchFlag, dynamicProps, shapeFlag, isBlockNode, true);
}
function guardReactiveProps(props) {
if (!props) return null;
return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;
}
function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {
const { props, ref, patchFlag, children, transition } = vnode;
const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;
const cloned = {
__v_isVNode: true,
__v_skip: true,
type: vnode.type,
props: mergedProps,
key: mergedProps && normalizeKey(mergedProps),
ref: extraProps && extraProps.ref ? mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps) : ref,
scopeId: vnode.scopeId,
slotScopeIds: vnode.slotScopeIds,
children,
target: vnode.target,
targetStart: vnode.targetStart,
targetAnchor: vnode.targetAnchor,
staticCount: vnode.staticCount,
shapeFlag: vnode.shapeFlag,
patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,
dynamicProps: vnode.dynamicProps,
dynamicChildren: vnode.dynamicChildren,
appContext: vnode.appContext,
dirs: vnode.dirs,
transition,
component: vnode.component,
suspense: vnode.suspense,
ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
placeholder: vnode.placeholder,
el: vnode.el,
anchor: vnode.anchor,
ctx: vnode.ctx,
ce: vnode.ce
};
if (transition && cloneTransition) setTransitionHooks(cloned, transition.clone(cloned));
return cloned;
}
function createTextVNode(text = " ", flag = 0) {
return createVNode(Text, null, text, flag);
}
function createCommentVNode(text = "", asBlock = false) {
return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);
}
function normalizeVNode(child) {
if (child == null || typeof child === "boolean") return createVNode(Comment);
else if (isArray(child)) return createVNode(Fragment, null, child.slice());
else if (isVNode(child)) return cloneIfMounted(child);
else return createVNode(Text, null, String(child));
}
function cloneIfMounted(child) {
return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);
}
function normalizeChildren(vnode, children) {
let type = 0;
const { shapeFlag } = vnode;
if (children == null) children = null;
else if (isArray(children)) type = 16;
else if (typeof children === "object") if (shapeFlag & 65) {
const slot = children.default;
if (slot) {
slot._c && (slot._d = false);
normalizeChildren(vnode, slot());
slot._c && (slot._d = true);
}
return;
} else {
type = 32;
const slotFlag = children._;
if (!slotFlag && !isInternalObject(children)) children._ctx = currentRenderingInstance;
else if (slotFlag === 3 && currentRenderingInstance) if (currentRenderingInstance.slots._ === 1) children._ = 1;
else {
children._ = 2;
vnode.patchFlag |= 1024;
}
}
else if (isFunction(children)) {
children = {
default: children,
_ctx: currentRenderingInstance
};
type = 32;
} else {
children = String(children);
if (shapeFlag & 64) {
type = 16;
children = [createTextVNode(children)];
} else type = 8;
}
vnode.children = children;
vnode.shapeFlag |= type;
}
function mergeProps(...args) {
const ret = {};
for (let i = 0; i < args.length; i++) {
const toMerge = args[i];
for (const key in toMerge) if (key === "class") {
if (ret.class !== toMerge.class) ret.class = normalizeClass([ret.class, toMerge.class]);
} else if (key === "style") ret.style = normalizeStyle([ret.style, toMerge.style]);
else if (isOn(key)) {
const existing = ret[key];
const incoming = toMerge[key];
if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) ret[key] = existing ? [].concat(existing, incoming) : incoming;
else if (incoming == null && existing == null && !isModelListener(key)) ret[key] = incoming;
} else if (key !== "") ret[key] = toMerge[key];
}
return ret;
}
function invokeVNodeHook(hook, instance, vnode, prevVNode = null) {
callWithAsyncErrorHandling(hook, instance, 7, [vnode, prevVNode]);
}
var emptyAppContext = createAppContext();
var uid = 0;
function createComponentInstance(vnode, parent, suspense) {
const type = vnode.type;
const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;
const instance = {
uid: uid++,
vnode,
type,
parent,
appContext,
root: null,
next: null,
subTree: null,
effect: null,
update: null,
job: null,
scope: new EffectScope(true),
render: null,
proxy: null,
exposed: null,
exposeProxy: null,
withProxy: null,
provides: parent ? parent.provides : Object.create(appContext.provides),
ids: parent ? parent.ids : [
"",
0,
0
],
accessCache: null,
renderCache: [],
components: null,
directives: null,
propsOptions: normalizePropsOptions(type, appContext),
emitsOptions: normalizeEmitsOptions(type, appContext),
emit: null,
emitted: null,
propsDefaults: EMPTY_OBJ,
inheritAttrs: type.inheritAttrs,
ctx: EMPTY_OBJ,
data: EMPTY_OBJ,
props: EMPTY_OBJ,
attrs: EMPTY_OBJ,
slots: EMPTY_OBJ,
refs: EMPTY_OBJ,
setupState: EMPTY_OBJ,
setupContext: null,
suspense,
suspenseId: suspense ? suspense.pendingId : 0,
asyncDep: null,
asyncResolved: false,
isMounted: false,
isUnmounted: false,
isDeactivated: false,
bc: null,
c: null,
bm: null,
m: null,
bu: null,
u: null,
um: null,
bum: null,
da: null,
a: null,
rtg: null,
rtc: null,
ec: null,
sp: null
};
instance.ctx = { _: instance };
instance.root = parent ? parent.root : instance;
instance.emit = emit.bind(null, instance);
if (vnode.ce) vnode.ce(instance);
return instance;
}
var currentInstance = null;
var getCurrentInstance = () => currentInstance || currentRenderingInstance;
var internalSetCurrentInstance;
var setInSSRSetupState;
{
const g = getGlobalThis();
const registerGlobalSetter = (key, setter) => {
let setters;
if (!(setters = g[key])) setters = g[key] = [];
setters.push(setter);
return (v) => {
if (setters.length > 1) setters.forEach((set) => set(v));
else setters[0](v);
};
};
internalSetCurrentInstance = registerGlobalSetter(`__VUE_INSTANCE_SETTERS__`, (v) => currentInstance = v);
setInSSRSetupState = registerGlobalSetter(`__VUE_SSR_SETTERS__`, (v) => isInSSRComponentSetup = v);
}
var setCurrentInstance = (instance) => {
const prev = currentInstance;
internalSetCurrentInstance(instance);
instance.scope.on();
return () => {
instance.scope.off();
internalSetCurrentInstance(prev);
};
};
var unsetCurrentInstance = () => {
currentInstance && currentInstance.scope.off();
internalSetCurrentInstance(null);
};
function isStatefulComponent(instance) {
return instance.vnode.shapeFlag & 4;
}
var isInSSRComponentSetup = false;
function setupComponent(instance, isSSR = false, optimized = false) {
isSSR && setInSSRSetupState(isSSR);
const { props, children } = instance.vnode;
const isStateful = isStatefulComponent(instance);
initProps(instance, props, isStateful, isSSR);
initSlots(instance, children, optimized || isSSR);
const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;
isSSR && setInSSRSetupState(false);
return setupResult;
}
function setupStatefulComponent(instance, isSSR) {
const Component = instance.type;
instance.accessCache = Object.create(null);
instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);
const { setup } = Component;
if (setup) {
pauseTracking();
const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;
const reset = setCurrentInstance(instance);
const setupResult = callWithErrorHandling(setup, instance, 0, [instance.props, setupContext]);
const isAsyncSetup = isPromise(setupResult);
resetTracking();
reset();
if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) markAsyncBoundary(instance);
if (isAsyncSetup) {
setupResult.then(unsetCurrentInstance, unsetCurrentInstance);
if (isSSR) return setupResult.then((resolvedResult) => {
handleSetupResult(instance, resolvedResult, isSSR);
}).catch((e) => {
handleError(e, instance, 0);
});
else instance.asyncDep = setupResult;
} else handleSetupResult(instance, setupResult, isSSR);
} else finishComponentSetup(instance, isSSR);
}
function handleSetupResult(instance, setupResult, isSSR) {
if (isFunction(setupResult)) if (instance.type.__ssrInlineRender) instance.ssrRender = setupResult;
else instance.render = setupResult;
else if (isObject(setupResult)) instance.setupState = proxyRefs(setupResult);
finishComponentSetup(instance, isSSR);
}
var compile;
var installWithProxy;
function finishComponentSetup(instance, isSSR, skipOptions) {
const Component = instance.type;
if (!instance.render) {
if (!isSSR && compile && !Component.render) {
const template = Component.template || resolveMergedOptions(instance).template;
if (template) {
const { isCustomElement, compilerOptions } = instance.appContext.config;
const { delimiters, compilerOptions: componentCompilerOptions } = Component;
Component.render = compile(template, extend(extend({
isCustomElement,
delimiters
}, compilerOptions), componentCompilerOptions));
}
}
instance.render = Component.render || NOOP;
if (installWithProxy) installWithProxy(instance);
}
{
const reset = setCurrentInstance(instance);
pauseTracking();
try {
applyOptions(instance);
} finally {
resetTracking();
reset();
}
}
}
var attrsProxyHandlers = { get(target, key) {
track(target, "get", "");
return target[key];
} };
function createSetupContext(instance) {
const expose = (exposed) => {
instance.exposed = exposed || {};
};
return {
attrs: new Proxy(instance.attrs, attrsProxyHandlers),
slots: instance.slots,
emit: instance.emit,
expose
};
}
function getComponentPublicInstance(instance) {
if (instance.exposed) return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
get(target, key) {
if (key in target) return target[key];
else if (key in publicPropertiesMap) return publicPropertiesMap[key](instance);
},
has(target, key) {
return key in target || key in publicPropertiesMap;
}
}));
else return instance.proxy;
}
function isClassComponent(value) {
return isFunction(value) && "__vccOpts" in value;
}
var computed = (getterOrOptions, debugOptions) => {
return computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);
};
function h(type, propsOrChildren, children) {
try {
setBlockTracking(-1);
const l = arguments.length;
if (l === 2) if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
if (isVNode(propsOrChildren)) return createVNode(type, null, [propsOrChildren]);
return createVNode(type, propsOrChildren);
} else return createVNode(type, null, propsOrChildren);
else {
if (l > 3) children = Array.prototype.slice.call(arguments, 2);
else if (l === 3 && isVNode(children)) children = [children];
return createVNode(type, propsOrChildren, children);
}
} finally {
setBlockTracking(1);
}
}
var version = "3.5.38";
var policy = void 0;
var tt = typeof window !== "undefined" && window.trustedTypes;
if (tt) try {
policy = tt.createPolicy("vue", { createHTML: (val) => val });
} catch (e) {}
var unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val;
var svgNS = "http://www.w3.org/2000/svg";
var mathmlNS = "http://www.w3.org/1998/Math/MathML";
var doc = typeof document !== "undefined" ? document : null;
var templateContainer = doc && doc.createElement("template");
var nodeOps = {
insert: (child, parent, anchor) => {
parent.insertBefore(child, anchor || null);
},
remove: (child) => {
const parent = child.parentNode;
if (parent) parent.removeChild(child);
},
createElement: (tag, namespace, is, props) => {
const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);
if (tag === "select" && props && props.multiple != null) el.setAttribute("multiple", props.multiple);
return el;
},
createText: (text) => doc.createTextNode(text),
createComment: (text) => doc.createComment(text),
setText: (node, text) => {
node.nodeValue = text;
},
setElementText: (el, text) => {
el.textContent = text;
},
parentNode: (node) => node.parentNode,
nextSibling: (node) => node.nextSibling,
querySelector: (selector) => doc.querySelector(selector),
setScopeId(el, id) {
el.setAttribute(id, "");
},
insertStaticContent(content, parent, anchor, namespace, start, end) {
const before = anchor ? anchor.previousSibling : parent.lastChild;
if (start && (start === end || start.nextSibling)) while (true) {
parent.insertBefore(start.cloneNode(true), anchor);
if (start === end || !(start = start.nextSibling)) break;
}
else {
templateContainer.innerHTML = unsafeToTrustedHTML(namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content);
const template = templateContainer.content;
if (namespace === "svg" || namespace === "mathml") {
const wrapper = template.firstChild;
while (wrapper.firstChild) template.appendChild(wrapper.firstChild);
template.removeChild(wrapper);
}
parent.insertBefore(template, anchor);
}
return [before ? before.nextSibling : parent.firstChild, anchor ? anchor.previousSibling : parent.lastChild];
}
};
var TRANSITION = "transition";
var ANIMATION = "animation";
var vtcKey = Symbol("_vtc");
var DOMTransitionPropsValidators = {
name: String,
type: String,
css: {
type: Boolean,
default: true
},
duration: [
String,
Number,
Object
],
enterFromClass: String,
enterActiveClass: String,
enterToClass: String,
appearFromClass: String,
appearActiveClass: String,
appearToClass: String,
leaveFromClass: String,
leaveActiveClass: String,
leaveToClass: String
};
var TransitionPropsValidators = extend({}, BaseTransitionPropsValidators, DOMTransitionPropsValidators);
var decorate$1 = (t) => {
t.displayName = "Transition";
t.props = TransitionPropsValidators;
return t;
};
var Transition = decorate$1((props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots));
var callHook = (hook, args = []) => {
if (isArray(hook)) hook.forEach((h2) => h2(...args));
else if (hook) hook(...args);
};
var hasExplicitCallback = (hook) => {
return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;
};
function resolveTransitionProps(rawProps) {
const baseProps = {};
for (const key in rawProps) if (!(key in DOMTransitionPropsValidators)) baseProps[key] = rawProps[key];
if (rawProps.css === false) return baseProps;
const { name = "v", type, duration, enterFromClass = `${name}-enter-from`, enterActiveClass = `${name}-enter-active`, enterToClass = `${name}-enter-to`, appearFromClass = enterFromClass, appearActiveClass = enterActiveClass, appearToClass = enterToClass, leaveFromClass = `${name}-leave-from`, leaveActiveClass = `${name}-leave-active`, leaveToClass = `${name}-leave-to` } = rawProps;
const durations = normalizeDuration(duration);
const enterDuration = durations && durations[0];
const leaveDuration = durations && durations[1];
const { onBeforeEnter, onEnter, onEnterCancelled, onLeave, onLeaveCancelled, onBeforeAppear = onBeforeEnter, onAppear = onEnter, onAppearCancelled = onEnterCancelled } = baseProps;
const finishEnter = (el, isAppear, done, isCancelled) => {
el._enterCancelled = isCancelled;
removeTransitionClass(el, isAppear ? appearToClass : enterToClass);
removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);
done && done();
};
const finishLeave = (el, done) => {
el._isLeaving = false;
removeTransitionClass(el, leaveFromClass);
removeTransitionClass(el, leaveToClass);
removeTransitionClass(el, leaveActiveClass);
done && done();
};
const makeEnterHook = (isAppear) => {
return (el, done) => {
const hook = isAppear ? onAppear : onEnter;
const resolve = () => finishEnter(el, isAppear, done);
callHook(hook, [el, resolve]);
nextFrame(() => {
removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);
addTransitionClass(el, isAppear ? appearToClass : enterToClass);
if (!hasExplicitCallback(hook)) whenTransitionEnds(el, type, enterDuration, resolve);
});
};
};
return extend(baseProps, {
onBeforeEnter(el) {
callHook(onBeforeEnter, [el]);
addTransitionClass(el, enterFromClass);
addTransitionClass(el, enterActiveClass);
},
onBeforeAppear(el) {
callHook(onBeforeAppear, [el]);
addTransitionClass(el, appearFromClass);
addTransitionClass(el, appearActiveClass);
},
onEnter: makeEnterHook(false),
onAppear: makeEnterHook(true),
onLeave(el, done) {
el._isLeaving = true;
const resolve = () => finishLeave(el, done);
addTransitionClass(el, leaveFromClass);
if (!el._enterCancelled) {
forceReflow(el);
addTransitionClass(el, leaveActiveClass);
} else {
addTransitionClass(el, leaveActiveClass);
forceReflow(el);
}
nextFrame(() => {
if (!el._isLeaving) return;
removeTransitionClass(el, leaveFromClass);
addTransitionClass(el, leaveToClass);
if (!hasExplicitCallback(onLeave)) whenTransitionEnds(el, type, leaveDuration, resolve);
});
callHook(onLeave, [el, resolve]);
},
onEnterCancelled(el) {
finishEnter(el, false, void 0, true);
callHook(onEnterCancelled, [el]);
},
onAppearCancelled(el) {
finishEnter(el, true, void 0, true);
callHook(onAppearCancelled, [el]);
},
onLeaveCancelled(el) {
finishLeave(el);
callHook(onLeaveCancelled, [el]);
}
});
}
function normalizeDuration(duration) {
if (duration == null) return null;
else if (isObject(duration)) return [NumberOf(duration.enter), NumberOf(duration.leave)];
else {
const n = NumberOf(duration);
return [n, n];
}
}
function NumberOf(val) {
return toNumber(val);
}
function addTransitionClass(el, cls) {
cls.split(/\s+/).forEach((c) => c && el.classList.add(c));
(el[vtcKey] || (el[vtcKey] = new Set())).add(cls);
}
function removeTransitionClass(el, cls) {
cls.split(/\s+/).forEach((c) => c && el.classList.remove(c));
const _vtc = el[vtcKey];
if (_vtc) {
_vtc.delete(cls);
if (!_vtc.size) el[vtcKey] = void 0;
}
}
function nextFrame(cb) {
requestAnimationFrame(() => {
requestAnimationFrame(cb);
});
}
var endId = 0;
function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {
const id = el._endId = ++endId;
const resolveIfNotStale = () => {
if (id === el._endId) resolve();
};
if (explicitTimeout != null) return setTimeout(resolveIfNotStale, explicitTimeout);
const { type, timeout, propCount } = getTransitionInfo(el, expectedType);
if (!type) return resolve();
const endEvent = type + "end";
let ended = 0;
const end = () => {
el.removeEventListener(endEvent, onEnd);
resolveIfNotStale();
};
const onEnd = (e) => {
if (e.target === el && ++ended >= propCount) end();
};
setTimeout(() => {
if (ended < propCount) end();
}, timeout + 1);
el.addEventListener(endEvent, onEnd);
}
function getTransitionInfo(el, expectedType) {
const styles = window.getComputedStyle(el);
const getStyleProperties = (key) => (styles[key] || "").split(", ");
const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);
const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);
const transitionTimeout = getTimeout(transitionDelays, transitionDurations);
const animationDelays = getStyleProperties(`${ANIMATION}Delay`);
const animationDurations = getStyleProperties(`${ANIMATION}Duration`);
const animationTimeout = getTimeout(animationDelays, animationDurations);
let type = null;
let timeout = 0;
let propCount = 0;
if (expectedType === TRANSITION) {
if (transitionTimeout > 0) {
type = TRANSITION;
timeout = transitionTimeout;
propCount = transitionDurations.length;
}
} else if (expectedType === ANIMATION) {
if (animationTimeout > 0) {
type = ANIMATION;
timeout = animationTimeout;
propCount = animationDurations.length;
}
} else {
timeout = Math.max(transitionTimeout, animationTimeout);
type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;
propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;
}
const hasTransform = type === TRANSITION && /\b(?:transform|all)(?:,|$)/.test(getStyleProperties(`${TRANSITION}Property`).toString());
return {
type,
timeout,
propCount,
hasTransform
};
}
function getTimeout(delays, durations) {
while (delays.length < durations.length) delays = delays.concat(delays);
return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));
}
function toMs(s) {
if (s === "auto") return 0;
return Number(s.slice(0, -1).replace(",", ".")) * 1e3;
}
function forceReflow(el) {
return (el ? el.ownerDocument : document).body.offsetHeight;
}
function patchClass(el, value, isSVG) {
const transitionClasses = el[vtcKey];
if (transitionClasses) value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" ");
if (value == null) el.removeAttribute("class");
else if (isSVG) el.setAttribute("class", value);
else el.className = value;
}
var vShowOriginalDisplay = Symbol("_vod");
var vShowHidden = Symbol("_vsh");
var CSS_VAR_TEXT = Symbol("");
var displayRE = /(?:^|;)\s*display\s*:/;
function patchStyle(el, prev, next) {
const style = el.style;
const isCssString = isString(next);
let hasControlledDisplay = false;
if (next && !isCssString) {
if (prev) if (!isString(prev)) {
for (const key in prev) if (next[key] == null) setStyle(style, key, "");
} else for (const prevStyle of prev.split(";")) {
const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim();
if (next[key] == null) setStyle(style, key, "");
}
for (const key in next) {
if (key === "display") hasControlledDisplay = true;
const value = next[key];
if (value != null) {
if (!shouldPreserveTextareaResizeStyle(el, key, !isString(prev) && prev ? prev[key] : void 0, value)) setStyle(style, key, value);
} else setStyle(style, key, "");
}
} else if (isCssString) {
if (prev !== next) {
const cssVarText = style[CSS_VAR_TEXT];
if (cssVarText) next += ";" + cssVarText;
style.cssText = next;
hasControlledDisplay = displayRE.test(next);
}
} else if (prev) el.removeAttribute("style");
if (vShowOriginalDisplay in el) {
el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : "";
if (el[vShowHidden]) style.display = "none";
}
}
var importantRE = /\s*!important$/;
function setStyle(style, name, val) {
if (isArray(val)) val.forEach((v) => setStyle(style, name, v));
else {
if (val == null) val = "";
if (name.startsWith("--")) style.setProperty(name, val);
else {
const prefixed = autoPrefix(style, name);
if (importantRE.test(val)) style.setProperty(hyphenate(prefixed), val.replace(importantRE, ""), "important");
else style[prefixed] = val;
}
}
}
var prefixes = [
"Webkit",
"Moz",
"ms"
];
var prefixCache = {};
function autoPrefix(style, rawName) {
const cached = prefixCache[rawName];
if (cached) return cached;
let name = camelize(rawName);
if (name !== "filter" && name in style) return prefixCache[rawName] = name;
name = capitalize(name);
for (let i = 0; i < prefixes.length; i++) {
const prefixed = prefixes[i] + name;
if (prefixed in style) return prefixCache[rawName] = prefixed;
}
return rawName;
}
function shouldPreserveTextareaResizeStyle(el, key, prev, next) {
return el.tagName === "TEXTAREA" && (key === "width" || key === "height") && isString(next) && prev === next;
}
var xlinkNS = "http://www.w3.org/1999/xlink";
function patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {
if (isSVG && key.startsWith("xlink:")) if (value == null) el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
else el.setAttributeNS(xlinkNS, key, value);
else if (value == null || isBoolean && !includeBooleanAttr(value)) el.removeAttribute(key);
else el.setAttribute(key, isBoolean ? "" : isSymbol(value) ? String(value) : value);
}
function patchDOMProp(el, key, value, parentComponent, attrName) {
if (key === "innerHTML" || key === "textContent") {
if (value != null) el[key] = key === "innerHTML" ? unsafeToTrustedHTML(value) : value;
return;
}
const tag = el.tagName;
if (key === "value" && tag !== "PROGRESS" && !tag.includes("-")) {
const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value;
const newValue = value == null ? el.type === "checkbox" ? "on" : "" : String(value);
if (oldValue !== newValue || !("_value" in el)) el.value = newValue;
if (value == null) el.removeAttribute(key);
el._value = value;
return;
}
let needRemove = false;
if (value === "" || value == null) {
const type = typeof el[key];
if (type === "boolean") value = includeBooleanAttr(value);
else if (value == null && type === "string") {
value = "";
needRemove = true;
} else if (type === "number") {
value = 0;
needRemove = true;
}
}
try {
el[key] = value;
} catch (e) {}
needRemove && el.removeAttribute(attrName || key);
}
function addEventListener(el, event, handler, options) {
el.addEventListener(event, handler, options);
}
function removeEventListener(el, event, handler, options) {
el.removeEventListener(event, handler, options);
}
var veiKey = Symbol("_vei");
function patchEvent(el, rawName, prevValue, nextValue, instance = null) {
const invokers = el[veiKey] || (el[veiKey] = {});
const existingInvoker = invokers[rawName];
if (nextValue && existingInvoker) existingInvoker.value = nextValue;
else {
const [name, options] = parseName(rawName);
if (nextValue) addEventListener(el, name, invokers[rawName] = createInvoker(nextValue, instance), options);
else if (existingInvoker) {
removeEventListener(el, name, existingInvoker, options);
invokers[rawName] = void 0;
}
}
}
var optionsModifierRE = /(?:Once|Passive|Capture)$/;
function parseName(name) {
let options;
if (optionsModifierRE.test(name)) {
options = {};
let m;
while (m = name.match(optionsModifierRE)) {
name = name.slice(0, name.length - m[0].length);
options[m[0].toLowerCase()] = true;
}
}
return [name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2)), options];
}
var cachedNow = 0;
var p = Promise.resolve();
var getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());
function createInvoker(initialValue, instance) {
const invoker = (e) => {
if (!e._vts) e._vts = Date.now();
else if (e._vts <= invoker.attached) return;
const value = invoker.value;
if (isArray(value)) {
const originalStop = e.stopImmediatePropagation;
e.stopImmediatePropagation = () => {
originalStop.call(e);
e._stopped = true;
};
const handlers = value.slice();
const args = [e];
for (let i = 0; i < handlers.length; i++) {
if (e._stopped) break;
const handler = handlers[i];
if (handler) callWithAsyncErrorHandling(handler, instance, 5, args);
}
} else callWithAsyncErrorHandling(value, instance, 5, [e]);
};
invoker.value = initialValue;
invoker.attached = getNow();
return invoker;
}
var isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;
var patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {
const isSVG = namespace === "svg";
if (key === "class") patchClass(el, nextValue, isSVG);
else if (key === "style") patchStyle(el, prevValue, nextValue);
else if (isOn(key)) {
if (!isModelListener(key)) patchEvent(el, key, prevValue, nextValue, parentComponent);
} else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {
patchDOMProp(el, key, nextValue);
if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value");
} else if (el._isVueCE && (shouldSetAsPropForVueCE(el, key) || el._def.__asyncLoader && (/[A-Z]/.test(key) || !isString(nextValue)))) patchDOMProp(el, camelize(key), nextValue, parentComponent, key);
else {
if (key === "true-value") el._trueValue = nextValue;
else if (key === "false-value") el._falseValue = nextValue;
patchAttr(el, key, nextValue, isSVG);
}
};
function shouldSetAsProp(el, key, value, isSVG) {
if (isSVG) {
if (key === "innerHTML" || key === "textContent") return true;
if (key in el && isNativeOn(key) && isFunction(value)) return true;
return false;
}
if (key === "spellcheck" || key === "draggable" || key === "translate" || key === "autocorrect") return false;
if (key === "sandbox" && el.tagName === "IFRAME") return false;
if (key === "form") return false;
if (key === "list" && el.tagName === "INPUT") return false;
if (key === "type" && el.tagName === "TEXTAREA") return false;
if (key === "width" || key === "height") {
const tag = el.tagName;
if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") return false;
}
if (isNativeOn(key) && isString(value)) return false;
return key in el;
}
function shouldSetAsPropForVueCE(el, key) {
const props = el._def.props;
if (!props) return false;
const camelKey = camelize(key);
return Array.isArray(props) ? props.some((prop) => camelize(prop) === camelKey) : Object.keys(props).some((prop) => camelize(prop) === camelKey);
}
var systemModifiers = [
"ctrl",
"shift",
"alt",
"meta"
];
var modifierGuards = {
stop: (e) => e.stopPropagation(),
prevent: (e) => e.preventDefault(),
self: (e) => e.target !== e.currentTarget,
ctrl: (e) => !e.ctrlKey,
shift: (e) => !e.shiftKey,
alt: (e) => !e.altKey,
meta: (e) => !e.metaKey,
left: (e) => "button" in e && e.button !== 0,
middle: (e) => "button" in e && e.button !== 1,
right: (e) => "button" in e && e.button !== 2,
exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))
};
var withModifiers = (fn, modifiers) => {
if (!fn) return fn;
const cache = fn._withMods || (fn._withMods = {});
const cacheKey = modifiers.join(".");
return cache[cacheKey] || (cache[cacheKey] = ((event, ...args) => {
for (let i = 0; i < modifiers.length; i++) {
const guard = modifierGuards[modifiers[i]];
if (guard && guard(event, modifiers)) return;
}
return fn(event, ...args);
}));
};
var rendererOptions = extend({ patchProp }, nodeOps);
var renderer;
function ensureRenderer() {
return renderer || (renderer = createRenderer(rendererOptions));
}
var createApp = ((...args) => {
const app = ensureRenderer().createApp(...args);
const { mount } = app;
app.mount = (containerOrSelector) => {
const container = normalizeContainer(containerOrSelector);
if (!container) return;
const component = app._component;
if (!isFunction(component) && !component.render && !component.template) component.template = container.innerHTML;
if (container.nodeType === 1) container.textContent = "";
const proxy = mount(container, false, resolveRootNamespace(container));
if (container instanceof Element) {
container.removeAttribute("v-cloak");
container.setAttribute("data-v-app", "");
}
return proxy;
};
return app;
});
function resolveRootNamespace(container) {
if (container instanceof SVGElement) return "svg";
if (typeof MathMLElement === "function" && container instanceof MathMLElement) return "mathml";
}
function normalizeContainer(container) {
if (isString(container)) return document.querySelector(container);
return container;
}
var work_promise = {};
function getVoiceLinkTarget(target) {
while (target && !target.classList.contains(VOICELINK_CLASS)) target = target.parentElement;
return target;
}
function isInDLSite() {
return document.location.hostname.endsWith("dlsite.com");
}
function getXmlHttpRequest() {
return typeof GM !== "undefined" && GM !== null ? GM.xmlHttpRequest : GM_xmlhttpRequest;
}
function getHttpAsync(url, anonymous = false, cacheAge = 0, customHeaders = {}) {
let headers = { ...customHeaders };
headers["Accept"] = "text/xml";
headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0)";
headers["Cache-Control"] = cacheAge <= 0 ? "no-cache" : "max-age=" + cacheAge;
return new Promise((resolve, reject) => {
getXmlHttpRequest()({
method: "GET",
url,
headers,
onload: resolve,
onerror: (resp) => {
reject(resp);
},
anonymous
});
});
}
var DateParser = {
parseDateStr: function(dateStr, lang) {
dateStr = dateStr.trim().replace(/ /g, "");
lang = lang.trim().toLowerCase().replace(/_/g, "-");
let nums = this.parseNumbers(dateStr);
if (!nums || nums.length < 3 && lang !== "en-us" || nums.length < 2 && lang === "en-us") return null;
let parsers = [
this.parseAsiaDateStr,
this.parseEnglishDateStr,
this.parseEuropeanDateStr,
this.parseSpanishDateStr
];
let date = null;
for (let i = 0; i < parsers.length; i++) {
date = parsers[i](dateStr, nums, lang);
if (date) break;
}
return date;
},
parseNumbers: function(dateStr) {
let nums = dateStr.match(/\d+/g);
if (!nums) return null;
for (let i = 0; i < nums.length; i++) nums[i] = Number(nums[i]);
return nums;
},
parseAsiaDateStr: function(dateStr, nums, lang) {
if (!dateStr.match(/\d{4}年\d{1,2}月\d{1,2}日/) && !dateStr.match(/\d{4}년\d{1,2}월\d{1,2}일/)) return null;
return new Date(nums[0], nums[1] - 1, nums[2]);
},
parseEnglishDateStr: function(dateStr, nums, lang) {
if (!dateStr.match(/[a-zA-Z]{3}\/\d{1,2}\/\d{4}/)) return null;
const monthMap = {
"Jan": 0,
"Feb": 1,
"Mar": 2,
"Apr": 3,
"May": 4,
"Jun": 5,
"Jul": 6,
"Aug": 7,
"Sep": 8,
"Oct": 9,
"Nov": 10,
"Dec": 11
};
let monthStr = dateStr.substring(0, dateStr.indexOf("/")).toLowerCase();
monthStr = monthStr[0].toUpperCase() + monthStr.substring(1);
return new Date(nums[1], monthMap[monthStr], nums[0]);
},
parseSpanishDateStr: function(dateStr, nums, lang) {
if (lang !== "es-es" || !dateStr.match(/\d{1,2}\/\d{1,2}\/\d{4}/)) return null;
return new Date(nums[2], nums[0] - 1, nums[1]);
},
parseEuropeanDateStr: function(dateStr, nums, lang) {
if (lang === "es-es" || !dateStr.match(/\d{1,2}\/\d{1,2}\/\d{4}/)) return null;
return new Date(nums[2], nums[1] - 1, nums[0]);
},
getCountDownDateElement: function(date) {
if (!date) return "";
const today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);
today.setMilliseconds(0);
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
if (date.getTime() < today.getTime()) return "";
let days = (date.getTime() - today.getTime()) / (1e3 * 60 * 60 * 24);
let element = document.createElement("span");
element.innerText = `(Coming in ${days} day${days > 1 ? "s" : ""})`;
element.style.setProperty("color", "#ffeb3b", "important");
element.style.setProperty("font-style", "italic", "important");
return element;
}
};
var Csp = { createHTML: (str) => str };
if (window.isSecureContext === true && window.trustedTypes) Csp = window.trustedTypes.createPolicy(window.trustedTypes.defaultPolicy ? "VoiceLinkTrustedTypes" : "VoiceLinkTrustedTypes", Csp);
function parseWorkDOM(dom, rj) {
const workInfo = {};
workInfo.rj = rj;
let metaList = dom.getElementsByTagName("meta");
for (let i = 0; i < metaList.length; i++) {
let meta = metaList[i];
if (meta.getAttribute("property") === "og:image") {
workInfo.img = meta.content;
break;
}
}
workInfo.lang = dom.querySelector("html")?.getAttribute("lang");
let workNameNode = dom.getElementById("work_name");
if (workNameNode) workInfo.title = workNameNode.innerText;
let makerNode = dom.querySelector("span.maker_name");
if (makerNode) workInfo.circle = makerNode.innerText;
let makerLinkNode = dom.querySelector("#work_maker a");
if (makerLinkNode && makerLinkNode.href) workInfo.circleId = makerLinkNode.href.substring(makerLinkNode.href.lastIndexOf("/") + 1, makerLinkNode.href.lastIndexOf(".")).trim();
const table_outline = dom.querySelector("table#work_outline");
if (table_outline) for (let i = 0, ii = table_outline.rows.length; i < ii; i++) {
const row = table_outline.rows[i];
const row_header = row.cells[0].innerText.trim();
const row_data = row.cells[1];
const lambda = (text) => row_header === text;
switch (true) {
case [
"販売日",
"发售日",
"販賣日",
"Release date",
"판매일",
"Lanzamiento",
"Veröffentlicht",
"Date de sortie",
"Tanggal rilis",
"Data di rilascio",
"Lançamento",
"Utgivningsdatum",
"วันที่ขาย",
"Ngày phát hành"
].some(lambda):
workInfo.date = row_data.innerText.trim();
break;
case [
"更新情報",
"更新信息",
"更新資訊",
"Update information",
"갱신 정보",
"Actualizar información",
"Aktualisierungen",
"Mise à jour des informations",
"Perbarui informasi",
"Aggiorna informazioni",
"Atualizar informações",
"Uppdatera information",
"ข้อมูลอัปเดต",
"Thông tin cập nhật"
].some(lambda):
if (row_data.firstChild) workInfo.update = row_data.firstChild.data.trim();
break;
case [
"年齢指定",
"年龄指定",
"年齡指定",
"Age",
"연령 지정",
"Edad",
"Altersfreigabe",
"Âge",
"Batas usia",
"Età",
"Idade",
"Ålder",
"การกำหนดอายุ",
"Độ tuổi chỉ định"
].some(lambda):
workInfo.rating = row_data.innerText.trim();
break;
case [
"ジャンル",
"分类",
"分類",
"Genre",
"장르",
"Género",
"Genre",
"Genre",
"Genre",
"Genere",
"Gênero",
"Genre",
"ประเภท",
"Thể loại"
].some(lambda):
const tag_nodes = row_data.querySelectorAll("a");
workInfo.tags = Array.from(tag_nodes).map((a) => a.innerText.trim());
break;
case [
"シナリオ",
"Scenario",
"剧情",
"劇本",
"시나리오",
"Guión",
"Szenario",
"Scénario",
"Skenario",
"Scenario",
"Cenário",
"Scenario",
"บทละคร",
"Kịch bản"
].some(lambda):
workInfo.scenario = row_data.innerText.trim();
break;
case [
"イラスト",
"Illustration",
"插画",
"插畫",
"일러스트",
"Ilustración",
"AbbilDung",
"Illustration",
"Ilustrasi",
"Illustrazione",
"Ilustração",
"Illustration",
"ภาพประกอบ",
"Tranh minh họa"
].some(lambda):
workInfo.illustration = row_data.innerText.trim();
break;
case [
"声優",
"声优",
"聲優",
"Voice Actor",
"성우",
"Doblador",
"Synchronsprecher",
"Doubleur",
"Pengisi suara",
"Doppiatore/Doppiatrice",
"Ator de voz",
"Röstskådespelare",
"นักพากย์",
"Diễn viên lồng tiếng"
].some(lambda):
workInfo.cv = row_data.innerText.trim();
break;
case [
"音楽",
"Music",
"音乐",
"音樂",
"음악",
"Música",
"Musik",
"Musique",
"Musik",
"Musica.",
"Música",
"musik",
"ดนตรี",
"Âm nhạc"
].some(lambda):
workInfo.music = row_data.innerText.trim();
break;
case [
"ファイル容量",
"文件容量",
"檔案容量",
"File size",
"파일 용량",
"Tamaño del Archivo",
"Dateigröße",
"Taille du fichier",
"Ukuran file",
"Dimensione del file",
"Tamanho do arquivo",
"Filstorlek",
"ขนาดไฟล์",
"Dung lượng tệp"
].some(lambda):
workInfo.filesize = row_data.innerText.trim();
break;
default: break;
}
}
const work_date_ana = dom.querySelector("strong.work_date_ana");
if (work_date_ana) workInfo.dateAnnounce = work_date_ana.innerText;
return workInfo;
}
function getLangCode(lang) {
if (!lang) return "ja-JP";
switch (lang.toUpperCase()) {
case "JPN": return "ja-JP";
case "ENG": return "en-US";
case "KO_KR": return "ko-KR";
case "CHI_HANS": return "zh-CN";
case "CHI_HANT": return "zh-TW";
default: return "ja-JP";
}
}
function parseApiData(rjCode, data) {
if (!data) data = {};
let apiData = data;
apiData.is_bonus = !data.is_sale && data.is_free && data.is_oly && data.wishlist_count === false;
apiData.is_girls = data.options && data.options.indexOf("OTM") >= 0 || data.site_id === "girls";
if (data.regist_date) {
let reg_date = data.regist_date.replace(/-/g, "/");
let releaseDate = new Date(reg_date);
apiData.regist_timestamp = releaseDate.getTime();
apiData.regist_date = `${releaseDate.getFullYear()} / ${releaseDate.getMonth() + 1} / ${releaseDate.getDate()}`;
if (apiData.regist_timestamp > Date.now()) apiData.is_announce = true;
}
return apiData;
}
function parseApi2Data(rjCode, data) {
if (!data) return {};
data.lang = getLangCode((data.translation_info ? data.translation_info : {}).lang);
if (data.regist_date) {
let reg_date = data.regist_date.replace(/-/g, "/");
let releaseDate = new Date(reg_date);
data.regist_timestamp = releaseDate.getTime();
data.regist_date = `${releaseDate.getFullYear()} / ${releaseDate.getMonth() + 1} / ${releaseDate.getDate()}`;
if (data.regist_timestamp > Date.now()) data.is_announce = true;
}
return data;
}
function getParentWorkRjCode(redirectUrl) {
const reg = new RegExp("(?<=product_id/)((R[JE][0-9]{8})|(R[JE][0-9]{6})|([VB]J[0-9]{8})|([VB]J[0-9]{6}))");
const match = redirectUrl.match(reg);
return match ? match[0] : null;
}
async function getAnnouncePromise(rjCode, parentRJ) {
let resp = await getHttpAsync(`https://www.dlsite.com/maniax/announce/=/product_id/${rjCode}.html`);
if (resp.readyState === 4 && resp.status === 200) {
const workInfo = parseWorkDOM(new DOMParser().parseFromString(Csp.createHTML(resp.responseText), "text/html"), rjCode);
workInfo.parentWork = parentRJ === rjCode ? null : parentRJ;
workInfo.is_announce = true;
return workInfo;
} else if (resp.readyState === 4 && resp.status === 404) return {
parentWork: parentRJ === rjCode ? null : parentRJ,
is_announce: false
};
}
async function getHtmlPromise(rjCode) {
let resp = await getHttpAsync(`https://www.dlsite.com/maniax/work/=/product_id/${rjCode}.html`);
if (resp.readyState === 4 && resp.status === 200) {
const workInfo = parseWorkDOM(new DOMParser().parseFromString(Csp.createHTML(resp.responseText), "text/html"), rjCode);
workInfo.parentWork = getParentWorkRjCode(resp.finalUrl);
workInfo.parentWork = workInfo.parentWork === rjCode ? null : workInfo.parentWork;
workInfo.is_announce = false;
return workInfo;
} else if (resp.readyState === 4 && resp.status === 404) return await getAnnouncePromise(rjCode, getParentWorkRjCode(resp.finalUrl));
}
async function getApi2Promise(rjCode, locale = void 0) {
let resp = await getHttpAsync(`https://www.dlsite.com/maniax/api/=/product.json?workno=${rjCode}` + (locale ? `&locale=${locale}` : ""));
let data;
if (resp.readyState === 4 && resp.status === 200) {
data = JSON.parse(resp.responseText);
data = data ? data[0] : {};
data = data ? data : {};
} else if (resp.readyState === 4 && resp.status === 404) return {};
else throw new Error(`无法通过API2获取${rjCode}的信息:${resp.status} ${resp.statusText}`);
return parseApi2Data(rjCode, data);
}
async function getApiPromise(rjCode, locale = void 0) {
let resp = await getHttpAsync(`https://www.dlsite.com/maniax/product/info/ajax?product_id=${rjCode}&cdn_cache_min=1` + (locale ? `&locale=${locale}` : ""));
let data;
if (resp.readyState === 4 && resp.status === 200) {
data = JSON.parse(resp.responseText);
data = data ? data[rjCode] : {};
data = data ? data : {};
} else if (resp.readyState === 4 && resp.status === 404) return {};
else throw new Error(`无法通过API获取${rjCode}的信息:${resp.status} ${resp.statusText}`);
const translation_info = data.translation_info ? data.translation_info : {};
data.lang = getLangCode(translation_info.lang);
return parseApiData(rjCode, data);
}
async function getCirclePromise(rjCode, apiPromise) {
let apiData = await apiPromise;
if (!apiData.maker_id) return null;
const maker_id = apiData.maker_id;
let url;
let resp;
let data;
try {
url = `https://media.ci-en.jp/dlsite/lookup/${maker_id}.json`;
resp = await getHttpAsync(url);
data = void 0;
if (resp.readyState === 4 && resp.status === 200) {
data = JSON.parse(resp.responseText);
data = data ? data[0] : {};
data = data ? data : {};
data.maker_id = maker_id;
}
} catch (e) {}
if (!data || !data.name) {
url = `https://www.dlsite.com/maniax/circle/profile/=/maker_id/${maker_id}.html`;
resp = await getHttpAsync(url);
data = data ? data : {};
if (resp.readyState === 4 && resp.status === 200) {
let name = new DOMParser().parseFromString(Csp.createHTML(resp.responseText), "text/html").querySelector("strong.prof_maker_name");
name = name ? name.innerText : null;
data.name = name;
}
}
return data;
}
async function getTranslatablePromise(rjCode, site = "maniax") {
rjCode = rjCode.toUpperCase();
const result = {
translation_request_english: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_simplified_chinese: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_traditional_chinese: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_korean: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_spanish: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_german: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_french: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_indonesian: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_italian: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_portuguese: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_swedish: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_thai: {
agree: void 0,
request: void 0,
sale: void 0
},
translation_request_vietnamese: {
agree: void 0,
request: void 0,
sale: void 0
}
};
const data = await getTranslatableApiPromise(rjCode, site);
if (!data.translationStatusForTranslator) return result;
const map = {
translation_request_english: "ENG",
translation_request_simplified_chinese: "CHI_HANS",
translation_request_traditional_chinese: "CHI_HANT",
translation_request_korean: "KO_KR",
translation_request_spanish: "SPA",
translation_request_german: "GER",
translation_request_french: "FRE",
translation_request_indonesian: "IND",
translation_request_italian: "ITA",
translation_request_portuguese: "POR",
translation_request_swedish: "SWE",
translation_request_thai: "THA",
translation_request_vietnamese: "VIE"
};
for (let key in map) {
let lang = map[key];
let status = data.translationStatusForTranslator[lang];
if (!status) continue;
result[key].agree = status.available;
result[key].request = status.count;
result[key].sale = status.on_sale_count;
}
return result;
}
async function getTranslatableApiPromise(rjCode, site = "maniax") {
rjCode = rjCode.toUpperCase();
let resp = await getHttpAsync(`https://www.dlsite.com/${site}/api/=/translatableProducts.json?keyword=${rjCode}`, true);
let data;
if (resp.readyState === 4 && resp.status === 200) data = JSON.parse(resp.responseText);
else throw new Error(`无法通过API获取${rjCode}的翻译信息:${resp.status} ${resp.statusText}`);
if (data.meta && data.meta.code !== 200) throw new Error(`无法通过API查询${rjCode}的翻译信息:${data.meta.code} - ${data.meta.errorType} - ${data.meta.errorMessage}`);
if (!data.data || !Array.isArray(data.data.products)) throw new Error(`无法通过API查询${rjCode}的翻译信息:未预料到的响应格式。`);
for (const work of data.data.products) if (work.id === rjCode) return work;
return {};
}
function getWorkRequestPromise(rjCode) {
return {
_info: void 0,
_api: void 0,
_api2: void 0,
_circle: void 0,
_translatable: void 0,
_translated_title: void 0,
get info() {
return this._info ? this._info : this._info = getHtmlPromise(rjCode);
},
get api() {
return this._api ? this._api : this._api = getApiPromise(rjCode);
},
get api2() {
return this._api2 ? this._api2 : this._api2 = getApi2Promise(rjCode);
},
get circle() {
return this._circle ? this._circle : this._circle = getCirclePromise(rjCode, this.api);
},
get translatable() {
async function getter(t) {
let api = await t.api2;
if (!api.site_id) api = await t.api;
return t._translatable ? t._translatable : t._translatable = getTranslatablePromise(rjCode, api.site_id ? api.site_id : "maniax");
}
return getter(this);
},
get translated_title() {
async function getter(t) {
if (t._translated_title) return t._translated_title;
let api = await t.api2;
if (api.translation_info) {
if (!api.translation_info.is_original) api = await getApi2Promise(rjCode, api.lang);
t._translated_title = api.work_name;
return t._translated_title;
}
api = await t.api;
if (!api.translation_info) {
t._translated_title = null;
return null;
}
if (!api.translation_info.is_original) api = await getApiPromise(rjCode, api.lang);
t._translated_title = api.work_name;
return t._translated_title;
}
return getter(this);
}
};
}
var DataCache = class {
_data;
_timeAdd;
_timeUpdate;
_timeAccess;
_timeExpire = 0;
constructor(data, timeExp = 0) {
this._data = data;
this._timeAdd = Date.now();
this._timeUpdate = void 0;
this._timeAccess = void 0;
this._timeExpire = timeExp;
}
get data() {
this._timeAccess = Date.now();
return this._data;
}
get timeAdd() {
return this._timeAdd;
}
get timeUpdate() {
return this._timeUpdate;
}
get timeAccess() {
return this._timeAccess;
}
get timeExpire() {
return this._timeExpire;
}
get hasExpired() {
return this._timeExpire > 0 && this._timeExpire < Date.now();
}
set timeExpire(value) {
if (typeof value !== "number" || value < 0) return;
this._timeExpire = value;
}
update(data, expTime = -1) {
this._data = data;
this._timeUpdate = Date.now();
this.timeExpire = expTime;
}
};
var DataCacheStorage = class DataCacheStorage {
static #activeStorages = {};
_name;
_maxSize;
_autoSave;
_dropExpired;
_dataMap;
get #head() {
return this._dataMap["-head"];
}
get #tail() {
return this._dataMap["-tail"];
}
get name() {
return this._name;
}
get maxSize() {
return this._maxSize;
}
get autoSave() {
return this._autoSave;
}
get dropExpired() {
return this._dropExpired;
}
set name(value) {
if (typeof value !== "string") throw new Error("Invalid Storage Name");
this._name = value;
}
set maxSize(value) {
if (typeof value !== "number" || value <= 0) return;
this._maxSize = value;
}
set autoSave(value) {
if (typeof value !== "boolean") return;
this._autoSave = value;
}
set dropExpired(value) {
if (typeof value !== "boolean") return;
this._dropExpired = value;
}
constructor(name, maxSize = 128, dropExpired = false, autoSave = true) {
this.name = name;
this._dataMap = {
"-head": {
next: "-tail",
prev: null
},
"-tail": {
next: null,
prev: "-head"
}
};
this.maxSize = maxSize;
this.dropExpired = dropExpired;
this.autoSave = autoSave;
}
static fromObject(obj, name) {
if (!obj._name) return new DataCacheStorage(name);
let storage = Object.assign(new DataCacheStorage(name), obj);
for (const keyX in storage._dataMap) {
let node = storage._dataMap[keyX];
let cache = node.cache;
if (cache) {
cache = Object.assign(new DataCache(null, -1), cache);
node.cache = cache;
}
}
return storage;
}
static open(storageName, maxSize = void 0, dropExpired = void 0, autoSave = void 0, replaceProp = false) {
if (!(storageName in this.#activeStorages)) this.#activeStorages[storageName] = DataCacheStorage.fromObject(GM_getValue(`cache_${storageName}`, new DataCacheStorage(storageName, maxSize, dropExpired, autoSave)), storageName);
let storage = this.#activeStorages[storageName];
if (replaceProp) {
storage.maxSize = maxSize;
storage.dropExpired = dropExpired;
storage.autoSave = autoSave;
}
if (storage.dropExpired) storage.dropExpiredCache();
return this.#activeStorages[storageName];
}
static dropStorage(storageName) {
if (storageName in this.#activeStorages) delete this.#activeStorages[storageName];
GM_deleteValue(`cache_${storageName}`);
}
save() {
GM_setValue(`cache_${this.name}`, this);
}
#disconnectNode(node) {
if (node.next) this._dataMap[node.next].prev = node.prev;
if (node.prev) this._dataMap[node.prev].next = node.next;
node.next = null;
node.prev = null;
}
#moveNodeNextTo(key, node, prevKey) {
let keyX = "_" + key;
let prevKeyX = prevKey ? "_" + prevKey : "-head";
this.#disconnectNode(node);
node.prev = prevKeyX;
node.next = this._dataMap[prevKeyX].next;
this._dataMap[prevKeyX].next = keyX;
this._dataMap[node.next].prev = keyX;
}
#moveNodeBefore(key, node, nextKey) {
let keyX = "_" + key;
let nextKeyX = nextKey ? "_" + nextKey : "-tail";
this.#disconnectNode(node);
node.next = nextKeyX;
node.prev = this._dataMap[nextKeyX].prev;
this._dataMap[nextKeyX].prev = keyX;
this._dataMap[node.prev].next = keyX;
}
#sizeLimitCheck() {
let overflow = Object.keys(this._dataMap).length - 2 - this.maxSize;
for (let i = 0; i < overflow; i++) {
if (this.#head.next === "-tail") break;
this.drop(this.#head.next);
}
}
#isExpired(key) {
let keyX = "_" + key;
if (!(keyX in this._dataMap)) return true;
let expired = this._dataMap[keyX].cache.hasExpired;
if (expired && this.dropExpired) this.drop(key);
return expired;
}
commit(key, data, expTime = -1) {
let keyX = "_" + key;
let node = this._dataMap[keyX];
if (node) node.cache.update(data, expTime);
else {
node = {
cache: new DataCache(data, expTime),
next: null,
prev: null
};
this._dataMap[keyX] = node;
this.#sizeLimitCheck();
}
this.#moveNodeBefore(key, node, null);
if (this.autoSave) this.save();
}
drop(key) {
let keyX = "_" + key;
if (!(keyX in this._dataMap)) return;
this.#disconnectNode(this._dataMap[keyX]);
delete this._dataMap[keyX];
if (this.autoSave) this.save();
}
dropExpiredCache() {
for (let keyX in this._dataMap) {
if (keyX.startsWith("-")) continue;
if (!this._dataMap[keyX].cache.hasExpired) continue;
this.drop(keyX.substring(1));
}
}
get(key) {
let keyX = "_" + key;
let value;
if (keyX in this._dataMap && !this.#isExpired(key)) {
this.#moveNodeBefore(key, this._dataMap[keyX], null);
value = this._dataMap[keyX].cache.data;
}
if (this.autoSave) this.save();
return value;
}
getCache(key, keepExpired) {
let keyX = "_" + key;
let value;
if (keyX in this._dataMap && (keepExpired || !this.#isExpired(key))) {
this.#moveNodeBefore(key, this._dataMap[keyX], null);
value = this._dataMap[keyX].cache;
}
return value;
}
};
function mergeLinkage(l1, l2) {
let linkage = {};
for (const work of Object.values(l1)) {
if (!work.workno) continue;
linkage[work.workno] = work;
}
for (const work of Object.values(l2)) {
if (!work.workno) continue;
linkage[work.workno] = work;
}
return linkage;
}
function cacheLinkage(originalWorkno, linkage) {
function getExpireTime() {
const now = new Date();
const nowMs = now.getTime();
const utc9Ms = nowMs + now.getTimezoneOffset() * 6e4 + 9 * 3600 * 1e3;
const localeOffset = utc9Ms - nowMs;
const dayMs = 24 * 3600 * 1e3;
return utc9Ms - utc9Ms % dayMs + dayMs - localeOffset;
}
let linkCache = DataCacheStorage.open("work-linkages", 128, true, true, true);
let langs = settings._ss_cue_lang.join();
let data = linkCache.get(originalWorkno);
if (Array.isArray(data)) data = mergeLinkage(data, linkage);
else data = linkage;
linkCache.commit(`${originalWorkno}|${langs}`, data, getExpireTime());
}
function getLinkageFromCache(originalWorkno) {
const hashKey = `${originalWorkno}|${settings._ss_cue_lang.join()}`;
return DataCacheStorage.open("work-linkages", 128, true, true, true).get(hashKey);
}
async function getLinkedWorks(rjCode) {
try {
let trans = await WorkPromise.getTranslationInfo(rjCode);
let api = await (await WorkPromise.getWorkPromise(rjCode)).api2;
let result = {};
if (trans.is_original) {
result[rjCode] = {
workno: rjCode,
type: "original",
lang: "JPN"
};
let languageEditions = api.language_editions;
if (!Array.isArray(languageEditions)) languageEditions = Object.values(languageEditions);
for (let edition of languageEditions) result[edition.workno] = {
workno: edition.workno,
type: "parent",
lang: edition.lang
};
} else if (trans.is_parent) {
result[trans.original_workno] = {
workno: trans.original_workno,
type: "original",
lang: "JPN"
};
result[rjCode] = {
workno: rjCode,
type: "parent",
lang: trans.lang
};
for (let workno of trans.child_worknos) result[workno] = {
workno,
type: "child",
lang: trans.lang
};
} else if (trans.is_child) {
result[trans.original_workno] = {
workno: trans.original_workno,
type: "original",
lang: "JPN"
};
result[trans.parent_workno] = {
workno: trans.parent_workno,
type: "parent",
lang: trans.lang
};
result[rjCode] = {
workno: rjCode,
type: "child",
lang: trans.lang
};
}
return result;
} catch (e) {
console.error(e);
return {};
}
}
async function getLinkedWorksFull(rjCode, useCache = true, saveCache = true) {
let trans = await WorkPromise.getTranslationInfo(rjCode);
if (trans.is_original === void 0 || trans.is_original === null) return {};
if (!trans.is_original) {
let result = await getLinkedWorksFull(trans.original_workno, useCache, saveCache);
result = mergeLinkage(result, await getLinkedWorks(rjCode));
return result;
}
let cache = getLinkageFromCache(rjCode);
if (cache) return cache;
let api = await (await WorkPromise.getWorkPromise(rjCode)).api2;
let result = {};
result[rjCode] = {
workno: rjCode,
type: "original",
lang: "JPN"
};
let languageEditions = api.language_editions;
if (!Array.isArray(languageEditions)) languageEditions = Object.values(languageEditions);
for (let edition of languageEditions) {
if (!settings._ss_cue_lang.includes(edition.lang)) continue;
result = mergeLinkage(result, await getLinkedWorks(edition.workno));
}
if (saveCache) cacheLinkage(rjCode, result);
return result;
}
async function getKikoeruSearchResult(rjCode, searchProfile, linkages) {
let url = searchProfile.searchUrlTemplate?.replaceAll("%s", rjCode);
try {
let resp = await getHttpAsync(url, false, 180, searchProfile.customHeaders);
if (!(resp.readyState === 4 && resp.status === 200)) return;
let data = JSON.parse(resp.responseText);
if (!Array.isArray(data.works)) throw new Error("Invalid Response.");
else if (data.works.length <= 0) return [];
let result = [];
for (const work of data.works) {
let link = linkages[work.id > 999999 ? `RJ0${work.id}` : `RJ${work.id}`];
if (!link) continue;
result.push(new SearchWorkInfo(link.workno, link.type, link.lang));
}
return result;
} catch (e) {
console.error(e);
return null;
}
}
var WorkPromise = {
checkNotNull: function(obj) {
if (obj === null || obj === void 0) throw new Error();
return obj;
},
getWorkPromise: function(rjCode) {
if (work_promise[rjCode]) return work_promise[rjCode];
work_promise[rjCode] = getWorkRequestPromise(rjCode);
return work_promise[rjCode];
},
getFound: async function(rjCode) {
try {
const data = await WorkPromise.getWorkPromise(rjCode).api2;
if (data && data.product_id !== void 0) return true;
const api = await WorkPromise.getWorkPromise(rjCode).api;
return api && api.is_sale !== void 0;
} catch (e) {
delete work_promise[rjCode];
return true;
}
},
getTranslationInfo: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
let data = await p.api2;
if (data.translation_info) return data.translation_info;
data = await p.api;
return data.translation_info ? data.translation_info : {};
},
getParentRJ: async function(rjCode) {
try {
const p = WorkPromise.getWorkPromise(rjCode);
let trans = await WorkPromise.getTranslationInfo(rjCode);
if (trans.is_original || trans.is_parent) return rjCode;
if (trans.parent_workno) return trans.parent_workno;
return (await p.info).parentWork;
} catch (e) {
return null;
}
},
getGirls: async function(rjCode) {
let data = await WorkPromise.getWorkPromise(rjCode).api2;
if (data.sex_category && data.sex_category === 2) return true;
if (data.site_id === "girls") return true;
data = await WorkPromise.getWorkPromise(rjCode).api;
WorkPromise.checkNotNull(data.is_girls);
return data.is_girls;
},
getAnnounce: async function(rjCode) {
return (await WorkPromise.getWorkPromise(rjCode).info).is_announce;
},
getSale: async function(rjCode, checkAnnounce = true) {
let data = await WorkPromise.getWorkPromise(rjCode).api;
if (!checkAnnounce) return data.is_sale;
return data.is_sale || await WorkPromise.getAnnounce(rjCode);
},
getDLCount: async function(rjCode) {
let data = await WorkPromise.getWorkPromise(rjCode).api;
WorkPromise.checkNotNull(data.dl_count);
return data.dl_count;
},
getRateAvg: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
let data = await p.api;
if (data.rate_average_2dp) return data.rate_average_2dp;
data = await p.api2;
this.checkNotNull(data.rate_count_detail);
let sum = 0;
let count = 0;
for (const key in data.rate_count_detail) {
let rate = parseInt(key);
let cot = parseInt(data.rate_count_detail[key]);
count += cot;
sum += rate * cot;
}
return sum / count;
},
getRateCount: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
let data = await p.api;
if (data.rate_count) return data.rate_count;
data = await p.api2;
this.checkNotNull(data.rate_count_detail);
let count = 0;
for (const key in data.rate_count_detail) count += parseInt(data.rate_count_detail[key]);
return count;
},
getWishlistCount: async function(rjCode) {
let data = await WorkPromise.getWorkPromise(rjCode).api;
this.checkNotNull(data.wishlist_count);
return data.wishlist_count;
},
getPriceText: async function(rjCode) {
WorkPromise.getWorkPromise(rjCode);
},
getBonus: async function(rjCode) {
let data = await WorkPromise.getWorkPromise(rjCode).api;
return !data.is_sale && data.is_free && data.is_oly && data.wishlist_count === 0;
},
getHasBonus: async function(rjCode) {
let data = await WorkPromise.getWorkPromise(rjCode).api;
return data.bonuses && data.bonuses.length > 0;
},
getTranslatable: async function(rjCode) {
return (await WorkPromise.getTranslationInfo(rjCode)).is_translation_agree === true;
},
getTranslated: async function(rjCode) {
const trans = await WorkPromise.getTranslationInfo(rjCode);
return trans.is_parent === true || trans.is_child === true;
},
getLanguages: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
let api = await p.api2;
api = api.options ? api : await p.api;
const options = api.options?.split("#");
const result = [];
for (const key in LANG_MAP) {
const lang = LANG_MAP[key];
if (options?.includes(key)) result.push(lang);
}
return result;
},
getFileFormats: async function(rjCode) {
const result = [];
const p = WorkPromise.getWorkPromise(rjCode);
let api = await p.api2;
if (api.file_type === "EXE") result.push("EXE");
else if (api.file_type_string) result.push(api.file_type_string);
if (api.file_type_special) result.push(api.file_type_special);
if (!api.options) api = await p.api;
if (api.options && api.options.includes("WPD")) result.push("PDF");
if (api.options && api.options.includes("WAP")) result.push("APK");
return result;
},
getAIUsedText: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
let api = await p.api2;
api = api.options ? api : await p.api;
const options = api.options ? api.options : "";
if (options.includes("AIG")) return localizePopup(localizationMap.tag_aig);
else if (options.includes("AIP")) return localizePopup(localizationMap.tag_aip);
return null;
},
getDebug: async function(rjCode) {
return "";
},
getWorkCategory: async function(rjCode) {
switch (await WorkPromise.getWorkType(rjCode)) {
case 0: return "voice";
case 1: return "game";
case 2:
case 3:
case 8: return "manga";
case 5: return "video";
case 4: return "novel";
default: return "other";
}
},
getWorkTypeText: async function(rjCode) {
return [
localizePopup(localizationMap.work_type_voice),
localizePopup(localizationMap.work_type_game),
localizePopup(localizationMap.work_type_comic),
localizePopup(localizationMap.work_type_illustration),
localizePopup(localizationMap.work_type_novel),
localizePopup(localizationMap.work_type_video),
localizePopup(localizationMap.work_type_music),
localizePopup(localizationMap.work_type_tool),
localizePopup(localizationMap.work_type_voice_comic),
localizePopup(localizationMap.work_type_other)
][await WorkPromise.getWorkType(rjCode)];
},
getWorkType: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
let workType = (await p.api2).work_type;
if (!workType) workType = (await p.api).work_type;
switch (workType) {
case "SOU": return 0;
case [
"ACN",
"QIZ",
"ADV",
"RPG",
"TBL",
"DNV",
"SLN",
"TYP",
"STG",
"PZL",
"ETC"
].includes(workType) ? workType : "ERR": return 1;
case [
"MNG",
"SCM",
"WBT"
].includes(workType) ? workType : "ERR": return 2;
case "ICG": return 3;
case ["NRE", "KSV"].includes(workType) ? workType : "ERR": return 4;
case "MOV": return 5;
case "MUS": return 6;
case [
"TOL",
"IMT",
"AMT"
].includes(workType) ? workType : "ERR": return 7;
case "VCM": return 8;
case "ET3": return 9;
default: throw new Error("无法获取作品类型/未知作品类型:" + workType);
}
},
getImgLink: async function(rjCode) {
let link = void 0;
const p = WorkPromise.getWorkPromise(rjCode);
try {
let data = await p.api2;
if (data.image_main && data.image_main.url) link = "https:" + data.image_main.url;
} catch (e) {}
if (link && !link.includes("no_img_main.gif")) return link;
try {
const info = await p.info;
WorkPromise.checkNotNull(info.img);
return info.img;
} catch (e) {}
try {
const apiData = await WorkPromise.getWorkPromise(rjCode).api;
if (apiData.work_image) return "https:" + apiData.work_image;
} catch (e) {}
throw new Error("无法获取图片链接");
},
getWorkTitle: async function(rjCode) {
return await WorkPromise.getWorkPromise(rjCode).translated_title;
},
getAgeRating: async function(rjCode) {
let p = WorkPromise.getWorkPromise(rjCode);
let api = await p.api2;
if (!api.age_category) api = await p.api;
switch (api.age_category) {
case 1: return "All";
case 2: return "R15";
case 3: return "R18";
}
const info = await p.info;
WorkPromise.checkNotNull(info.rating);
return info.rating;
},
getCircle: async function(rjCode, findOriginal = true) {
let trans = await WorkPromise.getTranslationInfo(rjCode);
if (!trans.is_original && findOriginal) rjCode = trans.original_workno ? trans.original_workno : rjCode;
let work = WorkPromise.getWorkPromise(rjCode);
let api2 = await work.api2;
if (api2.maker_name) return api2.maker_name;
const circleInfo = await work.circle;
if (circleInfo && circleInfo.name) return circleInfo.name;
let info = await work.info;
if (info.circle) return info.circle.trim();
throw new Error("无法获取社团信息");
},
getTranslatorName: async function(rjCode) {
if (!(await WorkPromise.getTranslationInfo(rjCode)).is_child) throw new Error("非翻译作品RJ号");
return await WorkPromise.getCircle(rjCode, false);
},
getReleaseDate: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
const info = await p.info;
if (info && !info.is_announce && info.date) return [info.date.trim(), false];
if (info && info.is_announce && info.dateAnnounce) return [info.dateAnnounce.trim(), true];
let api = await p.api2;
api = api.regist_date ? api : await p.api;
WorkPromise.checkNotNull(api.regist_date);
return [api.regist_date, api.is_announce];
},
getReleaseCountDownElement: async function(rjCode) {
const info = await WorkPromise.getWorkPromise(rjCode).info;
if (info && info.is_announce && info.dateAnnounce) return DateParser.getCountDownDateElement(DateParser.parseDateStr(info.dateAnnounce, info.lang));
return null;
},
getUpdateDate: async function(rjCode) {
const info = await WorkPromise.getWorkPromise(rjCode).info;
if (info["update"]) return info["update"].trim();
throw new Error();
},
getCV: async function(rjCode) {
const api2 = await WorkPromise.getWorkPromise(rjCode).api2;
if (api2.creaters && api2.creaters.voice_by && api2.creaters.voice_by.length > 0) return api2.creaters.voice_by.map((v) => v.name);
const info = await WorkPromise.getWorkPromise(rjCode).info;
WorkPromise.checkNotNull(info.cv);
return info.cv;
},
getMusic: async function(rjCode) {
const api2 = await WorkPromise.getWorkPromise(rjCode).api2;
if (api2.creaters && api2.creaters.music_by && api2.creaters.music_by.length > 0) return api2.creaters.music_by.map((v) => v.name);
const info = await WorkPromise.getWorkPromise(rjCode).info;
WorkPromise.checkNotNull(info.music);
return info.music;
},
getTags: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
const api2 = await p.api2;
if (api2.genres && api2.genres.length > 0) return api2.genres.map((genre) => genre.name);
const info = await p.info;
WorkPromise.checkNotNull(info.tags);
return info.tags;
},
getFileSizeStr: function(byteCount = 0) {
const units = [
"B",
"KB",
"MB",
"GB",
"TB"
];
let unit = "B";
for (let i = 1; byteCount >= 1024; i++) {
byteCount /= 1024;
unit = units[i];
}
return `${Math.round(byteCount * 100) / 100}${unit}`;
},
getFileSize: async function(rjCode) {
const trans = await WorkPromise.getTranslationInfo(rjCode);
if (trans.is_parent) rjCode = trans.original_workno ? trans.original_workno : rjCode;
const p = WorkPromise.getWorkPromise(rjCode);
let api2 = await p.api2;
if (api2.contents_file_size && api2.contents_file_size > 0) return WorkPromise.getFileSizeStr(api2.contents_file_size);
let info = trans.is_child && trans.original_workno ? await WorkPromise.getWorkPromise(trans.original_workno).info : await p.info;
if (info.filesize) return info.filesize;
throw new Error("无法获取文件大小信息");
},
checkAsmrOne: async function(rjCode) {
const p = WorkPromise.getWorkPromise(rjCode);
if (p._asmrone !== void 0) return p._asmrone;
p._asmrone = new Promise((resolve) => {
const apiUrl = `https://api.asmr-200.com/api/work/${rjCode.toUpperCase().replace("RJ", "")}`;
GM_xmlhttpRequest({
method: "GET",
url: apiUrl,
headers: { "Referer": "https://www.asmr.one/" },
onload: function(response) {
if (response.status === 200) resolve(`https://www.asmr.one/work/${rjCode.toUpperCase()}`);
else resolve(null);
},
onerror: function() {
resolve(null);
}
});
});
return p._asmrone;
},
mergeLinkage,
cacheLinkage,
getLinkageFromCache,
getLinkedWorks,
getLinkedWorksFull,
getKikoeruSearchResult
};
var _hoisted_1$2 = { class: "rj-warp-gate-img-container" };
var _hoisted_2$2 = ["src"];
var _hoisted_3$2 = {
key: 1,
class: "rj-warp-gate-img-placeholder"
};
var CoverImage_vue_vue_type_script_setup_true_lang_default = defineComponent({
__name: "CoverImage",
props: { src: {} },
setup(__props) {
const isHovered = ref(false);
return (_ctx, _cache) => {
return openBlock(), createElementBlock("div", _hoisted_1$2, [__props.src ? (openBlock(), createElementBlock("img", {
key: 0,
src: __props.src,
onMouseenter: _cache[0] || (_cache[0] = ($event) => isHovered.value = true),
onMouseleave: _cache[1] || (_cache[1] = ($event) => isHovered.value = false),
class: normalizeClass({ "is-hovered": isHovered.value })
}, null, 42, _hoisted_2$2)) : (openBlock(), createElementBlock("div", _hoisted_3$2, [..._cache[2] || (_cache[2] = [createBaseVNode("div", { class: "rj-warp-gate-img-skeleton" }, null, -1)])]))]);
};
}
});
var _plugin_vue_export_helper_default = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) target[key] = val;
return target;
};
var CoverImage_default = _plugin_vue_export_helper_default(CoverImage_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-fbfcd6f7"]]);
var _hoisted_1$1 = ["href", "target"];
var _hoisted_2$1 = {
key: 0,
class: "site-logo dlsite-logo",
viewBox: "0 0 118.45 33.65",
xmlns: "http://www.w3.org/2000/svg"
};
var _hoisted_3$1 = {
key: 1,
class: "site-logo asmrone-logo",
viewBox: "0 0 145 34",
xmlns: "http://www.w3.org/2000/svg"
};
var _hoisted_4$1 = { class: "icon-wrapper" };
var _hoisted_5$1 = {
key: 0,
class: "action-icon",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
"stroke-width": "2.5",
"stroke-linecap": "round",
"stroke-linejoin": "round"
};
var _hoisted_6$1 = {
key: 1,
class: "action-icon disabled-icon",
viewBox: "0 0 24 24",
fill: "none",
stroke: "currentColor",
"stroke-width": "2.5",
"stroke-linecap": "round",
"stroke-linejoin": "round"
};
var LinkButton_default = _plugin_vue_export_helper_default(defineComponent({
__name: "LinkButton",
props: {
href: {},
theme: {},
disabled: { type: Boolean }
},
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createElementBlock("a", {
class: normalizeClass(["rj-warp-gate-link-btn", [`theme-${__props.theme}`, { "is-disabled": __props.disabled }]]),
href: __props.disabled ? void 0 : __props.href,
target: __props.disabled ? void 0 : "_blank",
rel: "noreferrer"
}, [__props.theme === "dlsite" ? (openBlock(), createElementBlock("svg", _hoisted_2$1, [..._cache[0] || (_cache[0] = [createBaseVNode("g", { transform: "translate(-98.55,-10.36)" }, [createBaseVNode("path", {
d: "m 169.31,18.34 a 3.6,3.6 0 0 0 3.56,-3.82 3.74,3.74 0 0 0 -6.34,-2.73 3.82,3.82 0 0 0 -1.07,2.75 3.94,3.94 0 0 0 1.12,2.78 3.81,3.81 0 0 0 2.73,1.02 z",
class: "logo-dot"
}), createBaseVNode("path", {
d: "M 104.93,10.36 H 98.55 V 44 h 7.68 a 15.43,15.43 0 0 0 10.93,-4.59 17.58,17.58 0 0 0 5.06,-12.34 c -0.04,-9.2 -7.81,-16.71 -17.29,-16.71 z m 7.76,23.49 a 11,11 0 0 1 -7,3 h -0.23 v -19.4 c 1.75,0.23 9.58,1.75 9.74,9.55 a 9.17,9.17 0 0 1 -2.51,6.85 z M 131.76,10.39 H 125 V 44 h 17.48 V 36.82 H 131.76 Z M 153,22.3 c -1.4,2.06 -1.59,3.79 -1.86,6.18 v 0.14 c -0.06,0.59 -0.08,1.17 -0.1,1.74 -0.06,1.91 -0.11,3.55 -1.38,5 -1,1.2 -2,1.18 -3.48,1.51 l -0.4,0.08 V 44 h 0.5 A 10.08,10.08 0 0 0 155,39.75 c 2.16,-2.73 2.34,-4.7 2.49,-8.53 v -1.14 c 0,-1.58 0,-2.7 1,-3.9 a 4.88,4.88 0 0 1 3.11,-2 l 0.39,-0.09 v -6.76 h -0.54 A 10.14,10.14 0 0 0 153,22.3 Z m 35.82,15.37 h -1.46 A 3.48,3.48 0 0 1 184.73,36.52 3.41,3.41 0 0 1 183.61,34 V 23.71 h 3.72 V 17 h -3.76 v -6.53 h -6.4 v 23.7 a 9.67,9.67 0 0 0 3.33,7.28 12.67,12.67 0 0 0 7,2.55 c 0.27,0 1.31,-0.1 1.31,-0.1 z M 166,18.94 V 44 h 6.55 V 18.94 Z m 42.5,16.54 a 6.71,6.71 0 0 1 -5.07,2.13 6.92,6.92 0 0 1 -7.09,-6.3 v -0.73 a 7.11,7.11 0 0 1 7,-6.9 6.85,6.85 0 0 1 6.74,4.49 L 198,28.1 v 5.33 h 18.79 l 0.06,-0.44 a 16.46,16.46 0 0 0 0.15,-1.86 14,14 0 0 0 -4.27,-9.9 13.29,13.29 0 0 0 -9.55,-3.94 13.36,13.36 0 0 0 0.28,26.71 12,12 0 0 0 9.46,-4 l 0.34,-0.35 -4.39,-4.58 z",
class: "logo-text"
})], -1)])])) : __props.theme === "asmrone" ? (openBlock(), createElementBlock("svg", _hoisted_3$1, [..._cache[1] || (_cache[1] = [
createBaseVNode("text", {
x: "0",
y: "26",
"font-family": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
"font-weight": "900",
"font-size": "28",
class: "logo-text",
"letter-spacing": "-1"
}, "ASMR", -1),
createBaseVNode("circle", {
cx: "74",
cy: "22",
r: "3.5",
class: "logo-dot"
}, null, -1),
createBaseVNode("text", {
x: "81",
y: "26",
"font-family": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
"font-weight": "900",
"font-size": "28",
class: "logo-text",
"letter-spacing": "-1"
}, "one", -1)
])])) : createCommentVNode("", true), createBaseVNode("div", _hoisted_4$1, [!__props.disabled ? (openBlock(), createElementBlock("svg", _hoisted_5$1, [..._cache[2] || (_cache[2] = [
createBaseVNode("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }, null, -1),
createBaseVNode("polyline", { points: "15 3 21 3 21 9" }, null, -1),
createBaseVNode("line", {
x1: "10",
y1: "14",
x2: "21",
y2: "3"
}, null, -1)
])])) : (openBlock(), createElementBlock("svg", _hoisted_6$1, [..._cache[3] || (_cache[3] = [
createBaseVNode("circle", {
cx: "12",
cy: "12",
r: "10"
}, null, -1),
createBaseVNode("line", {
x1: "15",
y1: "9",
x2: "9",
y2: "15"
}, null, -1),
createBaseVNode("line", {
x1: "9",
y1: "9",
x2: "15",
y2: "15"
}, null, -1)
])]))])], 10, _hoisted_1$1);
};
}
}), [["__scopeId", "data-v-6425d715"]]);
var CapsuleTag_default = _plugin_vue_export_helper_default(defineComponent({
__name: "CapsuleTag",
props: {
text: {},
theme: {}
},
setup(__props) {
return (_ctx, _cache) => {
return openBlock(), createElementBlock("span", { class: normalizeClass(["rj-warp-gate-capsule", `theme-${__props.theme || "default"}`]) }, toDisplayString(__props.text), 3);
};
}
}), [["__scopeId", "data-v-69e83641"]]);
var _hoisted_1 = {
key: 0,
class: "popup-skeleton"
};
var _hoisted_2 = {
key: 1,
class: "popup-not-found"
};
var _hoisted_3 = { class: "error-sub" };
var _hoisted_4 = {
key: 2,
class: "popup-content"
};
var _hoisted_5 = { class: "popup-header" };
var _hoisted_6 = { class: "header-main" };
var _hoisted_7 = ["title"];
var _hoisted_8 = ["title"];
var _hoisted_9 = { class: "panel-container" };
var _hoisted_10 = { class: "panel-left" };
var _hoisted_11 = { class: "dlsite-cover-container" };
var _hoisted_12 = { class: "buttons-container" };
var _hoisted_13 = { class: "panel-right" };
var _hoisted_14 = {
key: 0,
class: "tags-section"
};
var _hoisted_15 = { class: "tags-flow circle-name-text" };
var _hoisted_16 = {
key: 1,
class: "tags-section"
};
var _hoisted_17 = { class: "tags-flow" };
var _hoisted_18 = {
key: 2,
class: "tags-section"
};
var _hoisted_19 = { class: "tags-flow" };
var _hoisted_20 = {
key: 3,
class: "tags-section"
};
var _hoisted_21 = { class: "tags-flow" };
var Popup_default = _plugin_vue_export_helper_default(defineComponent({
__name: "Popup",
props: { state: {} },
setup(__props) {
const props = __props;
const popupRef = ref(null);
const innerWrapperRef = ref(null);
const dynamicHeight = ref(null);
let resizeObserver = null;
const workFound = ref(true);
const loading = ref(true);
const title = ref("");
const imgLink = ref("");
const sales = ref("");
const ratingAvg = ref(0);
const ratingCount = ref(0);
const circle = ref("");
const releaseDate = ref("");
const cv = ref([]);
const ageRating = ref("");
const workType = ref("");
const workTypeId = ref(-1);
const fileSize = ref("");
const genreTags = ref([]);
const isGirls = ref(false);
const asmrOneUrl = ref(null);
const titleHint = computed(() => localizePopup(localizationMap.click_to_copy_title));
const copyHint = computed(() => localizePopup(localizationMap.click_to_copy));
const positionStyle = computed(() => {
const width = 650;
let left = props.state.x + 15;
let top = props.state.y + 15;
if (typeof window !== "undefined") {
if (left + width > window.innerWidth) {
left = props.state.x - width - 15;
if (left < 0) left = 10;
}
const estimatedMaxHeight = 550;
if (top + estimatedMaxHeight > window.innerHeight) {
top = props.state.y - estimatedMaxHeight - 15;
if (top < 0) top = 10;
}
}
return {
left: `${left}px`,
top: `${top}px`
};
});
const closePopup = () => {
props.state.display = false;
};
const onCopyTitle = (e) => {
if (title.value && typeof GM_setClipboard !== "undefined") {
GM_setClipboard(title.value, "text");
const target = e.target;
const oldColor = target.style.color;
target.style.color = "#4ade80";
setTimeout(() => {
target.style.color = oldColor;
}, 500);
}
};
const onCopyRjCode = (e) => {
if (props.state.rjCode && typeof GM_setClipboard !== "undefined") {
GM_setClipboard(props.state.rjCode.toUpperCase(), "text");
const target = e.target;
const oldColor = target.style.color;
target.style.color = "#4ade80";
setTimeout(() => {
target.style.color = oldColor;
}, 500);
}
};
const updatePopupData = async () => {
if (!props.state.display || !props.state.rjCode) return;
const rjCode = props.state.rjCode;
loading.value = true;
workFound.value = false;
title.value = "";
imgLink.value = "";
sales.value = "";
ratingAvg.value = 0;
ratingCount.value = 0;
circle.value = "";
releaseDate.value = "";
cv.value = [];
ageRating.value = "";
workType.value = "";
workTypeId.value = -1;
fileSize.value = "";
genreTags.value = [];
try {
let found = await WorkPromise.getFound(rjCode);
workFound.value = found;
if (!found) {
loading.value = false;
return;
}
} catch (e) {
console.error(e);
}
Promise.allSettled([
WorkPromise.getWorkTitle(rjCode).then((t) => {
if (rjCode === props.state.rjCode) title.value = t;
}),
WorkPromise.getImgLink(rjCode).then((link) => {
if (rjCode === props.state.rjCode && typeof link === "string") imgLink.value = link;
}),
WorkPromise.getGirls(rjCode).then((g) => {
if (rjCode === props.state.rjCode) isGirls.value = !!g;
}),
WorkPromise.checkAsmrOne(rjCode).then((url) => {
if (rjCode === props.state.rjCode) asmrOneUrl.value = url;
}),
WorkPromise.getWorkType(rjCode).then((v) => {
if (rjCode === props.state.rjCode) workTypeId.value = v;
}),
WorkPromise.getWorkTypeText(rjCode).then((v) => {
if (rjCode === props.state.rjCode) workType.value = v;
}),
WorkPromise.getRateAvg(rjCode).then((v) => {
if (rjCode === props.state.rjCode) ratingAvg.value = v;
}),
WorkPromise.getRateCount(rjCode).then((v) => {
if (rjCode === props.state.rjCode) ratingCount.value = v;
}),
WorkPromise.getDLCount(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v) sales.value = String(v);
}),
WorkPromise.getCircle(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v) circle.value = v;
}),
WorkPromise.getReleaseDate(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v && v[0]) releaseDate.value = v[0];
}),
WorkPromise.getCV(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v) cv.value = v;
}),
WorkPromise.getAgeRating(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v) ageRating.value = v;
}),
WorkPromise.getFileSize(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v) fileSize.value = v;
}),
WorkPromise.getTags(rjCode).then((v) => {
if (rjCode === props.state.rjCode && v) genreTags.value = v;
})
]).finally(() => {
if (rjCode === props.state.rjCode) loading.value = false;
});
};
watch(() => props.state.rjCode, (newVal) => {
if (newVal) updatePopupData();
});
watch(() => props.state.display, (newVal) => {
if (newVal) {
updatePopupData();
nextTick(() => {
if (innerWrapperRef.value) {
if (!resizeObserver) resizeObserver = new ResizeObserver((entries) => {
window.requestAnimationFrame(() => {
for (const entry of entries) dynamicHeight.value = entry.target.offsetHeight + 32;
});
});
resizeObserver.observe(innerWrapperRef.value);
}
});
} else {
if (resizeObserver) {
resizeObserver.disconnect();
resizeObserver = null;
}
dynamicHeight.value = null;
}
});
return (_ctx, _cache) => {
return openBlock(), createBlock(Transition, { name: "fade" }, {
default: withCtx(() => [__props.state.display ? (openBlock(), createElementBlock("div", {
key: 0,
ref_key: "popupRef",
ref: popupRef,
class: normalizeClass(["rj-warp-gate-popup", [isGirls.value ? "theme-girls" : "theme-maniax"]]),
style: normalizeStyle([positionStyle.value, dynamicHeight.value ? { height: dynamicHeight.value + "px" } : {}])
}, [createBaseVNode("div", {
class: "popup-close-btn",
onClick: closePopup
}, "✕"), createBaseVNode("div", {
class: "popup-inner-wrapper",
ref_key: "innerWrapperRef",
ref: innerWrapperRef
}, [loading.value ? (openBlock(), createElementBlock("div", _hoisted_1, [..._cache[0] || (_cache[0] = [createBaseVNode("div", { class: "skeleton-header" }, [
createBaseVNode("div", { class: "skeleton-eyebrow shimmer" }),
createBaseVNode("div", { class: "skeleton-title shimmer" }),
createBaseVNode("div", { class: "skeleton-title short shimmer" })
], -1), createBaseVNode("div", { class: "skeleton-panels" }, [createBaseVNode("div", { class: "skeleton-left" }, [
createBaseVNode("div", { class: "skeleton-cover shimmer" }),
createBaseVNode("div", { class: "skeleton-btn shimmer" }),
createBaseVNode("div", { class: "skeleton-btn shimmer" })
]), createBaseVNode("div", { class: "skeleton-right" }, [
createBaseVNode("div", { class: "skeleton-row" }, [createBaseVNode("div", { class: "skeleton-label shimmer" }), createBaseVNode("div", { class: "skeleton-text shimmer" })]),
createBaseVNode("div", { class: "skeleton-row" }, [createBaseVNode("div", { class: "skeleton-label shimmer" }), createBaseVNode("div", { class: "skeleton-tags" }, [
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "80px" }
}),
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "120px" }
}),
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "90px" }
}),
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "70px" }
})
])]),
createBaseVNode("div", { class: "skeleton-row" }, [createBaseVNode("div", { class: "skeleton-label shimmer" }), createBaseVNode("div", { class: "skeleton-tags" }, [createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "100px" }
}), createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "85px" }
})])]),
createBaseVNode("div", { class: "skeleton-row" }, [createBaseVNode("div", { class: "skeleton-label shimmer" }), createBaseVNode("div", { class: "skeleton-tags" }, [
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "75px" }
}),
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "110px" }
}),
createBaseVNode("div", {
class: "skeleton-tag shimmer",
style: { "width": "60px" }
})
])])
])], -1)])])) : !workFound.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
_cache[1] || (_cache[1] = createBaseVNode("div", { class: "error-icon" }, "?", -1)),
_cache[2] || (_cache[2] = createBaseVNode("div", null, "Work Not Found", -1)),
createBaseVNode("div", _hoisted_3, toDisplayString(__props.state.rjCode), 1)
])) : (openBlock(), createElementBlock("div", _hoisted_4, [createBaseVNode("div", _hoisted_5, [createBaseVNode("div", _hoisted_6, [createBaseVNode("div", {
class: "rj-eyebrow",
title: copyHint.value,
onClick: withModifiers(onCopyRjCode, ["stop"])
}, toDisplayString(__props.state.rjCode.toUpperCase()), 9, _hoisted_7), createBaseVNode("div", {
class: "work-title",
title: titleHint.value,
onClick: onCopyTitle
}, toDisplayString(title.value || "Loading..."), 9, _hoisted_8)])]), createBaseVNode("div", _hoisted_9, [createBaseVNode("div", _hoisted_10, [createBaseVNode("div", _hoisted_11, [createVNode(CoverImage_default, { src: imgLink.value }, null, 8, ["src"])]), createBaseVNode("div", _hoisted_12, [createVNode(LinkButton_default, {
href: "https://www.dlsite.com/maniax/work/=/product_id/" + __props.state.rjCode.toUpperCase() + ".html",
theme: "dlsite"
}, null, 8, ["href"]), createVNode(LinkButton_default, {
href: asmrOneUrl.value,
disabled: !asmrOneUrl.value,
theme: "asmrone"
}, null, 8, ["href", "disabled"])])]), createBaseVNode("div", _hoisted_13, [
circle.value ? (openBlock(), createElementBlock("div", _hoisted_14, [_cache[3] || (_cache[3] = createBaseVNode("div", { class: "section-title" }, "社团", -1)), createBaseVNode("div", _hoisted_15, toDisplayString(circle.value), 1)])) : createCommentVNode("", true),
sales.value || ratingAvg.value > 0 || releaseDate.value || ageRating.value || workType.value || fileSize.value ? (openBlock(), createElementBlock("div", _hoisted_16, [_cache[4] || (_cache[4] = createBaseVNode("div", { class: "section-title" }, "基础信息", -1)), createBaseVNode("div", _hoisted_17, [
sales.value ? (openBlock(), createBlock(CapsuleTag_default, {
key: 0,
theme: "sales",
text: `售出: ${sales.value}`
}, null, 8, ["text"])) : createCommentVNode("", true),
ratingAvg.value > 0 ? (openBlock(), createBlock(CapsuleTag_default, {
key: 1,
theme: "rating",
text: `评价: ${ratingAvg.value.toFixed(2)}★ (${ratingCount.value})`
}, null, 8, ["text"])) : createCommentVNode("", true),
releaseDate.value ? (openBlock(), createBlock(CapsuleTag_default, {
key: 2,
theme: "basic",
text: releaseDate.value
}, null, 8, ["text"])) : createCommentVNode("", true),
ageRating.value ? (openBlock(), createBlock(CapsuleTag_default, {
key: 3,
theme: ageRating.value.includes("18") ? "r18" : "basic",
text: ageRating.value
}, null, 8, ["theme", "text"])) : createCommentVNode("", true),
workType.value ? (openBlock(), createBlock(CapsuleTag_default, {
key: 4,
theme: workTypeId.value >= 0 ? `type-${workTypeId.value}` : "basic",
text: workType.value
}, null, 8, ["theme", "text"])) : createCommentVNode("", true),
fileSize.value ? (openBlock(), createBlock(CapsuleTag_default, {
key: 5,
theme: "basic",
text: fileSize.value
}, null, 8, ["text"])) : createCommentVNode("", true)
])])) : createCommentVNode("", true),
cv.value.length ? (openBlock(), createElementBlock("div", _hoisted_18, [_cache[5] || (_cache[5] = createBaseVNode("div", { class: "section-title" }, "声优", -1)), createBaseVNode("div", _hoisted_19, [(openBlock(true), createElementBlock(Fragment, null, renderList(cv.value, (actor) => {
return openBlock(), createBlock(CapsuleTag_default, {
key: actor,
theme: "cv",
text: actor
}, null, 8, ["text"]);
}), 128))])])) : createCommentVNode("", true),
genreTags.value.length ? (openBlock(), createElementBlock("div", _hoisted_20, [_cache[6] || (_cache[6] = createBaseVNode("div", { class: "section-title" }, "分类", -1)), createBaseVNode("div", _hoisted_21, [(openBlock(true), createElementBlock(Fragment, null, renderList(genreTags.value, (tag) => {
return openBlock(), createBlock(CapsuleTag_default, {
key: tag,
theme: "genre",
text: tag
}, null, 8, ["text"]);
}), 128))])])) : createCommentVNode("", true)
])])]))], 512)], 6)) : createCommentVNode("", true)]),
_: 1
});
};
}
}), [["__scopeId", "data-v-439ad9b8"]]);
var popupState = reactive({
display: false,
rjCode: "",
x: 0,
y: 0,
found: true,
loading: false
});
var popupApp = null;
var popupMountPoint = null;
var Popup = {
makePopup(display = false) {
if (!popupApp) {
const container = document.createElement("div");
container.id = `${VOICELINK_CLASS}-vue-container`;
container.style.position = "absolute";
container.style.top = "0";
container.style.left = "0";
container.style.zIndex = "2147483647";
container.style.pointerEvents = "none";
document.body.appendChild(container);
popupApp = createApp(Popup_default, { state: popupState });
popupMountPoint = document.createElement("div");
container.appendChild(popupMountPoint);
popupApp.mount(popupMountPoint);
document.addEventListener("click", (e) => {
if (!popupState.display) return;
if (popupMountPoint?.contains(e.target)) return;
const target = getVoiceLinkTarget(e.target);
if (target && target.classList.contains(VOICELINK_CLASS)) return;
popupState.display = false;
});
}
popupState.display = display !== false;
},
click(e) {
e.preventDefault();
e.stopPropagation();
const target = isInDLSite() ? e.target : getVoiceLinkTarget(e.target);
if (!target || !target.classList.contains(VOICELINK_CLASS)) return;
const rjCode = target.getAttribute(RJCODE_ATTRIBUTE);
if (!rjCode) return;
Popup.makePopup(true);
popupState.rjCode = rjCode;
popupState.x = e.clientX;
popupState.y = e.clientY;
}
};
var Parser = {
walkNodes: function(elem) {
const rjNodeTreeWalker = document.createTreeWalker(elem, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, { acceptNode: function(node) {
let el = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
while (el && el !== document.body) {
if (el.classList?.contains("rj-warp-gate-popup") || el.classList?.contains(VOICELINK_IGNORED_CLASS)) return NodeFilter.FILTER_REJECT;
el = el.parentElement;
}
if (node.nodeName === "SCRIPT" || node.parentElement && node.parentElement.nodeName === "SCRIPT") return NodeFilter.FILTER_REJECT;
if (node.parentElement?.isContentEditable) return NodeFilter.FILTER_SKIP;
if (node.nodeName === "A") {
if (node.href.match(URL_REGEX) && !node.classList.contains(VOICELINK_IGNORED_CLASS)) return NodeFilter.FILTER_ACCEPT;
}
if (node.nodeName !== "#text") return NodeFilter.FILTER_SKIP;
if (node.parentElement?.hasAttribute("rjcode")) return NodeFilter.FILTER_SKIP;
if (node.parentElement?.classList.contains(VOICELINK_CLASS)) return NodeFilter.FILTER_ACCEPT;
if (node.nodeValue?.match(RJ_REGEX)) return NodeFilter.FILTER_ACCEPT;
return NodeFilter.FILTER_SKIP;
} });
while (rjNodeTreeWalker.nextNode()) {
const node = rjNodeTreeWalker.currentNode;
if (node.parentElement?.nodeName === "TEXTAREA") continue;
if (node.parentElement?.classList.contains(VOICELINK_CLASS)) Parser.rebindEvents(node.parentElement);
else if (node.nodeName === "A") Parser.linkifyURL(node);
else Parser.linkify(node);
}
},
wrapPlaceholder: function(content) {
let e = document.createElement("span");
e.classList.add(VOICELINK_CLASS);
e.innerText = content;
e.classList.add(VOICELINK_IGNORED_CLASS);
e.setAttribute(RJCODE_ATTRIBUTE, "");
return e;
},
wrapRJCode: function(rjCode) {
let e = document.createElement("span");
e.classList.add(VOICELINK_CLASS);
e.innerText = rjCode;
e.classList.add(VOICELINK_IGNORED_CLASS);
e.style.cursor = "pointer";
e.style.borderBottom = "1px dashed rgba(244, 114, 182, 0.7)";
e.style.backgroundColor = "rgba(244, 114, 182, 0.05)";
e.style.borderRadius = "3px";
e.style.padding = "1px 3px";
e.style.margin = "0 2px";
e.style.display = "inline-block";
e.style.transition = "background-color 0.2s, border-bottom-color 0.2s";
e.style.color = "#f472b6";
e.addEventListener("mouseenter", () => {
e.style.backgroundColor = "rgba(244, 114, 182, 0.15)";
e.style.borderBottomColor = "rgba(244, 114, 182, 1)";
});
e.addEventListener("mouseleave", () => {
e.style.backgroundColor = "rgba(244, 114, 182, 0.05)";
e.style.borderBottomColor = "rgba(244, 114, 182, 0.7)";
});
e.setAttribute(RJCODE_ATTRIBUTE, rjCode.toUpperCase());
e.setAttribute("voicelink-linkified", "true");
e.addEventListener("click", Popup.click);
return e;
},
calculateCoverage: function(text) {
const matches = text.match(RJ_REGEX);
if (!matches) return 0;
return matches.reduce((total, current) => total + current.length, 0) / text.length * 100;
},
linkifyURL: function(node) {
const e = node;
const rjs = e.href.match(RJ_REGEX);
if (!rjs) return;
const rj = rjs[rjs.length - 1];
if (!rj) return;
e.classList.add(VOICELINK_CLASS);
e.setAttribute(RJCODE_ATTRIBUTE, rj.toUpperCase());
e.removeAttribute("href");
e.removeAttribute("target");
e.removeAttribute("rel");
e.style.cursor = "pointer";
e.style.borderBottom = "1px dashed rgba(244, 114, 182, 0.7)";
e.style.backgroundColor = "rgba(244, 114, 182, 0.05)";
e.style.borderRadius = "3px";
e.style.padding = "1px 3px";
e.style.transition = "background-color 0.2s, border-bottom-color 0.2s";
e.style.color = "#f472b6";
e.addEventListener("mouseenter", () => {
e.style.backgroundColor = "rgba(244, 114, 182, 0.15)";
e.style.borderBottomColor = "rgba(244, 114, 182, 1)";
});
e.addEventListener("mouseleave", () => {
e.style.backgroundColor = "rgba(244, 114, 182, 0.05)";
e.style.borderBottomColor = "rgba(244, 114, 182, 0.7)";
});
e.addEventListener("click", Popup.click);
},
linkify: function(textNode) {
const nodeOriginalText = textNode.nodeValue || "";
const matches = [];
let insert = "before_rj";
let tagA = textNode.parentElement?.closest("a");
let tagB = textNode.parentElement?.closest("button");
let tag = tagA ? tagA : tagB;
if (!tagA && !tagB || insert.trim() !== "none" && this.calculateCoverage(tag?.innerText || "") < 71) insert = "none";
let match;
while (match = RJ_REGEX.exec(nodeOriginalText)) matches.push({
index: match.index,
value: match[0]
});
if (matches.length === 0) return;
textNode.nodeValue = nodeOriginalText.substring(0, matches[0].index);
let prevNode = null;
for (let i = 0; i < matches.length; ++i) {
let code = matches[i].value;
let rjLinkNode = Parser.wrapRJCode(code);
if (insert.startsWith("before_rj")) {
rjLinkNode.innerText = "🔗";
textNode.parentNode?.insertBefore(rjLinkNode, prevNode ? prevNode.nextSibling : textNode.nextSibling);
prevNode = rjLinkNode;
rjLinkNode = Parser.wrapPlaceholder(code);
}
textNode.parentNode?.insertBefore(rjLinkNode, prevNode ? prevNode.nextSibling : textNode.nextSibling);
let nextRJ = void 0;
if (i < matches.length - 1) nextRJ = matches[i + 1].index;
let substring = nodeOriginalText.substring(matches[i].index + matches[i].value.length, nextRJ);
if (substring) {
const subtextNode = document.createTextNode(substring);
textNode.parentNode?.insertBefore(subtextNode, rjLinkNode.nextElementSibling);
prevNode = subtextNode;
} else prevNode = rjLinkNode;
}
},
rebindEvents: function(elem) {
if (elem.nodeName === "A") elem.addEventListener("click", Popup.click);
else {
const voicelinks = elem.querySelectorAll("." + VOICELINK_CLASS);
for (let i = 0, j = voicelinks.length; i < j; i++) voicelinks[i].addEventListener("click", Popup.click);
}
},
parseEnglishDateStr: function(dateStr, nums, lang) {
if (!dateStr.match(/[a-zA-Z]{3}\/\d{1,2}\/\d{4}/)) return null;
const monthMap = {
"Jan": 0,
"Feb": 1,
"Mar": 2,
"Apr": 3,
"May": 4,
"Jun": 5,
"Jul": 6,
"Aug": 7,
"Sep": 8,
"Oct": 9,
"Nov": 10,
"Dec": 11
};
let monthStr = dateStr.substring(0, dateStr.indexOf("/")).toLowerCase();
monthStr = monthStr[0].toUpperCase() + monthStr.substring(1);
return new Date(nums[1], monthMap[monthStr], nums[0]);
},
parseSpanishDateStr: function(dateStr, nums, lang) {
if (lang !== "es-es" || !dateStr.match(/\d{1,2}\/\d{1,2}\/\d{4}/)) return null;
return new Date(nums[2], nums[0] - 1, nums[1]);
},
parseEuropeanDateStr: function(dateStr, nums, lang) {
if (lang === "es-es" || !dateStr.match(/\d{1,2}\/\d{1,2}\/\d{4}/)) return null;
return new Date(nums[2], nums[1] - 1, nums[0]);
},
getCountDownDateElement: function(date) {
if (!date) return "";
const today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);
today.setMilliseconds(0);
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
if (date.getTime() < today.getTime()) return "";
let days = (date.getTime() - today.getTime()) / (1e3 * 60 * 60 * 24);
let element = document.createElement("span");
element.innerText = `(Coming in ${days} day${days > 1 ? "s" : ""})`;
element.style.setProperty("color", "#ffeb3b", "important");
element.style.setProperty("font-style", "italic", "important");
return element;
}
};
var STORAGE_KEY = "sp_dark_mode_enabled";
var menuCommandId = null;
var styleElement = null;
var metaElement = null;
var darkThemeCss = `
/* 1. 全局背景深色化 */
html.rj-warp-gate-dark-mode,
html.rj-warp-gate-dark-mode body,
html.rj-warp-gate-dark-mode #wrap,
html.rj-warp-gate-dark-mode .wrap,
html.rj-warp-gate-dark-mode #main,
html.rj-warp-gate-dark-mode .main,
html.rj-warp-gate-dark-mode .main-wrap,
html.rj-warp-gate-dark-mode #header,
html.rj-warp-gate-dark-mode .header,
html.rj-warp-gate-dark-mode #u-wrap2 {
background: #121212 !important;
background-color: #121212 !important;
background-image: none !important;
color: #d1d5db !important;
}
/* 2. 论坛主要表格和容器深色化 */
html.rj-warp-gate-dark-mode .t_table,
html.rj-warp-gate-dark-mode .t_table td,
html.rj-warp-gate-dark-mode .t_table th,
html.rj-warp-gate-dark-mode .f_one,
html.rj-warp-gate-dark-mode .f_two,
html.rj-warp-gate-dark-mode .t_one,
html.rj-warp-gate-dark-mode .t_two,
html.rj-warp-gate-dark-mode .r_one,
html.rj-warp-gate-dark-mode .r_two,
html.rj-warp-gate-dark-mode .tr3 td,
html.rj-warp-gate-dark-mode .tr2 td,
html.rj-warp-gate-dark-mode .tr1 td,
html.rj-warp-gate-dark-mode .tpc_content,
html.rj-warp-gate-dark-mode .read_t,
html.rj-warp-gate-dark-mode .read_m,
html.rj-warp-gate-dark-mode .t5,
html.rj-warp-gate-dark-mode #u-sidebar,
html.rj-warp-gate-dark-mode #u-content,
html.rj-warp-gate-dark-mode #u-contentmain,
html.rj-warp-gate-dark-mode #u-contentside,
html.rj-warp-gate-dark-mode .u-table,
html.rj-warp-gate-dark-mode .u-table td,
html.rj-warp-gate-dark-mode .u-table th,
html.rj-warp-gate-dark-mode .bgA,
html.rj-warp-gate-dark-mode #u-top,
html.rj-warp-gate-dark-mode #u-top-nav {
background: #1e1e1e !important;
background-color: #1e1e1e !important;
border-color: #333 !important;
color: #e5e7eb !important;
}
/* 3. 表头和标题栏稍微亮一点点,增加层次感 */
html.rj-warp-gate-dark-mode .h,
html.rj-warp-gate-dark-mode .h td,
html.rj-warp-gate-dark-mode .h th,
html.rj-warp-gate-dark-mode .h b,
html.rj-warp-gate-dark-mode .h span,
html.rj-warp-gate-dark-mode #u-top-nav ul.b li,
html.rj-warp-gate-dark-mode .pages,
html.rj-warp-gate-dark-mode .pagesone,
html.rj-warp-gate-dark-mode .u-h1,
html.rj-warp-gate-dark-mode .u-h5 {
background: #2a2a2a !important;
background-color: #2a2a2a !important;
border-color: #444 !important;
color: #f3f4f6 !important;
}
/* 4. 链接颜色调整为适合暗底的亮蓝色 */
html.rj-warp-gate-dark-mode a {
color: #60a5fa !important;
}
html.rj-warp-gate-dark-mode a:hover {
color: #93c5fd !important;
}
/* 5. 修复用户发帖时经常带的内联白色背景和黑色字体 */
html.rj-warp-gate-dark-mode .tpc_content font[color="#000000"],
html.rj-warp-gate-dark-mode .tpc_content font[color="black"],
html.rj-warp-gate-dark-mode .tpc_content [style*="color: #000"],
html.rj-warp-gate-dark-mode .tpc_content [style*="color: black"],
html.rj-warp-gate-dark-mode .tpc_content [style*="color:#000"] {
color: #d1d5db !important;
}
/* 6. 修复内联白色背景和各种白色区块 (如购买框、引用框) */
html.rj-warp-gate-dark-mode [style*="background-color: #fff"],
html.rj-warp-gate-dark-mode [style*="background-color:#fff"],
html.rj-warp-gate-dark-mode [style*="background-color: white"],
html.rj-warp-gate-dark-mode [style*="background-color:#ffffff"],
html.rj-warp-gate-dark-mode [style*="background: #fff"],
html.rj-warp-gate-dark-mode [style*="background: white"],
html.rj-warp-gate-dark-mode [style*="background:#fff"],
html.rj-warp-gate-dark-mode [bgcolor="#ffffff"],
html.rj-warp-gate-dark-mode [bgcolor="#fff"],
html.rj-warp-gate-dark-mode blockquote,
html.rj-warp-gate-dark-mode .blockquote,
html.rj-warp-gate-dark-mode .quote {
background: #2d2d2d !important;
background-color: #2d2d2d !important;
border-color: #444 !important;
color: #d1d5db !important;
}
/* 7. 输入框和文本域深色化 */
html.rj-warp-gate-dark-mode input[type="text"],
html.rj-warp-gate-dark-mode input[type="password"],
html.rj-warp-gate-dark-mode textarea,
html.rj-warp-gate-dark-mode select {
background: #2a2a2a !important;
background-color: #2a2a2a !important;
color: #e5e7eb !important;
border: 1px solid #444 !important;
}
`;
function initThemeManager() {
const hostname = window.location.hostname;
if (!hostname.includes("south-plus") && !hostname.includes("spring-plus") && !hostname.includes("level-plus") && !hostname.includes("imoutolove")) return;
if (GM_getValue(STORAGE_KEY, true)) applyDarkMode();
registerMenu();
}
function registerMenu() {
if (menuCommandId !== null && typeof GM_unregisterMenuCommand !== "undefined") GM_unregisterMenuCommand(menuCommandId);
const menuTitle = GM_getValue(STORAGE_KEY, true) ? localize("switch_to_light_mode") : localize("switch_to_dark_mode");
if (typeof GM_registerMenuCommand !== "undefined") menuCommandId = GM_registerMenuCommand(menuTitle, () => {
toggleDarkMode();
});
}
function toggleDarkMode() {
const newState = !GM_getValue(STORAGE_KEY, true);
GM_setValue(STORAGE_KEY, newState);
if (newState) applyDarkMode();
else removeDarkMode();
registerMenu();
}
function applyDarkMode() {
if (document.documentElement) document.documentElement.classList.add("rj-warp-gate-dark-mode");
const insertElements = () => {
if (!styleElement) {
styleElement = document.createElement("style");
styleElement.textContent = darkThemeCss;
const target = document.head || document.documentElement;
if (target) target.appendChild(styleElement);
}
if (!metaElement) {
metaElement = document.createElement("meta");
metaElement.name = "darkreader-lock";
const target = document.head || document.documentElement;
if (target) target.appendChild(metaElement);
}
};
if (document.head || document.documentElement) insertElements();
else document.addEventListener("DOMContentLoaded", () => {
document.documentElement?.classList.add("rj-warp-gate-dark-mode");
insertElements();
}, { once: true });
}
function removeDarkMode() {
if (document.documentElement) document.documentElement.classList.remove("rj-warp-gate-dark-mode");
if (styleElement) {
styleElement.remove();
styleElement = null;
}
if (metaElement) {
metaElement.remove();
metaElement = null;
}
}
initThemeManager();
var isInit = false;
var observing = false;
function init() {
if (document.location.hostname.endsWith("dlsite.com")) {
console.log("[RJ-Warp-Gate] Disabled on DLSite to avoid layout conflicts.");
return;
}
if (!isInit) isInit = true;
setTimeout(() => {
if (!document.body || observing) return;
Parser.walkNodes(document.body);
if (!document.getElementById(`${VOICELINK_CLASS}-vue-container`)) Popup.makePopup(false);
new MutationObserver(function(m) {
for (let i = 0; i < m.length; ++i) {
let addedNodes = m[i].addedNodes;
for (let j = 0; j < addedNodes.length; ++j) Parser.walkNodes(addedNodes[j]);
}
}).observe(document.body, {
childList: true,
subtree: true
});
observing = true;
}, 100);
}
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", init);
else init();
})();