(()=>{ 'use strict'; const escapeHTML=value=>String(value??'').replace(/[&<>"']/g,ch=>({ '&':'&','<':'<','>':'>','"':'"',"'":''' })[ch]); const escapeAttr=escapeHTML; const idToken=value=>String(value??'').replace(/[^a-zA-Z0-9_-]/g,''); const safeImageSrc=value=>{ const s=String(value??'').trim(); if(!s)return ''; if(/^data:image\/(?:png|jpe?g|webp|gif);base64,[a-z0-9+/=\s]+$/i.test(s))return s; if(/^(?:\.\/|\.\.\/|\/)?[a-z0-9_./-]+\.(?:png|jpe?g|webp|gif)(?:[?#][^\s]*)?$/i.test(s))return s; if(/^blob:[a-z0-9-]+:/i.test(s))return s; return ''; }; const setText=(node,value)=>{if(node)node.textContent=String(value??'');return node}; const insertBefore=(parent,node,reference=null)=>{ if(!parent||!node)return node; if(reference&&reference.parentNode===parent)parent.insertBefore(node,reference);else parent.appendChild(node); return node; }; window.SunSafe=Object.freeze({escapeHTML,escapeAttr,idToken,safeImageSrc,setText,insertBefore}); })();