
const serverMid = "dswzb4x23bd7jttes6ndz5z3";
const pwaWebAppMid = serverMid || window.pwaWebAppMid || '';
const pwaWebAppVersion = "3";
const pwaWebAppConfig = window.pwaWebAppConfig || {};
const sdkLanguageTools = (function n(){let a=new Set(["cn","tw","malay","en","kh","th","vi","id"]);function n(a){return null==a?"":String(a).trim().toLowerCase().replace(/_/g,"-")}function t(t){let i=n(t);if(!i)return null;if(a.has(i))return i;let e=i.split("-")[0]||i;return"yue"===e?"tw":"zh"===e?i.split("-").includes("hans")?"cn":-1!==i.indexOf("-hant")||"zh-tw"===i||0===i.indexOf("zh-tw-")||"zh-hk"===i||0===i.indexOf("zh-hk-")||"zh-mo"===i||0===i.indexOf("zh-mo-")?"tw":"cn":"ms"===e||"msa"===e?"malay":"km"===e||"kh"===e?"kh":"th"===e?"th":"vi"===e?"vi":"id"===e||"in"===e?"id":"en"===e?"en":"indonesian"===i?"id":null}return{canonicalizeLangTag:n,mapBrowserLangToSdk:t,resolveSdkBrowserLanguage:function(a,i){let e=a.length?a:[i||""];for(let a of e){if("zh"===n(a)?e.find(a=>/^(zh[-_]|yue)/i.test(a)):void 0)continue;let i=t(a);if(i)return i}return t(i)}}})();
const { mapBrowserLangToSdk, resolveSdkBrowserLanguage } = sdkLanguageTools;
function pwaMapNavigatorLang(raw) { return mapBrowserLangToSdk(raw); }
function pwaNormalizeSdkLang(raw) { return mapBrowserLangToSdk(raw); }
var merchantDefaultLang = pwaNormalizeSdkLang("en") || 'en';
var browserLanguages = Array.from(navigator.languages || []).slice(0, 10);
var browserResolved = resolveSdkBrowserLanguage(browserLanguages, navigator.language);
var _L = browserResolved || merchantDefaultLang;
console.info('[PWA]', {
    event: 'sdk_locale_resolved', merchantId: "cmnwxiaty006i04jye31gf732",
    browserLanguages: browserLanguages.map(function(v) { return String(v).slice(0, 64); }),
    language: String(navigator.language || '').slice(0, 64),
    resolvedLanguage: _L, source: browserResolved ? 'browser' : 'default',
    defaultLanguage: merchantDefaultLang
});
const sdkDefaults = {"style1":{"langs":{"en":{"turnOnNotification":"Turn on notifications to claim your exclusive bonus.","agree":"Agree","cancel":"Cancel","addHomeScreen":"Download Our Web App Now to Instantly Claim Your Free Bonus!","subtitle":"Web App","install":"Install","keepUseBrowser":"Keep using the browser","installing":"Installing","installingTrust":"Safe to install. Follow the prompts on your device.","installingHint":"Please don't close this page. Installation is almost done.","installSuccess":"Installation complete, please open the app from your home screen","installUnavailable":"App may already be installed. Open it from your home screen.","iosStep1":"Tap the Share button in Safari","iosStep2":"Select 'Add to Home Screen'","iosStep3":"Tap 'Add'","iosOpenSafari":"Please open this page in Safari to install the app","iosCopyLink":"Copy Link"},"cn":{"turnOnNotification":"开启通知以获取专属奖励","agree":"同意","cancel":"取消","addHomeScreen":"立即下载我们的Web应用，领取免费奖励！","subtitle":"Web 应用","install":"安装","keepUseBrowser":"继续使用浏览器","installing":"安装中","installingTrust":"安全可靠，请按设备上的提示操作","installingHint":"请勿关闭页面，安装即将完成","installSuccess":"安装成功，请前往桌面打开应用","installUnavailable":"应用可能已安装，请从桌面图标打开。","iosStep1":"点击 Safari 的分享按钮","iosStep2":"选择\"添加到主屏幕\"","iosStep3":"点击\"添加\"","iosOpenSafari":"请在 Safari 中打开此页面以安装应用","iosCopyLink":"复制链接"},"tw":{"turnOnNotification":"開啟通知以獲取專屬獎勵","agree":"同意","cancel":"取消","addHomeScreen":"立即下載我們的 Web 應用，領取免費獎勵！","subtitle":"Web 應用","install":"安裝","keepUseBrowser":"繼續使用瀏覽器","installing":"安裝中","installingTrust":"安全可靠，請依裝置上的提示操作","installingHint":"請勿關閉頁面，安裝即將完成","installSuccess":"安裝成功，請前往主畫面開啟應用","installUnavailable":"應用可能已安裝，請從主畫面圖示開啟。","iosStep1":"點擊 Safari 的分享按鈕","iosStep2":"選擇「加入主畫面」","iosStep3":"點擊「加入」","iosOpenSafari":"請在 Safari 中開啟此頁面以安裝應用","iosCopyLink":"複製連結"},"malay":{"turnOnNotification":"Hidupkan notifikasi untuk mendapatkan bonus eksklusif anda.","agree":"Setuju","cancel":"Batal","addHomeScreen":"Muat Turun Aplikasi Web Kami Sekarang untuk Mendapatkan Bonus Percuma!","subtitle":"Aplikasi Web","install":"Pasang","keepUseBrowser":"Terus gunakan pelayar","installing":"Sedang memasang","installingTrust":"Selamat dipasang. Ikut arahan pada peranti anda.","installingHint":"Jangan tutup halaman ini. Pemasangan hampir selesai.","installSuccess":"Pemasangan berjaya, sila buka aplikasi dari skrin utama","installUnavailable":"Aplikasi mungkin sudah dipasang. Buka dari skrin utama.","iosStep1":"Ketik butang Kongsi di Safari","iosStep2":"Pilih 'Tambah ke Skrin Utama'","iosStep3":"Ketik 'Tambah'","iosOpenSafari":"Sila buka halaman ini di Safari untuk memasang aplikasi","iosCopyLink":"Salin pautan"},"kh":{"turnOnNotification":"បើកការជូនដំណឹងដើម្បីទទួលបានរង្វាន់ពិសេស!","agree":"យល់ព្រម","cancel":"បោះបង់","addHomeScreen":"តាមដងទាញយកកម្មវិធី Web របស់យើងឥឡូវនេះ ដើម្បីទទួលបានរង្វាន់ឥតគិតថ្លៃ!","subtitle":"កម្មវិធី Web","install":"ដំឡើង","keepUseBrowser":"បន្តប្រើកម្មវិធីរុករក","installing":"កំពុងដំឡើង","installingTrust":"ដ៏អាចដំឡើង។ សូមជ្រើសរើសពីសាររបស់អ្នក។","installingHint":"សូមកុំបិទទំព័រនេះ ការដំឡើងបានរឹងរួស","installSuccess":"ដំឡើងបានជោគជ័យ សូមបើកកម្មវិធីពីអេក្រង់ដើម","installUnavailable":"កម្មវិធីប្រហែលជាបានដំឡើងហើយ។ សូមបើកពីអេក្រង់ដើម។","iosStep1":"ចុចប៊ូតុងចែករំលែកនៅក្នុង Safari","iosStep2":"ជ្រើសរើស 'Add to Home Screen'","iosStep3":"ចុច 'Add'","iosOpenSafari":"សូមបើកទំព័រនេះក្នុង Safari ដើម្បីដំឡើងកម្មវិធី","iosCopyLink":"ចម្លងតំណ"},"th":{"turnOnNotification":"เปิดการแจ้งเตือนเพื่อรับโบนัสพิเศษ","agree":"ยอมรับ","cancel":"ยกเลิก","addHomeScreen":"ดาวน์โหลดแอป Web ของเราตอนนี้เพื่อรับโบนัสฟรี!","subtitle":"แอป Web","install":"ติดตั้ง","keepUseBrowser":"ใช้เบราว์เซอร์ต่อไป","installing":"กำลังติดตั้ง","installingTrust":"ปลอดภัยในการติดตั้ง ทำตามคำแนะนำบนอุปกรณ์ของคุณ","installingHint":"อย่าปิดหน้านี้ การติดตั้งใกล้เสร็จแล้ว","installSuccess":"ติดตั้งสำเร็จ กรุณาเปิดแอปจากหน้าจอหลัก","installUnavailable":"แอปอาจติดตั้งแล้ว กรุณาเปิดจากหน้าจอหลัก","iosStep1":"แตะปุ่มแชร์ใน Safari","iosStep2":"เลือก 'เพิ่มไปที่หน้าจอหลัก'","iosStep3":"แตะ 'เพิ่ม'","iosOpenSafari":"กรุณาเปิดหน้านี้ใน Safari เพื่อติดตั้งแอป","iosCopyLink":"คัดลอกลิงก์"},"vi":{"turnOnNotification":"Bật thông báo để nhận thưởng độc quyền","agree":"Đồng ý","cancel":"Hủy","addHomeScreen":"Tải ứng dụng Web ngay để nhận thưởng miễn phí!","subtitle":"Ứng dụng Web","install":"Cài đặt","keepUseBrowser":"Tiếp tục dùng trình duyệt","installing":"Đang cài đặt","installingTrust":"An toàn để cài đặt. Làm theo hướng dẫn trên thiết bị của bạn.","installingHint":"Vui lòng không đóng trang này. Việc cài đặt sắp hoàn tất.","installSuccess":"Cài đặt thành công, vui lòng mở ứng dụng từ màn hình chính","installUnavailable":"Ứng dụng có thể đã được cài đặt. Hãy mở từ màn hình chính.","iosStep1":"Nhấn nút Chia sẻ trong Safari","iosStep2":"Chọn 'Thêm vào Màn hình chính'","iosStep3":"Nhấn 'Thêm'","iosOpenSafari":"Vui lòng mở trang này trong Safari để cài đặt ứng dụng","iosCopyLink":"Sao chép liên kết"},"id":{"turnOnNotification":"Aktifkan notifikasi untuk mendapatkan bonus eksklusif Anda.","agree":"Setuju","cancel":"Batal","addHomeScreen":"Unduh Aplikasi Web Kami Sekarang untuk Mendapatkan Bonus Gratis!","subtitle":"Aplikasi Web","install":"Pasang","keepUseBrowser":"Tetap gunakan browser","installing":"Sedang memasang","installingTrust":"Aman untuk dipasang. Ikuti petunjuk di perangkat Anda.","installingHint":"Jangan tutup halaman ini. Pemasangan hampir selesai.","installSuccess":"Pemasangan berhasil, silakan buka aplikasi dari layar utama","installUnavailable":"Aplikasi mungkin sudah terpasang. Buka dari layar utama.","iosStep1":"Ketuk tombol Bagikan di Safari","iosStep2":"Pilih 'Tambahkan ke Layar Utama'","iosStep3":"Ketuk 'Tambah'","iosOpenSafari":"Silakan buka halaman ini di Safari untuk memasang aplikasi","iosCopyLink":"Salin tautan"}}},"style2":{"drawerTheme":"dark","showDownloadTab":false,"androidDownloadUrl":"","iosDownloadUrl":"","langs":{"en":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"Download App","description":"Download our app now for exclusive deals and surprises","quickInstallLabel":"Quick Install","downloadAppLabel":"Download App","installBtnText":"Quick Install","downloadBtnText":"Download App","quickInstallIosIntroTitle":"Install iOS application","quickInstallIosIntroSteps":["Click the button above to download the installation file.","Tap the \"Share\" button at the bottom of the screen.","Choose \"Add to Home Screen\".","Once added, you'll see the app icon on your home screen. Tap it to start using the app!"],"quickInstallIosIntroFooter":"Verified by Apple and safe to download and install.","quickInstallAndroidIntroTitle":"Install Android application","quickInstallAndroidIntroSteps":["Tap the install button above.","In the browser prompt, choose Install or Add to home screen.","If your device asks, allow from this source and complete the steps.","Open the app from your home screen or app drawer."],"quickInstallAndroidIntroFooter":"Safe to install. Follow the prompts on your device.","iosGuideTitle":"Add to Home Screen","iosSteps":[{"title":"Tap the Share button","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"Select \"Add to Home Screen\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"Tap \"Add\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"cn":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"下载应用","description":"立即下载应用，获取专属优惠","quickInstallLabel":"快速安装","downloadAppLabel":"下载APP","installBtnText":"快速安装","downloadBtnText":"下载APP","quickInstallIosIntroTitle":"安装 iOS 应用","quickInstallIosIntroSteps":["点击上方按钮下载安装文件。","点击屏幕底部的“分享”按钮。","选择“添加到主屏幕”。","添加后，主屏幕会显示应用图标。点击即可开始使用！"],"quickInstallIosIntroFooter":"已通过 Apple 验证，可安全下载并安装。","quickInstallAndroidIntroTitle":"安装 Android 应用","quickInstallAndroidIntroSteps":["点击上方安装按钮。","在浏览器提示中选择安装或添加到主屏幕。","若系统询问，请允许此来源并按提示完成。","从主屏幕或应用列表打开应用。"],"quickInstallAndroidIntroFooter":"安全可靠，请按设备上的提示操作。","iosGuideTitle":"添加到主屏幕","iosSteps":[{"title":"点击分享按钮","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"选择“添加到主屏幕”","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"点击“添加”","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"tw":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"下載應用","description":"立即下載應用程式，獲取專屬優惠","quickInstallLabel":"快速安裝","downloadAppLabel":"下載APP","installBtnText":"快速安裝","downloadBtnText":"下載APP","quickInstallIosIntroTitle":"安裝 iOS 應用程式","quickInstallIosIntroSteps":["點擊上方按鈕下載安裝檔。","點擊螢幕底部的「分享」按鈕。","選擇「加入主畫面」。","加入後，主畫面會顯示應用程式圖示。點擊即可開始使用！"],"quickInstallIosIntroFooter":"已通過 Apple 驗證，可安全下載並安裝。","quickInstallAndroidIntroTitle":"安裝 Android 應用程式","quickInstallAndroidIntroSteps":["點擊上方安裝按鈕。","在瀏覽器提示中選擇安裝或加入主畫面。","若系統詢問，請允許此來源並按提示完成。","從主畫面或應用程式列表開啟應用程式。"],"quickInstallAndroidIntroFooter":"安全可靠，請依裝置上的提示操作。","iosGuideTitle":"加入主畫面","iosSteps":[{"title":"點擊分享按鈕","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"選擇「加入主畫面」","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"點擊「加入」","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"malay":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"Muat Turun Aplikasi","description":"Muat turun aplikasi kami sekarang untuk tawaran eksklusif","quickInstallLabel":"Pasang Pantas","downloadAppLabel":"Muat Turun App","installBtnText":"Pasang Pantas","downloadBtnText":"Muat Turun App","quickInstallIosIntroTitle":"Pasang aplikasi iOS","quickInstallIosIntroSteps":["Ketik butang di atas untuk memuat turun fail pemasangan.","Ketik butang \"Kongsi\" di bahagian bawah skrin.","Pilih \"Tambah ke Skrin Utama\".","Selepas ditambah, anda akan melihat ikon aplikasi di skrin utama. Ketik untuk mula menggunakan aplikasi!"],"quickInstallIosIntroFooter":"Disahkan oleh Apple dan selamat untuk dimuat turun serta dipasang.","quickInstallAndroidIntroTitle":"Pasang aplikasi Android","quickInstallAndroidIntroSteps":["Ketik butang pasang di atas.","Dalam dialog pelayar, pilih Pasang atau Tambah ke skrin utama.","Jika peranti bertanya, benarkan dari sumber ini dan lengkapkan langkah.","Buka aplikasi dari skrin utama atau laci aplikasi."],"quickInstallAndroidIntroFooter":"Selamat dipasang. Ikut arahan pada peranti anda.","iosGuideTitle":"Tambah ke Skrin Utama","iosSteps":[{"title":"Ketik butang Kongsi","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"Pilih \"Tambah ke Skrin Utama\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"Ketik \"Tambah\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"kh":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"តាញយកកម្មវិធី","description":"តាញយកកម្មវិធីរបស់យើងឥឡូវនេះ","quickInstallLabel":"ដំឡើងរហ័ស","downloadAppLabel":"តាញយក App","installBtnText":"ដំឡើងរហ័ស","downloadBtnText":"តាញយក App","quickInstallIosIntroTitle":"ដំឡើងកម្មវិធី iOS","quickInstallIosIntroSteps":["ចុចប៊ូតុងទំព័រដំរានដើម្បីតាញយជានចេន់ព្រពានចេន់បរំងព្រាន់ព្រាន់。","ចុចប៊ូតុង \"Share\" នៅក្នុងដើម្បីក្រង់លំន់ព្រាន់。","ជ្រើសរើស \"Add to Home Screen\"。","ពេសបន្ថែមទៅអេក្រង់ដើម តើមបាន់មែនជានកម្មវិធីលៃស់ដើមកម្មវិធី。 ចុចដើម្បីក្រង់ពិសេសរបស់បរ់រំបរ់。"],"quickInstallIosIntroFooter":"បំរាតទិយ Apple របស់ដើម្បីតាញយនៅក្នុងដំឡើងពិសេស。","quickInstallAndroidIntroTitle":"ដំឡើងកម្មវិធី Android","quickInstallAndroidIntroSteps":["ចុចប៊ូតុងដំឡើងទំព័រដំរាន。","នៅក្នុងប៊ូតុងព្រាន់វាប់វាប់ ជ្រើសរើស ដំឡើង បន្ថែមទៅអេក្រង់ដើម。","បន្ថែមទៅកម្មវិធីសួធ្សែរ សូមបើកទំព័រពិសេសរបស់នៅក្នុងនេះនៅតាយរបស់。","បើកកម្មវិធីទំព័រដើម្បីក្រង់លំន់ របស់ពិសេសរបស់កម្មវិធី。"],"quickInstallAndroidIntroFooter":"ដើម្បីដំឡើង。 សូមជួធ្សែរពិសេសនៅក្នុងពិសេសរបស់。","iosGuideTitle":"បន្ថែមទៅអេក្រង់ដើម","iosSteps":[{"title":"ចុចប៊ូតុងចែករំលែក","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"ជ្រើសរើស \"Add to Home Screen\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"ចុច \"Add\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"th":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"ดาวน์โหลดแอป","description":"ดาวน์โหลดแอปของเราตอนนี้เพื่อรับข้อเสนอพิเศษ","quickInstallLabel":"ติดตั้งด่วน","downloadAppLabel":"ดาวน์โหลดแอป","installBtnText":"ติดตั้งด่วน","downloadBtnText":"ดาวน์โหลดแอป","quickInstallIosIntroTitle":"ติดตั้งแอป iOS","quickInstallIosIntroSteps":["คลิกปุ่มด้านบนเพื่อดาวน์โหลดไฟล์ติดตั้ง","แตะปุ่ม \"แชร์\" ที่ด้านล่างของหน้าจอ","เลือก \"เพิ่มไปที่หน้าจอหลัก\"","เมื่อเพิ่มแล้ว คุณจะเห็นไอคอนแอปบนหน้าจอหลัก แตะเพื่อเริ่มใช้งาน!"],"quickInstallIosIntroFooter":"ได้รับการยืนยันจาก Apple และปลอดภัยสำหรับการดาวน์โหลดและติดตั้ง","quickInstallAndroidIntroTitle":"ติดตั้งแอป Android","quickInstallAndroidIntroSteps":["แตะปุ่มติดตั้งด้านบน","ในหน้าต่างเบราว์เซอร์ เลือกติดตั้งหรือเพิ่มไปที่หน้าจอหลัก","หากอุปกรณ์ถาม ให้อนุญาตจากแหล่งนี้และทำตามขั้นตอน","เปิดแอปจากหน้าจอหลักหรือลิ้นชักแอป"],"quickInstallAndroidIntroFooter":"ปลอดภัยในการติดตั้ง ทำตามคำแนะนำบนอุปกรณ์ของคุณ","iosGuideTitle":"เพิ่มไปที่หน้าจอหลัก","iosSteps":[{"title":"แตะปุ่มแชร์","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"เลือก \"เพิ่มไปที่หน้าจอหลัก\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"แตะ \"เพิ่ม\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"vi":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"Tải ứng dụng","description":"Tải ứng dụng ngay để nhận ưu đãi độc quyền","quickInstallLabel":"Cài đặt nhanh","downloadAppLabel":"Tải ứng dụng","installBtnText":"Cài đặt nhanh","downloadBtnText":"Tải ứng dụng","quickInstallIosIntroTitle":"Cài đặt ứng dụng iOS","quickInstallIosIntroSteps":["Nhấn nút phía trên để tải tệp cài đặt.","Nhấn nút \"Chia sẻ\" ở cuối màn hình.","Chọn \"Thêm vào Màn hình chính\".","Sau khi thêm, bạn sẽ thấy biểu tượng ứng dụng trên màn hình chính. Nhấn để bắt đầu sử dụng!"],"quickInstallIosIntroFooter":"Đã được Apple xác minh, an toàn để tải xuống và cài đặt.","quickInstallAndroidIntroTitle":"Cài đặt ứng dụng Android","quickInstallAndroidIntroSteps":["Nhấn nút cài đặt phía trên.","Trong hộp thoại trình duyệt, chọn Cài đặt hoặc Thêm vào màn hình chính.","Nếu thiết bị hỏi, hãy cho phép từ nguồn này và hoàn tất các bước.","Mở ứng dụng từ màn hình chính hoặc ngăn ứng dụng."],"quickInstallAndroidIntroFooter":"An toàn để cài đặt. Làm theo hướng dẫn trên thiết bị của bạn.","iosGuideTitle":"Thêm vào Màn hình chính","iosSteps":[{"title":"Nhấn nút Chia sẻ","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"Chọn \"Thêm vào Màn hình chính\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"Nhấn \"Thêm\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]},"id":{"bannerImage":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png","title":"Unduh Aplikasi","description":"Unduh aplikasi kami sekarang untuk penawaran eksklusif","quickInstallLabel":"Pasang Cepat","downloadAppLabel":"Unduh Aplikasi","installBtnText":"Pasang Cepat","downloadBtnText":"Unduh Aplikasi","quickInstallIosIntroTitle":"Pasang aplikasi iOS","quickInstallIosIntroSteps":["Ketuk tombol di atas untuk mengunduh file pemasangan.","Ketuk tombol \"Bagikan\" di bagian bawah layar.","Pilih \"Tambahkan ke Layar Utama\".","Setelah ditambahkan, Anda akan melihat ikon aplikasi di layar utama. Ketuk untuk mulai menggunakan aplikasi!"],"quickInstallIosIntroFooter":"Diverifikasi oleh Apple dan aman untuk diunduh serta dipasang.","quickInstallAndroidIntroTitle":"Pasang aplikasi Android","quickInstallAndroidIntroSteps":["Ketuk tombol pasang di atas.","Di dialog browser, pilih Pasang atau Tambahkan ke layar utama.","Jika perangkat meminta, izinkan dari sumber ini dan selesaikan langkahnya.","Buka aplikasi dari layar utama atau laci aplikasi."],"quickInstallAndroidIntroFooter":"Aman untuk dipasang. Ikuti petunjuk di perangkat Anda.","iosGuideTitle":"Tambahkan ke Layar Utama","iosSteps":[{"title":"Ketuk tombol Bagikan","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png"},{"title":"Pilih \"Tambahkan ke Layar Utama\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png"},{"title":"Ketuk \"Tambah\"","image":"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png"}]}}},"style3":{"sheetTheme":"light","langs":{"en":{"title":"Install app","description":"Add to your home screen for quick access and updates.","install":"Install","keepUseBrowser":"Not now","installing":"Installing…","installingHint":"Please keep this page open.","installSuccess":"Installed. Open the app from your home screen.","installUnavailable":"App may already be installed. Open it from your home screen.","turnOnNotification":"Turn on notifications for updates and offers.","agree":"Allow","cancel":"Not now","iosStep1":"Tap Share in Safari","iosStep2":"Choose Add to Home Screen","iosStep3":"Tap Add","iosOpenSafari":"Open this page in Safari to install","iosCopyLink":"Copy link"},"cn":{"title":"安装应用","description":"添加到主屏幕，快速访问并接收更新。","install":"安装","keepUseBrowser":"暂不","installing":"安装中…","installingHint":"请保持页面打开。","installSuccess":"已安装，请从主屏幕打开应用。","installUnavailable":"应用可能已安装，请从桌面图标打开。","turnOnNotification":"开启通知，获取更新与优惠。","agree":"允许","cancel":"暂不","iosStep1":"点击 Safari 分享按钮","iosStep2":"选择「添加到主屏幕」","iosStep3":"点击「添加」","iosOpenSafari":"请在 Safari 中打开此页面以安装","iosCopyLink":"复制链接"},"tw":{"title":"安裝應用程式","description":"加入主畫面，快速存取並接收更新。","install":"安裝","keepUseBrowser":"暫不","installing":"安裝中…","installingHint":"請保持頁面開啟。","installSuccess":"已安裝，請從主畫面開啟應用程式。","installUnavailable":"應用程式可能已安裝，請從桌面圖示開啟。","turnOnNotification":"開啟通知，獲取更新與優惠。","agree":"允許","cancel":"暫不","iosStep1":"點擊 Safari 分享按鈕","iosStep2":"選擇「加入主畫面」","iosStep3":"點擊「加入」","iosOpenSafari":"請在 Safari 中開啟此頁面以安裝","iosCopyLink":"複製連結"},"malay":{"title":"Pasang aplikasi","description":"Tambah ke skrin utama untuk akses pantas dan kemas kini.","install":"Pasang","keepUseBrowser":"Bukan sekarang","installing":"Sedang memasang…","installingHint":"Sila kekalkan halaman ini terbuka.","installSuccess":"Dipasang. Buka aplikasi dari skrin utama.","installUnavailable":"Aplikasi mungkin sudah dipasang. Buka dari skrin utama.","turnOnNotification":"Hidupkan notifikasi untuk kemas kini dan tawaran.","agree":"Benarkan","cancel":"Bukan sekarang","iosStep1":"Ketik Kongsi di Safari","iosStep2":"Pilih Tambah ke Skrin Utama","iosStep3":"Ketik Tambah","iosOpenSafari":"Buka halaman ini di Safari untuk memasang","iosCopyLink":"Salin pautan"},"kh":{"title":"ដំឡើងកម្មវិធី","description":"បន្ថែមទៅអេក្រង់ដើម ដើម្បីចូលប្រើរហ័ស និងទទួលការធ្វើបច្ចុប្បន្នភាព។","install":"ដំឡើង","keepUseBrowser":"មិនមែនឥឡូវ","installing":"កំពុងដំឡើង…","installingHint":"សូមទុកទំព័រនេះបើករក្សាទុក។","installSuccess":"បានដំឡើង។ បើកកម្មវិធីពីអេក្រង់ដើម។","installUnavailable":"កម្មវិធីប្រហែលជាបានដំឡើងហើយ។ សូមបើកពីអេក្រង់ដើម។","turnOnNotification":"បើកការជូនដំណឹងសម្រាប់ការធ្វើបច្ចុប្បន្នភាព និងការផ្តល់ជូន។","agree":"អនុញ្ញាត","cancel":"មិនមែនឥឡូវ","iosStep1":"ចុច Share នៅក្នុង Safari","iosStep2":"ជ្រើស Add to Home Screen","iosStep3":"ចុច Add","iosOpenSafari":"បើកទំព័រនេះក្នុង Safari ដើម្បីដំឡើង","iosCopyLink":"ចម្លងតំណ"},"th":{"title":"ติดตั้งแอป","description":"เพิ่มไปที่หน้าจอหลักเพื่อเข้าถึงและรับการอัปเดต","install":"ติดตั้ง","keepUseBrowser":"ไว้ทีหลัง","installing":"กำลังติดตั้ง…","installingHint":"โปรดเปิดหน้านี้ไว้","installSuccess":"ติดตั้งแล้ว เปิดแอปจากหน้าจอหลัก","installUnavailable":"แอปอาจติดตั้งแล้ว กรุณาเปิดจากหน้าจอหลัก","turnOnNotification":"เปิดการแจ้งเตือนสำหรับอัปเดตและข้อเสนอ","agree":"อนุญาต","cancel":"ไว้ทีหลัง","iosStep1":"แตะแชร์ใน Safari","iosStep2":"เลือกเพิ่มไปที่หน้าจอหลัก","iosStep3":"แตะเพิ่ม","iosOpenSafari":"เปิดหน้านี้ใน Safari เพื่อติดตั้ง","iosCopyLink":"คัดลอกลิงก์"},"vi":{"title":"Cài đặt ứng dụng","description":"Thêm vào màn hình chính để truy cập nhanh và nhận cập nhật.","install":"Cài đặt","keepUseBrowser":"Để sau","installing":"Đang cài đặt…","installingHint":"Vui lòng giữ trang này mở.","installSuccess":"Đã cài đặt. Mở ứng dụng từ màn hình chính.","installUnavailable":"Ứng dụng có thể đã được cài đặt. Hãy mở từ màn hình chính.","turnOnNotification":"Bật thông báo để nhận cập nhật và ưu đãi.","agree":"Cho phép","cancel":"Để sau","iosStep1":"Nhấn Chia sẻ trong Safari","iosStep2":"Chọn Thêm vào Màn hình chính","iosStep3":"Nhấn Thêm","iosOpenSafari":"Mở trang này trong Safari để cài đặt","iosCopyLink":"Sao chép liên kết"},"id":{"title":"Pasang aplikasi","description":"Tambahkan ke layar utama untuk akses cepat dan pembaruan.","install":"Pasang","keepUseBrowser":"Nanti saja","installing":"Sedang memasang…","installingHint":"Harap biarkan halaman ini tetap terbuka.","installSuccess":"Berhasil dipasang. Buka aplikasi dari layar utama.","installUnavailable":"Aplikasi mungkin sudah terpasang. Buka dari layar utama.","turnOnNotification":"Aktifkan notifikasi untuk pembaruan dan penawaran.","agree":"Izinkan","cancel":"Nanti saja","iosStep1":"Ketuk Bagikan di Safari","iosStep2":"Pilih Tambahkan ke Layar Utama","iosStep3":"Ketuk Tambah","iosOpenSafari":"Buka halaman ini di Safari untuk memasang","iosCopyLink":"Salin tautan"}}}};
const style1KeyMap = {"turnOnNotification":"turn_on_notification","agree":"agree","cancel":"cancel","addHomeScreen":"add_home_screen","subtitle":"subtitle","install":"install","keepUseBrowser":"keep_use_browser","installing":"installing","installingTrust":"installing_trust","installingHint":"installing_hint","installSuccess":"install_success","installUnavailable":"install_unavailable","iosStep1":"ios_step1","iosStep2":"ios_step2","iosStep3":"ios_step3","iosOpenSafari":"ios_open_safari","iosCopyLink":"ios_copy_link"};
const pwaWebAppLang = {};
for (var key in style1KeyMap) pwaWebAppLang[style1KeyMap[key]] = sdkDefaults.style1.langs[_L][key];

const pwasts = "1";
const rdd = "-2";
const rnd = "0";
const pwaSiteUserReportEnabled = true;
const pwaPopupStyleRaw = "2";
const pwaPopupStyleId = parseInt(pwaPopupStyleRaw, 10) || 1;
const pwaPopupConfigRaw = "{\"style2\":{\"langs\":{\"cn\":{\"title\":\"下载应用\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"点击分享按钮\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"选择“添加到主屏幕”\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"点击“添加”\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"立即下载应用，获取专属优惠\",\"iosGuideTitle\":\"添加到主屏幕\",\"installBtnText\":\"快速安装\",\"downloadBtnText\":\"下载APP\",\"downloadAppLabel\":\"下载APP\",\"quickInstallLabel\":\"快速安装\",\"quickInstallIosIntroSteps\":[\"点击上方按钮下载安装文件。\",\"点击屏幕底部的“分享”按钮。\",\"选择“添加到主屏幕”。\",\"添加后，主屏幕会显示应用图标。点击即可开始使用！\"],\"quickInstallIosIntroTitle\":\"安装 iOS 应用\",\"quickInstallIosIntroFooter\":\"已通过 Apple 验证，可安全下载并安装。\",\"quickInstallAndroidIntroSteps\":[\"点击上方安装按钮。\",\"在浏览器提示中选择安装或添加到主屏幕。\",\"若系统询问，请允许此来源并按提示完成。\",\"从主屏幕或应用列表打开应用。\"],\"quickInstallAndroidIntroTitle\":\"安装 Android 应用\",\"quickInstallAndroidIntroFooter\":\"安全可靠，请按设备上的提示操作。\"},\"en\":{\"title\":\"Download App\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"Tap the Share button\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"Select \\\"Add to Home Screen\\\"\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"Tap \\\"Add\\\"\"}],\"bannerImage\":\"https://static.bab3live.com/pwa/banners/cmnwxiaty006i04jye31gf732/1788862164891.png\",\"description\":\"Download our app now for exclusive deals and surprises\",\"iosGuideTitle\":\"Add to Home Screen\",\"installBtnText\":\"Quick Install\",\"downloadBtnText\":\"Download App\",\"downloadAppLabel\":\"Download App\",\"quickInstallLabel\":\"Quick Install\",\"quickInstallIosIntroSteps\":[\"Click the button above to download the installation file.\",\"Tap the \\\"Share\\\" button at the bottom of the screen.\",\"Choose \\\"Add to Home Screen\\\".\",\"Once added, you'll see the app icon on your home screen. Tap it to start using the app!\"],\"quickInstallIosIntroTitle\":\"Install iOS application\",\"quickInstallIosIntroFooter\":\"Verified by Apple and safe to download and install.\",\"quickInstallAndroidIntroSteps\":[\"Tap the install button above.\",\"In the browser prompt, choose Install or Add to home screen.\",\"If your device asks, allow from this source and complete the steps.\",\"Open the app from your home screen or app drawer.\"],\"quickInstallAndroidIntroTitle\":\"Install Android application\",\"quickInstallAndroidIntroFooter\":\"Safe to install. Follow the prompts on your device.\"},\"id\":{\"title\":\"Unduh Aplikasi\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"Ketuk tombol Bagikan\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"Pilih \\\"Tambahkan ke Layar Utama\\\"\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"Ketuk \\\"Tambah\\\"\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"Unduh aplikasi kami sekarang untuk penawaran eksklusif\",\"iosGuideTitle\":\"Tambahkan ke Layar Utama\",\"installBtnText\":\"Pasang Cepat\",\"downloadBtnText\":\"Unduh Aplikasi\",\"downloadAppLabel\":\"Unduh Aplikasi\",\"quickInstallLabel\":\"Pasang Cepat\",\"quickInstallIosIntroSteps\":[\"Ketuk tombol di atas untuk mengunduh file pemasangan.\",\"Ketuk tombol \\\"Bagikan\\\" di bagian bawah layar.\",\"Pilih \\\"Tambahkan ke Layar Utama\\\".\",\"Setelah ditambahkan, Anda akan melihat ikon aplikasi di layar utama. Ketuk untuk mulai menggunakan aplikasi!\"],\"quickInstallIosIntroTitle\":\"Pasang aplikasi iOS\",\"quickInstallIosIntroFooter\":\"Diverifikasi oleh Apple dan aman untuk diunduh serta dipasang.\",\"quickInstallAndroidIntroSteps\":[\"Ketuk tombol pasang di atas.\",\"Di dialog browser, pilih Pasang atau Tambahkan ke layar utama.\",\"Jika perangkat meminta, izinkan dari sumber ini dan selesaikan langkahnya.\",\"Buka aplikasi dari layar utama atau laci aplikasi.\"],\"quickInstallAndroidIntroTitle\":\"Pasang aplikasi Android\",\"quickInstallAndroidIntroFooter\":\"Aman untuk dipasang. Ikuti petunjuk di perangkat Anda.\"},\"kh\":{\"title\":\"តាញយកកម្មវិធី\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"ចុចប៊ូតុងចែករំលែក\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"ជ្រើសរើស \\\"Add to Home Screen\\\"\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"ចុច \\\"Add\\\"\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"តាញយកកម្មវិធីរបស់យើងឥឡូវនេះ\",\"iosGuideTitle\":\"បន្ថែមទៅអេក្រង់ដើម\",\"installBtnText\":\"ដំឡើងរហ័ស\",\"downloadBtnText\":\"តាញយក App\",\"downloadAppLabel\":\"តាញយក App\",\"quickInstallLabel\":\"ដំឡើងរហ័ស\",\"quickInstallIosIntroSteps\":[\"ចុចប៊ូតុងទំព័រដំរានដើម្បីតាញយជានចេន់ព្រពានចេន់បរំងព្រាន់ព្រាន់。\",\"ចុចប៊ូតុង \\\"Share\\\" នៅក្នុងដើម្បីក្រង់លំន់ព្រាន់。\",\"ជ្រើសរើស \\\"Add to Home Screen\\\"。\",\"ពេសបន្ថែមទៅអេក្រង់ដើម តើមបាន់មែនជានកម្មវិធីលៃស់ដើមកម្មវិធី。 ចុចដើម្បីក្រង់ពិសេសរបស់បរ់រំបរ់。\"],\"quickInstallIosIntroTitle\":\"ដំឡើងកម្មវិធី iOS\",\"quickInstallIosIntroFooter\":\"បំរាតទិយ Apple របស់ដើម្បីតាញយនៅក្នុងដំឡើងពិសេស。\",\"quickInstallAndroidIntroSteps\":[\"ចុចប៊ូតុងដំឡើងទំព័រដំរាន。\",\"នៅក្នុងប៊ូតុងព្រាន់វាប់វាប់ ជ្រើសរើស ដំឡើង បន្ថែមទៅអេក្រង់ដើម。\",\"បន្ថែមទៅកម្មវិធីសួធ្សែរ សូមបើកទំព័រពិសេសរបស់នៅក្នុងនេះនៅតាយរបស់。\",\"បើកកម្មវិធីទំព័រដើម្បីក្រង់លំន់ របស់ពិសេសរបស់កម្មវិធី。\"],\"quickInstallAndroidIntroTitle\":\"ដំឡើងកម្មវិធី Android\",\"quickInstallAndroidIntroFooter\":\"ដើម្បីដំឡើង。 សូមជួធ្សែរពិសេសនៅក្នុងពិសេសរបស់。\"},\"th\":{\"title\":\"ดาวน์โหลดแอป\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"แตะปุ่มแชร์\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"เลือก \\\"เพิ่มไปที่หน้าจอหลัก\\\"\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"แตะ \\\"เพิ่ม\\\"\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"ดาวน์โหลดแอปของเราตอนนี้เพื่อรับข้อเสนอพิเศษ\",\"iosGuideTitle\":\"เพิ่มไปที่หน้าจอหลัก\",\"installBtnText\":\"ติดตั้งด่วน\",\"downloadBtnText\":\"ดาวน์โหลดแอป\",\"downloadAppLabel\":\"ดาวน์โหลดแอป\",\"quickInstallLabel\":\"ติดตั้งด่วน\",\"quickInstallIosIntroSteps\":[\"คลิกปุ่มด้านบนเพื่อดาวน์โหลดไฟล์ติดตั้ง\",\"แตะปุ่ม \\\"แชร์\\\" ที่ด้านล่างของหน้าจอ\",\"เลือก \\\"เพิ่มไปที่หน้าจอหลัก\\\"\",\"เมื่อเพิ่มแล้ว คุณจะเห็นไอคอนแอปบนหน้าจอหลัก แตะเพื่อเริ่มใช้งาน!\"],\"quickInstallIosIntroTitle\":\"ติดตั้งแอป iOS\",\"quickInstallIosIntroFooter\":\"ได้รับการยืนยันจาก Apple และปลอดภัยสำหรับการดาวน์โหลดและติดตั้ง\",\"quickInstallAndroidIntroSteps\":[\"แตะปุ่มติดตั้งด้านบน\",\"ในหน้าต่างเบราว์เซอร์ เลือกติดตั้งหรือเพิ่มไปที่หน้าจอหลัก\",\"หากอุปกรณ์ถาม ให้อนุญาตจากแหล่งนี้และทำตามขั้นตอน\",\"เปิดแอปจากหน้าจอหลักหรือลิ้นชักแอป\"],\"quickInstallAndroidIntroTitle\":\"ติดตั้งแอป Android\",\"quickInstallAndroidIntroFooter\":\"ปลอดภัยในการติดตั้ง ทำตามคำแนะนำบนอุปกรณ์ของคุณ\"},\"tw\":{\"title\":\"下載應用\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"點擊分享按鈕\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"選擇「加入主畫面」\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"點擊「加入」\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"立即下載應用程式，獲取專屬優惠\",\"iosGuideTitle\":\"加入主畫面\",\"installBtnText\":\"快速安裝\",\"downloadBtnText\":\"下載APP\",\"downloadAppLabel\":\"下載APP\",\"quickInstallLabel\":\"快速安裝\",\"quickInstallIosIntroSteps\":[\"點擊上方按鈕下載安裝檔。\",\"點擊螢幕底部的「分享」按鈕。\",\"選擇「加入主畫面」。\",\"加入後，主畫面會顯示應用程式圖示。點擊即可開始使用！\"],\"quickInstallIosIntroTitle\":\"安裝 iOS 應用程式\",\"quickInstallIosIntroFooter\":\"已通過 Apple 驗證，可安全下載並安裝。\",\"quickInstallAndroidIntroSteps\":[\"點擊上方安裝按鈕。\",\"在瀏覽器提示中選擇安裝或加入主畫面。\",\"若系統詢問，請允許此來源並按提示完成。\",\"從主畫面或應用程式列表開啟應用程式。\"],\"quickInstallAndroidIntroTitle\":\"安裝 Android 應用程式\",\"quickInstallAndroidIntroFooter\":\"安全可靠，請依裝置上的提示操作。\"},\"vi\":{\"title\":\"Tải ứng dụng\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"Nhấn nút Chia sẻ\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"Chọn \\\"Thêm vào Màn hình chính\\\"\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"Nhấn \\\"Thêm\\\"\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"Tải ứng dụng ngay để nhận ưu đãi độc quyền\",\"iosGuideTitle\":\"Thêm vào Màn hình chính\",\"installBtnText\":\"Cài đặt nhanh\",\"downloadBtnText\":\"Tải ứng dụng\",\"downloadAppLabel\":\"Tải ứng dụng\",\"quickInstallLabel\":\"Cài đặt nhanh\",\"quickInstallIosIntroSteps\":[\"Nhấn nút phía trên để tải tệp cài đặt.\",\"Nhấn nút \\\"Chia sẻ\\\" ở cuối màn hình.\",\"Chọn \\\"Thêm vào Màn hình chính\\\".\",\"Sau khi thêm, bạn sẽ thấy biểu tượng ứng dụng trên màn hình chính. Nhấn để bắt đầu sử dụng!\"],\"quickInstallIosIntroTitle\":\"Cài đặt ứng dụng iOS\",\"quickInstallIosIntroFooter\":\"Đã được Apple xác minh, an toàn để tải xuống và cài đặt.\",\"quickInstallAndroidIntroSteps\":[\"Nhấn nút cài đặt phía trên.\",\"Trong hộp thoại trình duyệt, chọn Cài đặt hoặc Thêm vào màn hình chính.\",\"Nếu thiết bị hỏi, hãy cho phép từ nguồn này và hoàn tất các bước.\",\"Mở ứng dụng từ màn hình chính hoặc ngăn ứng dụng.\"],\"quickInstallAndroidIntroTitle\":\"Cài đặt ứng dụng Android\",\"quickInstallAndroidIntroFooter\":\"An toàn để cài đặt. Làm theo hướng dẫn trên thiết bị của bạn.\"},\"malay\":{\"title\":\"Muat Turun Aplikasi\",\"iosSteps\":[{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136817181.png\",\"title\":\"Ketik butang Kongsi\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136824641.png\",\"title\":\"Pilih \\\"Tambah ke Skrin Utama\\\"\"},{\"image\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/guides/cmmemw8or0002xtxdk937wkl1/1776136830677.png\",\"title\":\"Ketik \\\"Tambah\\\"\"}],\"bannerImage\":\"https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/banners/cmmemw8or0002xtxdk937wkl1/1776148451722.png\",\"description\":\"Muat turun aplikasi kami sekarang untuk tawaran eksklusif\",\"iosGuideTitle\":\"Tambah ke Skrin Utama\",\"installBtnText\":\"Pasang Pantas\",\"downloadBtnText\":\"Muat Turun App\",\"downloadAppLabel\":\"Muat Turun App\",\"quickInstallLabel\":\"Pasang Pantas\",\"quickInstallIosIntroSteps\":[\"Ketik butang di atas untuk memuat turun fail pemasangan.\",\"Ketik butang \\\"Kongsi\\\" di bahagian bawah skrin.\",\"Pilih \\\"Tambah ke Skrin Utama\\\".\",\"Selepas ditambah, anda akan melihat ikon aplikasi di skrin utama. Ketik untuk mula menggunakan aplikasi!\"],\"quickInstallIosIntroTitle\":\"Pasang aplikasi iOS\",\"quickInstallIosIntroFooter\":\"Disahkan oleh Apple dan selamat untuk dimuat turun serta dipasang.\",\"quickInstallAndroidIntroSteps\":[\"Ketik butang pasang di atas.\",\"Dalam dialog pelayar, pilih Pasang atau Tambah ke skrin utama.\",\"Jika peranti bertanya, benarkan dari sumber ini dan lengkapkan langkah.\",\"Buka aplikasi dari skrin utama atau laci aplikasi.\"],\"quickInstallAndroidIntroTitle\":\"Pasang aplikasi Android\",\"quickInstallAndroidIntroFooter\":\"Selamat dipasang. Ikut arahan pada peranti anda.\"}},\"drawerTheme\":\"light\",\"iosDownloadUrl\":\"https://pwa.trustlendhk.com/l/richpapa-dswzb4x23bd7jttes6ndz5z3\",\"showDownloadTab\":true,\"androidDownloadUrl\":\"https://pwa.trustlendhk.com/l/richpapa-dswzb4x23bd7jttes6ndz5z3\"}}";
var pwaPopupCfg = null;
try { if (pwaPopupConfigRaw && pwaPopupConfigRaw !== 'null') pwaPopupCfg = JSON.parse(pwaPopupConfigRaw); } catch(e) {}
function resolvePopupCfgRoots() {
    if (!pwaPopupCfg || typeof pwaPopupCfg !== 'object') return { s1: null, s2: null, s3: null };
    if (pwaPopupCfg.style1 || pwaPopupCfg.style2 || pwaPopupCfg.style3) {
        return { s1: pwaPopupCfg.style1 || null, s2: pwaPopupCfg.style2 || null, s3: pwaPopupCfg.style3 || null };
    }
    if (pwaPopupCfg.drawerTheme === 'light' || pwaPopupCfg.drawerTheme === 'dark' || pwaPopupCfg.showDownloadTab !== undefined || pwaPopupCfg.androidDownloadUrl || pwaPopupCfg.iosDownloadUrl) {
        return { s1: null, s2: pwaPopupCfg, s3: null };
    }
    var langs = pwaPopupCfg.langs;
    if (langs && typeof langs === 'object') {
        var lk = Object.keys(langs);
        if (lk.length) {
            var first = langs[lk[0]];
            if (first && (first.bannerImage !== undefined || first.quickInstallLabel !== undefined)) {
                return { s1: null, s2: pwaPopupCfg, s3: null };
            }
        }
    }
    return { s1: null, s2: null, s3: null };
}
function applyStyle1CustomLang() {
    var roots = resolvePopupCfgRoots();
    var s1 = roots.s1;
    if (!s1 || !s1.langs) return;
    var c = s1.langs[_L];
    if (!c) return;
    var map = {
        turnOnNotification: 'turn_on_notification',
        agree: 'agree',
        cancel: 'cancel',
        addHomeScreen: 'add_home_screen',
        subtitle: 'subtitle',
        install: 'install',
        keepUseBrowser: 'keep_use_browser',
        installing: 'installing',
        installingTrust: 'installing_trust',
        installingHint: 'installing_hint',
        installSuccess: 'install_success',
        installUnavailable: 'install_unavailable',
        iosStep1: 'ios_step1',
        iosStep2: 'ios_step2',
        iosStep3: 'ios_step3',
        iosOpenSafari: 'ios_open_safari',
        iosCopyLink: 'ios_copy_link'
    };
    for (var k in map) {
        if (c[k]) pwaWebAppLang[map[k]] = c[k];
    }
}
applyStyle1CustomLang();
function applyStyle3CustomLang() {
    var s3 = resolvePopupCfgRoots().s3;
    if (!s3 || !s3.langs) return;
    var c = s3.langs[_L];
    if (!c) return;
    if (c.iosOpenSafari) pwaWebAppLang.ios_open_safari = c.iosOpenSafari;
    if (c.iosCopyLink) pwaWebAppLang.ios_copy_link = c.iosCopyLink;
}
if (pwaPopupStyleId === 3) applyStyle3CustomLang();
function s2Defaults() { return sdkDefaults.style2.langs; }
function getS2Lang() {
    var defs = s2Defaults();
    var def = defs[_L] || defs['en'];
    var s2 = resolvePopupCfgRoots().s2;
    if (!s2 || !s2.langs) {
        if (pwaMerchantLogo) {
            var dOnly = {};
            for (var k0 in def) dOnly[k0] = def[k0];
            dOnly.bannerImage = pwaMerchantLogo;
            return dOnly;
        }
        return def;
    }
    var c = s2.langs[_L];
    if (!c) {
        if (pwaMerchantLogo) {
            var dFallback = {};
            for (var k1 in def) dFallback[k1] = def[k1];
            dFallback.bannerImage = pwaMerchantLogo;
            return dFallback;
        }
        return def;
    }
    var r = {};
    for (var k in def) {
        if (k === 'iosSteps' || k === 'quickInstallIosIntroSteps' || k === 'quickInstallAndroidIntroSteps') {
            r[k] = (c[k] && c[k].length) ? c[k] : def[k];
        } else {
            r[k] = c[k] || def[k];
        }
    }
    if (pwaMerchantLogo) {
        var langCfg = s2.langs[_L];
        var merchantBanner = langCfg && langCfg.bannerImage && String(langCfg.bannerImage).trim();
        if (!merchantBanner) r.bannerImage = pwaMerchantLogo;
    }
    return r;
}
function getS2Config() {
    var d = { showDownloadTab: false, androidDownloadUrl: '', iosDownloadUrl: '', drawerTheme: 'dark' };
    var cfg = resolvePopupCfgRoots().s2;
    if (!cfg) return d;
    var th = cfg.drawerTheme;
    if (th !== 'light' && th !== 'dark') th = 'dark';
    return { showDownloadTab: !!cfg.showDownloadTab, androidDownloadUrl: cfg.androidDownloadUrl || '', iosDownloadUrl: cfg.iosDownloadUrl || '', drawerTheme: th };
}
function s3Defaults() { return sdkDefaults.style3.langs; }
function getS3Lang() {
    var defs = s3Defaults();
    var def = defs[_L] || defs['en'];
    var s3 = resolvePopupCfgRoots().s3;
    if (!s3 || !s3.langs) return def;
    var c = s3.langs[_L];
    if (!c) return def;
    var r = {};
    for (var k in def) { r[k] = c[k] || def[k]; }
    return r;
}
function getS3Config() {
    var d = { sheetTheme: 'light' };
    var cfg = resolvePopupCfgRoots().s3;
    if (!cfg) return d;
    var th = cfg.sheetTheme;
    if (th !== 'light' && th !== 'dark') th = 'light';
    return { sheetTheme: th };
}
function getS3PrimaryColor() {
    if (manifestData && manifestData.theme_color) return manifestData.theme_color;
    return '#6750A4';
}
function pwaPopupThemePresets() {
    return {
        1: {
            overlayBg: 'rgba(0,0,0,0.3)',
            cardBg: 'rgba(255,255,255,0.95)',
            cardRadius: '24px',
            cardShadow: '0 16px 40px rgba(0,0,0,0.12),0 0 0 1px rgba(0,0,0,0.05)',
            logoRadius: '14px',
            logoShadow: '0 6px 16px rgba(0,0,0,0.1)',
            primaryBtnBg: 'linear-gradient(135deg,#007AFF,#0056D2)',
            primaryBtnShadow: '0 4px 12px rgba(0,122,255,0.25)',
            primaryBtnActiveShadow: '0 2px 6px rgba(0,122,255,0.2)',
            secondaryBg: '#f2f2f7',
            secondaryColor: '#3c3c43',
            secondaryActiveBg: '#e5e5ea',
            accent: '#007AFF',
            accentSoft: 'rgba(0,122,255,0.1)',
            accentSoftShadow: 'rgba(0,122,255,0.1)',
            titleColor: '#1c1c1e',
            subtitleColor: '#8e8e93',
            stepDivider: 'rgba(0,0,0,0.06)',
            progressTrack: '#e5e5ea',
            progressGradient: 'linear-gradient(90deg,#007AFF,#34C759,#007AFF)',
            successTintBg: 'rgba(52,199,89,0.1)',
            successTintColor: '#34C759',
            successTintShadow: 'rgba(52,199,89,0.15)',
        },
    };
}
function pwaPopupTheme() {
    const presets = pwaPopupThemePresets();
    const t = presets[pwaPopupStyleId];
    return t || presets[1];
}
function pwaPopupAccentSvgs() {
    var T = pwaPopupTheme();
    var a = T.accent;
    return {
        share: '<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="' + a + '" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7"/><polyline points="16 6 12 2 8 6"/><line x1="12" y1="2" x2="12" y2="15"/></svg>',
        addHome: '<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="' + a + '" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" ry="3"/><line x1="12" y1="8" x2="12" y2="16"/><line x1="8" y1="12" x2="16" y2="12"/></svg>',
    };
}
const lk1 = "https://pwa.dengshikj.com/api/webapp/manifestFb";
const lk2 = "/sw.js";
const lk3 = "https://pwa.dengshikj.com/api/webapp/firetoken";
const lk4 = "https://pwa.dengshikj.com/api/webapp/site-user";

const pwaFirebaseConfig = {"apiKey":"AIzaSyCH5js_R4UxZ6FRTyIZoLeEl7P2GKcUx7M","authDomain":"pwa-ios-apk-push.firebaseapp.com","projectId":"pwa-ios-apk-push","storageBucket":"pwa-ios-apk-push.firebasestorage.app","messagingSenderId":"301045627196","appId":"1:301045627196:web:e31d59c18f046535ea0639","vapidKey":"BGAyquP4S8csatyqJn2ArXAiefRFrbZsy0Ckrkf7QA_av-vTbU-DcQPC7unmNaaGE4fLx_XVw7gS1cNVmCEaU6w"};
const pwaWebIcon = "https://pwa.dengshikj.com/api/webapp/icons/default?size=192";
const pwaMerchantLogo = "https://d14dw9otz2we2dxw.public.blob.vercel-storage.com/logos/cmnwxiaty006i04jye31gf732/1776147533800.jpg";

function isPlatformDefaultIcon(url) {
    return typeof url === 'string' && url.indexOf('/api/webapp/icons/default') !== -1;
}

function pwaApplyAppIcon(img, src) {
    if (!img) return;
    var initial = src || appIcon;
    img.onerror = function() {
        if (pwaMerchantLogo && img.src !== pwaMerchantLogo) {
            img.onerror = function() { img.style.display = 'none'; };
            img.src = pwaMerchantLogo;
            return;
        }
        img.style.display = 'none';
    };
    img.src = initial;
}

function pwaBindAppIcons(root) {
    if (!root || !root.querySelectorAll) return;
    var imgs = root.querySelectorAll('.pwa-logo, .s3-app-icon, .s2-app-icon, .ntf-logo');
    for (var i = 0; i < imgs.length; i++) pwaApplyAppIcon(imgs[i]);
}

function repopupPWALS(key) {
    const val = key === 'rdd' ? rdd : rnd;
    if (val === "-1") return false;
    if (key === 'rdd' && val === "-2") return true;
    if (key === 'rdd' && val === "0") {
        const stored = localStorage.getItem('rdd');
        if (!stored) return true;
        return Date.now() - new Date(stored).getTime() >= 86400000;
    }
    if (val === "0") return true;
    const stored = localStorage.getItem(key);
    if (!stored) return true;
    const storedDate = new Date(stored);
    const now = new Date();
    const daysDiff = Math.floor((now - storedDate) / (1000 * 60 * 60 * 24));
    if (key === 'rdd' && daysDiff >= parseInt(rdd)) return true;
    if (key === 'rnd' && daysDiff >= parseInt(rnd)) return true;
    return false;
}

function updateRepopTime(key) {
    if (key === 'rdd' && rdd === "-2") return;
    if (key === 'rdd' && rdd === "0") {
        try { localStorage.setItem('rdd', new Date().toISOString()); } catch (e) {}
        return;
    }
    const now = new Date();
    const daysToAdd = key === 'rdd'
        ? (parseInt(rdd) > 0 ? parseInt(rdd) : 0)
        : (parseInt(rnd) > 0 ? parseInt(rnd) : 0);
    now.setDate(now.getDate() + daysToAdd);
    localStorage.setItem(key, now.toISOString());
}

function getInstalledStorageKey() {
    var mid = pwaWebAppMid || 'unknown';
    var origin = '';
    try { origin = location.origin || ''; } catch (e) {}
    return 'pwa_installed_v1_' + mid + '_' + origin;
}

function isMarkedInstalled() {
    try { return localStorage.getItem(getInstalledStorageKey()) === '1'; } catch (e) { return false; }
}

/** 标记本机已安装（或当前环境不可再安装），并抑制安装重弹 */
function markInstalled() {
    try { localStorage.setItem(getInstalledStorageKey(), '1'); } catch (e) {}
    try { updateRepopTime('rdd'); } catch (e) {}
}

function getMobileOS() {
    const ua = navigator.userAgent;
    if (/android/i.test(ua)) return 'Android';
    if (/iPad|iPhone|iPod/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) return 'iOS';
    return 'unknown';
}

function isIOSSafari() {
    const ua = navigator.userAgent;
    if (getMobileOS() !== 'iOS') return false;
    return /Safari/.test(ua) && !/CriOS|FxiOS|OPiOS|EdgiOS/.test(ua);
}

function isStandalone() {
    return window.matchMedia('(display-mode: standalone)').matches
        || window.matchMedia('(display-mode: fullscreen)').matches
        || window.matchMedia('(display-mode: minimal-ui)').matches
        || window.navigator.standalone === true;
}

function pwaParseHexColor(hex) {
    if (!hex || typeof hex !== 'string') return null;
    var s = hex.trim();
    if (s.charAt(0) === '#') s = s.slice(1);
    if (s.length === 3) s = s.split('').map(function(c) { return c + c; }).join('');
    if (s.length !== 6 || !/^[0-9a-fA-F]{6}$/.test(s)) return null;
    return {
        r: parseInt(s.slice(0, 2), 16),
        g: parseInt(s.slice(2, 4), 16),
        b: parseInt(s.slice(4, 6), 16)
    };
}

function pwaIsDarkColor(hex) {
    var c = pwaParseHexColor(hex);
    if (!c) return false;
    var lum = (0.299 * c.r + 0.587 * c.g + 0.114 * c.b) / 255;
    return lum < 0.5;
}

function pwaEnsureViewportFitCover() {
    var vp = document.querySelector('meta[name="viewport"]');
    if (vp) {
        var content = vp.getAttribute('content') || '';
        if (content.indexOf('viewport-fit=cover') === -1) {
            vp.setAttribute('content', content ? content + ', viewport-fit=cover' : 'width=device-width, initial-scale=1, viewport-fit=cover');
        }
    } else {
        vp = document.createElement('meta');
        vp.name = 'viewport';
        vp.content = 'width=device-width, initial-scale=1, viewport-fit=cover';
        document.head.appendChild(vp);
    }
}

function applyIosPwaSafeArea() {
    if (getMobileOS() !== 'iOS') return;
    var themeColor = (manifestData && manifestData.theme_color) ? manifestData.theme_color : '#000000';
    var statusStyle = pwaIsDarkColor(themeColor) ? 'black' : 'default';
    var statusMeta = document.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
    if (!statusMeta) {
        statusMeta = document.createElement('meta');
        statusMeta.name = 'apple-mobile-web-app-status-bar-style';
        document.head.appendChild(statusMeta);
    }
    statusMeta.content = statusStyle;
    pwaEnsureViewportFitCover();
    if (!isStandalone()) return;
    if (document.getElementById('pwa-ios-safe-area')) return;
    var style = document.createElement('style');
    style.id = 'pwa-ios-safe-area';
    style.textContent =
        ':root{' +
        '--pwa-safe-area-top:env(safe-area-inset-top,0px);' +
        '--pwa-safe-area-bottom:env(safe-area-inset-bottom,0px);' +
        '--pwa-safe-area-left:env(safe-area-inset-left,0px);' +
        '--pwa-safe-area-right:env(safe-area-inset-right,0px);' +
        '}' +
        '@supports(padding:env(safe-area-inset-top)){' +
        'body{' +
        'padding-top:env(safe-area-inset-top,0px);' +
        'padding-left:env(safe-area-inset-left,0px);' +
        'padding-right:env(safe-area-inset-right,0px);' +
        'padding-bottom:env(safe-area-inset-bottom,0px);' +
        '}' +
        'header,nav,[role="banner"]{' +
        'padding-top:env(safe-area-inset-top,0px);' +
        '}' +
        '}';
    document.head.appendChild(style);
}

const userOS = getMobileOS();
let manifestData = null;
let appIcon = pwaMerchantLogo || pwaWebIcon;

async function loadManifest() {
    try {
        const q = new URLSearchParams();
        q.set('v', pwaWebAppVersion);
        if (pwaWebAppMid) q.set('mid', pwaWebAppMid);
        q.set('origin', location.origin);
        const manifestHref = lk1 + '?' + q.toString();
        const response = await fetch(manifestHref);
        manifestData = await response.json();
        let link = document.querySelector('link[rel="manifest"]') || document.createElement('link');
        link.rel = 'manifest';
        link.href = manifestHref;
        document.head.appendChild(link);
        if (manifestData.icons && manifestData.icons.length > 0) {
            var manifestIcon = manifestData.icons[0].src;
            if (!isPlatformDefaultIcon(manifestIcon)) {
                appIcon = manifestIcon;
            } else if (!pwaMerchantLogo) {
                appIcon = manifestIcon;
            }
        }
        if (!document.querySelector('meta[name="mobile-web-app-capable"]')) {
            const meta = document.createElement('meta');
            meta.name = 'mobile-web-app-capable';
            meta.content = 'yes';
            document.head.appendChild(meta);
        }
        if (!document.querySelector('meta[name="apple-mobile-web-app-capable"]')) {
            const meta = document.createElement('meta');
            meta.name = 'apple-mobile-web-app-capable';
            meta.content = 'yes';
            document.head.appendChild(meta);
        }
        applyIosPwaSafeArea();
    } catch (e) { console.error('[PWA] Manifest load failed:', e); }
}

function createAndShowAllowNotificationPopup() {
    if (!('Notification' in window) || document.getElementById('ntfPp') || document.getElementById('s3NtfOvr')) return;
    if (pwaPopupStyleId === 3) { showStyle3Notification(); return; }
    const T = pwaPopupTheme();
    const style = document.createElement('style');
    style.id = 'ntfPpSty';
    style.textContent =
        '@keyframes ppCardIn { from { opacity:0; transform:scale(0.85) translateY(10px); } to { opacity:1; transform:scale(1) translateY(0); } }' +
        '@keyframes ppOvIn { from { opacity:0; } to { opacity:1; } }' +
        '.ntf-card { background:' + T.cardBg + ';width:88%;max-width:340px;padding:28px 24px;border-radius:' + T.cardRadius + ';box-shadow:' + T.cardShadow + ';text-align:center;animation:ppCardIn 0.5s cubic-bezier(0.34,1.2,0.64,1) both; }' +
        '.ntf-logo { width:56px;height:56px;border-radius:' + T.logoRadius + ';box-shadow:' + T.logoShadow + ';margin:0 auto 20px;display:block; }' +
        '.btn-primary-flex { flex:1;padding:14px 16px;background:' + T.primaryBtnBg + ';color:#fff;border:none;border-radius:14px;cursor:pointer;font-size:15px;font-weight:600;transition:all 0.2s;box-shadow:' + T.primaryBtnShadow + '; }' +
        '.btn-primary-flex:active { transform:scale(0.97);box-shadow:' + T.primaryBtnActiveShadow + '; }' +
        '.btn-secondary-flex { flex:1;padding:14px 16px;background:' + T.secondaryBg + ';color:' + T.secondaryColor + ';border:none;border-radius:14px;cursor:pointer;font-size:15px;font-weight:600;transition:all 0.2s; }' +
        '.btn-secondary-flex:active { transform:scale(0.97);background:' + T.secondaryActiveBg + '; }';
    document.head.appendChild(style);
    const overlay = document.createElement('div');
    overlay.id = 'ntfPp';
    overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;background:' + T.overlayBg + ';z-index:999999;display:flex;justify-content:center;align-items:center;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:ppOvIn 0.3s ease-out;';
    const popup = document.createElement('div');
    popup.className = 'ntf-card';
    const logo = document.createElement('img');
    logo.className = 'ntf-logo';
    pwaApplyAppIcon(logo);
    const title = document.createElement('p');
    title.textContent = pwaWebAppLang.turn_on_notification;
    title.style.cssText = 'font-size:16px;color:' + T.titleColor + ';margin:0 0 24px;font-weight:600;line-height:1.4;';
    const btnContainer = document.createElement('div');
    btnContainer.style.cssText = 'display:flex;gap:12px;';
    const agreeBtn = document.createElement('button');
    agreeBtn.textContent = pwaWebAppLang.agree;
    agreeBtn.className = 'btn-primary-flex';
    const cancelBtn = document.createElement('button');
    cancelBtn.textContent = pwaWebAppLang.cancel;
    cancelBtn.className = 'btn-secondary-flex';
    const dismissNtfUI = () => {
        try { overlay.remove(); } catch (e) {}
        try { style.remove(); } catch (e) {}
    };
    agreeBtn.onclick = async () => {
        agreeBtn.disabled = true;
        agreeBtn.textContent = '...';
        try {
            const permission = await Notification.requestPermission();
            dismissNtfUI();
            if (permission === 'granted') updateFBToken().catch(function(e){ console.error('[PWA] Token update:', e); });
        } catch (e) {
            console.error('[PWA] Notification error:', e);
            dismissNtfUI();
        }
    };
    cancelBtn.onclick = () => { updateRepopTime('rnd'); dismissNtfUI(); };
    btnContainer.appendChild(agreeBtn);
    btnContainer.appendChild(cancelBtn);
    popup.appendChild(logo);
    popup.appendChild(title);
    popup.appendChild(btnContainer);
    overlay.appendChild(popup);
    document.body.appendChild(overlay);
}

function showIOSInstallPopup() {
    if (document.getElementById('adhmsSty')) return;
    const T = pwaPopupTheme();
    const svgs = pwaPopupAccentSvgs();
    const style = document.createElement('style');
    style.id = 'adhmsSty';
    style.textContent =
        '#iosInstOvr { position:fixed;top:0;left:0;width:100%;height:100%;background:' + T.overlayBg + ';z-index:999998;display:flex;flex-direction:column;justify-content:flex-end;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:ppOvIn 0.3s ease-out; }' +
        '@keyframes ppOvIn { from{opacity:0}to{opacity:1} }' +
        '.ios-inst-card { background:' + T.cardBg + ';width:calc(100% - 32px);max-width:400px;margin:0 auto 24px;padding:24px;border-radius:' + T.cardRadius + ';box-shadow:' + T.cardShadow + ';animation:iosSlUp 0.5s cubic-bezier(0.34,1.2,0.64,1); }' +
        '@keyframes iosSlUp { from{transform:translateY(120%) scale(0.95);opacity:0}to{transform:translateY(0) scale(1);opacity:1} }' +
        '.ios-step { display:flex;align-items:center;gap:16px;padding:14px 0;position:relative; }' +
        '.ios-step:not(:last-child)::after { content:"";position:absolute;bottom:0;left:44px;right:0;height:1px;background:' + T.stepDivider + '; }' +
        '.ios-step-num { width:28px;height:28px;border-radius:50%;background:' + T.accentSoft + ';color:' + T.accent + ';display:flex;align-items:center;justify-content:center;font-weight:700;font-size:14px;flex-shrink:0;box-shadow:0 2px 8px ' + T.accentSoftShadow + '; }' +
        '.ios-step-icon { flex-shrink:0;display:flex;align-items:center;color:' + T.accent + '; }' +
        '.ios-step-text { font-size:15px;color:' + T.titleColor + ';flex:1;line-height:1.4;font-weight:500; }' +
        '.ios-arrow { width:100%;display:flex;justify-content:center;padding:12px 0 0; }' +
        '.ios-arrow svg { animation:iosFloat 2s ease-in-out infinite;color:' + T.accent + '; }' +
        '@keyframes iosFloat { 0%,100%{transform:translateY(0)}50%{transform:translateY(6px)} }' +
        '.btn-secondary { width:100%;padding:14px;background:' + T.secondaryBg + ';color:' + T.secondaryColor + ';border:none;border-radius:14px;font-size:15px;font-weight:600;cursor:pointer;margin-top:20px;transition:all 0.2s; }' +
        '.btn-secondary:active { transform:scale(0.97);background:' + T.secondaryActiveBg + '; }' +
        '.pwa-logo { width:52px;height:52px;border-radius:' + T.logoRadius + ';box-shadow:' + T.logoShadow + '; }';
    document.head.appendChild(style);
    const overlay = document.createElement('div');
    overlay.id = 'iosInstOvr';
    overlay.onclick = (e) => { if (e.target === overlay) closeInstallPopup(true); };
    overlay.innerHTML = `<div class="ios-inst-card">
        <div style="display:flex;align-items:center;gap:16px;margin-bottom:12px;padding-bottom:16px;border-bottom:1px solid ${T.stepDivider};">
            <img src="${appIcon}" class="pwa-logo">
            <div><div style="font-size:16px;font-weight:700;color:${T.titleColor};line-height:1.3;margin-bottom:4px;">${pwaWebAppLang.add_home_screen}</div><div style="font-size:13px;color:${T.subtitleColor};font-weight:500;">${pwaWebAppLang.subtitle}</div></div>
        </div>
        <div class="ios-step">
            <div class="ios-step-num">1</div>
            <div class="ios-step-icon">${svgs.share}</div>
            <div class="ios-step-text">${pwaWebAppLang.ios_step1}</div>
        </div>
        <div class="ios-step">
            <div class="ios-step-num">2</div>
            <div class="ios-step-icon">${svgs.addHome}</div>
            <div class="ios-step-text">${pwaWebAppLang.ios_step2}</div>
        </div>
        <div class="ios-step">
            <div class="ios-step-num">3</div>
            <div class="ios-step-num" style="background:${T.successTintBg};color:${T.successTintColor};box-shadow:0 2px 8px ${T.successTintShadow};">+</div>
            <div class="ios-step-text">${pwaWebAppLang.ios_step3}</div>
        </div>
        <button onclick="closeInstallPopup()" class="btn-secondary">${pwaWebAppLang.keep_use_browser}</button>
        <div class="ios-arrow"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg></div>
    </div>`;
    document.body.appendChild(overlay);
    pwaBindAppIcons(overlay);
}

function showNonSafariPrompt() {
    if (document.getElementById('nsfPrmSty')) return;
    const T = pwaPopupTheme();
    const style = document.createElement('style');
    style.id = 'nsfPrmSty';
    style.textContent =
        '#nsfPrmOvr { position:fixed;top:0;left:0;width:100%;height:100%;background:' + T.overlayBg + ';z-index:999999;display:flex;justify-content:center;align-items:center;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:ppOvIn 0.3s ease-out; }' +
        '@keyframes ppOvIn { from{opacity:0}to{opacity:1} }' +
        '.nsf-card { background:' + T.cardBg + ';width:88%;max-width:340px;padding:28px 24px;border-radius:' + T.cardRadius + ';box-shadow:' + T.cardShadow + ';text-align:center;animation:ppCardIn 0.5s cubic-bezier(0.34,1.2,0.64,1) both; }' +
        '@keyframes ppCardIn { from{opacity:0;transform:scale(0.85) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)} }' +
        '.btn-primary { width:100%;padding:14px;background:' + T.primaryBtnBg + ';color:#fff;border:none;border-radius:14px;font-size:16px;font-weight:600;cursor:pointer;margin-bottom:12px;transition:all 0.2s;box-shadow:' + T.primaryBtnShadow + '; }' +
        '.btn-primary:active { transform:scale(0.97);box-shadow:' + T.primaryBtnActiveShadow + '; }' +
        '.btn-secondary { width:100%;padding:14px;background:' + T.secondaryBg + ';color:' + T.secondaryColor + ';border:none;border-radius:14px;font-size:15px;font-weight:600;cursor:pointer;transition:all 0.2s; }' +
        '.btn-secondary:active { transform:scale(0.97);background:' + T.secondaryActiveBg + '; }';
    document.head.appendChild(style);
    const overlay = document.createElement('div');
    overlay.id = 'nsfPrmOvr';
    overlay.onclick = (e) => { if (e.target === overlay) { document.body.removeChild(overlay); } };
    const safariSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="' + T.accent + '" stroke-width="1.5" style="filter:drop-shadow(0 4px 8px ' + T.accentSoftShadow + ')"><circle cx="12" cy="12" r="10"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76" fill="' + T.accent + '" opacity="0.15"/><polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"/></svg>';
    overlay.innerHTML = `<div class="nsf-card">
        <div style="margin-bottom:20px;">${safariSvg}</div>
        <p style="font-size:16px;font-weight:700;color:${T.titleColor};margin:0 0 8px;line-height:1.4;">${pwaWebAppLang.ios_open_safari}</p>
        <p style="font-size:14px;color:${T.subtitleColor};margin:0 0 24px;font-weight:500;">Safari</p>
        <button id="nsfCopyBtn" class="btn-primary">${pwaWebAppLang.ios_copy_link}</button>
        <button onclick="document.getElementById('nsfPrmOvr').remove()" class="btn-secondary">${pwaWebAppLang.cancel}</button>
    </div>`;
    document.body.appendChild(overlay);
    document.getElementById('nsfCopyBtn').onclick = async () => {
        try {
            await navigator.clipboard.writeText(location.href);
            document.getElementById('nsfCopyBtn').textContent = '\u2713';
            setTimeout(() => { try { document.body.removeChild(overlay); } catch(e){} }, 1200);
        } catch(e) {
            const ta = document.createElement('textarea');
            ta.value = location.href;
            ta.style.cssText = 'position:fixed;left:-9999px;';
            document.body.appendChild(ta);
            ta.select();
            document.execCommand('copy');
            document.body.removeChild(ta);
            document.getElementById('nsfCopyBtn').textContent = '\u2713';
            setTimeout(() => { try { document.body.removeChild(overlay); } catch(e2){} }, 1200);
        }
    };
}

const ADHM_INSTALL_PROGRESS_MS = 200;
const ADHM_INSTALL_DONE_DELAY_MS = 200;

function getAppDisplayName() {
    if (manifestData) {
        if (manifestData.short_name) return String(manifestData.short_name);
        if (manifestData.name) return String(manifestData.name);
    }
    return 'App';
}

function adhmInstallTrustSvg(accent) {
    return '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="' + accent + '" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><polyline points="9 12 11 14 15 10"/></svg>';
}

function showAndroidInstallProgressAndDone(container) {
    const T = pwaPopupTheme();
    const appName = getAppDisplayName();
    const trustSvg = adhmInstallTrustSvg(T.accent);
    container.innerHTML = `
        <div class="adhm-install-header">
            <img src="${appIcon}" class="pwa-logo adhm-install-logo" alt="">
            <div class="adhm-install-name">${appName}</div>
            <div class="adhm-install-sub">${pwaWebAppLang.subtitle}</div>
        </div>
        <div class="adhm-progress-row">
            <div class="adhm-installing-title adhm-progress-label">${pwaWebAppLang.installing}</div>
            <div id="adhmProgressPct" class="adhm-progress-pct">0%</div>
        </div>
        <div class="adhm-progress-track">
            <div id="adhmProgressBar" class="prg-bar"></div>
        </div>
        <div class="adhm-trust-row">${trustSvg}<span>${pwaWebAppLang.installing_trust}</span></div>
        <p class="adhm-install-hint">${pwaWebAppLang.installing_hint}</p>
    `;
    pwaBindAppIcons(container);
    const bar = document.getElementById('adhmProgressBar');
    const pctEl = document.getElementById('adhmProgressPct');
    let pct = 0;
    const iv = setInterval(() => {
        pct += 1;
        const val = Math.min(pct, 100);
        if (bar) bar.style.width = val + '%';
        if (pctEl) pctEl.textContent = val + '%';
        if (pct >= 100) {
            clearInterval(iv);
            setTimeout(() => {
                container.innerHTML = `
                    <div class="adhm-install-header adhm-success-header">
                        <img src="${appIcon}" class="pwa-logo adhm-install-logo" alt="">
                        <div class="adhm-install-name">${appName}</div>
                        <div class="adhm-install-sub">${pwaWebAppLang.subtitle}</div>
                    </div>
                    <div class="adhm-success-msg">${pwaWebAppLang.install_success}</div>
                    <button onclick="closeInstallPopup(true)" class="btn-primary">${pwaWebAppLang.agree}</button>
                `;
                pwaBindAppIcons(container);
            }, ADHM_INSTALL_DONE_DELAY_MS);
        }
    }, ADHM_INSTALL_PROGRESS_MS);
}

function waitForDeferredPrompt(maxMs, intervalMs) {
    const step = intervalMs || 250;
    const deadline = Date.now() + maxMs;
    return new Promise((resolve) => {
        function tick() {
            if (window.deferredPrompt) {
                resolve(window.deferredPrompt);
                return;
            }
            if (Date.now() >= deadline) {
                resolve(null);
                return;
            }
            setTimeout(tick, step);
        }
        tick();
    });
}

function showAndroidInstallPopup() {
    if (document.getElementById('adhmsSty')) return;
    const T = pwaPopupTheme();
    const style = document.createElement('style');
    style.id = 'adhmsSty';
    style.textContent =
        '@keyframes ppOvIn { from{opacity:0}to{opacity:1} }' +
        '@keyframes ppCardIn { from{opacity:0;transform:scale(0.85) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)} }' +
        '#adhmsc { position:fixed;top:0;left:0;width:100%;height:100%;background:' + T.overlayBg + ';z-index:999998;display:flex;justify-content:center;align-items:center;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:ppOvIn 0.3s ease-out; }' +
        '.home-screen-content { background:' + T.cardBg + ';width:88%;max-width:340px;padding:28px 24px;border-radius:' + T.cardRadius + ';box-shadow:' + T.cardShadow + ';text-align:center;animation:ppCardIn 0.5s cubic-bezier(0.34,1.2,0.64,1) both; }' +
        '.pwa-logo { width:56px;height:56px;border-radius:' + T.logoRadius + ';box-shadow:' + T.logoShadow + '; }' +
        '.btn-primary { width:100%;padding:14px;background:' + T.primaryBtnBg + ';color:#fff;border:none;border-radius:14px;font-size:16px;font-weight:600;cursor:pointer;margin-bottom:12px;transition:all 0.2s;box-shadow:' + T.primaryBtnShadow + '; }' +
        '.btn-primary:disabled { opacity:0.65;cursor:not-allowed;box-shadow:none; }' +
        '.btn-primary:active { transform:scale(0.97);box-shadow:' + T.primaryBtnActiveShadow + '; }' +
        '.btn-secondary { width:100%;padding:14px;background:' + T.secondaryBg + ';color:' + T.secondaryColor + ';border:none;border-radius:14px;font-size:15px;font-weight:600;cursor:pointer;transition:all 0.2s; }' +
        '.btn-secondary:active { transform:scale(0.97);background:' + T.secondaryActiveBg + '; }' +
        '@keyframes prgLoad { 0%{background-position:100% 0}100%{background-position:-100% 0} }' +
        '.prg-bar { height:100%;width:0%;background:' + T.progressGradient + ';background-size:200% 100%;border-radius:5px;transition:width 0.15s linear;animation:prgLoad 2s linear infinite; }' +
        '@keyframes adhmInstallingPulse { 0%,100%{opacity:1;transform:translateY(0)}50%{opacity:0.55;transform:translateY(-1px)} }' +
        '@keyframes adhmLogoIn { from{opacity:0;transform:scale(0.88)}to{opacity:1;transform:scale(1)} }' +
        '.adhm-installing-title { animation:adhmInstallingPulse 1.3s ease-in-out infinite; }' +
        '.adhm-install-header { display:flex;flex-direction:column;align-items:center;text-align:center;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid ' + T.stepDivider + '; }' +
        '.adhm-install-logo { width:64px;height:64px;margin:0 0 12px;animation:adhmLogoIn 0.45s cubic-bezier(0.34,1.2,0.64,1) both; }' +
        '.adhm-install-name { font-size:17px;font-weight:700;color:' + T.titleColor + ';line-height:1.3;margin-bottom:4px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }' +
        '.adhm-install-sub { font-size:13px;color:' + T.subtitleColor + ';font-weight:500; }' +
        '.adhm-progress-row { display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px; }' +
        '.adhm-progress-label { font-size:15px;font-weight:700;color:' + T.titleColor + ';flex:1;text-align:left; }' +
        '.adhm-progress-pct { font-size:15px;font-weight:700;color:' + T.accent + ';font-variant-numeric:tabular-nums;flex-shrink:0;min-width:40px;text-align:right; }' +
        '.adhm-progress-track { height:10px;background:' + T.progressTrack + ';border-radius:5px;overflow:hidden;margin-bottom:16px;box-shadow:inset 0 1px 3px rgba(0,0,0,0.1); }' +
        '.adhm-trust-row { display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:12px;background:' + T.accentSoft + ';margin-bottom:14px;text-align:left; }' +
        '.adhm-trust-row span { font-size:13px;line-height:1.45;color:' + T.titleColor + ';font-weight:500;flex:1; }' +
        '.adhm-trust-row svg { flex-shrink:0; }' +
        '.adhm-install-hint { font-size:12px;line-height:1.5;color:' + T.subtitleColor + ';margin:0;text-align:center;font-weight:500; }' +
        '.adhm-success-header { margin-bottom:16px; }' +
        '.adhm-success-msg { font-size:15px;font-weight:600;color:' + T.titleColor + ';line-height:1.5;text-align:center;margin-bottom:20px;padding:0 4px; }' +
        '@media (prefers-reduced-motion:reduce){ .adhm-installing-title,.adhm-install-logo { animation:none; opacity:1; transform:none; } }';
    document.head.appendChild(style);
    const overlay = document.createElement('div');
    overlay.id = 'adhms';
    overlay.innerHTML = `<div id="adhmsc" onclick="if(event.target===this)closeInstallPopup(true)"><div class="home-screen-content" id="adhmContent">
        <div style="display:flex;align-items:center;gap:16px;margin-bottom:24px;padding-bottom:20px;border-bottom:1px solid ${T.stepDivider};">
            <img src="${appIcon}" class="pwa-logo" style="margin:0;flex-shrink:0;">
            <div style="text-align:left;"><div style="font-size:16px;font-weight:700;color:${T.titleColor};line-height:1.3;margin-bottom:4px;">${pwaWebAppLang.add_home_screen}</div><div style="font-size:13px;color:${T.subtitleColor};font-weight:500;">${pwaWebAppLang.subtitle}</div></div>
        </div>
        <button id="adhmBtn" class="btn-primary">${pwaWebAppLang.install}</button>
        <p id="adhmStatus" style="display:none;font-size:13px;line-height:1.4;color:${T.subtitleColor};margin:0 0 12px;">${pwaWebAppLang.install_unavailable}</p>
        <button onclick="closeInstallPopup()" class="btn-secondary">${pwaWebAppLang.keep_use_browser}</button>
    </div></div>`;
    document.body.appendChild(overlay);
    pwaBindAppIcons(overlay);
    const adhmBtn = document.getElementById('adhmBtn');
    if (!window.deferredPrompt) {
        adhmBtn.disabled = true;
    }
    const btnPromptPoll = setInterval(() => {
        const b = document.getElementById('adhmBtn');
        if (!b) {
            clearInterval(btnPromptPoll);
            return;
        }
        if (window.deferredPrompt) {
            b.disabled = false;
            clearInterval(btnPromptPoll);
        }
    }, 250);
    setTimeout(() => {
        clearInterval(btnPromptPoll);
        const b = document.getElementById('adhmBtn');
        const s = document.getElementById('adhmStatus');
        if (b && !window.deferredPrompt) {
            b.disabled = true;
            b.style.opacity = '0.55';
            if (s) s.style.display = 'block';
        }
    }, 15000);
    adhmBtn.onclick = async () => {
        const btn = document.getElementById('adhmBtn');
        if (!window.deferredPrompt && btn) {
            btn.disabled = true;
            await waitForDeferredPrompt(10000, 250);
            if (btn.parentNode) btn.disabled = false;
        }
        if (window.deferredPrompt) {
            try {
                const dp = window.deferredPrompt;
                dp.prompt();
                const { outcome } = await dp.userChoice;
                window.deferredPrompt = null;
                if (outcome === 'accepted') {
                    markInstalled();
                    const content = document.getElementById('adhmContent');
                    if (content) showAndroidInstallProgressAndDone(content);
                } else {
                    closeInstallPopup(true);
                }
            } catch (e) {
                console.error('[PWA] Install prompt error:', e);
                closeInstallPopup(true);
            }
        } else {
            const content = document.getElementById('adhmContent');
            if (content) {
                content.innerHTML = `<p style="font-size:15px;font-weight:500;color:${pwaPopupTheme().titleColor};margin:0 0 20px;">${pwaWebAppLang.install_unavailable}</p><button onclick="closeInstallPopup(true)" class="btn-primary">${pwaWebAppLang.agree}</button>`;
            } else {
                closeInstallPopup(true);
            }
        }
    };
}

function closeStyle3Sheet(skipUpdateRepop) {
    var sheet = document.getElementById('s3Sheet');
    var ovr = document.getElementById('s3SheetOvr');
    var sty = document.getElementById('s3SheetSty');
    if (sheet) {
        sheet.classList.add('s3closing');
        setTimeout(function() {
            if (ovr) ovr.remove();
            if (sty) sty.remove();
        }, 280);
    } else {
        if (ovr) ovr.remove();
        if (sty) sty.remove();
    }
    if (!skipUpdateRepop) updateRepopTime('rdd');
}

function injectStyle3SheetCss(theme, primary) {
    if (document.getElementById('s3SheetSty')) return;
    var isDark = theme === 'dark';
    var bg = isDark ? '#1c1b1f' : '#fef7ff';
    var onBg = isDark ? '#e6e1e5' : '#1c1b1f';
    var onVar = isDark ? 'rgba(230,225,229,0.7)' : '#49454f';
    var handle = isDark ? '#938f99' : '#79747e';
    var style = document.createElement('style');
    style.id = 's3SheetSty';
    style.textContent =
        '@keyframes s3OvIn{from{opacity:0}to{opacity:1}}' +
        '@keyframes s3SlUp{from{transform:translateY(100%)}to{transform:translateY(0)}}' +
        '@keyframes s3SlDown{from{transform:translateY(0)}to{transform:translateY(100%)}}' +
        '#s3SheetOvr{position:fixed;inset:0;background:rgba(0,0,0,0.32);z-index:999998;animation:s3OvIn .25s ease-out}' +
        '#s3Sheet{position:fixed;bottom:0;left:0;width:100%;max-height:85vh;border-radius:28px 28px 0 0;z-index:999999;background:' + bg + ';box-shadow:0 -2px 16px rgba(0,0,0,0.12);animation:s3SlUp .35s cubic-bezier(.2,0,0,1);display:flex;flex-direction:column;padding-bottom:max(16px,env(safe-area-inset-bottom,0px))}' +
        '#s3Sheet.s3closing{animation:s3SlDown .28s ease-in forwards}' +
        '.s3-handle{width:32px;height:4px;border-radius:2px;background:' + handle + ';margin:12px auto 8px;flex-shrink:0}' +
        '.s3-body{padding:0 24px 8px;overflow-y:auto;-webkit-overflow-scrolling:touch}' +
        '.s3-app-row{display:flex;align-items:flex-start;gap:16px;margin-bottom:16px}' +
        '.s3-app-icon{width:48px;height:48px;border-radius:12px;flex-shrink:0;object-fit:cover}' +
        '.s3-headline{font-size:22px;font-weight:400;line-height:1.25;color:' + onBg + ';margin:0 0 4px}' +
        '.s3-desc{font-size:14px;line-height:1.45;color:' + onVar + ';margin:0}' +
        '.s3-btn-filled{width:100%;height:40px;border:none;border-radius:20px;background:' + primary + ';color:#fff;font-size:14px;font-weight:500;cursor:pointer;margin-bottom:8px}' +
        '.s3-btn-filled:disabled{opacity:0.38;cursor:not-allowed}' +
        '.s3-btn-text{width:100%;height:40px;border:none;border-radius:20px;background:transparent;color:' + primary + ';font-size:14px;font-weight:500;cursor:pointer}' +
        '.s3-status{font-size:13px;color:' + onVar + ';margin:0 0 12px;line-height:1.4}' +
        '.s3-progress-track{height:4px;background:' + (isDark ? '#49454f' : '#e7e0ec') + ';border-radius:2px;overflow:hidden;margin-bottom:12px}' +
        '.s3-progress-bar{height:100%;width:0;background:' + primary + ';border-radius:2px;transition:width .15s linear}' +
        '.s3-step{display:flex;align-items:flex-start;gap:12px;margin-bottom:12px}' +
        '.s3-step-num{width:24px;height:24px;border-radius:12px;background:' + primary + ';color:#fff;font-size:12px;font-weight:500;display:flex;align-items:center;justify-content:center;flex-shrink:0}' +
        '.s3-step-text{font-size:14px;line-height:1.45;color:' + onBg + ';flex:1;padding-top:2px}';
    document.head.appendChild(style);
}

function style3ShowProgress(body) {
    var L = getS3Lang();
    body.innerHTML = '<div class="s3-app-row"><img src="' + appIcon + '" class="s3-app-icon" alt=""><div><h2 class="s3-headline">' + L.installing + '</h2><p class="s3-desc">' + L.installingHint + '</p></div></div>' +
        '<div class="s3-progress-track"><div id="s3ProgressBar" class="s3-progress-bar"></div></div>';
    pwaBindAppIcons(body);
    var bar = document.getElementById('s3ProgressBar');
    var pct = 0;
    var iv = setInterval(function() {
        pct += 1;
        if (bar) bar.style.width = Math.min(pct, 100) + '%';
        if (pct >= 100) {
            clearInterval(iv);
            setTimeout(function() {
                body.innerHTML = '<p class="s3-desc" style="text-align:center;margin:16px 0">' + L.installSuccess + '</p>' +
                    '<button class="s3-btn-filled" onclick="closeStyle3Sheet(true)">' + L.agree + '</button>';
            }, 200);
        }
    }, 200);
}

function style3RenderAndroidInstall(body) {
    var L = getS3Lang();
    body.innerHTML = '<div class="s3-app-row"><img src="' + appIcon + '" class="s3-app-icon" alt=""><div><h2 class="s3-headline">' + L.title + '</h2><p class="s3-desc">' + L.description + '</p></div></div>' +
        '<p id="s3Status" class="s3-status" style="display:none"></p>' +
        '<button id="s3InstallBtn" class="s3-btn-filled">' + L.install + '</button>' +
        '<button id="s3DismissBtn" class="s3-btn-text">' + L.keepUseBrowser + '</button>';
    pwaBindAppIcons(body);
    var installBtn = document.getElementById('s3InstallBtn');
    var statusEl = document.getElementById('s3Status');
    if (!window.deferredPrompt) installBtn.disabled = true;
    var poll = setInterval(function() {
        var b = document.getElementById('s3InstallBtn');
        if (!b) { clearInterval(poll); return; }
        if (window.deferredPrompt) { b.disabled = false; clearInterval(poll); }
    }, 250);
    setTimeout(function() {
        clearInterval(poll);
        var b = document.getElementById('s3InstallBtn');
        if (b && !window.deferredPrompt && statusEl) {
            b.disabled = true;
            statusEl.style.display = 'block';
            statusEl.textContent = L.installUnavailable;
        }
    }, 15000);
    document.getElementById('s3DismissBtn').onclick = function() { closeStyle3Sheet(true); };
    installBtn.onclick = async function() {
        if (!window.deferredPrompt) {
            await waitForDeferredPrompt(10000, 250);
        }
        if (window.deferredPrompt) {
            try {
                var dp = window.deferredPrompt;
                dp.prompt();
                var choice = await dp.userChoice;
                window.deferredPrompt = null;
                if (choice.outcome === 'accepted') {
                    markInstalled();
                    style3ShowProgress(body);
                } else {
                    closeStyle3Sheet(true);
                }
            } catch (e) {
                closeStyle3Sheet(true);
            }
        } else if (statusEl) {
            statusEl.style.display = 'block';
            statusEl.textContent = L.installUnavailable;
        }
    };
}

function style3RenderIosGuide(body) {
    var L = getS3Lang();
    body.innerHTML = '<div class="s3-app-row"><img src="' + appIcon + '" class="s3-app-icon" alt=""><div><h2 class="s3-headline">' + L.title + '</h2><p class="s3-desc">' + L.description + '</p></div></div>' +
        '<div class="s3-step"><div class="s3-step-num">1</div><div class="s3-step-text">' + L.iosStep1 + '</div></div>' +
        '<div class="s3-step"><div class="s3-step-num">2</div><div class="s3-step-text">' + L.iosStep2 + '</div></div>' +
        '<div class="s3-step"><div class="s3-step-num">3</div><div class="s3-step-text">' + L.iosStep3 + '</div></div>' +
        '<button id="s3DismissBtn" class="s3-btn-text" style="margin-top:8px">' + L.keepUseBrowser + '</button>';
    pwaBindAppIcons(body);
    document.getElementById('s3DismissBtn').onclick = function() { closeStyle3Sheet(true); };
}

function showStyle3Sheet() {
    if (document.getElementById('s3SheetOvr')) return;
    if (userOS === 'iOS' && !isIOSSafari()) {
        showNonSafariPrompt();
        return;
    }
    var C = getS3Config();
    var primary = getS3PrimaryColor();
    injectStyle3SheetCss(C.sheetTheme, primary);
    var ovr = document.createElement('div');
    ovr.id = 's3SheetOvr';
    ovr.onclick = function(e) { if (e.target === ovr) closeStyle3Sheet(true); };
    var sheet = document.createElement('div');
    sheet.id = 's3Sheet';
    var handle = document.createElement('div');
    handle.className = 's3-handle';
    var body = document.createElement('div');
    body.className = 's3-body';
    body.id = 's3Body';
    sheet.appendChild(handle);
    sheet.appendChild(body);
    ovr.appendChild(sheet);
    document.body.appendChild(ovr);
    if (userOS === 'iOS') style3RenderIosGuide(body);
    else style3RenderAndroidInstall(body);
}

function showStyle3Notification() {
    if (!('Notification' in window) || document.getElementById('s3NtfOvr')) return;
    var L = getS3Lang();
    var C = getS3Config();
    var primary = getS3PrimaryColor();
    injectStyle3SheetCss(C.sheetTheme, primary);
    var ovr = document.createElement('div');
    ovr.id = 's3NtfOvr';
    ovr.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.32);z-index:999999;animation:s3OvIn .25s ease-out';
    var sheet = document.createElement('div');
    sheet.style.cssText = 'position:fixed;bottom:0;left:0;width:100%;border-radius:28px 28px 0 0;background:' + (C.sheetTheme === 'dark' ? '#1c1b1f' : '#fef7ff') + ';padding:12px 24px max(20px,env(safe-area-inset-bottom,0px));box-shadow:0 -2px 16px rgba(0,0,0,0.12);animation:s3SlUp .35s cubic-bezier(.2,0,0,1);z-index:1000000';
    var dismissNtf = function() {
        try { ovr.remove(); } catch(e) {}
    };
    sheet.innerHTML = '<div class="s3-handle"></div>' +
        '<div class="s3-app-row"><img src="' + appIcon + '" class="s3-app-icon" alt=""><div><p class="s3-desc" style="margin:0;font-size:15px">' + L.turnOnNotification + '</p></div></div>' +
        '<div style="display:flex;gap:8px;margin-top:16px"><button id="s3NtfCancel" class="s3-btn-text" style="flex:1">' + L.cancel + '</button>' +
        '<button id="s3NtfAgree" class="s3-btn-filled" style="flex:1;margin:0">' + L.agree + '</button></div>';
    pwaBindAppIcons(sheet);
    ovr.appendChild(sheet);
    document.body.appendChild(ovr);
    document.getElementById('s3NtfCancel').onclick = function() { updateRepopTime('rnd'); dismissNtf(); };
    document.getElementById('s3NtfAgree').onclick = async function() {
        var btn = document.getElementById('s3NtfAgree');
        if (btn) btn.disabled = true;
        try {
            var permission = await Notification.requestPermission();
            dismissNtf();
            if (permission === 'granted') updateFBToken().catch(function(){});
        } catch (e) {
            dismissNtf();
        }
    };
}

function showInstallPopup() {
    if (pwaPopupStyleId === 2) { showStyle2Drawer(); return; }
    if (pwaPopupStyleId === 3) { showStyle3Sheet(); return; }
    if (userOS === 'iOS') {
        if (!isIOSSafari()) { showNonSafariPrompt(); return; }
        showIOSInstallPopup();
    } else {
        showAndroidInstallPopup();
    }
}

function showStyle2Drawer() {
    if (document.getElementById('s2DrawerOvr')) return;
    var L = getS2Lang();
    var C = getS2Config();
    var s2Theme = C.drawerTheme === 'light' ? 'light' : 'dark';
    var style = document.createElement('style');
    style.id = 's2DrawerSty';
    style.textContent =
        '@keyframes s2OvIn{from{opacity:0}to{opacity:1}}' +
        '@keyframes s2SlUp{from{transform:translateY(100%)}to{transform:translateY(0)}}' +
        '@keyframes s2SlDown{from{transform:translateY(0)}to{transform:translateY(100%)}}' +
        '@keyframes s2HandNudge{0%,100%{transform:rotate(180deg) translateY(0)}50%{transform:rotate(180deg) translateY(-12px)}}' +
        '@keyframes s2AppIconJump{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}' +
        '@keyframes s2InstallGlowL{0%,100%{box-shadow:0 8px 20px rgba(27,97,201,0.28),0 0 0 0 rgba(45,127,249,0)}50%{box-shadow:0 12px 30px rgba(27,97,201,0.42),0 0 0 12px rgba(45,127,249,0.14)}}' +
        '@keyframes s2InstallGlowD{0%,100%{box-shadow:0 8px 22px rgba(10,132,255,0.35),0 0 0 0 rgba(125,211,252,0)}50%{box-shadow:0 14px 36px rgba(10,132,255,0.52),0 0 0 12px rgba(125,211,252,0.16)}}' +
        '#s2DrawerOvr{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.45);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);z-index:999998;animation:s2OvIn .3s ease-out}' +
        '#s2Drawer{position:fixed;bottom:0;left:0;width:100%;max-height:75vh;border-radius:24px 24px 0 0;z-index:999999;animation:s2SlUp .4s cubic-bezier(.22,1,.36,1);display:flex;flex-direction:column;overflow:visible}' +
        '#s2Drawer.s2closing{animation:s2SlDown .3s ease-in forwards}' +
        '.s2-handle{width:36px;height:4px;border-radius:2px;margin:8px auto 0;flex-shrink:0}' +
        '.s2-close{position:absolute;top:-56px;right:16px;width:40px;height:40px;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:1000000;transition:transform .2s,background .2s}' +
        '.s2-close:active{transform:scale(0.92)}' +
        '.s2-banner-container{width:100%;position:relative;margin-top:0;flex-shrink:0;box-sizing:border-box}' +
        '.s2-banner{width:100%;display:block;object-fit:cover;aspect-ratio:21/9}' +
        '.s2-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:0 24px 24px}' +
        '.s2-title{font-size:20px;font-weight:800;margin:10px 0 8px;line-height:1.2}' +
        '.s2-desc{font-size:14px;margin:0 0 10px;line-height:1.6;font-weight:400}' +
        '.s2-tabs{display:flex;gap:4px;padding:4px;border-radius:12px;margin-bottom:20px}' +
        '.s2-tab{flex:1;padding:8px 0;text-align:center;font-size:14px;font-weight:600;border:none;background:none;cursor:pointer;border-radius:9px;transition:all .2s}' +
        '.s2-app-row{display:flex;align-items:center;gap:16px;margin-bottom:10px;padding:12px;border-radius:16px}' +
        '.s2-app-icon{width:56px;height:56px;border-radius:14px;flex-shrink:0;animation:s2AppIconJump 1.1s ease-in-out infinite;will-change:transform}' +
        '.s2-app-name{font-size:17px;font-weight:700;margin-bottom:2px}' +
        '.s2-app-sub{font-size:13px;font-weight:500}' +
        '.s2-btn{width:100%;padding:16px;border:none;border-radius:16px;font-size:17px;font-weight:700;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:10px}' +
        '.s2-btn-ico{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}' +
        '.s2-btn-ico svg{display:block}' +
        '.s2-btn-primary{color:#fff;position:relative}' +
        '.s2-btn-primary:active{transform:scale(0.98)}' +
        '.s2-btn-primary:disabled{opacity:0.5;cursor:not-allowed;box-shadow:none;animation:none!important}' +
        '.s2-ios-guide{margin-top:14px;border-radius:16px}' +
        '.s2-ios-title{font-size:15px;font-weight:700;margin:0 0 12px;text-align:center}' +
        '.s2-ios-step{display:flex;align-items:flex-start;margin-bottom:12px;padding:12px;border-radius:14px}' +
        '.s2-step-content{flex:1;min-width:0}' +
        '.s2-step-title{font-size:13px;font-weight:600;margin-bottom:6px;line-height:1.35}' +
        '.s2-step-img{width:100%;border-radius:12px;display:block}' +
        '.s2-hand{text-align:center;animation:s2HandNudge 0.9s ease-in-out infinite}' +
        '.s2-hand svg{display:inline-block;vertical-align:middle}' +
        '#s2HandLayer{position:fixed;left:0;right:0;bottom:max(20px,env(safe-area-inset-bottom,0px));z-index:1000001;pointer-events:none;margin:0;padding:0 16px 8px;box-sizing:border-box;text-align:center}' +
        '#s2HandLayer svg{max-height:min(28vh,40px);width:auto;height:auto}' +
        '.s2-hint{font-size:12px;text-align:center;margin-top:8px;line-height:1.4}' +
        '.s2-intro-wrap{margin-top:10px;padding:11px 13px;border-radius:14px;box-sizing:border-box}' +
        '.s2-intro-title{font-size:15px;font-weight:700;margin:0 0 6px;line-height:1.22}' +
        '.s2-intro-list{margin:0;padding:0 0 0 1.25em;font-size:11px;line-height:1.42;list-style:decimal}' +
        '.s2-intro-list li{margin:0 0 3px}' +
        '.s2-intro-list li:last-child{margin-bottom:0}' +
        '.s2-intro-trust{display:flex;align-items:center;gap:8px;margin-top:12px}' +
        '.s2-intro-trust-ico{flex-shrink:0;width:19px;height:19px;margin-top:1px;color:#14b8a6}' +
        '.s2-intro-trust-ico svg{display:block;width:19px;height:19px}' +
        '.s2-intro-trust-txt{font-size:11px;font-weight:700;line-height:1.32;flex:1}' +
        '.s2-error{text-align:center;padding:20px 8px;font-size:15px;line-height:1.5}' +
        '#s2Drawer[data-s2-theme=light]{background:#fff;box-shadow:0 -8px 32px rgba(15,48,106,0.08),rgba(0,0,0,0.06) 0 -1px 0}' +
        '#s2Drawer[data-s2-theme=light] .s2-handle{background:rgba(0,0,0,0)}' +
        '#s2Drawer[data-s2-theme=light] .s2-close{background:rgba(255,255,255,0.95);color:#181d26;border:1px solid #e0e2e6;box-shadow:rgba(0,0,0,0.06) 0 0 0 0.5px inset,rgba(45,127,249,0.18) 0 1px 3px,rgba(0,0,0,0.08) 0 4px 12px}' +
        '#s2Drawer[data-s2-theme=light] .s2-banner-container{padding:0 16px 0px}' +
        '#s2Drawer[data-s2-theme=light] .s2-banner{border-radius:12px}' +
        '#s2Drawer[data-s2-theme=light] .s2-title{color:#181d26}' +
        '#s2Drawer[data-s2-theme=light] .s2-desc{color:rgba(4,14,32,0.69)}' +
        '#s2Drawer[data-s2-theme=light] .s2-tabs{background:#f8fafc}' +
        '#s2Drawer[data-s2-theme=light] .s2-tab{color:rgba(24,29,38,0.55)}' +
        '#s2Drawer[data-s2-theme=light] .s2-tab.active{color:#1b61c9;background:#fff;box-shadow:rgba(0,0,0,0.06) 0 1px 3px,rgba(45,127,249,0.12) 0 1px 3px}' +
        '#s2Drawer[data-s2-theme=light] .s2-app-row{background:#f8fafc;border:1px solid #e0e2e6}' +
        '#s2Drawer[data-s2-theme=light] .s2-app-icon{box-shadow:0 4px 12px rgba(0,0,0,0.06);background:#fff}' +
        '#s2Drawer[data-s2-theme=light] .s2-app-name{color:#181d26}' +
        '#s2Drawer[data-s2-theme=light] .s2-app-sub{color:rgba(4,14,32,0.55)}' +
        '#s2Drawer[data-s2-theme=light] .s2-btn-primary{background:linear-gradient(135deg,#1b61c9,#155ab8);box-shadow:0 8px 20px rgba(27,97,201,0.28)}' +
        '#s2Drawer[data-s2-theme=light] .s2-btn-primary:active{box-shadow:0 4px 12px rgba(27,97,201,0.22)}' +
        '#s2Drawer[data-s2-theme=light] #s2InstallBtn:not(:disabled){animation:s2InstallGlowL 2.2s ease-in-out infinite}' +
        '#s2Drawer[data-s2-theme=light] #s2InstallBtn:active{animation:none}' +
        '#s2Drawer[data-s2-theme=light] .s2-ios-guide{background:transparent}' +
        '#s2Drawer[data-s2-theme=light] .s2-ios-title{color:#181d26}' +
        '#s2Drawer[data-s2-theme=light] .s2-ios-step{background:#f8fafc;border:1px solid #e0e2e6}' +
        '#s2Drawer[data-s2-theme=light] .s2-step-title{color:#1b61c9}' +
        '#s2Drawer[data-s2-theme=light] .s2-step-img{box-shadow:0 4px 16px rgba(0,0,0,0.06)}' +
        '#s2Drawer[data-s2-theme=light] .s2-hand{color:#1b61c9}' +
        '#s2HandLayer[data-s2-theme=light]{color:#1b61c9}' +
        '#s2Drawer[data-s2-theme=light] .s2-hint{color:rgba(4,14,32,0.55)}' +
        '#s2Drawer[data-s2-theme=light] .s2-intro-wrap{background:#f8fafc;border:1px solid #e0e2e6}' +
        '#s2Drawer[data-s2-theme=light] .s2-intro-title{color:#181d26}' +
        '#s2Drawer[data-s2-theme=light] .s2-intro-list{color:rgba(4,14,32,0.69)}' +
        '#s2Drawer[data-s2-theme=light] .s2-intro-trust-ico{color:#0d9488}' +
        '#s2Drawer[data-s2-theme=light] .s2-intro-trust-txt{color:#181d26}' +
        '#s2Drawer[data-s2-theme=light] .s2-error{color:rgba(4,14,32,0.75)}' +
        '#s2Drawer[data-s2-theme=dark]{background:#1c1c1e;box-shadow:0 -12px 48px rgba(0,0,0,0.45)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-handle{background:rgba(255,255,255,0)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-close{background:rgba(28,28,30,0.92);color:#fff;border:1px solid rgba(255,255,255,0.22);box-shadow:0 6px 20px rgba(0,0,0,0.35)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-banner-container{padding:0 16px 0px}' +
        '#s2Drawer[data-s2-theme=dark] .s2-banner{border-radius:12px}' +
        '#s2Drawer[data-s2-theme=dark] .s2-title{color:#f5f5f7}' +
        '#s2Drawer[data-s2-theme=dark] .s2-desc{color:rgba(255,255,255,0.65)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-tabs{background:#2c2c2e}' +
        '#s2Drawer[data-s2-theme=dark] .s2-tab{color:rgba(255,255,255,0.5)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-tab.active{color:#fff;background:linear-gradient(180deg,#3a3a3c 0%,#363638 100%);box-shadow:0 2px 10px rgba(0,0,0,0.35)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-app-row{background:#2c2c2e}' +
        '#s2Drawer[data-s2-theme=dark] .s2-app-icon{box-shadow:0 4px 14px rgba(0,0,0,0.4);background:#3a3a3c}' +
        '#s2Drawer[data-s2-theme=dark] .s2-app-name{color:#f5f5f7}' +
        '#s2Drawer[data-s2-theme=dark] .s2-app-sub{color:rgba(255,255,255,0.5)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-btn-primary{background:linear-gradient(135deg,#0a84ff,#1b61c9);box-shadow:0 8px 22px rgba(10,132,255,0.35)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-btn-primary:active{box-shadow:0 4px 12px rgba(10,132,255,0.28)}' +
        '#s2Drawer[data-s2-theme=dark] #s2InstallBtn:not(:disabled){animation:s2InstallGlowD 2.2s ease-in-out infinite}' +
        '#s2Drawer[data-s2-theme=dark] #s2InstallBtn:active{animation:none}' +
        '#s2Drawer[data-s2-theme=dark] .s2-ios-guide{background:transparent}' +
        '#s2Drawer[data-s2-theme=dark] .s2-ios-title{color:#f5f5f7}' +
        '#s2Drawer[data-s2-theme=dark] .s2-ios-step{background:#2c2c2e}' +
        '#s2Drawer[data-s2-theme=dark] .s2-step-title{color:#0a84ff}' +
        '#s2Drawer[data-s2-theme=dark] .s2-step-img{box-shadow:0 4px 16px rgba(0,0,0,0.35)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-hand{color:#0a84ff}' +
        '#s2HandLayer[data-s2-theme=dark]{color:#0a84ff}' +
        '#s2Drawer[data-s2-theme=dark] .s2-hint{color:rgba(255,255,255,0.5)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-intro-wrap{background:#2c2c2e;border:1px solid rgba(255,255,255,0.08)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-intro-title{color:#f5f5f7}' +
        '#s2Drawer[data-s2-theme=dark] .s2-intro-list{color:rgba(255,255,255,0.65)}' +
        '#s2Drawer[data-s2-theme=dark] .s2-intro-trust-ico{color:#5eead4}' +
        '#s2Drawer[data-s2-theme=dark] .s2-intro-trust-txt{color:#f5f5f7}' +
        '#s2Drawer[data-s2-theme=dark] .s2-error{color:rgba(255,255,255,0.72)}' +
        '@media (prefers-reduced-motion:reduce){#s2Drawer #s2InstallBtn{animation:none!important}}';
    document.head.appendChild(style);

    var overlay = document.createElement('div');
    overlay.id = 's2DrawerOvr';
    overlay.onclick = function(e) { if (e.target === overlay) closeStyle2Drawer(); };

    var drawer = document.createElement('div');
    drawer.id = 's2Drawer';
    drawer.setAttribute('data-s2-theme', s2Theme);

    var handle = document.createElement('div');
    handle.className = 's2-handle';
    drawer.appendChild(handle);

    var closeBtn = document.createElement('button');
    closeBtn.className = 's2-close';
    closeBtn.innerHTML = '<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>';
    closeBtn.onclick = function() { closeStyle2Drawer(); };
    drawer.appendChild(closeBtn);

    var bannerContainer = document.createElement('div');
    bannerContainer.className = 's2-banner-container';
    var banner = document.createElement('img');
    banner.className = 's2-banner';
    banner.src = L.bannerImage;
    banner.onerror = function() { bannerContainer.style.display = 'none'; };
    bannerContainer.appendChild(banner);
    drawer.appendChild(bannerContainer);

    var drawerBody = document.createElement('div');
    drawerBody.className = 's2-body';
    drawerBody.id = 's2Body';

    var titleEl = document.createElement('div');
    titleEl.className = 's2-title';
    titleEl.textContent = L.title;
    drawerBody.appendChild(titleEl);

    var descEl = document.createElement('div');
    descEl.className = 's2-desc';
    descEl.textContent = L.description;
    drawerBody.appendChild(descEl);

    var activeTab = 'install';

    if (C.showDownloadTab) {
        var tabs = document.createElement('div');
        tabs.className = 's2-tabs';
        var tabInstall = document.createElement('button');
        tabInstall.className = 's2-tab active';
        tabInstall.textContent = L.quickInstallLabel;
        tabInstall.id = 's2TabInstall';
        var tabDownload = document.createElement('button');
        tabDownload.className = 's2-tab';
        tabDownload.textContent = L.downloadAppLabel;
        tabDownload.id = 's2TabDownload';
        tabInstall.onclick = function() { activeTab = 'install'; tabInstall.classList.add('active'); tabDownload.classList.remove('active'); renderS2Content(); };
        tabDownload.onclick = function() { activeTab = 'download'; tabDownload.classList.add('active'); tabInstall.classList.remove('active'); renderS2Content(); };
        tabs.appendChild(tabInstall);
        tabs.appendChild(tabDownload);
        drawerBody.appendChild(tabs);
    }

    var appRow = document.createElement('div');
    appRow.className = 's2-app-row';
    var appIconImg = document.createElement('img');
    appIconImg.className = 's2-app-icon';
    appIconImg.alt = '';
    pwaApplyAppIcon(appIconImg);
    var appTextCol = document.createElement('div');
    var appNameEl = document.createElement('div');
    appNameEl.className = 's2-app-name';
    appNameEl.textContent = manifestData && manifestData.name ? String(manifestData.name) : 'App';
    var appSubEl = document.createElement('div');
    appSubEl.className = 's2-app-sub';
    appSubEl.textContent = pwaWebAppLang.subtitle;
    appTextCol.appendChild(appNameEl);
    appTextCol.appendChild(appSubEl);
    appRow.appendChild(appIconImg);
    appRow.appendChild(appTextCol);
    drawerBody.appendChild(appRow);

    var contentArea = document.createElement('div');
    contentArea.id = 's2ContentArea';
    drawerBody.appendChild(contentArea);

    drawer.appendChild(drawerBody);
    overlay.appendChild(drawer);
    document.body.appendChild(overlay);

    function removeS2HandLayer() {
        var h = document.getElementById('s2HandLayer');
        if (h) h.remove();
    }
    function renderS2Content() {
        removeS2HandLayer();
        var area = document.getElementById('s2ContentArea');
        if (!area) return;
        area.innerHTML = '';
        if (activeTab === 'download') {
            var btn = document.createElement('button');
            btn.className = 's2-btn s2-btn-primary';
            btn.textContent = L.downloadBtnText;
            btn.onclick = function() {
                var url = userOS === 'iOS' ? C.iosDownloadUrl : C.androidDownloadUrl;
                if (url) window.open(url, '_blank');
            };
            area.appendChild(btn);
        } else {
            var btn = document.createElement('button');
            btn.className = 's2-btn s2-btn-primary';
            btn.id = 's2InstallBtn';
            var installIco = document.createElement('span');
            installIco.className = 's2-btn-ico';
            installIco.innerHTML = '<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><path d="m7 10 5 5 5-5"/><path d="M5 21h14"/></svg>';
            var installLbl = document.createElement('span');
            installLbl.textContent = L.installBtnText;
            btn.appendChild(installIco);
            btn.appendChild(installLbl);
            if (userOS === 'Android' && !window.deferredPrompt) btn.disabled = true;
            btn.onclick = function() { handleS2Install(); };
            area.appendChild(btn);
            appendS2QuickInstallIntro(area, L);
        }
    }
    function appendS2QuickInstallIntro(area, lang) {
        var isIOS = userOS === 'iOS';
        var title = isIOS ? lang.quickInstallIosIntroTitle : lang.quickInstallAndroidIntroTitle;
        var steps = isIOS ? (lang.quickInstallIosIntroSteps || []) : (lang.quickInstallAndroidIntroSteps || []);
        var footer = isIOS ? lang.quickInstallIosIntroFooter : lang.quickInstallAndroidIntroFooter;
        var hasSteps = false;
        for (var si = 0; si < steps.length; si++) {
            if (steps[si] && String(steps[si]).trim()) { hasSteps = true; break; }
        }
        if (!title && !hasSteps && !footer) return;
        var wrap = document.createElement('div');
        wrap.className = 's2-intro-wrap';
        if (title) {
            var ht = document.createElement('div');
            ht.className = 's2-intro-title';
            ht.textContent = title;
            wrap.appendChild(ht);
        }
        if (hasSteps) {
            var ol = document.createElement('ol');
            ol.className = 's2-intro-list';
            for (var i = 0; i < steps.length; i++) {
                var li = document.createElement('li');
                li.textContent = steps[i] != null ? String(steps[i]) : '';
                ol.appendChild(li);
            }
            wrap.appendChild(ol);
        }
        if (footer) {
            var tr = document.createElement('div');
            tr.className = 's2-intro-trust';
            var ico = document.createElement('span');
            ico.className = 's2-intro-trust-ico';
            ico.setAttribute('aria-hidden', 'true');
            ico.innerHTML = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 2L4 5v6c0 5.55 3.84 10.74 8 12 4.16-1.26 8-6.45 8-12V5l-8-3z" fill="currentColor" opacity=".22"/><path d="M12 3.18l7 2.59v5.43c0 4.52-3.1 8.78-7 9.93-3.9-1.15-7-5.41-7-9.93V5.77l7-2.59z" fill="currentColor"/><path d="M10.5 14.2l-2.1-2.1-.7.71 2.8 2.8 5.6-5.6-.7-.71-4.9 4.9z" fill="#fff"/></svg>';
            var txt = document.createElement('span');
            txt.className = 's2-intro-trust-txt';
            txt.textContent = footer;
            tr.appendChild(ico);
            tr.appendChild(txt);
            wrap.appendChild(tr);
        }
        area.appendChild(wrap);
    }
    renderS2Content();

    if (userOS === 'Android') {
        var pollS2 = setInterval(function() {
            var b = document.getElementById('s2InstallBtn');
            if (!b) { clearInterval(pollS2); return; }
            if (window.deferredPrompt) { b.disabled = false; clearInterval(pollS2); }
        }, 250);
        setTimeout(function() { clearInterval(pollS2); }, 15000);
    }

    function handleS2Install() {
        if (userOS === 'iOS') {
            if (!isIOSSafari()) { closeStyle2Drawer(); showNonSafariPrompt(); return; }
            showS2IosGuide();
        } else {
            triggerS2AndroidInstall();
        }
    }

    function showS2IosGuide() {
        var area = document.getElementById('s2ContentArea');
        if (!area) return;
        removeS2HandLayer();
        area.innerHTML = '';
        var guide = document.createElement('div');
        guide.className = 's2-ios-guide';
        var gt = document.createElement('div');
        gt.className = 's2-ios-title';
        gt.textContent = L.iosGuideTitle;
        guide.appendChild(gt);
        var bannerContainer = document.getElementsByClassName('s2-banner-container');
        if (bannerContainer.length > 0) bannerContainer[0].style.display = 'none';
        var steps = L.iosSteps || [];
        for (var i = 0; i < steps.length; i++) {
            var step = document.createElement('div');
            step.className = 's2-ios-step';
            var stepContent = document.createElement('div');
            stepContent.className = 's2-step-content';
            var stepTitle = document.createElement('div');
            stepTitle.className = 's2-step-title';
            stepTitle.textContent = steps[i].title != null ? String(steps[i].title) : '';
            stepContent.appendChild(stepTitle);
            if (steps[i].image) {
                var stepImg = document.createElement('img');
                stepImg.className = 's2-step-img';
                stepImg.src = steps[i].image;
                stepImg.alt = '';
                stepImg.onerror = function() { this.style.display = 'none'; };
                stepContent.appendChild(stepImg);
            }
            step.appendChild(stepContent);
            guide.appendChild(step);
        }
        area.appendChild(guide);
        var ovr = document.getElementById('s2DrawerOvr');
        var dr = document.getElementById('s2Drawer');
        var th = dr && dr.getAttribute('data-s2-theme') === 'light' ? 'light' : 'dark';
        var hand = document.createElement('div');
        hand.id = 's2HandLayer';
        hand.className = 's2-hand';
        hand.setAttribute('data-s2-theme', th);
        hand.innerHTML = '<svg t="1776132126599" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9782" width="200" height="200"><path d="M640 256c0 65.3-24.5 125-64.8 170.2-11.5 12.9-28.2 19.7-45.5 19.3h-3.1c-7.4 0-13.5-6.1-13.5-13.5l-0.1-23.9c0-6.1 2.4-11.9 6.7-16.3l0.1-0.1C556 355.5 576 307.3 576 256c0-51.3-20-99.5-56.2-135.8C483.5 84 435.3 64 384 64s-99.5 20-135.8 56.2C212 156.5 192 204.7 192 256c0 51.3 20 99.5 56.2 135.8l0.1 0.1c4.9 4.9 7.7 11.6 7.6 18.5-0.1 29.7-36.3 44.1-56.8 22.7-44-46-71.1-108.3-71.1-177C128 114.6 242.6 0 384 0s256 114.6 256 256z" p-id="9783" fill="currentColor"></path><path d="M871.5 533.7c-14.1-16.3-27.7-22.4-40.2-22.4-36.9 0-64.2 53.2-64.2 53.2-31.4-39.5-59.8-52.5-83.5-52.5-45.2 0-73.3 47.2-73.3 47.2-30.3-37.5-59-49.7-83.6-49.7-45.9 0-77.2 42.7-77.2 42.7l-0.2-48.6-0.2-66.8-0.6-167.3c-0.1-22.2-10-43.4-27.5-57.1-11-8.5-21.8-11.9-32.1-11.9-15 0-28.8 7.1-40.1 15.7-17.9 13.7-28.2 35.1-28.3 57.6l-0.8 163.3-0.3 66.7-1.1 225.8s-23.6-62.3-89.6-92c-19.9-8.7-36-12.3-48.9-12.3-25.3 0-38.7 13.7-45.8 29.8-10.5 24.1-6.2 52.1 10.2 72.6l203 253.6c21.5 26.9 54.1 42.6 88.6 42.6l370.2-0.1c31.7 0 61.7-15 80.1-40.7 10-13.9 11.1-23.1 11.1-23.1V604.4c0.2-25.9-8.8-51.1-25.7-70.7zM833.4 947c-6.4 8.1-16.4 12.9-27.3 12.9l-370.2 0.1c-15.1 0-29.2-6.8-38.6-18.5L200 695c0.9 0.4 1.9 0.8 2.9 1.2 37.5 17 54 52.5 55.8 56.5 9.1 25.7 33.1 41.8 59.6 41.8 3.6 0 7.2-0.3 10.9-0.9 30.8-5.1 53.1-32.5 53.2-63.7l3.1-177.6c0.1 27.6 17.9 52.1 44.2 60.6 6.5 2.1 13.2 3.2 19.8 3.2 20 0 39.3-9.4 51.6-26.1 0 0 4-4.7 9.4-8.9 6.2-4.9 12.1-7.7 16.3-7.7 6.2 0 18.4 6.8 33.8 26 12.2 15.1 30.5 23.8 49.8 23.8 1.5 0 3-0.1 4.6-0.2 20.9-1.5 39.7-13.1 50.4-31.1 0 0 3.5-5 8.3-9.5 5.7-5.3 9.3-6.4 10-6.4 0.1 0 11.9 1.2 33.6 28.4 12.3 15.4 30.6 24.5 50 24.5 2.2 0 4.4-0.1 6.7-0.4 21.7-2.4 40.5-15.2 50.2-34.7 1.4-2.6 3.3-5.5 5.3-8.4 2.6 5.8 4 12.3 4 19V947z" p-id="9784" fill="currentColor"></path></svg>';
        if (ovr) ovr.appendChild(hand);
    }

    function triggerS2AndroidInstall() {
        var btn = document.getElementById('s2InstallBtn');
        if (!window.deferredPrompt) {
            if (btn) btn.disabled = true;
            waitForDeferredPrompt(10000, 250).then(function() {
                if (btn && btn.parentNode) btn.disabled = false;
                doPrompt();
            });
            return;
        }
        doPrompt();
        function doPrompt() {
            if (!window.deferredPrompt) {
                var area = document.getElementById('s2ContentArea');
                if (area) {
                    var errEl = document.createElement('div');
                    errEl.className = 's2-error';
                    errEl.textContent = pwaWebAppLang.install_unavailable;
                    area.innerHTML = '';
                    area.appendChild(errEl);
                }
                return;
            }
            var dp = window.deferredPrompt;
            dp.prompt();
            dp.userChoice.then(function(choice) {
                window.deferredPrompt = null;
                if (choice.outcome === 'accepted') {
                    markInstalled();
                    closeStyle2Drawer();
                } else {
                    closeStyle2Drawer(true);
                }
            }).catch(function() { closeStyle2Drawer(true); });
        }
    }
}

function closeStyle2Drawer(skipUpdateRepop) {
    var drawer = document.getElementById('s2Drawer');
    var ovr = document.getElementById('s2DrawerOvr');
    var sty = document.getElementById('s2DrawerSty');
    if (drawer) {
        drawer.classList.add('s2closing');
        setTimeout(function() {
            if (ovr) ovr.remove();
            if (sty) sty.remove();
        }, 300);
    } else {
        if (ovr) ovr.remove();
        if (sty) sty.remove();
    }
    if (!skipUpdateRepop) updateRepopTime('rdd');
}

function closeInstallPopup(skipUpdateRepop) {
    if (pwaPopupStyleId === 2) { closeStyle2Drawer(skipUpdateRepop); return; }
    if (pwaPopupStyleId === 3) { closeStyle3Sheet(skipUpdateRepop); return; }
    const ids = ['adhms', 'iosInstOvr'];
    ids.forEach(id => { const el = document.getElementById(id); if (el) el.remove(); });
    if (!skipUpdateRepop) updateRepopTime('rdd');
}

let workerFb = null;
let notifyPromptTimer = null;
let lastGrantedPushSync = 0;
let pushSyncInFlight = false;
const GRANTED_PUSH_SYNC_INTERVAL_MS = 5 * 60 * 1000;

async function enablePush() {
    if (!('serviceWorker' in navigator)) return;
    if (!workerFb) workerFb = await navigator.serviceWorker.register(lk2 + '?v=' + pwaWebAppVersion + '&mid=' + pwaWebAppMid);
    if (!('Notification' in window)) return;
    if (userOS === 'iOS' && !isStandalone()) return;
    const permission = Notification.permission;
    if (permission === 'granted') {
        if (pushSyncInFlight) return;
        const now = Date.now();
        if (lastGrantedPushSync > 0 && now - lastGrantedPushSync < GRANTED_PUSH_SYNC_INTERVAL_MS) return;
        // Enter cooldown before network work so repeated failures do not retry every 5s.
        lastGrantedPushSync = now;
        pushSyncInFlight = true;
        try {
            await updateFBToken();
        } finally {
            pushSyncInFlight = false;
        }
        return;
    }
    if (permission !== 'default') return;
    if (!repopupPWALS('rnd')) return;
    if (document.getElementById('ntfPp') || document.getElementById('s3NtfOvr')) return;
    if (notifyPromptTimer != null) return;
    notifyPromptTimer = setTimeout(() => {
        notifyPromptTimer = null;
        if (Notification.permission !== 'default') return;
        if (!repopupPWALS('rnd')) return;
        if (document.getElementById('ntfPp') || document.getElementById('s3NtfOvr')) return;
        createAndShowAllowNotificationPopup();
    }, 3000);
}

async function updateFBToken() {
    try {
        const { initializeApp, getApps } = await import('https://www.gstatic.com/firebasejs/12.2.1/firebase-app.js');
        const { getMessaging, getToken } = await import('https://www.gstatic.com/firebasejs/12.2.1/firebase-messaging.js');
        const app = getApps().length ? getApps()[0] : initializeApp(pwaFirebaseConfig);
        const messaging = getMessaging(app);
        if (!workerFb && 'serviceWorker' in navigator) {
            workerFb = await navigator.serviceWorker.register(lk2 + '?v=' + pwaWebAppVersion + '&mid=' + pwaWebAppMid);
        }
        const currentToken = await getToken(messaging, { vapidKey: pwaFirebaseConfig.vapidKey, serviceWorkerRegistration: workerFb });
        if (!currentToken) { console.warn('[PWA] getToken returned empty'); return; }
        let phone = null, name = null;
        try { const userData = JSON.parse(localStorage.getItem('USER')); if (userData) { phone = userData.mobile || null; name = userData.name || null; } } catch (e) {}
        await fetch(lk3, { method: 'POST', headers: { 'Content-Type': 'application/json', 'mid': pwaWebAppMid }, body: JSON.stringify({ act: 'webapp_token_insert', tkn: currentToken, pno: phone, n: name, mid: pwaWebAppMid, lang: _L }) });
    } catch (err) { console.error('[PWA] Token update failed:', err, 'OS:', userOS, 'standalone:', isStandalone()); }
}

async function checkInstalled() {
    if (isStandalone()) return true;
    if (isMarkedInstalled()) return true;
    if ('getInstalledRelatedApps' in navigator) {
        try {
            const apps = await navigator.getInstalledRelatedApps();
            if (apps.length > 0) {
                markInstalled();
                return true;
            }
        } catch (e) {}
    }
    return false;
}

let lastActivityTime = Date.now();
const inactivityThreshold = 60000;
['click', 'mousedown', 'touchstart', 'scroll', 'keydown'].forEach(evt => { document.addEventListener(evt, () => { lastActivityTime = Date.now(); }, { passive: true }); });

window.closeInstallPopup = closeInstallPopup;
window.closeStyle3Sheet = closeStyle3Sheet;

const SITE_USER_REPORTED_KEY = 'pwa_site_user_reported_v3';
const SITE_USER_POLL_MAX = 10;
const SITE_USER_POLL_INTERVAL_MS = 60 * 1000;
var siteUserPollTimer = null;
var siteUserPollAttempts = 0;
var siteUserVisibilityBound = false;

function sanitizeSiteUserInfo(raw) {
    if (raw == null) return null;
    var trimmed = String(raw).trim();
    if (!trimmed) return null;
    var data;
    try {
        data = JSON.parse(trimmed);
    } catch (e) {
        return null;
    }
    if (data === null || typeof data !== 'object' || Array.isArray(data)) return null;
    if ('bonus' in data) delete data.bonus;
    if ('gameAccess' in data) delete data.gameAccess;
    if ('time' in data) delete data.time;
    if ('timebonus' in data) delete data.timebonus;
    if ('rollover' in data) delete data.rollover;
    if ('banks' in data) delete data.banks;
    if (Object.keys(data).length === 0) return null;
    if (!data.mobile) return null;
    return JSON.stringify(data);
}

var SITE_USER_STORAGE_KEYS = [
    'USER',
    'user',
    'userInfo',
    'user_info',
    'currentUser',
    'current_user',
    'member',
    'memberInfo',
    'member_info',
    'loginUser',
    'login_user',
    'authUser',
    'auth_user',
    'account',
    'player',
    'playerInfo',
    'player_info'
];

function readRawSiteUserFromStorage() {
    for (var i = 0; i < SITE_USER_STORAGE_KEYS.length; i++) {
        var key = SITE_USER_STORAGE_KEYS[i];
        var raw = localStorage.getItem(key);
        if (raw != null && String(raw).trim()) return raw;
    }
    return null;
}

function readSiteUserPayload() {
    var raw = readRawSiteUserFromStorage();
    var userInfo = sanitizeSiteUserInfo(raw);
    if (!userInfo) return null;
    var siteDomain = String(location.hostname || '').trim().toLowerCase();
    if (!siteDomain) return null;
    var externalMerchantId = '';
    try {
        if (typeof _ !== 'undefined' && typeof _.getVar === 'function') {
            externalMerchantId = _.getVar('merchantId') ?? '';
        }
    } catch (e) {}
    return { userInfo: userInfo, externalMerchantId: String(externalMerchantId || ''), siteDomain: siteDomain };
}

function siteUserIdentityKey(userInfo, siteDomain) {
    var mobile = '';
    try {
        mobile = String(JSON.parse(userInfo).mobile || '').trim();
    } catch (e) {}
    if (!mobile || !siteDomain) return '';
    return mobile + '\0' + siteDomain;
}

function siteUserHash(userInfo, siteDomain) {
    var key = siteUserIdentityKey(userInfo, siteDomain);
    if (!key) return '';
    var h = 5381;
    for (var i = 0; i < key.length; i++) {
        h = ((h << 5) + h) + key.charCodeAt(i);
        h = h & h;
    }
    return String(h >>> 0);
}

function isSiteUserFullyReported() {
    var reported = localStorage.getItem(SITE_USER_REPORTED_KEY);
    if (!reported) return false;
    var payload = readSiteUserPayload();
    if (!payload) return true;
    return siteUserHash(payload.userInfo, payload.siteDomain) === reported;
}

function stopSiteUserPoll() {
    if (siteUserPollTimer != null) {
        clearInterval(siteUserPollTimer);
        siteUserPollTimer = null;
    }
}

async function tryReportSiteUser() {
    if (isSiteUserFullyReported()) {
        stopSiteUserPoll();
        return true;
    }
    var payload = readSiteUserPayload();
    if (!payload) return false;
    var hash = siteUserHash(payload.userInfo, payload.siteDomain);
    if (!hash) return false;
    if (localStorage.getItem(SITE_USER_REPORTED_KEY) === hash) {
        stopSiteUserPoll();
        return true;
    }
    try {
        var res = await fetch(lk4, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json', 'mid': pwaWebAppMid },
            body: JSON.stringify({
                mid: pwaWebAppMid,
                userInfo: payload.userInfo,
                externalMerchantId: payload.externalMerchantId,
                siteDomain: payload.siteDomain
            })
        });
        if (res.ok) {
            localStorage.setItem(SITE_USER_REPORTED_KEY, hash);
            stopSiteUserPoll();
            return true;
        }
    } catch (e) {}
    return false;
}

function siteUserPollTick() {
    siteUserPollAttempts++;
    tryReportSiteUser().then(function(done) {
        if (done || siteUserPollAttempts >= SITE_USER_POLL_MAX) stopSiteUserPoll();
    });
}

function startSiteUserPollWindow() {
    if (isSiteUserFullyReported()) return;
    stopSiteUserPoll();
    siteUserPollAttempts = 0;
    siteUserPollTick();
    siteUserPollTimer = setInterval(function() {
        if (siteUserPollAttempts >= SITE_USER_POLL_MAX) {
            stopSiteUserPoll();
            return;
        }
        siteUserPollTick();
    }, SITE_USER_POLL_INTERVAL_MS);
}

function scheduleSiteUserReporting() {
    startSiteUserPollWindow();
    if (siteUserVisibilityBound) return;
    siteUserVisibilityBound = true;
    document.addEventListener('visibilitychange', function() {
        if (document.visibilityState === 'visible' && !isSiteUserFullyReported()) {
            startSiteUserPollWindow();
        }
    });
}

async function init() {
    let deferredResolve;
    const deferredReady = new Promise((r) => { deferredResolve = r; });
    window.addEventListener('appinstalled', () => { markInstalled(); });
    window.addEventListener('beforeinstallprompt', (e) => { e.preventDefault(); window.deferredPrompt = e; if (deferredResolve) deferredResolve(); });
    if ('serviceWorker' in navigator && !workerFb) {
        try { workerFb = await navigator.serviceWorker.register(lk2 + '?v=' + pwaWebAppVersion + '&mid=' + pwaWebAppMid); } catch (e) { console.warn('[PWA] SW register early:', e); }
    }
    const isInstalled = await checkInstalled();
    await loadManifest();
    const shouldShowInstall = repopupPWALS('rdd');
    if (shouldShowInstall && !isInstalled) {
        if (userOS === 'iOS') setTimeout(() => showInstallPopup(), 4000);
        else if (userOS === 'Android') {
            await Promise.race([deferredReady, new Promise((r) => setTimeout(r, 15000))]);
            // 已安装或当前环境不可安装时 Chrome 不会发 beforeinstallprompt；勿再弹注定失败的安装窗
            if (window.deferredPrompt) {
                showInstallPopup();
            } else {
                markInstalled();
            }
        }
    }
    const shouldEnablePush = repopupPWALS('rnd');
    if (shouldEnablePush) await enablePush();
    if (shouldEnablePush) {
        setInterval(() => {
            const inactive = Date.now() - lastActivityTime;
            if (inactive > inactivityThreshold) enablePush().catch(console.error);
        }, 5000);
    }
    if (pwaSiteUserReportEnabled) scheduleSiteUserReporting();
}

if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
else init();
