1let clickCount=0,clickTimer=null,currentLang="ru",siteData=null;const getBasePath=()=>{const e=window.location.pathname,t=e.lastIndexOf("/");return e.substring(0,t+1)},BASE_PATH=getBasePath(),translations={ru:{about_title:"Ðб ÐÑÑиÑÑе",read_more:"ÐодÑобнее",show_less:"СвеÑнÑÑÑ",bio_short:"SuNKeePeRZ â ÑÑо ÑникалÑнÑй Ð³Ð¾Ð»Ð¾Ñ ÑовÑеменной ÑÑенÑ, ÑоÑеÑаÑÑий в Ñебе глÑÐ±Ð¸Ð½Ñ Ð»Ð¸Ñики и моÑÑ Ð·Ð²ÑÑаниÑ. ÐÑзÑка, коÑоÑÐ°Ñ Ð¿ÑÐ¾Ð½Ð¸ÐºÐ°ÐµÑ Ð² дÑÑÑ.",bio_full_p1:"ÐаÑав Ñвой пÑÑÑ Ð² underground ÑÑене, Sardor Akbarov бÑÑÑÑо завоевал внимание ÑлÑÑаÑелей Ñвоим неповÑоÑимÑм ÑÑилем. ÐаждÑй ÑÑек â ÑÑо иÑÑоÑиÑ, ÑаÑÑÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ ÑеÑез пÑÐ¸Ð·Ð¼Ñ ÑмоÑий и ÑиÑма.",bio_full_p2:"Ð ÑвоиÑ
ÑабоÑаÑ
он ÑкÑпеÑименÑиÑÑÐµÑ Ñ Ð¶Ð°Ð½Ñами, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð°ÑмоÑÑеÑÑ, коÑоÑÐ°Ñ Ð·Ð°Ñ
ваÑÑÐ²Ð°ÐµÑ Ñ Ð¿ÐµÑвÑÑ
ÑекÑнд. SuNKeePeRZ не пÑоÑÑо ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¼ÑзÑкÑ, он ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¼Ð¸ÑÑ, в коÑоÑÑÑ
каждÑй Ð½Ð°Ð¹Ð´ÐµÑ ÑÑо-Ñо Ñвое.",bio_full_p3:"СледиÑе за обновлениÑми, новÑе ÑÐµÐ»Ð¸Ð·Ñ Ñже на подÑ
оде. ÐобÑо пожаловаÑÑ Ð² Ð¼Ð¸Ñ SuNKeePeRZ.",releases_title:"ÐÑдÑÑие РелизÑ",latest_releases_title:"ÐоÑледние РелизÑ",gallery_title:"ФоÑогалеÑеÑ",scroll_hint:"ÐиÑÑайÑе влево/впÑаво",subscribe:"ÐодпиÑаÑÑÑÑ Ð½Ð° новоÑÑи"},en:{about_title:"About Artist",read_more:"Read More",show_less:"Show Less",bio_short:"SuNKeePeRZ is a unique voice of the modern scene, combining lyrical depth with powerful sound. Music that penetrates the soul.",bio_full_p1:"Starting his journey in the underground scene, Sardor Akbarov quickly won the attention of listeners with his unique style. Every track is a story told through the prism of emotions and rhythm.",bio_full_p2:"In his works, he experiments with genres, creating an atmosphere that captivates from the first seconds. SuNKeePeRZ doesn't just create music, he creates worlds where everyone will find something of their own.",bio_full_p3:"Stay tuned for updates, new releases are on the way. Welcome to the world of SuNKeePeRZ.",releases_title:"Future Releases",latest_releases_title:"Latest Releases",gallery_title:"Photo Gallery",scroll_hint:"Scroll Left/Right",subscribe:"Subscribe to news"}};function updateCopyrightYear(){const e=document.getElementById("current-year");e&&(e.textContent=(new Date).getFullYear())}const defaultData={artistPhoto:"/img/artist/1775408585_69d295c92361b.jpg",logoPng:null,usePngLogo:!1,artistName:"Sardor Akbarov",artistNickname:"SuNKeePeRZ",releases:[{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Nightmare in Red",date:"25.10.23"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Dark Horizon",date:"12.11.23"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Silent Scream",date:"01.12.23"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Midnight Run",date:"15.12.23"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Neon Lights",date:"05.01.24"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Cyber Heart",date:"20.01.24"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Love Virus",date:"14.02.24"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Spring Bass",date:"01.03.24"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Echoes",date:"15.03.24"},{cover:"/img/artist/1775408585_69d295c92361b.jpg",artist:"SuNKeePeRZ",title:"Final Boss",date:"01.04.24"}],gallery:["/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg","/img/artist/1775408585_69d295c92361b.jpg"],socials:{vk:"#",telegram:"#",instagram:"#",youtube:"#"},platforms:{spotify:"https://open.spotify.com/artist/53NPxfYfgXnHv8k1q65JCV",apple:"https://music.apple.com/ru/artist/dj-sunkeeperz/924390539",soundcloud:"#",yandex:"https://music.yandex.ru/artist/3729245",vkmusic:"https://vk.com/artist/djsunkeeperz",youtube:"https://www.youtube.com/@SuNKeePeRZ",youtubemusic:"https://music.youtube.com/channel/UCaTJP1kEVd75lvdLkSoYylQ"},bio:{short:"SuNKeePeRZ â ÑÑо ÑникалÑнÑй Ð³Ð¾Ð»Ð¾Ñ ÑовÑеменной ÑÑенÑ, ÑоÑеÑаÑÑий в Ñебе глÑÐ±Ð¸Ð½Ñ Ð»Ð¸Ñики и моÑÑ Ð·Ð²ÑÑаниÑ. ÐÑзÑка, коÑоÑÐ°Ñ Ð¿ÑÐ¾Ð½Ð¸ÐºÐ°ÐµÑ Ð² дÑÑÑ.",full1:"ÐаÑав Ñвой пÑÑÑ Ð² underground ÑÑене, Sardor Akbarov бÑÑÑÑо завоевал внимание ÑлÑÑаÑелей Ñвоим неповÑоÑимÑм ÑÑилем. ÐаждÑй ÑÑек â ÑÑо иÑÑоÑиÑ, ÑаÑÑÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ ÑеÑез пÑÐ¸Ð·Ð¼Ñ ÑмоÑий и ÑиÑма.",full2:"Ð ÑвоиÑ
ÑабоÑаÑ
он ÑкÑпеÑименÑиÑÑÐµÑ Ñ Ð¶Ð°Ð½Ñами, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð°ÑмоÑÑеÑÑ, коÑоÑÐ°Ñ Ð·Ð°Ñ
ваÑÑÐ²Ð°ÐµÑ Ñ Ð¿ÐµÑвÑÑ
ÑекÑнд. SuNKeePeRZ не пÑоÑÑо ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¼ÑзÑкÑ, он ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¼Ð¸ÑÑ, в коÑоÑÑÑ
каждÑй Ð½Ð°Ð¹Ð´ÐµÑ ÑÑо-Ñо Ñвое.",full3:"СледиÑе за обновлениÑми, новÑе ÑÐµÐ»Ð¸Ð·Ñ Ñже на подÑ
оде. ÐобÑо пожаловаÑÑ Ð² Ð¼Ð¸Ñ SuNKeePeRZ."}};async function loadSiteData(){try{const e=await fetch(BASE_PATH+"data.json?t="+Date.now());if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);const t=await e.json();t&&Object.keys(t).length>0?(siteData=t,!localStorage.getItem("sunk-theme")&&t.defaultTheme&&("green"===t.defaultTheme?document.body.classList.add("theme-green"):document.body.classList.remove("theme-green")),updateSiteContent(t)):(siteData=defaultData,updateSiteContent(defaultData)),startParticlesWhenIdle()}catch(e){console.error("ÐÑибка загÑÑзки даннÑÑ
:",e),siteData=defaultData,updateSiteContent(defaultData),startParticlesWhenIdle()}}function hexToDarkShade(e,t){e=e.replace("#","");return"#"+[Math.round(parseInt(e.substr(0,2),16)*t),Math.round(parseInt(e.substr(2,2),16)*t),Math.round(parseInt(e.substr(4,2),16)*t)].map(e=>Math.min(255,e).toString(16).padStart(2,"0")).join("")}function applyThemeColors(e){if(!e.themes)return;const t=document.documentElement;if(e.themes.primary){const n=e.themes.primary;t.style.setProperty("--accent",n.hex),t.style.setProperty("--accent-rgb",n.rgb),t.style.setProperty("--accent-dark",hexToDarkShade(n.hex,.8)),t.style.setProperty("--accent-darker",hexToDarkShade(n.hex,.6))}if(e.themes.secondary&&(t.dataset.theme2Hex=e.themes.secondary.hex,t.dataset.theme2Rgb=e.themes.secondary.rgb),document.body.classList.contains("theme-green")&&e.themes.secondary){const n=e.themes.secondary;t.style.setProperty("--accent",n.hex),t.style.setProperty("--accent-rgb",n.rgb),t.style.setProperty("--accent-dark",hexToDarkShade(n.hex,.8)),t.style.setProperty("--accent-darker",hexToDarkShade(n.hex,.6))}}function updateSiteContent(e){const t=translations[currentLang];applyThemeColors(e),!1!==e.glowEnabled?document.body.classList.add("site-glow-border"):document.body.classList.remove("site-glow-border");const n=e=>"string"==typeof e?e.replace(/^https?:\/\/sunkeeperz\.ru/,""):e,o=document.getElementById("artist-photo");if(o){const t=n(e.artistPhoto)||defaultData.artistPhoto;o.src.endsWith(t)||(o.src=t),o.onerror=function(){this.src=defaultData.artistPhoto}}const a=document.getElementById("logo-png-container"),i=document.getElementById("logo-text-container"),s=document.getElementById("logo-png-img"),r=n(document.body.classList.contains("theme-green")&&e.logoPngGreen?e.logoPngGreen:e.logoPng);e.usePngLogo&&"string"==typeof r&&""!==r?(a&&(a.classList.remove("hidden"),s&&(s.src.endsWith(r)||(s.src=r),s.onerror=function(){e.usePngLogo=!1,a&&a.classList.add("hidden"),i&&i.classList.remove("hidden")})),i&&i.classList.add("hidden")):(a&&a.classList.add("hidden"),i&&i.classList.remove("hidden"));const l=document.getElementById("artist-name-display"),c=document.getElementById("artist-nickname-display");l&&(l.textContent=e.artistName||"Sardor Akbarov"),c&&(c.textContent=e.artistNickname||"SuNKeePeRZ");const d=document.getElementById("social-vk-link"),u=document.getElementById("social-telegram-link"),m=document.getElementById("social-instagram-link"),h=document.getElementById("social-youtube-link");d&&(d.href=e.socials?.vk||"#"),u&&(u.href=e.socials?.telegram||"#"),m&&(m.href=e.socials?.instagram||"#"),h&&(h.href=e.socials?.youtube||"#");const g={"platform-spotify-link":e.platforms?.spotify,"platform-apple-link":e.platforms?.apple,"platform-soundcloud-link":e.platforms?.soundcloud,"platform-yandex-link":e.platforms?.yandex,"platform-vkmusic-link":e.platforms?.vkmusic,"platform-youtubemusic-link":e.platforms?.youtubemusic};for(const[e,t]of Object.entries(g)){const n=document.getElementById(e);n&&(n.href=t||"#")}const p=document.getElementById("bio-short-display"),f=document.getElementById("bio-full-1-display"),y=document.getElementById("bio-full-2-display"),b=document.getElementById("bio-full-3-display");"en"===currentLang?(p&&(p.textContent=e.bio?.short_en||t.bio_short),f&&(f.textContent=e.bio?.full1_en||t.bio_full_p1),y&&(y.textContent=e.bio?.full2_en||t.bio_full_p2),b&&(b.textContent=e.bio?.full3_en||t.bio_full_p3)):(p&&(p.textContent=e.bio?.short||t.bio_short),f&&(f.textContent=e.bio?.full1||t.bio_full_p1),y&&(y.textContent=e.bio?.full2||t.bio_full_p2),b&&(b.textContent=e.bio?.full3||t.bio_full_p3));const v=document.getElementById("releases-container");if(v&&Array.isArray(e.releases)){v.replaceChildren();const t=[{key:"yandex",fallback:"https://music.yandex.ru/artist/3729245",icon:"/img/icons/plat/yandex.svg",alt:"Yandex Music",title:"Ð¯Ð½Ð´ÐµÐºÑ ÐÑзÑка"},{key:"vkmusic",fallback:"https://vk.com/artist/djsunkeeperz",icon:"/img/icons/plat/vkmusic.svg",alt:"VK Music",title:"VK ÐÑзÑка"},{key:"spotify",fallback:"https://open.spotify.com/artist/53NPxfYfgXnHv8k1q65JCV",icon:"/img/icons/plat/spotify.svg",alt:"Spotify",title:"Spotify"},{key:"apple",fallback:"https://music.apple.com/ru/artist/dj-sunkeeperz/924390539",icon:"/img/icons/plat/apple.svg",alt:"Apple Music",title:"Ap
1ple Music"},{key:"youtube",fallback:"https://www.youtube.com/@SuNKeePeRZ",icon:"/img/icons/plat/youtube.png",alt:"YouTube",title:"YouTube"}],n=(e,t)=>{if("string"!=typeof e||!e)return t;try{const n=new URL(e,window.location.origin);return["http:","https:"].includes(n.protocol)?e:t}catch{return e.startsWith("/")?e:t}},o=document.createDocumentFragment();e.releases.forEach((a,i)=>{const s=document.createElement("div");s.className=`release-card delay-${100*(i%10+1)} group relative bg-sunk-gray/40 rounded-xl overflow-hidden border border-gray-800 hover:border-sunk-red/50`;const r=document.createElement("div");r.className="release-card-inner";const l=document.createElement("div");l.className="relative aspect-square overflow-hidden rounded-t-xl";const c=document.createElement("img");c.className="release-cover w-full h-full object-cover transition-transform duration-700",c.alt=a.title||"Cover",c.loading="lazy",c.decoding="async",c.width=720,c.height=720,c.src=n(a.cover,defaultData.releases[0].cover),c.addEventListener("error",()=>{c.src=defaultData.releases[0].cover},{once:!0});const d=document.createElement("div");d.className="absolute inset-0 bg-gradient-to-t from-black via-trans
1parent to-transparent opacity-80",l.append(c,d);const u=document.createElement("div");u.className="p-2 md:p-4 text-center bg-sunk-gray/40 rounded-b-xl";const m=document.createElement("div");m.className="release-artist font-bold text-sunk-red text-sm md:text-base";const h=a.artist||e.artistNickname||"";m.textContent=h,m.title=h;const g=document.createElement("div");g.className="release-title text-white font-medium text-xs md:text-sm truncate";const p=a.title||"";g.textContent=p,g.title=p;const f=document.createElement("div");f.className="release-date text-[#FFE6E6] text-xs mt-1",f.textContent=a.date||"";const y=document.createElement("div");y.className="release-platform-icons";for(const o of t){const t=document.createElement("a");t.href=n(e.platforms?.[o.key],o.fallback),t.target="_blank",t.rel="noopener noreferrer",t.className="release-platform-icon hover:scale-110 transition-transform",t.title=o.title;const a=document.createElement("img");a.src=o.icon,a.alt=o.alt,a.loading="lazy",a.decoding="async",a.width=24,a.height=24,t.appendChild(a),y.appendChild(t)}u.append(m,g,f,y),r.append(l,u),s.appendChild(r),o.appendChild(s)}),v.appendChild(o)}const k=document.getElementById("gallery-track");if(k&&e.gallery){k.innerHTML="";let t={};try{t=JSON.parse(k.dataset.sizes||"{}")}catch(e){}e.gallery.forEach((e,n)=>{const o=document.createElement("img");o.src=e,o.alt="SuNKeePeRZ",o.loading="lazy",o.decoding="async";const a=t[e];a&&(o.width=a[0],o.height=a[1]),o.className="h-64 md:h-96 w-auto object-cover rounded-lg glow-red flex-shrink-0 cursor-pointer select-none",o.onclick=function(e){window._galleryJustDragged?e.preventDefault():openLightbox(this.src)},o.onerror=function(){this.src=defaultData.gallery[n%defaultData.gallery.length]},k.appendChild(o)})}}function initLanguageSwitcher(){const e=document.getElementById("lang-toggle"),t=document.querySelector(".lang-globe");e&&t&&(e.checked=!1,t.className="lang-globe ru",e.addEventListener("change",e=>{const n=e.target.checked?"en":"ru";t.className=`lang-globe ${n}`,updateLanguage(n)}))}function updateLanguage(e){currentLang=e;const t=translations[e];document.documentElement.lang=e,document.dispatchEvent(new CustomEvent("sunk:lang",{detail:{lang:e}})),document.querySelectorAll("[data-i18n]").forEach(e=>{const n=e.getAttribute("data-i18n");if(t[n]){const o=e.querySelector("i");e.textContent=t[n],o&&e.appendChild(o)}}),siteData&&updateSiteContent(siteData);const n=document.getElementById("bio-toggle-btn"),o=document.getElementById("bio-full");n&&o&&o.classList.contains("expanded")?n.innerHTML=`${t.show_less} <i class="fas fa-chevron-up ml-2"></i>`:n&&(n.innerHTML=`${t.read_more} <i class="fas fa-chevron-down ml-2"></i>`)}function initBioExpand(){const e=document.getElementById("bio-toggle-btn"),t=document.getElementById("bio-full");if(!e||!t)return;let n=!1;e.addEventListener("click",()=>{n=!n;const o=translations[currentLang];n?(t.classList.add("expanded"),e.innerHTML=`${o.show_less} <i class="fas fa-chevron-up ml-2"></i>`,setTimeout(()=>{e.scrollIntoView({behavior:"smooth",block:"nearest"})},400)):(t.classList.remove("expanded"),e.innerHTML=`${o.read_more} <i class="fas fa-chevron-down ml-2"></i>`)})}function initGalleryDrag(){const e=document.getElementById("gallery-track");if(!e)return;let t,n,o,a=!1,i=!1,s=0,r=null;e.addEventListener("dragstart",e=>e.preventDefault());let l=!1;function c(){r&&(cancelAnimationFrame(r),r=null)}function d(){if(!l)return;c();let t=.4,n=1;r=requestAnimationFrame(function o(){l?(!a&&e.scrollWidth>e.clientWidth&&(e.scrollLeft<=0?(n=1,t=.4):e.scrollLeft>=e.scrollWidth-e.clientWidth-1?(n=-1,t=.4):t=Math.min(.7,t+.005),e.scrollLeft+=t*n),r=requestAnimationFrame(o)):r=null})}function u(r){a=!0,i=!1,o=Date.now(),s=0,t=r-e.offsetLeft,n=e.scrollLeft,e.style.cursor="grabbing",c()}function m(o){if(!a)return;const r=2.5*(o-e.offsetLeft-t);Math.abs(r)>3&&(i=!0,s=r),e.scrollLeft=n-r}function h(){a&&(a=!1,e.style.cursor="grab",i&&(window._galleryJustDragged=!0,setTimeout(()=>{window._galleryJustDragged=!1},100)))}new IntersectionObserver(e=>{e.forEach(e=>{l=e.isIntersecting,l?d():c()})},{threshold:.1}).observe(e),e.addEventListener("mousedown",e=>{u(e.pageX)}),e.addEventListener("mousemove",e=>{a&&(e.preventDefault(),m(e.pageX))}),e.addEventListener("mouseup",e=>{const t=i;h(),t&&(e.preventDefault(),e.stopPropagation())}),e.addEventListener("mouseenter",()=>{c()}),e.addEventListener("mouseleave",()=>{h(),d()}),e.addEventListener("wheel",t=>{t.preventDefault(),e.scrollLeft+=2*t.deltaY},{passive:!1}),e.addEventListener("touchstart",e=>{u(e.touches[0].pageX)},{passive:!0}),e.addEventListener("touchmove",e=>{a&&m(e.touches[0].pageX)},{passive:!0}),e.addEventListener("touchend",()=>{h(),d()},{passive:!0})}function initLightbox(){const e=document.getElementById("lightbox"),t=document.getElementById("lightbox-img");e&&t&&(window.openLightbox=function(n){t.src=n,e.classList.remove("hidden"),setTimeout(()=>{e.classList.remove("opacity-0")},10),document.body.style.overflow="hidden"},window.closeLightbox=function(){e.classList.add("opacity-0"),setTimeout(()=>{e.classList.add("hidden"),t.src=""},300),document.body.style.overflow="auto"},e.addEventListener("click",t=>{t.target===e&&closeLightbox()}))}function initAdminIcon(){const e=document.getElementById("admin-icon");e&&e.addEventListener("click",()=>{clickCount++,clickTimer&&clearTimeout(clickTimer),clickTimer=setTimeout(()=>{clickCount>=3&&(window.location.href=BASE_PATH+"adm.html"),clickCount=0},500)})}window._galleryJustDragged=!1;let _particleAnimId=null,_particlePaused=!1;function startParticlesWhenIdle(){const e=()=>initParticles();"function"==typeof requestIdleCallback?requestIdleCallback(e,{timeout:1500}):setTimeout(e,600)}function initParticles(){_particleAnimId&&(cancelAnimationFrame(_particleAnimId),_particleAnimId=null);const e=document.getElementById("particle-canvas");if(!e)return;const t=e.getContext("2d");e.width=window.innerWidth,e.height=window.innerHeight;const n=getComputedStyle(document.documentElement),o=n.getPropertyValue("--accent-rgb").trim()||"255, 0, 0",a=n.getPropertyValue("--accent").trim()||"#ff0000";let i=[],s=[],r={x:null,y:null,radius:150};window.addEventListener("mousemove",e=>{r.x=e.x,r.y=e.y});class l{constructor(){this.x=Math.random()*e.width,this.y=Math.random()*e.height,this.vx=.4*(Math.random()-.5),this.vy=.4*(Math.random()-.5),this.size=3*Math.random()+3}update(){this.x+=this.vx,this.y+=this.vy,(this.x<0||this.x>e.width)&&(this.vx*=-1),(this.y<0||this.y>e.height)&&(this.vy*=-1)}}function c(e,n,a){if(!(e.length<2)){t.beginPath(),t.strokeStyle=`rgba(${o}, ${.3*n})`,t.lineWidth=4*a,t.lineCap="round",t.lineJoin="round",t.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)t.lineTo(e[n].x,e[n].y);t.stroke(),t.beginPath(),t.strokeStyle=`rgba(${o}, ${.9*n})`,t.lineWidth=a,t.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)t.lineTo(e[n].x,e[n].y);t.stroke(),t.beginPath(),t.strokeStyle=`rgba(255, 255, 255, ${.5*n})`,t.lineWidth=.4*a,t.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)t.lineTo(e[n].x,e[n].y);t.stroke()}}let d=performance.now()+1e3+2e3*Math.random(),u=0;const m=1e3/30;function h(n){_particlePaused||(_particleAnimId=requestAnimationFrame(h));const r=n-u;if(r<m)return;u=n-r%m;const l=performance.now();t.clearRect(0,0,e.width,e.height);for(let e=0;e<i.length;e++)i[e].update();!function(){t.strokeStyle=`rgba(${o}, 0.6)`,t.lineWidth=1.2,t.beginPath();for(let e=0;e<i.length;e++){const n=i[e];for(let o=e+1;o<i.length;o++){const e=i[o],a=n.x-e.x,s=n.y-e.y;a*a+s*s<22500&&(t.moveTo(n.x,n.y),t.lineTo(e.x,e.y))}}t.stroke(),t.fillStyle=a,t.beginPath();for(let e=0;e<i.length;e++){const n=i[e];t.moveTo(n.x+n.size,n.y),t.arc(n.x,n.y,n.size,0,2*Math.PI,!1)}t.fill()}(),l>=d&&(!function(){const t=Math.random()*e.width,n=Math.random()*e.height*.2,o=8+Math.floor(6*Math.random()),a=[{x:t,y:n}];for(let e=1;e<=o;e++){const t=a[e-1];a.push({x:t.x+180*(Math.random()-.5),y:t.y+40+80*Math.random()})}const i=[];for(let e=2;e<a.length-1;e++)if(Math.random()<.5){const t=[{x:a[e].x,y:a[e].y}],n=3+Math.floor(4*Math.random()),o=Math.random()<.5?-1:1;for(let e=1;e<=n;e++){const n=t[e-1];t.push({x:n.x+o*(30+60*Math.random()),y:n.y+20+40*Math.random()})}i.push(t)}s.push({points:a,branches:i,opacity:1,birth:performance.now(),lifetime:200+200*Math.random(),width:2+2*Math.random()})}(),d=l+2e3+2e3*Math.random()),function(e){for(let n=s.length-1;n>=0;n--){const a=s[n],i=e-a.birth;if(i>a.lifetime){s.splice(n,1);continue}const r=.5*a.lifetime;a.opacity=i<r?1:1-(i-r)/(a.lifetime-r),c(a.points,a.opacity,a.width);for(const e of a.branches)c(e,.6*a.opacity,.5*a.width);if(i<80){const e=.2*(1-i/80)*a.opacity;t.fillStyle=`rgba(${o}, ${e})`,t.beginPath(),t.arc(a.points[0].x,a.points[0].y,120+60*Math.random(),0,2*Math.PI),t.fill()}}}(l)}document.addEventListener("visibilitychange",()=>{document.hidden?_particlePaused=!0:(_particlePaused=!1,u=performance.now(),_particleAnimId=requestAnimationFrame(h))});let g=null,p=e.width,f=e.height;window.addEventListener("resize",()=>{clearTimeout(g),g=setTimeout(()=>{const t=window.innerWidth,n=window.innerHeight,o=t!==p,a=Math.abs(n-f);!o&&a<120||(e.width=t,e.height=n,p=t,f=n)},200)}),function(){i=[];let t=Math.floor(e.height*e.width/15e3);t=Math.min(t,90);for(let e=0;e<t;e++)i.push(new l)}(),_particlePaused=!1,_particleAnimId=requestAnimationFrame(h)}function initThemeToggle(){const e=document.getElementById("theme-toggle");if(!e)return;"green"===localStorage.getItem("sunk-theme")&&document.body.classList.add("theme-green"),e.addEventListener("click",()=>{document.body.classList.toggle("theme-green");const e=document.body.classList.contains("theme-green");localStorage.setItem("sunk-theme",e?"green":"red"),siteData&&(applyThemeColors(siteData),updateSiteContent(siteData)),initParticles()})}
1"serviceWorker"in navigator&&window.addEventListener("load",()=>{navigator.serviceWorker.register("/sw.js").then(e=>{console.log("ServiceWorker registered: ",e)}).catch(e=>{console.log("ServiceWorker registration failed: ",e)})}),document.addEventListener("DOMContentLoaded",()=>{"green"===localStorage.getItem("sunk-theme")&&document.body.classList.add("theme-green"),updateCopyrightYear(),loadSiteData(),initLanguageSwitcher(),initBioExpand(),initGalleryDrag(),initLightbox(),initAdminIcon(),initThemeToggle(),document.addEventListener("visibilitychange",()=>{document.hidden||loadSiteData()})});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.