1$(document).ready(function(){const $speakButton=$("#speakButton");const $stopButton=$("#stopButton");const $textDiv=$("#textToSpeak");if(!window.speechSynthesis||!$speakButton.length||!$stopButton.length||!$textDiv.length){return}function getCleanText(){let text=$textDiv.text().replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();const unwantedChars=/[«»"ââââââ()\[\]{}â¨â©<>~@#$%^&*_+=|\\:;â¦âââ¢Â·â¢]/g;text=text.replace(unwantedChars," ");text=text.replace(/ |"|&|<|>/g," ");return text.replace(/\s{2,}/g," ").trim()}function checkVoices(){const voices=window.speechSynthesis.getVoices();const russianVoices=voices.filter(v=>v.lang.includes("ru")||v.lang.includes("RU"));if(russianVoices.length>0){$speakButton.show()}}checkVoices();window.speechSynthesis.onvoiceschanged=checkVoices;$speakButton.click(function(){const text=getCleanText();if(!text){return}const utterance=new SpeechSynthesisUtterance(text);utterance.lang="ru-RU";utterance.rate=.9;$speakButton.hide();$stopButton.show();utterance.onend=utterance.onerror=function(){$stopButton.hide();$speakButton.show()};window.speechSynthesis.cancel();window.speechSynthesis.speak(utterance)});$stopButton.click(function(){window.speechSynthesis.cancel();$stopButton.hide();$speakButton.show()});const observer=new MutationObserver(()=>{$speakButton.show()});if(observer==null){return}observer.observe($textDiv[0],{childList:true,subtree:true,characterData:true})});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.