diff --git a/dist/vot-min.user.js b/dist/vot-min.user.js index a9e4ce03..8b5b9e33 100644 --- a/dist/vot-min.user.js +++ b/dist/vot-min.user.js @@ -222,7 +222,7 @@ // ==/UserScript== /*! For license information please see vot-min.user.js.LICENSE.txt */ -(()=>{var t={"./src/styles/main.scss":()=>{GM_addStyle('.vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before{opacity:0}.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border-radius:4px;outline:none;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:"";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-outlined-button[disabled=true]:before{opacity:0}.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:4px;outline:none;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-text-button[disabled=true]:before{opacity:0}.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;width:36px;height:36px;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:50%;outline:none;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-icon-button[disabled=true]:before{opacity:0}.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;width:100%!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:transparent!important;border-radius:4px!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 transparent,inset -1px 0 transparent,inset 0 -1px transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{width:100%!important;max-height:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:""!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px transparent!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid transparent!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid transparent!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:disabled:placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:transparent!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox-sub{padding-left:16px}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;padding:0;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block;position:relative}.vot-checkbox>input+span:before{content:"";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:"";z-index:10000;pointer-events:none;border:0 solid transparent;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:transparent}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;width:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:transparent!important;border:none!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;padding:0!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:""!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:transparent!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{width:20px;height:32px;fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));max-width:100vw;height:32px;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{height:100%;color:inherit;background-color:transparent;border:none;justify-content:center;align-items:center;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{min-height:100px;max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);height:fit-content;color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px rgba(0,0,0,.12),0 16px 16px rgba(0,0,0,.24)}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:rgba(0,0,0,.6);transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,rgba(46,47,52,.8));width:max-content;max-width:100%;max-height:100%;color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}')},"./node_modules/bowser/es5.js":function(t){t.exports=function(t){var e={};function o(i){if(e[i])return e[i].exports;var a=e[i]={i,l:!1,exports:{}};return t[i].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=t,o.c=e,o.d=function(t,e,i){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)o.d(i,a,function(e){return t[e]}.bind(null,a));return i},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=90)}({17:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i=o(18),a=function(){function t(){}return t.getFirstMatch=function(t,e){var o=e.match(t);return o&&o.length>0&&o[1]||""},t.getSecondMatch=function(t,e){var o=e.match(t);return o&&o.length>1&&o[2]||""},t.matchAndReturnConst=function(t,e,o){if(t.test(e))return o},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),10===e[0])switch(e[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),!(1===e[0]&&e[1]<5))return 1===e[0]&&e[1]<6?"Cupcake":1===e[0]&&e[1]>=6?"Donut":2===e[0]&&e[1]<2?"Eclair":2===e[0]&&2===e[1]?"Froyo":2===e[0]&&e[1]>2?"Gingerbread":3===e[0]?"Honeycomb":4===e[0]&&e[1]<1?"Ice Cream Sandwich":4===e[0]&&e[1]<4?"Jelly Bean":4===e[0]&&e[1]>=4?"KitKat":5===e[0]?"Lollipop":6===e[0]?"Marshmallow":7===e[0]?"Nougat":8===e[0]?"Oreo":9===e[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(e,o,i){void 0===i&&(i=!1);var a=t.getVersionPrecision(e),n=t.getVersionPrecision(o),r=Math.max(a,n),s=0,l=t.map([e,o],(function(e){var o=r-t.getVersionPrecision(e),i=e+new Array(o+1).join(".0");return t.map(i.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(i&&(s=r-Math.min(a,n)),r-=1;r>=s;){if(l[0][r]>l[1][r])return 1;if(l[0][r]===l[1][r]){if(r===s)return 0;r-=1}else if(l[0][r]1?a-1:0),r=1;r0){var r=Object.keys(o),l=s.default.find(r,(function(t){return e.isOS(t)}));if(l){var d=this.satisfies(o[l]);if(void 0!==d)return d}var u=s.default.find(r,(function(t){return e.isPlatform(t)}));if(u){var c=this.satisfies(o[u]);if(void 0!==c)return c}}if(n>0){var h=Object.keys(a),p=s.default.find(h,(function(t){return e.isBrowser(t,!0)}));if(void 0!==p)return this.compareVersion(a[p])}},e.isBrowser=function(t,e){void 0===e&&(e=!1);var o=this.getBrowserName().toLowerCase(),i=t.toLowerCase(),a=s.default.getBrowserTypeByAlias(i);return e&&a&&(i=a.toLowerCase()),i===o},e.compareVersion=function(t){var e=[0],o=t,i=!1,a=this.getBrowserVersion();if("string"==typeof a)return">"===t[0]||"<"===t[0]?(o=t.substr(1),"="===t[1]?(i=!0,o=t.substr(2)):e=[],">"===t[0]?e.push(1):e.push(-1)):"="===t[0]?o=t.substr(1):"~"===t[0]&&(i=!0,o=t.substr(1)),e.indexOf(s.default.compareVersions(a,o,i))>-1},e.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},e.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},e.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},e.is=function(t,e){return void 0===e&&(e=!1),this.isBrowser(t,e)||this.isOS(t)||this.isPlatform(t)},e.some=function(t){var e=this;return void 0===t&&(t=[]),t.some((function(t){return e.is(t)}))},t}();e.default=d,t.exports=e.default},92:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=/version\/(\d+(\.?_?\d+)+)/i,r=[{test:[/googlebot/i],describe:function(t){var e={name:"Googlebot"},o=a.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/opera/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opr\/|opios/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/SamsungBrowser/i],describe:function(t){var e={name:"Samsung Internet for Android"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Whale/i],describe:function(t){var e={name:"NAVER Whale Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MZBrowser/i],describe:function(t){var e={name:"MZ Browser"},o=a.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/focus/i],describe:function(t){var e={name:"Focus"},o=a.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/swing/i],describe:function(t){var e={name:"Swing"},o=a.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/coast/i],describe:function(t){var e={name:"Opera Coast"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(t){var e={name:"Opera Touch"},o=a.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/yabrowser/i],describe:function(t){var e={name:"Yandex Browser"},o=a.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/ucbrowser/i],describe:function(t){var e={name:"UC Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Maxthon|mxios/i],describe:function(t){var e={name:"Maxthon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/epiphany/i],describe:function(t){var e={name:"Epiphany"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/puffin/i],describe:function(t){var e={name:"Puffin"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sleipnir/i],describe:function(t){var e={name:"Sleipnir"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/k-meleon/i],describe:function(t){var e={name:"K-Meleon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/micromessenger/i],describe:function(t){var e={name:"WeChat"},o=a.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qqbrowser/i],describe:function(t){var e={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},o=a.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/msie|trident/i],describe:function(t){var e={name:"Internet Explorer"},o=a.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/\sedg\//i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/edg([ea]|ios)/i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/vivaldi/i],describe:function(t){var e={name:"Vivaldi"},o=a.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/seamonkey/i],describe:function(t){var e={name:"SeaMonkey"},o=a.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sailfish/i],describe:function(t){var e={name:"Sailfish"},o=a.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return o&&(e.version=o),e}},{test:[/silk/i],describe:function(t){var e={name:"Amazon Silk"},o=a.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/phantom/i],describe:function(t){var e={name:"PhantomJS"},o=a.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/slimerjs/i],describe:function(t){var e={name:"SlimerJS"},o=a.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e={name:"BlackBerry"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e={name:"WebOS Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/bada/i],describe:function(t){var e={name:"Bada"},o=a.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/tizen/i],describe:function(t){var e={name:"Tizen"},o=a.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qupzilla/i],describe:function(t){var e={name:"QupZilla"},o=a.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var e={name:"Firefox"},o=a.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/electron/i],describe:function(t){var e={name:"Electron"},o=a.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MiuiBrowser/i],describe:function(t){var e={name:"Miui"},o=a.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/chromium/i],describe:function(t){var e={name:"Chromium"},o=a.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/chrome|crios|crmo/i],describe:function(t){var e={name:"Chrome"},o=a.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/GSA/i],describe:function(t){var e={name:"Google Search"},o=a.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e={name:"Android Browser"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/playstation 4/i],describe:function(t){var e={name:"PlayStation 4"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/safari|applewebkit/i],describe:function(t){var e={name:"Safari"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/.*/i],describe:function(t){var e=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:a.default.getFirstMatch(e,t),version:a.default.getSecondMatch(e,t)}}}];e.default=r,t.exports=e.default},93:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/Roku\/DVP/],describe:function(t){var e=a.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:n.OS_MAP.Roku,version:e}}},{test:[/windows phone/i],describe:function(t){var e=a.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.WindowsPhone,version:e}}},{test:[/windows /i],describe:function(t){var e=a.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),o=a.default.getWindowsVersionName(e);return{name:n.OS_MAP.Windows,version:e,versionName:o}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(t){var e={name:n.OS_MAP.iOS},o=a.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return o&&(e.version=o),e}},{test:[/macintosh/i],describe:function(t){var e=a.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),o=a.default.getMacOSVersionName(e),i={name:n.OS_MAP.MacOS,version:e};return o&&(i.versionName=o),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var e=a.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:n.OS_MAP.iOS,version:e}}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e=a.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),o=a.default.getAndroidVersionName(e),i={name:n.OS_MAP.Android,version:e};return o&&(i.versionName=o),i}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e=a.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),o={name:n.OS_MAP.WebOS};return e&&e.length&&(o.version=e),o}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e=a.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||a.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||a.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:n.OS_MAP.BlackBerry,version:e}}},{test:[/bada/i],describe:function(t){var e=a.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Bada,version:e}}},{test:[/tizen/i],describe:function(t){var e=a.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Tizen,version:e}}},{test:[/linux/i],describe:function(){return{name:n.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:n.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var e=a.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.PlayStation4,version:e}}}];e.default=r,t.exports=e.default},94:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var e=a.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",o={type:n.PLATFORMS_MAP.mobile,vendor:"Huawei"};return e&&(o.model=e),o}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){var e=t.test(/ipod|iphone/i),o=t.test(/like (ipod|iphone)/i);return e&&!o},describe:function(t){var e=a.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:n.PLATFORMS_MAP.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var e=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&e>=3},describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}}];e.default=r,t.exports=e.default},95:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:n.ENGINE_MAP.Blink};var e=a.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:n.ENGINE_MAP.EdgeHTML,version:e}}},{test:[/trident/i],describe:function(t){var e={name:n.ENGINE_MAP.Trident},o=a.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){return t.test(/presto/i)},describe:function(t){var e={name:n.ENGINE_MAP.Presto},o=a.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=t.test(/gecko/i),o=t.test(/like gecko/i);return e&&!o},describe:function(t){var e={name:n.ENGINE_MAP.Gecko},o=a.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:n.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var e={name:n.ENGINE_MAP.WebKit},o=a.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}}];e.default=r,t.exports=e.default}})},"./node_modules/requestidlecallback-polyfill/index.js":()=>{window.requestIdleCallback=window.requestIdleCallback||function(t){var e=Date.now();return setTimeout((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),1)},window.cancelIdleCallback=window.cancelIdleCallback||function(t){clearTimeout(t)}}},e={};function o(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,o),n.exports}(()=>{"use strict";var t=o("./node_modules/bowser/es5.js");const e=globalThis,i=e.trustedTypes,a=i?i.createPolicy("lit-html",{createHTML:t=>t}):void 0,n="$lit$",r=`lit$${Math.random().toFixed(9).slice(2)}$`,s="?"+r,l=`<${s}>`,d=document,u=()=>d.createComment(""),c=t=>null===t||"object"!=typeof t&&"function"!=typeof t,h=Array.isArray,p=t=>h(t)||"function"==typeof t?.[Symbol.iterator],g="[ \t\n\f\r]",m=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,v=/-->/g,f=/>/g,b=RegExp(`>|${g}(?:([^\\s"'>=/]+)(${g}*=${g}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),y=/'/g,w=/"/g,x=/^(?:script|style|textarea|title)$/i,S=t=>(e,...o)=>({_$litType$:t,strings:e,values:o}),k=S(1),T=S(2),C=(S(3),Symbol.for("lit-noChange")),I=Symbol.for("lit-nothing"),P=new WeakMap,L=d.createTreeWalker(d,129);function A(t,e){if(!h(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==a?a.createHTML(e):e}const _=(t,e)=>{const o=t.length-1,i=[];let a,s=2===e?"":3===e?"":"",d=m;for(let e=0;e"===c[0]?(d=a??m,h=-1):void 0===c[1]?h=-2:(h=d.lastIndex-c[2].length,u=c[1],d=void 0===c[3]?b:'"'===c[3]?w:y):d===w||d===y?d=b:d===v||d===f?d=m:(d=b,a=void 0);const g=d===b&&t[e+1].startsWith("/>")?" ":"";s+=d===m?o+l:h>=0?(i.push(u),o.slice(0,h)+n+o.slice(h)+r+g):o+r+(-2===h?e:g)}return[A(t,s+(t[o]||"")+(2===e?"":3===e?"":"")),i]};class V{constructor({strings:t,_$litType$:e},o){let a;this.parts=[];let l=0,d=0;const c=t.length-1,h=this.parts,[p,g]=_(t,e);if(this.el=V.createElement(p,o),L.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(a=L.nextNode())&&h.length0){a.textContent=i?i.emptyScript:"";for(let o=0;o2||""!==o[0]||""!==o[1]?(this._$AH=Array(o.length-1).fill(new String),this.strings=o):this._$AH=I}_$AI(t,e=this,o,i){const a=this.strings;let n=!1;if(void 0===a)t=O(this,t,e,0),n=!c(t)||t!==this._$AH&&t!==C,n&&(this._$AH=t);else{const i=t;let r,s;for(t=a[0],r=0;r{const i=o?.renderBefore??e;let a=i._$litPart$;if(void 0===a){const t=o?.renderBefore??null;i._$litPart$=a=new E(e.insertBefore(u(),t),t,void 0,o??{})}return a._$AI(t),a};function q(t){return String(t).split("").map((t=>t.charCodeAt(0)))}function z(t){return new Uint8Array(q(t))}function H(t){const e=new ArrayBuffer(2*t.length),o=new Uint8Array(e);return new Uint16Array(e).set(q(t)),o}function W(t){const e=255;return[t>>>24&e,t>>>16&e,t>>>8&e,t&e]}function j(t){return 11+t}function G(t,e,o,i){return 11+e+1+1+(i?2+2*(o+1):o+1)+t}function Y(t){let e=0;return t.forEach((t=>{e+=2+2*t[0].length+2+2+2*t[1].length+2})),11+e}function J(t,e){const o=2*e;let i=0;return t.forEach((t=>{i+=2+2*t[0].length+2+4})),18+o+2+i}class K{_setIntegerFrame(t,e){const o=parseInt(e,10);this.frames.push({name:t,value:o,size:j(o.toString().length)})}_setStringFrame(t,e){const o=e.toString();let i=13+2*o.length;"TDAT"===t&&(i=j(o.length)),this.frames.push({name:t,value:o,size:i})}_setPictureFrame(t,e,o,i){const a=function(t){if(!t||!t.length)return null;if(255===t[0]&&216===t[1]&&255===t[2])return"image/jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"image/png";if(71===t[0]&&73===t[1]&&70===t[2])return"image/gif";if(87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"image/webp";const e=73===t[0]&&73===t[1]&&42===t[2]&&0===t[3],o=77===t[0]&&77===t[1]&&0===t[2]&&42===t[3];return e||o?"image/tiff":66===t[0]&&77===t[1]?"image/bmp":0===t[0]&&0===t[1]&&1===t[2]&&0===t[3]?"image/x-icon":null}(new Uint8Array(e)),n=o.toString();if(!a)throw new Error("Unknown picture MIME type");o||(i=!1),this.frames.push({name:"APIC",value:e,pictureType:t,mimeType:a,useUnicodeEncoding:i,description:n,size:G(e.byteLength,a.length,n.length,i)})}_setLyricsFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"USLT",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setCommentFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"COMM",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setPrivateFrame(t,e){const o=t.toString();var i,a;this.frames.push({name:"PRIV",value:e,id:o,size:(i=o.length,a=e.byteLength,10+i+1+a)})}_setUserStringFrame(t,e){const o=t.toString(),i=e.toString();var a,n;this.frames.push({name:"TXXX",description:o,value:i,size:(a=o.length,n=i.length,13+2*a+2+2+2*n)})}_setUrlLinkFrame(t,e){const o=e.toString();var i;this.frames.push({name:t,value:o,size:(i=o.length,10+i)})}_setPairedTextFrame(t,e){this.frames.push({name:t,value:e,size:Y(e)})}_setSynchronisedLyricsFrame(t,e,o,i,a){const n=a.toString(),r=i.split("").map((t=>t.charCodeAt(0)));this.frames.push({name:"SYLT",value:e,language:r,description:n,type:t,timestampFormat:o,size:J(e,n.length)})}constructor(t){if(!t||"object"!=typeof t||!("byteLength"in t))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=t,this.padding=4096,this.frames=[],this.url=""}setFrame(t,e){switch(t){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(e))throw new Error(`${t} frame value should be an array of strings`);const o="TCON"===t?";":"/",i=e.join(o);this._setStringFrame(t,i);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(t,e);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(t,e);break;case"USLT":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("lyrics"in e))throw new Error("USLT frame value should be an object with keys description and lyrics");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(e.language,e.description,e.lyrics);break;case"APIC":if("object"!=typeof e||!("type"in e)||!("data"in e)||!("description"in e))throw new Error("APIC frame value should be an object with keys type, data and description");if(e.type<0||e.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(e.type,e.data,e.description,!!e.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof e||!("description"in e)||!("value"in e))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(e.description,e.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(t,e);break;case"COMM":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("text"in e))throw new Error("COMM frame value should be an object with keys description and text");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(e.language,e.description,e.text);break;case"PRIV":if("object"!=typeof e||!("id"in e)||!("data"in e))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(e.id,e.data);break;case"IPLS":if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(t,e);break;case"SYLT":if("object"!=typeof e||!("type"in e)||!("text"in e)||!("timestampFormat"in e))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(e.text)||!Array.isArray(e.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(e.type<0||e.type>6)throw new Error("Incorrect SYLT frame content type");if(e.timestampFormat<1||e.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");e.language=e.language||"eng",e.description=e.description||"",this._setSynchronisedLyricsFrame(e.type,e.text,e.timestampFormat,e.language,e.description);break;default:throw new Error(`Unsupported frame ${t}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const t=new Uint8Array(this.arrayBuffer),e=t[3],o=((i=[t[6],t[7],t[8],t[9]])[0]<<21)+(i[1]<<14)+(i[2]<<7)+i[3]+10;var i,a;73!==(a=t)[0]||68!==a[1]||51!==a[2]||e<2||e>4||(this.arrayBuffer=new Uint8Array(t.subarray(o)).buffer)}addTag(){this.removeTag();const t=[255,254],e=10+this.frames.reduce(((t,e)=>t+e.size),0)+this.padding,o=new ArrayBuffer(this.arrayBuffer.byteLength+e),i=new Uint8Array(o);let a=0,n=[];return n=[73,68,51,3],i.set(n,a),a+=n.length,a++,a++,n=function(t){const e=127;return[t>>>21&e,t>>>14&e,t>>>7&e,t&e]}(e-10),i.set(n,a),a+=n.length,this.frames.forEach((e=>{switch(n=z(e.name),i.set(n,a),a+=n.length,n=W(e.size-10),i.set(n,a),a+=n.length,a+=2,e.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":n=z(e.value),i.set(n,a),a+=n.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":n=[1].concat(t),i.set(n,a),a+=n.length,n=H(e.value),i.set(n,a),a+=n.length;break;case"TXXX":case"USLT":case"COMM":n=[1],"USLT"!==e.name&&"COMM"!==e.name||(n=n.concat(e.language)),n=n.concat(t),i.set(n,a),a+=n.length,n=H(e.description),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=H(e.value),i.set(n,a),a+=n.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":a++,n=z(e.value),i.set(n,a),a+=n.length;break;case"PRIV":n=z(e.id),i.set(n,a),a+=n.length,a++,i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"APIC":n=[e.useUnicodeEncoding?1:0],i.set(n,a),a+=n.length,n=z(e.mimeType),i.set(n,a),a+=n.length,n=[0,e.pictureType],i.set(n,a),a+=n.length,e.useUnicodeEncoding?(n=[].concat(t),i.set(n,a),a+=n.length,n=H(e.description),i.set(n,a),a+=n.length,a+=2):(n=z(e.description),i.set(n,a),a+=n.length,a++),i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"IPLS":n=[1],i.set(n,a),a+=n.length,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=H(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=H(e[1].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length}));break;case"SYLT":n=[1].concat(e.language).concat(e.timestampFormat).concat(e.type),i.set(n,a),a+=n.length,n=[].concat(t),i.set(n,a),a+=n.length,n=H(e.description),i.set(n,a),a+=n.length,a+=2,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=H(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length,n=W(e[1]),i.set(n,a),a+=n.length}))}})),a+=this.padding,i.set(new Uint8Array(this.arrayBuffer),a),this.arrayBuffer=o,o}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}}const Z={version:"1.0.3",debug:!1,fetchFn:fetch.bind(window)};class X{constructor(){this._vector=new Float32Array,this._position=0,this._frameCount=0}get vector(){return this._vector}get position(){return this._position}get startIndex(){return 2*this._position}get frameCount(){return this._frameCount}get endIndex(){return 2*(this._position+this._frameCount)}clear(){this.receive(this._frameCount),this.rewind()}put(t){this._frameCount+=t}putSamples(t,e,o=0){const i=2*(e=e||0);o>=0||(o=(t.length-i)/2);const a=2*o;this.ensureCapacity(o+this._frameCount);const n=this.endIndex;this.vector.set(t.subarray(i,i+a),n),this._frameCount+=o}putBuffer(t,e,o=0){e=e||0,o>=0||(o=t.frameCount-e),this.putSamples(t.vector,t.position+e,o)}receive(t){t>=0&&!(t>this._frameCount)||(t=this.frameCount),this._frameCount-=t,this._position+=t}receiveSamples(t,e=0){const o=2*e,i=this.startIndex;t.set(this._vector.subarray(i,i+o)),this.receive(e)}extract(t,e=0,o=0){const i=this.startIndex+2*e,a=2*o;t.set(this._vector.subarray(i,i+a))}ensureCapacity(t=0){const e=parseInt(2*t);if(this._vector.length0&&(this._vector.set(this._vector.subarray(this.startIndex,this.endIndex)),this._position=0)}}class Q{constructor(t){t?(this._inputBuffer=new X,this._outputBuffer=new X):this._inputBuffer=this._outputBuffer=null}get inputBuffer(){return this._inputBuffer}set inputBuffer(t){this._inputBuffer=t}get outputBuffer(){return this._outputBuffer}set outputBuffer(t){this._outputBuffer=t}clear(){this._inputBuffer.clear(),this._outputBuffer.clear()}}class tt extends Q{constructor(t){super(t),this.reset(),this._rate=1}set rate(t){this._rate=t}reset(){this.slopeCount=0,this.prevSampleL=0,this.prevSampleR=0}clone(){const t=new tt;return t.rate=this._rate,t}process(){const t=this._inputBuffer.frameCount;this._outputBuffer.ensureAdditionalCapacity(t/this._rate+1);const e=this.transpose(t);this._inputBuffer.receive(),this._outputBuffer.put(e)}transpose(t=0){if(0===t)return 0;const e=this._inputBuffer.vector,o=this._inputBuffer.startIndex,i=this._outputBuffer.vector,a=this._outputBuffer.endIndex;let n=0,r=0;for(;this.slopeCount<1;)i[a+2*r]=(1-this.slopeCount)*this.prevSampleL+this.slopeCount*e[o],i[a+2*r+1]=(1-this.slopeCount)*this.prevSampleR+this.slopeCount*e[o+1],r+=1,this.slopeCount+=this._rate;if(this.slopeCount-=1,1!==t)t:for(;;){for(;this.slopeCount>1;)if(this.slopeCount-=1,n+=1,n>=t-1)break t;const s=o+2*n;i[a+2*r]=(1-this.slopeCount)*e[s]+this.slopeCount*e[s+2],i[a+2*r+1]=(1-this.slopeCount)*e[s+1]+this.slopeCount*e[s+3],r+=1,this.slopeCount+=this._rate}return this.prevSampleL=e[o+2*t-2],this.prevSampleR=e[o+2*t-1],r}}class et{constructor(t){this._pipe=t}get pipe(){return this._pipe}get inputBuffer(){return this._pipe.inputBuffer}get outputBuffer(){return this._pipe.outputBuffer}fillInputBuffer(){throw new Error("fillInputBuffer() not overridden")}fillOutputBuffer(t=0){for(;this.outputBuffer.frameCountthis._position)throw new RangeError("New position may not be greater than current position");const e=this.outputBufferPosition-(this._position-t);if(e<0)throw new RangeError("New position falls outside of history buffer");this.outputBufferPosition=e,this._position=t}get sourcePosition(){return this._sourcePosition}set sourcePosition(t){this.clear(),this._sourcePosition=t}onEnd(){this.callback()}fillInputBuffer(t=0){const e=new Float32Array(2*t),o=this.sourceSound.extract(e,t,this._sourcePosition);this._sourcePosition+=o,this.inputBuffer.putSamples(e,0,o)}extract(t,e=0){this.fillOutputBuffer(this.outputBufferPosition+e);const o=Math.min(e,this.outputBuffer.frameCount-this.outputBufferPosition);this.outputBuffer.extract(t,this.outputBufferPosition,o);const i=this.outputBufferPosition+o;return this.outputBufferPosition=Math.min(this.historyBufferSize,i),this.outputBuffer.receive(Math.max(i-this.historyBufferSize,0)),this._position+=o,o}handleSampleData(t){this.extract(t.data,4096)}clear(){super.clear(),this.outputBufferPosition=0}}const at=[[124,186,248,310,372,434,496,558,620,682,744,806,868,930,992,1054,1116,1178,1240,1302,1364,1426,1488,0],[-100,-75,-50,-25,25,50,75,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-20,-15,-10,-5,5,10,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-4,-3,-2,-1,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],nt=-10/1.5;class rt extends Q{constructor(t){super(t),this._quickSeek=!0,this.midBufferDirty=!1,this.midBuffer=null,this.overlapLength=0,this.autoSeqSetting=!0,this.autoSeekSetting=!0,this._tempo=1,this.setParameters(44100,0,0,8)}clear(){super.clear(),this.clearMidBuffer()}clearMidBuffer(){this.midBufferDirty&&(this.midBufferDirty=!1,this.midBuffer=null)}setParameters(t,e,o,i){t>0&&(this.sampleRate=t),i>0&&(this.overlapMs=i),e>0?(this.sequenceMs=e,this.autoSeqSetting=!1):this.autoSeqSetting=!0,o>0?(this.seekWindowMs=o,this.autoSeekSetting=!1):this.autoSeekSetting=!0,this.calculateSequenceParameters(),this.calculateOverlapLength(this.overlapMs),this.tempo=this._tempo}set tempo(t){let e;this._tempo=t,this.calculateSequenceParameters(),this.nominalSkip=this._tempo*(this.seekWindowLength-this.overlapLength),this.skipFract=0,e=Math.floor(this.nominalSkip+.5),this.sampleReq=Math.max(e+this.overlapLength,this.seekWindowLength)+this.seekLength}get tempo(){return this._tempo}get inputChunkSize(){return this.sampleReq}get outputChunkSize(){return this.overlapLength+Math.max(0,this.seekWindowLength-2*this.overlapLength)}calculateOverlapLength(t=0){let e;e=this.sampleRate*t/1e3,e=e<16?16:e,e-=e%8,this.overlapLength=e,this.refMidBuffer=new Float32Array(2*this.overlapLength),this.midBuffer=new Float32Array(2*this.overlapLength)}checkLimits(t,e,o){return to?o:t}calculateSequenceParameters(){let t,e;this.autoSeqSetting&&(t=150+-50*this._tempo,t=this.checkLimits(t,50,125),this.sequenceMs=Math.floor(t+.5)),this.autoSeekSetting&&(e=28.333333333333332+nt*this._tempo,e=this.checkLimits(e,15,25),this.seekWindowMs=Math.floor(e+.5)),this.seekWindowLength=Math.floor(this.sampleRate*this.sequenceMs/1e3),this.seekLength=Math.floor(this.sampleRate*this.seekWindowMs/1e3)}set quickSeek(t){this._quickSeek=t}clone(){const t=new rt;return t.tempo=this._tempo,t.setParameters(this.sampleRate,this.sequenceMs,this.seekWindowMs,this.overlapMs),t}seekBestOverlapPosition(){return this._quickSeek?this.seekBestOverlapPositionStereoQuick():this.seekBestOverlapPositionStereo()}seekBestOverlapPositionStereo(){let t,e,o,i=0;for(this.preCalculateCorrelationReferenceStereo(),t=0,e=Number.MIN_VALUE;ie&&(e=o,t=i);return t}seekBestOverlapPositionStereoQuick(){let t,e,o,i,a,n=0;for(this.preCalculateCorrelationReferenceStereo(),e=Number.MIN_VALUE,t=0,i=0,a=0;n<4;n+=1){let r=0;for(;at[n][r]&&(a=i+at[n][r],!(a>=this.seekLength));)o=this.calculateCrossCorrelationStereo(2*a,this.refMidBuffer),o>e&&(e=o,t=a),r+=1;i=t}return t}preCalculateCorrelationReferenceStereo(){let t,e,o=0;for(;o=this.sampleReq;){t=this.seekBestOverlapPosition(),this._outputBuffer.ensureAdditionalCapacity(this.overlapLength),this.overlap(Math.floor(t)),this._outputBuffer.put(this.overlapLength),e=this.seekWindowLength-2*this.overlapLength,e>0&&this._outputBuffer.putBuffer(this._inputBuffer,t+this.overlapLength,e);const i=this._inputBuffer.startIndex+2*(t+this.seekWindowLength-this.overlapLength);this.midBuffer.set(this._inputBuffer.vector.subarray(i,i+2*this.overlapLength)),this.skipFract+=this.nominalSkip,o=Math.floor(this.skipFract),this.skipFract-=o,this._inputBuffer.receive(o)}}}const st=function(t,e){return(t>e?t-e:e-t)>1e-10};class lt{constructor(){this.transposer=new tt(!1),this.stretch=new rt(!1),this._inputBuffer=new X,this._intermediateBuffer=new X,this._outputBuffer=new X,this._rate=0,this._tempo=0,this.virtualPitch=1,this.virtualRate=1,this.virtualTempo=1,this.calculateEffectiveRateAndTempo()}clear(){this.transposer.clear(),this.stretch.clear()}clone(){const t=new lt;return t.rate=this.rate,t.tempo=this.tempo,t}get rate(){return this._rate}set rate(t){this.virtualRate=t,this.calculateEffectiveRateAndTempo()}set rateChange(t){this._rate=1+.01*t}get tempo(){return this._tempo}set tempo(t){this.virtualTempo=t,this.calculateEffectiveRateAndTempo()}set tempoChange(t){this.tempo=1+.01*t}set pitch(t){this.virtualPitch=t,this.calculateEffectiveRateAndTempo()}set pitchOctaves(t){this.pitch=Math.exp(.69314718056*t),this.calculateEffectiveRateAndTempo()}set pitchSemitones(t){this.pitchOctaves=t/12}get inputBuffer(){return this._inputBuffer}get outputBuffer(){return this._outputBuffer}calculateEffectiveRateAndTempo(){const t=this._tempo,e=this._rate;this._tempo=this.virtualTempo/this.virtualPitch,this._rate=this.virtualRate*this.virtualPitch,st(this._tempo,t)&&(this.stretch.tempo=this._tempo),st(this._rate,e)&&(this.transposer.rate=this._rate),this._rate>1?this._outputBuffer!=this.transposer.outputBuffer&&(this.stretch.inputBuffer=this._inputBuffer,this.stretch.outputBuffer=this._intermediateBuffer,this.transposer.inputBuffer=this._intermediateBuffer,this.transposer.outputBuffer=this._outputBuffer):this._outputBuffer!=this.stretch.outputBuffer&&(this.transposer.inputBuffer=this._inputBuffer,this.transposer.outputBuffer=this._intermediateBuffer,this.stretch.inputBuffer=this._intermediateBuffer,this.stretch.outputBuffer=this._outputBuffer)}process(){this._rate>1?(this.stretch.process(),this.transposer.process()):(this.transposer.process(),this.stretch.process())}}class dt{constructor(t){this.buffer=t,this._position=0}get dualChannel(){return this.buffer.numberOfChannels>1}get position(){return this._position}set position(t){this._position=t}extract(t,e=0,o=0){this.position=o;let i=this.buffer.getChannelData(0),a=this.dualChannel?this.buffer.getChannelData(1):this.buffer.getChannelData(0),n=0;for(;n=e?t:new Array(e-t.length+1).join(o)+t}(parseInt(t-60*e),2)}`},ct=function(t){const e=this.timePlayed,o=this.sampleRate;if(this.sourcePosition=t,this.timePlayed=t/o,e!==this.timePlayed){const t=new CustomEvent("play",{detail:{timePlayed:this.timePlayed,formattedTimePlayed:this.formattedTimePlayed,percentagePlayed:this.percentagePlayed}});this._node.dispatchEvent(t)}};class ht{constructor(t,e,o,i=ot){this._soundtouch=new lt;const a=new dt(e);this.timePlayed=0,this.sourcePosition=0,this._filter=new it(a,this._soundtouch,i),this._node=function(t,e,o=ot,i=4096){const a=t.createScriptProcessor(i,2,2),n=new Float32Array(2*i);return a.onaudioprocess=t=>{let a=t.outputBuffer.getChannelData(0),r=t.outputBuffer.getChannelData(1),s=e.extract(n,i);o(e.sourcePosition),0===s&&e.onEnd();let l=0;for(;lct.call(this,t)),o),this.tempo=1,this.rate=1,this.duration=e.duration,this.sampleRate=t.sampleRate,this.listeners=[]}get formattedDuration(){return ut(this.duration)}get formattedTimePlayed(){return ut(this.timePlayed)}get percentagePlayed(){return 100*this._filter.sourcePosition/(this.duration*this.sampleRate)}set percentagePlayed(t){this._filter.sourcePosition=parseInt(t*this.duration*this.sampleRate),this.sourcePosition=this._filter.sourcePosition,this.timePlayed=this.sourcePosition/this.sampleRate}get node(){return this._node}set pitch(t){this._soundtouch.pitch=t}set pitchSemitones(t){this._soundtouch.pitchSemitones=t}set rate(t){this._soundtouch.rate=t}set tempo(t){this._soundtouch.tempo=t}connect(t){this._node.connect(t)}disconnect(){this._node.disconnect()}on(t,e){this.listeners.push({name:t,cb:e}),this._node.addEventListener(t,(t=>e(t.detail)))}off(t=null){let e=this.listeners;t&&(e=e.filter((e=>e.name===t))),e.forEach((t=>{this._node.removeEventListener(t.name,(e=>t.cb(e.detail)))}))}}const pt=(...t)=>{if(Z.debug)return console.log(`%c✦ chaimu.js v${Z.version} ✦`,"background: #000; color: #fff; padding: 0 8px",...t)},gt=["playing","ratechange","play","waiting","pause","seeked"];function mt(){const t=window.AudioContext||window.webkitAudioContext;return t?new t:void 0}class vt{static name="BasePlayer";chaimu;_src;fetch;constructor(t,e){this.chaimu=t,this._src=e,this.fetch=Z.fetchFn}async init(){return new Promise((t=>t(this)))}clear(){return new Promise((t=>t(this)))}lipSync(t=!1){return this}handleVideoEvent=t=>(pt(`handle video ${t.type}`),this.lipSync(t.type),this);removeVideoEvents(){for(const t of gt)this.chaimu.video.removeEventListener(t,this.handleVideoEvent);return this}addVideoEvents(){for(const t of gt)this.chaimu.video.addEventListener(t,this.handleVideoEvent);return this}async play(){return new Promise((t=>t(this)))}async pause(){return new Promise((t=>t(this)))}get name(){return this.constructor.name}set src(t){this._src=t}get src(){return this._src}get currentSrc(){return this._src}set volume(t){}get volume(){return 0}get playbackRate(){return 0}set playbackRate(t){}get currentTime(){return 0}}class ft extends vt{static name="AudioPlayer";audio;gainNode;audioSource;constructor(t,e){super(t,e),this.updateAudio()}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.audioSource&&(this.audioSource.disconnect(this.gainNode),this.gainNode.disconnect()),this.gainNode=this.chaimu.audioContext.createGain(),this.gainNode.connect(this.chaimu.audioContext.destination),this.audioSource=this.chaimu.audioContext.createMediaElementSource(this.audio),this.audioSource.connect(this.gainNode),this):this}updateAudio(){return this.audio=new Audio(this.src),this.audio.crossOrigin="anonymous",this}async init(){return new Promise((t=>(this.updateAudio(),this.initAudioBooster(),t(this))))}audioErrorHandle=t=>{console.error("[AudioPlayer]",t)};lipSync(t=!1){if(pt("[AudioPlayer] lipsync video",this.chaimu.video),!this.chaimu.video)return this;if(this.audio.currentTime=this.chaimu.video.currentTime,this.audio.playbackRate=this.chaimu.video.playbackRate,!t)return pt("[AudioPlayer] lipsync mode isn't set"),this;switch(pt(`[AudioPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"seeked":return this.chaimu.video.paused||this.syncPlay(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async clear(){return new Promise((t=>(this.audio.pause(),this.audio.src="",this.audio.removeAttribute("src"),t(this))))}syncPlay(){return pt("[AudioPlayer] sync play called"),this.audio.play().catch(this.audioErrorHandle),this}async play(){return pt("[AudioPlayer] play called"),await this.audio.play().catch(this.audioErrorHandle),this}async pause(){return new Promise((t=>(pt("[AudioPlayer] pause called"),this.audio.pause(),t(this))))}set src(t){this._src=t,t?this.audio.src=t:this.clear()}get src(){return this._src}get currentSrc(){return this.audio.currentSrc}set volume(t){this.gainNode?this.gainNode.gain.value=t:this.audio.volume=t}get volume(){return this.gainNode?this.gainNode.gain.value:this.audio.volume}get playbackRate(){return this.audio.playbackRate}set playbackRate(t){this.audio.playbackRate=t}get currentTime(){return this.audio.currentTime}}class bt extends vt{static name="ChaimuPlayer";audioBuffer;sourceNode;gainNode;audioShifter;cleanerRunned=!1;async fetchAudio(){if(!this._src)throw new Error("No audio source provided");if(!this.chaimu.audioContext)throw new Error("No audio context available");pt(`[ChaimuPlayer] Fetching audio from ${this._src}...`);try{const t=await this.fetch(this._src);pt("[ChaimuPlayer] Decoding fetched audio...");const e=await t.arrayBuffer();this.audioBuffer=await this.chaimu.audioContext.decodeAudioData(e)}catch(t){throw new Error(`Failed to fetch audio file, because ${t.message}`)}return this}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.gainNode.disconnect(),this.gainNode=this.chaimu.audioContext.createGain(),this):this}async init(){return await this.fetchAudio(),this.initAudioBooster(),this}lipSync(t=!1){if(pt("[ChaimuPlayer] lipsync video",this.chaimu.video,this),!this.chaimu.video)return this;if(!t)return pt("[ChaimuPlayer] lipsync mode isn't set"),this;switch(pt(`[ChaimuPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"ratechange":case"seeked":return this.chaimu.video.paused||this.start(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async reopenCtx(){if(!this.chaimu.audioContext)throw new Error("No audio context available");try{await this.chaimu.audioContext.close()}catch{}return this}async clear(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(pt("clear audio context"),this.cleanerRunned=!0,await this.pause(),!this.gainNode)return this.cleanerRunned=!1,this;this.sourceNode&&(this.sourceNode.stop(),this.sourceNode.disconnect(this.gainNode),this.sourceNode=void 0),this.audioShifter&&(this.audioShifter._node.disconnect(this.gainNode),this.audioShifter=void 0),this.gainNode.disconnect();const t=this.volume;return this.gainNode=void 0,await this.reopenCtx(),this.chaimu.audioContext=mt(),this.initAudioBooster(),this.volume=t,this.cleanerRunned=!1,this}async start(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(!this.audioBuffer)throw new Error("The player isn't initialized");return!this.gainNode||this.audioShifter&&this.audioShifter.duration(""!==t.target&&e.uint32(10).string(t.target),""!==t.targetUrl&&e.uint32(18).string(t.targetUrl),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={target:"",targetUrl:""};for(;o.pos>>3){case 1:if(10!==t)break;a.target=o.string();continue;case 2:if(18!==t)break;a.targetUrl=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({target:Ht(t.target)?globalThis.String(t.target):"",targetUrl:Ht(t.targetUrl)?globalThis.String(t.targetUrl):""}),toJSON(t){const e={};return""!==t.target&&(e.target=t.target),""!==t.targetUrl&&(e.targetUrl=t.targetUrl),e},create:t=>It.fromPartial(t??{}),fromPartial(t){const e={target:"",targetUrl:""};return e.target=t.target??"",e.targetUrl=t.targetUrl??"",e}};const Pt={encode(t,e=kt.Writer.create()){""!==t.url&&e.uint32(26).string(t.url),void 0!==t.deviceId&&e.uint32(34).string(t.deviceId),!1!==t.firstRequest&&e.uint32(40).bool(t.firstRequest),0!==t.duration&&e.uint32(49).double(t.duration),0!==t.unknown0&&e.uint32(56).int32(t.unknown0),""!==t.language&&e.uint32(66).string(t.language),!1!==t.forceSourceLang&&e.uint32(72).bool(t.forceSourceLang),0!==t.unknown1&&e.uint32(80).int32(t.unknown1);for(const o of t.translationHelp)It.encode(o,e.uint32(90).fork()).ldelim();return""!==t.responseLanguage&&e.uint32(114).string(t.responseLanguage),0!==t.unknown2&&e.uint32(120).int32(t.unknown2),0!==t.unknown3&&e.uint32(128).int32(t.unknown3),!1!==t.bypassCache&&e.uint32(136).bool(t.bypassCache),!1!==t.useNewModel&&e.uint32(144).bool(t.useNewModel),e},decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};for(;o.pos>>3){case 3:if(26!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.deviceId=o.string();continue;case 5:if(40!==t)break;a.firstRequest=o.bool();continue;case 6:if(49!==t)break;a.duration=o.double();continue;case 7:if(56!==t)break;a.unknown0=o.int32();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(72!==t)break;a.forceSourceLang=o.bool();continue;case 10:if(80!==t)break;a.unknown1=o.int32();continue;case 11:if(90!==t)break;a.translationHelp.push(It.decode(o,o.uint32()));continue;case 14:if(114!==t)break;a.responseLanguage=o.string();continue;case 15:if(120!==t)break;a.unknown2=o.int32();continue;case 16:if(128!==t)break;a.unknown3=o.int32();continue;case 17:if(136!==t)break;a.bypassCache=o.bool();continue;case 18:if(144!==t)break;a.useNewModel=o.bool();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",deviceId:Ht(t.deviceId)?globalThis.String(t.deviceId):void 0,firstRequest:!!Ht(t.firstRequest)&&globalThis.Boolean(t.firstRequest),duration:Ht(t.duration)?globalThis.Number(t.duration):0,unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):0,language:Ht(t.language)?globalThis.String(t.language):"",forceSourceLang:!!Ht(t.forceSourceLang)&&globalThis.Boolean(t.forceSourceLang),unknown1:Ht(t.unknown1)?globalThis.Number(t.unknown1):0,translationHelp:globalThis.Array.isArray(t?.translationHelp)?t.translationHelp.map((t=>It.fromJSON(t))):[],responseLanguage:Ht(t.responseLanguage)?globalThis.String(t.responseLanguage):"",unknown2:Ht(t.unknown2)?globalThis.Number(t.unknown2):0,unknown3:Ht(t.unknown3)?globalThis.Number(t.unknown3):0,bypassCache:!!Ht(t.bypassCache)&&globalThis.Boolean(t.bypassCache),useNewModel:!!Ht(t.useNewModel)&&globalThis.Boolean(t.useNewModel)}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),void 0!==t.deviceId&&(e.deviceId=t.deviceId),!1!==t.firstRequest&&(e.firstRequest=t.firstRequest),0!==t.duration&&(e.duration=t.duration),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.language&&(e.language=t.language),!1!==t.forceSourceLang&&(e.forceSourceLang=t.forceSourceLang),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),t.translationHelp?.length&&(e.translationHelp=t.translationHelp.map((t=>It.toJSON(t)))),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),0!==t.unknown3&&(e.unknown3=Math.round(t.unknown3)),!1!==t.bypassCache&&(e.bypassCache=t.bypassCache),!1!==t.useNewModel&&(e.useNewModel=t.useNewModel),e},create:t=>Pt.fromPartial(t??{}),fromPartial(t){const e={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};return e.url=t.url??"",e.deviceId=t.deviceId??void 0,e.firstRequest=t.firstRequest??!1,e.duration=t.duration??0,e.unknown0=t.unknown0??0,e.language=t.language??"",e.forceSourceLang=t.forceSourceLang??!1,e.unknown1=t.unknown1??0,e.translationHelp=t.translationHelp?.map((t=>It.fromPartial(t)))||[],e.responseLanguage=t.responseLanguage??"",e.unknown2=t.unknown2??0,e.unknown3=t.unknown3??0,e.bypassCache=t.bypassCache??!1,e.useNewModel=t.useNewModel??!1,e}};const Lt={encode:(t,e=kt.Writer.create())=>(void 0!==t.url&&e.uint32(10).string(t.url),void 0!==t.duration&&e.uint32(17).double(t.duration),0!==t.status&&e.uint32(32).int32(t.status),void 0!==t.remainingTime&&e.uint32(40).int32(t.remainingTime),void 0!==t.unknown0&&e.uint32(48).int32(t.unknown0),""!==t.translationId&&e.uint32(58).string(t.translationId),void 0!==t.language&&e.uint32(66).string(t.language),void 0!==t.message&&e.uint32(74).string(t.message),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(17!==t)break;a.duration=o.double();continue;case 4:if(32!==t)break;a.status=o.int32();continue;case 5:if(40!==t)break;a.remainingTime=o.int32();continue;case 6:if(48!==t)break;a.unknown0=o.int32();continue;case 7:if(58!==t)break;a.translationId=o.string();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(74!==t)break;a.message=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):void 0,duration:Ht(t.duration)?globalThis.Number(t.duration):void 0,status:Ht(t.status)?globalThis.Number(t.status):0,remainingTime:Ht(t.remainingTime)?globalThis.Number(t.remainingTime):void 0,unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):void 0,translationId:Ht(t.translationId)?globalThis.String(t.translationId):"",language:Ht(t.language)?globalThis.String(t.language):void 0,message:Ht(t.message)?globalThis.String(t.message):void 0}),toJSON(t){const e={};return void 0!==t.url&&(e.url=t.url),void 0!==t.duration&&(e.duration=t.duration),0!==t.status&&(e.status=Math.round(t.status)),void 0!==t.remainingTime&&(e.remainingTime=Math.round(t.remainingTime)),void 0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translationId&&(e.translationId=t.translationId),void 0!==t.language&&(e.language=t.language),void 0!==t.message&&(e.message=t.message),e},create:t=>Lt.fromPartial(t??{}),fromPartial(t){const e={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};return e.url=t.url??void 0,e.duration=t.duration??void 0,e.status=t.status??0,e.remainingTime=t.remainingTime??void 0,e.unknown0=t.unknown0??void 0,e.translationId=t.translationId??"",e.language=t.language??void 0,e.message=t.message??void 0,e}};function At(){return{audioFile:new Uint8Array(0),fileId:""}}const _t={encode:(t,e=kt.Writer.create())=>(0!==t.audioFile.length&&e.uint32(18).bytes(t.audioFile),""!==t.fileId&&e.uint32(10).string(t.fileId),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a=At();for(;o.pos>>3){case 2:if(18!==t)break;a.audioFile=o.bytes();continue;case 1:if(10!==t)break;a.fileId=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioFile:Ht(t.audioFile)?zt(t.audioFile):new Uint8Array(0),fileId:Ht(t.fileId)?globalThis.String(t.fileId):""}),toJSON(t){const e={};return 0!==t.audioFile.length&&(e.audioFile=function(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}(t.audioFile)),""!==t.fileId&&(e.fileId=t.fileId),e},create:t=>_t.fromPartial(t??{}),fromPartial(t){const e=At();return e.audioFile=t.audioFile??new Uint8Array(0),e.fileId=t.fileId??"",e}};const Vt={encode:(t,e=kt.Writer.create())=>(0!==t.audioPartsLength&&e.uint32(16).int32(t.audioPartsLength),void 0!==t.audioBuffer&&_t.encode(t.audioBuffer,e.uint32(10).fork()).ldelim(),""!==t.fileId&&e.uint32(26).string(t.fileId),0!==t.unknown0&&e.uint32(32).int32(t.unknown0),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};for(;o.pos>>3){case 2:if(16!==t)break;a.audioPartsLength=o.int32();continue;case 1:if(10!==t)break;a.audioBuffer=_t.decode(o,o.uint32());continue;case 3:if(26!==t)break;a.fileId=o.string();continue;case 4:if(32!==t)break;a.unknown0=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioPartsLength:Ht(t.audioPartsLength)?globalThis.Number(t.audioPartsLength):0,audioBuffer:Ht(t.audioBuffer)?_t.fromJSON(t.audioBuffer):void 0,fileId:Ht(t.fileId)?globalThis.String(t.fileId):"",unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):0}),toJSON(t){const e={};return 0!==t.audioPartsLength&&(e.audioPartsLength=Math.round(t.audioPartsLength)),void 0!==t.audioBuffer&&(e.audioBuffer=_t.toJSON(t.audioBuffer)),""!==t.fileId&&(e.fileId=t.fileId),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),e},create:t=>Vt.fromPartial(t??{}),fromPartial(t){const e={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};return e.audioPartsLength=t.audioPartsLength??0,e.audioBuffer=void 0!==t.audioBuffer&&null!==t.audioBuffer?_t.fromPartial(t.audioBuffer):void 0,e.fileId=t.fileId??"",e.unknown0=t.unknown0??0,e}};const Ot={encode:(t,e=kt.Writer.create())=>(""!==t.translationId&&e.uint32(10).string(t.translationId),""!==t.url&&e.uint32(18).string(t.url),void 0!==t.partialAudioInfo&&Vt.encode(t.partialAudioInfo,e.uint32(34).fork()).ldelim(),void 0!==t.audioInfo&&_t.encode(t.audioInfo,e.uint32(50).fork()).ldelim(),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.translationId=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.partialAudioInfo=Vt.decode(o,o.uint32());continue;case 6:if(50!==t)break;a.audioInfo=_t.decode(o,o.uint32());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({translationId:Ht(t.translationId)?globalThis.String(t.translationId):"",url:Ht(t.url)?globalThis.String(t.url):"",partialAudioInfo:Ht(t.partialAudioInfo)?Vt.fromJSON(t.partialAudioInfo):void 0,audioInfo:Ht(t.audioInfo)?_t.fromJSON(t.audioInfo):void 0}),toJSON(t){const e={};return""!==t.translationId&&(e.translationId=t.translationId),""!==t.url&&(e.url=t.url),void 0!==t.partialAudioInfo&&(e.partialAudioInfo=Vt.toJSON(t.partialAudioInfo)),void 0!==t.audioInfo&&(e.audioInfo=_t.toJSON(t.audioInfo)),e},create:t=>Ot.fromPartial(t??{}),fromPartial(t){const e={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};return e.translationId=t.translationId??"",e.url=t.url??"",e.partialAudioInfo=void 0!==t.partialAudioInfo&&null!==t.partialAudioInfo?Vt.fromPartial(t.partialAudioInfo):void 0,e.audioInfo=void 0!==t.audioInfo&&null!==t.audioInfo?_t.fromPartial(t.audioInfo):void 0,e}};const Mt={encode(t,e=kt.Writer.create()){0!==t.status&&e.uint32(8).int32(t.status);for(const o of t.remainingChunks)e.uint32(18).string(o);return e},decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={status:0,remainingChunks:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.status=o.int32();continue;case 2:if(18!==t)break;a.remainingChunks.push(o.string());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({status:Ht(t.status)?globalThis.Number(t.status):0,remainingChunks:globalThis.Array.isArray(t?.remainingChunks)?t.remainingChunks.map((t=>globalThis.String(t))):[]}),toJSON(t){const e={};return 0!==t.status&&(e.status=Math.round(t.status)),t.remainingChunks?.length&&(e.remainingChunks=t.remainingChunks),e},create:t=>Mt.fromPartial(t??{}),fromPartial(t){const e={status:0,remainingChunks:[]};return e.status=t.status??0,e.remainingChunks=t.remainingChunks?.map((t=>t))||[],e}};const Et={encode:(t,e=kt.Writer.create())=>(""!==t.language&&e.uint32(10).string(t.language),""!==t.url&&e.uint32(18).string(t.url),0!==t.unknown0&&e.uint32(24).int32(t.unknown0),""!==t.translatedLanguage&&e.uint32(34).string(t.translatedLanguage),""!==t.translatedUrl&&e.uint32(42).string(t.translatedUrl),0!==t.unknown1&&e.uint32(48).int32(t.unknown1),0!==t.unknown2&&e.uint32(56).int32(t.unknown2),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};for(;o.pos>>3){case 1:if(10!==t)break;a.language=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 3:if(24!==t)break;a.unknown0=o.int32();continue;case 4:if(34!==t)break;a.translatedLanguage=o.string();continue;case 5:if(42!==t)break;a.translatedUrl=o.string();continue;case 6:if(48!==t)break;a.unknown1=o.int32();continue;case 7:if(56!==t)break;a.unknown2=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({language:Ht(t.language)?globalThis.String(t.language):"",url:Ht(t.url)?globalThis.String(t.url):"",unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):0,translatedLanguage:Ht(t.translatedLanguage)?globalThis.String(t.translatedLanguage):"",translatedUrl:Ht(t.translatedUrl)?globalThis.String(t.translatedUrl):"",unknown1:Ht(t.unknown1)?globalThis.Number(t.unknown1):0,unknown2:Ht(t.unknown2)?globalThis.Number(t.unknown2):0}),toJSON(t){const e={};return""!==t.language&&(e.language=t.language),""!==t.url&&(e.url=t.url),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translatedLanguage&&(e.translatedLanguage=t.translatedLanguage),""!==t.translatedUrl&&(e.translatedUrl=t.translatedUrl),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),e},create:t=>Et.fromPartial(t??{}),fromPartial(t){const e={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};return e.language=t.language??"",e.url=t.url??"",e.unknown0=t.unknown0??0,e.translatedLanguage=t.translatedLanguage??"",e.translatedUrl=t.translatedUrl??"",e.unknown1=t.unknown1??0,e.unknown2=t.unknown2??0,e}};const Bt={encode:(t,e=kt.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",language:Ht(t.language)?globalThis.String(t.language):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),e},create:t=>Bt.fromPartial(t??{}),fromPartial(t){const e={url:"",language:""};return e.url=t.url??"",e.language=t.language??"",e}};const Nt={encode(t,e=kt.Writer.create()){!1!==t.waiting&&e.uint32(8).bool(t.waiting);for(const o of t.subtitles)Et.encode(o,e.uint32(18).fork()).ldelim();return e},decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={waiting:!1,subtitles:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.waiting=o.bool();continue;case 2:if(18!==t)break;a.subtitles.push(Et.decode(o,o.uint32()));continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({waiting:!!Ht(t.waiting)&&globalThis.Boolean(t.waiting),subtitles:globalThis.Array.isArray(t?.subtitles)?t.subtitles.map((t=>Et.fromJSON(t))):[]}),toJSON(t){const e={};return!1!==t.waiting&&(e.waiting=t.waiting),t.subtitles?.length&&(e.subtitles=t.subtitles.map((t=>Et.toJSON(t)))),e},create:t=>Nt.fromPartial(t??{}),fromPartial(t){const e={waiting:!1,subtitles:[]};return e.waiting=t.waiting??!1,e.subtitles=t.subtitles?.map((t=>Et.fromPartial(t)))||[],e}};const Rt={encode:(t,e=kt.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.timestamp&&e.uint32(18).string(t.timestamp),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",timestamp:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.timestamp=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",timestamp:Ht(t.timestamp)?globalThis.String(t.timestamp):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.timestamp&&(e.timestamp=t.timestamp),e},create:t=>Rt.fromPartial(t??{}),fromPartial(t){const e={url:"",timestamp:""};return e.url=t.url??"",e.timestamp=t.timestamp??"",e}};const $t={encode:(t,e=kt.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),""!==t.responseLanguage&&e.uint32(26).string(t.responseLanguage),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:"",responseLanguage:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue;case 3:if(26!==t)break;a.responseLanguage=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",language:Ht(t.language)?globalThis.String(t.language):"",responseLanguage:Ht(t.responseLanguage)?globalThis.String(t.responseLanguage):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),e},create:t=>$t.fromPartial(t??{}),fromPartial(t){const e={url:"",language:"",responseLanguage:""};return e.url=t.url??"",e.language=t.language??"",e.responseLanguage=t.responseLanguage??"",e}};const Dt={encode:(t,e=kt.Writer.create())=>(0!==t.interval&&e.uint32(8).int32(t.interval),void 0!==t.translatedInfo&&Rt.encode(t.translatedInfo,e.uint32(18).fork()).ldelim(),void 0!==t.pingId&&e.uint32(24).int32(t.pingId),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={interval:0,translatedInfo:void 0,pingId:void 0};for(;o.pos>>3){case 1:if(8!==t)break;a.interval=o.int32();continue;case 2:if(18!==t)break;a.translatedInfo=Rt.decode(o,o.uint32());continue;case 3:if(24!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({interval:Ht(t.interval)?Ct(t.interval):0,translatedInfo:Ht(t.translatedInfo)?Rt.fromJSON(t.translatedInfo):void 0,pingId:Ht(t.pingId)?globalThis.Number(t.pingId):void 0}),toJSON(t){const e={};return 0!==t.interval&&(e.interval=function(t){switch(t){case Tt.NO_CONNECTION:return"NO_CONNECTION";case Tt.TRANSLATING:return"TRANSLATING";case Tt.STREAMING:return"STREAMING";case Tt.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.interval)),void 0!==t.translatedInfo&&(e.translatedInfo=Rt.toJSON(t.translatedInfo)),void 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>Dt.fromPartial(t??{}),fromPartial(t){const e={interval:0,translatedInfo:void 0,pingId:void 0};return e.interval=t.interval??0,e.translatedInfo=void 0!==t.translatedInfo&&null!==t.translatedInfo?Rt.fromPartial(t.translatedInfo):void 0,e.pingId=t.pingId??void 0,e}};const Ft={encode:(t,e=kt.Writer.create())=>(0!==t.pingId&&e.uint32(8).int32(t.pingId),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={pingId:0};for(;o.pos>>3){case 1:if(8!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({pingId:Ht(t.pingId)?globalThis.Number(t.pingId):0}),toJSON(t){const e={};return 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>Ft.fromPartial(t??{}),fromPartial(t){const e={pingId:0};return e.pingId=t.pingId??0,e}};const Ut={encode:(t,e=kt.Writer.create())=>(""!==t.uuid&&e.uint32(10).string(t.uuid),""!==t.module&&e.uint32(18).string(t.module),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={uuid:"",module:""};for(;o.pos>>3){case 1:if(10!==t)break;a.uuid=o.string();continue;case 2:if(18!==t)break;a.module=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({uuid:Ht(t.uuid)?globalThis.String(t.uuid):"",module:Ht(t.module)?globalThis.String(t.module):""}),toJSON(t){const e={};return""!==t.uuid&&(e.uuid=t.uuid),""!==t.module&&(e.module=t.module),e},create:t=>Ut.fromPartial(t??{}),fromPartial(t){const e={uuid:"",module:""};return e.uuid=t.uuid??"",e.module=t.module??"",e}};const qt={encode:(t,e=kt.Writer.create())=>(""!==t.secretKey&&e.uint32(10).string(t.secretKey),0!==t.expires&&e.uint32(16).int32(t.expires),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={secretKey:"",expires:0};for(;o.pos>>3){case 1:if(10!==t)break;a.secretKey=o.string();continue;case 2:if(16!==t)break;a.expires=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({secretKey:Ht(t.secretKey)?globalThis.String(t.secretKey):"",expires:Ht(t.expires)?globalThis.Number(t.expires):0}),toJSON(t){const e={};return""!==t.secretKey&&(e.secretKey=t.secretKey),0!==t.expires&&(e.expires=Math.round(t.expires)),e},create:t=>qt.fromPartial(t??{}),fromPartial(t){const e={secretKey:"",expires:0};return e.secretKey=t.secretKey??"",e.expires=t.expires??0,e}};function zt(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),o=new Uint8Array(e.length);for(let t=0;tt+e.toString(16).padStart(2,"0")),"")}async function Yt(t,e,o,i){const{secretKey:a,uuid:n}=e,r=await Gt(o),s=`${n}:${i}:${wt.componentVersion}`,l=Wt.encode(s);return{[`${t}-Signature`]:r,[`Sec-${t}-Sk`]:a,[`Sec-${t}-Token`]:`${await Gt(l)}:${s}`}}const Jt={afr:"af",aka:"ak",alb:"sq",amh:"am",ara:"ar",arm:"hy",asm:"as",aym:"ay",aze:"az",baq:"eu",bel:"be",ben:"bn",bos:"bs",bul:"bg",bur:"my",cat:"ca",chi:"zh",cos:"co",cze:"cs",dan:"da",div:"dv",dut:"nl",eng:"en",epo:"eo",est:"et",ewe:"ee",fin:"fi",fre:"fr",fry:"fy",geo:"ka",ger:"de",gla:"gd",gle:"ga",glg:"gl",gre:"el",grn:"gn",guj:"gu",hat:"ht",hau:"ha",hin:"hi",hrv:"hr",hun:"hu",ibo:"ig",ice:"is",ind:"id",ita:"it",jav:"jv",jpn:"ja",kan:"kn",kaz:"kk",khm:"km",kin:"rw",kir:"ky",kor:"ko",kur:"ku",lao:"lo",lat:"la",lav:"lv",lin:"ln",lit:"lt",ltz:"lb",lug:"lg",mac:"mk",mal:"ml",mao:"mi",mar:"mr",may:"ms",mlg:"mg",mlt:"mt",mon:"mn",nep:"ne",nor:"no",nya:"ny",ori:"or",orm:"om",pan:"pa",per:"fa",pol:"pl",por:"pt",pus:"ps",que:"qu",rum:"ro",rus:"ru",san:"sa",sin:"si",slo:"sk",slv:"sl",smo:"sm",sna:"sn",snd:"sd",som:"so",sot:"st",spa:"es",srp:"sr",sun:"su",swa:"sw",swe:"sv",tam:"ta",tat:"tt",tel:"te",tgk:"tg",tha:"th",tir:"ti",tso:"ts",tuk:"tk",tur:"tr",uig:"ug",ukr:"uk",urd:"ur",uzb:"uz",vie:"vi",wel:"cy",xho:"xh",yid:"yi",yor:"yo",zul:"zu"};async function Kt(t,e={headers:{"User-Agent":wt.userAgent}}){const{timeout:o=3e3,...i}=e,a=new AbortController,n=setTimeout((()=>a.abort()),o),r=await fetch(t,{signal:a.signal,...i});return clearTimeout(n),r}function Zt(t){return 3===t.length?Jt[t]:t.toLowerCase().split(/[_;-]/)[0].trim()}function Xt(t,e="mp4"){const o=`https://${wt.mediaProxy}/v1/proxy/video.${e}?format=base64&force=true`;return t instanceof URL?`${o}&url=${btoa(t.href)}&origin=${t.origin}&referer=${t.origin}`:`${o}&url=${btoa(t)}`}const Qt={encodeTranslationRequest:(t,e,o,i,a,{forceSourceLang:n=!1,bypassCache:r=!1,useNewModel:s=!0}={})=>Pt.encode({url:t,firstRequest:!0,duration:e,unknown0:1,language:o,forceSourceLang:n,unknown1:0,translationHelp:a||[],responseLanguage:i,unknown2:1,unknown3:1,bypassCache:r,useNewModel:s}).finish(),decodeTranslationResponse:t=>Lt.decode(new Uint8Array(t)),encodeTranslationAudioRequest:(t,e,o,i)=>Ot.encode({url:t,translationId:e,...i?{partialAudioInfo:{...i,audioBuffer:o}}:{audioInfo:o}}).finish(),decodeTranslationAudioResponse:t=>Mt.decode(new Uint8Array(t)),encodeSubtitlesRequest:(t,e)=>Bt.encode({url:t,language:e}).finish(),decodeSubtitlesResponse:t=>Nt.decode(new Uint8Array(t)),encodeStreamPingRequest:t=>Ft.encode({pingId:t}).finish(),encodeStreamRequest:(t,e,o)=>$t.encode({url:t,language:e,responseLanguage:o}).finish(),decodeStreamResponse:t=>Dt.decode(new Uint8Array(t)),encodeYandexSessionRequest:(t,e)=>Ut.encode({uuid:t,module:e}).finish(),decodeYandexSessionResponse:t=>qt.decode(new Uint8Array(t))};var te,ee,oe;!function(t){t[t.FAILED=0]="FAILED",t[t.FINISHED=1]="FINISHED",t[t.WAITING=2]="WAITING",t[t.LONG_WAITING=3]="LONG_WAITING",t[t.PART_CONTENT=5]="PART_CONTENT",t[t.AUDIO_REQUESTED=6]="AUDIO_REQUESTED"}(te||(te={})),function(t){t.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME="web_api_get_all_generating_urls_data_from_iframe",t.WEB_API_REPLACED_FETCH_INSIDE_IFRAME="web_api_replaced_fetch_inside_iframe",t.WEB_API_REPLACED_FETCH_FORCE_REQUEST_WITH_SEEK="web_api_replaced_fetch_force_request_with_seek",t.WEB_API_REPLACED_FETCH="web_api_replaced_fetch",t.ANDROID_API="android_api",t.WEB_API_SLOW="web_api_slow"}(ee||(ee={})),function(t){t.custom="custom",t.directlink="custom",t.youtube="youtube",t.piped="piped",t.invidious="invidious",t.vk="vk",t.nine_gag="nine_gag",t.gag="nine_gag",t.twitch="twitch",t.proxitok="proxitok",t.tiktok="tiktok",t.vimeo="vimeo",t.xvideos="xvideos",t.pornhub="pornhub",t.twitter="twitter",t.x="twitter",t.rumble="rumble",t.facebook="facebook",t.rutube="rutube",t.coub="coub",t.bilibili="bilibili",t.mail_ru="mailru",t.mailru="mailru",t.bitchute="bitchute",t.eporner="eporner",t.peertube="peertube",t.dailymotion="dailymotion",t.trovo="trovo",t.yandexdisk="yandexdisk",t.ok_ru="okru",t.okru="okru",t.googledrive="googledrive",t.bannedvideo="bannedvideo",t.weverse="weverse",t.newgrounds="newgrounds",t.egghead="egghead",t.youku="youku",t.archive="archive",t.kodik="kodik",t.patreon="patreon",t.reddit="reddit",t.kick="kick",t.apple_developer="apple_developer",t.appledeveloper="apple_developer",t.poketube="poketube",t.epicgames="epicgames",t.nineanimetv="nineanimetv",t.odysee="odysee",t.coursehunterLike="coursehunterLike",t.sap="sap",t.watchpornto="watchpornto",t.linkedin="linkedin",t.ricktube="ricktube",t.incestflix="incestflix",t.porntn="porntn",t.dzen="dzen",t.cloudflarestream="cloudflarestream",t.loom="loom",t.rtnews="rtnews"}(oe||(oe={}));const ie=JSON.parse('{"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Don\'t translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTDetectService":"Language detection service","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site","VOTOnlyBypassMediaCSP":"Use it only for bypassing Media CSP","VOTNewAudioPlayer":"Use the new audio player","VOTUseNewModel":"Use an experimental variation of Yandex voices for some videos","VOTTranslationErrorsService":"Error translation service","TranslationDelayed":"The translation is slightly delayed","VOTTranslationCompletedNotify":"The translation on the {0} has been completed!","VOTSendNotifyOnComplete":"Send a notification that the video has been translated","VOTBugReport":"Report a bug","VOTTranslateProxyDisabled":"Disabled","VOTTranslateProxyEnabled":"Enabled","VOTTranslateProxyEverything":"Proxy everything","VOTTranslateProxyStatus":"Proxying mode"}'),ae={log:(...t)=>{}},ne="media-proxy.toil.cc/v1/proxy/m3u8",re="vot-worker.toil.cc",se=.15,le="yandexbrowser",de="yandexbrowser",ue=["FireMonkey","Greasemonkey","AdGuard","OrangeMonkey","Userscripts","Other (Polyfill)"];async function ce(t,e,o,i,a=void 0){(a??t[e])===o&&(t[e]=i,await he.set(e,i),console.log(`[VOT] Old ${e} converted to new ${i}`))}const he=new class{gmSupport;constructor(){this.gmSupport="function"==typeof GM_getValue,ae.log(`GM Storage Status: ${this.gmSupport}`)}syncGet(t,e=void 0){if(this.gmSupport)return GM_getValue(t,e);const o="number"==typeof e;const i=window.localStorage.getItem(t)??e;return o?Number(i):i}async get(t,e=void 0){return this.gmSupport?await GM_getValue(t,e):Promise.resolve(this.syncGet(t,e))}syncSet(t,e){return this.gmSupport?GM_setValue(t,e):window.localStorage.setItem(t,e)}async set(t,e){return this.gmSupport?await GM_setValue(t,e):Promise.resolve(this.syncSet(t,e))}syncDelete(t){return this.gmSupport?GM_deleteValue(t):window.localStorage.removeItem(t)}async delete(t){return this.gmSupport?await GM_deleteValue(t):Promise.resolve(this.syncDelete(t))}syncList(){return this.gmSupport?GM_listValues():["autoTranslate","dontTranslateLanguage","dontTranslateYourLang","autoSetVolumeYandexStyle","autoVolume","buttonPos","showVideoSlider","syncVolume","subtitlesMaxLength","highlightWords","responseLanguage","defaultVolume","audioProxy","showPiPButton","translateAPIErrors","translationService","detectService","m3u8ProxyHost","translateProxyEnabled","hotkeyButton","proxyWorkerHost","audioBooster","locale-version","locale-lang","locale-phrases"]}async list(){return this.gmSupport?await GM_listValues():Promise.resolve(this.syncList())}},pe=navigator.language||navigator.userLanguage,ge=pe?.substr(0,2)?.toLowerCase()??"en";function me(){return"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled}function ve(){return"undefined"!=typeof Hls&&Hls?.isSupported()?new Hls({debug:!1,lowLatencyMode:!0,backBufferLength:90}):void 0}const fe=new RegExp([/(?:https?|ftp):\/\/\S+/g,/https?:\/\/\S+|www\.\S+/gm,/\b\S+\.\S+/gm,/#[^\s#]+/g,/Auto-generated by YouTube/g,/Provided to YouTube by/g,/Released on/g,/0x[a-fA-F0-9]{40}/g,/[13][a-km-zA-HJ-NP-Z1-9]{25,34}/g,/4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}/g,/Paypal/g].map((t=>t.source)).join("|"));function be(t,e){const o=URL.createObjectURL(t),i=document.createElement("a");i.href=o,i.download=e,i.click(),URL.revokeObjectURL(o)}function ye(t){return 0===t.trim().length?(new Date).toLocaleDateString("en-us").replaceAll("/","-"):t.replace(/[\\/:*?"'<>|]/g,"")}async function we(t,e={}){const{timeout:o=15e3,...i}=e,a=new AbortController;try{if(t.includes("api.browser.yandex.ru"))throw new Error("Preventing yandex cors");return await fetch(t,{signal:a.signal,...i})}catch(e){return ae.log("GM_fetch preventing CORS by GM_xmlhttpRequest",e.message),new Promise(((e,a)=>{GM_xmlhttpRequest({method:i.method||"GET",url:t,responseType:"blob",data:i.body,timeout:o,headers:i.headers||{},onload:t=>{const o=t.responseHeaders.split(/\r?\n/).reduce(((t,e)=>{const[,o,i]=e.match(/^([\w-]+): (.+)$/)||[];return o&&(t[o]=i),t}),{}),i=new Response(t.response,{status:t.status,headers:o});Object.defineProperty(i,"url",{value:t.finalUrl??""}),e(i)},ontimeout:()=>a(new Error("Timeout")),onerror:t=>a(new Error(t)),onabort:()=>a(new Error("AbortError"))})}))}}function xe(){return Math.floor(Date.now()/1e3)}const Se="https://raw.githubusercontent.com/ilyhalight/voice-over-translation/master/src/localization",ke=["auto","en","ru","af","am","ar","az","bg","bn","bs","ca","cs","cy","da","de","el","es","et","eu","fa","fi","fr","gl","hi","hr","hu","hy","id","it","ja","jv","kk","km","kn","ko","lo","mk","ml","mn","ms","mt","my","ne","nl","pa","pl","pt","ro","si","sk","sl","sq","sr","su","sv","sw","tr","uk","ur","uz","vi","zh","zu"];const Te=new class{constructor(){this.gmValues=["locale-phrases","locale-lang","locale-hash","locale-updated-at","locale-lang-override"],this.lang=this.getLang(),this.locale={},this.setLocaleFromJsonString(he.syncGet("locale-phrases",""))}getLang(){const t=he.syncGet("locale-lang-override","auto");return"auto"!==t?t:ge}reset(){for(const t of this.gmValues)he.syncDelete(t)}async checkUpdates(t=!1){ae.log("Check locale updates...");try{const e=await we(`${Se}/hashes.json${t?`?timestamp=${xe()}`:""}`);if(!e.ok)throw e.status;const o=await e.json();return await he.get("locale-hash")!==o[this.lang]&&o[this.lang]}catch(t){return console.error("[VOT] [localizationProvider] Failed to get locales hash:",t),!1}}async update(t=!1){const e=await he.get("locale-updated-at",0);if(!t&&e+7200>xe()&&await he.get("locale-lang")===this.lang)return;const o=await this.checkUpdates(t);if(await he.set("locale-updated-at",xe()),o){ae.log("Updating locale...");try{const e=await we(`${Se}/locales/${this.lang}.json${t?`?timestamp=${xe()}`:""}`);if(!e.ok)throw e.status;const i=await e.text();await he.set("locale-phrases",i),await he.set("locale-hash",o),await he.set("locale-lang",this.lang),this.setLocaleFromJsonString(i)}catch(t){console.error("[VOT] [localizationProvider] Failed to get locale:",t),this.setLocaleFromJsonString(await he.get("locale-phrases",""))}}}setLocaleFromJsonString(t){try{this.locale=JSON.parse(t)||{}}catch(t){console.error("[VOT] [localizationProvider]",t),this.locale={}}}getFromLocale(t,e){return e.split(".").reduce(((t,e)=>t?.[e]),t)??this.warnMissingKey(t,e)}warnMissingKey(t,e){console.warn("[VOT] [localizationProvider] locale",t,"doesn't contain key",e)}getDefault(t){return this.getFromLocale(ie,t)??t}get(t){return this.getFromLocale(this.locale,t)??this.getDefault(t)}};class Ce extends Error{constructor(t){super(Te.getDefault(t)),this.name="VOTLocalizedError",this.unlocalizedMessage=t,this.localizedMessage=Te.get(t)}}class Ie extends Error{data;constructor(t,e=void 0){super(t),this.data=e,this.name="VOTJSError",this.message=t}}class Pe{host;hostVOT;schema;schemaVOT;fetch;fetchOpts;sessions={};requestLang;responseLang;userAgent=wt.userAgent;paths={videoTranslation:"/video-translation/translate",videoTranslationFailAudio:"/video-translation/fail-audio-js",videoTranslationAudio:"/video-translation/audio",videoSubtitles:"/video-subtitles/get-subtitles",streamPing:"/stream-translation/ping-stream",streamTranslation:"/stream-translation/translate-stream",createSession:"/session/create"};isCustomLink(t){return!!(/\.(m3u8|m4(a|v)|mpd)/.exec(t)??/^https:\/\/cdn\.qstv\.on\.epicgames\.com/.exec(t))}headers={"User-Agent":this.userAgent,Accept:"application/x-protobuf","Accept-Language":"en","Content-Type":"application/x-protobuf",Pragma:"no-cache","Cache-Control":"no-cache","Sec-Fetch-Mode":"no-cors"};headersVOT={"User-Agent":`vot.js/${wt.version}`,"Content-Type":"application/json",Pragma:"no-cache","Cache-Control":"no-cache"};constructor({host:t=wt.host,hostVOT:e=wt.hostVOT,fetchFn:o=Kt,fetchOpts:i={},requestLang:a="en",responseLang:n="ru",headers:r={}}={}){const s=/(http(s)?):\/\//,l=s.exec(t)?.[1];this.host=l?t.replace(`${l}://`,""):t,this.schema=l??"https";const d=s.exec(e)?.[1];this.hostVOT=d?e.replace(`${d}://`,""):e,this.schemaVOT=d??"https",this.fetch=o,this.fetchOpts=i,this.requestLang=a,this.responseLang=n,this.headers={...this.headers,...r}}getOpts(t,e={},o="POST"){return{method:o,headers:{...this.headers,...e},body:t,...this.fetchOpts}}async request(t,e,o={},i="POST"){const a=this.getOpts(new Blob([e]),o,i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(e,{"Content-Type":"application/json",...o},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestVOT(t,e,o={}){const i=this.getOpts(JSON.stringify(e),{...this.headersVOT,...o});try{const e=await this.fetch(`${this.schemaVOT}://${this.hostVOT}${t}`,i),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async getSession(t){const e=Math.floor(Date.now()/1e3),o=this.sessions[t];if(o&&o.timestamp+o.expires>e)return o;const{secretKey:i,expires:a,uuid:n}=await this.createSession(t);return this.sessions[t]={secretKey:i,expires:a,timestamp:e,uuid:n},this.sessions[t]}async translateVideoYAImpl({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},extraOpts:n={},shouldSendFailedAudio:r=!0}){const{url:s,duration:l=wt.defaultDuration}=t,d=await this.getSession("video-translation"),u=Qt.encodeTranslationRequest(s,l,e,o,i,n),c=this.paths.videoTranslation,h=await Yt("Vtrans",d,u,c),p=await this.request(c,u,{...h,...a});if(!p.success)throw new Ce("requestTranslationFailed");const g=Qt.decodeTranslationResponse(p.data);St.log("translateVideo",g);const{status:m,translationId:v}=g;switch(m){case te.FAILED:throw g?.message?new Ie("Yandex couldn't translate video",g):new Ce("requestTranslationFailed");case te.FINISHED:case te.PART_CONTENT:if(!g.url)throw new Ce("audioNotReceived");return{translationId:v,translated:!0,url:g.url,status:m,remainingTime:g.remainingTime??-1};case te.WAITING:case te.LONG_WAITING:return{translationId:v,translated:!1,status:m,remainingTime:g.remainingTime};case te.AUDIO_REQUESTED:return s.startsWith("https://youtu.be/")&&r?(await this.requestVtransFailAudio(s),await this.requestVtransAudio(s,g.translationId,{audioFile:new Uint8Array,fileId:ee.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME}),await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,shouldSendFailedAudio:!1})):{translationId:v,translated:!1,status:m,remainingTime:g.remainingTime??-1};default:throw St.error("Unknown response",g),new Ie("Unknown response from Yandex",g)}}async translateVideoVOTImpl({url:t,videoId:e,service:o,requestLang:i=this.requestLang,responseLang:a=this.responseLang,headers:n={}}){const r=function(t,e,o){return t===oe.patreon?{service:"mux",videoId:new URL(o).pathname.slice(1)}:{service:t,videoId:e}}(o,e,t),s=await this.requestVOT(this.paths.videoTranslation,{provider:"yandex",service:r.service,videoId:r.videoId,fromLang:i,toLang:a,rawVideo:t},n);if(!s.success)throw new Ce("requestTranslationFailed");const l=s.data;switch(l.status){case"failed":throw new Ie("Yandex couldn't translate video",l);case"success":if(!l.translatedUrl)throw new Ce("audioNotReceived");return{translationId:String(l.id),translated:!0,url:l.translatedUrl,status:1,remainingTime:-1};case"waiting":return{translationId:"",translated:!1,remainingTime:l.remainingTime,status:2,message:l.message}}}async requestVtransFailAudio(t){const e=await this.requestJSON(this.paths.videoTranslationFailAudio,JSON.stringify({video_url:t}),void 0,"PUT");if(!e.data||"string"==typeof e.data||1!==e.data.status)throw new Ie("Failed to request to fake video translation fail audio js",e);return e}async requestVtransAudio(t,e,o,i,a={}){const n=await this.getSession("video-translation"),r=Qt.encodeTranslationAudioRequest(t,e,o,i),s=this.paths.videoTranslationAudio,l=await Yt("Vtrans",n,r,s),d=await this.request(s,r,{...l,...a},"PUT");if(!d.success)throw new Ie("Failed to request video translation audio",d);return Qt.decodeTranslationAudioResponse(d.data)}async translateVideo({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},extraOpts:n={},shouldSendFailedAudio:r=!0}){const{url:s,videoId:l,host:d}=t;return this.isCustomLink(s)?await this.translateVideoVOTImpl({url:s,videoId:l,service:d,requestLang:e,responseLang:o,headers:a}):await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,extraOpts:n,shouldSendFailedAudio:r})}async getSubtitles({videoData:t,requestLang:e=this.requestLang,headers:o={}}){const{url:i}=t;if(this.isCustomLink(i))return{waiting:!1,subtitles:[]};const a=await this.getSession("video-translation"),n=Qt.encodeSubtitlesRequest(i,e),r=this.paths.videoSubtitles,s=await Yt("Vsubs",a,n,r),l=await this.request(r,n,{...s,...o});if(!l.success)throw new Ie("Failed to request video subtitles",l);return Qt.decodeSubtitlesResponse(l.data)}async pingStream({pingId:t,headers:e={}}){const o=await this.getSession("video-translation"),i=Qt.encodeStreamPingRequest(t),a=this.paths.streamPing,n=await Yt("Vtrans",o,i,a),r=await this.request(a,i,{...n,...e});if(!r.success)throw new Ie("Failed to request stream ping",r);return!0}async translateStream({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,headers:i={}}){const{url:a}=t;if(this.isCustomLink(a))throw new Ce("VOTStreamNotSupportedUrl");const n=await this.getSession("video-translation"),r=Qt.encodeStreamRequest(a,e,o),s=this.paths.streamTranslation,l=await Yt("Vtrans",n,r,s),d=await this.request(s,r,{...l,...i});if(!d.success)throw new Ie("Failed to request stream translation",d);const u=Qt.decodeStreamResponse(d.data),c=u.interval;switch(c){case Tt.NO_CONNECTION:case Tt.TRANSLATING:return{translated:!1,interval:c,message:c===Tt.NO_CONNECTION?"streamNoConnectionToServer":"translationTakeFewMinutes"};case Tt.STREAMING:return{translated:!0,interval:c,pingId:u.pingId,result:u.translatedInfo};default:throw St.error("Unknown response",u),new Ie("Unknown response from Yandex",u)}}async createSession(t){const e=function(){let t="";for(let e=0;e<32;e++)t+="0123456789ABCDEF"[Math.floor(16*Math.random())];return t}(),o=Qt.encodeYandexSessionRequest(e,t),i=await this.request(this.paths.createSession,o,{"Vtrans-Signature":await Gt(o)});if(!i.success)throw new Ie("Failed to request create session",i);return{...Qt.decodeYandexSessionResponse(i.data),uuid:e}}}class Le extends Pe{constructor(t={}){t.host=t.host??wt.hostWorker,super(t)}async request(t,e,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,...o},body:Array.from(e)}),{"Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,"Content-Type":"application/json",Accept:"application/json",...o},body:e}),{Accept:"application/json","Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}}const{componentVersion:Ae}=wt,_e={"sec-ch-ua":`"Chromium";v="130", "YaBrowser";v="${Ae.slice(0,5)}", "Not?A_Brand";v="99", "Yowser";v="2.5"`,"sec-ch-ua-full-version-list":`"Chromium";v="130.0.6723.152", "YaBrowser";v="${Ae}", "Not?A_Brand";v="99.0.0.0", "Yowser";v="2.5"`};class Ve extends Pe{constructor(t){super(t),this.headers={..._e,...this.headers}}}class Oe extends Le{constructor(t){super(t),this.headers={..._e,...this.headers}}}class Me extends Error{constructor(t){super(t),this.name="VideoDataError",this.message=t}}const Ee=/(file:\/\/(\/)?|(http(s)?:\/\/)(127\.0\.0\.1|localhost|192\.168\.(\d){1,3}\.(\d){1,3}))/;var Be;!function(t){t.udemy="udemy",t.coursera="coursera",t.douyin="douyin",t.artstation="artstation"}(Be||(Be={}));const Ne=[{additionalData:"mobile",host:oe.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:"shorts-video #player",needExtraData:!0},{additionalData:"mobile",host:oe.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:".player-container",needExtraData:!0},{host:oe.youtube,url:"https://youtu.be/",match:/^(www.)?youtube(-nocookie|kids)?.com$/,selector:".html5-video-container:not(#inline-player *)",needExtraData:!0},{host:oe.invidious,url:"https://youtu.be/",match:["yewtu.be","yt.artemislena.eu","invidious.flokinet.to","iv.melmac.space","inv.nadeko.net","inv.tux.pizza","invidious.private.coffee","yt.drgnz.club","vid.puffyan.us","invidious.dhusch.de"],selector:"#player",needBypassCSP:!0},{host:oe.piped,url:"https://youtu.be/",match:["piped.video","piped.tokhmi.xyz","piped.moomoo.me","piped.syncpundit.io","piped.mha.fi","watch.whatever.social","piped.garudalinux.org","efy.piped.pages.dev","watch.leptons.xyz","piped.lunar.icu","yt.dc09.ru","piped.mint.lgbt","il.ax","piped.privacy.com.de","piped.esmailelbob.xyz","piped.projectsegfau.lt","piped.in.projectsegfau.lt","piped.us.projectsegfau.lt","piped.privacydev.net","piped.palveluntarjoaja.eu","piped.smnz.de","piped.adminforge.de","piped.qdi.fi","piped.hostux.net","piped.chauvet.pro","piped.jotoma.de","piped.pfcd.me","piped.frontendfriendly.xyz"],selector:".shaka-video-container",needBypassCSP:!0},{host:oe.poketube,url:"https://youtu.be/",match:["poketube.fun","pt.sudovanilla.org","poke.ggtyler.dev","poke.uk2.littlekai.co.uk","poke.blahai.gay"],selector:".video-player-container"},{host:oe.ricktube,url:"https://youtu.be/",match:["ricktube.ru"],selector:"#oframeplayer > pjsdiv:has(video)"},{additionalData:"mobile",host:oe.vk,url:"https://vk.com/video?z=",match:[/^m.vk.(com|ru)$/,/^m.vkvideo.ru$/],selector:"vk-video-player",shadowRoot:!0,needExtraData:!0},{additionalData:"clips",host:oe.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:'div[data-testid="clipcontainer-video"]',needExtraData:!0},{host:oe.vk,url:"https://vk.com/video?z=",match:[/^(www.|m.)?vk.(com|ru)$/,/^(www.|m.)?vkvideo.ru$/],selector:".videoplayer_media",needExtraData:!0},{host:oe.nine_gag,url:"https://9gag.com/gag/",match:/^9gag.com$/,selector:".video-post"},{host:oe.twitch,url:"https://twitch.tv/",match:[/^m.twitch.tv$/,/^(www.)?twitch.tv$/,/^clips.twitch.tv$/,/^player.twitch.tv$/],selector:".video-ref, main > div > section > div > div > div"},{host:oe.proxitok,url:"https://www.tiktok.com/",match:["proxitok.pabloferreiro.es","proxitok.pussthecat.org","tok.habedieeh.re","proxitok.esmailelbob.xyz","proxitok.privacydev.net","tok.artemislena.eu","tok.adminforge.de","tt.vern.cc","cringe.whatever.social","proxitok.lunar.icu","proxitok.privacy.com.de"],selector:".column.has-text-centered"},{host:oe.tiktok,url:"https://www.tiktok.com/",match:/^(www.)?tiktok.com$/,selector:null},{host:Be.douyin,url:"https://www.douyin.com/",match:/^(www.)?douyin.com/,selector:".xg-video-container",needExtraData:!0,needBypassCSP:!0},{host:oe.vimeo,url:"https://vimeo.com/",match:/^vimeo.com$/,needExtraData:!0,selector:".player"},{host:oe.vimeo,url:"https://player.vimeo.com/",match:/^player.vimeo.com$/,additionalData:"embed",needExtraData:!0,needBypassCSP:!0,selector:".player"},{host:oe.xvideos,url:"https://www.xvideos.com/",match:[/^(www.)?xvideos(-ar)?.com$/,/^(www.)?xvideos(\d\d\d).com$/,/^(www.)?xv-ru.com$/],selector:"#hlsplayer",needBypassCSP:!0},{host:oe.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:/^[a-z]+.pornhub.com$/,selector:".mainPlayerDiv > .video-element-wrapper-js > div",eventSelector:".mgp_eventCatcher"},{additionalData:"embed",host:oe.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:t=>t.host.includes("pornhub.com")&&t.pathname.startsWith("/embed/"),selector:"#player"},{host:oe.twitter,url:"https://twitter.com/i/status/",match:/^(twitter|x).com$/,selector:'div[data-testid="videoComponent"] > div:nth-child(1) > div',eventSelector:'div[data-testid="videoPlayer"]',needBypassCSP:!0},{host:oe.rumble,url:"https://rumble.com/",match:/^rumble.com$/,selector:"#videoPlayer > .videoPlayer-Rumble-cls > div"},{host:oe.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/videos/"),selector:'div[role="main"] div[data-pagelet$="video" i]',needBypassCSP:!0},{additionalData:"reels",host:oe.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/reel/"),selector:'div[role="main"]',needBypassCSP:!0},{host:oe.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:".video-player > div > div > div:nth-child(2)"},{additionalData:"embed",host:oe.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:"#app > div > div"},{host:oe.bilibili,url:"https://www.bilibili.com/",match:/^(www|m|player).bilibili.com$/,selector:".bpx-player-video-wrap"},{additionalData:"old",host:oe.bilibili,url:"https://www.bilibili.com/",match:/^(www|m).bilibili.com$/,selector:null},{host:oe.mailru,url:"https://my.mail.ru/",match:/^my.mail.ru$/,selector:"#b-video-wrapper"},{host:oe.bitchute,url:"https://www.bitchute.com/video/",match:/^(www.)?bitchute.com$/,selector:".video-js"},{host:oe.eporner,url:"https://www.eporner.com/",match:/^(www.)?eporner.com$/,selector:".vjs-v7"},{host:oe.peertube,url:"stub",match:["peertube.1312.media","tube.shanti.cafe","bee-tube.fr","video.sadmin.io","dalek.zone","review.peertube.biz","peervideo.club","tube.la-dina.net","peertube.tmp.rcp.tf","peertube.su","video.blender.org","videos.viorsan.com","tube-sciences-technologies.apps.education.fr","tube-numerique-educatif.apps.education.fr","tube-arts-lettres-sciences-humaines.apps.education.fr","beetoons.tv","comics.peertube.biz","makertube.net"],selector:".vjs-v7"},{host:oe.dailymotion,url:"https://dai.ly/",match:/^geo([\d]+)?.dailymotion.com$/,selector:".player"},{host:oe.trovo,url:"https://trovo.live/s/",match:/^trovo.live$/,selector:".player-video"},{host:oe.yandexdisk,url:"https://yadi.sk/",match:/^disk.yandex.(ru|kz|com(\.(am|ge|tr))?|by|az|co\.il|ee|lt|lv|md|net|tj|tm|uz)$/,selector:".video-player__player > div:nth-child(1)",eventSelector:".video-player__player",needBypassCSP:!0,needExtraData:!0},{host:oe.okru,url:"https://ok.ru/video/",match:/^ok.ru$/,selector:"vk-video-player",shadowRoot:!0},{host:oe.googledrive,url:"https://drive.google.com/file/d/",match:/^youtube.googleapis.com$/,selector:".html5-video-container"},{host:oe.bannedvideo,url:"https://madmaxworld.tv/watch?id=",match:/^(www.)?banned.video|madmaxworld.tv$/,selector:".vjs-v7",needExtraData:!0},{host:oe.weverse,url:"https://weverse.io/",match:/^weverse.io$/,selector:".webplayer-internal-source-wrapper",needExtraData:!0},{host:oe.newgrounds,url:"https://www.newgrounds.com/",match:/^(www.)?newgrounds.com$/,selector:".ng-video-player"},{host:oe.egghead,url:"https://egghead.io/",match:/^egghead.io$/,selector:".cueplayer-react-video-holder"},{host:oe.youku,url:"https://v.youku.com/",match:/^v.youku.com$/,selector:"#ykPlayer"},{host:oe.archive,url:"https://archive.org/details/",match:/^archive.org$/,selector:".jw-media"},{host:oe.kodik,url:"stub",match:/^kodik.(info|biz|cc)$/,selector:".fp-player",needExtraData:!0},{host:oe.patreon,url:"stub",match:/^(www.)?patreon.com$/,selector:'div[data-tag="post-card"] div[elevation="subtle"] > div > div > div > div',needExtraData:!0},{additionalData:"old",host:oe.reddit,url:"stub",match:/^old.reddit.com$/,selector:".reddit-video-player-root",needExtraData:!0,needBypassCSP:!0},{host:oe.reddit,url:"stub",match:/^(www.|new.)?reddit.com$/,selector:"div[slot=post-media-container]",shadowRoot:!0,needExtraData:!0,needBypassCSP:!0},{host:oe.kick,url:"https://kick.com/",match:/^kick.com$/,selector:"#injected-embedded-channel-player-video > div",needExtraData:!0},{host:oe.appledeveloper,url:"https://developer.apple.com/",match:/^developer.apple.com$/,selector:".developer-video-player",needExtraData:!0,needBypassCSP:!0},{host:oe.epicgames,url:"https://dev.epicgames.com/community/learning/",match:/^dev.epicgames.com$/,selector:".vjs-v7",needExtraData:!0},{host:oe.nineanimetv,url:"https://9animetv.to/watch/",match:/^rapid-cloud.co$/,selector:".jw-media",needExtraData:!0},{host:oe.odysee,url:"stub",match:/^odysee.com$/,selector:".vjs-v7",needExtraData:!0},{host:oe.coursehunterLike,url:"stub",match:["coursehunter.net","coursetrain.net"],selector:"#oframeplayer > pjsdiv:has(video)",needExtraData:!0},{host:oe.sap,url:"https://learning.sap.com/courses/",match:/^learning.sap.com$/,selector:".playkit-container",eventSelector:".playkit-player",needExtraData:!0,needBypassCSP:!0},{host:Be.udemy,url:"https://www.udemy.com/",match:/udemy.com$/,selector:'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)',needExtraData:!0},{host:Be.coursera,url:"https://www.coursera.org/",match:/coursera.org$/,selector:".vjs-v8",needExtraData:!0},{host:oe.watchpornto,url:"https://watchporn.to/",match:/^watchporn.to$/,selector:".fp-player"},{host:oe.linkedin,url:"https://www.linkedin.com/learning/",match:/^(www.)?linkedin.com$/,selector:".vjs-v7",needExtraData:!0,needBypassCSP:!0},{host:oe.incestflix,url:"https://www.incestflix.net/watch/",match:/^(www.)?incestflix.(net|to|com)$/,selector:"#incflix-stream",needExtraData:!0},{host:oe.porntn,url:"https://porntn.com/videos/",match:/^porntn.com$/,selector:".fp-player",needExtraData:!0},{host:oe.dzen,url:"https://dzen.ru/video/watch/",match:/^dzen.ru$/,selector:".zen-ui-video-video-player"},{host:oe.cloudflarestream,url:"stub",match:/^(watch|embed|iframe|customer-[^.]+).cloudflarestream.com$/,selector:null},{host:oe.loom,url:"https://www.loom.com/share/",match:/^(www.)?loom.com$/,selector:".VideoLayersContainer",needExtraData:!0},{host:Be.artstation,url:"https://www.artstation.com/learning/",match:/^(www.)?artstation.com$/,selector:".vjs-v7",needExtraData:!0},{host:oe.rtnews,url:"https://www.rt.com/",match:/^(www.)?rt.com$/,selector:".jw-media",needExtraData:!0},{host:oe.custom,url:"stub",match:t=>/([^.]+).(mp4|webm)/.test(t.pathname),rawResult:!0}];class Re extends Error{constructor(t){super(t),this.name="VideoHelper",this.message=t}}class $e{API_ORIGIN=window.location.origin;fetch;extraInfo;referer;origin;service;video;language;constructor({fetchFn:t=Kt,extraInfo:e=!0,referer:o=document.referrer??window.location.origin+"/",origin:i=window.location.origin,service:a,video:n,language:r="en"}={}){this.fetch=t,this.extraInfo=e,this.referer=o,this.origin=/^(http(s)?):\/\//.test(String(i))?i:window.location.origin,this.service=a,this.video=n,this.language=r}async getVideoData(t){}async getVideoId(t){}returnBaseData(t){if(this.service)return{url:this.service.url+t,videoId:t,host:this.service.host,duration:void 0}}}class De extends $e{SUBTITLE_SOURCE="videojs";SUBTITLE_FORMAT="vtt";static getPlayer(){return document.querySelector(".video-js")?.player}getVideoDataByPlayer(t){try{const e=De.getPlayer();if(!e)throw new Error(`Video player doesn't have player option, videoId ${t}`);const o=e.duration(),i=Array.isArray(e.currentSources)?e.currentSources:e.getCache()?.sources,{tracks_:a}=e.textTracks(),n=i.find((t=>"video/mp4"===t.type||"video/webm"===t.type));if(!n)throw new Error(`Failed to find video url for videoID ${t}`);const r=a.filter((t=>t.src)).map((t=>({language:Zt(t.language),source:this.SUBTITLE_SOURCE,format:this.SUBTITLE_FORMAT,url:t.src})));return{url:n.src,duration:o,subtitles:r}}catch(t){return void St.error("Failed to get videojs video data",t.message)}}}class Fe extends $e{static getPlayer(){if("undefined"==typeof Videoview)return;const t=Videoview;return t?.getPlayerObject?.call(void 0)}async getVideoData(t){const e=Fe.getPlayer();if(!e)return this.returnBaseData(t);try{const{description:o,duration:i,md_title:a}=e.vars,n=(new DOMParser).parseFromString(o,"text/html"),r=Array.from(n.body.childNodes).filter((t=>"BR"!==t.nodeName)).map((t=>t.textContent)).join("\n");let s;return Object.hasOwn(e.vars,"subs")&&(s=e.vars.subs.map((t=>({language:Zt(t.lang),source:"vk",format:"vtt",url:t.url,isAutoGenerated:!!t.is_auto})))),{url:this.service.url+t,title:a,description:r,duration:i,subtitles:s}}catch(e){return St.error(`Failed to get VK video data, because: ${e.message}`),this.returnBaseData(t)}}async getVideoId(t){const e=/^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(t.pathname);if(e)return e[0].slice(1);const o=/\/playlist\/[^/]+\/(video-?\d{8,9}_\d{9})/.exec(t.pathname);if(o)return o[1];const i=t.searchParams.get("z");if(i)return i.split("/")[0];const a=t.searchParams.get("oid"),n=t.searchParams.get("id");return a&&n?`video-${Math.abs(parseInt(a))}_${n}`:void 0}}class Ue extends $e{async getVideoId(t){return/([^/]+)\/video\/([^/]+)/.exec(t.pathname)?.[0]}}const qe=["auto","ru","en","zh","ko","lt","lv","ar","fr","it","es","de","ja"],ze=["ru","en","kk"],He=["srt","vtt","json"];class We extends $e{static isMobile(){return/^m\.youtube\.com$/.test(window.location.hostname)}static getPlayer(){return window.location.pathname.startsWith("/shorts/")&&!We.isMobile()?document.querySelector("#shorts-player"):document.querySelector("#movie_player")}static getPlayerResponse(){return We.getPlayer()?.getPlayerResponse()}static getPlayerData(){return We.getPlayer()?.getVideoData()}static getVolume(){const t=We.getPlayer();return t?t.getVolume()/100:1}static setVolume(t){const e=We.getPlayer();return!!e&&(e.setVolume(Math.round(100*t)),!0)}static isMuted(){const t=We.getPlayer();return!!t&&t.isMuted()}static videoSeek(t,e){St.log("videoSeek",e);const o=(We.getPlayer()?.getProgressState()?.seekableEnd??t.currentTime)-e;t.currentTime=o}static getSubtitles(t){const e=We.getPlayerResponse(),o=e?.captions?.playerCaptionsTracklistRenderer;if(!o)return[];const i=o.captionTracks??[],a=(o.translationLanguages??[]).find((e=>e.languageCode===t)),n=i.find((t=>"asr"===t?.kind)),r=n?.languageCode??"en",s=i.reduce(((e,o)=>{if(!("languageCode"in o))return e;const i=o.languageCode?Zt(o.languageCode):void 0,n=o.baseUrl;if(!i||!n)return e;const s=`${n.startsWith("http")?n:`${window.location.origin}/${n}`}&fmt=json3`;return e.push({source:"youtube",format:"json",language:i,isAutoGenerated:"asr"===o?.kind,url:s}),a&&o.isTranslatable&&o.languageCode===r&&t!==i&&e.push({source:"youtube",format:"json",language:t,isAutoGenerated:"asr"===o?.kind,translatedFromLanguage:i,url:`${s}&tlang=${t}`}),e}),[]);return St.log("youtube subtitles:",s),s}static getLanguage(){if(!We.isMobile()){const t=We.getPlayer(),e=t?.getAudioTrack?.call(void 0)?.getLanguageInfo();if(e&&"und"!==e.id)return Zt(e.id.split(".")[0])}const t=We.getPlayerResponse(),e=t?.captions?.playerCaptionsTracklistRenderer.captionTracks.find((t=>"asr"===t.kind&&t.languageCode));return e?Zt(e.languageCode):void 0}async getVideoData(t){const{title:e}=We.getPlayerData()??{},{shortDescription:o,isLive:i,title:a}=We.getPlayerResponse()?.videoDetails??{},n=We.getSubtitles(this.language);let r=We.getLanguage();r&&!qe.includes(r)&&(r=void 0);const s=We.getPlayer()?.getDuration()??void 0;return{url:this.service.url+t,isStream:i,title:a,localizedTitle:e,detectedLanguage:r,description:o,subtitles:n,duration:s}}async getVideoId(t){if("youtu.be"===t.hostname&&(t.search=`?v=${t.pathname.replace("/","")}`,t.pathname="/watch"),t.searchParams.has("enablejsapi")){const e=We.getPlayer()?.getVideoUrl();t=e?new URL(e):t}return/(?:watch|embed|shorts|live)\/([^/]+)/.exec(t.pathname)?.[1]??t.searchParams.get("v")}}class je extends De{API_ORIGIN="https://www.coursera.org/api";SUBTITLE_SOURCE="coursera";async getCourseData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${t}`),o=await e.json();return o?.elements?.[0]}catch(e){return void St.error(`Failed to get course data by courseId: ${t}`,e.message)}}static getPlayer(){return super.getPlayer()}async getVideoData(t){const e=this.getVideoDataByPlayer(t);if(!e)return;const{options_:o}=je.getPlayer()??{};!e.subtitles?.length&&o&&(e.subtitles=o.tracks.map((t=>({url:t.src,language:Zt(t.srclang),source:this.SUBTITLE_SOURCE,format:this.SUBTITLE_FORMAT}))));const i=o?.courseId;if(!i)return e;let a="en";const n=await this.getCourseData(i);if(n){const{primaryLanguageCodes:[t]}=n;a=t?Zt(t):"en"}qe.includes(a)||(a="en");const r=e.subtitles.find((t=>t.language===a))??e.subtitles?.[0],s=r?.url;s||St.warn("Failed to find any subtitle file");const{url:l,duration:d}=e,u=s?[{target:"subtitles_file_url",targetUrl:s},{target:"video_file_url",targetUrl:l}]:null;return{...s?{url:this.service?.url+t,translationHelp:u}:{url:l,translationHelp:u},detectedLanguage:a,duration:d}}async getVideoId(t){const e=/learn\/([^/]+)\/lecture\/([^/]+)/.exec(t.pathname)??/lecture\/([^/]+)\/([^/]+)/.exec(t.pathname);return e?.[0]}}class Ge extends $e{static getPlayer(){if("undefined"!=typeof player)return player}async getVideoData(t){const e=Ge.getPlayer();if(!e)return;const{config:{url:o,duration:i,lang:a,isLive:n}}=e;if(!o)return;const r=o.find((t=>t.src.includes("www.douyin.com/aweme/v1/play/")));return r?{url:Xt(r.src),duration:i,isStream:n,...qe.includes(a)?{detectedLanguage:a}:{}}:void 0}async getVideoId(t){const e=/video\/([\d]+)/.exec(t.pathname)?.[0];return e||Ge.getPlayer()?.config.vid}}var Ye;!function(t){t.Channel="Channel",t.Video="Video"}(Ye||(Ye={}));const Je={[oe.mailru]:class extends $e{API_ORIGIN="https://my.mail.ru";async getVideoMeta(t){try{const e=await this.fetch(`${this.API_ORIGIN}/+/video/meta/${t}?xemail=&ajax_call=1&func_name=&mna=&mnb=&ext=1&_=${(new Date).getTime()}`);return await e.json()}catch(t){return void St.error("Failed to get mail.ru video data",t.message)}}async getVideoId(t){const e=t.pathname;if(/\/(v|mail|bk|inbox)\//.exec(e))return e.slice(1);const o=/video\/embed\/([^/]+)/.exec(e)?.[1];if(!o)return;const i=await this.getVideoMeta(o);return i?i.meta.url.replace("//my.mail.ru/",""):void 0}},[oe.weverse]:class extends $e{API_ORIGIN="https://global.apis.naver.com/weverse/wevweb";API_APP_ID="be4d79eb8fc7bd008ee82c8ec4ff6fd4";API_HMAC_KEY="1b9cb6378d959b45714bec49971ade22e6e24e42";HEADERS={Accept:"application/json, text/plain, */*",Origin:"https://weverse.io",Referer:"https://weverse.io/"};getURLData(){return{appId:this.API_APP_ID,language:"en",os:"WEB",platform:"WEB",wpf:"pc"}}async createHash(t){const e=Date.now(),o=t.substring(0,Math.min(255,t.length))+e,i=await async function(t,e){try{const o=Wt.encode(e),i=await jt("SHA-1",t,o);return btoa(String.fromCharCode(...new Uint8Array(i)))}catch(t){return St.error(t),!1}}(this.API_HMAC_KEY,o);if(!i)throw new Re("Failed to get weverse HMAC signature");return{wmsgpad:e.toString(),wmd:i}}async getHashURLParams(t){const e=await this.createHash(t);return new URLSearchParams(e).toString()}async getPostPreview(t){const e=`/post/v1.0/post-${t}/preview?`+new URLSearchParams({fieldSet:"postForPreview",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{headers:this.HEADERS});return await o.json()}catch(e){return St.error(`Failed to get weverse post preview by postId: ${t}`,e.message),!1}}async getVideoInKey(t){const e=`/video/v1.1/vod/${t}/inKey?`+new URLSearchParams({gcc:"RU",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{method:"POST",headers:this.HEADERS});return await o.json()}catch(e){return St.error(`Failed to get weverse InKey by videoId: ${t}`,e.message),!1}}async getVideoInfo(t,e,o){const i=Date.now();try{const a=new URLSearchParams({key:e,sid:o,nonce:i.toString(),devt:"html5_pc",prv:"N",aup:"N",stpb:"N",cpl:"en",env:"prod",lc:"en",adi:JSON.stringify([{adSystem:null}]),adu:"/"}).toString(),n=await this.fetch(`https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/${t}?`+a,{headers:this.HEADERS});return await n.json()}catch(i){return St.error(`Failed to get weverse video info (infraVideoId: ${t}, inkey: ${e}, serviceId: ${o}`,i.message),!1}}extractVideoInfo(t){return t.find((t=>!1===t.useP2P&&t.source.includes(".mp4")))}async getVideoData(t){const e=await this.getPostPreview(t);if(!e)return;const{videoId:o,serviceId:i,infraVideoId:a}=e.extension.video;if(!(o&&i&&a))return;const n=await this.getVideoInKey(o);if(!n)return;const r=await this.getVideoInfo(a,n.inKey,i);if(!r)return;const s=this.extractVideoInfo(r.videos.list);return s?{url:s.source,duration:s.duration}:void 0}async getVideoId(t){return/([^/]+)\/(live|media)\/([^/]+)/.exec(t.pathname)?.[3]}},[oe.kodik]:class extends $e{API_ORIGIN=window.location.origin;async getSecureData(t){try{const e=await this.fetch(`${this.API_ORIGIN}${t}`,{headers:{"User-Agent":wt.userAgent,Origin:this.API_ORIGIN,Referer:this.API_ORIGIN}}),o=await e.text(),[i,a,n]=t.split("/").filter((t=>t)),r=(new DOMParser).parseFromString(o,"text/html"),s=Array.from(r.getElementsByTagName("script")).filter((t=>t.innerHTML.includes(`videoId = "${a}"`)));if(!s.length)throw new Re("Failed to find secure script");const l=/'{[^']+}'/.exec(s[0].textContent.trim())?.[0];if(!l)throw new Re("Secure json wasn't found in secure script");const d=JSON.parse(l.replaceAll("'",""));return{videoType:i,videoId:a,hash:n,...d}}catch(e){return St.error(`Failed to get kodik secure data by videoPath: ${t}.`,e.message),!1}}async getFtor(t){const{videoType:e,videoId:o,hash:i,d:a,d_sign:n,pd:r,pd_sign:s,ref:l,ref_sign:d}=t;try{const t=await this.fetch(this.API_ORIGIN+"/ftor",{method:"POST",headers:{"User-Agent":wt.userAgent,Origin:this.API_ORIGIN,Referer:`${this.API_ORIGIN}/${e}/${o}/${i}/360p`},body:new URLSearchParams({d:a,d_sign:n,pd:r,pd_sign:s,ref:decodeURIComponent(l),ref_sign:d,bad_user:"false",cdn_is_working:"true",info:"{}",type:e,hash:i,id:o})});return await t.json()}catch(t){return St.error(`Failed to get kodik video data (type: ${e}, id: ${o}, hash: ${i})`,t.message),!1}}decryptUrl(t){const e=atob(t.replace(/[a-zA-Z]/g,(function(t){const e=t.charCodeAt(0)+13,o=t<="Z"?90:122;return String.fromCharCode(o>=e?e:e-26)})));return"https:"+e}async getVideoData(t){const e=await this.getSecureData(t);if(!e)return;const o=await this.getFtor(e);if(!o)return;const i=Object.entries(o.links[o.default.toString()]),a=i.find((([,t])=>"application/x-mpegURL"===t.type))?.[1];return a?{url:this.decryptUrl(a.src)}:void 0}async getVideoId(t){return/\/(seria|video)\/([^/]+)\/([^/]+)\/([\d]+)p/.exec(t.pathname)?.[0]}},[oe.patreon]:class extends $e{API_ORIGIN="https://www.patreon.com/api";async getPosts(t){try{const e=await this.fetch(`${this.API_ORIGIN}/posts/${t}?json-api-use-default-includes=false`);return await e.json()}catch(e){return St.error(`Failed to get patreon posts by postId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPosts(t);if(!e)return;const o=e.data.attributes.post_file.url;return o?{url:o}:void 0}async getVideoId(t){const e=/posts\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e.replace(/[^\d.]/g,"")}},[oe.reddit]:class extends $e{API_ORIGIN="https://www.reddit.com";async getContentUrl(t){if("old"!==this.service?.additionalData)return document.querySelector("shreddit-player-2")?.src;const e=document.querySelector("[data-hls-url]");return e?.dataset.hlsUrl?.replaceAll("&","&")}async getVideoData(t){try{const e=await this.getContentUrl(t);if(!e)throw new Re("Failed to find content url");return{url:decodeURIComponent(e)}}catch(e){return void St.error(`Failed to get reddit video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/\/r\/(([^/]+)\/([^/]+)\/([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[oe.bannedvideo]:class extends $e{API_ORIGIN="https://api.banned.video";async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/graphql`,{method:"POST",body:JSON.stringify({operationName:"GetVideo",query:"query GetVideo($id: String!) {\n getVideo(id: $id) {\n title\n description: summary\n duration: videoDuration\n videoUrl: directUrl\n isStream: live\n }\n }",variables:{id:t}}),headers:{"User-Agent":"bannedVideoFrontEnd","apollographql-client-name":"banned-web","apollographql-client-version":"1.3","content-type":"application/json"}});return await e.json()}catch(e){return console.error(`Failed to get bannedvideo video info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getVideoInfo(t);if(!e)return;const{videoUrl:o,duration:i,isStream:a,description:n,title:r}=e.data.getVideo;return{url:o,duration:i,isStream:a,title:r,description:n}}async getVideoId(t){return t.searchParams.get("id")??void 0}},[oe.kick]:class extends $e{API_ORIGIN="https://kick.com/api";async getClipInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v2/clips/${t}`),o=await e.json(),{clip_url:i,duration:a,title:n}=o.clip;return{url:i,duration:a,title:n}}catch(e){return void St.error(`Failed to get kick clip info by clipId: ${t}.`,e.message)}}async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v1/video/${t}`),o=await e.json(),{source:i,livestream:a}=o,{session_title:n,duration:r}=a;return{url:i,duration:Math.round(r/1e3),title:n}}catch(e){return void St.error(`Failed to get kick video info by videoId: ${t}.`,e.message)}}async getVideoData(t){return t.startsWith("videos")?await this.getVideoInfo(t.replace("videos/","")):await this.getClipInfo(t.replace("clips/",""))}async getVideoId(t){return/([^/]+)\/((videos|clips)\/([^/]+))/.exec(t.pathname)?.[2]}},[oe.appledeveloper]:class extends $e{API_ORIGIN="https://developer.apple.com";async getVideoData(t){try{const t=document.querySelector("meta[property='og:video']")?.content;if(!t)throw new Re("Failed to find content url");return{url:t}}catch(e){return void St.error(`Failed to get apple developer video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/videos\/play\/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0]}},[oe.epicgames]:class extends $e{API_ORIGIN="https://dev.epicgames.com/community/api/learning";async getPostInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/post.json?hash_id=${t}`);return await e.json()}catch(e){return St.error(`Failed to get epicgames post info by videoId: ${t}.`,e.message),!1}}getVideoBlock(){const t=/videoUrl\s?=\s"([^"]+)"?/,e=Array.from(document.body.querySelectorAll("script")).find((e=>t.exec(e.innerHTML)));if(!e)return;const o=e.innerHTML.trim(),i=t.exec(o)?.[1]?.replace("qsep://","https://");if(!i)return;let a=/sources\s?=\s(\[([^\]]+)\])?/.exec(o)?.[1];if(!a)return{playlistUrl:i,subtitles:[]};try{a=(a.replace(/src:(\s)+?(videoUrl)/g,'src:"removed"').substring(0,a.lastIndexOf("},"))+"]").split("\n").map((t=>t.replace(/([^\s]+):\s?(?!.*\1)/,'"$1":'))).join("\n");const t=JSON.parse(a);return{playlistUrl:i,subtitles:t.filter((t=>"captions"===t.type))}}catch{return{playlistUrl:i,subtitles:[]}}}async getVideoData(t){const e=t.split(":")?.[1],o=await this.getPostInfo(e);if(!o)return;const i=this.getVideoBlock();if(!i)return;const{playlistUrl:a,subtitles:n}=i,{title:r,description:s}=o;return{url:a,title:r,description:s,subtitles:n.map((t=>({language:Zt(t.srclang),source:"epicgames",format:"vtt",url:t.src})))}}async getVideoId(t){return new Promise((t=>{const e="https://dev.epicgames.com",o=btoa(window.location.href);window.addEventListener("message",(o=>{if(o.origin!==e)return;if("string"!=typeof o.data||!o.data.startsWith("getVideoId:"))return;const i=o.data.replace("getVideoId:","");return t(i)})),window.top.postMessage(`getVideoId:${o}`,e)}))}},[oe.nineanimetv]:class extends $e{API_ORIGIN="https://9animetv.to/ajax/episode";RAPID_CLOUD_ORIGIN="https://rapid-cloud.co/ajax/embed-6-v2";async getSourceId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/servers?episodeId=${t}`),o=await e.json();return!!o.html&&/data-id="(\d+)"/.exec(o.html)?.[1]}catch(e){return St.error(`Failed to get 9animetv servers info by episodeId: ${t}.`,e.message),!1}}async getPlayerLink(t){try{const e=await this.fetch(`${this.API_ORIGIN}/sources?id=${t}`),o=await e.json();return!!o.link.includes("rapid-cloud.co")&&o.link}catch(e){return St.error(`Failed to get player link by sourceId: ${t}.`,e.message),!1}}async getRapidCloudData(t){try{const e=await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${t}`),o=await e.json();return o.encrypted?(St.warn("Encrypted RapidCloud data found. Let us know about it",o),!1):o}catch(e){return St.error(`Failed to get rapid cloud data by rapidId: ${t}.`,e.message),!1}}async getVideoData(t){const e=t.split("?ep=")[1],o=await this.getSourceId(e);if(!o)return;const i=await this.getPlayerLink(o);if(!i)return;const a=/\/([^/?]+)\?/.exec(i)?.[1];if(!a)return;const n=await this.getRapidCloudData(a);if(!n)return;const r=n.sources.find((t=>"hls"===t.type))?.file;if(!r)return;const s=n.tracks.reduce(((t,e)=>{const o=/([\w+]+)(-\d)?\.vtt/.exec(e.file)?.[1];if(!o)return t;const i=Zt(3===o.length?o:e.label);return t.find((t=>t.language===i))||t.push({language:i,source:"nineanimetv",format:"vtt",url:e.file}),t}),[]);return{url:r,subtitles:s}}async getVideoId(t){return new Promise((t=>{const e="https://9animetv.to";window.addEventListener("message",(o=>{if(o.origin===e&&"string"==typeof o.data&&o.data.startsWith("getVideoId:")){const e=o.data.replace("getVideoId:","");return t(e)}})),window.top.postMessage("getVideoId",e)}))}},[oe.odysee]:class extends $e{API_ORIGIN="https://odysee.com";async getVideoData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text(),i=/"contentUrl":(\s)?"([^"]+)"/.exec(o)?.[2];if(!i)throw new Error("Odysee url doesn't parsed");return{url:i}}catch(e){return void St.error(`Failed to get odysee video data by video ID: ${t}`,e.message)}}async getVideoId(t){return t.pathname.slice(1)}},[oe.coursehunterLike]:class extends $e{API_ORIGIN=this.origin??"https://coursehunter.net";async getCourseId(){const t=window.course_id;return void 0!==t?String(t):document.querySelector('input[name="course_id"]')?.value}async getLessonsData(t){const e=window.lessons;if(e?.length)return e;try{const e=await this.fetch(`${this.API_ORIGIN}/api/v1/course/${t}/lessons`);return await e.json()}catch(e){return void St.error(`Failed to get CoursehunterLike lessons data by courseId: ${t}, because ${e.message}`)}}getLessondId(t){let e=t.split("?lesson=")?.[1];if(e)return+e;const o=document.querySelector(".lessons-item_active");return e=o?.dataset?.index,e?+e:1}async getVideoData(t){const e=await this.getCourseId();if(!e)return;const o=await this.getLessonsData(e);if(!o)return;const i=this.getLessondId(t),a=o?.[i-1],{file:n,duration:r,title:s}=a;return n?{url:n,duration:r,title:s}:void 0}async getVideoId(t){const e=/course\/([^/]+)/.exec(t.pathname)?.[0];return e?e+t.search:void 0}},[oe.twitch]:class extends $e{API_ORIGIN="https://clips.twitch.tv";async getClipLink(t,e){const o=document.querySelector("script[type='application/ld+json']"),i=t.slice(1);if(o){const t=JSON.parse(o.innerText),e=t["@graph"].find((t=>"VideoObject"===t["@type"]))?.creator.url;if(!e)throw new Re("Failed to find channel link");return`${e.replace("https://www.twitch.tv/","")}/clip/${i}`}const a="embed"===i,n=document.querySelector(a?".tw-link[data-test-selector='stream-info-card-component__stream-avatar-link']":".clips-player a:not([class])");if(!n)return;return`${n.href.replace("https://www.twitch.tv/","")}/clip/${a?e:i}`}async getVideoId(t){const e=t.pathname;if(/^m\.twitch\.tv$/.test(e))return/videos\/([^/]+)/.exec(t.href)?.[0]??e.slice(1);if(/^player\.twitch\.tv$/.test(t.hostname))return`videos/${t.searchParams.get("video")}`;const o=/([^/]+)\/(?:clip)\/([^/]+)/.exec(e);if(o)return o[0];return/^clips\.twitch\.tv$/.test(t.hostname)?await this.getClipLink(e,t.searchParams.get("clip")):/(?:videos)\/([^/]+)/.exec(e)?.[0]}},[oe.sap]:class extends $e{API_ORIGIN="https://learning.sap.com/";async requestKaltura(t,e,o){try{const i=await this.fetch(`https://${t}/api_v3/service/multirequest`,{method:"POST",body:JSON.stringify({1:{service:"session",action:"startWidgetSession",widgetId:`_${e}`},2:{service:"baseEntry",action:"list",ks:"{1:result:ks}",filter:{redirectFromEntryId:o},responseProfile:{type:1,fields:"id,referenceId,name,description,dataUrl,duration,flavorParamsIds,type,dvrStatus,externalSourceType,createdAt,updatedAt,endDate,plays,views,downloadUrl,creatorId"}},3:{service:"baseEntry",action:"getPlaybackContext",entryId:"{2:result:objects:0:id}",ks:"{1:result:ks}",contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},apiVersion:"3.3.0",format:1,ks:"",clientTag:"html5:v3.17.22",partnerId:e}),headers:{"Content-Type":"application/json"}});return await i.json()}catch(t){return void St.error("Failed to request kaltura data",t.message)}}async getKalturaData(t){try{const e=document.querySelector('script[data-nscript="beforeInteractive"]');if(!e)throw new Re("Failed to find script element");const o=/https:\/\/([^"]+)\/p\/([^"]+)\/embedPlaykitJs\/uiconf_id\/([^"]+)/.exec(e?.src);if(!o)throw new Re(`Failed to get sap data for videoId: ${t}`);const[,i,a]=o;let n=document.querySelector("#shadow")?.firstChild?.getAttribute("id");if(!n){const t=document.querySelector("#__NEXT_DATA__");if(!t)throw new Re("Failed to find next data element");n=/"sourceId":\s?"([^"]+)"/.exec(t.innerText)?.[1]}if(!i||Number.isNaN(+a)||!n)throw new Re(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${t}. Params: kalturaDomain = ${i}, partnerId = ${a}, entryId = ${n}`);return await this.requestKaltura(i,a,n)}catch(t){return void St.error("Failed to get kaltura data",t.message)}}async getVideoData(t){const e=await this.getKalturaData(t);if(!e)return;const[,o,i]=e,{duration:a}=o.objects[0],n=i.sources.find((t=>"url"===t.format&&"http,https"===t.protocols&&t.url.includes(".mp4")))?.url;if(!n)return;return{url:n,subtitles:i.playbackCaptions.map((t=>({language:Zt(t.languageCode),source:"sap",format:"vtt",url:t.webVttUrl,isAutoGenerated:t.label.includes("auto-generated")}))),duration:a}}async getVideoId(t){return/((courses|learning-journeys)\/([^/]+)(\/[^/]+)?)/.exec(t.pathname)?.[1]}},[oe.linkedin]:class extends De{SUBTITLE_SOURCE="linkedin";async getVideoData(t){const e=this.getVideoDataByPlayer(t);if(!e)return;const{url:o,duration:i,subtitles:a}=e;return{url:Xt(new URL(o)),duration:i,subtitles:a}}async getVideoId(t){return/\/learning\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[oe.vimeo]:class extends $e{API_KEY="";DEFAULT_SITE_ORIGIN="https://vimeo.com";SITE_ORIGIN=this.isPrivatePlayer()?this.service?.url?.slice(0,-1)??this.DEFAULT_SITE_ORIGIN:this.DEFAULT_SITE_ORIGIN;isErrorData(t){return Object.hasOwn(t,"error")}isPrivatePlayer(){return this.referer&&!this.referer.includes("vimeo.com")}async getViewerData(){try{const t=await this.fetch("https://vimeo.com/_next/viewer"),e=await t.json(),{apiUrl:o,jwt:i}=e;return this.API_ORIGIN=`https://${o}`,this.API_KEY=`jwt ${i}`,e}catch(t){return St.error("Failed to get default viewer data.",t.message),!1}}async getVideoInfo(t){try{const e=new URLSearchParams({fields:"name,link,description,duration"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return St.error(`Failed to get video info by video ID: ${t}`,e.message),!1}}async getPrivateVideoSource(t){try{const{default_cdn:e,cdns:o}=t.dash,i=o[e].url,a=await this.fetch(i);if(200!==a.status)throw new Re(await a.text());const n=await a.json(),r=new URL(i),s=Array.from(n.base_url.matchAll(/\.\.\//g)).length+1,l=r.pathname.split("/");let d=n.base_url.replaceAll("../","");d=d&&!d.startsWith("/")?`/${d}`:d,r.pathname=l.slice(0,l.length-s).join("/")+d,r.pathname.endsWith("/")||(r.pathname+="/");const u=n.audio.find((t=>"audio/mp4"===t.mime_type&&"dash"===t.format));if(!u)throw new Re("Failed to find video data");const c=u.segments?.[0]?.url;if(!c)throw new Re("Failed to find first segment url");const[h,p]=c.split("?",2),g=new URLSearchParams(p);return g.delete("range"),r.pathname+=`${u.base_url}${h}`,r.href=r.href.split("?")[0]+"?"+g.toString(),r.href}catch(t){return St.error("Failed to get private video source",t.message),!1}}async getPrivateVideoInfo(t){try{if("undefined"==typeof playerConfig)return;const e=playerConfig,o=await this.getPrivateVideoSource(e.request.files);if(!o)throw new Re("Failed to get private video source");const{video:{title:i,duration:a},request:{text_tracks:n}}=e;return{url:`${this.SITE_ORIGIN}/${t}`,video_url:o,title:i,duration:a,subs:n}}catch(e){return St.error(`Failed to get private video info by video ID: ${t}`,e.message),!1}}async getSubsInfo(t){try{const e=new URLSearchParams({per_page:"100",fields:"language,type,link"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}/texttracks?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return St.error(`Failed to get subtitles info by video ID: ${t}`,e.message),!1}}async getVideoData(t){const e=this.isPrivatePlayer();if(!this.extraInfo)return this.returnBaseData(t);if(e){const e=await this.getPrivateVideoInfo(t);if(!e)return;const{url:o,subs:i,video_url:a,title:n,duration:r}=e,s=i.map((t=>({language:Zt(t.lang),source:"vimeo",format:"vtt",url:this.SITE_ORIGIN+t.url,isAutoGenerated:t.lang.includes("autogenerated")}))),l=s.length?[{target:"video_file_url",targetUrl:a},{target:"subtitles_file_url",targetUrl:s[0].url}]:null;return{...l?{url:o,translationHelp:l}:{url:a},subtitles:s,title:n,duration:r}}t.startsWith("video/")&&(t=t.replace("video/","")),t.includes("/")&&(t=t.replace("/",":"));if(!await this.getViewerData())return this.returnBaseData(t);const o=await this.getVideoInfo(t);if(!o)return this.returnBaseData(t);const i=await this.getSubsInfo(t),a=i?i.data.map((t=>({language:Zt(t.language),source:"vimeo",format:"vtt",url:t.link,isAutoGenerated:t.language.includes("autogen")}))):[],{link:n,duration:r,name:s,description:l}=o;return{url:n,title:s,description:l,subtitles:a,duration:r}}async getVideoId(t){const e=/[^/]+\/[^/]+$/.exec(t.pathname)?.[0];return this.isPrivatePlayer()?e:e?.startsWith("video/")?e.replace("video/",""):e??/[^/]+$/.exec(t.pathname)?.[0]}},[oe.yandexdisk]:class extends $e{API_ORIGIN=window.location.origin;CLIENT_PREFIX="/client/disk";INLINE_PREFIX="/i/";DISK_PREFIX="/d/";isErrorData(t){return Object.hasOwn(t,"error")}async getClientVideoData(t){const e=new URL(window.location.href).searchParams.get("idDialog");if(!e)return;const o=document.querySelector("#preloaded-data");if(o)try{const t=JSON.parse(o.innerText),{idClient:i,sk:a}=t.config,n=await this.fetch(this.API_ORIGIN+"/models/?_m=resource",{method:"POST",body:new URLSearchParams({idClient:i,sk:a,"_model.0":"resource","id.0":e.replaceAll(" ","+")}).toString().replaceAll(/%2B/g,"+"),headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}),r=await n.json();if(!r.models)throw new Re("Failed to get resource info");const s=r.models[0].data;if(this.isErrorData(s))throw new Re(s.error?.message);const{meta:{short_url:l,video_info:d},name:u}=s;if(!d)throw new Re("There's no video open right now");if(!l)throw new Re("Access to the video is limited");const c=this.clearTitle(u);return{url:l,title:c,duration:Math.round(d.duration/1e3)}}catch(e){return void St.error(`Failed to get yandex disk video data by video ID: ${t}, because ${e.message}`)}}clearTitle(t){return t.replace(/(\.[^.]+)$/,"")}getBodyHash(t,e){const o=JSON.stringify({hash:t,sk:e});return encodeURIComponent(o)}async fetchList(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/fetch-list",{method:"POST",body:o}),a=await i.json();if(Object.hasOwn(a,"error"))throw new Re("Failed to fetch folder list");return a.resources}async getDownloadUrl(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/download-url",{method:"POST",body:o}),a=await i.json();if(a.error)throw new Re("Failed to get download url");return a.data.url}async getDiskVideoData(t){try{const e=document.getElementById("store-prefetch");if(!e)throw new Re("Failed to get prefetch data");const o=t.split("/").slice(3);if(!o.length)throw new Re("Failed to find video file path");const i=JSON.parse(e.innerText),{resources:a,rootResourceId:n,environment:{sk:r}}=i,s=a[n],l=o.length-1,d=o.filter(((t,e)=>e!==l)).join("/");let u=Object.values(a);d.includes("/")&&(u=await this.fetchList(`${s.hash}:/${d}`,r));const c=u.find((t=>t.name===o[l]));if(!c)throw new Re("Failed to find resource");if(c&&"dir"===c.type)throw new Re("Path is dir, but expected file");const{meta:{short_url:h,mediatype:p,videoDuration:g},path:m,name:v}=c;if("video"!==p)throw new Re("Resource isn't a video");const f=this.clearTitle(v),b=Math.round(g/1e3);if(h)return{url:h,duration:b,title:f};const y=await this.getDownloadUrl(m,r);return{url:Xt(new URL(y)),duration:b,title:f}}catch(e){return void St.error(`Failed to get yandex disk video data by disk video ID: ${t}`,e.message)}}async getVideoData(t){return t.startsWith(this.INLINE_PREFIX)?{url:this.service.url+t.slice(1)}:(t=decodeURIComponent(t)).startsWith(this.CLIENT_PREFIX)?await this.getClientVideoData(t):await this.getDiskVideoData(t)}async getVideoId(t){if(t.pathname.startsWith(this.CLIENT_PREFIX))return t.pathname+t.search;const e=/\/i\/([^/]+)/.exec(t.pathname)?.[0];return e||(/\/d\/([^/]+)\/([^/]+)/.exec(t.pathname)?t.pathname:void 0)}},[oe.vk]:Fe,[oe.trovo]:class extends $e{async getVideoId(t){const e=t.searchParams.get("vid"),o=/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0];if(e&&o)return`${o}?vid=${e}`}},[oe.incestflix]:class extends $e{async getVideoData(t){try{const t=document.querySelector("#incflix-stream source:first-of-type");if(!t)throw new Re("Failed to find source element");const e=t.getAttribute("src");if(!e)throw new Re("Failed to find source link");const o=new URL(e.startsWith("//")?`https:${e}`:e);return o.searchParams.append("media-proxy","video.mp4"),{url:Xt(o)}}catch(e){return void St.error(`Failed to get Incestflix data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.porntn]:class extends $e{async getVideoData(t){try{if("undefined"==typeof flashvars)return;const{rnd:t,video_url:e,video_title:o}=flashvars;if(!e||!t)throw new Re("Failed to find video source or rnd");const i=new URL(e);i.searchParams.append("rnd",t),St.log("PornTN get_file link",i.href);const a=await this.fetch(i.href,{method:"head"}),n=new URL(a.url);St.log("PornTN cdn link",n.href);return{url:Xt(n),title:o}}catch(e){return void St.error(`Failed to get PornTN data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/videos\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[oe.googledrive]:class extends $e{getPlayerData(){const t=document.querySelector("#movie_player");return t?.getVideoData?.call()??void 0}async getVideoId(t){return this.getPlayerData()?.video_id}},[oe.bilibili]:class extends $e{async getVideoId(t){const e=/bangumi\/play\/([^/]+)/.exec(t.pathname)?.[0];if(e)return e;const o=t.searchParams.get("bvid");if(o)return`video/${o}`;let i=/video\/([^/]+)/.exec(t.pathname)?.[0];return i&&null!==t.searchParams.get("p")&&(i+=`/?p=${t.searchParams.get("p")}`),i}},[oe.xvideos]:class extends $e{async getVideoId(t){return/[^/]+\/[^/]+$/.exec(t.pathname)?.[0]}},[oe.watchpornto]:class extends $e{async getVideoId(t){return/(video|embed)\/(\d+)(\/[^/]+\/)?/.exec(t.pathname)?.[0]}},[oe.archive]:class extends $e{async getVideoId(t){return/(details|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[oe.dailymotion]:class extends $e{async getVideoId(t){const e=Array.from(document.querySelectorAll("*")).filter((t=>t.innerHTML.trim().includes(".m3u8"))),o=e?.[1]?.lastChild?.src;return o?/\/video\/(\w+)\.m3u8/.exec(o)?.[1]:void 0}},[oe.youku]:class extends $e{async getVideoId(t){return/v_show\/id_[\w=]+/.exec(t.pathname)?.[0]}},[oe.egghead]:class extends $e{async getVideoId(t){return t.pathname.slice(1)}},[oe.newgrounds]:class extends $e{async getVideoId(t){return/([^/]+)\/(view)\/([^/]+)/.exec(t.pathname)?.[0]}},[oe.okru]:class extends $e{async getVideoId(t){return/\/video\/(\d+)/.exec(t.pathname)?.[1]}},[oe.peertube]:class extends $e{async getVideoId(t){return/\/w\/([^/]+)/.exec(t.pathname)?.[0]}},[oe.eporner]:class extends $e{async getVideoId(t){return/video-([^/]+)\/([^/]+)/.exec(t.pathname)?.[0]}},[oe.bitchute]:class extends $e{async getVideoId(t){return/(video|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[oe.rutube]:class extends $e{async getVideoId(t){return/(?:video|embed)\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.facebook]:class extends $e{async getVideoId(t){return t.pathname.slice(1)}},[oe.rumble]:class extends $e{async getVideoId(t){return t.pathname.slice(1)}},[oe.twitter]:class extends $e{async getVideoId(t){const e=/status\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e;const o=this.video?.closest('[data-testid="tweet"]'),i=o?.querySelector('a[role="link"][aria-label]')?.href;return i?/status\/([^/]+)/.exec(i)?.[1]:void 0}},[oe.pornhub]:class extends $e{async getVideoId(t){return t.searchParams.get("viewkey")??/embed\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.tiktok]:Ue,[oe.proxitok]:Ue,[oe.nine_gag]:class extends $e{async getVideoId(t){return/gag\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.youtube]:We,[oe.ricktube]:We,[oe.invidious]:We,[oe.poketube]:We,[oe.piped]:We,[oe.dzen]:class extends $e{async getVideoId(t){return/video\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.cloudflarestream]:class extends $e{async getVideoId(t){return t.pathname+t.search}},[oe.loom]:class extends $e{getClientVersion(){if("undefined"==typeof SENTRY_RELEASE)return;return SENTRY_RELEASE.id}async getVideoData(t){try{const e=this.getClientVersion();if(!e)throw new Re("Failed to get client version");const o=await this.fetch("https://www.loom.com/graphql",{headers:{"User-Agent":wt.userAgent,"content-type":"application/json","x-loom-request-source":`loom_web_${e}`,"apollographql-client-name":"web","apollographql-client-version":e,"Alt-Used":"www.loom.com"},body:`{"operationName":"FetchCaptions","variables":{"videoId":"${t}"},"query":"query FetchCaptions($videoId: ID!, $password: String) {\\n fetchVideoTranscript(videoId: $videoId, password: $password) {\\n ... on VideoTranscriptDetails {\\n id\\n captions_source_url\\n language\\n __typename\\n }\\n ... on GenericError {\\n message\\n __typename\\n }\\n __typename\\n }\\n}"}`,method:"POST"});if(200!==o.status)throw new Re("Failed to get data from graphql");const i=(await o.json()).data.fetchVideoTranscript;if("GenericError"===i.__typename)throw new Re(i.message);return{url:this.service.url+t,subtitles:[{format:"vtt",language:Zt(i.language),source:"loom",url:i.captions_source_url}]}}catch(e){return St.error(`Failed to get Loom video data, because: ${e.message}`),this.returnBaseData(t)}}async getVideoId(t){return/(embed|share)\/([^/]+)?/.exec(t.pathname)?.[2]}},[oe.rtnews]:class extends $e{async getVideoData(t){const e=document.querySelector(".jw-video, .media__video_noscript");if(!e)return;let o=e.getAttribute("src");return o?(o.endsWith(".MP4")&&(o=Xt(o)),{videoId:t,url:o}):void 0}async getVideoId(t){return t.pathname.slice(1)}},[Be.udemy]:class extends $e{API_ORIGIN="https://www.udemy.com/api-2.0";getModuleData(){const t=document.querySelector(".ud-app-loader[data-module-id='course-taking']"),e=t?.dataset?.moduleArgs;if(e)return JSON.parse(e)}getLectureId(){return/learn\/lecture\/([^/]+)/.exec(window.location.pathname)?.[1]}async getLectureData(t,e){try{const o=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}/lectures/${e}/?`+new URLSearchParams({"fields[lecture]":"title,description,asset","fields[asset]":"length,media_sources,captions"}).toString());return await o.json()}catch(o){return void St.error(`Failed to get lecture data by courseId: ${t} and lectureId: ${e}`,o.message)}}async getCourseLang(t){try{const e=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}?`+new URLSearchParams({"fields[course]":"locale"}).toString());return await e.json()}catch(e){return void St.error(`Failed to get course lang by courseId: ${t}`,e.message)}}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>Zt(t.locale_id)===e));return o||(o=t?.find((t=>"en"===Zt(t.locale_id)))??t?.[0]),o?.url}async getVideoData(t){const e=this.getModuleData();if(!e)return;const{courseId:o}=e,i=this.getLectureId();if(St.log(`[Udemy] courseId: ${o}, lectureId: ${i}`),!i)return;const a=await this.getLectureData(o,i);if(!a)return;const{title:n,description:r,asset:s}=a,{length:l,media_sources:d,captions:u}=s,c=this.findVideoUrl(d);if(!c)return void St.log("Failed to find .mp4 video file in media_sources",d);let h="en";const p=await this.getCourseLang(o);if(p){const{locale:{locale:t}}=p;h=t?Zt(t):h}qe.includes(h)||(h="en");const g=this.findSubtitleUrl(u,h);return g||St.log("Failed to find subtitle file in captions",u),{...g?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:g},{target:"video_file_url",targetUrl:c}],detectedLanguage:h}:{url:c,translationHelp:null},duration:l,title:n,description:r}}async getVideoId(t){return t.pathname.slice(1)}},[Be.coursera]:je,[Be.douyin]:Ge,[Be.artstation]:class extends $e{API_ORIGIN="https://www.artstation.com/api/v2/learning";getCSRFToken(){return document.querySelector('meta[name="public-csrf-token"]')?.content}async getCourseInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/courses/${t}/autoplay.json`,{method:"POST",headers:{"PUBLIC-CSRF-TOKEN":this.getCSRFToken()}});return await e.json()}catch(e){return St.error(`Failed to get artstation course info by courseId: ${t}.`,e.message),!1}}async getVideoUrl(t){try{const e=await this.fetch(`${this.API_ORIGIN}/quicksilver/video_url.json?chapter_id=${t}`);return(await e.json()).url.replace("qsep://","https://")}catch(e){return St.error(`Failed to get artstation video url by chapterId: ${t}.`,e.message),!1}}async getVideoData(t){const[,e,,,o]=t.split("/"),i=await this.getCourseInfo(e);if(!i)return;const a=i.chapters.find((t=>t.hash_id===o));if(!a)return;const n=await this.getVideoUrl(a.id);if(!n)return;const{title:r,duration:s,subtitles:l}=a;return{url:n,title:r,duration:s,subtitles:l.filter((t=>"vtt"===t.format)).map((t=>({language:Zt(t.locale),source:"artstation",format:"vtt",url:t.file_url})))}}async getVideoId(t){return/courses\/(\w{3,5})\/([^/]+)\/chapters\/(\w{3,5})/.exec(t.pathname)?.[0]}}};class Ke{helpersData;constructor(t={}){this.helpersData=t}getHelper(t){return new Je[t](this.helpersData)}}async function Ze(t,e={}){const o=new URL(window.location.href),i=t.host;if(Object.keys(Je).includes(i)){const t=new Ke(e).getHelper(i);return await t.getVideoId(o)}return i===oe.custom?o.href:void 0}function Xe(t,e=","){const o=t/1e3,i=Math.floor(o/3600),a=Math.floor(o%3600/60),n=Math.floor(o%60),r=Math.floor(t%1e3);return`${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}${e}${r.toString().padStart(3,"0")}`}function Qe(t){const e=t.split(" ")?.[0]?.split(":");e.length<3&&e.unshift("00");const[o,i,a]=e;return 36e5*+o+6e4*+i+ +a.replace(/[,.]/,"")}function to(t,e="srt"){const o="vtt"===e,i=o?".":",",a=t.subtitles.map(((t,e)=>(o?"":`${e+1}\n`)+`${Xe(t.startMs,i)} --\x3e ${Xe(t.startMs+t.durationMs,i)}\n${t.text}\n\n`)).join("").trim();return o?`WEBVTT\n\n${a}`:a}function eo(t,e="srt"){const o=function(t){return"string"!=typeof t?"json":/^(WEBVTT)(\r?\n)/.exec(t)?"vtt":"srt"}(t);return o===e?t:"json"===o?to(t,e):(t=function(t,e="srt"){const o=t.split(/\r?\n\r?\n/g);"vtt"===e&&o.shift(),/^\d+\r?\n/.exec(o?.[0]??"")&&(e="srt");const i=+("srt"===e);return{containsTokens:!1,subtitles:o.reduce(((t,e)=>{const o=e.trim().split("\n"),a=o[i],n=o.slice(i+1).join("\n");if(!(2===o.length&&e.includes(" --\x3e ")||a?.includes(" --\x3e ")))return 0===t.length||(t[t.length-1].text+=`\n\n${o.join("\n")}`),t;const[r,s]=a.split(" --\x3e "),l=Qe(r),d=Qe(s)-l;return t.push({text:n,startMs:l,durationMs:d,speakerId:"0"}),t}),[])}}(t,o),"json"===e?t:to(t,e))}class oo{static formatYandexTokens(t){const e=t.startMs+t.durationMs;return t.tokens.reduce(((o,i,a)=>{const n=t.tokens[a+1],r=o[o.length-1],s=r?.alignRange?.end??0,l=s+i.text.length;if(i.alignRange={start:s,end:l},o.push(i),n){const t=i.startMs+i.durationMs,a=n.startMs?n.startMs-t:e-t;o.push({text:" ",startMs:t,durationMs:a,alignRange:{start:l,end:l+1}})}return o}),[])}static createTokens(t,e){const o=t.text.split(/([\n \t])/).reduce(((t,o)=>{if(!o.length)return t;const i=t[t.length-1]??e,a=i?.alignRange?.end??0,n=a+o.length;return t.push({text:o,alignRange:{start:a,end:n}}),t}),[]),i=Math.floor(t.durationMs/o.length),a=t.startMs+t.durationMs;return o.map(((e,n)=>{const r=n===o.length-1,s=t.startMs+i*n;return{...e,startMs:s,durationMs:r?a-s:i}}))}static processTokens(t,e){const o=[];let i;const{source:a,isAutoGenerated:n}=e;for(const e of t.subtitles){const t=e?.tokens?.length,r=t&&("yandex"===a||"youtube"===a&&n)?this.formatYandexTokens(e):this.createTokens(e,i);i=r[r.length-1],o.push({...e,tokens:r})}return t.containsTokens=!0,o}static formatYoutubeSubtitles(t,e=!1){if(!t?.events?.length)return console.error("[VOT] Invalid YouTube subtitles format:",t),{containsTokens:e,subtitles:[]};const o={containsTokens:e,subtitles:[]};for(let i=0;it.events[i+1].tStartMs&&(n=t.events[i+1].tStartMs-a.tStartMs);const r=[];let s=n;for(let t=0;tt.text)).join(" ");l&&o.subtitles.push({text:l,startMs:a.tStartMs,durationMs:n,...e?{tokens:r}:{}})}return o}static cleanJsonSubtitles(t){const{containsTokens:e,subtitles:o}=t;return{containsTokens:e,subtitles:o.map((t=>({...t,text:t.text.replace(/(<([^>]+)>)/gi,"")})))}}static async fetchWithTimeout(t,e=5e3){try{return await we(t,{timeout:e})}catch(t){throw console.error("[VOT] Fetch failed:",t),t}}static async fetchSubtitles(t){const{source:e,isAutoGenerated:o,format:i,url:a}=t;try{const n=await this.fetchWithTimeout(a);let r;if(["vtt","srt"].includes(i)){r=eo(await n.text(),"json")}else r=await n.json();return"youtube"===e&&(r=this.formatYoutubeSubtitles(r,o)),"vk"===e&&(r=this.cleanJsonSubtitles(r)),r.subtitles=this.processTokens(r,t),console.log("[VOT] Processed subtitles:",r),r}catch(t){return console.error("[VOT] Failed to process subtitles:",t),{containsTokens:!1,subtitles:[]}}}static async getSubtitles(t,e){const{host:o,url:i,detectedLanguage:a,videoId:n,duration:r,subtitles:s=[]}=e;try{const e=await Promise.race([t.getSubtitles({videoData:{host:o,url:i,videoId:n,duration:r},requestLang:a}),new Promise(((t,e)=>setTimeout((()=>e(new Error("Timeout"))),5e3)))]);console.log("[VOT] Subtitles response:",e),e.waiting&&console.error("[VOT] Failed to get Yandex subtitles");const l=(e.subtitles??[]).reduce(((t,e)=>(e.language&&!t.find((t=>"yandex"===t.source&&t.language===e.language&&!t.translatedFromLanguage))&&t.push({source:"yandex",language:e.language,url:e.url}),e.translatedLanguage&&t.push({source:"yandex",language:e.translatedLanguage,translatedFromLanguage:e.language,url:e.translatedUrl}),t)),[]);return[...l,...s].sort(((t,e)=>{if(t.source!==e.source)return"yandex"===t.source?-1:1;if(t.language!==e.language&&(t.language===ge||e.language===ge))return t.language===ge?-1:1;if("yandex"===t.source){if(t.translatedFromLanguage!==e.translatedFromLanguage)return t.translatedFromLanguage&&e.translatedFromLanguage?t.translatedFromLanguage===a?-1:1:t.language===e.language?t.translatedFromLanguage?1:-1:t.translatedFromLanguage?-1:1;if(!t.translatedFromLanguage)return t.language===a?-1:1}return"yandex"!==t.source&&t.isAutoGenerated!==e.isAutoGenerated?t.isAutoGenerated?1:-1:0}))}catch(t){const e="Timeout"===t.message?"Failed to get Yandex subtitles: timeout":"Error in getSubtitles function";throw console.error(`[VOT] ${e}`,t),t}}}class io{constructor(t,e,o){this.video=t,this.container="youtube"===o.host&&"mobile"!==o.additionalData?e.parentElement:e,this.site=o,this.subtitlesContainer=this.createSubtitlesContainer(),this.position={left:25,top:75},this.dragging={active:!1,offset:{x:0,y:0}},this.subtitles=null,this.lastContent=null,this.highlightWords=!1,this.fontSize=20,this.opacity=.2,this.maxLength=300,this.abortController=new AbortController,this.bindEvents(),this.updateContainerRect()}createSubtitlesContainer(){return this.subtitlesContainer=document.createElement("vot-block"),this.subtitlesContainer.classList.add("vot-subtitles-widget"),this.container.appendChild(this.subtitlesContainer),this.subtitlesContainer}bindEvents(){const{signal:t}=this.abortController;this.onPointerDownBound=t=>this.onPointerDown(t),this.onPointerUpBound=()=>this.onPointerUp(),this.onPointerMoveBound=t=>this.onPointerMove(t),this.onTimeUpdateBound=this.debounce((()=>this.update()),100),document.addEventListener("pointerdown",this.onPointerDownBound,{signal:t}),document.addEventListener("pointerup",this.onPointerUpBound,{signal:t}),document.addEventListener("pointermove",this.onPointerMoveBound,{signal:t}),this.video?.addEventListener("timeupdate",this.onTimeUpdateBound,{signal:t}),this.resizeObserver=new ResizeObserver((()=>this.onResize())),this.resizeObserver.observe(this.container)}onPointerDown(t){if(!this.subtitlesContainer.contains(t.target))return;const e=this.subtitlesContainer.getBoundingClientRect(),o=this.container.getBoundingClientRect();this.dragging={active:!0,offset:{x:t.clientX-e.left,y:t.clientY-e.top},containerOffset:{x:o.left,y:o.top}}}onPointerUp(){this.dragging.active=!1}onPointerMove(t){if(!this.dragging.active)return;t.preventDefault();const{width:e,height:o}=this.container.getBoundingClientRect(),{containerOffset:i,offset:a}=this.dragging;this.position={left:(t.clientX-a.x-i.x)/e*100,top:(t.clientY-a.y-i.y)/o*100},this.applySubtitlePosition()}onResize(){this.updateContainerRect()}updateContainerRect(){this.containerRect=this.container.getBoundingClientRect(),this.applySubtitlePosition()}applySubtitlePosition(){const{width:t,height:e}=this.containerRect,{offsetWidth:o,offsetHeight:i}=this.subtitlesContainer,a=(t-o)/t*100,n=(e-i)/e*100;this.position.left=Math.max(0,Math.min(this.position.left,a)),this.position.top=Math.max(0,Math.min(this.position.top,n)),this.subtitlesContainer.style.left=`${this.position.left}%`,this.subtitlesContainer.style.top=`${this.position.top}%`}processTokens(t){if(t.at(-1).alignRange.end<=this.maxLength)return t;const e=[];let o=[],i=0;for(const a of t)i+=a.text.length,o.push(a),i>this.maxLength&&(e.push(this.trimChunk(o)),o=[],i=0);o.length&&e.push(this.trimChunk(o));const a=1e3*this.video.currentTime;return e.find((t=>t[0].startMs{const o=this.highlightWords&&(e>t.startMs+t.durationMs/2||e>t.startMs-100&&t.startMs+t.durationMs/2-e<275);return k` +(()=>{var t={"./src/styles/main.scss":()=>{GM_addStyle('.vot-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-ontheme));background-color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;border:none;border-radius:4px;outline:none;padding:0 16px;font-size:14px;font-weight:500;line-height:36px;transition:box-shadow .2s;display:inline-block;position:relative;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 1px 5px rgba(0,0,0,.12)}.vot-button[hidden]{display:none!important}.vot-button::-moz-focus-inner{border:none}.vot-button:before,.vot-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-button:before{background-color:rgb(var(--vot-helper-ontheme));transition:opacity .2s}.vot-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-button:hover{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.vot-button:hover:before{opacity:.08}.vot-button:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.vot-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size}.vot-button[disabled=true]{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.12);color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);box-shadow:none;cursor:initial}.vot-button[disabled=true]:before{opacity:0}.vot-button[disabled=true]:after{opacity:0}.vot-outlined-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;border:1px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.24);vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border-radius:4px;outline:none;margin:0;padding:0 16px;font-size:14px;font-weight:500;line-height:34px;display:inline-block;position:relative}.vot-outlined-button[hidden]{display:none!important}.vot-outlined-button::-moz-focus-inner{border:none}.vot-outlined-button:before,.vot-outlined-button:after{content:"";opacity:0;border-radius:3px;position:absolute;top:0;bottom:0;left:0;right:0}.vot-outlined-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-outlined-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-outlined-button:hover:before{opacity:.04}.vot-outlined-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-outlined-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-outlined-button[disabled=true]:before{opacity:0}.vot-outlined-button[disabled=true]:after{opacity:0}.vot-text-button{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;min-width:64px;height:36px;color:rgb(var(--vot-helper-theme));font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:4px;outline:none;margin:0;padding:0 8px;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-text-button[hidden]{display:none!important}.vot-text-button::-moz-focus-inner{border:none}.vot-text-button:before,.vot-text-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-text-button:before{background-color:rgb(var(--vot-helper-theme));transition:opacity .2s}.vot-text-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-text-button:hover:before{opacity:.04}.vot-text-button:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-text-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-text-button[disabled=true]:before{opacity:0}.vot-text-button[disabled=true]:after{opacity:0}.vot-icon-button{--vot-helper-onsurface:rgba(var(--vot-onsurface-rgb,0,0,0),.87);box-sizing:border-box;vertical-align:middle;text-align:center;text-overflow:ellipsis;width:36px;height:36px;fill:var(--vot-helper-onsurface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:pointer;background-color:transparent;border:none;border-radius:50%;outline:none;margin:0;padding:0;font-size:14px;font-weight:500;line-height:36px;display:inline-block;position:relative}.vot-icon-button[hidden]{display:none!important}.vot-icon-button::-moz-focus-inner{border:none}.vot-icon-button:before,.vot-icon-button:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-icon-button:before{background-color:var(--vot-helper-onsurface);transition:opacity .2s}.vot-icon-button:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity .3s,background-size .4s}.vot-icon-button:hover:before{opacity:.04}.vot-icon-button:active:after{opacity:.32;background-size:100% 100%;transition:background-size,opacity}.vot-icon-button[disabled=true]{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);fill:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial;background-color:transparent}.vot-icon-button[disabled=true]:before{opacity:0}.vot-icon-button[disabled=true]:after{opacity:0}.vot-textfield{display:inline-block;--vot-helper-theme:rgb(var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243)))!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari3:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;padding-top:6px!important;font-size:16px!important;line-height:1.5!important;position:relative!important}.vot-textfield[hidden]{display:none!important}.vot-textfield>input,.vot-textfield>textarea{box-sizing:border-box!important;border-style:solid!important;border-width:1px!important;border-color:transparent var(--vot-helper-safari2)var(--vot-helper-safari2)!important;width:100%!important;height:inherit!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;-webkit-text-fill-color:currentColor!important;font-family:inherit!important;font-size:inherit!important;line-height:inherit!important;caret-color:var(--vot-helper-theme)!important;background-color:transparent!important;border-radius:4px!important;margin:0!important;padding:15px 13px!important;transition:border .2s,box-shadow .2s!important;box-shadow:inset 1px 0 transparent,inset -1px 0 transparent,inset 0 -1px transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-moz-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>textarea:not(:focus):not(.vot-show-placeholer)::-webkit-input-placeholder{color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>textarea:not(:focus):placeholder-shown{border-top-color:var(--vot-helper-safari2)!important}.vot-textfield>input+span,.vot-textfield>textarea+span{width:100%!important;max-height:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;cursor:text!important;pointer-events:none!important;font-size:75%!important;line-height:15px!important;transition:color .2s,font-size .2s,line-height .2s!important;display:flex!important;position:absolute!important;top:0!important;left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span{font-size:inherit!important;line-height:68px!important}.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{content:""!important;box-sizing:border-box!important;border-top:solid 1px var(--vot-helper-safari2)!important;pointer-events:none!important;min-width:10px!important;height:8px!important;margin-top:6px!important;transition:border .2s,box-shadow .2s!important;display:block!important;box-shadow:inset 0 1px transparent!important}.vot-textfield>input+span:before,.vot-textfield>textarea+span:before{border-left:1px solid transparent!important;border-radius:4px 0!important;margin-right:4px!important}.vot-textfield>input+span:after,.vot-textfield>textarea+span:after{border-right:1px solid transparent!important;border-radius:0 4px!important;flex-grow:1!important;margin-left:4px!important}.vot-textfield>input.vot-show-placeholer+span:before,.vot-textfield>textarea.vot-show-placeholer+span:before{margin-right:0!important}.vot-textfield>input.vot-show-placeholer+span:after,.vot-textfield>textarea.vot-show-placeholer+span:after{margin-left:0!important}.vot-textfield>input:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:not(:focus):placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield:hover>input:not(:disabled),.vot-textfield:hover>textarea:not(:disabled){border-color:transparent var(--vot-helper-safari3)var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled)+span:before,.vot-textfield:hover>input:not(:disabled)+span:after,.vot-textfield:hover>textarea:not(:disabled)+span:before,.vot-textfield:hover>textarea:not(:disabled)+span:after{border-top-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>input:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield:hover>textarea:not(:disabled):not(:focus):placeholder-shown{border-color:var(--vot-helper-safari3)!important}.vot-textfield>input:focus,.vot-textfield>textarea:focus{border-color:transparent var(--vot-helper-theme)var(--vot-helper-theme)!important;box-shadow:inset 1px 0 var(--vot-helper-theme),inset -1px 0 var(--vot-helper-theme),inset 0 -1px var(--vot-helper-theme)!important;outline:none!important}.vot-textfield>input:focus+span,.vot-textfield>textarea:focus+span{color:var(--vot-helper-theme)!important}.vot-textfield>input:focus+span:before,.vot-textfield>input:focus+span:after,.vot-textfield>textarea:focus+span:before,.vot-textfield>textarea:focus+span:after{border-top-color:var(--vot-helper-theme)!important;box-shadow:inset 0 1px var(--vot-helper-theme)!important}.vot-textfield>input:disabled,.vot-textfield>input:disabled+span,.vot-textfield>textarea:disabled,.vot-textfield>textarea:disabled+span{border-color:transparent var(--vot-helper-safari1)var(--vot-helper-safari1)!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important;pointer-events:none!important}.vot-textfield>input:disabled+span:before,.vot-textfield>input:disabled+span:after,.vot-textfield>textarea:disabled+span:before,.vot-textfield>textarea:disabled+span:after{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>textarea:disabled:placeholder-shown+span{border-top-color:var(--vot-helper-safari1)!important}.vot-textfield>input:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>input:disabled:placeholder-shown+span:after{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:before{border-top-color:transparent!important}.vot-textfield>textarea:disabled:placeholder-shown+span:after{border-top-color:transparent!important}@media not all and (-webkit-min-device-pixel-ratio:.0000264583),not all and (min-resolution:.001dpcm){@supports ((-webkit-appearance:none)){.vot-textfield>input,.vot-textfield>input+span,.vot-textfield>textarea,.vot-textfield>textarea+span,.vot-textfield>input+span:before,.vot-textfield>input+span:after,.vot-textfield>textarea+span:before,.vot-textfield>textarea+span:after{transition-duration:.1s!important}}}.vot-checkbox{--vot-helper-theme:var(--vot-theme-rgb,var(--vot-primary-rgb,33,150,243));--vot-helper-ontheme:var(--vot-ontheme-rgb,var(--vot-onprimary-rgb,255,255,255));z-index:0;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-size:16px;line-height:1.5;display:inline-block;position:relative}.vot-checkbox-sub{padding-left:16px}.vot-checkbox[hidden]{display:none!important}.vot-checkbox>input{-webkit-appearance:none;appearance:none;z-index:10000;box-sizing:border-box;border:2px solid;border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);cursor:pointer;background:0 0;border-radius:2px;outline:none;width:18px;height:18px;margin:3px 1px;padding:0;transition:border-color .2s,background-color .2s;display:block;position:absolute}.vot-checkbox>input+span{box-sizing:border-box;width:inherit;cursor:pointer;padding-left:30px;font-weight:400;display:inline-block;position:relative}.vot-checkbox>input+span:before{content:"";background-color:rgb(var(--vot-onsurface-rgb,0,0,0));opacity:0;pointer-events:none;border-radius:50%;width:40px;height:40px;transition:opacity .3s,transform .2s;display:block;position:absolute;top:-8px;left:-10px;transform:scale(1)}.vot-checkbox>input+span:after{content:"";z-index:10000;pointer-events:none;border:0 solid transparent;border-width:0 0 2px 2px;width:10px;height:5px;transition:border-color .2s;display:block;position:absolute;top:3px;left:1px;transform:translate(3px,4px)rotate(-45deg);box-sizing:content-box!important}.vot-checkbox>input:checked{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate{border-color:rgb(var(--vot-helper-theme));background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:indeterminate+span:before{background-color:rgb(var(--vot-helper-theme))}.vot-checkbox>input:checked+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-color:rgb(var(--vot-helper-ontheme,255,255,255))}.vot-checkbox>input:indeterminate+span:after{border-left-width:0;transform:translate(4px,3px)}.vot-checkbox:hover>input+span:before{opacity:.04}.vot-checkbox:active>input,.vot-checkbox:active:hover>input:not(:disabled){border-color:rgb(var(--vot-helper-theme))}.vot-checkbox:active>input:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.6);border-color:transparent}.vot-checkbox:active>input+span:before{opacity:1;transition:transform,opacity;transform:scale(0)}.vot-checkbox>input:disabled{border-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled:checked{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled:indeterminate{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);border-color:transparent}.vot-checkbox>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38);cursor:initial}.vot-checkbox>input:disabled+span:before{opacity:0;transform:scale(0)}.vot-slider{display:inline-block;--vot-safari-helper1:rgba(var(--vot-primary-rgb,33,150,243),.04)!important;--vot-safari-helper2:rgba(var(--vot-primary-rgb,33,150,243),.12)!important;--vot-safari-helper3:rgba(var(--vot-primary-rgb,33,150,243),.16)!important;--vot-safari-helper4:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;width:100%!important;color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important;font-family:var(--vot-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system)!important;text-align:start!important;font-size:16px!important;line-height:1.5!important}.vot-slider[hidden]{display:none!important}.vot-slider>input{-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important;background-color:transparent!important;border:none!important;width:100%!important;height:36px!important;margin:0 0 -36px!important;padding:0!important;display:block!important;position:relative!important;top:24px!important}.vot-slider>input:last-child{margin:0!important;position:static!important}.vot-slider>input:before{content:""!important;width:calc(100%*var(--vot-progress,0))!important;background:rgb(var(--vot-primary-rgb,33,150,243))!important;height:2px!important;display:block!important;position:absolute!important;top:calc(50% - 1px)!important}.vot-slider>input:disabled{cursor:default!important;opacity:.38!important}.vot-slider>input:disabled+span{color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-webkit-slider-runnable-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-track{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-lower{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-ms-fill-upper{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.38)!important}.vot-slider>input:disabled::-moz-range-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-webkit-slider-thumb{background-color:rgb(var(--vot-onsurface-rgb,0,0,0))!important;box-shadow:0 0 0 1px rgb(var(--vot-surface-rgb,255,255,255))!important;transform:scale(4)!important}.vot-slider>input:disabled::-ms-fill-upper{opacity:.38!important}.vot-slider>input:disabled::-moz-range-progress{background-color:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-slider>input:disabled:-webkit-slider-thumb{color:rgb(var(--vot-surface-rgb,255,255,255))!important}.vot-slider>input:active::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper4)!important}.vot-slider>input:active::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:active::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.24)!important}.vot-slider>input:focus{outline:none!important}.vot-slider>input::-webkit-slider-runnable-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-moz-range-track{background-color:rgba(var(--vot-primary-rgb,33,150,243),.24)!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important}.vot-slider>input::-ms-track{box-sizing:border-box!important;background-color:transparent!important;border:none!important;border-radius:1px!important;width:100%!important;height:2px!important;margin:17px 0!important;padding:0 17px!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-moz-range-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-ms-thumb{-webkit-appearance:none!important;appearance:none!important;background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border:none!important;border-radius:50%!important;width:2px!important;height:2px!important;transition:box-shadow .2s!important;transform:scale(6)!important}.vot-slider>input::-webkit-slider-thumb{-webkit-appearance:none!important;margin:0!important}.vot-slider>input::-moz-range-thumb{-moz-appearance:none!important}.vot-slider>input::-ms-thumb{margin:0 17px!important}.vot-slider>input::-moz-range-progress{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-lower{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-ms-fill-upper{background-color:rgb(var(--vot-primary-rgb,33,150,243))!important;border-radius:1px!important;height:2px!important}.vot-slider>input::-moz-focus-outer{border:none!important}.vot-slider>span{margin-bottom:36px!important;display:inline-block!important}.vot-slider:hover>input::-webkit-slider-thumb{box-shadow:0 0 0 2px var(--vot-safari-helper1)!important}.vot-slider:hover>input::-ms-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-slider:hover>input:hover::-moz-range-thumb{box-shadow:0 0 0 2px rgba(var(--vot-primary-rgb,33,150,243),.04)!important}.vot-select{font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;font-size:14px;font-weight:400;line-height:1.5;display:flex;--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0)!important;--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87)!important;--vot-helper-safari1:rgba(var(--vot-onsurface-rgb,0,0,0),.6)!important;--vot-helper-safari2:rgba(var(--vot-onsurface-rgb,0,0,0),.87)!important}.vot-select[hidden]{display:none!important}.vot-select-label{font-size:16px}.vot-select-outer{cursor:pointer;justify-content:space-between;align-items:center;width:120px;max-width:120px;padding:0 5px;display:flex;border-style:solid!important;border-width:1px!important;border-color:var(--vot-helper-safari1)!important;border-radius:4px!important;transition:border .2s!important}.vot-select-outer:hover{border-color:var(--vot-helper-safari2)!important}.vot-select-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vot-select-arrow-icon{justify-content:center;align-items:center;width:20px;height:32px;display:flex}.vot-select-content-list{flex-direction:column;display:flex}.vot-select-content-list .vot-select-content-item{cursor:pointer;border-radius:8px;padding:5px 10px}.vot-select-content-list .vot-select-content-item:not([inert]):hover{background-color:#2a2c31}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]{color:rgb(var(--vot-primary-rgb,33,150,243));background-color:rgba(var(--vot-primary-rgb,33,150,243),.2)}.vot-select-content-list .vot-select-content-item[data-vot-selected=true]:hover{background-color:rgba(var(--vot-primary-rgb,33,150,243),.1)!important}.vot-select-content-list .vot-select-content-item[data-vot-disabled=true]{cursor:default}.vot-select-content-list .vot-select-content-item[hidden]{display:none!important}.vot-header{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;font-weight:700;line-height:1.5}.vot-header[hidden]{display:none!important}.vot-header:not(:first-child){padding-top:8px}.vot-header-level-1{font-size:2em}.vot-header-level-2{font-size:1.5em}.vot-header-level-3{font-size:1.17em}.vot-header-level-4{font-size:1em}.vot-header-level-5{font-size:.83em}.vot-header-level-6{font-size:.67em}.vot-info{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;-webkit-user-select:text;user-select:text;font-size:16px;line-height:1.5;display:flex}.vot-info[hidden]{display:none!important}.vot-info>:not(:first-child){color:rgba(var(--vot-helper-onsurface-rgb),.5);flex:1;margin-left:8px}.vot-details{color:rgba(var(--vot-helper-onsurface-rgb),.87);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);text-align:start;cursor:pointer;border-radius:.5em;justify-content:space-between;align-items:center;margin:0 -.5em;padding:.5em;font-size:16px;line-height:1.5;transition:background .5s;display:flex}.vot-details[hidden]{display:none!important}.vot-details-arrow-icon{width:20px;height:32px;fill:rgba(var(--vot-helper-onsurface-rgb),.87);justify-content:center;align-items:center;display:flex;transform:scale(1.25)rotate(-90deg)}.vot-details:hover{background:rgba(var(--vot-onsurface-rgb,0,0,0),.04)}.vot-lang-select{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);color:var(--vot-helper-theme);fill:var(--vot-helper-theme);justify-content:space-between;align-items:center;display:flex}.vot-lang-select[hidden]{display:none!important}.vot-lang-select-icon{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.vot-segmented-button{--vot-helper-theme-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-theme:rgba(var(--vot-helper-theme-rgb),.87);-webkit-user-select:none;user-select:none;background:rgb(var(--vot-surface-rgb,255,255,255));max-width:100vw;height:32px;color:var(--vot-helper-theme);fill:var(--vot-helper-theme);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;border-radius:4px;align-items:center;font-size:16px;line-height:1.5;transition:opacity .5s;display:flex;position:absolute;top:5rem;left:50%;overflow:hidden;transform:translate(-50%)}.vot-segmented-button[hidden]{display:none!important}.vot-segmented-button *{box-sizing:border-box!important}.vot-segmented-button .vot-separator{background:rgba(var(--vot-helper-theme-rgb),.1);width:1px;height:50%}.vot-segmented-button .vot-separator[hidden]{display:none!important}.vot-segmented-button .vot-segment,.vot-segmented-button .vot-segment-only-icon{height:100%;color:inherit;background-color:transparent;border:none;justify-content:center;align-items:center;padding:0 8px;transition:background-color .1s ease-in-out;display:flex;position:relative;overflow:hidden}.vot-segmented-button .vot-segment[hidden],.vot-segmented-button [hidden].vot-segment-only-icon{display:none!important}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before,.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{content:"";border-radius:inherit;opacity:0;position:absolute;top:0;bottom:0;left:0;right:0}.vot-segmented-button .vot-segment:before,.vot-segmented-button .vot-segment-only-icon:before{background-color:rgb(var(--vot-helper-theme-rgb));transition:opacity .2s}.vot-segmented-button .vot-segment:after,.vot-segmented-button .vot-segment-only-icon:after{background:radial-gradient(circle,currentColor 1%,transparent 1%) 50%/10000% 10000% no-repeat;transition:opacity 1s,background-size .5s}.vot-segmented-button .vot-segment:hover:before,.vot-segmented-button .vot-segment-only-icon:hover:before{opacity:.04}.vot-segmented-button .vot-segment:active:after,.vot-segmented-button .vot-segment-only-icon:active:after{opacity:.16;background-size:100% 100%;transition:background-size}.vot-segmented-button .vot-segment-only-icon{min-width:32px;padding:0}.vot-segmented-button .vot-segment-label{white-space:nowrap;color:inherit;margin-left:8px;font-weight:400}.vot-segmented-button[data-status=success] .vot-translate-button{color:rgb(var(--vot-primary-rgb,33,150,243));fill:rgb(var(--vot-primary-rgb,33,150,243))}.vot-segmented-button[data-status=error] .vot-translate-button{color:#f28b82;fill:#f28b82}.vot-segmented-button[data-loading=true] #vot-loading-icon{display:block!important}.vot-segmented-button[data-loading=true] #vot-translate-icon{display:none!important}.vot-segmented-button[data-direction=column]{flex-direction:column;height:fit-content}.vot-segmented-button[data-direction=column] .vot-segment-label{display:none}.vot-segmented-button[data-direction=column]>.vot-segment-only-icon,.vot-segmented-button[data-direction=column]>.vot-segment{padding:8px}.vot-segmented-button[data-direction=column] .vot-separator{width:50%;height:1px}.vot-segmented-button[data-position=left]{top:12.5vh;left:50px}.vot-segmented-button[data-position=right]{top:12.5vh;left:auto;right:0}.vot-segmented-button svg{width:24px}.vot-menu{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);-webkit-user-select:none;user-select:none;background-color:var(--vot-helper-surface);color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);cursor:default;z-index:2147483647;visibility:visible;opacity:1;transform-origin:top;border-radius:8px;min-width:300px;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;position:absolute;top:calc(5rem + 48px);left:50%;overflow:hidden;transform:translate(-50%)scale(1)}.vot-menu *{box-sizing:border-box!important}.vot-menu[hidden]{pointer-events:none;visibility:hidden;opacity:0;transform:translate(-50%)scale(0);display:block!important}.vot-menu-content-wrapper{min-height:100px;max-height:calc(var(--vot-container-height,75vh) - (5rem + 32px + 16px)*2);flex-direction:column;display:flex;overflow:auto}.vot-menu-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-menu-header-container:empty{padding:0 0 16px}.vot-menu-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-menu-title-container{font-size:inherit;font-weight:inherit;text-align:start;outline:0;flex:1;margin:0;display:flex}.vot-menu-title{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex:1;padding-top:16px;font-size:16px;font-weight:400;line-height:1}.vot-menu-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:8px;min-height:1.375rem;padding:0 16px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-menu-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-menu-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-menu-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-menu-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-menu-footer-container:empty{padding:16px 0 0}.vot-menu[data-position=left]{top:12.5vh;left:240px}.vot-menu[data-position=right]{top:12.5vh;left:auto;right:-80px}.vot-dialog{--vot-helper-surface-rgb:var(--vot-surface-rgb,255,255,255);--vot-helper-surface:rgb(var(--vot-helper-surface-rgb));--vot-helper-onsurface-rgb:var(--vot-onsurface-rgb,0,0,0);--vot-helper-onsurface:rgba(var(--vot-helper-onsurface-rgb),.87);max-width:initial;max-height:initial;width:min(var(--vot-dialog-width,512px),100%);top:50%;bottom:50%;background-color:var(--vot-helper-surface);height:fit-content;color:var(--vot-helper-onsurface);font-family:var(--vot-font-family,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);-webkit-user-select:none;user-select:none;visibility:visible;opacity:1;transform-origin:50%;border-radius:8px;margin:auto;padding:0;font-size:16px;line-height:1.5;transition:opacity .3s,transform .1s;display:block;position:fixed;top:0;bottom:0;left:0;right:0;overflow-x:auto;overflow-y:hidden;transform:scale(1);box-shadow:0 0 16px rgba(0,0,0,.12),0 16px 16px rgba(0,0,0,.24)}[hidden]>.vot-dialog{pointer-events:none;opacity:0;transition:opacity .1s,transform .2s;transform:scale(.5)}.vot-dialog-container{visibility:visible;z-index:2147483647;position:absolute}.vot-dialog-container[hidden]{pointer-events:none;visibility:hidden;display:block!important}.vot-dialog-container *{box-sizing:border-box!important}.vot-dialog-backdrop{opacity:1;background-color:rgba(0,0,0,.6);transition:opacity .3s;position:fixed;top:0;bottom:0;left:0;right:0}[hidden]>.vot-dialog-backdrop{pointer-events:none;opacity:0}.vot-dialog-content-wrapper{flex-direction:column;max-height:75vh;display:flex;overflow:auto}.vot-dialog-header-container{flex-shrink:0;align-items:flex-start;min-height:31px;display:flex}.vot-dialog-header-container:empty{padding:0 0 20px}.vot-dialog-header-container>.vot-icon-button{margin-inline-end:4px;margin-top:4px}.vot-dialog-title-container{font-size:inherit;font-weight:inherit;outline:0;flex:1;margin:0;display:flex}.vot-dialog-title{padding-bottom:16px;padding-inline-start:20px;padding-inline-end:20px;flex:1;padding-top:20px;font-size:115.385%;font-weight:700;line-height:1}.vot-dialog-body-container{box-sizing:border-box;overscroll-behavior:contain;flex-direction:column;gap:16px;min-height:1.375rem;padding:0 20px;display:flex;overflow:auto;scrollbar-color:rgba(var(--vot-helper-onsurface-rgb),.1)var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-track{background:var(--vot-helper-surface)!important;width:12px!important;height:12px!important}.vot-dialog-body-container::-webkit-scrollbar-thumb{background:rgba(var(--vot-helper-onsurface-rgb),.1)!important;border:5px solid var(--vot-helper-surface)!important;-webkit-border-radius:1ex!important}.vot-dialog-body-container::-webkit-scrollbar-thumb:hover{border:3px solid var(--vot-helper-surface)!important}.vot-dialog-body-container::-webkit-scrollbar-corner{background:var(--vot-helper-surface)!important}.vot-dialog-footer-container{padding-bottom:16px;padding-inline-start:16px;padding-inline-end:16px;flex-shrink:0;justify-content:flex-end;padding-top:16px;display:flex}.vot-dialog-footer-container:empty{padding:20px 0 0}.vot-subtitles-widget{z-index:2147483647;pointer-events:none;justify-content:center;align-items:center;width:50%;min-height:20%;max-height:100%;display:flex;position:absolute;top:75%;left:25%}.vot-subtitles{--vot-subtitles-background:rgba(var(--vot-surface-rgb,46,47,52),var(--vot-subtitles-opacity,.8));background:var(--vot-subtitles-background,rgba(46,47,52,.8));width:max-content;max-width:100%;max-height:100%;color:var(--vot-subtitles-color,#e3e3e3);pointer-events:all;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:.5em;padding:.5em;font-size:20px;line-height:normal;position:relative}.vot-subtitles span{-webkit-user-select:text;user-select:text;font-size:inherit!important;line-height:normal!important}.vot-subtitles .passed{color:var(--vot-subtitles-passed-color,#2196f3)}:root{--vot-font-family:"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system;--vot-primary-rgb:139,180,245;--vot-onprimary-rgb:32,33,36;--vot-surface-rgb:32,33,36;--vot-onsurface-rgb:227,227,227;--vot-subtitles-color:rgb(var(--vot-onsurface-rgb,227,227,227));--vot-subtitles-passed-color:rgb(var(--vot-primary-rgb,33,150,243))}vot-block{display:block;visibility:visible!important}')},"./node_modules/bowser/es5.js":function(t){t.exports=function(t){var e={};function o(i){if(e[i])return e[i].exports;var a=e[i]={i,l:!1,exports:{}};return t[i].call(a.exports,a,a.exports,o),a.l=!0,a.exports}return o.m=t,o.c=e,o.d=function(t,e,i){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,e){if(1&e&&(t=o(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)o.d(i,a,function(e){return t[e]}.bind(null,a));return i},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=90)}({17:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i=o(18),a=function(){function t(){}return t.getFirstMatch=function(t,e){var o=e.match(t);return o&&o.length>0&&o[1]||""},t.getSecondMatch=function(t,e){var o=e.match(t);return o&&o.length>1&&o[2]||""},t.matchAndReturnConst=function(t,e,o){if(t.test(e))return o},t.getWindowsVersionName=function(t){switch(t){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},t.getMacOSVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),10===e[0])switch(e[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}},t.getAndroidVersionName=function(t){var e=t.split(".").splice(0,2).map((function(t){return parseInt(t,10)||0}));if(e.push(0),!(1===e[0]&&e[1]<5))return 1===e[0]&&e[1]<6?"Cupcake":1===e[0]&&e[1]>=6?"Donut":2===e[0]&&e[1]<2?"Eclair":2===e[0]&&2===e[1]?"Froyo":2===e[0]&&e[1]>2?"Gingerbread":3===e[0]?"Honeycomb":4===e[0]&&e[1]<1?"Ice Cream Sandwich":4===e[0]&&e[1]<4?"Jelly Bean":4===e[0]&&e[1]>=4?"KitKat":5===e[0]?"Lollipop":6===e[0]?"Marshmallow":7===e[0]?"Nougat":8===e[0]?"Oreo":9===e[0]?"Pie":void 0},t.getVersionPrecision=function(t){return t.split(".").length},t.compareVersions=function(e,o,i){void 0===i&&(i=!1);var a=t.getVersionPrecision(e),n=t.getVersionPrecision(o),r=Math.max(a,n),s=0,l=t.map([e,o],(function(e){var o=r-t.getVersionPrecision(e),i=e+new Array(o+1).join(".0");return t.map(i.split("."),(function(t){return new Array(20-t.length).join("0")+t})).reverse()}));for(i&&(s=r-Math.min(a,n)),r-=1;r>=s;){if(l[0][r]>l[1][r])return 1;if(l[0][r]===l[1][r]){if(r===s)return 0;r-=1}else if(l[0][r]1?a-1:0),r=1;r0){var r=Object.keys(o),l=s.default.find(r,(function(t){return e.isOS(t)}));if(l){var d=this.satisfies(o[l]);if(void 0!==d)return d}var u=s.default.find(r,(function(t){return e.isPlatform(t)}));if(u){var c=this.satisfies(o[u]);if(void 0!==c)return c}}if(n>0){var h=Object.keys(a),p=s.default.find(h,(function(t){return e.isBrowser(t,!0)}));if(void 0!==p)return this.compareVersion(a[p])}},e.isBrowser=function(t,e){void 0===e&&(e=!1);var o=this.getBrowserName().toLowerCase(),i=t.toLowerCase(),a=s.default.getBrowserTypeByAlias(i);return e&&a&&(i=a.toLowerCase()),i===o},e.compareVersion=function(t){var e=[0],o=t,i=!1,a=this.getBrowserVersion();if("string"==typeof a)return">"===t[0]||"<"===t[0]?(o=t.substr(1),"="===t[1]?(i=!0,o=t.substr(2)):e=[],">"===t[0]?e.push(1):e.push(-1)):"="===t[0]?o=t.substr(1):"~"===t[0]&&(i=!0,o=t.substr(1)),e.indexOf(s.default.compareVersions(a,o,i))>-1},e.isOS=function(t){return this.getOSName(!0)===String(t).toLowerCase()},e.isPlatform=function(t){return this.getPlatformType(!0)===String(t).toLowerCase()},e.isEngine=function(t){return this.getEngineName(!0)===String(t).toLowerCase()},e.is=function(t,e){return void 0===e&&(e=!1),this.isBrowser(t,e)||this.isOS(t)||this.isPlatform(t)},e.some=function(t){var e=this;return void 0===t&&(t=[]),t.some((function(t){return e.is(t)}))},t}();e.default=d,t.exports=e.default},92:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=/version\/(\d+(\.?_?\d+)+)/i,r=[{test:[/googlebot/i],describe:function(t){var e={name:"Googlebot"},o=a.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/opera/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opr\/|opios/i],describe:function(t){var e={name:"Opera"},o=a.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/SamsungBrowser/i],describe:function(t){var e={name:"Samsung Internet for Android"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Whale/i],describe:function(t){var e={name:"NAVER Whale Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MZBrowser/i],describe:function(t){var e={name:"MZ Browser"},o=a.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/focus/i],describe:function(t){var e={name:"Focus"},o=a.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/swing/i],describe:function(t){var e={name:"Swing"},o=a.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/coast/i],describe:function(t){var e={name:"Opera Coast"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(t){var e={name:"Opera Touch"},o=a.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/yabrowser/i],describe:function(t){var e={name:"Yandex Browser"},o=a.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/ucbrowser/i],describe:function(t){var e={name:"UC Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/Maxthon|mxios/i],describe:function(t){var e={name:"Maxthon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/epiphany/i],describe:function(t){var e={name:"Epiphany"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/puffin/i],describe:function(t){var e={name:"Puffin"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sleipnir/i],describe:function(t){var e={name:"Sleipnir"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/k-meleon/i],describe:function(t){var e={name:"K-Meleon"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/micromessenger/i],describe:function(t){var e={name:"WeChat"},o=a.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qqbrowser/i],describe:function(t){var e={name:/qqbrowserlite/i.test(t)?"QQ Browser Lite":"QQ Browser"},o=a.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/msie|trident/i],describe:function(t){var e={name:"Internet Explorer"},o=a.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/\sedg\//i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/edg([ea]|ios)/i],describe:function(t){var e={name:"Microsoft Edge"},o=a.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/vivaldi/i],describe:function(t){var e={name:"Vivaldi"},o=a.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/seamonkey/i],describe:function(t){var e={name:"SeaMonkey"},o=a.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/sailfish/i],describe:function(t){var e={name:"Sailfish"},o=a.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,t);return o&&(e.version=o),e}},{test:[/silk/i],describe:function(t){var e={name:"Amazon Silk"},o=a.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/phantom/i],describe:function(t){var e={name:"PhantomJS"},o=a.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/slimerjs/i],describe:function(t){var e={name:"SlimerJS"},o=a.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e={name:"BlackBerry"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e={name:"WebOS Browser"},o=a.default.getFirstMatch(n,t)||a.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/bada/i],describe:function(t){var e={name:"Bada"},o=a.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/tizen/i],describe:function(t){var e={name:"Tizen"},o=a.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/qupzilla/i],describe:function(t){var e={name:"QupZilla"},o=a.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/firefox|iceweasel|fxios/i],describe:function(t){var e={name:"Firefox"},o=a.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/electron/i],describe:function(t){var e={name:"Electron"},o=a.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/MiuiBrowser/i],describe:function(t){var e={name:"Miui"},o=a.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/chromium/i],describe:function(t){var e={name:"Chromium"},o=a.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,t)||a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/chrome|crios|crmo/i],describe:function(t){var e={name:"Chrome"},o=a.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/GSA/i],describe:function(t){var e={name:"Google Search"},o=a.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e={name:"Android Browser"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/playstation 4/i],describe:function(t){var e={name:"PlayStation 4"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/safari|applewebkit/i],describe:function(t){var e={name:"Safari"},o=a.default.getFirstMatch(n,t);return o&&(e.version=o),e}},{test:[/.*/i],describe:function(t){var e=-1!==t.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:a.default.getFirstMatch(e,t),version:a.default.getSecondMatch(e,t)}}}];e.default=r,t.exports=e.default},93:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/Roku\/DVP/],describe:function(t){var e=a.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,t);return{name:n.OS_MAP.Roku,version:e}}},{test:[/windows phone/i],describe:function(t){var e=a.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.WindowsPhone,version:e}}},{test:[/windows /i],describe:function(t){var e=a.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,t),o=a.default.getWindowsVersionName(e);return{name:n.OS_MAP.Windows,version:e,versionName:o}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(t){var e={name:n.OS_MAP.iOS},o=a.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,t);return o&&(e.version=o),e}},{test:[/macintosh/i],describe:function(t){var e=a.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,t).replace(/[_\s]/g,"."),o=a.default.getMacOSVersionName(e),i={name:n.OS_MAP.MacOS,version:e};return o&&(i.versionName=o),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(t){var e=a.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,t).replace(/[_\s]/g,".");return{name:n.OS_MAP.iOS,version:e}}},{test:function(t){var e=!t.test(/like android/i),o=t.test(/android/i);return e&&o},describe:function(t){var e=a.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,t),o=a.default.getAndroidVersionName(e),i={name:n.OS_MAP.Android,version:e};return o&&(i.versionName=o),i}},{test:[/(web|hpw)[o0]s/i],describe:function(t){var e=a.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,t),o={name:n.OS_MAP.WebOS};return e&&e.length&&(o.version=e),o}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(t){var e=a.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,t)||a.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,t)||a.default.getFirstMatch(/\bbb(\d+)/i,t);return{name:n.OS_MAP.BlackBerry,version:e}}},{test:[/bada/i],describe:function(t){var e=a.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Bada,version:e}}},{test:[/tizen/i],describe:function(t){var e=a.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.Tizen,version:e}}},{test:[/linux/i],describe:function(){return{name:n.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:n.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(t){var e=a.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,t);return{name:n.OS_MAP.PlayStation4,version:e}}}];e.default=r,t.exports=e.default},94:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(t){var e=a.default.getFirstMatch(/(can-l01)/i,t)&&"Nova",o={type:n.PLATFORMS_MAP.mobile,vendor:"Huawei"};return e&&(o.model=e),o}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){var e=t.test(/ipod|iphone/i),o=t.test(/like (ipod|iphone)/i);return e&&!o},describe:function(t){var e=a.default.getFirstMatch(/(ipod|iphone)/i,t);return{type:n.PLATFORMS_MAP.mobile,vendor:"Apple",model:e}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"blackberry"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(t){return"bada"===t.getBrowserName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"windows phone"===t.getBrowserName()},describe:function(){return{type:n.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(t){var e=Number(String(t.getOSVersion()).split(".")[0]);return"android"===t.getOSName(!0)&&e>=3},describe:function(){return{type:n.PLATFORMS_MAP.tablet}}},{test:function(t){return"android"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.mobile}}},{test:function(t){return"macos"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(t){return"windows"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"linux"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.desktop}}},{test:function(t){return"playstation 4"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}},{test:function(t){return"roku"===t.getOSName(!0)},describe:function(){return{type:n.PLATFORMS_MAP.tv}}}];e.default=r,t.exports=e.default},95:function(t,e,o){"use strict";e.__esModule=!0,e.default=void 0;var i,a=(i=o(17))&&i.__esModule?i:{default:i},n=o(18),r=[{test:function(t){return"microsoft edge"===t.getBrowserName(!0)},describe:function(t){if(/\sedg\//i.test(t))return{name:n.ENGINE_MAP.Blink};var e=a.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,t);return{name:n.ENGINE_MAP.EdgeHTML,version:e}}},{test:[/trident/i],describe:function(t){var e={name:n.ENGINE_MAP.Trident},o=a.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){return t.test(/presto/i)},describe:function(t){var e={name:n.ENGINE_MAP.Presto},o=a.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:function(t){var e=t.test(/gecko/i),o=t.test(/like gecko/i);return e&&!o},describe:function(t){var e={name:n.ENGINE_MAP.Gecko},o=a.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:n.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(t){var e={name:n.ENGINE_MAP.WebKit},o=a.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,t);return o&&(e.version=o),e}}];e.default=r,t.exports=e.default}})},"./node_modules/requestidlecallback-polyfill/index.js":()=>{window.requestIdleCallback=window.requestIdleCallback||function(t){var e=Date.now();return setTimeout((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),1)},window.cancelIdleCallback=window.cancelIdleCallback||function(t){clearTimeout(t)}}},e={};function o(i){var a=e[i];if(void 0!==a)return a.exports;var n=e[i]={exports:{}};return t[i].call(n.exports,n,n.exports,o),n.exports}(()=>{"use strict";var t=o("./node_modules/bowser/es5.js");const e=globalThis,i=e.trustedTypes,a=i?i.createPolicy("lit-html",{createHTML:t=>t}):void 0,n="$lit$",r=`lit$${Math.random().toFixed(9).slice(2)}$`,s="?"+r,l=`<${s}>`,d=document,u=()=>d.createComment(""),c=t=>null===t||"object"!=typeof t&&"function"!=typeof t,h=Array.isArray,p=t=>h(t)||"function"==typeof t?.[Symbol.iterator],g="[ \t\n\f\r]",m=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,v=/-->/g,f=/>/g,b=RegExp(`>|${g}(?:([^\\s"'>=/]+)(${g}*=${g}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),y=/'/g,w=/"/g,x=/^(?:script|style|textarea|title)$/i,S=t=>(e,...o)=>({_$litType$:t,strings:e,values:o}),k=S(1),T=S(2),C=(S(3),Symbol.for("lit-noChange")),I=Symbol.for("lit-nothing"),P=new WeakMap,L=d.createTreeWalker(d,129);function _(t,e){if(!h(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==a?a.createHTML(e):e}const A=(t,e)=>{const o=t.length-1,i=[];let a,s=2===e?"":3===e?"":"",d=m;for(let e=0;e"===c[0]?(d=a??m,h=-1):void 0===c[1]?h=-2:(h=d.lastIndex-c[2].length,u=c[1],d=void 0===c[3]?b:'"'===c[3]?w:y):d===w||d===y?d=b:d===v||d===f?d=m:(d=b,a=void 0);const g=d===b&&t[e+1].startsWith("/>")?" ":"";s+=d===m?o+l:h>=0?(i.push(u),o.slice(0,h)+n+o.slice(h)+r+g):o+r+(-2===h?e:g)}return[_(t,s+(t[o]||"")+(2===e?"":3===e?"":"")),i]};class V{constructor({strings:t,_$litType$:e},o){let a;this.parts=[];let l=0,d=0;const c=t.length-1,h=this.parts,[p,g]=A(t,e);if(this.el=V.createElement(p,o),L.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(a=L.nextNode())&&h.length0){a.textContent=i?i.emptyScript:"";for(let o=0;o2||""!==o[0]||""!==o[1]?(this._$AH=Array(o.length-1).fill(new String),this.strings=o):this._$AH=I}_$AI(t,e=this,o,i){const a=this.strings;let n=!1;if(void 0===a)t=O(this,t,e,0),n=!c(t)||t!==this._$AH&&t!==C,n&&(this._$AH=t);else{const i=t;let r,s;for(t=a[0],r=0;r{const i=o?.renderBefore??e;let a=i._$litPart$;if(void 0===a){const t=o?.renderBefore??null;i._$litPart$=a=new E(e.insertBefore(u(),t),t,void 0,o??{})}return a._$AI(t),a};function q(t){return String(t).split("").map((t=>t.charCodeAt(0)))}function z(t){return new Uint8Array(q(t))}function H(t){const e=new ArrayBuffer(2*t.length),o=new Uint8Array(e);return new Uint16Array(e).set(q(t)),o}function W(t){const e=255;return[t>>>24&e,t>>>16&e,t>>>8&e,t&e]}function j(t){return 11+t}function G(t,e,o,i){return 11+e+1+1+(i?2+2*(o+1):o+1)+t}function Y(t){let e=0;return t.forEach((t=>{e+=2+2*t[0].length+2+2+2*t[1].length+2})),11+e}function J(t,e){const o=2*e;let i=0;return t.forEach((t=>{i+=2+2*t[0].length+2+4})),18+o+2+i}class K{_setIntegerFrame(t,e){const o=parseInt(e,10);this.frames.push({name:t,value:o,size:j(o.toString().length)})}_setStringFrame(t,e){const o=e.toString();let i=13+2*o.length;"TDAT"===t&&(i=j(o.length)),this.frames.push({name:t,value:o,size:i})}_setPictureFrame(t,e,o,i){const a=function(t){if(!t||!t.length)return null;if(255===t[0]&&216===t[1]&&255===t[2])return"image/jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"image/png";if(71===t[0]&&73===t[1]&&70===t[2])return"image/gif";if(87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"image/webp";const e=73===t[0]&&73===t[1]&&42===t[2]&&0===t[3],o=77===t[0]&&77===t[1]&&0===t[2]&&42===t[3];return e||o?"image/tiff":66===t[0]&&77===t[1]?"image/bmp":0===t[0]&&0===t[1]&&1===t[2]&&0===t[3]?"image/x-icon":null}(new Uint8Array(e)),n=o.toString();if(!a)throw new Error("Unknown picture MIME type");o||(i=!1),this.frames.push({name:"APIC",value:e,pictureType:t,mimeType:a,useUnicodeEncoding:i,description:n,size:G(e.byteLength,a.length,n.length,i)})}_setLyricsFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"USLT",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setCommentFrame(t,e,o){const i=t.split("").map((t=>t.charCodeAt(0))),a=e.toString(),n=o.toString();var r,s;this.frames.push({name:"COMM",value:n,language:i,description:a,size:(r=a.length,s=n.length,16+2*r+2+2+2*s)})}_setPrivateFrame(t,e){const o=t.toString();var i,a;this.frames.push({name:"PRIV",value:e,id:o,size:(i=o.length,a=e.byteLength,10+i+1+a)})}_setUserStringFrame(t,e){const o=t.toString(),i=e.toString();var a,n;this.frames.push({name:"TXXX",description:o,value:i,size:(a=o.length,n=i.length,13+2*a+2+2+2*n)})}_setUrlLinkFrame(t,e){const o=e.toString();var i;this.frames.push({name:t,value:o,size:(i=o.length,10+i)})}_setPairedTextFrame(t,e){this.frames.push({name:t,value:e,size:Y(e)})}_setSynchronisedLyricsFrame(t,e,o,i,a){const n=a.toString(),r=i.split("").map((t=>t.charCodeAt(0)));this.frames.push({name:"SYLT",value:e,language:r,description:n,type:t,timestampFormat:o,size:J(e,n.length)})}constructor(t){if(!t||"object"!=typeof t||!("byteLength"in t))throw new Error("First argument should be an instance of ArrayBuffer or Buffer");this.arrayBuffer=t,this.padding=4096,this.frames=[],this.url=""}setFrame(t,e){switch(t){case"TPE1":case"TCOM":case"TCON":{if(!Array.isArray(e))throw new Error(`${t} frame value should be an array of strings`);const o="TCON"===t?";":"/",i=e.join(o);this._setStringFrame(t,i);break}case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TMED":case"TPUB":case"TCOP":case"TKEY":case"TEXT":case"TDAT":case"TSRC":this._setStringFrame(t,e);break;case"TBPM":case"TLEN":case"TYER":this._setIntegerFrame(t,e);break;case"USLT":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("lyrics"in e))throw new Error("USLT frame value should be an object with keys description and lyrics");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setLyricsFrame(e.language,e.description,e.lyrics);break;case"APIC":if("object"!=typeof e||!("type"in e)||!("data"in e)||!("description"in e))throw new Error("APIC frame value should be an object with keys type, data and description");if(e.type<0||e.type>20)throw new Error("Incorrect APIC frame picture type");this._setPictureFrame(e.type,e.data,e.description,!!e.useUnicodeEncoding);break;case"TXXX":if("object"!=typeof e||!("description"in e)||!("value"in e))throw new Error("TXXX frame value should be an object with keys description and value");this._setUserStringFrame(e.description,e.value);break;case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":this._setUrlLinkFrame(t,e);break;case"COMM":if(e.language=e.language||"eng","object"!=typeof e||!("description"in e)||!("text"in e))throw new Error("COMM frame value should be an object with keys description and text");if(e.language&&!e.language.match(/[a-z]{3}/i))throw new Error("Language must be coded following the ISO 639-2 standards");this._setCommentFrame(e.language,e.description,e.text);break;case"PRIV":if("object"!=typeof e||!("id"in e)||!("data"in e))throw new Error("PRIV frame value should be an object with keys id and data");this._setPrivateFrame(e.id,e.data);break;case"IPLS":if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Error("IPLS frame value should be an array of pairs");this._setPairedTextFrame(t,e);break;case"SYLT":if("object"!=typeof e||!("type"in e)||!("text"in e)||!("timestampFormat"in e))throw new Error("SYLT frame value should be an object with keys type, text and timestampFormat");if(!Array.isArray(e.text)||!Array.isArray(e.text[0]))throw new Error("SYLT frame text value should be an array of pairs");if(e.type<0||e.type>6)throw new Error("Incorrect SYLT frame content type");if(e.timestampFormat<1||e.timestampFormat>2)throw new Error("Incorrect SYLT frame time stamp format");e.language=e.language||"eng",e.description=e.description||"",this._setSynchronisedLyricsFrame(e.type,e.text,e.timestampFormat,e.language,e.description);break;default:throw new Error(`Unsupported frame ${t}`)}return this}removeTag(){if(this.arrayBuffer.byteLength<10)return;const t=new Uint8Array(this.arrayBuffer),e=t[3],o=((i=[t[6],t[7],t[8],t[9]])[0]<<21)+(i[1]<<14)+(i[2]<<7)+i[3]+10;var i,a;73!==(a=t)[0]||68!==a[1]||51!==a[2]||e<2||e>4||(this.arrayBuffer=new Uint8Array(t.subarray(o)).buffer)}addTag(){this.removeTag();const t=[255,254],e=10+this.frames.reduce(((t,e)=>t+e.size),0)+this.padding,o=new ArrayBuffer(this.arrayBuffer.byteLength+e),i=new Uint8Array(o);let a=0,n=[];return n=[73,68,51,3],i.set(n,a),a+=n.length,a++,a++,n=function(t){const e=127;return[t>>>21&e,t>>>14&e,t>>>7&e,t&e]}(e-10),i.set(n,a),a+=n.length,this.frames.forEach((e=>{switch(n=z(e.name),i.set(n,a),a+=n.length,n=W(e.size-10),i.set(n,a),a+=n.length,a+=2,e.name){case"WCOM":case"WCOP":case"WOAF":case"WOAR":case"WOAS":case"WORS":case"WPAY":case"WPUB":n=z(e.value),i.set(n,a),a+=n.length;break;case"TPE1":case"TCOM":case"TCON":case"TLAN":case"TIT1":case"TIT2":case"TIT3":case"TALB":case"TPE2":case"TPE3":case"TPE4":case"TRCK":case"TPOS":case"TKEY":case"TMED":case"TPUB":case"TCOP":case"TEXT":case"TSRC":n=[1].concat(t),i.set(n,a),a+=n.length,n=H(e.value),i.set(n,a),a+=n.length;break;case"TXXX":case"USLT":case"COMM":n=[1],"USLT"!==e.name&&"COMM"!==e.name||(n=n.concat(e.language)),n=n.concat(t),i.set(n,a),a+=n.length,n=H(e.description),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=H(e.value),i.set(n,a),a+=n.length;break;case"TBPM":case"TLEN":case"TDAT":case"TYER":a++,n=z(e.value),i.set(n,a),a+=n.length;break;case"PRIV":n=z(e.id),i.set(n,a),a+=n.length,a++,i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"APIC":n=[e.useUnicodeEncoding?1:0],i.set(n,a),a+=n.length,n=z(e.mimeType),i.set(n,a),a+=n.length,n=[0,e.pictureType],i.set(n,a),a+=n.length,e.useUnicodeEncoding?(n=[].concat(t),i.set(n,a),a+=n.length,n=H(e.description),i.set(n,a),a+=n.length,a+=2):(n=z(e.description),i.set(n,a),a+=n.length,a++),i.set(new Uint8Array(e.value),a),a+=e.value.byteLength;break;case"IPLS":n=[1],i.set(n,a),a+=n.length,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=H(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0].concat(t),i.set(n,a),a+=n.length,n=H(e[1].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length}));break;case"SYLT":n=[1].concat(e.language).concat(e.timestampFormat).concat(e.type),i.set(n,a),a+=n.length,n=[].concat(t),i.set(n,a),a+=n.length,n=H(e.description),i.set(n,a),a+=n.length,a+=2,e.value.forEach((e=>{n=[].concat(t),i.set(n,a),a+=n.length,n=H(e[0].toString()),i.set(n,a),a+=n.length,n=[0,0],i.set(n,a),a+=n.length,n=W(e[1]),i.set(n,a),a+=n.length}))}})),a+=this.padding,i.set(new Uint8Array(this.arrayBuffer),a),this.arrayBuffer=o,o}getBlob(){return new Blob([this.arrayBuffer],{type:"audio/mpeg"})}getURL(){return this.url||(this.url=URL.createObjectURL(this.getBlob())),this.url}revokeURL(){URL.revokeObjectURL(this.url)}}const Z={version:"1.0.3",debug:!1,fetchFn:fetch.bind(window)};class X{constructor(){this._vector=new Float32Array,this._position=0,this._frameCount=0}get vector(){return this._vector}get position(){return this._position}get startIndex(){return 2*this._position}get frameCount(){return this._frameCount}get endIndex(){return 2*(this._position+this._frameCount)}clear(){this.receive(this._frameCount),this.rewind()}put(t){this._frameCount+=t}putSamples(t,e,o=0){const i=2*(e=e||0);o>=0||(o=(t.length-i)/2);const a=2*o;this.ensureCapacity(o+this._frameCount);const n=this.endIndex;this.vector.set(t.subarray(i,i+a),n),this._frameCount+=o}putBuffer(t,e,o=0){e=e||0,o>=0||(o=t.frameCount-e),this.putSamples(t.vector,t.position+e,o)}receive(t){t>=0&&!(t>this._frameCount)||(t=this.frameCount),this._frameCount-=t,this._position+=t}receiveSamples(t,e=0){const o=2*e,i=this.startIndex;t.set(this._vector.subarray(i,i+o)),this.receive(e)}extract(t,e=0,o=0){const i=this.startIndex+2*e,a=2*o;t.set(this._vector.subarray(i,i+a))}ensureCapacity(t=0){const e=parseInt(2*t);if(this._vector.length0&&(this._vector.set(this._vector.subarray(this.startIndex,this.endIndex)),this._position=0)}}class Q{constructor(t){t?(this._inputBuffer=new X,this._outputBuffer=new X):this._inputBuffer=this._outputBuffer=null}get inputBuffer(){return this._inputBuffer}set inputBuffer(t){this._inputBuffer=t}get outputBuffer(){return this._outputBuffer}set outputBuffer(t){this._outputBuffer=t}clear(){this._inputBuffer.clear(),this._outputBuffer.clear()}}class tt extends Q{constructor(t){super(t),this.reset(),this._rate=1}set rate(t){this._rate=t}reset(){this.slopeCount=0,this.prevSampleL=0,this.prevSampleR=0}clone(){const t=new tt;return t.rate=this._rate,t}process(){const t=this._inputBuffer.frameCount;this._outputBuffer.ensureAdditionalCapacity(t/this._rate+1);const e=this.transpose(t);this._inputBuffer.receive(),this._outputBuffer.put(e)}transpose(t=0){if(0===t)return 0;const e=this._inputBuffer.vector,o=this._inputBuffer.startIndex,i=this._outputBuffer.vector,a=this._outputBuffer.endIndex;let n=0,r=0;for(;this.slopeCount<1;)i[a+2*r]=(1-this.slopeCount)*this.prevSampleL+this.slopeCount*e[o],i[a+2*r+1]=(1-this.slopeCount)*this.prevSampleR+this.slopeCount*e[o+1],r+=1,this.slopeCount+=this._rate;if(this.slopeCount-=1,1!==t)t:for(;;){for(;this.slopeCount>1;)if(this.slopeCount-=1,n+=1,n>=t-1)break t;const s=o+2*n;i[a+2*r]=(1-this.slopeCount)*e[s]+this.slopeCount*e[s+2],i[a+2*r+1]=(1-this.slopeCount)*e[s+1]+this.slopeCount*e[s+3],r+=1,this.slopeCount+=this._rate}return this.prevSampleL=e[o+2*t-2],this.prevSampleR=e[o+2*t-1],r}}class et{constructor(t){this._pipe=t}get pipe(){return this._pipe}get inputBuffer(){return this._pipe.inputBuffer}get outputBuffer(){return this._pipe.outputBuffer}fillInputBuffer(){throw new Error("fillInputBuffer() not overridden")}fillOutputBuffer(t=0){for(;this.outputBuffer.frameCountthis._position)throw new RangeError("New position may not be greater than current position");const e=this.outputBufferPosition-(this._position-t);if(e<0)throw new RangeError("New position falls outside of history buffer");this.outputBufferPosition=e,this._position=t}get sourcePosition(){return this._sourcePosition}set sourcePosition(t){this.clear(),this._sourcePosition=t}onEnd(){this.callback()}fillInputBuffer(t=0){const e=new Float32Array(2*t),o=this.sourceSound.extract(e,t,this._sourcePosition);this._sourcePosition+=o,this.inputBuffer.putSamples(e,0,o)}extract(t,e=0){this.fillOutputBuffer(this.outputBufferPosition+e);const o=Math.min(e,this.outputBuffer.frameCount-this.outputBufferPosition);this.outputBuffer.extract(t,this.outputBufferPosition,o);const i=this.outputBufferPosition+o;return this.outputBufferPosition=Math.min(this.historyBufferSize,i),this.outputBuffer.receive(Math.max(i-this.historyBufferSize,0)),this._position+=o,o}handleSampleData(t){this.extract(t.data,4096)}clear(){super.clear(),this.outputBufferPosition=0}}const at=[[124,186,248,310,372,434,496,558,620,682,744,806,868,930,992,1054,1116,1178,1240,1302,1364,1426,1488,0],[-100,-75,-50,-25,25,50,75,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-20,-15,-10,-5,5,10,15,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-4,-3,-2,-1,1,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],nt=-10/1.5;class rt extends Q{constructor(t){super(t),this._quickSeek=!0,this.midBufferDirty=!1,this.midBuffer=null,this.overlapLength=0,this.autoSeqSetting=!0,this.autoSeekSetting=!0,this._tempo=1,this.setParameters(44100,0,0,8)}clear(){super.clear(),this.clearMidBuffer()}clearMidBuffer(){this.midBufferDirty&&(this.midBufferDirty=!1,this.midBuffer=null)}setParameters(t,e,o,i){t>0&&(this.sampleRate=t),i>0&&(this.overlapMs=i),e>0?(this.sequenceMs=e,this.autoSeqSetting=!1):this.autoSeqSetting=!0,o>0?(this.seekWindowMs=o,this.autoSeekSetting=!1):this.autoSeekSetting=!0,this.calculateSequenceParameters(),this.calculateOverlapLength(this.overlapMs),this.tempo=this._tempo}set tempo(t){let e;this._tempo=t,this.calculateSequenceParameters(),this.nominalSkip=this._tempo*(this.seekWindowLength-this.overlapLength),this.skipFract=0,e=Math.floor(this.nominalSkip+.5),this.sampleReq=Math.max(e+this.overlapLength,this.seekWindowLength)+this.seekLength}get tempo(){return this._tempo}get inputChunkSize(){return this.sampleReq}get outputChunkSize(){return this.overlapLength+Math.max(0,this.seekWindowLength-2*this.overlapLength)}calculateOverlapLength(t=0){let e;e=this.sampleRate*t/1e3,e=e<16?16:e,e-=e%8,this.overlapLength=e,this.refMidBuffer=new Float32Array(2*this.overlapLength),this.midBuffer=new Float32Array(2*this.overlapLength)}checkLimits(t,e,o){return to?o:t}calculateSequenceParameters(){let t,e;this.autoSeqSetting&&(t=150+-50*this._tempo,t=this.checkLimits(t,50,125),this.sequenceMs=Math.floor(t+.5)),this.autoSeekSetting&&(e=28.333333333333332+nt*this._tempo,e=this.checkLimits(e,15,25),this.seekWindowMs=Math.floor(e+.5)),this.seekWindowLength=Math.floor(this.sampleRate*this.sequenceMs/1e3),this.seekLength=Math.floor(this.sampleRate*this.seekWindowMs/1e3)}set quickSeek(t){this._quickSeek=t}clone(){const t=new rt;return t.tempo=this._tempo,t.setParameters(this.sampleRate,this.sequenceMs,this.seekWindowMs,this.overlapMs),t}seekBestOverlapPosition(){return this._quickSeek?this.seekBestOverlapPositionStereoQuick():this.seekBestOverlapPositionStereo()}seekBestOverlapPositionStereo(){let t,e,o,i=0;for(this.preCalculateCorrelationReferenceStereo(),t=0,e=Number.MIN_VALUE;ie&&(e=o,t=i);return t}seekBestOverlapPositionStereoQuick(){let t,e,o,i,a,n=0;for(this.preCalculateCorrelationReferenceStereo(),e=Number.MIN_VALUE,t=0,i=0,a=0;n<4;n+=1){let r=0;for(;at[n][r]&&(a=i+at[n][r],!(a>=this.seekLength));)o=this.calculateCrossCorrelationStereo(2*a,this.refMidBuffer),o>e&&(e=o,t=a),r+=1;i=t}return t}preCalculateCorrelationReferenceStereo(){let t,e,o=0;for(;o=this.sampleReq;){t=this.seekBestOverlapPosition(),this._outputBuffer.ensureAdditionalCapacity(this.overlapLength),this.overlap(Math.floor(t)),this._outputBuffer.put(this.overlapLength),e=this.seekWindowLength-2*this.overlapLength,e>0&&this._outputBuffer.putBuffer(this._inputBuffer,t+this.overlapLength,e);const i=this._inputBuffer.startIndex+2*(t+this.seekWindowLength-this.overlapLength);this.midBuffer.set(this._inputBuffer.vector.subarray(i,i+2*this.overlapLength)),this.skipFract+=this.nominalSkip,o=Math.floor(this.skipFract),this.skipFract-=o,this._inputBuffer.receive(o)}}}const st=function(t,e){return(t>e?t-e:e-t)>1e-10};class lt{constructor(){this.transposer=new tt(!1),this.stretch=new rt(!1),this._inputBuffer=new X,this._intermediateBuffer=new X,this._outputBuffer=new X,this._rate=0,this._tempo=0,this.virtualPitch=1,this.virtualRate=1,this.virtualTempo=1,this.calculateEffectiveRateAndTempo()}clear(){this.transposer.clear(),this.stretch.clear()}clone(){const t=new lt;return t.rate=this.rate,t.tempo=this.tempo,t}get rate(){return this._rate}set rate(t){this.virtualRate=t,this.calculateEffectiveRateAndTempo()}set rateChange(t){this._rate=1+.01*t}get tempo(){return this._tempo}set tempo(t){this.virtualTempo=t,this.calculateEffectiveRateAndTempo()}set tempoChange(t){this.tempo=1+.01*t}set pitch(t){this.virtualPitch=t,this.calculateEffectiveRateAndTempo()}set pitchOctaves(t){this.pitch=Math.exp(.69314718056*t),this.calculateEffectiveRateAndTempo()}set pitchSemitones(t){this.pitchOctaves=t/12}get inputBuffer(){return this._inputBuffer}get outputBuffer(){return this._outputBuffer}calculateEffectiveRateAndTempo(){const t=this._tempo,e=this._rate;this._tempo=this.virtualTempo/this.virtualPitch,this._rate=this.virtualRate*this.virtualPitch,st(this._tempo,t)&&(this.stretch.tempo=this._tempo),st(this._rate,e)&&(this.transposer.rate=this._rate),this._rate>1?this._outputBuffer!=this.transposer.outputBuffer&&(this.stretch.inputBuffer=this._inputBuffer,this.stretch.outputBuffer=this._intermediateBuffer,this.transposer.inputBuffer=this._intermediateBuffer,this.transposer.outputBuffer=this._outputBuffer):this._outputBuffer!=this.stretch.outputBuffer&&(this.transposer.inputBuffer=this._inputBuffer,this.transposer.outputBuffer=this._intermediateBuffer,this.stretch.inputBuffer=this._intermediateBuffer,this.stretch.outputBuffer=this._outputBuffer)}process(){this._rate>1?(this.stretch.process(),this.transposer.process()):(this.transposer.process(),this.stretch.process())}}class dt{constructor(t){this.buffer=t,this._position=0}get dualChannel(){return this.buffer.numberOfChannels>1}get position(){return this._position}set position(t){this._position=t}extract(t,e=0,o=0){this.position=o;let i=this.buffer.getChannelData(0),a=this.dualChannel?this.buffer.getChannelData(1):this.buffer.getChannelData(0),n=0;for(;n=e?t:new Array(e-t.length+1).join(o)+t}(parseInt(t-60*e),2)}`},ct=function(t){const e=this.timePlayed,o=this.sampleRate;if(this.sourcePosition=t,this.timePlayed=t/o,e!==this.timePlayed){const t=new CustomEvent("play",{detail:{timePlayed:this.timePlayed,formattedTimePlayed:this.formattedTimePlayed,percentagePlayed:this.percentagePlayed}});this._node.dispatchEvent(t)}};class ht{constructor(t,e,o,i=ot){this._soundtouch=new lt;const a=new dt(e);this.timePlayed=0,this.sourcePosition=0,this._filter=new it(a,this._soundtouch,i),this._node=function(t,e,o=ot,i=4096){const a=t.createScriptProcessor(i,2,2),n=new Float32Array(2*i);return a.onaudioprocess=t=>{let a=t.outputBuffer.getChannelData(0),r=t.outputBuffer.getChannelData(1),s=e.extract(n,i);o(e.sourcePosition),0===s&&e.onEnd();let l=0;for(;lct.call(this,t)),o),this.tempo=1,this.rate=1,this.duration=e.duration,this.sampleRate=t.sampleRate,this.listeners=[]}get formattedDuration(){return ut(this.duration)}get formattedTimePlayed(){return ut(this.timePlayed)}get percentagePlayed(){return 100*this._filter.sourcePosition/(this.duration*this.sampleRate)}set percentagePlayed(t){this._filter.sourcePosition=parseInt(t*this.duration*this.sampleRate),this.sourcePosition=this._filter.sourcePosition,this.timePlayed=this.sourcePosition/this.sampleRate}get node(){return this._node}set pitch(t){this._soundtouch.pitch=t}set pitchSemitones(t){this._soundtouch.pitchSemitones=t}set rate(t){this._soundtouch.rate=t}set tempo(t){this._soundtouch.tempo=t}connect(t){this._node.connect(t)}disconnect(){this._node.disconnect()}on(t,e){this.listeners.push({name:t,cb:e}),this._node.addEventListener(t,(t=>e(t.detail)))}off(t=null){let e=this.listeners;t&&(e=e.filter((e=>e.name===t))),e.forEach((t=>{this._node.removeEventListener(t.name,(e=>t.cb(e.detail)))}))}}const pt=(...t)=>{if(Z.debug)return console.log(`%c✦ chaimu.js v${Z.version} ✦`,"background: #000; color: #fff; padding: 0 8px",...t)},gt=["playing","ratechange","play","waiting","pause","seeked"];function mt(){const t=window.AudioContext||window.webkitAudioContext;return t?new t:void 0}class vt{static name="BasePlayer";chaimu;_src;fetch;constructor(t,e){this.chaimu=t,this._src=e,this.fetch=Z.fetchFn}async init(){return new Promise((t=>t(this)))}clear(){return new Promise((t=>t(this)))}lipSync(t=!1){return this}handleVideoEvent=t=>(pt(`handle video ${t.type}`),this.lipSync(t.type),this);removeVideoEvents(){for(const t of gt)this.chaimu.video.removeEventListener(t,this.handleVideoEvent);return this}addVideoEvents(){for(const t of gt)this.chaimu.video.addEventListener(t,this.handleVideoEvent);return this}async play(){return new Promise((t=>t(this)))}async pause(){return new Promise((t=>t(this)))}get name(){return this.constructor.name}set src(t){this._src=t}get src(){return this._src}get currentSrc(){return this._src}set volume(t){}get volume(){return 0}get playbackRate(){return 0}set playbackRate(t){}get currentTime(){return 0}}class ft extends vt{static name="AudioPlayer";audio;gainNode;audioSource;constructor(t,e){super(t,e),this.updateAudio()}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.audioSource&&(this.audioSource.disconnect(this.gainNode),this.gainNode.disconnect()),this.gainNode=this.chaimu.audioContext.createGain(),this.gainNode.connect(this.chaimu.audioContext.destination),this.audioSource=this.chaimu.audioContext.createMediaElementSource(this.audio),this.audioSource.connect(this.gainNode),this):this}updateAudio(){return this.audio=new Audio(this.src),this.audio.crossOrigin="anonymous",this}async init(){return new Promise((t=>(this.updateAudio(),this.initAudioBooster(),t(this))))}audioErrorHandle=t=>{console.error("[AudioPlayer]",t)};lipSync(t=!1){if(pt("[AudioPlayer] lipsync video",this.chaimu.video),!this.chaimu.video)return this;if(this.audio.currentTime=this.chaimu.video.currentTime,this.audio.playbackRate=this.chaimu.video.playbackRate,!t)return pt("[AudioPlayer] lipsync mode isn't set"),this;switch(pt(`[AudioPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"seeked":return this.chaimu.video.paused||this.syncPlay(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async clear(){return new Promise((t=>(this.audio.pause(),this.audio.src="",this.audio.removeAttribute("src"),t(this))))}syncPlay(){return pt("[AudioPlayer] sync play called"),this.audio.play().catch(this.audioErrorHandle),this}async play(){return pt("[AudioPlayer] play called"),await this.audio.play().catch(this.audioErrorHandle),this}async pause(){return new Promise((t=>(pt("[AudioPlayer] pause called"),this.audio.pause(),t(this))))}set src(t){this._src=t,t?this.audio.src=t:this.clear()}get src(){return this._src}get currentSrc(){return this.audio.currentSrc}set volume(t){this.gainNode?this.gainNode.gain.value=t:this.audio.volume=t}get volume(){return this.gainNode?this.gainNode.gain.value:this.audio.volume}get playbackRate(){return this.audio.playbackRate}set playbackRate(t){this.audio.playbackRate=t}get currentTime(){return this.audio.currentTime}}class bt extends vt{static name="ChaimuPlayer";audioBuffer;sourceNode;gainNode;audioShifter;cleanerRunned=!1;async fetchAudio(){if(!this._src)throw new Error("No audio source provided");if(!this.chaimu.audioContext)throw new Error("No audio context available");pt(`[ChaimuPlayer] Fetching audio from ${this._src}...`);try{const t=await this.fetch(this._src);pt("[ChaimuPlayer] Decoding fetched audio...");const e=await t.arrayBuffer();this.audioBuffer=await this.chaimu.audioContext.decodeAudioData(e)}catch(t){throw new Error(`Failed to fetch audio file, because ${t.message}`)}return this}initAudioBooster(){return this.chaimu.audioContext?(this.gainNode&&this.gainNode.disconnect(),this.gainNode=this.chaimu.audioContext.createGain(),this):this}async init(){return await this.fetchAudio(),this.initAudioBooster(),this}lipSync(t=!1){if(pt("[ChaimuPlayer] lipsync video",this.chaimu.video,this),!this.chaimu.video)return this;if(!t)return pt("[ChaimuPlayer] lipsync mode isn't set"),this;switch(pt(`[ChaimuPlayer] lipsync mode is ${t}`),t){case"play":case"playing":case"ratechange":case"seeked":return this.chaimu.video.paused||this.start(),this;case"pause":case"waiting":return this.pause(),this;default:return this}}async reopenCtx(){if(!this.chaimu.audioContext)throw new Error("No audio context available");try{await this.chaimu.audioContext.close()}catch{}return this}async clear(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(pt("clear audio context"),this.cleanerRunned=!0,await this.pause(),!this.gainNode)return this.cleanerRunned=!1,this;this.sourceNode&&(this.sourceNode.stop(),this.sourceNode.disconnect(this.gainNode),this.sourceNode=void 0),this.audioShifter&&(this.audioShifter._node.disconnect(this.gainNode),this.audioShifter=void 0),this.gainNode.disconnect();const t=this.volume;return this.gainNode=void 0,await this.reopenCtx(),this.chaimu.audioContext=mt(),this.initAudioBooster(),this.volume=t,this.cleanerRunned=!1,this}async start(){if(!this.chaimu.audioContext)throw new Error("No audio context available");if(!this.audioBuffer)throw new Error("The player isn't initialized");return!this.gainNode||this.audioShifter&&this.audioShifter.duration(""!==t.target&&e.uint32(10).string(t.target),""!==t.targetUrl&&e.uint32(18).string(t.targetUrl),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={target:"",targetUrl:""};for(;o.pos>>3){case 1:if(10!==t)break;a.target=o.string();continue;case 2:if(18!==t)break;a.targetUrl=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({target:Ht(t.target)?globalThis.String(t.target):"",targetUrl:Ht(t.targetUrl)?globalThis.String(t.targetUrl):""}),toJSON(t){const e={};return""!==t.target&&(e.target=t.target),""!==t.targetUrl&&(e.targetUrl=t.targetUrl),e},create:t=>It.fromPartial(t??{}),fromPartial(t){const e={target:"",targetUrl:""};return e.target=t.target??"",e.targetUrl=t.targetUrl??"",e}};const Pt={encode(t,e=kt.Writer.create()){""!==t.url&&e.uint32(26).string(t.url),void 0!==t.deviceId&&e.uint32(34).string(t.deviceId),!1!==t.firstRequest&&e.uint32(40).bool(t.firstRequest),0!==t.duration&&e.uint32(49).double(t.duration),0!==t.unknown0&&e.uint32(56).int32(t.unknown0),""!==t.language&&e.uint32(66).string(t.language),!1!==t.forceSourceLang&&e.uint32(72).bool(t.forceSourceLang),0!==t.unknown1&&e.uint32(80).int32(t.unknown1);for(const o of t.translationHelp)It.encode(o,e.uint32(90).fork()).ldelim();return""!==t.responseLanguage&&e.uint32(114).string(t.responseLanguage),0!==t.unknown2&&e.uint32(120).int32(t.unknown2),0!==t.unknown3&&e.uint32(128).int32(t.unknown3),!1!==t.bypassCache&&e.uint32(136).bool(t.bypassCache),!1!==t.useNewModel&&e.uint32(144).bool(t.useNewModel),e},decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};for(;o.pos>>3){case 3:if(26!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.deviceId=o.string();continue;case 5:if(40!==t)break;a.firstRequest=o.bool();continue;case 6:if(49!==t)break;a.duration=o.double();continue;case 7:if(56!==t)break;a.unknown0=o.int32();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(72!==t)break;a.forceSourceLang=o.bool();continue;case 10:if(80!==t)break;a.unknown1=o.int32();continue;case 11:if(90!==t)break;a.translationHelp.push(It.decode(o,o.uint32()));continue;case 14:if(114!==t)break;a.responseLanguage=o.string();continue;case 15:if(120!==t)break;a.unknown2=o.int32();continue;case 16:if(128!==t)break;a.unknown3=o.int32();continue;case 17:if(136!==t)break;a.bypassCache=o.bool();continue;case 18:if(144!==t)break;a.useNewModel=o.bool();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",deviceId:Ht(t.deviceId)?globalThis.String(t.deviceId):void 0,firstRequest:!!Ht(t.firstRequest)&&globalThis.Boolean(t.firstRequest),duration:Ht(t.duration)?globalThis.Number(t.duration):0,unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):0,language:Ht(t.language)?globalThis.String(t.language):"",forceSourceLang:!!Ht(t.forceSourceLang)&&globalThis.Boolean(t.forceSourceLang),unknown1:Ht(t.unknown1)?globalThis.Number(t.unknown1):0,translationHelp:globalThis.Array.isArray(t?.translationHelp)?t.translationHelp.map((t=>It.fromJSON(t))):[],responseLanguage:Ht(t.responseLanguage)?globalThis.String(t.responseLanguage):"",unknown2:Ht(t.unknown2)?globalThis.Number(t.unknown2):0,unknown3:Ht(t.unknown3)?globalThis.Number(t.unknown3):0,bypassCache:!!Ht(t.bypassCache)&&globalThis.Boolean(t.bypassCache),useNewModel:!!Ht(t.useNewModel)&&globalThis.Boolean(t.useNewModel)}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),void 0!==t.deviceId&&(e.deviceId=t.deviceId),!1!==t.firstRequest&&(e.firstRequest=t.firstRequest),0!==t.duration&&(e.duration=t.duration),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.language&&(e.language=t.language),!1!==t.forceSourceLang&&(e.forceSourceLang=t.forceSourceLang),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),t.translationHelp?.length&&(e.translationHelp=t.translationHelp.map((t=>It.toJSON(t)))),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),0!==t.unknown3&&(e.unknown3=Math.round(t.unknown3)),!1!==t.bypassCache&&(e.bypassCache=t.bypassCache),!1!==t.useNewModel&&(e.useNewModel=t.useNewModel),e},create:t=>Pt.fromPartial(t??{}),fromPartial(t){const e={url:"",deviceId:void 0,firstRequest:!1,duration:0,unknown0:0,language:"",forceSourceLang:!1,unknown1:0,translationHelp:[],responseLanguage:"",unknown2:0,unknown3:0,bypassCache:!1,useNewModel:!1};return e.url=t.url??"",e.deviceId=t.deviceId??void 0,e.firstRequest=t.firstRequest??!1,e.duration=t.duration??0,e.unknown0=t.unknown0??0,e.language=t.language??"",e.forceSourceLang=t.forceSourceLang??!1,e.unknown1=t.unknown1??0,e.translationHelp=t.translationHelp?.map((t=>It.fromPartial(t)))||[],e.responseLanguage=t.responseLanguage??"",e.unknown2=t.unknown2??0,e.unknown3=t.unknown3??0,e.bypassCache=t.bypassCache??!1,e.useNewModel=t.useNewModel??!1,e}};const Lt={encode:(t,e=kt.Writer.create())=>(void 0!==t.url&&e.uint32(10).string(t.url),void 0!==t.duration&&e.uint32(17).double(t.duration),0!==t.status&&e.uint32(32).int32(t.status),void 0!==t.remainingTime&&e.uint32(40).int32(t.remainingTime),void 0!==t.unknown0&&e.uint32(48).int32(t.unknown0),""!==t.translationId&&e.uint32(58).string(t.translationId),void 0!==t.language&&e.uint32(66).string(t.language),void 0!==t.message&&e.uint32(74).string(t.message),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(17!==t)break;a.duration=o.double();continue;case 4:if(32!==t)break;a.status=o.int32();continue;case 5:if(40!==t)break;a.remainingTime=o.int32();continue;case 6:if(48!==t)break;a.unknown0=o.int32();continue;case 7:if(58!==t)break;a.translationId=o.string();continue;case 8:if(66!==t)break;a.language=o.string();continue;case 9:if(74!==t)break;a.message=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):void 0,duration:Ht(t.duration)?globalThis.Number(t.duration):void 0,status:Ht(t.status)?globalThis.Number(t.status):0,remainingTime:Ht(t.remainingTime)?globalThis.Number(t.remainingTime):void 0,unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):void 0,translationId:Ht(t.translationId)?globalThis.String(t.translationId):"",language:Ht(t.language)?globalThis.String(t.language):void 0,message:Ht(t.message)?globalThis.String(t.message):void 0}),toJSON(t){const e={};return void 0!==t.url&&(e.url=t.url),void 0!==t.duration&&(e.duration=t.duration),0!==t.status&&(e.status=Math.round(t.status)),void 0!==t.remainingTime&&(e.remainingTime=Math.round(t.remainingTime)),void 0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translationId&&(e.translationId=t.translationId),void 0!==t.language&&(e.language=t.language),void 0!==t.message&&(e.message=t.message),e},create:t=>Lt.fromPartial(t??{}),fromPartial(t){const e={url:void 0,duration:void 0,status:0,remainingTime:void 0,unknown0:void 0,translationId:"",language:void 0,message:void 0};return e.url=t.url??void 0,e.duration=t.duration??void 0,e.status=t.status??0,e.remainingTime=t.remainingTime??void 0,e.unknown0=t.unknown0??void 0,e.translationId=t.translationId??"",e.language=t.language??void 0,e.message=t.message??void 0,e}};function _t(){return{audioFile:new Uint8Array(0),fileId:""}}const At={encode:(t,e=kt.Writer.create())=>(0!==t.audioFile.length&&e.uint32(18).bytes(t.audioFile),""!==t.fileId&&e.uint32(10).string(t.fileId),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a=_t();for(;o.pos>>3){case 2:if(18!==t)break;a.audioFile=o.bytes();continue;case 1:if(10!==t)break;a.fileId=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioFile:Ht(t.audioFile)?zt(t.audioFile):new Uint8Array(0),fileId:Ht(t.fileId)?globalThis.String(t.fileId):""}),toJSON(t){const e={};return 0!==t.audioFile.length&&(e.audioFile=function(t){if(globalThis.Buffer)return globalThis.Buffer.from(t).toString("base64");{const e=[];return t.forEach((t=>{e.push(globalThis.String.fromCharCode(t))})),globalThis.btoa(e.join(""))}}(t.audioFile)),""!==t.fileId&&(e.fileId=t.fileId),e},create:t=>At.fromPartial(t??{}),fromPartial(t){const e=_t();return e.audioFile=t.audioFile??new Uint8Array(0),e.fileId=t.fileId??"",e}};const Vt={encode:(t,e=kt.Writer.create())=>(0!==t.audioPartsLength&&e.uint32(16).int32(t.audioPartsLength),void 0!==t.audioBuffer&&At.encode(t.audioBuffer,e.uint32(10).fork()).ldelim(),""!==t.fileId&&e.uint32(26).string(t.fileId),0!==t.unknown0&&e.uint32(32).int32(t.unknown0),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};for(;o.pos>>3){case 2:if(16!==t)break;a.audioPartsLength=o.int32();continue;case 1:if(10!==t)break;a.audioBuffer=At.decode(o,o.uint32());continue;case 3:if(26!==t)break;a.fileId=o.string();continue;case 4:if(32!==t)break;a.unknown0=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({audioPartsLength:Ht(t.audioPartsLength)?globalThis.Number(t.audioPartsLength):0,audioBuffer:Ht(t.audioBuffer)?At.fromJSON(t.audioBuffer):void 0,fileId:Ht(t.fileId)?globalThis.String(t.fileId):"",unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):0}),toJSON(t){const e={};return 0!==t.audioPartsLength&&(e.audioPartsLength=Math.round(t.audioPartsLength)),void 0!==t.audioBuffer&&(e.audioBuffer=At.toJSON(t.audioBuffer)),""!==t.fileId&&(e.fileId=t.fileId),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),e},create:t=>Vt.fromPartial(t??{}),fromPartial(t){const e={audioPartsLength:0,audioBuffer:void 0,fileId:"",unknown0:0};return e.audioPartsLength=t.audioPartsLength??0,e.audioBuffer=void 0!==t.audioBuffer&&null!==t.audioBuffer?At.fromPartial(t.audioBuffer):void 0,e.fileId=t.fileId??"",e.unknown0=t.unknown0??0,e}};const Ot={encode:(t,e=kt.Writer.create())=>(""!==t.translationId&&e.uint32(10).string(t.translationId),""!==t.url&&e.uint32(18).string(t.url),void 0!==t.partialAudioInfo&&Vt.encode(t.partialAudioInfo,e.uint32(34).fork()).ldelim(),void 0!==t.audioInfo&&At.encode(t.audioInfo,e.uint32(50).fork()).ldelim(),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};for(;o.pos>>3){case 1:if(10!==t)break;a.translationId=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 4:if(34!==t)break;a.partialAudioInfo=Vt.decode(o,o.uint32());continue;case 6:if(50!==t)break;a.audioInfo=At.decode(o,o.uint32());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({translationId:Ht(t.translationId)?globalThis.String(t.translationId):"",url:Ht(t.url)?globalThis.String(t.url):"",partialAudioInfo:Ht(t.partialAudioInfo)?Vt.fromJSON(t.partialAudioInfo):void 0,audioInfo:Ht(t.audioInfo)?At.fromJSON(t.audioInfo):void 0}),toJSON(t){const e={};return""!==t.translationId&&(e.translationId=t.translationId),""!==t.url&&(e.url=t.url),void 0!==t.partialAudioInfo&&(e.partialAudioInfo=Vt.toJSON(t.partialAudioInfo)),void 0!==t.audioInfo&&(e.audioInfo=At.toJSON(t.audioInfo)),e},create:t=>Ot.fromPartial(t??{}),fromPartial(t){const e={translationId:"",url:"",partialAudioInfo:void 0,audioInfo:void 0};return e.translationId=t.translationId??"",e.url=t.url??"",e.partialAudioInfo=void 0!==t.partialAudioInfo&&null!==t.partialAudioInfo?Vt.fromPartial(t.partialAudioInfo):void 0,e.audioInfo=void 0!==t.audioInfo&&null!==t.audioInfo?At.fromPartial(t.audioInfo):void 0,e}};const Mt={encode(t,e=kt.Writer.create()){0!==t.status&&e.uint32(8).int32(t.status);for(const o of t.remainingChunks)e.uint32(18).string(o);return e},decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={status:0,remainingChunks:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.status=o.int32();continue;case 2:if(18!==t)break;a.remainingChunks.push(o.string());continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({status:Ht(t.status)?globalThis.Number(t.status):0,remainingChunks:globalThis.Array.isArray(t?.remainingChunks)?t.remainingChunks.map((t=>globalThis.String(t))):[]}),toJSON(t){const e={};return 0!==t.status&&(e.status=Math.round(t.status)),t.remainingChunks?.length&&(e.remainingChunks=t.remainingChunks),e},create:t=>Mt.fromPartial(t??{}),fromPartial(t){const e={status:0,remainingChunks:[]};return e.status=t.status??0,e.remainingChunks=t.remainingChunks?.map((t=>t))||[],e}};const Et={encode:(t,e=kt.Writer.create())=>(""!==t.language&&e.uint32(10).string(t.language),""!==t.url&&e.uint32(18).string(t.url),0!==t.unknown0&&e.uint32(24).int32(t.unknown0),""!==t.translatedLanguage&&e.uint32(34).string(t.translatedLanguage),""!==t.translatedUrl&&e.uint32(42).string(t.translatedUrl),0!==t.unknown1&&e.uint32(48).int32(t.unknown1),0!==t.unknown2&&e.uint32(56).int32(t.unknown2),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};for(;o.pos>>3){case 1:if(10!==t)break;a.language=o.string();continue;case 2:if(18!==t)break;a.url=o.string();continue;case 3:if(24!==t)break;a.unknown0=o.int32();continue;case 4:if(34!==t)break;a.translatedLanguage=o.string();continue;case 5:if(42!==t)break;a.translatedUrl=o.string();continue;case 6:if(48!==t)break;a.unknown1=o.int32();continue;case 7:if(56!==t)break;a.unknown2=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({language:Ht(t.language)?globalThis.String(t.language):"",url:Ht(t.url)?globalThis.String(t.url):"",unknown0:Ht(t.unknown0)?globalThis.Number(t.unknown0):0,translatedLanguage:Ht(t.translatedLanguage)?globalThis.String(t.translatedLanguage):"",translatedUrl:Ht(t.translatedUrl)?globalThis.String(t.translatedUrl):"",unknown1:Ht(t.unknown1)?globalThis.Number(t.unknown1):0,unknown2:Ht(t.unknown2)?globalThis.Number(t.unknown2):0}),toJSON(t){const e={};return""!==t.language&&(e.language=t.language),""!==t.url&&(e.url=t.url),0!==t.unknown0&&(e.unknown0=Math.round(t.unknown0)),""!==t.translatedLanguage&&(e.translatedLanguage=t.translatedLanguage),""!==t.translatedUrl&&(e.translatedUrl=t.translatedUrl),0!==t.unknown1&&(e.unknown1=Math.round(t.unknown1)),0!==t.unknown2&&(e.unknown2=Math.round(t.unknown2)),e},create:t=>Et.fromPartial(t??{}),fromPartial(t){const e={language:"",url:"",unknown0:0,translatedLanguage:"",translatedUrl:"",unknown1:0,unknown2:0};return e.language=t.language??"",e.url=t.url??"",e.unknown0=t.unknown0??0,e.translatedLanguage=t.translatedLanguage??"",e.translatedUrl=t.translatedUrl??"",e.unknown1=t.unknown1??0,e.unknown2=t.unknown2??0,e}};const Bt={encode:(t,e=kt.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",language:Ht(t.language)?globalThis.String(t.language):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),e},create:t=>Bt.fromPartial(t??{}),fromPartial(t){const e={url:"",language:""};return e.url=t.url??"",e.language=t.language??"",e}};const Nt={encode(t,e=kt.Writer.create()){!1!==t.waiting&&e.uint32(8).bool(t.waiting);for(const o of t.subtitles)Et.encode(o,e.uint32(18).fork()).ldelim();return e},decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={waiting:!1,subtitles:[]};for(;o.pos>>3){case 1:if(8!==t)break;a.waiting=o.bool();continue;case 2:if(18!==t)break;a.subtitles.push(Et.decode(o,o.uint32()));continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({waiting:!!Ht(t.waiting)&&globalThis.Boolean(t.waiting),subtitles:globalThis.Array.isArray(t?.subtitles)?t.subtitles.map((t=>Et.fromJSON(t))):[]}),toJSON(t){const e={};return!1!==t.waiting&&(e.waiting=t.waiting),t.subtitles?.length&&(e.subtitles=t.subtitles.map((t=>Et.toJSON(t)))),e},create:t=>Nt.fromPartial(t??{}),fromPartial(t){const e={waiting:!1,subtitles:[]};return e.waiting=t.waiting??!1,e.subtitles=t.subtitles?.map((t=>Et.fromPartial(t)))||[],e}};const Rt={encode:(t,e=kt.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.timestamp&&e.uint32(18).string(t.timestamp),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",timestamp:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.timestamp=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",timestamp:Ht(t.timestamp)?globalThis.String(t.timestamp):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.timestamp&&(e.timestamp=t.timestamp),e},create:t=>Rt.fromPartial(t??{}),fromPartial(t){const e={url:"",timestamp:""};return e.url=t.url??"",e.timestamp=t.timestamp??"",e}};const $t={encode:(t,e=kt.Writer.create())=>(""!==t.url&&e.uint32(10).string(t.url),""!==t.language&&e.uint32(18).string(t.language),""!==t.responseLanguage&&e.uint32(26).string(t.responseLanguage),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={url:"",language:"",responseLanguage:""};for(;o.pos>>3){case 1:if(10!==t)break;a.url=o.string();continue;case 2:if(18!==t)break;a.language=o.string();continue;case 3:if(26!==t)break;a.responseLanguage=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({url:Ht(t.url)?globalThis.String(t.url):"",language:Ht(t.language)?globalThis.String(t.language):"",responseLanguage:Ht(t.responseLanguage)?globalThis.String(t.responseLanguage):""}),toJSON(t){const e={};return""!==t.url&&(e.url=t.url),""!==t.language&&(e.language=t.language),""!==t.responseLanguage&&(e.responseLanguage=t.responseLanguage),e},create:t=>$t.fromPartial(t??{}),fromPartial(t){const e={url:"",language:"",responseLanguage:""};return e.url=t.url??"",e.language=t.language??"",e.responseLanguage=t.responseLanguage??"",e}};const Dt={encode:(t,e=kt.Writer.create())=>(0!==t.interval&&e.uint32(8).int32(t.interval),void 0!==t.translatedInfo&&Rt.encode(t.translatedInfo,e.uint32(18).fork()).ldelim(),void 0!==t.pingId&&e.uint32(24).int32(t.pingId),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={interval:0,translatedInfo:void 0,pingId:void 0};for(;o.pos>>3){case 1:if(8!==t)break;a.interval=o.int32();continue;case 2:if(18!==t)break;a.translatedInfo=Rt.decode(o,o.uint32());continue;case 3:if(24!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({interval:Ht(t.interval)?Ct(t.interval):0,translatedInfo:Ht(t.translatedInfo)?Rt.fromJSON(t.translatedInfo):void 0,pingId:Ht(t.pingId)?globalThis.Number(t.pingId):void 0}),toJSON(t){const e={};return 0!==t.interval&&(e.interval=function(t){switch(t){case Tt.NO_CONNECTION:return"NO_CONNECTION";case Tt.TRANSLATING:return"TRANSLATING";case Tt.STREAMING:return"STREAMING";case Tt.UNRECOGNIZED:default:return"UNRECOGNIZED"}}(t.interval)),void 0!==t.translatedInfo&&(e.translatedInfo=Rt.toJSON(t.translatedInfo)),void 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>Dt.fromPartial(t??{}),fromPartial(t){const e={interval:0,translatedInfo:void 0,pingId:void 0};return e.interval=t.interval??0,e.translatedInfo=void 0!==t.translatedInfo&&null!==t.translatedInfo?Rt.fromPartial(t.translatedInfo):void 0,e.pingId=t.pingId??void 0,e}};const Ft={encode:(t,e=kt.Writer.create())=>(0!==t.pingId&&e.uint32(8).int32(t.pingId),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={pingId:0};for(;o.pos>>3){case 1:if(8!==t)break;a.pingId=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({pingId:Ht(t.pingId)?globalThis.Number(t.pingId):0}),toJSON(t){const e={};return 0!==t.pingId&&(e.pingId=Math.round(t.pingId)),e},create:t=>Ft.fromPartial(t??{}),fromPartial(t){const e={pingId:0};return e.pingId=t.pingId??0,e}};const Ut={encode:(t,e=kt.Writer.create())=>(""!==t.uuid&&e.uint32(10).string(t.uuid),""!==t.module&&e.uint32(18).string(t.module),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={uuid:"",module:""};for(;o.pos>>3){case 1:if(10!==t)break;a.uuid=o.string();continue;case 2:if(18!==t)break;a.module=o.string();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({uuid:Ht(t.uuid)?globalThis.String(t.uuid):"",module:Ht(t.module)?globalThis.String(t.module):""}),toJSON(t){const e={};return""!==t.uuid&&(e.uuid=t.uuid),""!==t.module&&(e.module=t.module),e},create:t=>Ut.fromPartial(t??{}),fromPartial(t){const e={uuid:"",module:""};return e.uuid=t.uuid??"",e.module=t.module??"",e}};const qt={encode:(t,e=kt.Writer.create())=>(""!==t.secretKey&&e.uint32(10).string(t.secretKey),0!==t.expires&&e.uint32(16).int32(t.expires),e),decode(t,e){const o=t instanceof kt.Reader?t:kt.Reader.create(t);let i=void 0===e?o.len:o.pos+e;const a={secretKey:"",expires:0};for(;o.pos>>3){case 1:if(10!==t)break;a.secretKey=o.string();continue;case 2:if(16!==t)break;a.expires=o.int32();continue}if(4==(7&t)||0===t)break;o.skipType(7&t)}return a},fromJSON:t=>({secretKey:Ht(t.secretKey)?globalThis.String(t.secretKey):"",expires:Ht(t.expires)?globalThis.Number(t.expires):0}),toJSON(t){const e={};return""!==t.secretKey&&(e.secretKey=t.secretKey),0!==t.expires&&(e.expires=Math.round(t.expires)),e},create:t=>qt.fromPartial(t??{}),fromPartial(t){const e={secretKey:"",expires:0};return e.secretKey=t.secretKey??"",e.expires=t.expires??0,e}};function zt(t){if(globalThis.Buffer)return Uint8Array.from(globalThis.Buffer.from(t,"base64"));{const e=globalThis.atob(t),o=new Uint8Array(e.length);for(let t=0;tt+e.toString(16).padStart(2,"0")),"")}async function Yt(t,e,o,i){const{secretKey:a,uuid:n}=e,r=await Gt(o),s=`${n}:${i}:${wt.componentVersion}`,l=Wt.encode(s);return{[`${t}-Signature`]:r,[`Sec-${t}-Sk`]:a,[`Sec-${t}-Token`]:`${await Gt(l)}:${s}`}}const Jt={afr:"af",aka:"ak",alb:"sq",amh:"am",ara:"ar",arm:"hy",asm:"as",aym:"ay",aze:"az",baq:"eu",bel:"be",ben:"bn",bos:"bs",bul:"bg",bur:"my",cat:"ca",chi:"zh",cos:"co",cze:"cs",dan:"da",div:"dv",dut:"nl",eng:"en",epo:"eo",est:"et",ewe:"ee",fin:"fi",fre:"fr",fry:"fy",geo:"ka",ger:"de",gla:"gd",gle:"ga",glg:"gl",gre:"el",grn:"gn",guj:"gu",hat:"ht",hau:"ha",hin:"hi",hrv:"hr",hun:"hu",ibo:"ig",ice:"is",ind:"id",ita:"it",jav:"jv",jpn:"ja",kan:"kn",kaz:"kk",khm:"km",kin:"rw",kir:"ky",kor:"ko",kur:"ku",lao:"lo",lat:"la",lav:"lv",lin:"ln",lit:"lt",ltz:"lb",lug:"lg",mac:"mk",mal:"ml",mao:"mi",mar:"mr",may:"ms",mlg:"mg",mlt:"mt",mon:"mn",nep:"ne",nor:"no",nya:"ny",ori:"or",orm:"om",pan:"pa",per:"fa",pol:"pl",por:"pt",pus:"ps",que:"qu",rum:"ro",rus:"ru",san:"sa",sin:"si",slo:"sk",slv:"sl",smo:"sm",sna:"sn",snd:"sd",som:"so",sot:"st",spa:"es",srp:"sr",sun:"su",swa:"sw",swe:"sv",tam:"ta",tat:"tt",tel:"te",tgk:"tg",tha:"th",tir:"ti",tso:"ts",tuk:"tk",tur:"tr",uig:"ug",ukr:"uk",urd:"ur",uzb:"uz",vie:"vi",wel:"cy",xho:"xh",yid:"yi",yor:"yo",zul:"zu"};async function Kt(t,e={headers:{"User-Agent":wt.userAgent}}){const{timeout:o=3e3,...i}=e,a=new AbortController,n=setTimeout((()=>a.abort()),o),r=await fetch(t,{signal:a.signal,...i});return clearTimeout(n),r}function Zt(t){return 3===t.length?Jt[t]:t.toLowerCase().split(/[_;-]/)[0].trim()}function Xt(t,e="mp4"){const o=`https://${wt.mediaProxy}/v1/proxy/video.${e}?format=base64&force=true`;return t instanceof URL?`${o}&url=${btoa(t.href)}&origin=${t.origin}&referer=${t.origin}`:`${o}&url=${btoa(t)}`}const Qt={encodeTranslationRequest:(t,e,o,i,a,{forceSourceLang:n=!1,bypassCache:r=!1,useNewModel:s=!0}={})=>Pt.encode({url:t,firstRequest:!0,duration:e,unknown0:1,language:o,forceSourceLang:n,unknown1:0,translationHelp:a||[],responseLanguage:i,unknown2:1,unknown3:1,bypassCache:r,useNewModel:s}).finish(),decodeTranslationResponse:t=>Lt.decode(new Uint8Array(t)),encodeTranslationAudioRequest:(t,e,o,i)=>Ot.encode({url:t,translationId:e,...i?{partialAudioInfo:{...i,audioBuffer:o}}:{audioInfo:o}}).finish(),decodeTranslationAudioResponse:t=>Mt.decode(new Uint8Array(t)),encodeSubtitlesRequest:(t,e)=>Bt.encode({url:t,language:e}).finish(),decodeSubtitlesResponse:t=>Nt.decode(new Uint8Array(t)),encodeStreamPingRequest:t=>Ft.encode({pingId:t}).finish(),encodeStreamRequest:(t,e,o)=>$t.encode({url:t,language:e,responseLanguage:o}).finish(),decodeStreamResponse:t=>Dt.decode(new Uint8Array(t)),encodeYandexSessionRequest:(t,e)=>Ut.encode({uuid:t,module:e}).finish(),decodeYandexSessionResponse:t=>qt.decode(new Uint8Array(t))};var te,ee,oe;!function(t){t[t.FAILED=0]="FAILED",t[t.FINISHED=1]="FINISHED",t[t.WAITING=2]="WAITING",t[t.LONG_WAITING=3]="LONG_WAITING",t[t.PART_CONTENT=5]="PART_CONTENT",t[t.AUDIO_REQUESTED=6]="AUDIO_REQUESTED"}(te||(te={})),function(t){t.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME="web_api_get_all_generating_urls_data_from_iframe",t.WEB_API_REPLACED_FETCH_INSIDE_IFRAME="web_api_replaced_fetch_inside_iframe",t.WEB_API_REPLACED_FETCH_FORCE_REQUEST_WITH_SEEK="web_api_replaced_fetch_force_request_with_seek",t.WEB_API_REPLACED_FETCH="web_api_replaced_fetch",t.ANDROID_API="android_api",t.WEB_API_SLOW="web_api_slow"}(ee||(ee={})),function(t){t.custom="custom",t.directlink="custom",t.youtube="youtube",t.piped="piped",t.invidious="invidious",t.vk="vk",t.nine_gag="nine_gag",t.gag="nine_gag",t.twitch="twitch",t.proxitok="proxitok",t.tiktok="tiktok",t.vimeo="vimeo",t.xvideos="xvideos",t.pornhub="pornhub",t.twitter="twitter",t.x="twitter",t.rumble="rumble",t.facebook="facebook",t.rutube="rutube",t.coub="coub",t.bilibili="bilibili",t.mail_ru="mailru",t.mailru="mailru",t.bitchute="bitchute",t.eporner="eporner",t.peertube="peertube",t.dailymotion="dailymotion",t.trovo="trovo",t.yandexdisk="yandexdisk",t.ok_ru="okru",t.okru="okru",t.googledrive="googledrive",t.bannedvideo="bannedvideo",t.weverse="weverse",t.newgrounds="newgrounds",t.egghead="egghead",t.youku="youku",t.archive="archive",t.kodik="kodik",t.patreon="patreon",t.reddit="reddit",t.kick="kick",t.apple_developer="apple_developer",t.appledeveloper="apple_developer",t.poketube="poketube",t.epicgames="epicgames",t.nineanimetv="nineanimetv",t.odysee="odysee",t.coursehunterLike="coursehunterLike",t.sap="sap",t.watchpornto="watchpornto",t.linkedin="linkedin",t.ricktube="ricktube",t.incestflix="incestflix",t.porntn="porntn",t.dzen="dzen",t.cloudflarestream="cloudflarestream",t.loom="loom",t.rtnews="rtnews"}(oe||(oe={}));const ie=JSON.parse('{"recommended":"recommended","translateVideo":"Translate video","disableTranslate":"Turn off","translationSettings":"Translation settings","subtitlesSettings":"Subtitles settings","about":"About extension","resetSettings":"Reset settings","videoBeingTranslated":"The video is being translated","videoLanguage":"Video language","translationLanguage":"Translation language","translationTake":"The translation will take","translationTakeMoreThanHour":"The translation will take more than an hour","translationTakeAboutMinute":"The translation will take about a minute","translationTakeFewMinutes":"The translation will take a few minutes","translationTakeApproximatelyMinutes":"The translation will take approximately {0} minutes","translationTakeApproximatelyMinute":"The translation will take approximately {0} minutes","requestTranslationFailed":"Failed to request video translation","audioNotReceived":"Audio link not received","audioFormatNotSupported":"The audio format is not supported","VOTAutoTranslate":"Translate on open","VOTDontTranslateYourLang":"Don\'t translate from my language","VOTVolume":"Video volume","VOTVolumeTranslation":"Translation Volume","VOTAutoSetVolume":"Reduce video volume to ","VOTShowVideoSlider":"Video volume slider","VOTSyncVolume":"Link translation and video volume","VOTDisableFromYourLang":"You have disabled the translation of the video in your language","VOTVideoIsTooLong":"Video is too long","VOTNoVideoIDFound":"No video ID found","VOTSubtitles":"Subtitles","VOTSubtitlesDisabled":"Disabled","VOTSubtitlesMaxLength":"Subtitles max length","VOTHighlightWords":"Highlight words","VOTTranslatedFrom":"translated from","VOTAutogenerated":"autogenerated","VOTSettings":"VOT Settings","VOTMenuLanguage":"Menu language","VOTAuthors":"Authors","VOTVersion":"Version","VOTLoader":"Loader","VOTBrowser":"Browser","VOTShowPiPButton":"Show PiP button","langs":{"auto":"Auto","af":"Afrikaans","ak":"Akan","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","as":"Assamese","ay":"Aymara","az":"Azerbaijani","bn":"Bangla","eu":"Basque","be":"Belarusian","bho":"Bhojpuri","bs":"Bosnian","bg":"Bulgarian","my":"Burmese","ca":"Catalan","ceb":"Cebuano","zh":"Chinese","zh-Hans":"Chinese (Simplified)","zh-Hant":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","dv":"Divehi","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","ee":"Ewe","fil":"Filipino","fi":"Finnish","fr":"French","gl":"Galician","lg":"Ganda","ka":"Georgian","de":"German","el":"Greek","gn":"Guarani","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jv":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","rw":"Kinyarwanda","ko":"Korean","kri":"Krio","ku":"Kurdish","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","ln":"Lingala","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Māori","mr":"Marathi","mn":"Mongolian","ne":"Nepali","nso":"Northern Sotho","no":"Norwegian","ny":"Nyanja","or":"Odia","om":"Oromo","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","qu":"Quechua","ro":"Romanian","ru":"Russian","sm":"Samoan","sa":"Sanskrit","gd":"Scottish Gaelic","sr":"Serbian","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","st":"Southern Sotho","es":"Spanish","su":"Sundanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","tt":"Tatar","te":"Telugu","th":"Thai","ti":"Tigrinya","ts":"Tsonga","tr":"Turkish","tk":"Turkmen","uk":"Ukrainian","ur":"Urdu","ug":"Uyghur","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","fy":"Western Frisian","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"},"streamNoConnectionToServer":"There is no connection to the server","searchField":"Search...","VOTTranslateAPIErrors":"Translate errors from the API","VOTDetectService":"Language detection service","VOTProxyWorkerHost":"Enter the proxy worker address","VOTM3u8ProxyHost":"Enter the address of the m3u8 proxy worker","proxySettings":"Proxy Settings","translationTakeApproximatelyMinute2":"The translation will take approximately {0} minutes","VOTAudioBooster":"Extended translation volume increase","VOTSubtitlesDesign":"Subtitles design","VOTSubtitlesFontSize":"Font size of subtitles","VOTSubtitlesOpacity":"Transparency of the subtitle background","VOTPressNewHotkey":"Press the new hotkey...","VOTCreateTranslationHotkey":"Create Hotkey for Translation","VOTChangeHotkeyWithCurrent":"Change Hotkey (Current: {0})","VOTSubtitlesDownloadFormat":"The format for downloading subtitles","VOTDownloadWithName":"Download files with the video name","VOTUpdateLocaleFiles":"Update localization files","VOTLocaleHash":"Locale hash","VOTUpdatedAt":"Updated at","VOTNeedWebAudioAPI":"To enable this, you must have a Web Audio API","VOTMediaCSPEnabledOnSite":"Media CSP is enabled on this site","VOTOnlyBypassMediaCSP":"Use it only for bypassing Media CSP","VOTNewAudioPlayer":"Use the new audio player","VOTUseNewModel":"Use an experimental variation of Yandex voices for some videos","VOTTranslationErrorsService":"Error translation service","TranslationDelayed":"The translation is slightly delayed","VOTTranslationCompletedNotify":"The translation on the {0} has been completed!","VOTSendNotifyOnComplete":"Send a notification that the video has been translated","VOTBugReport":"Report a bug","VOTTranslateProxyDisabled":"Disabled","VOTTranslateProxyEnabled":"Enabled","VOTTranslateProxyEverything":"Proxy everything","VOTTranslateProxyStatus":"Proxying mode"}'),ae={log:(...t)=>{}},ne="media-proxy.toil.cc/v1/proxy/m3u8",re="vot-worker.toil.cc",se=.15,le="yandexbrowser",de="yandexbrowser",ue=["FireMonkey","Greasemonkey","AdGuard","OrangeMonkey","Userscripts","Other (Polyfill)"];async function ce(t,e,o,i,a=void 0){(a??t[e])===o&&(t[e]=i,await he.set(e,i),console.log(`[VOT] Old ${e} converted to new ${i}`))}const he=new class{gmSupport;constructor(){this.gmSupport="function"==typeof GM_getValue,ae.log(`GM Storage Status: ${this.gmSupport}`)}syncGet(t,e=void 0){if(this.gmSupport)return GM_getValue(t,e);const o="number"==typeof e;const i=window.localStorage.getItem(t)??e;return o?Number(i):i}async get(t,e=void 0){return this.gmSupport?await GM_getValue(t,e):Promise.resolve(this.syncGet(t,e))}syncSet(t,e){return this.gmSupport?GM_setValue(t,e):window.localStorage.setItem(t,e)}async set(t,e){return this.gmSupport?await GM_setValue(t,e):Promise.resolve(this.syncSet(t,e))}syncDelete(t){return this.gmSupport?GM_deleteValue(t):window.localStorage.removeItem(t)}async delete(t){return this.gmSupport?await GM_deleteValue(t):Promise.resolve(this.syncDelete(t))}syncList(){return this.gmSupport?GM_listValues():["autoTranslate","dontTranslateLanguage","dontTranslateYourLang","autoSetVolumeYandexStyle","autoVolume","buttonPos","showVideoSlider","syncVolume","subtitlesMaxLength","highlightWords","responseLanguage","defaultVolume","audioProxy","showPiPButton","translateAPIErrors","translationService","detectService","m3u8ProxyHost","translateProxyEnabled","hotkeyButton","proxyWorkerHost","audioBooster","locale-version","locale-lang","locale-phrases"]}async list(){return this.gmSupport?await GM_listValues():Promise.resolve(this.syncList())}},pe=navigator.language||navigator.userLanguage,ge=pe?.substr(0,2)?.toLowerCase()??"en";function me(){return"pictureInPictureEnabled"in document&&document.pictureInPictureEnabled}function ve(){return"undefined"!=typeof Hls&&Hls?.isSupported()?new Hls({debug:!1,lowLatencyMode:!0,backBufferLength:90}):void 0}const fe=new RegExp([/(?:https?|ftp):\/\/\S+/g,/https?:\/\/\S+|www\.\S+/gm,/\b\S+\.\S+/gm,/#[^\s#]+/g,/Auto-generated by YouTube/g,/Provided to YouTube by/g,/Released on/g,/0x[a-fA-F0-9]{40}/g,/[13][a-km-zA-HJ-NP-Z1-9]{25,34}/g,/4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}/g,/Paypal/g].map((t=>t.source)).join("|"));function be(t,e){const o=URL.createObjectURL(t),i=document.createElement("a");i.href=o,i.download=e,i.click(),URL.revokeObjectURL(o)}function ye(t){return 0===t.trim().length?(new Date).toLocaleDateString("en-us").replaceAll("/","-"):t.replace(/[\\/:*?"'<>|]/g,"")}async function we(t,e={}){const{timeout:o=15e3,...i}=e,a=new AbortController;try{if(t.includes("api.browser.yandex.ru"))throw new Error("Preventing yandex cors");return await fetch(t,{signal:a.signal,...i})}catch(e){return ae.log("GM_fetch preventing CORS by GM_xmlhttpRequest",e.message),new Promise(((e,a)=>{GM_xmlhttpRequest({method:i.method||"GET",url:t,responseType:"blob",data:i.body,timeout:o,headers:i.headers||{},onload:t=>{const o=t.responseHeaders.split(/\r?\n/).reduce(((t,e)=>{const[,o,i]=e.match(/^([\w-]+): (.+)$/)||[];return o&&(t[o]=i),t}),{}),i=new Response(t.response,{status:t.status,headers:o});Object.defineProperty(i,"url",{value:t.finalUrl??""}),e(i)},ontimeout:()=>a(new Error("Timeout")),onerror:t=>a(new Error(t)),onabort:()=>a(new Error("AbortError"))})}))}}function xe(){return Math.floor(Date.now()/1e3)}const Se="https://raw.githubusercontent.com/ilyhalight/voice-over-translation/master/src/localization",ke=["auto","en","ru","af","am","ar","az","bg","bn","bs","ca","cs","cy","da","de","el","es","et","eu","fa","fi","fr","gl","hi","hr","hu","hy","id","it","ja","jv","kk","km","kn","ko","lo","mk","ml","mn","ms","mt","my","ne","nl","pa","pl","pt","ro","si","sk","sl","sq","sr","su","sv","sw","tr","uk","ur","uz","vi","zh","zu"];const Te=new class{constructor(){this.gmValues=["locale-phrases","locale-lang","locale-hash","locale-updated-at","locale-lang-override"],this.lang=this.getLang(),this.locale={},this.setLocaleFromJsonString(he.syncGet("locale-phrases",""))}getLang(){const t=he.syncGet("locale-lang-override","auto");return"auto"!==t?t:ge}reset(){for(const t of this.gmValues)he.syncDelete(t)}async checkUpdates(t=!1){ae.log("Check locale updates...");try{const e=await we(`${Se}/hashes.json${t?`?timestamp=${xe()}`:""}`);if(!e.ok)throw e.status;const o=await e.json();return await he.get("locale-hash")!==o[this.lang]&&o[this.lang]}catch(t){return console.error("[VOT] [localizationProvider] Failed to get locales hash:",t),!1}}async update(t=!1){const e=await he.get("locale-updated-at",0);if(!t&&e+7200>xe()&&await he.get("locale-lang")===this.lang)return;const o=await this.checkUpdates(t);if(await he.set("locale-updated-at",xe()),o){ae.log("Updating locale...");try{const e=await we(`${Se}/locales/${this.lang}.json${t?`?timestamp=${xe()}`:""}`);if(!e.ok)throw e.status;const i=await e.text();await he.set("locale-phrases",i),await he.set("locale-hash",o),await he.set("locale-lang",this.lang),this.setLocaleFromJsonString(i)}catch(t){console.error("[VOT] [localizationProvider] Failed to get locale:",t),this.setLocaleFromJsonString(await he.get("locale-phrases",""))}}}setLocaleFromJsonString(t){try{this.locale=JSON.parse(t)||{}}catch(t){console.error("[VOT] [localizationProvider]",t),this.locale={}}}getFromLocale(t,e){return e.split(".").reduce(((t,e)=>t?.[e]),t)??this.warnMissingKey(t,e)}warnMissingKey(t,e){console.warn("[VOT] [localizationProvider] locale",t,"doesn't contain key",e)}getDefault(t){return this.getFromLocale(ie,t)??t}get(t){return this.getFromLocale(this.locale,t)??this.getDefault(t)}};class Ce extends Error{constructor(t){super(Te.getDefault(t)),this.name="VOTLocalizedError",this.unlocalizedMessage=t,this.localizedMessage=Te.get(t)}}class Ie extends Error{data;constructor(t,e=void 0){super(t),this.data=e,this.name="VOTJSError",this.message=t}}class Pe{host;hostVOT;schema;schemaVOT;fetch;fetchOpts;sessions={};requestLang;responseLang;userAgent=wt.userAgent;paths={videoTranslation:"/video-translation/translate",videoTranslationFailAudio:"/video-translation/fail-audio-js",videoTranslationAudio:"/video-translation/audio",videoSubtitles:"/video-subtitles/get-subtitles",streamPing:"/stream-translation/ping-stream",streamTranslation:"/stream-translation/translate-stream",createSession:"/session/create"};isCustomLink(t){return!!(/\.(m3u8|m4(a|v)|mpd)/.exec(t)??/^https:\/\/cdn\.qstv\.on\.epicgames\.com/.exec(t))}headers={"User-Agent":this.userAgent,Accept:"application/x-protobuf","Accept-Language":"en","Content-Type":"application/x-protobuf",Pragma:"no-cache","Cache-Control":"no-cache","Sec-Fetch-Mode":"no-cors"};headersVOT={"User-Agent":`vot.js/${wt.version}`,"Content-Type":"application/json",Pragma:"no-cache","Cache-Control":"no-cache"};constructor({host:t=wt.host,hostVOT:e=wt.hostVOT,fetchFn:o=Kt,fetchOpts:i={},requestLang:a="en",responseLang:n="ru",headers:r={}}={}){const s=/(http(s)?):\/\//,l=s.exec(t)?.[1];this.host=l?t.replace(`${l}://`,""):t,this.schema=l??"https";const d=s.exec(e)?.[1];this.hostVOT=d?e.replace(`${d}://`,""):e,this.schemaVOT=d??"https",this.fetch=o,this.fetchOpts=i,this.requestLang=a,this.responseLang=n,this.headers={...this.headers,...r}}getOpts(t,e={},o="POST"){return{method:o,headers:{...this.headers,...e},body:t,...this.fetchOpts}}async request(t,e,o={},i="POST"){const a=this.getOpts(new Blob([e]),o,i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(e,{"Content-Type":"application/json",...o},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestVOT(t,e,o={}){const i=this.getOpts(JSON.stringify(e),{...this.headersVOT,...o});try{const e=await this.fetch(`${this.schemaVOT}://${this.hostVOT}${t}`,i),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async getSession(t){const e=Math.floor(Date.now()/1e3),o=this.sessions[t];if(o&&o.timestamp+o.expires>e)return o;const{secretKey:i,expires:a,uuid:n}=await this.createSession(t);return this.sessions[t]={secretKey:i,expires:a,timestamp:e,uuid:n},this.sessions[t]}async translateVideoYAImpl({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},extraOpts:n={},shouldSendFailedAudio:r=!0}){const{url:s,duration:l=wt.defaultDuration}=t,d=await this.getSession("video-translation"),u=Qt.encodeTranslationRequest(s,l,e,o,i,n),c=this.paths.videoTranslation,h=await Yt("Vtrans",d,u,c),p=await this.request(c,u,{...h,...a});if(!p.success)throw new Ce("requestTranslationFailed");const g=Qt.decodeTranslationResponse(p.data);St.log("translateVideo",g);const{status:m,translationId:v}=g;switch(m){case te.FAILED:throw g?.message?new Ie("Yandex couldn't translate video",g):new Ce("requestTranslationFailed");case te.FINISHED:case te.PART_CONTENT:if(!g.url)throw new Ce("audioNotReceived");return{translationId:v,translated:!0,url:g.url,status:m,remainingTime:g.remainingTime??-1};case te.WAITING:case te.LONG_WAITING:return{translationId:v,translated:!1,status:m,remainingTime:g.remainingTime};case te.AUDIO_REQUESTED:return s.startsWith("https://youtu.be/")&&r?(await this.requestVtransFailAudio(s),await this.requestVtransAudio(s,g.translationId,{audioFile:new Uint8Array,fileId:ee.WEB_API_GET_ALL_GENERATING_URLS_DATA_FROM_IFRAME}),await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,shouldSendFailedAudio:!1})):{translationId:v,translated:!1,status:m,remainingTime:g.remainingTime??-1};default:throw St.error("Unknown response",g),new Ie("Unknown response from Yandex",g)}}async translateVideoVOTImpl({url:t,videoId:e,service:o,requestLang:i=this.requestLang,responseLang:a=this.responseLang,headers:n={}}){const r=function(t,e,o){return t===oe.patreon?{service:"mux",videoId:new URL(o).pathname.slice(1)}:{service:t,videoId:e}}(o,e,t),s=await this.requestVOT(this.paths.videoTranslation,{provider:"yandex",service:r.service,videoId:r.videoId,fromLang:i,toLang:a,rawVideo:t},n);if(!s.success)throw new Ce("requestTranslationFailed");const l=s.data;switch(l.status){case"failed":throw new Ie("Yandex couldn't translate video",l);case"success":if(!l.translatedUrl)throw new Ce("audioNotReceived");return{translationId:String(l.id),translated:!0,url:l.translatedUrl,status:1,remainingTime:-1};case"waiting":return{translationId:"",translated:!1,remainingTime:l.remainingTime,status:2,message:l.message}}}async requestVtransFailAudio(t){const e=await this.requestJSON(this.paths.videoTranslationFailAudio,JSON.stringify({video_url:t}),void 0,"PUT");if(!e.data||"string"==typeof e.data||1!==e.data.status)throw new Ie("Failed to request to fake video translation fail audio js",e);return e}async requestVtransAudio(t,e,o,i,a={}){const n=await this.getSession("video-translation"),r=Qt.encodeTranslationAudioRequest(t,e,o,i),s=this.paths.videoTranslationAudio,l=await Yt("Vtrans",n,r,s),d=await this.request(s,r,{...l,...a},"PUT");if(!d.success)throw new Ie("Failed to request video translation audio",d);return Qt.decodeTranslationAudioResponse(d.data)}async translateVideo({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,translationHelp:i=null,headers:a={},extraOpts:n={},shouldSendFailedAudio:r=!0}){const{url:s,videoId:l,host:d}=t;return this.isCustomLink(s)?await this.translateVideoVOTImpl({url:s,videoId:l,service:d,requestLang:e,responseLang:o,headers:a}):await this.translateVideoYAImpl({videoData:t,requestLang:e,responseLang:o,translationHelp:i,headers:a,extraOpts:n,shouldSendFailedAudio:r})}async getSubtitles({videoData:t,requestLang:e=this.requestLang,headers:o={}}){const{url:i}=t;if(this.isCustomLink(i))return{waiting:!1,subtitles:[]};const a=await this.getSession("video-translation"),n=Qt.encodeSubtitlesRequest(i,e),r=this.paths.videoSubtitles,s=await Yt("Vsubs",a,n,r),l=await this.request(r,n,{...s,...o});if(!l.success)throw new Ie("Failed to request video subtitles",l);return Qt.decodeSubtitlesResponse(l.data)}async pingStream({pingId:t,headers:e={}}){const o=await this.getSession("video-translation"),i=Qt.encodeStreamPingRequest(t),a=this.paths.streamPing,n=await Yt("Vtrans",o,i,a),r=await this.request(a,i,{...n,...e});if(!r.success)throw new Ie("Failed to request stream ping",r);return!0}async translateStream({videoData:t,requestLang:e=this.requestLang,responseLang:o=this.responseLang,headers:i={}}){const{url:a}=t;if(this.isCustomLink(a))throw new Ce("VOTStreamNotSupportedUrl");const n=await this.getSession("video-translation"),r=Qt.encodeStreamRequest(a,e,o),s=this.paths.streamTranslation,l=await Yt("Vtrans",n,r,s),d=await this.request(s,r,{...l,...i});if(!d.success)throw new Ie("Failed to request stream translation",d);const u=Qt.decodeStreamResponse(d.data),c=u.interval;switch(c){case Tt.NO_CONNECTION:case Tt.TRANSLATING:return{translated:!1,interval:c,message:c===Tt.NO_CONNECTION?"streamNoConnectionToServer":"translationTakeFewMinutes"};case Tt.STREAMING:return{translated:!0,interval:c,pingId:u.pingId,result:u.translatedInfo};default:throw St.error("Unknown response",u),new Ie("Unknown response from Yandex",u)}}async createSession(t){const e=function(){let t="";for(let e=0;e<32;e++)t+="0123456789ABCDEF"[Math.floor(16*Math.random())];return t}(),o=Qt.encodeYandexSessionRequest(e,t),i=await this.request(this.paths.createSession,o,{"Vtrans-Signature":await Gt(o)});if(!i.success)throw new Ie("Failed to request create session",i);return{...Qt.decodeYandexSessionResponse(i.data),uuid:e}}}class Le extends Pe{constructor(t={}){t.host=t.host??wt.hostWorker,super(t)}async request(t,e,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,...o},body:Array.from(e)}),{"Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.arrayBuffer();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}async requestJSON(t,e=null,o={},i="POST"){const a=this.getOpts(JSON.stringify({headers:{...this.headers,"Content-Type":"application/json",Accept:"application/json",...o},body:e}),{Accept:"application/json","Content-Type":"application/json"},i);try{const e=await this.fetch(`${this.schema}://${this.host}${t}`,a),o=await e.json();return{success:200===e.status,data:o}}catch(t){return{success:!1,data:t?.message}}}}const{componentVersion:_e}=wt,Ae={"sec-ch-ua":`"Chromium";v="130", "YaBrowser";v="${_e.slice(0,5)}", "Not?A_Brand";v="99", "Yowser";v="2.5"`,"sec-ch-ua-full-version-list":`"Chromium";v="130.0.6723.152", "YaBrowser";v="${_e}", "Not?A_Brand";v="99.0.0.0", "Yowser";v="2.5"`};class Ve extends Pe{constructor(t){super(t),this.headers={...Ae,...this.headers}}}class Oe extends Le{constructor(t){super(t),this.headers={...Ae,...this.headers}}}class Me extends Error{constructor(t){super(t),this.name="VideoDataError",this.message=t}}const Ee=/(file:\/\/(\/)?|(http(s)?:\/\/)(127\.0\.0\.1|localhost|192\.168\.(\d){1,3}\.(\d){1,3}))/;var Be;!function(t){t.udemy="udemy",t.coursera="coursera",t.douyin="douyin",t.artstation="artstation"}(Be||(Be={}));const Ne=[{additionalData:"mobile",host:oe.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:"shorts-video #player",needExtraData:!0},{additionalData:"mobile",host:oe.youtube,url:"https://youtu.be/",match:/^m.youtube.com$/,selector:".player-container",needExtraData:!0},{host:oe.youtube,url:"https://youtu.be/",match:/^(www.)?youtube(-nocookie|kids)?.com$/,selector:".html5-video-container:not(#inline-player *)",needExtraData:!0},{host:oe.invidious,url:"https://youtu.be/",match:["yewtu.be","yt.artemislena.eu","invidious.flokinet.to","iv.melmac.space","inv.nadeko.net","inv.tux.pizza","invidious.private.coffee","yt.drgnz.club","vid.puffyan.us","invidious.dhusch.de"],selector:"#player",needBypassCSP:!0},{host:oe.piped,url:"https://youtu.be/",match:["piped.video","piped.tokhmi.xyz","piped.moomoo.me","piped.syncpundit.io","piped.mha.fi","watch.whatever.social","piped.garudalinux.org","efy.piped.pages.dev","watch.leptons.xyz","piped.lunar.icu","yt.dc09.ru","piped.mint.lgbt","il.ax","piped.privacy.com.de","piped.esmailelbob.xyz","piped.projectsegfau.lt","piped.in.projectsegfau.lt","piped.us.projectsegfau.lt","piped.privacydev.net","piped.palveluntarjoaja.eu","piped.smnz.de","piped.adminforge.de","piped.qdi.fi","piped.hostux.net","piped.chauvet.pro","piped.jotoma.de","piped.pfcd.me","piped.frontendfriendly.xyz"],selector:".shaka-video-container",needBypassCSP:!0},{host:oe.poketube,url:"https://youtu.be/",match:["poketube.fun","pt.sudovanilla.org","poke.ggtyler.dev","poke.uk2.littlekai.co.uk","poke.blahai.gay"],selector:".video-player-container"},{host:oe.ricktube,url:"https://youtu.be/",match:["ricktube.ru"],selector:"#oframeplayer > pjsdiv:has(video)"},{additionalData:"mobile",host:oe.vk,url:"https://vk.com/video?z=",match:[/^m.vk.(com|ru)$/,/^m.vkvideo.ru$/],selector:"vk-video-player",shadowRoot:!0,needExtraData:!0},{additionalData:"clips",host:oe.vk,url:"https://vk.com/video?z=",match:/^(www.|m.)?vk.(com|ru)$/,selector:'div[data-testid="clipcontainer-video"]',needExtraData:!0},{host:oe.vk,url:"https://vk.com/video?z=",match:[/^(www.|m.)?vk.(com|ru)$/,/^(www.|m.)?vkvideo.ru$/],selector:".videoplayer_media",needExtraData:!0},{host:oe.nine_gag,url:"https://9gag.com/gag/",match:/^9gag.com$/,selector:".video-post"},{host:oe.twitch,url:"https://twitch.tv/",match:[/^m.twitch.tv$/,/^(www.)?twitch.tv$/,/^clips.twitch.tv$/,/^player.twitch.tv$/],selector:".video-ref, main > div > section > div > div > div"},{host:oe.proxitok,url:"https://www.tiktok.com/",match:["proxitok.pabloferreiro.es","proxitok.pussthecat.org","tok.habedieeh.re","proxitok.esmailelbob.xyz","proxitok.privacydev.net","tok.artemislena.eu","tok.adminforge.de","tt.vern.cc","cringe.whatever.social","proxitok.lunar.icu","proxitok.privacy.com.de"],selector:".column.has-text-centered"},{host:oe.tiktok,url:"https://www.tiktok.com/",match:/^(www.)?tiktok.com$/,selector:null},{host:Be.douyin,url:"https://www.douyin.com/",match:/^(www.)?douyin.com/,selector:".xg-video-container",needExtraData:!0,needBypassCSP:!0},{host:oe.vimeo,url:"https://vimeo.com/",match:/^vimeo.com$/,needExtraData:!0,selector:".player"},{host:oe.vimeo,url:"https://player.vimeo.com/",match:/^player.vimeo.com$/,additionalData:"embed",needExtraData:!0,needBypassCSP:!0,selector:".player"},{host:oe.xvideos,url:"https://www.xvideos.com/",match:[/^(www.)?xvideos(-ar)?.com$/,/^(www.)?xvideos(\d\d\d).com$/,/^(www.)?xv-ru.com$/],selector:"#hlsplayer",needBypassCSP:!0},{host:oe.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:/^[a-z]+.pornhub.com$/,selector:".mainPlayerDiv > .video-element-wrapper-js > div",eventSelector:".mgp_eventCatcher"},{additionalData:"embed",host:oe.pornhub,url:"https://rt.pornhub.com/view_video.php?viewkey=",match:t=>t.host.includes("pornhub.com")&&t.pathname.startsWith("/embed/"),selector:"#player"},{host:oe.twitter,url:"https://twitter.com/i/status/",match:/^(twitter|x).com$/,selector:'div[data-testid="videoComponent"] > div:nth-child(1) > div',eventSelector:'div[data-testid="videoPlayer"]',needBypassCSP:!0},{host:oe.rumble,url:"https://rumble.com/",match:/^rumble.com$/,selector:"#videoPlayer > .videoPlayer-Rumble-cls > div"},{host:oe.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/videos/"),selector:'div[role="main"] div[data-pagelet$="video" i]',needBypassCSP:!0},{additionalData:"reels",host:oe.facebook,url:"https://facebook.com/",match:t=>t.host.includes("facebook.com")&&t.pathname.includes("/reel/"),selector:'div[role="main"]',needBypassCSP:!0},{host:oe.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:".video-player > div > div > div:nth-child(2)"},{additionalData:"embed",host:oe.rutube,url:"https://rutube.ru/video/",match:/^rutube.ru$/,selector:"#app > div > div"},{host:oe.bilibili,url:"https://www.bilibili.com/",match:/^(www|m|player).bilibili.com$/,selector:".bpx-player-video-wrap"},{additionalData:"old",host:oe.bilibili,url:"https://www.bilibili.com/",match:/^(www|m).bilibili.com$/,selector:null},{host:oe.mailru,url:"https://my.mail.ru/",match:/^my.mail.ru$/,selector:"#b-video-wrapper"},{host:oe.bitchute,url:"https://www.bitchute.com/video/",match:/^(www.)?bitchute.com$/,selector:".video-js"},{host:oe.eporner,url:"https://www.eporner.com/",match:/^(www.)?eporner.com$/,selector:".vjs-v7"},{host:oe.peertube,url:"stub",match:["peertube.1312.media","tube.shanti.cafe","bee-tube.fr","video.sadmin.io","dalek.zone","review.peertube.biz","peervideo.club","tube.la-dina.net","peertube.tmp.rcp.tf","peertube.su","video.blender.org","videos.viorsan.com","tube-sciences-technologies.apps.education.fr","tube-numerique-educatif.apps.education.fr","tube-arts-lettres-sciences-humaines.apps.education.fr","beetoons.tv","comics.peertube.biz","makertube.net"],selector:".vjs-v7"},{host:oe.dailymotion,url:"https://dai.ly/",match:/^geo([\d]+)?.dailymotion.com$/,selector:".player"},{host:oe.trovo,url:"https://trovo.live/s/",match:/^trovo.live$/,selector:".player-video"},{host:oe.yandexdisk,url:"https://yadi.sk/",match:/^disk.yandex.(ru|kz|com(\.(am|ge|tr))?|by|az|co\.il|ee|lt|lv|md|net|tj|tm|uz)$/,selector:".video-player__player > div:nth-child(1)",eventSelector:".video-player__player",needBypassCSP:!0,needExtraData:!0},{host:oe.okru,url:"https://ok.ru/video/",match:/^ok.ru$/,selector:"vk-video-player",shadowRoot:!0},{host:oe.googledrive,url:"https://drive.google.com/file/d/",match:/^youtube.googleapis.com$/,selector:".html5-video-container"},{host:oe.bannedvideo,url:"https://madmaxworld.tv/watch?id=",match:/^(www.)?banned.video|madmaxworld.tv$/,selector:".vjs-v7",needExtraData:!0},{host:oe.weverse,url:"https://weverse.io/",match:/^weverse.io$/,selector:".webplayer-internal-source-wrapper",needExtraData:!0},{host:oe.newgrounds,url:"https://www.newgrounds.com/",match:/^(www.)?newgrounds.com$/,selector:".ng-video-player"},{host:oe.egghead,url:"https://egghead.io/",match:/^egghead.io$/,selector:".cueplayer-react-video-holder"},{host:oe.youku,url:"https://v.youku.com/",match:/^v.youku.com$/,selector:"#ykPlayer"},{host:oe.archive,url:"https://archive.org/details/",match:/^archive.org$/,selector:".jw-media"},{host:oe.kodik,url:"stub",match:/^kodik.(info|biz|cc)$/,selector:".fp-player",needExtraData:!0},{host:oe.patreon,url:"stub",match:/^(www.)?patreon.com$/,selector:'div[data-tag="post-card"] div[elevation="subtle"] > div > div > div > div',needExtraData:!0},{additionalData:"old",host:oe.reddit,url:"stub",match:/^old.reddit.com$/,selector:".reddit-video-player-root",needExtraData:!0,needBypassCSP:!0},{host:oe.reddit,url:"stub",match:/^(www.|new.)?reddit.com$/,selector:"div[slot=post-media-container]",shadowRoot:!0,needExtraData:!0,needBypassCSP:!0},{host:oe.kick,url:"https://kick.com/",match:/^kick.com$/,selector:"#injected-embedded-channel-player-video > div",needExtraData:!0},{host:oe.appledeveloper,url:"https://developer.apple.com/",match:/^developer.apple.com$/,selector:".developer-video-player",needExtraData:!0,needBypassCSP:!0},{host:oe.epicgames,url:"https://dev.epicgames.com/community/learning/",match:/^dev.epicgames.com$/,selector:".vjs-v7",needExtraData:!0},{host:oe.nineanimetv,url:"https://9animetv.to/watch/",match:/^rapid-cloud.co$/,selector:".jw-media",needExtraData:!0},{host:oe.odysee,url:"stub",match:/^odysee.com$/,selector:".vjs-v7",needExtraData:!0},{host:oe.coursehunterLike,url:"stub",match:["coursehunter.net","coursetrain.net"],selector:"#oframeplayer > pjsdiv:has(video)",needExtraData:!0},{host:oe.sap,url:"https://learning.sap.com/courses/",match:/^learning.sap.com$/,selector:".playkit-container",eventSelector:".playkit-player",needExtraData:!0,needBypassCSP:!0},{host:Be.udemy,url:"https://www.udemy.com/",match:/udemy.com$/,selector:'div[data-purpose="curriculum-item-viewer-content"] > section > div > div > div > div:nth-of-type(2)',needExtraData:!0},{host:Be.coursera,url:"https://www.coursera.org/",match:/coursera.org$/,selector:".vjs-v8",needExtraData:!0},{host:oe.watchpornto,url:"https://watchporn.to/",match:/^watchporn.to$/,selector:".fp-player"},{host:oe.linkedin,url:"https://www.linkedin.com/learning/",match:/^(www.)?linkedin.com$/,selector:".vjs-v7",needExtraData:!0,needBypassCSP:!0},{host:oe.incestflix,url:"https://www.incestflix.net/watch/",match:/^(www.)?incestflix.(net|to|com)$/,selector:"#incflix-stream",needExtraData:!0},{host:oe.porntn,url:"https://porntn.com/videos/",match:/^porntn.com$/,selector:".fp-player",needExtraData:!0},{host:oe.dzen,url:"https://dzen.ru/video/watch/",match:/^dzen.ru$/,selector:".zen-ui-video-video-player"},{host:oe.cloudflarestream,url:"stub",match:/^(watch|embed|iframe|customer-[^.]+).cloudflarestream.com$/,selector:null},{host:oe.loom,url:"https://www.loom.com/share/",match:/^(www.)?loom.com$/,selector:".VideoLayersContainer",needExtraData:!0},{host:Be.artstation,url:"https://www.artstation.com/learning/",match:/^(www.)?artstation.com$/,selector:".vjs-v7",needExtraData:!0},{host:oe.rtnews,url:"https://www.rt.com/",match:/^(www.)?rt.com$/,selector:".jw-media",needExtraData:!0},{host:oe.custom,url:"stub",match:t=>/([^.]+).(mp4|webm)/.test(t.pathname),rawResult:!0}];class Re extends Error{constructor(t){super(t),this.name="VideoHelper",this.message=t}}class $e{API_ORIGIN=window.location.origin;fetch;extraInfo;referer;origin;service;video;language;constructor({fetchFn:t=Kt,extraInfo:e=!0,referer:o=document.referrer??window.location.origin+"/",origin:i=window.location.origin,service:a,video:n,language:r="en"}={}){this.fetch=t,this.extraInfo=e,this.referer=o,this.origin=/^(http(s)?):\/\//.test(String(i))?i:window.location.origin,this.service=a,this.video=n,this.language=r}async getVideoData(t){}async getVideoId(t){}returnBaseData(t){if(this.service)return{url:this.service.url+t,videoId:t,host:this.service.host,duration:void 0}}}class De extends $e{SUBTITLE_SOURCE="videojs";SUBTITLE_FORMAT="vtt";static getPlayer(){return document.querySelector(".video-js")?.player}getVideoDataByPlayer(t){try{const e=De.getPlayer();if(!e)throw new Error(`Video player doesn't have player option, videoId ${t}`);const o=e.duration(),i=Array.isArray(e.currentSources)?e.currentSources:e.getCache()?.sources,{tracks_:a}=e.textTracks(),n=i.find((t=>"video/mp4"===t.type||"video/webm"===t.type));if(!n)throw new Error(`Failed to find video url for videoID ${t}`);const r=a.filter((t=>t.src)).map((t=>({language:Zt(t.language),source:this.SUBTITLE_SOURCE,format:this.SUBTITLE_FORMAT,url:t.src})));return{url:n.src,duration:o,subtitles:r}}catch(t){return void St.error("Failed to get videojs video data",t.message)}}}class Fe extends $e{static getPlayer(){if("undefined"==typeof Videoview)return;const t=Videoview;return t?.getPlayerObject?.call(void 0)}async getVideoData(t){const e=Fe.getPlayer();if(!e)return this.returnBaseData(t);try{const{description:o,duration:i,md_title:a}=e.vars,n=(new DOMParser).parseFromString(o,"text/html"),r=Array.from(n.body.childNodes).filter((t=>"BR"!==t.nodeName)).map((t=>t.textContent)).join("\n");let s;return Object.hasOwn(e.vars,"subs")&&(s=e.vars.subs.map((t=>({language:Zt(t.lang),source:"vk",format:"vtt",url:t.url,isAutoGenerated:!!t.is_auto})))),{url:this.service.url+t,title:a,description:r,duration:i,subtitles:s}}catch(e){return St.error(`Failed to get VK video data, because: ${e.message}`),this.returnBaseData(t)}}async getVideoId(t){const e=/^\/(video|clip)-?\d{8,9}_\d{9}$/.exec(t.pathname);if(e)return e[0].slice(1);const o=/\/playlist\/[^/]+\/(video-?\d{8,9}_\d{9})/.exec(t.pathname);if(o)return o[1];const i=t.searchParams.get("z");if(i)return i.split("/")[0];const a=t.searchParams.get("oid"),n=t.searchParams.get("id");return a&&n?`video-${Math.abs(parseInt(a))}_${n}`:void 0}}class Ue extends $e{async getVideoId(t){return/([^/]+)\/video\/([^/]+)/.exec(t.pathname)?.[0]}}const qe=["auto","ru","en","zh","ko","lt","lv","ar","fr","it","es","de","ja"],ze=["ru","en","kk"],He=["srt","vtt","json"];class We extends $e{static isMobile(){return/^m\.youtube\.com$/.test(window.location.hostname)}static getPlayer(){return window.location.pathname.startsWith("/shorts/")&&!We.isMobile()?document.querySelector("#shorts-player"):document.querySelector("#movie_player")}static getPlayerResponse(){return We.getPlayer()?.getPlayerResponse()}static getPlayerData(){return We.getPlayer()?.getVideoData()}static getVolume(){const t=We.getPlayer();return t?t.getVolume()/100:1}static setVolume(t){const e=We.getPlayer();return!!e&&(e.setVolume(Math.round(100*t)),!0)}static isMuted(){const t=We.getPlayer();return!!t&&t.isMuted()}static videoSeek(t,e){St.log("videoSeek",e);const o=(We.getPlayer()?.getProgressState()?.seekableEnd??t.currentTime)-e;t.currentTime=o}static getSubtitles(t){const e=We.getPlayerResponse(),o=e?.captions?.playerCaptionsTracklistRenderer;if(!o)return[];const i=o.captionTracks??[],a=(o.translationLanguages??[]).find((e=>e.languageCode===t)),n=i.find((t=>"asr"===t?.kind)),r=n?.languageCode??"en",s=i.reduce(((e,o)=>{if(!("languageCode"in o))return e;const i=o.languageCode?Zt(o.languageCode):void 0,n=o.baseUrl;if(!i||!n)return e;const s=`${n.startsWith("http")?n:`${window.location.origin}/${n}`}&fmt=json3`;return e.push({source:"youtube",format:"json",language:i,isAutoGenerated:"asr"===o?.kind,url:s}),a&&o.isTranslatable&&o.languageCode===r&&t!==i&&e.push({source:"youtube",format:"json",language:t,isAutoGenerated:"asr"===o?.kind,translatedFromLanguage:i,url:`${s}&tlang=${t}`}),e}),[]);return St.log("youtube subtitles:",s),s}static getLanguage(){if(!We.isMobile()){const t=We.getPlayer(),e=t?.getAudioTrack?.call(void 0)?.getLanguageInfo();if(e&&"und"!==e.id)return Zt(e.id.split(".")[0])}const t=We.getPlayerResponse(),e=t?.captions?.playerCaptionsTracklistRenderer.captionTracks.find((t=>"asr"===t.kind&&t.languageCode));return e?Zt(e.languageCode):void 0}async getVideoData(t){const{title:e}=We.getPlayerData()??{},{shortDescription:o,isLive:i,title:a}=We.getPlayerResponse()?.videoDetails??{},n=We.getSubtitles(this.language);let r=We.getLanguage();r&&!qe.includes(r)&&(r=void 0);const s=We.getPlayer()?.getDuration()??void 0;return{url:this.service.url+t,isStream:i,title:a,localizedTitle:e,detectedLanguage:r,description:o,subtitles:n,duration:s}}async getVideoId(t){if("youtu.be"===t.hostname&&(t.search=`?v=${t.pathname.replace("/","")}`,t.pathname="/watch"),t.searchParams.has("enablejsapi")){const e=We.getPlayer()?.getVideoUrl();t=e?new URL(e):t}return/(?:watch|embed|shorts|live)\/([^/]+)/.exec(t.pathname)?.[1]??t.searchParams.get("v")}}class je extends De{API_ORIGIN="https://www.coursera.org/api";SUBTITLE_SOURCE="coursera";async getCourseData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/onDemandCourses.v1/${t}`),o=await e.json();return o?.elements?.[0]}catch(e){return void St.error(`Failed to get course data by courseId: ${t}`,e.message)}}static getPlayer(){return super.getPlayer()}async getVideoData(t){const e=this.getVideoDataByPlayer(t);if(!e)return;const{options_:o}=je.getPlayer()??{};!e.subtitles?.length&&o&&(e.subtitles=o.tracks.map((t=>({url:t.src,language:Zt(t.srclang),source:this.SUBTITLE_SOURCE,format:this.SUBTITLE_FORMAT}))));const i=o?.courseId;if(!i)return e;let a="en";const n=await this.getCourseData(i);if(n){const{primaryLanguageCodes:[t]}=n;a=t?Zt(t):"en"}qe.includes(a)||(a="en");const r=e.subtitles.find((t=>t.language===a))??e.subtitles?.[0],s=r?.url;s||St.warn("Failed to find any subtitle file");const{url:l,duration:d}=e,u=s?[{target:"subtitles_file_url",targetUrl:s},{target:"video_file_url",targetUrl:l}]:null;return{...s?{url:this.service?.url+t,translationHelp:u}:{url:l,translationHelp:u},detectedLanguage:a,duration:d}}async getVideoId(t){const e=/learn\/([^/]+)\/lecture\/([^/]+)/.exec(t.pathname)??/lecture\/([^/]+)\/([^/]+)/.exec(t.pathname);return e?.[0]}}class Ge extends $e{static getPlayer(){if("undefined"!=typeof player)return player}async getVideoData(t){const e=Ge.getPlayer();if(!e)return;const{config:{url:o,duration:i,lang:a,isLive:n}}=e;if(!o)return;const r=o.find((t=>t.src.includes("www.douyin.com/aweme/v1/play/")));return r?{url:Xt(r.src),duration:i,isStream:n,...qe.includes(a)?{detectedLanguage:a}:{}}:void 0}async getVideoId(t){const e=/video\/([\d]+)/.exec(t.pathname)?.[0];return e||Ge.getPlayer()?.config.vid}}var Ye;!function(t){t.Channel="Channel",t.Video="Video"}(Ye||(Ye={}));const Je={[oe.mailru]:class extends $e{API_ORIGIN="https://my.mail.ru";async getVideoMeta(t){try{const e=await this.fetch(`${this.API_ORIGIN}/+/video/meta/${t}?xemail=&ajax_call=1&func_name=&mna=&mnb=&ext=1&_=${(new Date).getTime()}`);return await e.json()}catch(t){return void St.error("Failed to get mail.ru video data",t.message)}}async getVideoId(t){const e=t.pathname;if(/\/(v|mail|bk|inbox)\//.exec(e))return e.slice(1);const o=/video\/embed\/([^/]+)/.exec(e)?.[1];if(!o)return;const i=await this.getVideoMeta(o);return i?i.meta.url.replace("//my.mail.ru/",""):void 0}},[oe.weverse]:class extends $e{API_ORIGIN="https://global.apis.naver.com/weverse/wevweb";API_APP_ID="be4d79eb8fc7bd008ee82c8ec4ff6fd4";API_HMAC_KEY="1b9cb6378d959b45714bec49971ade22e6e24e42";HEADERS={Accept:"application/json, text/plain, */*",Origin:"https://weverse.io",Referer:"https://weverse.io/"};getURLData(){return{appId:this.API_APP_ID,language:"en",os:"WEB",platform:"WEB",wpf:"pc"}}async createHash(t){const e=Date.now(),o=t.substring(0,Math.min(255,t.length))+e,i=await async function(t,e){try{const o=Wt.encode(e),i=await jt("SHA-1",t,o);return btoa(String.fromCharCode(...new Uint8Array(i)))}catch(t){return St.error(t),!1}}(this.API_HMAC_KEY,o);if(!i)throw new Re("Failed to get weverse HMAC signature");return{wmsgpad:e.toString(),wmd:i}}async getHashURLParams(t){const e=await this.createHash(t);return new URLSearchParams(e).toString()}async getPostPreview(t){const e=`/post/v1.0/post-${t}/preview?`+new URLSearchParams({fieldSet:"postForPreview",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{headers:this.HEADERS});return await o.json()}catch(e){return St.error(`Failed to get weverse post preview by postId: ${t}`,e.message),!1}}async getVideoInKey(t){const e=`/video/v1.1/vod/${t}/inKey?`+new URLSearchParams({gcc:"RU",...this.getURLData()}).toString();try{const t=await this.getHashURLParams(e),o=await this.fetch(this.API_ORIGIN+e+"&"+t,{method:"POST",headers:this.HEADERS});return await o.json()}catch(e){return St.error(`Failed to get weverse InKey by videoId: ${t}`,e.message),!1}}async getVideoInfo(t,e,o){const i=Date.now();try{const a=new URLSearchParams({key:e,sid:o,nonce:i.toString(),devt:"html5_pc",prv:"N",aup:"N",stpb:"N",cpl:"en",env:"prod",lc:"en",adi:JSON.stringify([{adSystem:null}]),adu:"/"}).toString(),n=await this.fetch(`https://global.apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/${t}?`+a,{headers:this.HEADERS});return await n.json()}catch(i){return St.error(`Failed to get weverse video info (infraVideoId: ${t}, inkey: ${e}, serviceId: ${o}`,i.message),!1}}extractVideoInfo(t){return t.find((t=>!1===t.useP2P&&t.source.includes(".mp4")))}async getVideoData(t){const e=await this.getPostPreview(t);if(!e)return;const{videoId:o,serviceId:i,infraVideoId:a}=e.extension.video;if(!(o&&i&&a))return;const n=await this.getVideoInKey(o);if(!n)return;const r=await this.getVideoInfo(a,n.inKey,i);if(!r)return;const s=this.extractVideoInfo(r.videos.list);return s?{url:s.source,duration:s.duration}:void 0}async getVideoId(t){return/([^/]+)\/(live|media)\/([^/]+)/.exec(t.pathname)?.[3]}},[oe.kodik]:class extends $e{API_ORIGIN=window.location.origin;async getSecureData(t){try{const e=await this.fetch(`${this.API_ORIGIN}${t}`,{headers:{"User-Agent":wt.userAgent,Origin:this.API_ORIGIN,Referer:this.API_ORIGIN}}),o=await e.text(),[i,a,n]=t.split("/").filter((t=>t)),r=(new DOMParser).parseFromString(o,"text/html"),s=Array.from(r.getElementsByTagName("script")).filter((t=>t.innerHTML.includes(`videoId = "${a}"`)));if(!s.length)throw new Re("Failed to find secure script");const l=/'{[^']+}'/.exec(s[0].textContent.trim())?.[0];if(!l)throw new Re("Secure json wasn't found in secure script");const d=JSON.parse(l.replaceAll("'",""));return{videoType:i,videoId:a,hash:n,...d}}catch(e){return St.error(`Failed to get kodik secure data by videoPath: ${t}.`,e.message),!1}}async getFtor(t){const{videoType:e,videoId:o,hash:i,d:a,d_sign:n,pd:r,pd_sign:s,ref:l,ref_sign:d}=t;try{const t=await this.fetch(this.API_ORIGIN+"/ftor",{method:"POST",headers:{"User-Agent":wt.userAgent,Origin:this.API_ORIGIN,Referer:`${this.API_ORIGIN}/${e}/${o}/${i}/360p`},body:new URLSearchParams({d:a,d_sign:n,pd:r,pd_sign:s,ref:decodeURIComponent(l),ref_sign:d,bad_user:"false",cdn_is_working:"true",info:"{}",type:e,hash:i,id:o})});return await t.json()}catch(t){return St.error(`Failed to get kodik video data (type: ${e}, id: ${o}, hash: ${i})`,t.message),!1}}decryptUrl(t){const e=atob(t.replace(/[a-zA-Z]/g,(function(t){const e=t.charCodeAt(0)+13,o=t<="Z"?90:122;return String.fromCharCode(o>=e?e:e-26)})));return"https:"+e}async getVideoData(t){const e=await this.getSecureData(t);if(!e)return;const o=await this.getFtor(e);if(!o)return;const i=Object.entries(o.links[o.default.toString()]),a=i.find((([,t])=>"application/x-mpegURL"===t.type))?.[1];return a?{url:this.decryptUrl(a.src)}:void 0}async getVideoId(t){return/\/(seria|video)\/([^/]+)\/([^/]+)\/([\d]+)p/.exec(t.pathname)?.[0]}},[oe.patreon]:class extends $e{API_ORIGIN="https://www.patreon.com/api";async getPosts(t){try{const e=await this.fetch(`${this.API_ORIGIN}/posts/${t}?json-api-use-default-includes=false`);return await e.json()}catch(e){return St.error(`Failed to get patreon posts by postId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getPosts(t);if(!e)return;const o=e.data.attributes.post_file.url;return o?{url:o}:void 0}async getVideoId(t){const e=/posts\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e.replace(/[^\d.]/g,"")}},[oe.reddit]:class extends $e{API_ORIGIN="https://www.reddit.com";async getContentUrl(t){if("old"!==this.service?.additionalData)return document.querySelector("shreddit-player-2")?.src;const e=document.querySelector("[data-hls-url]");return e?.dataset.hlsUrl?.replaceAll("&","&")}async getVideoData(t){try{const e=await this.getContentUrl(t);if(!e)throw new Re("Failed to find content url");return{url:decodeURIComponent(e)}}catch(e){return void St.error(`Failed to get reddit video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/\/r\/(([^/]+)\/([^/]+)\/([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[oe.bannedvideo]:class extends $e{API_ORIGIN="https://api.banned.video";async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/graphql`,{method:"POST",body:JSON.stringify({operationName:"GetVideo",query:"query GetVideo($id: String!) {\n getVideo(id: $id) {\n title\n description: summary\n duration: videoDuration\n videoUrl: directUrl\n isStream: live\n }\n }",variables:{id:t}}),headers:{"User-Agent":"bannedVideoFrontEnd","apollographql-client-name":"banned-web","apollographql-client-version":"1.3","content-type":"application/json"}});return await e.json()}catch(e){return console.error(`Failed to get bannedvideo video info by videoId: ${t}.`,e.message),!1}}async getVideoData(t){const e=await this.getVideoInfo(t);if(!e)return;const{videoUrl:o,duration:i,isStream:a,description:n,title:r}=e.data.getVideo;return{url:o,duration:i,isStream:a,title:r,description:n}}async getVideoId(t){return t.searchParams.get("id")??void 0}},[oe.kick]:class extends $e{API_ORIGIN="https://kick.com/api";async getClipInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v2/clips/${t}`),o=await e.json(),{clip_url:i,duration:a,title:n}=o.clip;return{url:i,duration:a,title:n}}catch(e){return void St.error(`Failed to get kick clip info by clipId: ${t}.`,e.message)}}async getVideoInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/v1/video/${t}`),o=await e.json(),{source:i,livestream:a}=o,{session_title:n,duration:r}=a;return{url:i,duration:Math.round(r/1e3),title:n}}catch(e){return void St.error(`Failed to get kick video info by videoId: ${t}.`,e.message)}}async getVideoData(t){return t.startsWith("videos")?await this.getVideoInfo(t.replace("videos/","")):await this.getClipInfo(t.replace("clips/",""))}async getVideoId(t){return/([^/]+)\/((videos|clips)\/([^/]+))/.exec(t.pathname)?.[2]}},[oe.appledeveloper]:class extends $e{API_ORIGIN="https://developer.apple.com";async getVideoData(t){try{const t=document.querySelector("meta[property='og:video']")?.content;if(!t)throw new Re("Failed to find content url");return{url:t}}catch(e){return void St.error(`Failed to get apple developer video data by video ID: ${t}`,e.message)}}async getVideoId(t){return/videos\/play\/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0]}},[oe.epicgames]:class extends $e{API_ORIGIN="https://dev.epicgames.com/community/api/learning";async getPostInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/post.json?hash_id=${t}`);return await e.json()}catch(e){return St.error(`Failed to get epicgames post info by videoId: ${t}.`,e.message),!1}}getVideoBlock(){const t=/videoUrl\s?=\s"([^"]+)"?/,e=Array.from(document.body.querySelectorAll("script")).find((e=>t.exec(e.innerHTML)));if(!e)return;const o=e.innerHTML.trim(),i=t.exec(o)?.[1]?.replace("qsep://","https://");if(!i)return;let a=/sources\s?=\s(\[([^\]]+)\])?/.exec(o)?.[1];if(!a)return{playlistUrl:i,subtitles:[]};try{a=(a.replace(/src:(\s)+?(videoUrl)/g,'src:"removed"').substring(0,a.lastIndexOf("},"))+"]").split("\n").map((t=>t.replace(/([^\s]+):\s?(?!.*\1)/,'"$1":'))).join("\n");const t=JSON.parse(a);return{playlistUrl:i,subtitles:t.filter((t=>"captions"===t.type))}}catch{return{playlistUrl:i,subtitles:[]}}}async getVideoData(t){const e=t.split(":")?.[1],o=await this.getPostInfo(e);if(!o)return;const i=this.getVideoBlock();if(!i)return;const{playlistUrl:a,subtitles:n}=i,{title:r,description:s}=o;return{url:a,title:r,description:s,subtitles:n.map((t=>({language:Zt(t.srclang),source:"epicgames",format:"vtt",url:t.src})))}}async getVideoId(t){return new Promise((t=>{const e="https://dev.epicgames.com",o=btoa(window.location.href);window.addEventListener("message",(o=>{if(o.origin!==e)return;if("string"!=typeof o.data||!o.data.startsWith("getVideoId:"))return;const i=o.data.replace("getVideoId:","");return t(i)})),window.top.postMessage(`getVideoId:${o}`,e)}))}},[oe.nineanimetv]:class extends $e{API_ORIGIN="https://9animetv.to/ajax/episode";RAPID_CLOUD_ORIGIN="https://rapid-cloud.co/ajax/embed-6-v2";async getSourceId(t){try{const e=await this.fetch(`${this.API_ORIGIN}/servers?episodeId=${t}`),o=await e.json();return!!o.html&&/data-id="(\d+)"/.exec(o.html)?.[1]}catch(e){return St.error(`Failed to get 9animetv servers info by episodeId: ${t}.`,e.message),!1}}async getPlayerLink(t){try{const e=await this.fetch(`${this.API_ORIGIN}/sources?id=${t}`),o=await e.json();return!!o.link.includes("rapid-cloud.co")&&o.link}catch(e){return St.error(`Failed to get player link by sourceId: ${t}.`,e.message),!1}}async getRapidCloudData(t){try{const e=await this.fetch(`${this.RAPID_CLOUD_ORIGIN}/getSources?id=${t}`),o=await e.json();return o.encrypted?(St.warn("Encrypted RapidCloud data found. Let us know about it",o),!1):o}catch(e){return St.error(`Failed to get rapid cloud data by rapidId: ${t}.`,e.message),!1}}async getVideoData(t){const e=t.split("?ep=")[1],o=await this.getSourceId(e);if(!o)return;const i=await this.getPlayerLink(o);if(!i)return;const a=/\/([^/?]+)\?/.exec(i)?.[1];if(!a)return;const n=await this.getRapidCloudData(a);if(!n)return;const r=n.sources.find((t=>"hls"===t.type))?.file;if(!r)return;const s=n.tracks.reduce(((t,e)=>{const o=/([\w+]+)(-\d)?\.vtt/.exec(e.file)?.[1];if(!o)return t;const i=Zt(3===o.length?o:e.label);return t.find((t=>t.language===i))||t.push({language:i,source:"nineanimetv",format:"vtt",url:e.file}),t}),[]);return{url:r,subtitles:s}}async getVideoId(t){return new Promise((t=>{const e="https://9animetv.to";window.addEventListener("message",(o=>{if(o.origin===e&&"string"==typeof o.data&&o.data.startsWith("getVideoId:")){const e=o.data.replace("getVideoId:","");return t(e)}})),window.top.postMessage("getVideoId",e)}))}},[oe.odysee]:class extends $e{API_ORIGIN="https://odysee.com";async getVideoData(t){try{const e=await this.fetch(`${this.API_ORIGIN}/${t}`),o=await e.text(),i=/"contentUrl":(\s)?"([^"]+)"/.exec(o)?.[2];if(!i)throw new Error("Odysee url doesn't parsed");return{url:i}}catch(e){return void St.error(`Failed to get odysee video data by video ID: ${t}`,e.message)}}async getVideoId(t){return t.pathname.slice(1)}},[oe.coursehunterLike]:class extends $e{API_ORIGIN=this.origin??"https://coursehunter.net";async getCourseId(){const t=window.course_id;return void 0!==t?String(t):document.querySelector('input[name="course_id"]')?.value}async getLessonsData(t){const e=window.lessons;if(e?.length)return e;try{const e=await this.fetch(`${this.API_ORIGIN}/api/v1/course/${t}/lessons`);return await e.json()}catch(e){return void St.error(`Failed to get CoursehunterLike lessons data by courseId: ${t}, because ${e.message}`)}}getLessondId(t){let e=t.split("?lesson=")?.[1];if(e)return+e;const o=document.querySelector(".lessons-item_active");return e=o?.dataset?.index,e?+e:1}async getVideoData(t){const e=await this.getCourseId();if(!e)return;const o=await this.getLessonsData(e);if(!o)return;const i=this.getLessondId(t),a=o?.[i-1],{file:n,duration:r,title:s}=a;return n?{url:n,duration:r,title:s}:void 0}async getVideoId(t){const e=/course\/([^/]+)/.exec(t.pathname)?.[0];return e?e+t.search:void 0}},[oe.twitch]:class extends $e{API_ORIGIN="https://clips.twitch.tv";async getClipLink(t,e){const o=document.querySelector("script[type='application/ld+json']"),i=t.slice(1);if(o){const t=JSON.parse(o.innerText),e=t["@graph"].find((t=>"VideoObject"===t["@type"]))?.creator.url;if(!e)throw new Re("Failed to find channel link");return`${e.replace("https://www.twitch.tv/","")}/clip/${i}`}const a="embed"===i,n=document.querySelector(a?".tw-link[data-test-selector='stream-info-card-component__stream-avatar-link']":".clips-player a:not([class])");if(!n)return;return`${n.href.replace("https://www.twitch.tv/","")}/clip/${a?e:i}`}async getVideoId(t){const e=t.pathname;if(/^m\.twitch\.tv$/.test(e))return/videos\/([^/]+)/.exec(t.href)?.[0]??e.slice(1);if(/^player\.twitch\.tv$/.test(t.hostname))return`videos/${t.searchParams.get("video")}`;const o=/([^/]+)\/(?:clip)\/([^/]+)/.exec(e);if(o)return o[0];return/^clips\.twitch\.tv$/.test(t.hostname)?await this.getClipLink(e,t.searchParams.get("clip")):/(?:videos)\/([^/]+)/.exec(e)?.[0]}},[oe.sap]:class extends $e{API_ORIGIN="https://learning.sap.com/";async requestKaltura(t,e,o){try{const i=await this.fetch(`https://${t}/api_v3/service/multirequest`,{method:"POST",body:JSON.stringify({1:{service:"session",action:"startWidgetSession",widgetId:`_${e}`},2:{service:"baseEntry",action:"list",ks:"{1:result:ks}",filter:{redirectFromEntryId:o},responseProfile:{type:1,fields:"id,referenceId,name,description,dataUrl,duration,flavorParamsIds,type,dvrStatus,externalSourceType,createdAt,updatedAt,endDate,plays,views,downloadUrl,creatorId"}},3:{service:"baseEntry",action:"getPlaybackContext",entryId:"{2:result:objects:0:id}",ks:"{1:result:ks}",contextDataParams:{objectType:"KalturaContextDataParams",flavorTags:"all"}},apiVersion:"3.3.0",format:1,ks:"",clientTag:"html5:v3.17.22",partnerId:e}),headers:{"Content-Type":"application/json"}});return await i.json()}catch(t){return void St.error("Failed to request kaltura data",t.message)}}async getKalturaData(t){try{const e=document.querySelector('script[data-nscript="beforeInteractive"]');if(!e)throw new Re("Failed to find script element");const o=/https:\/\/([^"]+)\/p\/([^"]+)\/embedPlaykitJs\/uiconf_id\/([^"]+)/.exec(e?.src);if(!o)throw new Re(`Failed to get sap data for videoId: ${t}`);const[,i,a]=o;let n=document.querySelector("#shadow")?.firstChild?.getAttribute("id");if(!n){const t=document.querySelector("#__NEXT_DATA__");if(!t)throw new Re("Failed to find next data element");n=/"sourceId":\s?"([^"]+)"/.exec(t.innerText)?.[1]}if(!i||Number.isNaN(+a)||!n)throw new Re(`One of the necessary parameters for getting a link to a sap video in wasn't found for ${t}. Params: kalturaDomain = ${i}, partnerId = ${a}, entryId = ${n}`);return await this.requestKaltura(i,a,n)}catch(t){return void St.error("Failed to get kaltura data",t.message)}}async getVideoData(t){const e=await this.getKalturaData(t);if(!e)return;const[,o,i]=e,{duration:a}=o.objects[0],n=i.sources.find((t=>"url"===t.format&&"http,https"===t.protocols&&t.url.includes(".mp4")))?.url;if(!n)return;return{url:n,subtitles:i.playbackCaptions.map((t=>({language:Zt(t.languageCode),source:"sap",format:"vtt",url:t.webVttUrl,isAutoGenerated:t.label.includes("auto-generated")}))),duration:a}}async getVideoId(t){return/((courses|learning-journeys)\/([^/]+)(\/[^/]+)?)/.exec(t.pathname)?.[1]}},[oe.linkedin]:class extends De{SUBTITLE_SOURCE="linkedin";async getVideoData(t){const e=this.getVideoDataByPlayer(t);if(!e)return;const{url:o,duration:i,subtitles:a}=e;return{url:Xt(new URL(o)),duration:i,subtitles:a}}async getVideoId(t){return/\/learning\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[oe.vimeo]:class extends $e{API_KEY="";DEFAULT_SITE_ORIGIN="https://vimeo.com";SITE_ORIGIN=this.isPrivatePlayer()?this.service?.url?.slice(0,-1)??this.DEFAULT_SITE_ORIGIN:this.DEFAULT_SITE_ORIGIN;isErrorData(t){return Object.hasOwn(t,"error")}isPrivatePlayer(){return this.referer&&!this.referer.includes("vimeo.com")}async getViewerData(){try{const t=await this.fetch("https://vimeo.com/_next/viewer"),e=await t.json(),{apiUrl:o,jwt:i}=e;return this.API_ORIGIN=`https://${o}`,this.API_KEY=`jwt ${i}`,e}catch(t){return St.error("Failed to get default viewer data.",t.message),!1}}async getVideoInfo(t){try{const e=new URLSearchParams({fields:"name,link,description,duration"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return St.error(`Failed to get video info by video ID: ${t}`,e.message),!1}}async getPrivateVideoSource(t){try{const{default_cdn:e,cdns:o}=t.dash,i=o[e].url,a=await this.fetch(i);if(200!==a.status)throw new Re(await a.text());const n=await a.json(),r=new URL(i),s=Array.from(n.base_url.matchAll(/\.\.\//g)).length+1,l=r.pathname.split("/");let d=n.base_url.replaceAll("../","");d=d&&!d.startsWith("/")?`/${d}`:d,r.pathname=l.slice(0,l.length-s).join("/")+d,r.pathname.endsWith("/")||(r.pathname+="/");const u=n.audio.find((t=>"audio/mp4"===t.mime_type&&"dash"===t.format));if(!u)throw new Re("Failed to find video data");const c=u.segments?.[0]?.url;if(!c)throw new Re("Failed to find first segment url");const[h,p]=c.split("?",2),g=new URLSearchParams(p);return g.delete("range"),r.pathname+=`${u.base_url}${h}`,r.href=r.href.split("?")[0]+"?"+g.toString(),r.href}catch(t){return St.error("Failed to get private video source",t.message),!1}}async getPrivateVideoInfo(t){try{if("undefined"==typeof playerConfig)return;const e=playerConfig,o=await this.getPrivateVideoSource(e.request.files);if(!o)throw new Re("Failed to get private video source");const{video:{title:i,duration:a},request:{text_tracks:n}}=e;return{url:`${this.SITE_ORIGIN}/${t}`,video_url:o,title:i,duration:a,subs:n}}catch(e){return St.error(`Failed to get private video info by video ID: ${t}`,e.message),!1}}async getSubsInfo(t){try{const e=new URLSearchParams({per_page:"100",fields:"language,type,link"}).toString(),o=await this.fetch(`${this.API_ORIGIN}/videos/${t}/texttracks?${e}`,{headers:{Authorization:this.API_KEY}}),i=await o.json();if(this.isErrorData(i))throw new Error(i.developer_message??i.error);return i}catch(e){return St.error(`Failed to get subtitles info by video ID: ${t}`,e.message),!1}}async getVideoData(t){const e=this.isPrivatePlayer();if(!this.extraInfo)return this.returnBaseData(t);if(e){const e=await this.getPrivateVideoInfo(t);if(!e)return;const{url:o,subs:i,video_url:a,title:n,duration:r}=e,s=i.map((t=>({language:Zt(t.lang),source:"vimeo",format:"vtt",url:this.SITE_ORIGIN+t.url,isAutoGenerated:t.lang.includes("autogenerated")}))),l=s.length?[{target:"video_file_url",targetUrl:a},{target:"subtitles_file_url",targetUrl:s[0].url}]:null;return{...l?{url:o,translationHelp:l}:{url:a},subtitles:s,title:n,duration:r}}t.startsWith("video/")&&(t=t.replace("video/","")),t.includes("/")&&(t=t.replace("/",":"));if(!await this.getViewerData())return this.returnBaseData(t);const o=await this.getVideoInfo(t);if(!o)return this.returnBaseData(t);const i=await this.getSubsInfo(t),a=i?i.data.map((t=>({language:Zt(t.language),source:"vimeo",format:"vtt",url:t.link,isAutoGenerated:t.language.includes("autogen")}))):[],{link:n,duration:r,name:s,description:l}=o;return{url:n,title:s,description:l,subtitles:a,duration:r}}async getVideoId(t){const e=/[^/]+\/[^/]+$/.exec(t.pathname)?.[0];return this.isPrivatePlayer()?e:e?.startsWith("video/")?e.replace("video/",""):e??/[^/]+$/.exec(t.pathname)?.[0]}},[oe.yandexdisk]:class extends $e{API_ORIGIN=window.location.origin;CLIENT_PREFIX="/client/disk";INLINE_PREFIX="/i/";DISK_PREFIX="/d/";isErrorData(t){return Object.hasOwn(t,"error")}async getClientVideoData(t){const e=new URL(window.location.href).searchParams.get("idDialog");if(!e)return;const o=document.querySelector("#preloaded-data");if(o)try{const t=JSON.parse(o.innerText),{idClient:i,sk:a}=t.config,n=await this.fetch(this.API_ORIGIN+"/models/?_m=resource",{method:"POST",body:new URLSearchParams({idClient:i,sk:a,"_model.0":"resource","id.0":e.replaceAll(" ","+")}).toString().replaceAll(/%2B/g,"+"),headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}}),r=await n.json();if(!r.models)throw new Re("Failed to get resource info");const s=r.models[0].data;if(this.isErrorData(s))throw new Re(s.error?.message);const{meta:{short_url:l,video_info:d},name:u}=s;if(!d)throw new Re("There's no video open right now");if(!l)throw new Re("Access to the video is limited");const c=this.clearTitle(u);return{url:l,title:c,duration:Math.round(d.duration/1e3)}}catch(e){return void St.error(`Failed to get yandex disk video data by video ID: ${t}, because ${e.message}`)}}clearTitle(t){return t.replace(/(\.[^.]+)$/,"")}getBodyHash(t,e){const o=JSON.stringify({hash:t,sk:e});return encodeURIComponent(o)}async fetchList(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/fetch-list",{method:"POST",body:o}),a=await i.json();if(Object.hasOwn(a,"error"))throw new Re("Failed to fetch folder list");return a.resources}async getDownloadUrl(t,e){const o=this.getBodyHash(t,e),i=await this.fetch(this.API_ORIGIN+"/public/api/download-url",{method:"POST",body:o}),a=await i.json();if(a.error)throw new Re("Failed to get download url");return a.data.url}async getDiskVideoData(t){try{const e=document.getElementById("store-prefetch");if(!e)throw new Re("Failed to get prefetch data");const o=t.split("/").slice(3);if(!o.length)throw new Re("Failed to find video file path");const i=JSON.parse(e.innerText),{resources:a,rootResourceId:n,environment:{sk:r}}=i,s=a[n],l=o.length-1,d=o.filter(((t,e)=>e!==l)).join("/");let u=Object.values(a);d.includes("/")&&(u=await this.fetchList(`${s.hash}:/${d}`,r));const c=u.find((t=>t.name===o[l]));if(!c)throw new Re("Failed to find resource");if(c&&"dir"===c.type)throw new Re("Path is dir, but expected file");const{meta:{short_url:h,mediatype:p,videoDuration:g},path:m,name:v}=c;if("video"!==p)throw new Re("Resource isn't a video");const f=this.clearTitle(v),b=Math.round(g/1e3);if(h)return{url:h,duration:b,title:f};const y=await this.getDownloadUrl(m,r);return{url:Xt(new URL(y)),duration:b,title:f}}catch(e){return void St.error(`Failed to get yandex disk video data by disk video ID: ${t}`,e.message)}}async getVideoData(t){return t.startsWith(this.INLINE_PREFIX)?{url:this.service.url+t.slice(1)}:(t=decodeURIComponent(t)).startsWith(this.CLIENT_PREFIX)?await this.getClientVideoData(t):await this.getDiskVideoData(t)}async getVideoId(t){if(t.pathname.startsWith(this.CLIENT_PREFIX))return t.pathname+t.search;const e=/\/i\/([^/]+)/.exec(t.pathname)?.[0];return e||(/\/d\/([^/]+)\/([^/]+)/.exec(t.pathname)?t.pathname:void 0)}},[oe.vk]:Fe,[oe.trovo]:class extends $e{async getVideoId(t){const e=t.searchParams.get("vid"),o=/([^/]+)\/([\d]+)/.exec(t.pathname)?.[0];if(e&&o)return`${o}?vid=${e}`}},[oe.incestflix]:class extends $e{async getVideoData(t){try{const t=document.querySelector("#incflix-stream source:first-of-type");if(!t)throw new Re("Failed to find source element");const e=t.getAttribute("src");if(!e)throw new Re("Failed to find source link");const o=new URL(e.startsWith("//")?`https:${e}`:e);return o.searchParams.append("media-proxy","video.mp4"),{url:Xt(o)}}catch(e){return void St.error(`Failed to get Incestflix data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.porntn]:class extends $e{async getVideoData(t){try{if("undefined"==typeof flashvars)return;const{rnd:t,video_url:e,video_title:o}=flashvars;if(!e||!t)throw new Re("Failed to find video source or rnd");const i=new URL(e);i.searchParams.append("rnd",t),St.log("PornTN get_file link",i.href);const a=await this.fetch(i.href,{method:"head"}),n=new URL(a.url);St.log("PornTN cdn link",n.href);return{url:Xt(n),title:o}}catch(e){return void St.error(`Failed to get PornTN data by videoId: ${t}`,e.message)}}async getVideoId(t){return/\/videos\/(([^/]+)\/([^/]+))/.exec(t.pathname)?.[1]}},[oe.googledrive]:class extends $e{getPlayerData(){const t=document.querySelector("#movie_player");return t?.getVideoData?.call()??void 0}async getVideoId(t){return this.getPlayerData()?.video_id}},[oe.bilibili]:class extends $e{async getVideoId(t){const e=/bangumi\/play\/([^/]+)/.exec(t.pathname)?.[0];if(e)return e;const o=t.searchParams.get("bvid");if(o)return`video/${o}`;let i=/video\/([^/]+)/.exec(t.pathname)?.[0];return i&&null!==t.searchParams.get("p")&&(i+=`/?p=${t.searchParams.get("p")}`),i}},[oe.xvideos]:class extends $e{async getVideoId(t){return/[^/]+\/[^/]+$/.exec(t.pathname)?.[0]}},[oe.watchpornto]:class extends $e{async getVideoId(t){return/(video|embed)\/(\d+)(\/[^/]+\/)?/.exec(t.pathname)?.[0]}},[oe.archive]:class extends $e{async getVideoId(t){return/(details|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[oe.dailymotion]:class extends $e{async getVideoId(t){const e=Array.from(document.querySelectorAll("*")).filter((t=>t.innerHTML.trim().includes(".m3u8"))),o=e?.[1]?.lastChild?.src;return o?/\/video\/(\w+)\.m3u8/.exec(o)?.[1]:void 0}},[oe.youku]:class extends $e{async getVideoId(t){return/v_show\/id_[\w=]+/.exec(t.pathname)?.[0]}},[oe.egghead]:class extends $e{async getVideoId(t){return t.pathname.slice(1)}},[oe.newgrounds]:class extends $e{async getVideoId(t){return/([^/]+)\/(view)\/([^/]+)/.exec(t.pathname)?.[0]}},[oe.okru]:class extends $e{async getVideoId(t){return/\/video\/(\d+)/.exec(t.pathname)?.[1]}},[oe.peertube]:class extends $e{async getVideoId(t){return/\/w\/([^/]+)/.exec(t.pathname)?.[0]}},[oe.eporner]:class extends $e{async getVideoId(t){return/video-([^/]+)\/([^/]+)/.exec(t.pathname)?.[0]}},[oe.bitchute]:class extends $e{async getVideoId(t){return/(video|embed)\/([^/]+)/.exec(t.pathname)?.[2]}},[oe.rutube]:class extends $e{async getVideoId(t){return/(?:video|embed)\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.facebook]:class extends $e{async getVideoId(t){return t.pathname.slice(1)}},[oe.rumble]:class extends $e{async getVideoId(t){return t.pathname.slice(1)}},[oe.twitter]:class extends $e{async getVideoId(t){const e=/status\/([^/]+)/.exec(t.pathname)?.[1];if(e)return e;const o=this.video?.closest('[data-testid="tweet"]'),i=o?.querySelector('a[role="link"][aria-label]')?.href;return i?/status\/([^/]+)/.exec(i)?.[1]:void 0}},[oe.pornhub]:class extends $e{async getVideoId(t){return t.searchParams.get("viewkey")??/embed\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.tiktok]:Ue,[oe.proxitok]:Ue,[oe.nine_gag]:class extends $e{async getVideoId(t){return/gag\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.youtube]:We,[oe.ricktube]:We,[oe.invidious]:We,[oe.poketube]:We,[oe.piped]:We,[oe.dzen]:class extends $e{async getVideoId(t){return/video\/watch\/([^/]+)/.exec(t.pathname)?.[1]}},[oe.cloudflarestream]:class extends $e{async getVideoId(t){return t.pathname+t.search}},[oe.loom]:class extends $e{getClientVersion(){if("undefined"==typeof SENTRY_RELEASE)return;return SENTRY_RELEASE.id}async getVideoData(t){try{const e=this.getClientVersion();if(!e)throw new Re("Failed to get client version");const o=await this.fetch("https://www.loom.com/graphql",{headers:{"User-Agent":wt.userAgent,"content-type":"application/json","x-loom-request-source":`loom_web_${e}`,"apollographql-client-name":"web","apollographql-client-version":e,"Alt-Used":"www.loom.com"},body:`{"operationName":"FetchCaptions","variables":{"videoId":"${t}"},"query":"query FetchCaptions($videoId: ID!, $password: String) {\\n fetchVideoTranscript(videoId: $videoId, password: $password) {\\n ... on VideoTranscriptDetails {\\n id\\n captions_source_url\\n language\\n __typename\\n }\\n ... on GenericError {\\n message\\n __typename\\n }\\n __typename\\n }\\n}"}`,method:"POST"});if(200!==o.status)throw new Re("Failed to get data from graphql");const i=(await o.json()).data.fetchVideoTranscript;if("GenericError"===i.__typename)throw new Re(i.message);return{url:this.service.url+t,subtitles:[{format:"vtt",language:Zt(i.language),source:"loom",url:i.captions_source_url}]}}catch(e){return St.error(`Failed to get Loom video data, because: ${e.message}`),this.returnBaseData(t)}}async getVideoId(t){return/(embed|share)\/([^/]+)?/.exec(t.pathname)?.[2]}},[oe.rtnews]:class extends $e{async getVideoData(t){const e=document.querySelector(".jw-video, .media__video_noscript");if(!e)return;let o=e.getAttribute("src");return o?(o.endsWith(".MP4")&&(o=Xt(o)),{videoId:t,url:o}):void 0}async getVideoId(t){return t.pathname.slice(1)}},[Be.udemy]:class extends $e{API_ORIGIN="https://www.udemy.com/api-2.0";getModuleData(){const t=document.querySelector(".ud-app-loader[data-module-id='course-taking']"),e=t?.dataset?.moduleArgs;if(e)return JSON.parse(e)}getLectureId(){return/learn\/lecture\/([^/]+)/.exec(window.location.pathname)?.[1]}async getLectureData(t,e){try{const o=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}/lectures/${e}/?`+new URLSearchParams({"fields[lecture]":"title,description,asset","fields[asset]":"length,media_sources,captions"}).toString());return await o.json()}catch(o){return void St.error(`Failed to get lecture data by courseId: ${t} and lectureId: ${e}`,o.message)}}async getCourseLang(t){try{const e=await this.fetch(`${this.API_ORIGIN}/users/me/subscribed-courses/${t}?`+new URLSearchParams({"fields[course]":"locale"}).toString());return await e.json()}catch(e){return void St.error(`Failed to get course lang by courseId: ${t}`,e.message)}}findVideoUrl(t){return t?.find((t=>"video/mp4"===t.type))?.src}findSubtitleUrl(t,e){let o=t?.find((t=>Zt(t.locale_id)===e));return o||(o=t?.find((t=>"en"===Zt(t.locale_id)))??t?.[0]),o?.url}async getVideoData(t){const e=this.getModuleData();if(!e)return;const{courseId:o}=e,i=this.getLectureId();if(St.log(`[Udemy] courseId: ${o}, lectureId: ${i}`),!i)return;const a=await this.getLectureData(o,i);if(!a)return;const{title:n,description:r,asset:s}=a,{length:l,media_sources:d,captions:u}=s,c=this.findVideoUrl(d);if(!c)return void St.log("Failed to find .mp4 video file in media_sources",d);let h="en";const p=await this.getCourseLang(o);if(p){const{locale:{locale:t}}=p;h=t?Zt(t):h}qe.includes(h)||(h="en");const g=this.findSubtitleUrl(u,h);return g||St.log("Failed to find subtitle file in captions",u),{...g?{url:this.service?.url+t,translationHelp:[{target:"subtitles_file_url",targetUrl:g},{target:"video_file_url",targetUrl:c}],detectedLanguage:h}:{url:c,translationHelp:null},duration:l,title:n,description:r}}async getVideoId(t){return t.pathname.slice(1)}},[Be.coursera]:je,[Be.douyin]:Ge,[Be.artstation]:class extends $e{API_ORIGIN="https://www.artstation.com/api/v2/learning";getCSRFToken(){return document.querySelector('meta[name="public-csrf-token"]')?.content}async getCourseInfo(t){try{const e=await this.fetch(`${this.API_ORIGIN}/courses/${t}/autoplay.json`,{method:"POST",headers:{"PUBLIC-CSRF-TOKEN":this.getCSRFToken()}});return await e.json()}catch(e){return St.error(`Failed to get artstation course info by courseId: ${t}.`,e.message),!1}}async getVideoUrl(t){try{const e=await this.fetch(`${this.API_ORIGIN}/quicksilver/video_url.json?chapter_id=${t}`);return(await e.json()).url.replace("qsep://","https://")}catch(e){return St.error(`Failed to get artstation video url by chapterId: ${t}.`,e.message),!1}}async getVideoData(t){const[,e,,,o]=t.split("/"),i=await this.getCourseInfo(e);if(!i)return;const a=i.chapters.find((t=>t.hash_id===o));if(!a)return;const n=await this.getVideoUrl(a.id);if(!n)return;const{title:r,duration:s,subtitles:l}=a;return{url:n,title:r,duration:s,subtitles:l.filter((t=>"vtt"===t.format)).map((t=>({language:Zt(t.locale),source:"artstation",format:"vtt",url:t.file_url})))}}async getVideoId(t){return/courses\/(\w{3,5})\/([^/]+)\/chapters\/(\w{3,5})/.exec(t.pathname)?.[0]}}};class Ke{helpersData;constructor(t={}){this.helpersData=t}getHelper(t){return new Je[t](this.helpersData)}}async function Ze(t,e={}){const o=new URL(window.location.href),i=t.host;if(Object.keys(Je).includes(i)){const t=new Ke(e).getHelper(i);return await t.getVideoId(o)}return i===oe.custom?o.href:void 0}function Xe(t,e=","){const o=t/1e3,i=Math.floor(o/3600),a=Math.floor(o%3600/60),n=Math.floor(o%60),r=Math.floor(t%1e3);return`${i.toString().padStart(2,"0")}:${a.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}${e}${r.toString().padStart(3,"0")}`}function Qe(t){const e=t.split(" ")?.[0]?.split(":");e.length<3&&e.unshift("00");const[o,i,a]=e;return 36e5*+o+6e4*+i+ +a.replace(/[,.]/,"")}function to(t,e="srt"){const o="vtt"===e,i=o?".":",",a=t.subtitles.map(((t,e)=>(o?"":`${e+1}\n`)+`${Xe(t.startMs,i)} --\x3e ${Xe(t.startMs+t.durationMs,i)}\n${t.text}\n\n`)).join("").trim();return o?`WEBVTT\n\n${a}`:a}function eo(t,e="srt"){const o=function(t){return"string"!=typeof t?"json":/^(WEBVTT)(\r?\n)/.exec(t)?"vtt":"srt"}(t);return o===e?t:"json"===o?to(t,e):(t=function(t,e="srt"){const o=t.split(/\r?\n\r?\n/g);"vtt"===e&&o.shift(),/^\d+\r?\n/.exec(o?.[0]??"")&&(e="srt");const i=+("srt"===e);return{containsTokens:!1,subtitles:o.reduce(((t,e)=>{const o=e.trim().split("\n"),a=o[i],n=o.slice(i+1).join("\n");if(!(2===o.length&&e.includes(" --\x3e ")||a?.includes(" --\x3e ")))return 0===t.length||(t[t.length-1].text+=`\n\n${o.join("\n")}`),t;const[r,s]=a.split(" --\x3e "),l=Qe(r),d=Qe(s)-l;return t.push({text:n,startMs:l,durationMs:d,speakerId:"0"}),t}),[])}}(t,o),"json"===e?t:to(t,e))}class oo{static formatYandexTokens(t){const e=t.startMs+t.durationMs;return t.tokens.reduce(((o,i,a)=>{const n=t.tokens[a+1],r=o[o.length-1],s=r?.alignRange?.end??0,l=s+i.text.length;if(i.alignRange={start:s,end:l},o.push(i),n){const t=i.startMs+i.durationMs,a=n.startMs?n.startMs-t:e-t;o.push({text:" ",startMs:t,durationMs:a,alignRange:{start:l,end:l+1}})}return o}),[])}static createTokens(t,e){const o=t.text.split(/([\n \t])/).reduce(((t,o)=>{if(!o.length)return t;const i=t[t.length-1]??e,a=i?.alignRange?.end??0,n=a+o.length;return t.push({text:o,alignRange:{start:a,end:n}}),t}),[]),i=Math.floor(t.durationMs/o.length),a=t.startMs+t.durationMs;return o.map(((e,n)=>{const r=n===o.length-1,s=t.startMs+i*n;return{...e,startMs:s,durationMs:r?a-s:i}}))}static processTokens(t,e){const o=[];let i;const{source:a,isAutoGenerated:n}=e;for(const e of t.subtitles){const t=e?.tokens?.length,r=t&&("yandex"===a||"youtube"===a&&n)?this.formatYandexTokens(e):this.createTokens(e,i);i=r[r.length-1],o.push({...e,tokens:r})}return t.containsTokens=!0,o}static formatYoutubeSubtitles(t,e=!1){if(!t?.events?.length)return console.error("[VOT] Invalid YouTube subtitles format:",t),{containsTokens:e,subtitles:[]};const o={containsTokens:e,subtitles:[]};for(let i=0;it.events[i+1].tStartMs&&(n=t.events[i+1].tStartMs-a.tStartMs);const r=[];let s=n;for(let t=0;tt.text)).join(" ");l&&o.subtitles.push({text:l,startMs:a.tStartMs,durationMs:n,...e?{tokens:r}:{}})}return o}static cleanJsonSubtitles(t){const{containsTokens:e,subtitles:o}=t;return{containsTokens:e,subtitles:o.map((t=>({...t,text:t.text.replace(/(<([^>]+)>)/gi,"")})))}}static async fetchWithTimeout(t,e=5e3){try{return await we(t,{timeout:e})}catch(t){throw console.error("[VOT] Fetch failed:",t),t}}static async fetchSubtitles(t){const{source:e,isAutoGenerated:o,format:i,url:a}=t;try{const n=await this.fetchWithTimeout(a);let r;if(["vtt","srt"].includes(i)){r=eo(await n.text(),"json")}else r=await n.json();return"youtube"===e&&(r=this.formatYoutubeSubtitles(r,o)),"vk"===e&&(r=this.cleanJsonSubtitles(r)),r.subtitles=this.processTokens(r,t),console.log("[VOT] Processed subtitles:",r),r}catch(t){return console.error("[VOT] Failed to process subtitles:",t),{containsTokens:!1,subtitles:[]}}}static async getSubtitles(t,e){const{host:o,url:i,detectedLanguage:a,videoId:n,duration:r,subtitles:s=[]}=e;try{const e=await Promise.race([t.getSubtitles({videoData:{host:o,url:i,videoId:n,duration:r},requestLang:a}),new Promise(((t,e)=>setTimeout((()=>e(new Error("Timeout"))),5e3)))]);console.log("[VOT] Subtitles response:",e),e.waiting&&console.error("[VOT] Failed to get Yandex subtitles");const l=(e.subtitles??[]).reduce(((t,e)=>(e.language&&!t.find((t=>"yandex"===t.source&&t.language===e.language&&!t.translatedFromLanguage))&&t.push({source:"yandex",language:e.language,url:e.url}),e.translatedLanguage&&t.push({source:"yandex",language:e.translatedLanguage,translatedFromLanguage:e.language,url:e.translatedUrl}),t)),[]);return[...l,...s].sort(((t,e)=>{if(t.source!==e.source)return"yandex"===t.source?-1:1;if(t.language!==e.language&&(t.language===ge||e.language===ge))return t.language===ge?-1:1;if("yandex"===t.source){if(t.translatedFromLanguage!==e.translatedFromLanguage)return t.translatedFromLanguage&&e.translatedFromLanguage?t.translatedFromLanguage===a?-1:1:t.language===e.language?t.translatedFromLanguage?1:-1:t.translatedFromLanguage?-1:1;if(!t.translatedFromLanguage)return t.language===a?-1:1}return"yandex"!==t.source&&t.isAutoGenerated!==e.isAutoGenerated?t.isAutoGenerated?1:-1:0}))}catch(t){const e="Timeout"===t.message?"Failed to get Yandex subtitles: timeout":"Error in getSubtitles function";throw console.error(`[VOT] ${e}`,t),t}}}class io{constructor(t,e,o){this.video=t,this.container="youtube"===o.host&&"mobile"!==o.additionalData?e.parentElement:e,this.site=o,this.subtitlesContainer=this.createSubtitlesContainer(),this.position={left:25,top:75},this.dragging={active:!1,offset:{x:0,y:0}},this.subtitles=null,this.lastContent=null,this.highlightWords=!1,this.fontSize=20,this.opacity=.2,this.maxLength=300,this.abortController=new AbortController,this.bindEvents(),this.updateContainerRect()}createSubtitlesContainer(){return this.subtitlesContainer=document.createElement("vot-block"),this.subtitlesContainer.classList.add("vot-subtitles-widget"),this.container.appendChild(this.subtitlesContainer),this.subtitlesContainer}bindEvents(){const{signal:t}=this.abortController;this.onPointerDownBound=t=>this.onPointerDown(t),this.onPointerUpBound=()=>this.onPointerUp(),this.onPointerMoveBound=t=>this.onPointerMove(t),this.onTimeUpdateBound=this.debounce((()=>this.update()),100),document.addEventListener("pointerdown",this.onPointerDownBound,{signal:t}),document.addEventListener("pointerup",this.onPointerUpBound,{signal:t}),document.addEventListener("pointermove",this.onPointerMoveBound,{signal:t}),this.video?.addEventListener("timeupdate",this.onTimeUpdateBound,{signal:t}),this.resizeObserver=new ResizeObserver((()=>this.onResize())),this.resizeObserver.observe(this.container)}onPointerDown(t){if(!this.subtitlesContainer.contains(t.target))return;const e=this.subtitlesContainer.getBoundingClientRect(),o=this.container.getBoundingClientRect();this.dragging={active:!0,offset:{x:t.clientX-e.left,y:t.clientY-e.top},containerOffset:{x:o.left,y:o.top}}}onPointerUp(){this.dragging.active=!1}onPointerMove(t){if(!this.dragging.active)return;t.preventDefault();const{width:e,height:o}=this.container.getBoundingClientRect(),{containerOffset:i,offset:a}=this.dragging;this.position={left:(t.clientX-a.x-i.x)/e*100,top:(t.clientY-a.y-i.y)/o*100},this.applySubtitlePosition()}onResize(){this.updateContainerRect()}updateContainerRect(){this.containerRect=this.container.getBoundingClientRect(),this.applySubtitlePosition()}applySubtitlePosition(){const{width:t,height:e}=this.containerRect,{offsetWidth:o,offsetHeight:i}=this.subtitlesContainer,a=(t-o)/t*100,n=(e-i)/e*100;this.position.left=Math.max(0,Math.min(this.position.left,a)),this.position.top=Math.max(0,Math.min(this.position.top,n)),this.subtitlesContainer.style.left=`${this.position.left}%`,this.subtitlesContainer.style.top=`${this.position.top}%`}processTokens(t){if(t.at(-1).alignRange.end<=this.maxLength)return t;const e=[];let o=[],i=0;for(const a of t)i+=a.text.length,o.push(a),i>this.maxLength&&(e.push(this.trimChunk(o)),o=[],i=0);o.length&&e.push(this.trimChunk(o));const a=1e3*this.video.currentTime;return e.find((t=>t[0].startMs{const o=this.highlightWords&&(e>t.startMs+t.durationMs/2||e>t.startMs-100&&t.startMs+t.durationMs/2-e<275);return k` ${t.text.replace("\\n","
")}
`}))}debounce(t,e){let o;return(...i)=>{clearTimeout(o),o=setTimeout((()=>t.apply(this,i)),e)}}setContent(t){if(!t||!this.video)return this.subtitles=null,void U(null,this.subtitlesContainer);this.subtitles=t,this.update()}setMaxLength(t){"number"==typeof t&&t>0&&(this.maxLength=t,this.update())}setHighlightWords(t){this.highlightWords=Boolean(t),this.update()}setFontSize(t){this.fontSize=t;const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&(e.style.fontSize=`${t}px`)}setOpacity(t){this.opacity=((100-+t)/100).toFixed(2);const e=this.subtitlesContainer?.querySelector(".vot-subtitles");e&&e.style.setProperty("--vot-subtitles-opacity",this.opacity)}update(){if(!this.video||!this.subtitles)return;const t=1e3*this.video.currentTime,e=this.subtitles.subtitles.findLast((e=>e.startMs{await this.handleTranslationBtnClick()})),this.votButton.pipButton.addEventListener("pointerdown",(async()=>{const t=this.video===document.pictureInPictureElement;await(t?document.exitPictureInPicture():this.video.requestPictureInPicture())})),this.votButton.menuButton.addEventListener("pointerdown",(()=>{this.votMenu.container.hidden=!this.votMenu.container.hidden}));const t=async t=>{const e=this.container.clientWidth>550,o=e?t<=44?"left":t>=66?"right":"default":"default";this.data.buttonPos=o,this.votButton.container.dataset.direction="default"===o?"row":"column",this.votButton.container.dataset.position=o,this.votMenu.container.dataset.position=o,e&&await he.set("buttonPos",o)},e=async(e,o,i=this.container.getBoundingClientRect())=>{if(!this.dragging)return;e.preventDefault();const a=(i?o-i.left:o)/(i?i.width:this.container.clientWidth)*100;await t(a)};this.votButton.container.addEventListener("pointerdown",(t=>{this.dragging=!0,t.preventDefault()})),this.container.addEventListener("pointerup",(()=>this.dragging=!1)),this.container.addEventListener("pointermove",(t=>e(t,t.clientX))),this.votButton.container.addEventListener("touchstart",(t=>{this.dragging=!0,t.preventDefault()}),{passive:!1}),this.container.addEventListener("touchend",(()=>this.dragging=!1)),this.container.addEventListener("touchmove",(t=>{e(t,t.touches[0].clientX,this.container.getBoundingClientRect())}),{passive:!1});for(const t of["pointercancel","touchcancel"])document.addEventListener(t,(()=>this.dragging=!1))}this.votDownloadButton.addEventListener("click",(async()=>{if(!this.downloadTranslationUrl)return;if(!this.data.downloadWithName)return window.open(this.downloadTranslationUrl,"_blank").focus();const t=document.querySelector("#vot-loader-download"),e=getComputedStyle(this.votMenu.container).getPropertyValue("--vot-primary-rgb"),o=po.animateLoader(t,e),i=await we(this.downloadTranslationUrl),a=i.body.getReader(),n=+i.headers.get("Content-Length");let r=0;const s=[];for(;;){const{done:t,value:e}=await a.read();if(t)break;s.push(e),r+=e.length,o(Math.round(r/n*100))}po.afterAnimateLoader(t,e);const l=new Blob(s),d=ye(this.videoData.downloadTitle),u=await l.arrayBuffer(),c=new K(u);c.setFrame("TIT2",d),c.addTag(),be(c.getBlob(),`${d}.mp3`)})),this.votDownloadSubtitlesButton.addEventListener("click",(async()=>{const t=this.data.subtitlesDownloadFormat,e=eo(this.yandexSubtitles,t);be(new Blob(["json"===t?JSON.stringify(e):e],{type:"text/plain"}),`${this.data.downloadWithName?ye(this.videoData.downloadTitle):`subtitles_${this.videoData.videoId}`}.${t}`)})),this.votSettingsButton.addEventListener("click",(()=>{this.votSettingsDialog.container.hidden=!this.votSettingsDialog.container.hidden,(document.fullscreenElement||document.webkitFullscreenElement)&&(document.webkitExitFullscreen&&document.webkitExitFullscreen(),document.exitFullscreen&&document.exitFullscreen())})),this.votVideoVolumeSlider.input.addEventListener("input",(t=>{const e=Number(t.target.value);this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,this.setVideoVolume(e/100),this.data.syncVolume&&this.syncVolumeWrapper("video",e)})),this.votVideoTranslationVolumeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.defaultVolume=Number(t.target.value),await he.set("defaultVolume",this.data.defaultVolume),this.votVideoTranslationVolumeSlider.label.querySelector("strong").textContent=`${this.data.defaultVolume}%`,this.audioPlayer.player.volume=this.data.defaultVolume/100,this.data.syncVolume&&(this.syncVolumeWrapper("translation",this.data.defaultVolume),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData&&this.setVideoVolume(this.tempOriginalVolume/100))})()}));{this.votAutoTranslateCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.autoTranslate=Number(t.target.checked),await Promise.all([he.set("autoTranslate",this.data.autoTranslate),this.autoTranslate()]),ae.log("autoTranslate value changed. New value: ",this.data.autoTranslate)})()})),this.votDontTranslateYourLangSelect.labelElement.addEventListener("change",(t=>{(async()=>{this.data.dontTranslateYourLang=Number(t.target.checked),await he.set("dontTranslateYourLang",this.data.dontTranslateYourLang),ae.log("dontTranslateYourLang value changed. New value: ",this.data.dontTranslateYourLang)})()}));const t=async t=>{await he.set("hotkeyButton",t),this.data.hotkeyButton=t,this.changehotkeyButton.textContent=So(t)},e=o=>{const i="Escape"===o.code?null:o.code;t(i),document.removeEventListener("keydown",e)};this.changehotkeyButton.addEventListener("click",(()=>{this.changehotkeyButton.textContent=Te.get("VOTPressNewHotkey"),document.addEventListener("keydown",e)})),this.votAutoSetVolumeCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.autoSetVolumeYandexStyle=Number(t.target.checked),await he.set("autoSetVolumeYandexStyle",this.data.autoSetVolumeYandexStyle),ae.log("autoSetVolumeYandexStyle value changed. New value: ",this.data.autoSetVolumeYandexStyle)})()})),this.votAutoSetVolumeSlider.input.addEventListener("input",(t=>{(async()=>{const e=Number(t.target.value);this.data.autoVolume=(e/100).toFixed(2),await he.set("autoVolume",this.data.autoVolume),this.votAutoSetVolumeSlider.label.querySelector("strong").textContent=`${e}%`})()})),this.votShowVideoSliderCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showVideoSlider=Number(t.target.checked),await he.set("showVideoSlider",this.data.showVideoSlider),ae.log("showVideoSlider value changed. New value: ",this.data.showVideoSlider),this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||"success"!==this.votButton.container.dataset.status})()})),this.votAudioBoosterCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.audioBooster=Number(t.target.checked),await he.set("audioBooster",this.data.audioBooster),ae.log("audioBooster value changed. New value: ",this.data.audioBooster);const e=this.votVideoTranslationVolumeSlider.input.value;this.votVideoTranslationVolumeSlider.input.max=this.data.audioBooster?900:100,this.data.audioBooster||(this.votVideoTranslationVolumeSlider.input.value=e>100?100:e,this.votVideoTranslationVolumeSlider.input.dispatchEvent(new Event("input")))})()})),this.votSyncVolumeCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.syncVolume=Number(t.target.checked),await he.set("syncVolume",this.data.syncVolume),ae.log("syncVolume value changed. New value: ",this.data.syncVolume)})()})),this.votDownloadWithNameCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.downloadWithName=Number(t.target.checked),await he.set("downloadWithName",this.data.downloadWithName),ae.log("downloadWithName value changed. New value: ",this.data.downloadWithName)})()})),this.votSendNotifyOnCompleteCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.sendNotifyOnComplete=Number(t.target.checked),await he.set("sendNotifyOnComplete",this.data.sendNotifyOnComplete),ae.log("sendNotifyOnComplete value changed. New value: ",this.data.sendNotifyOnComplete)})()})),this.votUseNewModelCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.useNewModel=Number(t.target.checked),await he.set("useNewModel",this.data.useNewModel),ae.log("useNewModel value changed. New value: ",this.data.useNewModel),this.stopTranslate()})()})),this.votTranslationErrorsServiceSelect.labelElement.addEventListener("change",(t=>{(async()=>{this.data.translateAPIErrors=Number(t.target.checked),await he.set("translateAPIErrors",this.data.translateAPIErrors),ae.log("translateAPIErrors value changed. New value: ",this.data.translateAPIErrors)})()})),this.votSubtitlesDetails.container.addEventListener("click",(()=>{this.votSubtitlesDialog=po.createDialog(Te.get("VOTSubtitlesDesign")),this.votSubtitlesDialog.container.classList.add("vot-dialog-temp"),this.votSubtitlesDialog.container.hidden=!1,this.votSubtitlesDialog.backdrop.onclick=this.votSubtitlesDialog.closeButton.onclick=()=>{this.votSubtitlesDialog.container.remove()},this.votSubtitlesHighlightWordsCheckbox=po.createCheckbox(Te.get("VOTHighlightWords"),this.data?.highlightWords??!1),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesHighlightWordsCheckbox.container),this.votSubtitlesDownloadFormatSelect=po.createVOTSelect(this.data.subtitlesDownloadFormat.toUpperCase(),Te.get("VOTSubtitlesDownloadFormat"),xo(He,this.data.subtitlesDownloadFormat),{onSelectCb:async t=>{this.data.subtitlesDownloadFormat=t.target.dataset.votValue,await he.set("subtitlesDownloadFormat",this.data.subtitlesDownloadFormat)},labelElement:po.createVOTSelectLabel(Te.get("VOTSubtitlesDownloadFormat"))}),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesDownloadFormatSelect.container),this.votSubtitlesMaxLengthSlider=po.createSlider(k`${Te.get("VOTSubtitlesMaxLength")}: ${this.data?.subtitlesMaxLength??300}`,this.data?.subtitlesMaxLength??300,50,300),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesMaxLengthSlider.container),this.votSubtitlesFontSizeSlider=po.createSlider(k`${Te.get("VOTSubtitlesFontSize")}: ${this.data?.subtitlesFontSize??20}`,this.data?.subtitlesFontSize??20,8,50),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesFontSizeSlider.container),this.votSubtitlesOpacitySlider=po.createSlider(k`${Te.get("VOTSubtitlesOpacity")}: - ${this.data?.subtitlesOpacity??20}`,this.data?.subtitlesOpacity??20,0,100),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesOpacitySlider.container),this.votSubtitlesHighlightWordsCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.highlightWords=Number(t.target.checked),await he.set("highlightWords",this.data.highlightWords),ae.log("highlightWords value changed. New value: ",this.data.highlightWords),this.subtitlesWidget.setHighlightWords(this.data.highlightWords)})()})),this.votSubtitlesMaxLengthSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesMaxLength=Number(t.target.value),await he.set("subtitlesMaxLength",this.data.subtitlesMaxLength),this.votSubtitlesMaxLengthSlider.label.querySelector("strong").textContent=`${this.data.subtitlesMaxLength}`,this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength)})()})),this.votSubtitlesFontSizeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesFontSize=Number(t.target.value),await he.set("subtitlesFontSize",this.data.subtitlesFontSize),this.votSubtitlesFontSizeSlider.label.querySelector("strong").textContent=`${this.data.subtitlesFontSize}`,this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize)})()})),this.votSubtitlesOpacitySlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesOpacity=Number(t.target.value),await he.set("subtitlesOpacity",this.data.subtitlesOpacity),this.votSubtitlesOpacitySlider.label.querySelector("strong").textContent=`${this.data.subtitlesOpacity}`,this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity)})()})),document.documentElement.appendChild(this.votSubtitlesDialog.container)})),this.votShowPiPButtonCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showPiPButton=Number(t.target.checked),await he.set("showPiPButton",this.data.showPiPButton),ae.log("showPiPButton value changed. New value: ",this.data.showPiPButton),this.votButton.pipButton.hidden=this.votButton.separator2.hidden=!me()||!this.data.showPiPButton})()})),this.votM3u8ProxyHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.m3u8ProxyHost=t.target.value||ne,await he.set("m3u8ProxyHost",this.data.m3u8ProxyHost),ae.log("m3u8ProxyHost value changed. New value: ",this.data.m3u8ProxyHost)})()})),this.votProxyWorkerHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.proxyWorkerHost=t.target.value||re,await he.set("proxyWorkerHost",this.data.proxyWorkerHost),ae.log("proxyWorkerHost value changed. New value: ",this.data.proxyWorkerHost),this.data.translateProxyEnabled&&(this.votClient.host=this.data.proxyWorkerHost)})()})),this.votOnlyBypassMediaCSPCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.onlyBypassMediaCSP=Number(t.target.checked),await he.set("onlyBypassMediaCSP",this.data.onlyBypassMediaCSP),ae.log("onlyBypassMediaCSP value changed. New value: ",this.data.onlyBypassMediaCSP),this.stopTranslate(),this.createPlayer()})()})),this.votNewAudioPlayerCheckbox.input.addEventListener("change",(t=>{(async()=>{const e=t.target.checked;this.data.newAudioPlayer=Number(e),await he.set("newAudioPlayer",this.data.newAudioPlayer),ae.log("newAudioPlayer value changed. New value: ",this.data.newAudioPlayer),this.stopTranslate(),this.createPlayer(),this.votOnlyBypassMediaCSPCheckbox.input.disabled=this.votOnlyBypassMediaCSPCheckbox.container.hidden=!e})()})),this.votBugReportButton.addEventListener("click",(()=>{const t=new URLSearchParams(this.collectReportInfo()).toString();window.open(`https://github.com/ilyhalight/voice-over-translation/issues/new?${t}`,"_blank").focus()})),this.votUpdateLocaleFilesButton.addEventListener("click",(()=>{(async()=>{await he.set("locale-hash",""),await Te.update(!0),window.location.reload()})()})),this.votResetSettingsButton.addEventListener("click",(()=>{(async()=>{Te.reset();const t=await he.list();for(let e=0;e{this.extraEvents.push({element:e,event:o,handler:i}),e.addEventListener(o,i,{signal:t})},o=(t,o,i)=>{for(const a of o)e(t,a,i)};if(this.resizeObserver=new ResizeObserver((t=>{for(let e=0;e550;this.votButton.container.dataset.position=this.votMenu.container.dataset.position=e?this.data?.buttonPos:"default",this.votButton.container.dataset.direction=this.data?.buttonPos&&"default"!==this.data?.buttonPos&&e?"column":"row"})),this.resizeObserver.observe(this.video),this.votMenu.container.setAttribute("style",`--vot-container-height: ${this.video.getBoundingClientRect().height}px`),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData){this.syncVolumeObserver=new MutationObserver((t=>{if(this.audioPlayer.player.src&&this.data.syncVolume)for(let e=0;e{const e=t.target,o=this.votButton.container,i=this.votMenu.container,a=this.container,n=this.votSettingsDialog.container,r=document.querySelector(".vot-dialog-temp"),s=o.contains(e),l=i.contains(e),d=a.contains(e),u=n.contains(e),c=r?.contains(e)??!1;ae.log(`[document click] ${s} ${l} ${d} ${u} ${c}`),s||l||u||c||(d||this.logout(0),this.votMenu.container.hidden=!0)}),{signal:t}),document.addEventListener("keydown",(async t=>{const e=t.code,o=document.activeElement;["input","textarea"].includes(o.tagName.toLowerCase())||o.isContentEditable||e!==this.data.hotkeyButton||await this.handleTranslationBtnClick()}),{signal:t});let i=this.getEventContainer();i&&o(i,["pointermove","pointerout"],this.resetTimer),e(this.votButton.container,"pointermove",this.changeOpacityOnEvent),e(this.votMenu.container,"pointermove",this.changeOpacityOnEvent),"xvideos"!==this.site.host&&e(document,"touchmove",this.resetTimer),e(this.votButton.container,"pointerdown",(t=>{t.stopImmediatePropagation()})),o(this.votMenu.container,["pointerdown","mousedown"],(t=>{t.stopImmediatePropagation()})),"youtube"===this.site.host&&(this.container.draggable=!1),"googledrive"===this.site.host&&(this.container.style.height="100%"),e(this.video,"canplay",(async()=>{"rutube"===this.site.host&&this.video.src||await this.setCanPlay()})),e(this.video,"emptied",(async()=>{this.video.src&&await Ze(this.site,{fetchFn:we,video:this.video})===this.videoData.videoId||(ae.log("lipsync mode is emptied"),this.videoData="",this.stopTranslation())})),["rutube","ok"].includes(this.site.host)||e(this.video,"volumechange",(()=>{this.syncVideoVolumeSlider()})),"youtube"!==this.site.host||this.site.additionalData||e(document,"yt-page-data-updated",(async()=>{ae.log("yt-page-data-updated"),window.location.pathname.includes("/shorts/")&&await this.setCanPlay()}))}async setCanPlay(){await Ze(this.site,{fetchFn:we,video:this.video})!==this.videoData.videoId&&(await this.handleSrcChanged(),await this.autoTranslate(),ae.log("lipsync mode is canplay"))}logout(t){this.votMenu.container.hidden&&(this.votButton.container.style.opacity=t)}resetTimer=()=>{clearTimeout(this.timer),this.logout(1),this.timer=setTimeout((()=>{this.logout(0)}),1e3)};changeOpacityOnEvent=t=>{clearTimeout(this.timer),this.logout(1),t.stopPropagation()};async changeSubtitlesLang(t){if(ae.log("[onchange] subtitles",t),this.votSubtitlesSelect.setSelected(t),"disabled"===t)this.votSubtitlesSelect.setTitle(Te.get("VOTSubtitlesDisabled")),this.subtitlesWidget.setContent(null),this.votDownloadSubtitlesButton.hidden=!0,this.yandexSubtitles=null;else{const e=this.subtitlesList.at(parseInt(t));if(2===this.data.translateProxyEnabled&&e.url.startsWith("https://brosubs.s3-private.mds.yandex.net/vtrans/")){const t=e.url.replace("https://brosubs.s3-private.mds.yandex.net/vtrans/","");e.url=`https://${this.data.proxyWorkerHost}/video-subtitles/subtitles-proxy/${t}`,console.log(`[VOT] Subs proxied via ${e.url}`)}this.yandexSubtitles=await oo.fetchSubtitles(e),this.subtitlesWidget.setContent(this.yandexSubtitles),this.votDownloadSubtitlesButton.hidden=!1}}async updateSubtitlesLangSelect(){const t=[{label:Te.get("VOTSubtitlesDisabled"),value:"disabled",selected:!0,disabled:!1},...this.subtitlesList.map(((t,e)=>({label:(Te.get("langs")[t.language]??t.language.toUpperCase())+(t.translatedFromLanguage?` ${Te.get("VOTTranslatedFrom")} ${Te.get("langs")[t.translatedFromLanguage]??t.translatedFromLanguage.toUpperCase()}`:"")+("yandex"!==t.source?`, ${window.location.hostname}`:"")+(t.isAutoGenerated?` (${Te.get("VOTAutogenerated")})`:""),value:e,selected:!1,disabled:!1})))];this.votSubtitlesSelect.updateItems(t),await this.changeSubtitlesLang(t[0].value)}async updateSubtitles(){if(await this.changeSubtitlesLang("disabled"),!this.videoData.videoId)return console.error(`[VOT] ${Te.getDefault("VOTNoVideoIDFound")}`),this.subtitlesList=[],this.subtitlesListVideoId=null,this.votButton.container.hidden=!0,void await this.updateSubtitlesLangSelect();this.votButton.container.hidden=!1,this.subtitlesListVideoId!==this.videoData.videoId&&(this.subtitlesList=await oo.getSubtitles(this.votClient,this.videoData),this.subtitlesList?this.subtitlesListVideoId=this.videoData.videoId:await this.changeSubtitlesLang("disabled"),await this.updateSubtitlesLangSelect())}getVideoVolume(){let t=this.video?.volume;return["youtube","googledrive"].includes(this.site.host)&&(t=We.getVolume()??t),t}setVideoVolume(t){if(["youtube","googledrive"].includes(this.site.host)){if(We.setVolume(t))return this}return this.video.volume=t,this}isMuted(){return["youtube","googledrive"].includes(this.site.host)?We.isMuted():this.video?.muted}syncVideoVolumeSlider(){const t=this.isMuted()?0:100*this.getVideoVolume(),e=Math.round(t);this.votVideoVolumeSlider.input.value=e,this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,po.updateSlider(this.votVideoVolumeSlider.input),1===this.data.syncVolume&&(this.tempOriginalVolume=Number(e))}setSelectMenuValues(t,e){this.votTranslationLanguageSelect.fromSelect.setTitle(Te.get("langs")[t]),this.votTranslationLanguageSelect.toSelect.setTitle(Te.get("langs")[e]),this.votTranslationLanguageSelect.fromSelect.setSelected(t),this.votTranslationLanguageSelect.toSelect.setSelected(e),console.log(`[VOT] Set translation from ${t} to ${e}`),this.videoData.detectedLanguage=t,this.videoData.responseLanguage=e}syncVolumeWrapper(t,e){const o="translation"===t?this.votVideoVolumeSlider:this.votVideoTranslationVolumeSlider,i=Number(o.input.value),a=function(t,e,o,i){let a=e;return e>i?(a=o+(e-i),a=a>100?100:Math.max(a,0),t.volume=a/100):e100?100:Math.max(a,0),t.volume=a/100),a}("translation"===t?this.video:this.audioPlayer.player,e,i,"translation"===t?this.tempVolume:this.tempOriginalVolume);o.input.value=a,o.label.querySelector("strong").textContent=`${a}%`,po.updateSlider(o.input),this.tempOriginalVolume="translation"===t?a:e,this.tempVolume="translation"===t?e:a}async getVideoData(){const{duration:t,url:e,videoId:o,host:i,title:a,translationHelp:n=null,localizedTitle:r,description:s,detectedLanguage:l,subtitles:d,isStream:u=!1}=await async function(t,e={}){const o=await Ze(t,e);if(!o)throw new Me(`Entered unsupported link: "${t.host}"`);const i=window.location.origin;if([oe.peertube,oe.coursehunterLike,oe.cloudflarestream].includes(t.host)&&(t.url=i),t.rawResult)return{url:o,videoId:o,host:t.host,duration:void 0};if(!t.needExtraData)return{url:t.url+o,videoId:o,host:t.host,duration:void 0};const a=new Ke({...e,service:t,origin:i}).getHelper(t.host),n=await a.getVideoData(o);if(!n)throw new Me(`Failed to get video raw url for ${t.host}`);return{...n,videoId:o,host:t.host}}(this.site,{fetchFn:we,video:this.video,language:Te.lang});let c=l??this.translateFromLang;if(!l&&a){const t=function(t,e){return`${t} ${e?e.split("\n").filter((t=>!fe.test(t))).join(" "):""}`.slice(0,450).replace(/[^\p{L}\s]+|\s+/gu," ").trim()}(a,s);ae.log(`Detecting language text: ${t}`);const e=await async function(t){const e=await he.get("detectService",de);switch(e){case"yandexbrowser":case"msedge":return await vo.detect(t,e);case"rust-server":return await fo.detect(t);default:return"en"}}(t);qe.includes(e)&&(c=e)}const h={translationHelp:n,isStream:u,duration:t||this.video?.duration||wt.defaultDuration,videoId:o,url:e,host:i,detectedLanguage:c,responseLanguage:this.translateToLang,subtitles:d,title:a,localizedTitle:r,downloadTitle:r??a??o};if(console.log("[VOT] Detected language:",c),["rutube","ok.ru","mail_ru"].includes(this.site.host))h.detectedLanguage="ru";else if("youku"===this.site.host)h.detectedLanguage="zh";else if("vk"===this.site.host){const t=document.getElementsByTagName("track")?.[0]?.srclang;h.detectedLanguage=t||"auto"}else"weverse"===this.site.host&&(h.detectedLanguage="ko");return h}videoValidator(){if(ae.log("VideoValidator videoData: ",this.videoData),1===this.data.dontTranslateYourLang&&this.data.dontTranslateLanguage?.includes(this.videoData.detectedLanguage))throw new Ce("VOTDisableFromYourLang");if(!this.videoData.isStream&&this.videoData.duration>14400)throw new Ce("VOTVideoIsTooLong");return!0}stopTranslate(){this.audioPlayer.player.removeVideoEvents(),this.audioPlayer.player.clear(),this.audioPlayer.player.src=void 0,ae.log("audioPlayer after stopTranslate",this.audioPlayer),this.votVideoVolumeSlider.container.hidden=!0,this.votVideoTranslationVolumeSlider.container.hidden=!0,this.votDownloadButton.hidden=!0,this.downloadTranslationUrl=null,this.longWaitingResCount=0,this.transformBtn("none",Te.get("translateVideo")),ae.log(`Volume on start: ${this.volumeOnStart}`),this.volumeOnStart&&this.setVideoVolume(this.volumeOnStart),clearInterval(this.streamPing),clearTimeout(this.autoRetry),this.hls?.destroy(),this.hls=ve(),this.firstSyncVolume=!0}async translateExecutor(t){ae.log("Run translateFunc",t),await this.translateFunc(t,this.videoData.isStream,this.videoData.detectedLanguage,this.videoData.responseLanguage,this.videoData.translationHelp)}async updateTranslationErrorMsg(t){const e=Te.get("translationTake"),o=Te.lang;if(this.longWaitingResCount=t===Te.get("translationTakeAboutMinute")?this.longWaitingResCount+1:0,ae.log("longWaitingResCount",this.longWaitingResCount),this.longWaitingResCount>5&&(t=new Ce("TranslationDelayed")),"VOTLocalizedError"===t?.name)this.transformBtn("error",t.localizedMessage);else if(t instanceof Error)this.transformBtn("error",t?.message);else if(1!==this.data.translateAPIErrors||"ru"===o||t.includes(e))this.transformBtn("error",t);else{this.setLoadingBtn(!0);const e=await async function(t,e="",o="ru"){const i=await he.get("translationService",le);switch(i){case"yandexbrowser":case"msedge":{const a=e&&o?`${e}-${o}`:o;return await vo.translate(t,a,i)}default:return t}}(t,"ru",o);this.transformBtn("error",e)}["Подготавливаем перевод","Видео передано в обработку","Ожидаем перевод видео","Загружаем переведенное аудио"].includes(t)&&this.setLoadingBtn(!0)}afterUpdateTranslation(t){const e="success"===this.votButton.container.dataset.status;this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||!e,this.votVideoTranslationVolumeSlider.container.hidden=!e,1===this.data.autoSetVolumeYandexStyle&&(this.votVideoVolumeSlider.input.value=100*this.data.autoVolume,this.votVideoVolumeSlider.label.querySelector("strong").textContent=100*this.data.autoVolume+"%",po.updateSlider(this.votVideoVolumeSlider.input)),this.videoData.isStream||(this.votDownloadButton.hidden=!1,this.downloadTranslationUrl=t),ae.log("afterUpdateTranslation downloadTranslationUrl",this.downloadTranslationUrl),this.data.sendNotifyOnComplete&&this.longWaitingResCount&&e&&GM_notification({text:Te.get("VOTTranslationCompletedNotify").replace("{0}",window.location.hostname),title:GM_info.script.name,highlight:!0,timeout:5e3,silent:!0,tag:"VOTTranslationCompleted",url:window.location.href,onclick:t=>{t.preventDefault(),window.focus()}})}async validateAudioUrl(t){try{const e=await we(t,{method:"HEAD"});if(ae.log("Test audio response",e),404!==e.status)return ae.log("Valid audioUrl",t),t;ae.log("Yandex returned not valid audio, trying to fix...");let o=await this.translateVideoImpl(this.videoData,this.videoData.detectedLanguage="auto",this.videoData.responseLanguage,this.videoData.translationHelp);this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage),t=o.url,ae.log("Fixed audio audioUrl",t)}catch(t){ae.log("Test audio error:",t)}return t}proxifyAudio(t){if(2===this.data.translateProxyEnabled&&t.startsWith("https://vtrans.s3-private.mds.yandex.net/tts/prod/")){const e=t.replace("https://vtrans.s3-private.mds.yandex.net/tts/prod/","");t=`https://${this.data.proxyWorkerHost}/video-translation/audio-proxy/${e}`,console.log(`[VOT] Audio proxied via ${t}`)}return t}async updateTranslation(t){this.cachedTranslation?.url!==this.audioPlayer.player.currentSrc&&(t=await this.validateAudioUrl(this.proxifyAudio(t))),this.audioPlayer.player.src!==t&&(this.audioPlayer.player.src=t);try{this.audioPlayer.init()}catch(t){ae.log("this.audioPlayer.init() error",t),this.videoHandler.transformBtn("error",t.message)}this.setupAudioSettings(),"twitter"===this.site.host&&document.querySelector('button[data-testid="app-bar-back"][role="button"]').addEventListener("click",this.stopTranslation),this.transformBtn("success",Te.get("disableTranslate")),this.afterUpdateTranslation(t)}async translateFunc(t,e,o,i,a){if(console.log("[VOT] Video Data: ",this.videoData),ae.log("Run videoValidator"),this.videoValidator(),this.setLoadingBtn(!0),this.volumeOnStart=this.getVideoVolume(),e){let t=await this.translateStreamImpl(this.videoData,o,i);if(!t)return void ae.log("Skip translation");this.transformBtn("success",Te.get("disableTranslate"));try{this.audioPlayer.init()}catch(t){ae.log("this.audioPlayer.init() error",t),this.videoHandler.transformBtn("error",t.message)}const e=this.setHLSSource(t.result.url);return"youtube"===this.site.host&&We.videoSeek(this.video,10),this.setupAudioSettings(),this.video.src||this.video.currentSrc||this.video.srcObject?this.afterUpdateTranslation(e):this.stopTranslation()}if(this.cachedTranslation=this.videoTranslations.find((e=>e.videoId===t&&e.expires>xe()&&e.from===o&&e.to===i&&e.useNewModel===this.data.useNewModel)),this.cachedTranslation)return await this.updateTranslation(this.cachedTranslation.url),void ae.log("[translateFunc] Cached translation was received");let n=await this.translateVideoImpl(this.videoData,o,i,a);ae.log("[translateRes]",n),n?(await this.updateTranslation(n.url),this.subtitlesList.some((t=>"yandex"===t.source&&t.translatedFromLanguage===this.videoData.detectedLanguage&&t.language===this.videoData.responseLanguage))||(this.subtitlesList=await oo.getSubtitles(this.votClient,this.videoData),await this.updateSubtitlesLangSelect()),this.videoTranslations.push({videoId:t,from:o,to:i,url:this.downloadTranslationUrl,expires:xe()+this.videoTranslationTTL,useNewModel:this.data?.useNewModel})):ae.log("Skip translation")}setupHLS(t){this.hls.on(Hls.Events.MEDIA_ATTACHED,(function(){ae.log("audio and hls.js are now bound together !")})),this.hls.on(Hls.Events.MANIFEST_PARSED,(function(t){ae.log("manifest loaded, found "+t?.levels?.length+" quality level")})),this.hls.loadSource(t),this.hls.attachMedia(this.audioPlayer.player.audio),this.hls.on(Hls.Events.ERROR,(function(t){if(t.fatal)switch(t.type){case Hls.ErrorTypes.MEDIA_ERROR:console.log("fatal media error encountered, try to recover"),this.hls.recoverMediaError();break;case Hls.ErrorTypes.NETWORK_ERROR:console.error("fatal network error encountered",t);break;default:this.hls.destroy()}})),ae.log(this.hls)}setHLSSource(t){const e=`https://${this.data.m3u8ProxyHost}/?all=yes&origin=${encodeURIComponent("https://strm.yandex.ru")}&referer=${encodeURIComponent("https://strm.yandex.ru")}&url=${encodeURIComponent(t)}`;if(this.hls)this.setupHLS(e);else{if(!this.audioPlayer.player.audio.canPlayType("application/vnd.apple.mpegurl"))throw new Ce("audioFormatNotSupported");this.audioPlayer.player.src=e}return e}setupAudioSettings(){"number"==typeof this.data.defaultVolume&&(this.audioPlayer.player.volume=this.data.defaultVolume/100),"number"==typeof this.data.autoSetVolumeYandexStyle&&this.data.autoSetVolumeYandexStyle&&this.setVideoVolume(this.data.autoVolume)}stopTranslation=()=>{this.stopTranslate(),this.syncVideoVolumeSlider()};async handleSrcChanged(){ae.log("[VideoHandler] src changed",this),this.firstPlay=!0,this.stopTranslation();const t=!this.video.src&&!this.video.currentSrc&&!this.video.srcObject;this.votButton.container.hidden=t,t&&(this.votMenu.container.hidden=t),this.site.selector||(this.container=this.video.parentElement),this.container.contains(this.votButton.container)||this.container.append(this.votButton.container,this.votMenu.container),this.videoData=await this.getVideoData(),await this.updateSubtitles(),this.translateToLang=this.data.responseLanguage??"ru",this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage)}async release(){ae.log("[VideoHandler] release"),this.initialized=!1,this.releaseExtraEvents(),this.subtitlesWidget.release(),this.votButton.container.remove(),this.votMenu.container.remove()}}const Co=new mo,Io=new WeakMap;function Po(t,e){if(!t||!e)return null;if(t instanceof Document)return t.querySelector(e);const o=t.closest(e);if(o)return o;const i=t.getRootNode();return Po(i instanceof Document?i:i.host,e)}function Lo(t,e){if(ae.log("findContainer",t,e),t.shadowRoot){let o=Po(e,t.selector);return ae.log("findContainer with site.shadowRoot",o),o??e.parentElement}ae.log("findContainer without shadowRoot");const o=wo.browser.version?.split(".")?.[0];if(t.selector?.includes(":not")&&t.selector?.includes("*")&&o&&("Chrome"===wo.browser.name&&Number(o)<88||"Firefox"===wo.browser.name&&Number(o)<84)){const o=t.selector.split(" *")[0];return o?Array.from(document.querySelectorAll(o)).find((t=>t.contains(e))):e.parentElement}return t.selector?Array.from(document.querySelectorAll(t.selector)).find((t=>t.contains(e))):e.parentElement}(async function(){ae.log("Loading extension..."),await Te.update(),ae.log(`Selected menu language: ${Te.lang}`),"https://9animetv.to"!==window.location.origin?"https://dev.epicgames.com"===window.location.origin&&window.location.pathname.includes("/community/learning/")&&window.addEventListener("message",(t=>{if("https://dev.epicgames.com"!==t.origin)return;if("string"!=typeof t.data||!t.data.startsWith("getVideoId:"))return;const e=t.data.replace("getVideoId:",""),o=atob(e),i=/\/(\w{3,5})\/[^/]+$/.exec(window.location.pathname)?.[1],a=Array.from(document.querySelectorAll("electra-player > iframe")),n=a.find((t=>t.src===o))?.contentWindow;n.postMessage(`${t.data}:${i}`,"https://dev.epicgames.com")})):window.addEventListener("message",(t=>{if("https://rapid-cloud.co"!==t.origin)return;if("getVideoId"!==t.data)return;const e=/[^/]+$/.exec(window.location.href)?.[0],o=document.querySelector("#iframe-embed")?.contentWindow;o.postMessage(`getVideoId:${e}`,"https://rapid-cloud.co")})),Co.onVideoAdded.addListener((t=>{for(const e of function(){if(Ee.exec(window.location.href))return[];const t=window.location.hostname,e=new URL(window.location.href),o=o=>o instanceof RegExp?o.test(t):"string"==typeof o?t.includes(o):"function"==typeof o&&o(e);return Ne.filter((t=>(Array.isArray(t.match)?t.match.some(o):o(t.match))&&t.host&&t.url))}()){if(!e)continue;let o=Lo(e,t);if(o&&(("rumble"!==e.host||t.style.display)&&(["peertube","directlink"].includes(e.host)&&(e.url=window.location.origin),!Io.has(t)))){Io.set(t,new To(t,o,e));break}}})),Co.onVideoRemoved.addListener((async t=>{Io.has(t)&&(await Io.get(t).release(),Io.delete(t))})),Co.enable()})().catch((t=>{console.error("[VOT]",t)}))})()})(); \ No newline at end of file + ${this.data?.subtitlesOpacity??20}`,this.data?.subtitlesOpacity??20,0,100),this.votSubtitlesDialog.bodyContainer.appendChild(this.votSubtitlesOpacitySlider.container),this.votSubtitlesHighlightWordsCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.highlightWords=Number(t.target.checked),await he.set("highlightWords",this.data.highlightWords),ae.log("highlightWords value changed. New value: ",this.data.highlightWords),this.subtitlesWidget.setHighlightWords(this.data.highlightWords)})()})),this.votSubtitlesMaxLengthSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesMaxLength=Number(t.target.value),await he.set("subtitlesMaxLength",this.data.subtitlesMaxLength),this.votSubtitlesMaxLengthSlider.label.querySelector("strong").textContent=`${this.data.subtitlesMaxLength}`,this.subtitlesWidget.setMaxLength(this.data.subtitlesMaxLength)})()})),this.votSubtitlesFontSizeSlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesFontSize=Number(t.target.value),await he.set("subtitlesFontSize",this.data.subtitlesFontSize),this.votSubtitlesFontSizeSlider.label.querySelector("strong").textContent=`${this.data.subtitlesFontSize}`,this.subtitlesWidget.setFontSize(this.data.subtitlesFontSize)})()})),this.votSubtitlesOpacitySlider.input.addEventListener("input",(t=>{(async()=>{this.data.subtitlesOpacity=Number(t.target.value),await he.set("subtitlesOpacity",this.data.subtitlesOpacity),this.votSubtitlesOpacitySlider.label.querySelector("strong").textContent=`${this.data.subtitlesOpacity}`,this.subtitlesWidget.setOpacity(this.data.subtitlesOpacity)})()})),document.documentElement.appendChild(this.votSubtitlesDialog.container)})),this.votShowPiPButtonCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.showPiPButton=Number(t.target.checked),await he.set("showPiPButton",this.data.showPiPButton),ae.log("showPiPButton value changed. New value: ",this.data.showPiPButton),this.votButton.pipButton.hidden=this.votButton.separator2.hidden=!me()||!this.data.showPiPButton})()})),this.votM3u8ProxyHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.m3u8ProxyHost=t.target.value||ne,await he.set("m3u8ProxyHost",this.data.m3u8ProxyHost),ae.log("m3u8ProxyHost value changed. New value: ",this.data.m3u8ProxyHost)})()})),this.votProxyWorkerHostTextfield.input.addEventListener("change",(t=>{(async()=>{this.data.proxyWorkerHost=t.target.value||re,await he.set("proxyWorkerHost",this.data.proxyWorkerHost),ae.log("proxyWorkerHost value changed. New value: ",this.data.proxyWorkerHost),this.data.translateProxyEnabled&&(this.votClient.host=this.data.proxyWorkerHost)})()})),this.votOnlyBypassMediaCSPCheckbox.input.addEventListener("change",(t=>{(async()=>{this.data.onlyBypassMediaCSP=Number(t.target.checked),await he.set("onlyBypassMediaCSP",this.data.onlyBypassMediaCSP),ae.log("onlyBypassMediaCSP value changed. New value: ",this.data.onlyBypassMediaCSP),this.stopTranslate(),this.createPlayer()})()})),this.votNewAudioPlayerCheckbox.input.addEventListener("change",(t=>{(async()=>{const e=t.target.checked;this.data.newAudioPlayer=Number(e),await he.set("newAudioPlayer",this.data.newAudioPlayer),ae.log("newAudioPlayer value changed. New value: ",this.data.newAudioPlayer),this.stopTranslate(),this.createPlayer(),this.votOnlyBypassMediaCSPCheckbox.input.disabled=this.votOnlyBypassMediaCSPCheckbox.container.hidden=!e})()})),this.votBugReportButton.addEventListener("click",(()=>{const t=new URLSearchParams(this.collectReportInfo()).toString();window.open(`https://github.com/ilyhalight/voice-over-translation/issues/new?${t}`,"_blank").focus()})),this.votUpdateLocaleFilesButton.addEventListener("click",(()=>{(async()=>{await he.set("locale-hash",""),await Te.update(!0),window.location.reload()})()})),this.votResetSettingsButton.addEventListener("click",(()=>{(async()=>{Te.reset();const t=await he.list();for(let e=0;e{this.extraEvents.push({element:e,event:o,handler:i}),e.addEventListener(o,i,{signal:t})},o=(t,o,i)=>{for(const a of o)e(t,a,i)};if(this.resizeObserver=new ResizeObserver((t=>{for(let e=0;e550;this.votButton.container.dataset.position=this.votMenu.container.dataset.position=e?this.data?.buttonPos:"default",this.votButton.container.dataset.direction=this.data?.buttonPos&&"default"!==this.data?.buttonPos&&e?"column":"row"})),this.resizeObserver.observe(this.video),this.votMenu.container.setAttribute("style",`--vot-container-height: ${this.video.getBoundingClientRect().height}px`),["youtube","googledrive"].includes(this.site.host)&&"mobile"!==this.site.additionalData){this.syncVolumeObserver=new MutationObserver((t=>{if(this.audioPlayer.player.src&&this.data.syncVolume)for(let e=0;e{const e=t.target,o=this.votButton.container,i=this.votMenu.container,a=this.container,n=this.votSettingsDialog.container,r=document.querySelector(".vot-dialog-temp"),s=o.contains(e),l=i.contains(e),d=a.contains(e),u=n.contains(e),c=r?.contains(e)??!1;ae.log(`[document click] ${s} ${l} ${d} ${u} ${c}`),s||l||u||c||(d||this.logout(0),this.votMenu.container.hidden=!0)}),{signal:t}),document.addEventListener("keydown",(async t=>{const e=t.code,o=document.activeElement;["input","textarea"].includes(o.tagName.toLowerCase())||o.isContentEditable||e!==this.data.hotkeyButton||await this.handleTranslationBtnClick()}),{signal:t});let i=this.getEventContainer();i&&o(i,["pointermove","pointerout"],this.resetTimer),e(this.votButton.container,"pointermove",this.changeOpacityOnEvent),e(this.votMenu.container,"pointermove",this.changeOpacityOnEvent),"xvideos"!==this.site.host&&e(document,"touchmove",this.resetTimer),e(this.votButton.container,"pointerdown",(t=>{t.stopImmediatePropagation()})),o(this.votMenu.container,["pointerdown","mousedown"],(t=>{t.stopImmediatePropagation()})),"youtube"===this.site.host&&(this.container.draggable=!1),"googledrive"===this.site.host&&(this.container.style.height="100%"),e(this.video,"canplay",(async()=>{"rutube"===this.site.host&&this.video.src||await this.setCanPlay()})),e(this.video,"emptied",(async()=>{this.video.src&&await Ze(this.site,{fetchFn:we,video:this.video})===this.videoData.videoId||(ae.log("lipsync mode is emptied"),this.videoData="",this.stopTranslation())})),["rutube","ok"].includes(this.site.host)||e(this.video,"volumechange",(()=>{this.syncVideoVolumeSlider()})),"youtube"!==this.site.host||this.site.additionalData||e(document,"yt-page-data-updated",(async()=>{ae.log("yt-page-data-updated"),window.location.pathname.includes("/shorts/")&&await this.setCanPlay()}))}async setCanPlay(){await Ze(this.site,{fetchFn:we,video:this.video})!==this.videoData.videoId&&(await this.handleSrcChanged(),await this.autoTranslate(),ae.log("lipsync mode is canplay"))}logout(t){this.votMenu.container.hidden&&(this.votButton.container.style.opacity=t)}resetTimer=()=>{clearTimeout(this.timer),this.logout(1),this.timer=setTimeout((()=>{this.logout(0)}),1e3)};changeOpacityOnEvent=t=>{clearTimeout(this.timer),this.logout(1),t.stopPropagation()};async changeSubtitlesLang(t){if(ae.log("[onchange] subtitles",t),this.votSubtitlesSelect.setSelected(t),"disabled"===t)this.votSubtitlesSelect.setTitle(Te.get("VOTSubtitlesDisabled")),this.subtitlesWidget.setContent(null),this.votDownloadSubtitlesButton.hidden=!0,this.yandexSubtitles=null;else{const e=this.subtitlesList.at(parseInt(t));if(2===this.data.translateProxyEnabled&&e.url.startsWith("https://brosubs.s3-private.mds.yandex.net/vtrans/")){const t=e.url.replace("https://brosubs.s3-private.mds.yandex.net/vtrans/","");e.url=`https://${this.data.proxyWorkerHost}/video-subtitles/subtitles-proxy/${t}`,console.log(`[VOT] Subs proxied via ${e.url}`)}this.yandexSubtitles=await oo.fetchSubtitles(e),this.subtitlesWidget.setContent(this.yandexSubtitles),this.votDownloadSubtitlesButton.hidden=!1}}async updateSubtitlesLangSelect(){const t=[{label:Te.get("VOTSubtitlesDisabled"),value:"disabled",selected:!0,disabled:!1},...this.subtitlesList.map(((t,e)=>({label:(Te.get("langs")[t.language]??t.language.toUpperCase())+(t.translatedFromLanguage?` ${Te.get("VOTTranslatedFrom")} ${Te.get("langs")[t.translatedFromLanguage]??t.translatedFromLanguage.toUpperCase()}`:"")+("yandex"!==t.source?`, ${window.location.hostname}`:"")+(t.isAutoGenerated?` (${Te.get("VOTAutogenerated")})`:""),value:e,selected:!1,disabled:!1})))];this.votSubtitlesSelect.updateItems(t),await this.changeSubtitlesLang(t[0].value)}async updateSubtitles(){if(await this.changeSubtitlesLang("disabled"),!this.videoData.videoId)return console.error(`[VOT] ${Te.getDefault("VOTNoVideoIDFound")}`),this.subtitlesList=[],this.subtitlesListVideoId=null,this.votButton.container.hidden=!0,void await this.updateSubtitlesLangSelect();this.votButton.container.hidden=!1,this.subtitlesListVideoId!==this.videoData.videoId&&(this.subtitlesList=await oo.getSubtitles(this.votClient,this.videoData),this.subtitlesList?this.subtitlesListVideoId=this.videoData.videoId:await this.changeSubtitlesLang("disabled"),await this.updateSubtitlesLangSelect())}getVideoVolume(){let t=this.video?.volume;return["youtube","googledrive"].includes(this.site.host)&&(t=We.getVolume()??t),t}setVideoVolume(t){if(["youtube","googledrive"].includes(this.site.host)){if(We.setVolume(t))return this}return this.video.volume=t,this}isMuted(){return["youtube","googledrive"].includes(this.site.host)?We.isMuted():this.video?.muted}syncVideoVolumeSlider(){const t=this.isMuted()?0:100*this.getVideoVolume(),e=Math.round(t);this.votVideoVolumeSlider.input.value=e,this.votVideoVolumeSlider.label.querySelector("strong").textContent=`${e}%`,po.updateSlider(this.votVideoVolumeSlider.input),1===this.data.syncVolume&&(this.tempOriginalVolume=Number(e))}setSelectMenuValues(t,e){this.votTranslationLanguageSelect.fromSelect.setTitle(Te.get("langs")[t]),this.votTranslationLanguageSelect.toSelect.setTitle(Te.get("langs")[e]),this.votTranslationLanguageSelect.fromSelect.setSelected(t),this.votTranslationLanguageSelect.toSelect.setSelected(e),console.log(`[VOT] Set translation from ${t} to ${e}`),this.videoData.detectedLanguage=t,this.videoData.responseLanguage=e}syncVolumeWrapper(t,e){const o="translation"===t?this.votVideoVolumeSlider:this.votVideoTranslationVolumeSlider,i=Number(o.input.value),a=function(t,e,o,i){let a=e;return e>i?(a=o+(e-i),a=a>100?100:Math.max(a,0),t.volume=a/100):e100?100:Math.max(a,0),t.volume=a/100),a}("translation"===t?this.video:this.audioPlayer.player,e,i,"translation"===t?this.tempVolume:this.tempOriginalVolume);o.input.value=a,o.label.querySelector("strong").textContent=`${a}%`,po.updateSlider(o.input),this.tempOriginalVolume="translation"===t?a:e,this.tempVolume="translation"===t?e:a}async getVideoData(){const{duration:t,url:e,videoId:o,host:i,title:a,translationHelp:n=null,localizedTitle:r,description:s,detectedLanguage:l,subtitles:d,isStream:u=!1}=await async function(t,e={}){const o=await Ze(t,e);if(!o)throw new Me(`Entered unsupported link: "${t.host}"`);const i=window.location.origin;if([oe.peertube,oe.coursehunterLike,oe.cloudflarestream].includes(t.host)&&(t.url=i),t.rawResult)return{url:o,videoId:o,host:t.host,duration:void 0};if(!t.needExtraData)return{url:t.url+o,videoId:o,host:t.host,duration:void 0};const a=new Ke({...e,service:t,origin:i}).getHelper(t.host),n=await a.getVideoData(o);if(!n)throw new Me(`Failed to get video raw url for ${t.host}`);return{...n,videoId:o,host:t.host}}(this.site,{fetchFn:we,video:this.video,language:Te.lang});let c=l??this.translateFromLang;if(!l&&a){const t=function(t,e){return`${t} ${e?e.split("\n").filter((t=>!fe.test(t))).join(" "):""}`.slice(0,450).replace(/[^\p{L}\s]+|\s+/gu," ").trim()}(a,s);ae.log(`Detecting language text: ${t}`);const e=await async function(t){const e=await he.get("detectService",de);switch(e){case"yandexbrowser":case"msedge":return await vo.detect(t,e);case"rust-server":return await fo.detect(t);default:return"en"}}(t);qe.includes(e)&&(c=e)}const h={translationHelp:n,isStream:u,duration:t||this.video?.duration||wt.defaultDuration,videoId:o,url:e,host:i,detectedLanguage:c,responseLanguage:this.translateToLang,subtitles:d,title:a,localizedTitle:r,downloadTitle:r??a??o};if(console.log("[VOT] Detected language:",c),["rutube","ok.ru","mail_ru"].includes(this.site.host))h.detectedLanguage="ru";else if("youku"===this.site.host)h.detectedLanguage="zh";else if("vk"===this.site.host){const t=document.getElementsByTagName("track")?.[0]?.srclang;h.detectedLanguage=t||"auto"}else"weverse"===this.site.host&&(h.detectedLanguage="ko");return h}videoValidator(){if(ae.log("VideoValidator videoData: ",this.videoData),1===this.data.dontTranslateYourLang&&this.data.dontTranslateLanguage?.includes(this.videoData.detectedLanguage))throw new Ce("VOTDisableFromYourLang");if(!this.videoData.isStream&&this.videoData.duration>14400)throw new Ce("VOTVideoIsTooLong");return!0}stopTranslate(){this.audioPlayer.player.removeVideoEvents(),this.audioPlayer.player.clear(),this.audioPlayer.player.src=void 0,ae.log("audioPlayer after stopTranslate",this.audioPlayer),this.votVideoVolumeSlider.container.hidden=!0,this.votVideoTranslationVolumeSlider.container.hidden=!0,this.votDownloadButton.hidden=!0,this.downloadTranslationUrl=null,this.longWaitingResCount=0,this.transformBtn("none",Te.get("translateVideo")),ae.log(`Volume on start: ${this.volumeOnStart}`),this.volumeOnStart&&this.setVideoVolume(this.volumeOnStart),clearInterval(this.streamPing),clearTimeout(this.autoRetry),this.hls?.destroy(),this.hls=ve(),this.firstSyncVolume=!0}async translateExecutor(t){ae.log("Run translateFunc",t),await this.translateFunc(t,this.videoData.isStream,this.videoData.detectedLanguage,this.videoData.responseLanguage,this.videoData.translationHelp)}async updateTranslationErrorMsg(t){const e=Te.get("translationTake"),o=Te.lang;if(this.longWaitingResCount=t===Te.get("translationTakeAboutMinute")?this.longWaitingResCount+1:0,ae.log("longWaitingResCount",this.longWaitingResCount),this.longWaitingResCount>5&&(t=new Ce("TranslationDelayed")),"VOTLocalizedError"===t?.name)this.transformBtn("error",t.localizedMessage);else if(t instanceof Error)this.transformBtn("error",t?.message);else if(1!==this.data.translateAPIErrors||"ru"===o||t.includes(e))this.transformBtn("error",t);else{this.setLoadingBtn(!0);const e=await async function(t,e="",o="ru"){const i=await he.get("translationService",le);switch(i){case"yandexbrowser":case"msedge":{const a=e&&o?`${e}-${o}`:o;return await vo.translate(t,a,i)}default:return t}}(t,"ru",o);this.transformBtn("error",e)}["Подготавливаем перевод","Видео передано в обработку","Ожидаем перевод видео","Загружаем переведенное аудио"].includes(t)&&this.setLoadingBtn(!0)}afterUpdateTranslation(t){const e="success"===this.votButton.container.dataset.status;this.votVideoVolumeSlider.container.hidden=1!==this.data.showVideoSlider||!e,this.votVideoTranslationVolumeSlider.container.hidden=!e,1===this.data.autoSetVolumeYandexStyle&&(this.votVideoVolumeSlider.input.value=100*this.data.autoVolume,this.votVideoVolumeSlider.label.querySelector("strong").textContent=100*this.data.autoVolume+"%",po.updateSlider(this.votVideoVolumeSlider.input)),this.videoData.isStream||(this.votDownloadButton.hidden=!1,this.downloadTranslationUrl=t),ae.log("afterUpdateTranslation downloadTranslationUrl",this.downloadTranslationUrl),this.data.sendNotifyOnComplete&&this.longWaitingResCount&&e&&GM_notification({text:Te.get("VOTTranslationCompletedNotify").replace("{0}",window.location.hostname),title:GM_info.script.name,highlight:!0,timeout:5e3,silent:!0,tag:"VOTTranslationCompleted",url:window.location.href,onclick:t=>{t.preventDefault(),window.focus()}})}async validateAudioUrl(t){try{const e=await we(t,{method:"HEAD"});if(ae.log("Test audio response",e),404!==e.status)return ae.log("Valid audioUrl",t),t;ae.log("Yandex returned not valid audio, trying to fix...");let o=await this.translateVideoImpl(this.videoData,this.videoData.detectedLanguage="auto",this.videoData.responseLanguage,this.videoData.translationHelp);this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage),t=o.url,ae.log("Fixed audio audioUrl",t)}catch(t){ae.log("Test audio error:",t)}return t}proxifyAudio(t){if(2===this.data.translateProxyEnabled&&t.startsWith("https://vtrans.s3-private.mds.yandex.net/tts/prod/")){const e=t.replace("https://vtrans.s3-private.mds.yandex.net/tts/prod/","");t=`https://${this.data.proxyWorkerHost}/video-translation/audio-proxy/${e}`,console.log(`[VOT] Audio proxied via ${t}`)}return t}async updateTranslation(t){this.cachedTranslation?.url!==this.audioPlayer.player.currentSrc&&(t=await this.validateAudioUrl(this.proxifyAudio(t))),this.audioPlayer.player.src!==t&&(this.audioPlayer.player.src=t);try{this.audioPlayer.init()}catch(t){ae.log("this.audioPlayer.init() error",t),this.videoHandler.transformBtn("error",t.message)}this.setupAudioSettings(),"twitter"===this.site.host&&document.querySelector('button[data-testid="app-bar-back"][role="button"]').addEventListener("click",this.stopTranslation),this.transformBtn("success",Te.get("disableTranslate")),this.afterUpdateTranslation(t)}async translateFunc(t,e,o,i,a){if(console.log("[VOT] Video Data: ",this.videoData),ae.log("Run videoValidator"),this.videoValidator(),this.setLoadingBtn(!0),this.volumeOnStart=this.getVideoVolume(),e){let t=await this.translateStreamImpl(this.videoData,o,i);if(!t)return void ae.log("Skip translation");this.transformBtn("success",Te.get("disableTranslate"));try{this.audioPlayer.init()}catch(t){ae.log("this.audioPlayer.init() error",t),this.videoHandler.transformBtn("error",t.message)}const e=this.setHLSSource(t.result.url);return"youtube"===this.site.host&&We.videoSeek(this.video,10),this.setupAudioSettings(),this.video.src||this.video.currentSrc||this.video.srcObject?this.afterUpdateTranslation(e):this.stopTranslation()}if(this.cachedTranslation=this.videoTranslations.find((e=>e.videoId===t&&e.expires>xe()&&e.from===o&&e.to===i&&e.useNewModel===this.data.useNewModel)),this.cachedTranslation)return await this.updateTranslation(this.cachedTranslation.url),void ae.log("[translateFunc] Cached translation was received");let n=await this.translateVideoImpl(this.videoData,o,i,a);ae.log("[translateRes]",n),n?(await this.updateTranslation(n.url),this.subtitlesList.some((t=>"yandex"===t.source&&t.translatedFromLanguage===this.videoData.detectedLanguage&&t.language===this.videoData.responseLanguage))||(this.subtitlesList=await oo.getSubtitles(this.votClient,this.videoData),await this.updateSubtitlesLangSelect()),this.videoTranslations.push({videoId:t,from:o,to:i,url:this.downloadTranslationUrl,expires:xe()+this.videoTranslationTTL,useNewModel:this.data?.useNewModel})):ae.log("Skip translation")}setupHLS(t){this.hls.on(Hls.Events.MEDIA_ATTACHED,(function(){ae.log("audio and hls.js are now bound together !")})),this.hls.on(Hls.Events.MANIFEST_PARSED,(function(t){ae.log("manifest loaded, found "+t?.levels?.length+" quality level")})),this.hls.loadSource(t),this.hls.attachMedia(this.audioPlayer.player.audio),this.hls.on(Hls.Events.ERROR,(function(t){if(t.fatal)switch(t.type){case Hls.ErrorTypes.MEDIA_ERROR:console.log("fatal media error encountered, try to recover"),this.hls.recoverMediaError();break;case Hls.ErrorTypes.NETWORK_ERROR:console.error("fatal network error encountered",t);break;default:this.hls.destroy()}})),ae.log(this.hls)}setHLSSource(t){const e=`https://${this.data.m3u8ProxyHost}/?all=yes&origin=${encodeURIComponent("https://strm.yandex.ru")}&referer=${encodeURIComponent("https://strm.yandex.ru")}&url=${encodeURIComponent(t)}`;if(this.hls)this.setupHLS(e);else{if(!this.audioPlayer.player.audio.canPlayType("application/vnd.apple.mpegurl"))throw new Ce("audioFormatNotSupported");this.audioPlayer.player.src=e}return e}setupAudioSettings(){"number"==typeof this.data.defaultVolume&&(this.audioPlayer.player.volume=this.data.defaultVolume/100),"number"==typeof this.data.autoSetVolumeYandexStyle&&this.data.autoSetVolumeYandexStyle&&this.setVideoVolume(this.data.autoVolume)}stopTranslation=()=>{this.stopTranslate(),this.syncVideoVolumeSlider()};async handleSrcChanged(){ae.log("[VideoHandler] src changed",this),this.firstPlay=!0,this.stopTranslation();const t=!this.video.src&&!this.video.currentSrc&&!this.video.srcObject;this.votButton.container.hidden=t,t&&(this.votMenu.container.hidden=t),this.site.selector||(this.container=this.video.parentElement),this.container.contains(this.votButton.container)||this.container.append(this.votButton.container,this.votMenu.container),this.videoData=await this.getVideoData(),await this.updateSubtitles(),this.translateToLang=this.data.responseLanguage??"ru",this.setSelectMenuValues(this.videoData.detectedLanguage,this.videoData.responseLanguage)}async release(){ae.log("[VideoHandler] release"),this.initialized=!1,this.releaseExtraEvents(),this.subtitlesWidget.release(),this.votButton.container.remove(),this.votMenu.container.remove()}}const Co=new mo,Io=new WeakMap;function Po(t,e){if(!t||!e)return null;if(t instanceof Document)return t.querySelector(e);const o=t.closest(e);if(o)return o;const i=t.getRootNode();return Po(i instanceof Document?i:i.host,e)}function Lo(t,e){if(ae.log("findContainer",t,e),t.shadowRoot){let o=Po(e,t.selector);return ae.log("findContainer with site.shadowRoot",o),o??e.parentElement}ae.log("findContainer without shadowRoot");const o=wo.browser.version?.split(".")?.[0];if(t.selector?.includes(":not")&&t.selector?.includes("*")&&o&&("Chrome"===wo.browser.name&&Number(o)<88||"Firefox"===wo.browser.name&&Number(o)<84)){const o=t.selector.split(" *")[0];return o?Array.from(document.querySelectorAll(o)).find((t=>t.contains(e))):e.parentElement}return t.selector?Array.from(document.querySelectorAll(t.selector)).find((t=>t.contains(e))):e.parentElement}(async function(){ae.log("Loading extension..."),await Te.update(),ae.log(`Selected menu language: ${Te.lang}`),"https://9animetv.to"!==window.location.origin?"https://dev.epicgames.com"===window.location.origin&&window.location.pathname.includes("/community/learning/")&&window.addEventListener("message",(t=>{if("https://dev.epicgames.com"!==t.origin)return;if("string"!=typeof t.data||!t.data.startsWith("getVideoId:"))return;const e=t.data.replace("getVideoId:",""),o=atob(e),i=/\/(\w{3,5})\/[^/]+$/.exec(window.location.pathname)?.[1],a=document.querySelector(`electra-player > iframe[src="${o}"]`)?.contentWindow;a.postMessage(`${t.data}:${i}`,"https://dev.epicgames.com")})):window.addEventListener("message",(t=>{if("https://rapid-cloud.co"!==t.origin)return;if("getVideoId"!==t.data)return;const e=/[^/]+$/.exec(window.location.href)?.[0],o=document.querySelector("#iframe-embed")?.contentWindow;o.postMessage(`getVideoId:${e}`,"https://rapid-cloud.co")})),Co.onVideoAdded.addListener((t=>{for(const e of function(){if(Ee.exec(window.location.href))return[];const t=window.location.hostname,e=new URL(window.location.href),o=o=>o instanceof RegExp?o.test(t):"string"==typeof o?t.includes(o):"function"==typeof o&&o(e);return Ne.filter((t=>(Array.isArray(t.match)?t.match.some(o):o(t.match))&&t.host&&t.url))}()){if(!e)continue;let o=Lo(e,t);if(o&&(("rumble"!==e.host||t.style.display)&&(["peertube","directlink"].includes(e.host)&&(e.url=window.location.origin),!Io.has(t)))){Io.set(t,new To(t,o,e));break}}})),Co.onVideoRemoved.addListener((async t=>{Io.has(t)&&(await Io.get(t).release(),Io.delete(t))})),Co.enable()})().catch((t=>{console.error("[VOT]",t)}))})()})(); \ No newline at end of file diff --git a/dist/vot.user.js b/dist/vot.user.js index 2d804639..3d254ed2 100644 --- a/dist/vot.user.js +++ b/dist/vot.user.js @@ -12607,12 +12607,8 @@ function initIframeInteractor() { const reqId = e.data.replace("getVideoId:", ""); const iframeLink = atob(reqId); const videoId = /\/(\w{3,5})\/[^/]+$/.exec(window.location.pathname)?.[1]; - const iframes = Array.from( - document.querySelectorAll("electra-player > iframe"), - ); - - const iframeWin = iframes.find( - (iframe) => iframe.src === iframeLink, + const iframeWin = document.querySelector( + `electra-player > iframe[src="${iframeLink}"]`, )?.contentWindow; iframeWin.postMessage( diff --git a/src/index.js b/src/index.js index 146c8129..167975d9 100644 --- a/src/index.js +++ b/src/index.js @@ -2958,12 +2958,8 @@ function initIframeInteractor() { const reqId = e.data.replace("getVideoId:", ""); const iframeLink = atob(reqId); const videoId = /\/(\w{3,5})\/[^/]+$/.exec(window.location.pathname)?.[1]; - const iframes = Array.from( - document.querySelectorAll("electra-player > iframe"), - ); - - const iframeWin = iframes.find( - (iframe) => iframe.src === iframeLink, + const iframeWin = document.querySelector( + `electra-player > iframe[src="${iframeLink}"]`, )?.contentWindow; iframeWin.postMessage(