librecap
Version:
An open-source CAPTCHA Box alternative designed with privacy and data protection in mind.
7 lines • 62.3 kB
JavaScript
/*!
* LibreCap v0.3.5
* https://github.com/librecap/librecap
* (c) 2025 LibreCap Contributors
* Released under the Apache 2.0 License
*/
{class t{constructor(){this.selectedImages=new Set,this.activePopup=null,this.activeOverlay=null,this.activeInfoPage=null,this.currentView="challenge",this.previousView=null,this.currentImagePowChallenge=null,this.currentImageChallenge=null,this.currentImageChallengeIndex=0,this.totalImageChallenges=1,this.selectedImagesPerChallenge=[],this.currentAudioPowChallenge=null,this.currentAudioChallenge=null,this.currentAudioChallengeIndex=0,this.totalAudioChallenges=1,this.currentAudioInput="",this.t=null,this.imageChallenge=new r(this),this.audioChallenge=new i(this),this.solve_pow_challenge=c,this.initialRequest=p,this.challengeRequest=o,this.audioChallengeRequest=h}createImageElement(e,t=null){let a=new Blob([e],{type:"image/webp"}),r=document.createElement("img"),i=URL.createObjectURL(a);return r.src=i,r.onload=()=>{URL.revokeObjectURL(i),t&&t()},r}updateVerifyButton(e,t){var a;e&&(a=t===this.totalImageChallenges-1,e.disabled=0===this.selectedImagesPerChallenge[t]?.size,e.textContent=a?"VERIFY":"NEXT")}cleanup(){var e;this.t&&(window.removeEventListener("resize",this.t),this.t=null),this.activePopup&&(this.pauseAudioIfPlaying(this.activePopup),(e=this.activePopup.querySelector(".audio-player"))&&e.src&&e.src.startsWith("blob:")&&URL.revokeObjectURL(e.src),this.activePopup.remove(),this.activePopup=null)}showError(e,t){let a=e.querySelector(".error-section");a.querySelector(".error-message").textContent=t,a.classList.add("active"),setTimeout(()=>{a.classList.remove("active")},5e3)}async newImageChallenge(t,e){try{var a=await p(e.apiEndpoint,e.siteKey),r=await c(a.first),i=await o(e.apiEndpoint,e.siteKey,a.first,r);this.currentImagePowChallenge=a.second,this.currentImageChallenge=i,this.selectedImages.clear(),this.currentImageChallengeIndex=0,this.totalImageChallenges=Math.floor((i.images.length-1)/9),this.selectedImagesPerChallenge=Array(this.totalImageChallenges).fill().map(()=>new Set),this.activePopup?this.updateExistingPopup(i):this.createChallengePopup(t,i,e)}catch(e){this.showError(t,e.message||"Failed to load challenge"),t.classList.remove("loading")}}async newAudioChallenge(t,e){try{var a,r=await p(e.apiEndpoint,e.siteKey),i=await c(r.first),o=await h(e.apiEndpoint,e.language,e.siteKey,r.first,i);this.currentAudioPowChallenge=r.second,this.currentAudioChallenge=o,this.currentAudioChallengeIndex=0,this.totalAudioChallenges=o.audios.length,this.currentAudioInput="",this.activePopup?(this.activePopup.querySelector(".sound-challenge-view")||((a=this.audioChallenge.createSoundChallengeView(this.activePopup)).classList.add("sound-challenge-view"),this.activePopup.appendChild(a)),this.updateExistingAudioPopup(o)):this.createChallengePopup(t,o,e)}catch(e){this.showError(t,e.message||"Failed to load audio challenge"),t.classList.remove("loading")}}updateExistingPopup(e){var t=this.activePopup.querySelector(".challenge-progress"),t=(t&&(t.textContent=`Challenge ${this.currentImageChallengeIndex+1} of `+this.totalImageChallenges),this.activePopup.querySelector(".example-image img")),a=(t&&(a=this.createImageElement(e.images[0]),t.parentNode.replaceChild(a,t)),this.activePopup.querySelector(".challenge-grid")),t=this.activePopup.querySelector(".verify-button");a&&t&&this.updateGrid(a,e,0,t),"info"===this.currentView&&this.showChallengeView(this.activePopup)}updateExistingAudioPopup(a){var r=this.activePopup.querySelector(".audio-player");if(r){r.src&&r.src.startsWith("blob:")&&URL.revokeObjectURL(r.src);let e=new Blob([a.audios[this.currentAudioChallengeIndex]],{type:"audio/mp3"}),t=URL.createObjectURL(e);r.src=t,r.addEventListener("error",()=>{URL.revokeObjectURL(t)},{once:!0})}a=this.activePopup.querySelector(".challenge-progress"),a&&(a.textContent=`Challenge ${this.currentAudioChallengeIndex+1} of `+this.totalAudioChallenges),r=this.activePopup.querySelector(".verify-button"),r&&(r.disabled=!0,r.textContent=this.currentAudioChallengeIndex<this.totalAudioChallenges-1?"NEXT":"VERIFY"),a=this.activePopup.querySelector(".sound-input-field");a&&(a.value=this.currentAudioInput),"info"===this.currentView&&this.showChallengeView(this.activePopup)}updateGrid(e,r,i,o){e.innerHTML="";let c=9*i;this.selectedImages=this.selectedImagesPerChallenge[i],this.selectedImagesPerChallenge[i]||(this.selectedImagesPerChallenge[i]=new Set);for(let a=c;a<9+c;a++){let t=document.createElement("div");t.className="challenge-image",this.selectedImagesPerChallenge[i].has(a-c)&&t.classList.add("selected");var n=this.createImageElement(r.images[a+1]);t.appendChild(n),t.addEventListener("click",()=>{var e=t.classList.contains("selected");t.classList.toggle("selected"),e?this.selectedImagesPerChallenge[i].delete(a-c):this.selectedImagesPerChallenge[i].add(a-c),this.updateVerifyButton(o,i)}),e.appendChild(t)}this.updateVerifyButton(o,i);var t=this.activePopup.querySelector(".challenge-progress");t&&(t.textContent=`Challenge ${i+1} of `+this.totalImageChallenges)}createSVGIcons(){return{reload:'<svg viewBox="0 0 24 24"><path d="M17.65 6.35A7.958 7.958 0 0012 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0112 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/></svg>',sound:'<svg viewBox="0 0 24 24"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/></svg>',image:'<svg viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>',info:'<svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>',close:'<svg viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>',back:'<svg viewBox="0 0 24 24"><path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"/></svg>'}}createChallengePopup(o,c,r){var e=this.createSVGIcons();this.cleanup();let n=document.createElement("div");n.className="libre-captcha-popup",n.style.visibility="hidden",n.config=r;var t=(n.triggerContainer=o).getAttribute("data-theme")||"auto",a=(n.setAttribute("data-theme",t),this.activePopup=n,c.audios&&0<c.audios.length),i=c.images&&0<c.images.length,l=document.createElement("div");if(l.className="challenge-view",l.setAttribute("data-theme",t),i){var t=document.createElement("div"),p=(t.className="challenge-example",document.createElement("div")),h=(p.className="challenge-header",document.createElement("div"));h.className="challenge-title",h.innerText="Select all images containing a dog with the same facial expression";let i=document.createElement("div");i.className="challenge-controls",[{icon:e.reload,title:"New challenge",action:()=>{let e=i.children[0];e.classList.add("loading");var t=this.activePopup.querySelector(".progress-overlay"),a=t.querySelector(".progress-overlay-text"),t=t.querySelector(".progress-overlay-fill");a.textContent="0 done",t.style.width="0%",this.imageChallenge.newImageChallenge(o,r).finally(()=>{e.classList.remove("loading")})}},{icon:e.sound,title:"Sound challenge",action:()=>{let e=i.children[1];e.classList.add("loading"),this.audioChallenge.currentAudioChallenge&&this.audioChallenge.currentAudioChallenge.audios?(e.classList.remove("loading"),this.showSoundChallengeView(n)):this.audioChallenge.newAudioChallenge(o,r).finally(()=>{e.classList.remove("loading"),this.showSoundChallengeView(n)})}},{icon:e.info,title:"Information",action:()=>this.showInfoView(n)}].forEach(({icon:e,title:t,action:a})=>{var r=document.createElement("button");r.className="challenge-button",r.title=t,r.innerHTML=e,a&&r.addEventListener("click",a),i.appendChild(r)});var e=document.createElement("div"),s=(e.className="example-image",this.imageChallenge.createImageElement(c.images[0]));e.appendChild(s),p.appendChild(h),p.appendChild(i),t.appendChild(p),t.appendChild(e),l.appendChild(t),this.imageChallenge.currentImageChallenge=c,this.imageChallenge.totalImageChallenges=Math.floor((c.images.length-1)/9),this.imageChallenge.currentImageChallengeIndex=0,this.imageChallenge.selectedImagesPerChallenge=Array(this.imageChallenge.totalImageChallenges).fill().map(()=>new Set)}var s=document.createElement("div"),h=(s.className="progress-overlay",document.createElement("div")),p=(h.className="progress-overlay-content",document.createElement("div")),e=(p.className="progress-overlay-text",p.textContent="0 done",document.createElement("div")),t=(e.className="progress-overlay-bar",document.createElement("div")),h=(t.className="progress-overlay-fill",t.style.width="0%",e.appendChild(t),h.appendChild(p),h.appendChild(e),s.appendChild(h),void 0===r.logo&&void 0===r.title||((t=document.createElement("div")).className="progress-overlay-brand",void 0!==r.logo&&((p=document.createElement("img")).src=r.logo,void 0!==r.title&&(p.alt=r.title),t.appendChild(p)),void 0!==r.title&&((e=document.createElement("div")).className="progress-overlay-brand-title",e.textContent=r.title,t.appendChild(e)),s.appendChild(t)),n.appendChild(s),this.createInfoView(n));if(n.appendChild(h),a){p=this.audioChallenge.createSoundChallengeView(n);p.classList.add("sound-challenge-view"),n.appendChild(p),this.currentView="sound-challenge",setTimeout(()=>{this.audioChallenge.updateExistingAudioPopup(c)},0)}else if(i){n.appendChild(l),this.currentView="challenge";let r=document.createElement("div"),i=(r.className="challenge-grid",document.createElement("button"));i.className="verify-button",i.disabled=!0,i.textContent=1<this.imageChallenge.totalImageChallenges?"NEXT":"VERIFY",i.addEventListener("click",()=>{let e=this.activePopup.querySelector(".progress-overlay"),t=e.querySelector(".progress-overlay-text"),a=e.querySelector(".progress-overlay-fill");e.classList.add("active"),this.imageChallenge.currentImageChallengeIndex<this.imageChallenge.totalImageChallenges-1?(t.textContent=this.imageChallenge.currentImageChallengeIndex+1+" done",a.style.width=(this.imageChallenge.currentImageChallengeIndex+1)/this.imageChallenge.totalImageChallenges*100+"%",setTimeout(()=>{e.classList.remove("active"),this.imageChallenge.currentImageChallengeIndex++,this.imageChallenge.updateGrid(r,c,this.imageChallenge.currentImageChallengeIndex,i)},1e3)):(t.textContent=this.imageChallenge.totalImageChallenges+" done",a.style.width="100%",setTimeout(()=>{this.imageChallenge.handleVerification(o,n)},1e3))}),l.appendChild(r),l.appendChild(i),this.imageChallenge.updateGrid(r,c,0,i)}return document.body.appendChild(n),this.positionPopup(n,o),n.style.visibility="visible",n.classList.add("active"),this.t=()=>{n&&n.isConnected?this.positionPopup(n,o):this.cleanup()},window.addEventListener("resize",this.t),n}handleVerification(t,e){try{this.pauseAudioIfPlaying(e),this.currentImagePowChallenge&&this.currentImageChallenge&&this.selectedImagesPerChallenge.map((e,t)=>({challenge:t+1,selectedIndexes:Array.from(e)})),e.classList.remove("active"),this.selectedImagesPerChallenge=[],this.currentChallengeIndex=0;var a=t.querySelector(".captcha-checkbox");a&&(a.checked=!0)}catch(e){this.showError(t,"Failed to verify challenge")}}createInfoView(e){var t,a=this.createSVGIcons(),r=e.config,i=document.createElement("div"),o=(i.className="info-content",e.hasAttribute("data-theme")&&(o=e.getAttribute("data-theme"),i.setAttribute("data-theme",o)),document.createElement("div")),c=(o.className="info-header",document.createElement("button")),a=(c.className="back-button",c.innerHTML=a.back+" Back to challenge",c.addEventListener("click",()=>{"sound-challenge"===this.previousView?this.showSoundChallengeView(e):this.showChallengeView(e)}),o.appendChild(c),document.createElement("div")),n=(a.className="info-main-content",void 0===r.logo&&void 0===r.title||((c=document.createElement("div")).className="info-logo-container",t=void 0!==r.url?document.createElement("a"):document.createElement("div"),void 0!==r.url&&(t.href=encodeURI(r.url),t.target="_blank",t.rel="noopener noreferrer",t.className="brand-wrapper"),void 0!==r.logo&&((n=document.createElement("img")).className="info-logo",n.src=encodeURI(r.logo),void 0!==r.title&&(n.alt=r.title),t.appendChild(n)),void 0!==r.title&&((n=document.createElement("div")).className="info-brand-title",n.textContent=r.title,t.appendChild(n)),c.appendChild(t),a.appendChild(c)),void 0!==r.description&&((n=document.createElement("div")).className="info-text",n.textContent=r.description,a.appendChild(n)),void 0!==r.githubUrl&&((t=document.createElement("div")).className="github-container",(c=document.createElement("a")).href=encodeURI(r.githubUrl),c.target="_blank",c.rel="noopener noreferrer",c.className="github-button",c.innerHTML='<svg viewBox="0 0 24 24" width="20" height="20"><path fill="currentColor" d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg> View Source on GitHub',t.appendChild(c),a.appendChild(t)),document.createElement("div"));return n.className="info-links",void 0!==r.termsUrl&&((c=document.createElement("a")).href=encodeURI(r.termsUrl),c.className="info-link",c.target="_blank",c.rel="noopener noreferrer",c.textContent="Terms",n.appendChild(c)),void 0!==r.privacyUrl&&((t=document.createElement("a")).href=encodeURI(r.privacyUrl),t.className="info-link",t.target="_blank",t.rel="noopener noreferrer",t.textContent="Privacy",n.appendChild(t)),n.hasChildNodes()&&a.appendChild(n),i.appendChild(o),i.appendChild(a),i}showInfoView(e){var t=e.querySelector(".challenge-view:not(.sound-challenge-view)"),a=e.querySelector(".info-content"),r=e.querySelector(".sound-challenge-view");this.previousView=this.currentView,this.pauseAudioIfPlaying(e),t&&(t.style.display="none"),r&&(r.style.display="none"),a.style.display="flex",this.currentView="info"}showSoundChallengeView(t){if(!t.querySelector(".sound-challenge-view")){let e=this.audioChallenge.createSoundChallengeView(t);e.classList.add("sound-challenge-view"),t.appendChild(e),this.audioChallenge.currentAudioChallenge&&this.audioChallenge.currentAudioChallenge.audios&&this.audioChallenge.updateExistingAudioPopup(this.audioChallenge.currentAudioChallenge)}var e=t.querySelector(".challenge-view:not(.sound-challenge-view)"),a=t.querySelector(".info-content"),t=t.querySelector(".sound-challenge-view");e&&(e.style.display="none"),a.style.display="none",t.style.display="block",this.currentView="sound-challenge"}showChallengeView(e){var t=e.querySelector(".challenge-view:not(.sound-challenge-view)"),a=e.querySelector(".info-content"),r=e.querySelector(".sound-challenge-view");this.pauseAudioIfPlaying(e),a.style.display="none",r&&(r.style.display="none"),t&&(t.style.display="block"),this.currentView="challenge"}positionPopup(e,t){let a=t.getBoundingClientRect(),r=window.innerWidth,i=window.innerHeight,o=window.scrollY,c=window.scrollX,n=(e.style.position="absolute",e.style.left="0",e.style.top="0",e.style.transform="",e.style.display="block",e.offsetWidth),l=e.offsetHeight,p,h;switch(n+10<=r-a.right?"right":n+10<=a.left?"left":l+10<=a.top?"above":l+10<=i-a.bottom?"below":"center"){case"right":p=a.right+10+c,h=a.top+o;break;case"left":p=a.left-n-10+c,h=a.top+o;break;case"above":p=a.left+c,h=a.top-l-10+o;break;case"below":p=a.left+c,h=a.bottom+10+o;break;case"center":return e.style.position="fixed",e.style.left="50%",e.style.top="50%",void(e.style.transform="translate(-50%, -50%)")}p<c?p=c+10:p+n>c+r&&(p=c+r-n-10),h<o?h=o+10:h+l>o+i&&(h=o+i-l-10),e.style.left=p+"px",e.style.top=h+"px"}pauseAudioIfPlaying(e){e=e.querySelector(".sound-challenge-view");if(e&&"sound-challenge"===this.currentView){e=e.querySelector(".audio-player");if(e)try{e.pause()}catch(e){}}}}let n=Math.min(navigator.hardwareConcurrency||4,8),l='let hasherCache={words:null,buffer:null,resultBuffer:null,w:new Array(64)},K=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],H=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];function sha256(e){let r=e;(e instanceof ArrayBuffer||e instanceof Uint8Array)&&(r=arrayBufferToWordArray(e));var a=H.slice(0),t=prepareBlocks(r);for(let e=0;e<t.length;e+=16)processBlock(a,t,e);return hashStateToUint8Array(a)}function arrayBufferToWordArray(e){var r=e instanceof Uint8Array?e:new Uint8Array(e),a=Math.ceil(r.length/4),t=((!hasherCache.words||hasherCache.words.length<a)&&(hasherCache.words=new Array(a)),hasherCache.words);for(let e=0;e<a;e++)t[e]=0;for(let e=0;e<r.length;e++)t[e>>>2]|=r[e]<<24-e%4*8;return{words:t,sigBytes:r.length}}function prepareBlocks(e){var r=e.words,e=e.sigBytes,a=16*Math.ceil((e+9)/64),t=((!hasherCache.buffer||hasherCache.buffer.length<a)&&(hasherCache.buffer=new Array(a)),hasherCache.buffer),n=Math.min(r.length,a);for(let e=0;e<n;e++)t[e]=r[e];for(let e=n;e<a;e++)t[e]=0;t[e>>>2]|=128<<24-e%4*8;e*=8;return 4294967295<(t[a-1]=e)&&(t[a-2]=Math.floor(e/4294967296)),t}function processBlock(e,r,a){let t=e[0],n=e[1],s=e[2],h=e[3],l=e[4],o=e[5],f=e[6],i=e[7];var u=hasherCache.w;for(let e=0;e<16;e++)u[e]=r[a+e];for(let e=16;e<64;e++){var c=u[e-15],g=u[e-2];u[e]=((c>>>7|c<<25)^(c>>>18|c<<14)^c>>>3)+u[e-7]+((g>>>17|g<<15)^(g>>>19|g<<13)^g>>>10)+u[e-16]|0}for(let r=0;r<64;r+=8)for(let e=0;e<8;e++){var w=r+e,y=l&o^~l&f,d=t&n^t&s^n&s,A=(t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10),B=(l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7),B=i+B+y+K[w]+u[w]|0;i=f,f=o,o=l,l=h+B|0,h=s,s=n,n=t,t=B+(A+d|0)|0}e[0]=e[0]+t|0,e[1]=e[1]+n|0,e[2]=e[2]+s|0,e[3]=e[3]+h|0,e[4]=e[4]+l|0,e[5]=e[5]+o|0,e[6]=e[6]+f|0,e[7]=e[7]+i|0}function hashStateToUint8Array(r){hasherCache.resultBuffer||(hasherCache.resultBuffer=new Uint8Array(32));var a=hasherCache.resultBuffer;for(let e=0;e<8;e++){var t=r[e],n=4*e;a[n]=t>>>24&255,a[1+n]=t>>>16&255,a[2+n]=t>>>8&255,a[3+n]=255&t}return a}function hasRequiredLeadingZeros(r,e){var a=Math.floor(e/8);for(let e=0;e<a;e++)if(0!==r[e])return!1;e%=8;return 0==e||0==(r[a]&255<<8-e)}async function solveChallenge(e,r,a=0,t=5e4){var n=new Uint8Array(e.nonce),s=new Uint8Array(e.timestamp),e=new Uint8Array(e.signature),h=r;let l=BigInt(a);for(var o,f=new Uint8Array(n.length+s.length+e.length+8),r=(f.set(n,0),f.set(s,n.length),f.set(e,n.length+s.length),n.length+s.length+e.length),i=new DataView(f.buffer,r,8);;){for(let e=0;e<t;e++){if(i.setBigUint64(0,l,!1),hasRequiredLeadingZeros(sha256(f),h))return o=new Uint8Array(8),new DataView(o.buffer).setBigUint64(0,l,!1),void self.postMessage({solution:o,found:!0});l+=1n}await new Promise(e=>setTimeout(e,0))}}self.onmessage=async function(e){if("solve"===e.data.type)try{await solveChallenge(e.data.challenge,e.data.hardness,e.data.startValue||0)}catch(e){self.postMessage({type:"error",error:e.toString()})}};';async function c(c){return new Promise((a,r)=>{let i=[];for(let t=0;t<n;t++){var e=new Worker("data:text/javascript,"+encodeURIComponent(l)),o=(i.push(e),BigInt(t)*(BigInt(Number.MAX_SAFE_INTEGER)/BigInt(n)));e.onmessage=function(e){e=e.data;if(e.solution){for(var t of i)t.terminate();i.length=0,a(e.solution)}else"error"===e.type&&r(Error(e.error))},e.onerror=function(e){r(Error(`Worker ${t} error: `+e.message))},e.postMessage({type:"solve",challenge:c,hardness:c.hardness,startValue:o})}})}class b{constructor(e,t,a,r){this.nonce=e,this.timestamp=t,this.signature=a,this.hardness=r}}class a{constructor(e,t,a,r){this.nonce=e,this.timestamp=t,this.signature=a,this.indicesHash=r}}class d extends a{constructor(e,t,a,r,i){super(e,t,a,r),this.images=i}}class g extends a{constructor(e,t,a,r,i){super(e,t,a,r),this.audios=i}}function s(e,t){try{var a=new Uint8Array(65),r=(a.set(e.nonce,0),new Uint8Array(e.timestamp)),i=new DataView(r.buffer).getBigUint64(0,!1);return new DataView(a.buffer,16,8).setBigUint64(0,i,!1),a[24]=e.hardness,a.set(e.signature,25),a.set(t,57),a}catch(e){return null}}async function p(e,t){t=t?{"Librecap-Site-Key":t}:{};try{var a=await fetch(e+"/initial",{headers:t});if(!a.ok)throw Error(`Server returned ${a.status}: `+a.statusText);var r=await a.arrayBuffer();try{var i=new Uint8Array(r),o=i.slice(0,16),c=i.slice(16,24),n=i[24],l=i.slice(25,57),p=i.slice(57,73),h=i.slice(73,81),s=i[81],d=i.slice(82);return{first:new b(o,c,l,n),second:new b(p,h,d,s)}}catch(e){return null}}catch{throw Error("The server is not available. Please provide an valid site key or server url. Try again later.")}}async function o(e,t,a,r){a=s(a,r);if(!a)throw Error("Error generating POW solution buffer");r=await fetch(e+"/challenge",{method:"POST",headers:t?{"Content-Type":"application/octet-stream","Librecap-Site-Key":t}:{"Content-Type":"application/octet-stream"},body:a});if(!r.ok)throw Error(`Server returned ${r.status}: `+r.statusText);e=await r.arrayBuffer();try{var i=new Uint8Array(e),o=i.slice(0,16),c=i.slice(16,24),n=i.slice(24,56),l=i.slice(56,88),p=i.slice(88),h=(e=>{let t=new DataView(e),a=[],r=0;for(;r+4<=e.byteLength;){var i=t.getUint32(r,!1);if((r+=4)+i>e.byteLength)throw Error("Buffer is truncated");var o=new Uint8Array(e,r,i);a.push(o),r+=i}if(r!==e.byteLength)throw Error("Buffer contains extra bytes");return a})(p.buffer.slice(p.byteOffset,p.byteOffset+p.byteLength));return new d(o,c,n,l,h)}catch(e){return null}}async function h(e,t,a,r,i){r=s(r,i);if(!r)throw Error("Error generating POW solution buffer");i=a?{"Content-Type":"application/octet-stream","Librecap-Site-Key":a}:{"Content-Type":"application/octet-stream"},null!==t&&(i["Librecap-Language"]=t),a=await fetch(e+"/audio_challenge",{method:"POST",headers:i,body:r});if(!a.ok)throw Error(`Server returned ${a.status}: `+a.statusText);t=await a.arrayBuffer();try{var o=new Uint8Array(t),c=o.slice(0,16),n=o.slice(16,24),l=o.slice(24,56),p=o.slice(56,88),h=[o.slice(88)];return new g(c,n,l,p,h)}catch(e){return null}}class r{constructor(e){this.ui=e,this.selectedImages=new Set,this.currentImagePowChallenge=null,this.currentImageChallenge=null,this.currentImageChallengeIndex=0,this.totalImageChallenges=1,this.selectedImagesPerChallenge=[]}createImageElement(e,t=null){let a=new Blob([e],{type:"image/webp"}),r=document.createElement("img"),i=URL.createObjectURL(a);return r.src=i,r.onload=()=>{URL.revokeObjectURL(i),t&&t()},r}updateVerifyButton(e,t){var a;e&&(a=t===this.totalImageChallenges-1,e.disabled=0===this.selectedImagesPerChallenge[t]?.size,e.textContent=a?"VERIFY":"NEXT")}async newImageChallenge(t,e){try{var a=await this.ui.initialRequest(e.apiEndpoint,e.siteKey),r=await this.ui.solve_pow_challenge(a.first),i=await this.ui.challengeRequest(e.apiEndpoint,e.siteKey,a.first,r);this.currentImagePowChallenge=a.second,this.currentImageChallenge=i,this.selectedImages.clear(),this.currentImageChallengeIndex=0,this.totalImageChallenges=Math.floor((i.images.length-1)/9),this.selectedImagesPerChallenge=Array(this.totalImageChallenges).fill().map(()=>new Set),this.ui.activePopup?this.updateExistingPopup(i):this.createChallengePopup(t,i,e)}catch(e){this.ui.showError(t,e.message||"Failed to load challenge"),t.classList.remove("loading")}}updateExistingPopup(e){var t=this.ui.activePopup.querySelector(".challenge-progress"),t=(t&&(t.textContent=`Challenge ${this.currentImageChallengeIndex+1} of `+this.totalImageChallenges),this.ui.activePopup.querySelector(".example-image img")),a=(t&&(a=this.createImageElement(e.images[0]),t.parentNode.replaceChild(a,t)),this.ui.activePopup.querySelector(".challenge-grid")),t=this.ui.activePopup.querySelector(".verify-button");a&&t&&this.updateGrid(a,e,0,t),"info"===this.ui.currentView&&this.ui.showChallengeView(this.ui.activePopup)}updateGrid(e,r,i,o){e.innerHTML="";let c=9*i;this.selectedImages=this.selectedImagesPerChallenge[i],this.selectedImagesPerChallenge[i]||(this.selectedImagesPerChallenge[i]=new Set);for(let a=c;a<9+c;a++){let t=document.createElement("div");t.className="challenge-image",this.selectedImagesPerChallenge[i].has(a-c)&&t.classList.add("selected");var n=this.createImageElement(r.images[a+1]);t.appendChild(n),t.addEventListener("click",()=>{var e=t.classList.contains("selected");t.classList.toggle("selected"),e?this.selectedImagesPerChallenge[i].delete(a-c):this.selectedImagesPerChallenge[i].add(a-c),this.updateVerifyButton(o,i)}),e.appendChild(t)}this.updateVerifyButton(o,i);var t=this.ui.activePopup.querySelector(".challenge-progress");t&&(t.textContent=`Challenge ${i+1} of `+this.totalImageChallenges)}handleVerification(t,e){try{this.ui.pauseAudioIfPlaying(e),this.currentImagePowChallenge&&this.currentImageChallenge&&this.selectedImagesPerChallenge.map((e,t)=>({challenge:t+1,selectedIndexes:Array.from(e)})),e.classList.remove("active"),this.selectedImagesPerChallenge=[],this.currentImageChallengeIndex=0;var a=t.querySelector(".captcha-checkbox");a&&(a.checked=!0)}catch(e){this.ui.showError(t,"Failed to verify challenge")}}}class i{constructor(e){this.ui=e,this.currentAudioPowChallenge=null,this.currentAudioChallenge=null,this.currentAudioChallengeIndex=0,this.totalAudioChallenges=1,this.currentAudioInput=""}async newAudioChallenge(t,e){try{var a,r=await this.ui.initialRequest(e.apiEndpoint,e.siteKey),i=await this.ui.solve_pow_challenge(r.first),o=await this.ui.audioChallengeRequest(e.apiEndpoint,e.language,e.siteKey,r.first,i);this.currentAudioPowChallenge=r.second,this.currentAudioChallenge=o,this.currentAudioChallengeIndex=0,this.totalAudioChallenges=o.audios.length,this.currentAudioInput="",this.ui.activePopup?(this.ui.activePopup.querySelector(".sound-challenge-view")||((a=this.createSoundChallengeView(this.ui.activePopup)).classList.add("sound-challenge-view"),this.ui.activePopup.appendChild(a)),this.updateExistingAudioPopup(o)):this.ui.createChallengePopup(t,o,e)}catch(e){this.ui.showError(t,e.message||"Failed to load audio challenge"),t.classList.remove("loading")}}updateExistingAudioPopup(a){var r=this.ui.activePopup.querySelector(".audio-player");if(r){r.src&&r.src.startsWith("blob:")&&URL.revokeObjectURL(r.src);let e=new Blob([a.audios[this.currentAudioChallengeIndex]],{type:"audio/mp3"}),t=URL.createObjectURL(e);r.src=t,r.addEventListener("error",()=>{URL.revokeObjectURL(t)},{once:!0})}a=this.ui.activePopup.querySelector(".challenge-progress"),a&&(a.textContent=`Challenge ${this.currentAudioChallengeIndex+1} of `+this.totalAudioChallenges),r=this.ui.activePopup.querySelector(".verify-button"),r&&(r.disabled=!0,r.textContent=this.currentAudioChallengeIndex<this.totalAudioChallenges-1?"NEXT":"VERIFY"),a=this.ui.activePopup.querySelector(".sound-input-field");a&&(a.value=this.currentAudioInput),"info"===this.ui.currentView&&this.ui.showChallengeView(this.ui.activePopup)}createSoundChallengeView(r){var e=this.ui.createSVGIcons(),t=document.createElement("div"),a=(t.className="challenge-view",r.hasAttribute("data-theme")&&(a=r.getAttribute("data-theme"),t.setAttribute("data-theme",a)),document.createElement("div")),i=(a.className="challenge-example",document.createElement("div")),o=(i.className="challenge-header",document.createElement("div"));o.className="challenge-title",o.innerText="Enter the characters you hear.";let c=document.createElement("div");c.className="challenge-controls",[{icon:e.reload,title:"New challenge",action:()=>{let e=c.children[0];e.classList.add("loading"),this.newAudioChallenge(r.triggerContainer,r.config).finally(()=>{e.classList.remove("loading")})}},{icon:e.image,title:"Image challenge",action:()=>{let e=c.children[1];e.classList.add("loading"),this.ui.imageChallenge.currentImageChallenge&&this.ui.imageChallenge.currentImageChallenge.images?(e.classList.remove("loading"),this.ui.showChallengeView(r)):this.ui.imageChallenge.newImageChallenge(r.triggerContainer,r.config).finally(()=>{e.classList.remove("loading"),this.ui.showChallengeView(r)})}},{icon:e.info,title:"Information",action:()=>this.ui.showInfoView(r)}].forEach(({icon:e,title:t,action:a})=>{var r=document.createElement("button");r.className="challenge-button",r.title=t,r.innerHTML=e,a&&r.addEventListener("click",a),c.appendChild(r)}),i.appendChild(o),i.appendChild(c),a.appendChild(i),t.appendChild(a);e=document.createElement("div"),e.className="sound-challenge-container",o=document.createElement("div"),o.className="audio-container",i=document.createElement("audio"),i.controls=!0,i.className="audio-player",o.appendChild(i),e.appendChild(o),a=document.createElement("div"),a.className="sound-input-container",i=document.createElement("input");i.type="text",i.className="sound-input-field",i.placeholder="Type the characters you hear",i.setAttribute("aria-label","Type the characters you hear"),i.value=this.currentAudioInput,i.addEventListener("input",e=>{this.currentAudioInput=e.target.value,n.disabled=""==this.currentAudioInput.trim()}),a.appendChild(i),e.appendChild(a),t.appendChild(e);let n=document.createElement("button");return n.className="verify-button",n.textContent=this.currentAudioChallengeIndex<this.totalAudioChallenges-1?"NEXT":"VERIFY",n.disabled=!this.currentAudioInput.trim(),n.addEventListener("click",()=>{let e=this.ui.activePopup.querySelector(".progress-overlay"),t=e.querySelector(".progress-overlay-text"),a=e.querySelector(".progress-overlay-fill");e.classList.add("active"),this.currentAudioChallengeIndex<this.totalAudioChallenges-1?(t.textContent=this.currentAudioChallengeIndex+1+" done",a.style.width=(this.currentAudioChallengeIndex+1)/this.totalAudioChallenges*100+"%",setTimeout(()=>{e.classList.remove("active"),this.currentAudioChallengeIndex++,this.currentAudioInput="",this.updateExistingAudioPopup(this.currentAudioChallenge)},1e3)):(t.textContent=this.totalAudioChallenges+" done",a.style.width="100%",setTimeout(()=>{this.handleAudioVerification(r.triggerContainer,r)},1e3))}),t.appendChild(n),t}handleAudioVerification(t,e){try{this.ui.pauseAudioIfPlaying(e),e.classList.remove("active"),this.currentAudioInput="",this.currentAudioChallengeIndex=0;var a=t.querySelector(".captcha-checkbox");a&&(a.checked=!0)}catch(e){this.ui.showError(t,"Failed to verify audio challenge")}}}class k{constructor({siteKey:e,apiEndpoint:t,language:a,title:r,description:i,logo:o,url:c,githubUrl:n,termsUrl:l,privacyUrl:p}){this.siteKey=e,this.apiEndpoint=t,a&&["en","es","fr","de","it","pt","zh-CN","ja","ko","ru","ar","hi"].includes(a)?this.language=a:this.language=null;let h=e=>"string"!=typeof e?e:e.replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e]),s=(e,t,a=!0)=>{e=null===e?void 0:void 0!==e?e:t;return a&&"string"==typeof e?h(e):e},d=(e,t)=>{e=s(e,t,!1);if(e)try{var a=new URL(e);return a.protocol+"//"+h(a.hostname)+(a.port?":"+a.port:"")+h(a.pathname)+(a.search?h(a.search):"")+(a.hash?h(a.hash):"")}catch{}};this.title=s(r,"LibreCap"),this.description=s(i,"LibreCap is an open-source CAPTCHA alternative designed with privacy and data protection in mind."),this.logo=s(o,"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABEVBMVEUAAAAAR3YANmcAeaMAdJ4ANWYApssAeKMAWYcAR3cApswAm8EAWocAqs8AUH4AkroARXUAo8kAfacArdIAjrYATHsApMoAcZwAlr0AdqAAn8UAbZgAc50AqM4AnsUAd6EAhK0ATXsApcoAhK0Ab5sAibIAn8UAgKkAUH4AosgAVIIAWocAOmsAOWkAXIkApMoARnUAU4EAW4gARnUAaZYATXwAZJAAstYAN2gANWYAgasANWYAZpMAa5cAYI0Af6kAcJsAXYoAc54AWYcAkLgAUX8AeqQATXsAha4AosgAl74AR3cAlLsAdqEAm8EAQnIAO2sAnsUAY48AVYIAirIApswAPm4AV4QAjLQArNEAsNTbvwG7AAAAO3RSTlMABmguB7stvGhoXBe8sL9PMg7s6XIU7uzc266KHPXt7ergzL27pnNkWT0l793LypOCckju2rSxppxG0bWmi08AAAISSURBVFjDtdRpV9pAGIbhSUGjSWuAEksaKFtZZXcvUK1FwirYiq38/x/SWEugzgNn3jn6fL/uw4Rk2OsuWNA0Q5f3Wio26/dT2aAc92djM9f3b2+rcgVt4W9uslLnT3l+EJF5DoWY5wcjQ+YEK34Ulgms+I5MoLC/9B2ZI+ippZd6iKzq+U5G7j3w/O+wVCDr+TvBgL69Oi3i+btEzre6KObV93+37+6Tu8HS93q9RMhdPB7/8LgjGySCp/P5/OFh5r2///kLd91ud3x1dXnZbrdbJyb/yCi+1drhAqck/+NEeR54R/Jf3/IBkkcBkv8GAiSPAiT/HQRIHgXW+zHvf4EAyf/c4wIfSR4FSP4aBEgeBUjeAQGSd465gBEZRTJhwwinN/lKLZ+vHyedw13GbbugP90sucQ6f1A3mTul2AgobMOMxBqfZ4Kz8e+3meh8IeQPAsKBoIqef8VkwlPx9yPsFRV+P37hQNRC70+yKBzI4fevLuqLFvROMrCR+fXFn6hi7zh7i4Jf4b0v/SWT80WjPtta54fDZC1gmsX8WXmL/zGZC3chy4qD81//88PJ5LBULk2nzeYZd4D00/U73uwn9/fTR9/cUrgAwcOASvA4QPA4QPA4QPA4QPA4QPA4QPAw8JngcYDgcYDgcYDgUYDZJN+s8ffBEcWXwOXUqIj78jkD0xs73na9vQE7N9nL7Q+B8yrHEF+yhAAAAABJRU5ErkJggg==",!1),this.url=d(c,"https://github.com/librecap/librecap"),this.githubUrl=d(n,"https://github.com/librecap/librecap"),this.termsUrl=d(l,"https://github.com/librecap/librecap/blob/main/TERMS.md"),this.privacyUrl=d(p,"https://github.com/librecap/librecap/blob/main/PRIVACY.md")}}class u{constructor(){var e;(e=document.createElement("style")).innerHTML='.libre-captcha-popup{--libre-captcha-bg:#fff;--libre-captcha-border:#e0e0e0;--libre-captcha-text:#545454;--libre-captcha-box-shadow:0 4px 24px rgba(0,0,0,.25);--libre-captcha-selected:#0074bf;--libre-captcha-selected-dark:#2b87d3;--libre-captcha-font:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","Inter",Roboto,"Noto Sans","Open Sans","Helvetica Neue",Ubuntu,Arial,sans-serif;background-color:var(--libre-captcha-bg);border:1px solid var(--libre-captcha-border);border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.2);color:var(--libre-captcha-text);display:none;font-family:var(--libre-captcha-font);overflow:hidden;padding:20px;position:absolute;width:320px;z-index:1000}.libre-captcha-popup[data-theme=dark]{--libre-captcha-bg:#1e1e1e;--libre-captcha-border:#2d2d2d;--libre-captcha-text:#fff;--libre-captcha-box-shadow:0 4px 24px rgba(0,0,0,.4);--libre-captcha-selected:#2b87d3}.libre-captcha-popup[data-theme=dark] .challenge-button:before{background-color:hsla(0,0%,100%,.1)}.libre-captcha-popup[data-theme=dark] .challenge-button svg{fill:#fff;opacity:.7}.libre-captcha-popup[data-theme=dark] .challenge-button:hover svg{opacity:1}.libre-captcha-popup[data-theme=dark] .challenge-image{border:2px solid var(--captcha-border);box-shadow:0 2px 8px rgba(0,0,0,.3)}.libre-captcha-popup[data-theme=dark] .verify-button:disabled{background-color:#606060}.libre-captcha-popup[data-theme=dark] .verify-button:not(:disabled){background-color:#2b87d3;box-shadow:0 2px 4px rgba(0,0,0,.3)}.libre-captcha-popup[data-theme=dark] .verify-button:not(:disabled):hover{background-color:#3a96da;box-shadow:0 2px 6px rgba(0,0,0,.4)}.libre-captcha-popup[data-theme=dark] .back-button:before{background-color:hsla(0,0%,100%,.1)}.libre-captcha-popup[data-theme=dark] .github-button:hover{box-shadow:0 4px 8px rgba(0,0,0,.3)}.libre-captcha-popup[data-theme=dark] .info-link{color:#aaa}.libre-captcha-popup[data-theme=dark] .info-link:after{background:linear-gradient(to right,var(--libre-captcha-gradient-start,#4794e6),var(--libre-captcha-gradient-end,#2b87d3))}@media (prefers-color-scheme:dark){.libre-captcha-popup[data-theme=auto]{--libre-captcha-bg:#1e1e1e;--libre-captcha-border:#2d2d2d;--libre-captcha-text:#fff;--libre-captcha-box-shadow:0 4px 24px rgba(0,0,0,.4);--libre-captcha-selected:#2b87d3}.libre-captcha-popup[data-theme=auto] .challenge-button:before{background-color:hsla(0,0%,100%,.1)}.libre-captcha-popup[data-theme=auto] .challenge-image{border:2px solid var(--captcha-border);box-shadow:0 2px 8px rgba(0,0,0,.3)}.libre-captcha-popup[data-theme=auto] .verify-button:not(:disabled){background-color:#2b87d3;box-shadow:0 2px 4px rgba(0,0,0,.3)}.libre-captcha-popup[data-theme=auto] .verify-button:not(:disabled):hover{background-color:#3a96da;box-shadow:0 2px 6px rgba(0,0,0,.4)}.libre-captcha-popup[data-theme=auto] .verify-button:disabled{background-color:#606060}.libre-captcha-popup[data-theme=auto] .back-button:before{background-color:hsla(0,0%,100%,.1)}.libre-captcha-popup[data-theme=auto] .challenge-button svg{fill:#fff;opacity:.7}.libre-captcha-popup[data-theme=auto] .challenge-button:hover svg{opacity:1}.libre-captcha-popup[data-theme=auto] .challenge-image.selected:before{background-color:rgba(43,135,211,.3)}.libre-captcha-popup[data-theme=auto] .challenge-image.selected{border-color:var(--libre-captcha-selected);box-shadow:0 4px 16px rgba(0,116,191,.3)}.libre-captcha-popup[data-theme=auto] .challenge-image.selected:after{background-color:var(--libre-captcha-selected);box-shadow:0 2px 8px rgba(0,0,0,.4)}.libre-captcha-popup[data-theme=auto] .challenge-button:first-child:not(.loading):hover svg{fill:#a78bfa;transform:rotate(180deg)}.libre-captcha-popup[data-theme=auto] .challenge-button:nth-child(2):hover svg{fill:#56ccff}.libre-captcha-popup[data-theme=auto] .challenge-button:nth-child(3):hover svg{fill:#ffb74d}.libre-captcha-popup[data-theme=auto]\t\t.sound-challenge-view\t\t.challenge-button:nth-child(2):hover\t\tsvg{fill:#66f296}.libre-captcha-popup[data-theme=auto] .info-link{color:#aaa}.libre-captcha-popup[data-theme=auto] .info-link:after{background:linear-gradient(to right,var(--libre-captcha-gradient-start,#4794e6),var(--libre-captcha-gradient-end,#2b87d3))}}@keyframes libreCaptchaFadeIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes libreCaptchaPulse{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.libre-captcha-popup.active{animation:libreCaptchaFadeIn .3s ease;display:block}.libre-captcha-popup .challenge-view{background-color:var(--libre-captcha-bg);display:flex;flex-direction:column;height:100%}.libre-captcha-popup .challenge-example{align-items:flex-start;border-bottom:1px solid var(--libre-captcha-border);display:flex;justify-content:space-between;margin-bottom:16px;padding-bottom:16px}.libre-captcha-popup .challenge-header{display:flex;flex:1;flex-direction:column;margin-bottom:0}.libre-captcha-popup .challenge-title{color:var(--captcha-text);font-size:15px;font-weight:500;letter-spacing:.01em;line-height:1.4;margin-bottom:12px;text-align:left}.libre-captcha-popup .example-image{border:1px solid var(--captcha-border);border-radius:4px;margin-left:12px;overflow:hidden}.libre-captcha-popup .example-image img{display:block;height:80px;object-fit:cover;width:80px}.libre-captcha-popup .challenge-controls{display:flex;gap:16px;justify-content:flex-start;margin-bottom:0}.libre-captcha-popup .challenge-button{background:none;border:none;border-radius:6px;cursor:pointer;overflow:hidden;padding:6px;position:relative;transition:transform .2s cubic-bezier(.4,0,.2,1);will-change:transform}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.libre-captcha-popup .challenge-button.loading{pointer-events:none}.libre-captcha-popup .challenge-button:before{background-color:rgba(0,0,0,.15);border-radius:6px;content:"";inset:0;opacity:0;position:absolute;transform:scale(1);transition:opacity .2s ease}.libre-captcha-popup .challenge-button:hover:before{opacity:1}.libre-captcha-popup .challenge-button.loading:before{opacity:1;transform:scale(1)}.libre-captcha-popup .challenge-button svg{height:20px;width:20px;fill:#545454;opacity:.7;position:relative;transition:all .2s cubic-bezier(.4,0,.2,1);z-index:1}.libre-captcha-popup .challenge-button:hover{transform:translateY(-2px) scale(1.05)}.libre-captcha-popup .challenge-button:hover svg{opacity:1;transform:scale(1.1)}.libre-captcha-popup .challenge-button:first-child:not(.loading):hover svg{fill:#8b5cf6;transform:rotate(180deg)}.libre-captcha-popup .challenge-button:nth-child(3):hover svg{fill:#ff9800}.libre-captcha-popup .challenge-button.loading svg{animation:spin 1s linear infinite;opacity:1;transform-origin:center}.libre-captcha-popup .challenge-button:first-child.loading svg{fill:#8b5cf6}.libre-captcha-popup .challenge-button:nth-child(2).loading svg{fill:#00b8d4}.libre-captcha-popup .challenge-grid{display:grid;flex:1;gap:12px;grid-template-columns:repeat(3,1fr);margin-bottom:10px}.libre-captcha-popup .challenge-image{aspect-ratio:1;border:2px solid transparent;border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);cursor:pointer;overflow:hidden;position:relative;transition:all .2s ease}.libre-captcha-popup .challenge-image img{display:block;height:100%;object-fit:cover;width:100%}.libre-captcha-popup .challenge-image.selected{border-color:var(--libre-captcha-selected);box-shadow:0 4px 16px rgba(0,116,191,.3)}.libre-captcha-popup .challenge-image.selected:after{background-color:var(--libre-captcha-selected);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' fill=\'%23fff\' viewBox=\'0 0 24 24\'%3E%3Cpath d=\'M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:18px;border-radius:50%;box-shadow:0 2px 8px rgba(0,0,0,.3);content:"";height:26px;position:absolute;right:6px;top:6px;width:26px}.libre-captcha-popup .challenge-image.selected:before{background-color:rgba(0,116,191,.25);content:"";height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;z-index:1}.libre-captcha-popup .verify-button{background-color:#0074bf;border:none;border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:#fff;cursor:pointer;font-size:16px;font-weight:500;letter-spacing:.02em;margin-top:8px;opacity:1;outline:1px solid rgba(0,0,0,.1);padding:14px;text-shadow:0 1px 2px rgba(0,0,0,.2);transition:background-color .2s ease,box-shadow .2s ease;width:100%}.libre-captcha-popup .verify-button:disabled{background-color:#a0a0a0;color:hsla(0,0%,100%,.9);cursor:not-allowed}.libre-captcha-popup .verify-button:not(:disabled):hover{background-color:#0066a8;box-shadow:0 2px 6px rgba(0,0,0,.2)}.libre-captcha-popup .sound-challenge-container{display:flex;flex-direction:column;gap:16px;margin-bottom:16px}.libre-captcha-popup .audio-container{align-items:center;background-color:var(--libre-captcha-grid-bg);border:1px solid var(--libre-captcha-border);border-radius:8px;display:flex;justify-content:center;padding:20px}.libre-captcha-popup .audio-player{height:40px;max-width:320px;width:100%}.libre-captcha-popup .sound-input-container{margin-bottom:0;width:100%}.libre-captcha-popup .sound-input-field{background-color:var(--libre-captcha-bg);border:1px solid var(--libre-captcha-border);border-radius:6px;box-sizing:border-box;color:var(--libre-captcha-text);font-size:15px;font-weight:400;letter-spacing:.01em;outline:none;padding:12px 16px;transition:border-color .2s ease,box-shadow .2s ease;width:100%}.libre-captcha-popup .sound-input-field:focus{border-color:#0074bf;box-shadow:0 0 0 2px rgba(0,116,191,.2)}.libre-captcha-popup[data-theme=dark] .sound-input-field{background-color:#2a2a2a;border-color:#444;color:#eee}.libre-captcha-popup[data-theme=dark] .sound-input-field:focus{border-color:#08d;box-shadow:0 0 0 2px rgba(0,136,221,.2)}@media (prefers-color-scheme:dark){.libre-captcha-popup[data-theme=auto] .sound-input-field{background-color:#2a2a2a;border-color:#444;color:#eee}.libre-captcha-popup[data-theme=auto] .sound-input-field:focus{border-color:#08d;box-shadow:0 0 0 2px rgba(0,136,221,.2)}}.libre-captcha-popup .info-content{background-color:var(--libre-captcha-bg);display:none;flex-direction:column;height:100%;min-height:400px;width:100%}.libre-captcha-popup .info-header{align-items:center;display:flex;margin-bottom:32px;position:relative}.libre-captcha-popup .back-button{align-items:center;background:none;border:none;border-radius:6px;color:var(--libre-captcha-text);cursor:pointer;display:flex;font-size:15px;font-weight:500;gap:8px;letter-spacing:.01em;padding:8px 16px;position:relative;transition:background-color .2s ease,color .2s ease}.libre-captcha-popup .back-button svg{height:20px;width:20px;fill:var(--libre-captcha-text);transition:transform .3s ease}.libre-captcha-popup .back-button:hover{background-color:rgba(0,0,0,.15)}.libre-captcha-popup .back-button:hover svg{transform:translateX(-4px)}.libre-captcha-popup[data-theme=dark] .back-button:hover{background-color:hsla(0,0%,100%,.1)}.libre-captcha-popup .info-main-content{align-items:center;display:flex;flex-direction:column;gap:24px;padding:24px;text-align:center}.libre-captcha-popup .info-logo-container{align-items:center;display:flex;gap:4px;margin-bottom:12px}.libre-captcha-popup .info-logo{border-radius:8px;height:40px;transition:transform .3s ease;width:40px}.libre-captcha-popup .info-brand-title{color:var(--libre-captcha-text);font-size:22px;font-weight:700;letter-spacing:-.01em;transition:transform .3s ease}.libre-captcha-popup .info-text{color:var(--libre-captcha-text);font-size:15px;font-weight:400;letter-spacing:.01em;line-height:1.5;margin-bottom:8px;opacity:.9;padding:0 16px}.libre-captcha-popup .github-container{margin:8px 0 24px}.libre-captcha-popup .github-button{align-items:center;background-color:var(--libre-captcha-bg);border:1px solid var(--libre-captcha-border);border-radius:6px;color:var(--libre-captcha-text);display:inline-flex;font-size:15px;font-weight:500;gap:8px;letter-spacing:.01em;padding:8px 16px;text-decoration:none;transition:background-color .3s ease,box-shadow .3s ease,transform .2s ease}.libre-captcha-popup .github-button:hover{background-color:var(--libre-captcha-selected);box-shadow:0 4px 12px rgba(0,0,0,.2);color:#fff;transform:translateY(-2px)}.libre-captcha-popup .info-links{border-top:1px solid var(--libre-captcha-border);display:flex;gap:24px;justify-content:center;padding-top:16px;width:100%}.libre-captcha-popup .info-link{color:var(--libre-captcha-text);font-size:15px;font-weight:500;letter-spacing:.01em;opacity:.8;padding:2px 0;position:relative;text-decoration:none;transition:all .2s ease}.libre-captcha-popup .info-link:hover{opacity:1;transform:translateY(-1px)}.libre-captcha-popup .info-link:after{background:linear-gradient(to right,var(--libre-captcha-gradient-start,#3b82f6),var(--libre-captcha-gradient-end,#2563eb));bottom:0;content:"";height:1px;left:0;position:absolute;transition:width .3s ease;width:0}.libre-captcha-popup .info-link:hover:after{width:100%}.libre-captcha-popup[data-theme=dark] .back-button svg,.libre-captcha-popup[data-theme=dark] .github-button svg{fill:#fff}@media (prefers-color-scheme:dark){.libre-captcha-popup[data-theme=auto] .back-button svg,.libre-captcha-popup[data-theme=auto] .github-button svg{fill:#fff}}.libre-captcha-popup[data-theme=dark] .challenge-image.selected{border-color:var(--libre-captcha-selected-dark);box-shadow:0 4px 16px rgba(43,135,211,.3)}.libre-captcha-popup[data-theme=dark] .challenge-image.selected:after{background-color:var(--libre-captcha-selected-dark);box-shadow:0 2px 8px rgba(0,0,0,.4)}.libre-captcha-popup .brand-wrapper{align-items:center;display:flex;text-decoration:none;transition:opacity .2s ease}.libre-captcha-popup .brand-wrapper:has(.captcha-logo):has(.captcha-title),.libre-captcha-popup .brand-wrapper:has(.info-logo):has(.info-brand-title){gap:16px}.libre-captcha-popup .brand-wrapper:hover{opacity:.8}.libre-captcha-popup .brand-wrapper:not(a){opacity:1}.libre-captcha-popup .brand-wrapper:hover .info-logo{transform:rotate(5deg) scale(1.03)}.libre-captcha-popup .brand-wrapper:hover .info-brand-title{transform:translateX(4px)}.libre-captcha-popup .challenge-progress{background-color:hsla(0,0%,50%,.2);height:4px;left:0;overflow:hidden;position:absolute;top:0;width:100%}.libre-captcha-popup .challenge-progress-bar{background-color:var(--libre-captcha-selected);height:100%;left:0;position:absolute;top:0;transition:width .3s ease}.libre-captcha-popup .challenge-progress-text{background-color:hsla(0,0%,50%,.1);border-radius:12px;color:var(--libre-captcha-text);font-size:12px;opacity:.7;padding:4px 8px;position:absolute;right:8px;top:8px}.libre-captcha-popup[data-theme=dark] .challenge-progress-bar{background-color:var(--libre-captcha-selected-dark)}@media (prefers-color-scheme:dark){.libre-captcha-popup[data-theme=auto] .challenge-progress-bar{background-color:var(--libre-captcha-selected-dark)}}.libre-captcha-popup .progress-overlay{align-items:center;background-color:var(--libre-captcha-bg);border-radius:12px;display:flex;flex-direction:column;inset:0;opacity:0;padding:20px;pointer-events:none;position:absolute;transition:opacity .3s ease;z-index:1000}.libre-captcha-popup .progress-overlay.active{opacity:1;pointer-events:all}.libre-captcha-popup .progress-overlay-content{align-items:center;display:flex;flex:1;flex-direction:column;justify-content:center;width:80%}.libre-captcha-popup .progress-overlay-bar{background-color:var(--libre-captcha-border);border-radius:12px;height:12px;overflow:hidden;position:relative;width:80%}.libre-captcha-popup .progress-overlay-fill{background-color:var(--libre-captcha-text);height:100%;left:0;position:absolute;top:0;transition:width .8s cubic-bezier(.4,0,.2,1);width:0}.libre-captcha-popup .progress-overlay-text{color:var(--libre-captcha-text);font-size:20px;font-weight:600;margin-bottom:24px;opacity:.9}.libre-captcha-popup[data-theme=dark] .progress-overlay{background-color:var(--libre-captcha-bg);border:1px solid var(--libre-captcha-border)}.libre-captcha-popup[data-theme=dark] .pro