1const SSB_App={config:{container:null,postId:null,ajaxUrl:null,ajaxNonce:null},state:{isPanelOpen:!1,isLoading:!1,allCommentsLoaded:!1,currentPage:1,observer:null},init:function(){this.config.container=document.querySelector(".ssb-container"),this.config.container?(this.config.postId=ssb_ajax.post_id,this.config.ajaxUrl=ssb_ajax.ajax_url,this.config.ajaxNonce=ssb_ajax.nonce,this.config.postId&&this.config.ajaxUrl&&this.config.ajaxNonce?(this.actions&&"function"==typeof this.actions.init&&this.actions.init(),this.panel&&"function"==typeof this.panel.init&&this.panel.init()):console.error("SSB configuration is incomplete. Check ssb_ajax object.",this.config)):console.warn("SSB container not found. SSB will not be initialized.")}};window.SSB_App=SSB_App,window.SSB_App&&(SSB_App.utils={logAction:function(e){if(!e)return;const t=new FormData;t.append("action","ssb_log_action"),t.append("nonce",SSB_App.config.ajaxNonce),t.append("post_id",SSB_App.config.postId),t.append("log_action",e);try{navigator.sendBeacon?navigator.sendBeacon(SSB_App.config.ajaxUrl,t):fetch(SSB_App.config.ajaxUrl,{method:"POST",body:t,keepalive:!0}).catch(console.error)}catch(e){console.error("Log sending failed:",e)}},showFormMessage:function(e,t,n=!0){const s=e.querySelector(".ssb-form-message");s&&s.remove();const o=document.createElement("p");o.className="ssb-form-message",n&&o.classList.add("error"),o.textContent=t,e.appendChild(o),setTimeout(()=>o.remove(),5e3)},updateCommentCount:function(e){const t=document.getElementById("ssb-comment-count"),n=document.getElementById("ssb-comment-btn"),s=SSB_App.panel.elements?.title;t&&(t.textContent=e),n&&n.setAttribute("aria-label",`ëê¸ì°½ ì´ê¸°, íì¬ ëê¸ ${e}ê°`),s&&(s.textContent=`ëê¸ ${e}ê°`)},getCurrentCommentCount:function(){const e=document.getElementById("ssb-comment-count");if(e){const t=parseInt(e.textContent,10);return isNaN(t)?0:t}return 0}}),window.SSB_App&&(SSB_App.actions={init:function(){document.getElementById("ssb-like-btn")?.addEventListener("click",e=>this.handleToggle("ssb_toggle_like",e.currentTarget)),document.getElementById("ssb-bookmark-btn")?.addEventListener("click",e=>this.handleToggle("ssb_toggle_bookmark",e.currentTarget)),document.getElementById("ssb-share-btn")?.addEventListener("click",()=>this.handleShare())},handleToggle:function(e,t){t.disabled=!0;const n=new FormData;n.append("action",e),n.append("post_id",SSB_App.config.postId),n.append("nonce",SSB_App.config.ajaxNonce),fetch(SSB_App.config.ajaxUrl,{method:"POST",body:n}).then(e=>e.json()).then(n=>{n.success&&(t.classList.toggle("active",n.data.active),"ssb_toggle_like"===e&&void 0!==n.data.count&&(document.getElementById("ssb-like-count").textContent=n.data.count))}).catch(e=>console.error("Fetch Error:",e)).finally(()=>{t.disabled=!1})},handleShare:async function(){const e=navigator.share&&window.isSecureContext?"webshare":"copy_link",t=new URL(window.location.href);["utm_source","utm_medium","utm_campaign","utm_id","utm_term","utm_content","gclid","gbraid","wbraid","fbclid","msclkid","ttclid","twclid","igshid"].forEach(e=>t.searchParams.delete(e)),t.searchParams.set("utm_source","sidebar_share"),t.searchParams.set("utm_medium","social_share"),t.searchParams.set("utm_campaign","share_button"),t.searchParams.set("utm_content",e);const n=t.toString(),s={title:document.title,url:n},o=async()=>{if(navigator.clipboard&&window.isSecureContext)try{return await navigator.clipboard.writeText(n),void alert("ê²ì물 주ìê° í´ë¦½ë³´ëì ë³µì¬ëììµëë¤.")}catch(e){console.warn("Clipboard API ì¤í¨, execCommandë¡ ëì²´",e)}try{const e=document.createElement("textarea");e.value=n,e.setAttribute("readonly",""),e.style.position="fixed",e.style.top="-9999px",document.body.appendChild(e),e.select();const t=document.execCommand("copy");document.body.removeChild(e),t?alert("ê²ì물 주ìê° í´ë¦½ë³´ëì ë³µì¬ëììµëë¤."):window.prompt("주ì를 ë³µì¬íì¸ì (Ctrl/Cmd + C):",n)}catch{window.prompt("주ì를 ë³µì¬íì¸ì (Ctrl/Cmd + C):",n)}};if(navigator.share&&window.isSecureContext)try{await navigator.share(s)}catch(e){if(e&&"AbortError"===e.name)return;console.error("Web Share API ì¤í¨:",e),await o()}else await o()}}),window.SSB_App&&(SSB_App.panel={elements:null,init:function(){document.getElementById("ssb-comment-btn")?.addEventListener("click",()=>this.open())},open:function(){SSB_App.state.isPanelOpen||(SSB_App.state.isPanelOpen=!0,this.create(),SSB_App.comments.fetch(),this.addEventListeners(),setTimeout(()=>{this.elements.panel.classList.add("ssb-panel-visible"),this.elements.overlay.classList.add("ssb-overlay-visible"),document.body.style.overflow="hidden",this.elements.closeBtn.focus()},10))},close:function(){SSB_App.state.isPanelOpen&&(this.elements.panel.classList.remove("ssb-panel-visible"),this.elements.overlay.classList.remove("ssb-overlay-visible"),this.removeEventListeners(),setTimeout(()=>{SSB_App.state.observer&&(SSB_App.state.observer.disconnect(),SSB_App.state.observer=null),this.elements.container.remove(),this.elements=null,SSB_App.state.isPanelOpen=!1,SSB_App.state.currentPage=1,SSB_App.state.isLoading=!1,SSB_App.state.allCommentsLoaded=!1,document.body.style.overflow=""},300))},create:function(){const e=document.createElement("div"),t=document.getElementById("ssb-comment-count")?.textContent.trim()||"0",n=document.getElementById("ssb-form-source");e.innerHTML=`\n <div id="ssb-comments-panel" role="dialog" aria-modal="true" aria-labelledby="ssb-comments-title">\n <div id="ssb-comments-header"><h3 id="ssb-comments-title">ëê¸ ${t}ê°</h3><button id="ssb-close-comments" aria-label="ë«ê¸°">Ã</button></div>\n <div id="ssb-comments-content"><div class="ssb-spinner">ë¡ë© ì¤...</div></div>\n <div id="ssb-comments-footer"></div>\n </div>\n <div id="ssb-comments-overlay"></div>`,document.body.appendChild(e),this.elements={container:e,panel:e.querySelector("#ssb-comments-panel"),overlay:e.querySelector("#ssb-comments-overlay"),title:e.querySelector("#ssb-comments-title"),content:e.querySelector("#ssb-comments-content"),footer:e.querySelector("#ssb-comments-footer"),closeBtn:e.querySelector("#ssb-close-comments")},n&&(this.elements.footer.innerHTML=n.innerHTML)},addEventListeners:function(){this.elements.closeBtn.addEventListener("click",()=>this.close()),this.elements.overlay.addEventListener("click",()=>this.close()),document.addEventListener("keydown",this.handleEscKey),SSB_App.comments.setupFormListener(),SSB_App.comments.setupReplyLogic()},removeEventListeners:function(){document.removeEventListener("keydown",this.handleEscKey)},handleEscKey:e=>{"Escape"===e.key&&SSB_App.state.isPanelOpen&&SSB_App.panel.close()}}),window.SSB_App&&(SSB_App.comments={fetch:function(){if(SSB_App.state.isLoading||SSB_App.state.allCommentsLoaded)return;SSB_App.state.isLoading=!0;const{content:e}=SSB_App.panel.elements,t=e.querySelector(".ssb-load-more");t&&(t.innerHTML="ë¡ë© ì¤...");const n=new FormData;n.append("action","ssb_fetch_comments"),n.append("nonce",SSB_App.config.ajaxNonce),n.append("post_id",SSB_App.config.postId),n.append("page",SSB_App.state.currentPage),fetch(SSB_App.config.ajaxUrl,{method:"POST",body:n}).then(e=>e.json()).then(t=>{if(e.querySelector(".ssb-spinner")?.remove(),e.querySelector(".ssb-load-more")?.remove(),t.success){let n=e.querySelector(".ssb-comment-list");if(n||(e.innerHTML='<ul class="ssb-comment-list"></ul>',n=e.querySelector(".ssb-comment-list")),t.data.html?n.insertAdjacentHTML("beforeend",t.data.html):1===SSB_App.state.currentPage&&(e.innerHTML='<p class="no-comments-yet">ìì§ ëê¸ì´ ììµëë¤. 첫 ëê¸ì ìì±í´ë³´ì¸ì!</p>'),t.data.has_more){e.insertAdjacentHTML("beforeend",'<button class="ssb-load-more">ëê¸ ë 보기</button>'),SSB_App.state.currentPage++;const t=e.querySelector(".ssb-load-more");t&&(SSB_App.comments.setupIntersectionObserver(),SSB_App.state.observer.observe(t))}else SSB_App.state.allCommentsLoaded=!0}else 1===SSB_App.state.currentPage&&(e.innerHTML="<p>ëê¸ì ë¶ë¬ì¤ëë° ì¤í¨íìµëë¤.</p>")}).catch(()=>{1===SSB_App.state.currentPage&&(e.innerHTML="<p>ëê¸ ì¤ë¥ê° ë°ìíìµëë¤.</p>")}).finally(()=>{SSB_App.state.isLoading=!1})},setupIntersectionObserver:function(){SSB_App.state.observer||(SSB_App.state.observer=new IntersectionObserver(e=>
1{e.forEach(e=>{!e.isIntersecting||SSB_App.state.isLoading||SSB_App.state.allCommentsLoaded||SSB_App.comments.fetch()})},{root:SSB_App.panel.elements.content,rootMargin:"100px",threshold:.1}))},setupFormListener:function(){const e=SSB_App.panel.elements.footer.querySelector("#ssb-mini-comment-form");e&&e.addEventListener("submit",t=>{t.preventDefault();const n=e.querySelector("#ssb-comment-textarea"),s=e.querySelector('button[type="submit"]'),o=e.querySelector(".ssb-spinner");if(!n.value.trim()||s.disabled)return;s.disabled=!0,o&&(o.style.display="inline-block");const a=new FormData(e);a.append("action","ssb_submit_comment"),a.append("nonce",SSB_App.config.ajaxNonce),a.append("post_id",SSB_App.config.postId),fetch(SSB_App.config.ajaxUrl,{method:"POST",body:a}).then(e=>e.json()).then(t=>{if(t.success){const s=SSB_App.panel.elements.content;s.querySelector(".no-comments-yet")?.remove();let o=s.querySelector(".ssb-comment-list");o||(o=document.createElement("ul"),o.className="ssb-comment-list",s.innerHTML="",s.appendChild(o));const a=t.data.parent||0,c=a>0?o.querySelector(`#comment-${a}`):null;if(c){let e=c.querySelector("ul.children");e||(e=document.createElement("ul"),e.className="children",c.appendChild(e)),e.insertAdjacentHTML("beforeend",t.data.html)}else o.insertAdjacentHTML("beforeend",t.data.html);if(n.value="",SSB_App.comments.resetReplyForm(e),null!==t.data.count)SSB_App.utils.updateCommentCount(t.data.count);else{const e=SSB_App.utils.getCurrentCommentCount();SSB_App.utils.updateCommentCount(e+1)}const r=document.getElementById(`comment-${t.data.new_comment_id}`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),this.checkReplyDepth(r))}else SSB_App.utils.showFormMessage(e,t.data.message||"ëê¸ ìì± ì¤ë¥.")}).catch(()=>SSB_App.utils.showFormMessage(e,"ë¤í¸ìí¬ ì¤ë¥.")).finally(()=>{s.disabled=!1,o&&(o.style.display="none")})})},checkReplyDepth:function(e){const t=parseInt(ssb_ajax.max_depth,10);if(isNaN(t)||0===t)return;let n=0,s=e.parentElement;for(;s&&(s.matches("ul.children")&&n++,!s.matches(".ssb-comment-list"));)s=s.parentElement;if(n+1>=t){const t=e.querySelector(".ssb-reply-btn");t&&t.remove()}},setupReplyLogic:function(){const{container:e}=SSB_App.panel.elements;e&&e.addEventListener("click",e=>{const t=e.target.closest(".ssb-reply-btn");if(t){e.preventDefault();const n=t.dataset.parentId||"0",s=t.dataset.authorName||"",o=SSB_App.panel.elements.footer.querySelector("#ssb-mini-comment-form");if(!o)return;o.querySelector("#ssb-comment-parent").value=n;const a=o.querySelector("#ssb-comment-textarea");a.placeholder=`${s}ëìê² ëµê¸ ë¨ê¸°ë ì¤...`,a.focus(),o.querySelector("#ssb-cancel-reply").style.display="inline-block",o.closest("#ssb-comments-footer")?.scrollIntoView({behavior:"smooth",block:"center"})}if(e.target.closest("#ssb-cancel-reply")){const e=SSB_App.panel.elements.footer.querySelector("#ssb-mini-comment-form");e&&SSB_App.comments.resetReplyForm(e)}})},resetReplyForm:function(e){e.querySelector("#ssb-comment-parent").value="
10",e.querySelector("#ssb-comment-textarea").placeholder="ëê¸ ì¶ê°...",e.querySelector("#ssb-cancel-reply").style.display="none"}});
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.